人类进步的根源是什么?是懒惰,是的,没有错,就是懒惰,正是当你想偷懒时,你才会去寻找更便捷的方法搞定一件事。写代码也是一样的,不想偷懒的程序猿不是好程序猿,下面我们来看看如何“偷懒”。
首先,声明一下,本文的作用纯属抛砖引玉,并不会太详细的介绍具体使用方法,仅仅介绍大概使用思路及踩坑日记。虽然本文以mvp为例,但是本文所讲的内容不局限于此,基本上所有的模板代码,你都可以生成模板,方便后面使用。
使用mvp模式开发安卓项目的人都知道,创建一个activity通常需要创建包含接口在内的5个类,写一两个界面还好,如果真是写完整个项目,光是创建这些类都让人心烦,那么有没有快捷的方法呢?当然是有的,最简单的方法就是使用studio 自带的file template。
下面来写一个简单的Preseter类模板:
#if (${PACKAGE_NAME} && ${PACKAGE_NAME} != "")package ${PACKAGE_NAME};#end
#parse("File Header.java")
public class ${NAME}Presenter extends StyleActivityPresenter{
@Override
protected void initPresenter (Bundle savedInstanceState) {
}
}
使用效果:
public class TestPresenter extends StyleActivityPresenter {
@Override
protected void initPresenter (Bundle savedInstanceState) {
}
}
可以看出,使用上还是非常简单的,${NAME}就是你创建文件时输入的名字,其他的相信不用解释大家都看的懂。
上面的模板功能虽然已经能够很方便的让我创建一个类而不用去写过多的重复代码了,但是依然不够好用,因为上面说了,mvp模式通常包含5个类,还有布局文件,还有activity注册代码,这些可以说是每次创建activity的必须代码,而如果仅仅使用上面的file template功能,依然需要多次在不同包下创建文件,还有没有更偷懒的方法呢?当然有,就是studio强大的activity模板功能了。 其实这个功能,大家经常都在使用,只是很多人并没有注意罢了,就比如我们新建项目时:
这其实就是studio自带的activity模板,我们知道当我们选中某个类型的模板后,生成了项目之后,项目中就会有相应的java代码和布局,并且他会帮你在manifest注册好这个activity。
下面我们需要的也就是自定义这个功能,让他实现输入一个类名后在你指定的包下面自动生成5个mvp相关类和布局文件已经manifest注册。
首先,我们需要知道,系统自带的模板位置:XXX\android-studio\plugins\android\lib\templates\activities 这个目录下就是上面我们看到的所有activity模板的文件目录,先来简单介绍一下模板的目录下几个重要的文件及其作用,我们以LoginActivity这个模板为例:
root :这个目录下面放的是我们我们的代码模板,和file template代码类似,但是有一定区别。我喜欢叫他们模板输出原型。
globals.xml :这个文件是用来配置某些特殊属性的,比如是否是启动页面之类的属性。
recipe.xml :这个文件主要是配置需要生成哪些文件,用哪个模板生成,生成后要输出到哪个目录。
template.xml 这个文件主要是用来定义我们的一些文件名和包名之类的变量属性,看看LoginActivity的配置界面效果,相信大家就懂这个文件的作用了:
template_login_activity.png :这个是上面图中那个界面示意图,通常不需要管它,当然你也可以放一张自己的图,替换掉。
下面说说怎么自定义自己的模板,(文章开始已经说了,本文并不会详细介绍如何进行自定义模板<我能说是自己也是才学这个东西吗?>,这里直接介绍我自己自定义时遇到的坑,和一些比较重要的注意事项):
首先,建议大家从最简单的模板开始尝试,不要一开始就完全以自己的mvp类去写,等熟悉了相关属性和规则后再去写mvp相关的模板,这是因为模板这个东西不是我们的项目代码,如果你配置错了,使用时虽然会有报错提示,但是并不准确,所以如果你一次性写太多东西的话,排查错误时很慢。
其次,建议直接先复制一份系统的模板代码比如(LoginActivity模板),然后在此基础上修改,不要自己去创建每个文件,理由和第一条类似,容易出错。
然后开始我们的模板创建之旅:
1.创建Demo项目用于测试
非常简单,只包含了一个默认的自动生成的MainActivity类
2.复制LoginActivity模板
在我们的对应目录XXX\android-studio\plugins\android\lib\templates\activities中复制LoginActivity文件夹并重命名为MVPTestActivity,接着进入我们复制的文件夹,打开template.xml这个文件,改掉name的值,最好是和你的目录名保持一致,我们这里就叫MVPTestActivity,其他几个属性可以按照自己的需要进行修改。
此属性改名为MVPTestActivity
description="Creates a new login activity, allowing users to optionally sign in with Google+ or enter an email address and password to log in to or register with your application."
minApi="8"
minBuildApi="14">
parameter ,这个标签是我们配置界面上的字段,我这里只截图两个重要字段:
两张图一起看的话就很好理解了,id为activityClass的这个标签就是我们的类名,id为layoutName就是我们的布局名,id这个字段是我们在其他配置文件中引用name的查找依据,type自然就是类型,constraints是一些输入限制信息,default当然就是默认实现在配置界面上的值了,每个属性的具体用法,大家自己搜索一下相关博文,这里不是本文的重点。
我们这里先开始写最简单的,那么我们肯定是不需要Title之类的属性的,所以我们先把不需要显示或配置的字段注释掉。
...
其他的一些字段我们也可以根据我们的需要稍作调整,这样这个文件基本就修改完成了。
recipe.xml ,打开此文件,我们可以看到
<#import "root://activities/common/kotlin_macros.ftl" as kt>
<#if appCompat && !(hasDependency('com.android.support:appcompat-v7'))>
<#if (buildApi gte 22) && appCompat && !(hasDependency('com.android.support:design'))>
<#include "../common/recipe_theme.xml.ftl" />
<#if generateKotlin>
<@kt.addAllKotlinDependencies />
<#else>
是不是看的一头雾水,其实不难,ifelse相信不用过多解释,我们重点讲讲其他几个比较重要的标签的作用。
merge 顾名思义就是合并的意思,这个主要是用在资源文件或者manifest文件,因为我们通常是需要把我们新建的xml文件和项目中的进行合并,这里稍微讲解一下manifest的合并,因为其他的资源文件合并都很简单,就不说了。
打开MVPTestActivity\root目录下的manifest文件,主要代码如下:
android:label="@string/app_name"
<#else>
android:label="@string/title_${simpleName}"
<#if hasNoActionBar>
android:theme="@style/${themeNameNoActionBar}"
<#elseif !(hasApplicationTheme!false)>
android:theme="@style/${themeName}"
<#if buildApi gte 16 && parentActivityClass != "">android:parentActivityName="${parentActivityClass}">
<#if parentActivityClass != "">
<@manifestMacros.commonActivityBody />
基本上不是很难理解,类似于这种${}代码,都是对其他文件中属性的引用,下面我们去掉我们不需要的属性,修改后:
android:label="@string/app_name"
<#if hasNoActionBar>
android:theme="@style/${themeNameNoActionBar}"
<#elseif !(hasApplicationTheme!false)>
android:theme="@style/${themeName}"
>
<@manifestMacros.commonActivityBody />
instantiate 就是创建文件
open file当然就是在我们生成好类后,打开相关类
这里重点说说from和to这两个属性,看名字大家应该都能猜出一点了,from就是指的我们的模板文件路径,to当然就是我们生成文件的路径,以简单的布局文件为例,可以看到一个instantiate标签内容如下:
其中root/res/layout/activity_login.xml.ftl这个路径,明显就是我们当前模板目录下面的文件,而to的属性,我们也可以理解下,${escapeXmlAttribute(resOut)}多半就是指的当前项目的res资源主目录,然后${layoutName}明显就是引用的template.xml中配置的,用户输入的layoutName这个String。 明白了这些属性后,我们做出如下修改:
删掉MVPTestActivity\root\res目录下的values文件夹
注释掉recipe.xml文件中两个关于资源合并的标签(不去掉会报空指针,因为我们已经删掉了资源模板)
最后修改MVPTestActivity\root\src\app_package目录下的LoginActivity.java文件(其实还需要同步修改LoginActivity.kt,不过因为我暂时没有使用kotlin,所以没做它的适配),这个文件内容太多,为了方便查看,我们简化成如下代码:
package ${packageName};
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
<#if applicationPackage??>
import ${applicationPackage}.R;
/**
* A login screen that offers login via email/password.
*/
public class ${activityClass} extends AppCompatActivity {
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.${layoutName});
}
}
好了,到此为止,其实我们已经完成了一些最简单的修改,下面我们来看看运行效果,保存每个文件后,重启studio(一开始写的时候千万不要想一次改完,不然多半会因为失败而放弃这个):
可以看到我们修改了模板介绍,修改了默认的activity名字,去掉了title和parent两个输入框,让我们点击完成试一下效果:
TestActivity和activity_test都是我们通过模板自动生成的文件,并且mainfest中已经注册了这个activity了,具体截图就不放了,大家可以自己尝试。
上面的步骤已经算是完成了模板的最基本使用了,但是离我们的要求还差点,因为我们想要的是生成多个文件,并且多个文件有可能不再同一个包下,那么我们怎么实现呢?
首先,假如我们的项目结构如下:
那么我现在需要的就是:
在presenter包下创建一个TestActivityPresenter类
在model包下创建一个TestActivityModel
在view包下创建一个TestActivityView
在port包下创建一个ITestActivityModel接口和ITestActivityView接口
并且TestActivityView应该实现ITestActivityView接口,TestActivityModel应该实现ITestActivityModel接口
生成对应布局文件,并且注册activity
最后一条,基本上不用再说了,我们开始的改动已经满足了,重点说说下面几条怎么实现,主要是说说怎么在不同目录下生成对应文件。
回到我们的recipe.xml文件中,我们注意看这里
这里其实就是用来生成我们刚刚那个TestActivity的配置代码,明显的我们想多生成几个文件的话,只需要多写几个这种标签就好,比如像下面这样:
注意看to的值的最后一点,我采用拼接的方式规定了每个文件的名字格式,这样所有mvp下的类名都是符合一定命名规范的,当然不一定和我的一样,但是你一定要有自己的格式,不要随意取名字,这是基础,不过多解释原因。 这样我们生成的时候就会得到5个文件,但是还不够,因为他们现在都在同一个目录下,怎么让他们在自己的目录下生成呢,再来改改:
是不是很简单?只需要在${escapeXmlAttribute(srcOut)}后面跟上具体的包路径就好了,那么我们还缺点什么?我们还缺模板源文件,因为上面from的文件都是LoginActivity这个文件,也就是说生成的每个类的代码都是相同的。
下面让我们来完成最后一步,编写模板代码了,这个就相对简单了,毕竟基本上都是java代码,难不倒大家的,我们在MVPTestActivity\root\src\app_package路径下把LoginActivity.java.ftl这个文件复制四份,kt那个文件不管,那个是适配kotlin的,如果你是用的Kotlin的话,也可以复制那个。 然后依次改名,效果如下:
每个类的代码如下: MvpView.java
package ${packageName}.view;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
<#if applicationPackage??>
import ${applicationPackage}.R;
import com.xujl.demo.port.I${activityClass}View;
import com.xujl.demo.presenter.${activityClass}Presenter;
class ${activityClass}View extends AppCompatActivity implements I${activityClass}View{
private ${activityClass}Presenter mPresenter;
@Override
protected void onCreate (Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.${layoutName});
mPresenter = new ${activityClass}Presenter(this);
}
}
MvpPresenter.java
package ${packageName}.presenter;
import com.xujl.demo.model.${activityClass}Model;
import com.xujl.demo.port.I${activityClass}Model;
import com.xujl.demo.port.I${activityClass}View;
public class ${activityClass}Presenter {
private I${activityClass}View mView;
private I${activityClass}Model mModel;
public ${activityClass}Presenter(I${activityClass}View view){
mView = view;
mModel = new ${activityClass}Model();
}
}
MvpModel.java
package ${packageName}.model;
import com.xujl.demo.port.I${activityClass}Model;
public class ${activityClass}Model implements I${activityClass}Model {
}
IMvpModel.java
package ${packageName}.port;
public interface I${activityClass}Model{
}
IMvpView.java
package ${packageName}.port;
public interface I${activityClass}View{
}
最后不要忘记修改recipe.xml中from的模板文件名和模板mainfest中的activity名字 :
----------------------------------------------------
android:label="@string/app_name"
<#if hasNoActionBar>
android:theme="@style/${themeNameNoActionBar}"
<#elseif !(hasApplicationTheme!false)>
android:theme="@style/${themeName}"
>
<@manifestMacros.commonActivityBody />
最后来看看运行效果(右键点击的时候一定要在主包上面点击,不然生成路径可能会出错):
如果你不是在主包上点击的,也没关系,记得修改这里为主包路径就好:
至此我们就完成了一个完整的模板了,当然这里不论是包结构还是命名方式,还是mvp结构,都是我自己定义的,大家完全可以根据自己的项目实际情况的来写,我这样定义的结构,好处是只需要键入类名,其他都可以生成了,当然你也可以多设置几个包名字段,用来动态配置model,view,presenter,和接口的包路径。
最后附上整个MVPTestActivity的模板文件链接: https://pan.baidu.com/s/1skW4nTV 密码: kbve
你可能感兴趣的:(studio模板,一键生成多个类,mvp党福利)
扫地机类清洁产品之直流无刷电机控制
悟空胆好小
清洁服务机器人 单片机 人工智能
扫地机类清洁产品之直流无刷电机控制1.1前言扫地机产品有很多的电机控制,滚刷电机1个,边刷电机1-2个,清水泵电机,风机一个,部分中高端产品支持抹布功能,也就是存在抹布盘电机,还有追觅科沃斯石头等边刷抬升电机,滚刷抬升电机等的,这些电机有直流有刷电机,直接无刷电机,步进电机,电磁阀,挪动泵等不同类型。电机的原理,驱动控制方式也不行。接下来一段时间的几个文章会作个专题分析分享。直流有刷电机会自动持续
【一起学Rust | 设计模式】习惯语法——使用借用类型作为参数、格式化拼接字符串、构造函数
广龙宇
一起学Rust # Rust设计模式 rust 设计模式 开发语言
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、使用借用类型作为参数二、格式化拼接字符串三、使用构造函数总结前言Rust不是传统的面向对象编程语言,它的所有特性,使其独一无二。因此,学习特定于Rust的设计模式是必要的。本系列文章为作者学习《Rust设计模式》的学习笔记以及自己的见解。因此,本系列文章的结构也与此书的结构相同(后续可能会调成结构),基本上分为三个部分
第四天旅游线路预览——从换乘中心到喀纳斯湖
陟彼高冈yu
基于Google earth studio 的旅游规划和预览 旅游
第四天:从贾登峪到喀纳斯风景区入口,晚上住宿贾登峪;换乘中心有4路车,喀纳斯①号车,去喀纳斯湖,路程时长约5分钟;将上面的的行程安排进行动态展示,具体步骤见”Googleearthstudio进行动态轨迹显示制作过程“、“Googleearthstudio入门教程”和“Googleearthstudio进阶教程“相关内容,得到行程如下所示:Day4-2-480p
Goolge earth studio 进阶4——路径修改与平滑
陟彼高冈yu
Google earth studio 进阶教程 旅游
如果我们希望在大约中途时获得更多的城市鸟瞰视角。可以将相机拖动到这里并创建一个新的关键帧。camera_target_clip_7EarthStudio会自动平滑我们的路径,所以当我们通过这个关键帧时,不是一个生硬的角度,而是一个平滑的曲线。camera_target_clip_8路径上有贝塞尔控制手柄,允许我们调整路径的形状。右键单击,我们可以选择“平滑路径”,这是默认的自动平滑算法,或者我们可
Python教程:一文了解使用Python处理XPath
旦莫
Python进阶 python 开发语言
目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代
Google earth studio 简介
陟彼高冈yu
旅游
GoogleEarthStudio是一个基于Web的动画工具,专为创作使用GoogleEarth数据的动画和视频而设计。它利用了GoogleEarth强大的三维地图和卫星影像数据库,使用户能够轻松地创建逼真的地球动画、航拍视频和动态地图可视化。网址为https://www.google.com/earth/studio/。GoogleEarthStudio是一个基于Web的动画工具,专为创作使用G
LLM 词汇表
落难Coder
LLMs NLP 大语言模型 大模型 llama 人工智能
Contextwindow“上下文窗口”是指语言模型在生成新文本时能够回溯和参考的文本量。这不同于语言模型训练时所使用的大量数据集,而是代表了模型的“工作记忆”。较大的上下文窗口可以让模型理解和响应更复杂和更长的提示,而较小的上下文窗口可能会限制模型处理较长提示或在长时间对话中保持连贯性的能力。Fine-tuning微调是使用额外的数据进一步训练预训练语言模型的过程。这使得模型开始表示和模仿微调数
【华为OD机试真题2023B卷 JAVA&JS】We Are A Team
若博豆
java 算法 华为 javascript
华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代
使用LLaVa和Ollama实现多模态RAG示例
llzwxh888
python 人工智能 开发语言
本文将详细介绍如何使用LLaVa和Ollama实现多模态RAG(检索增强生成),通过提取图像中的结构化数据、生成图像字幕等功能来展示这一技术的强大之处。安装环境首先,您需要安装以下依赖包:!pipinstallllama-index-multi-modal-llms-ollama!pipinstallllama-index-readers-file!pipinstallunstructured!p
深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具
nseejrukjhad
数据库 python
深入理解MultiQueryRetriever:提升向量数据库检索效果的强大工具引言在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。MultiQueryRetriever的工
如何部分格式化提示模板:LangChain中的高级技巧
nseejrukjhad
langchain java 服务器 python
标题:如何部分格式化提示模板:LangChain中的高级技巧内容:如何部分格式化提示模板:LangChain中的高级技巧引言在使用大型语言模型(LLM)时,提示工程是一个关键环节。LangChain提供了强大的提示模板功能,让我们能更灵活地构建和管理提示。本文将介绍LangChain中一个高级特性-部分格式化提示模板,这个技巧可以让你的提示管理更加高效和灵活。什么是部分格式化提示模板?部分格式化提
2.0践行没有你的参与就不完美
x秀丽x
亲爱的伙伴们早上好,今天早上我们开了一次班委竞选的会议,全程只有20多个人参与,宫班本着对大家负责任的态度告诉我们,此次竞选作废,原因是这没有达到2.0的100%参会要求,如果没有大家的参与那么这个班委选出来还有什么意义,这说明选出来的人也是不一定是我们大家心目中认可的那个人,所以为了让大家的这个90天能够更好的激发出自己的的“做”的能力,那么要从第一次竞选班委的会议开始做到100%出席会议,竞选
log4j配置
yy爱yy
#log4j.rootLogger配置的是大于等于当前级别的日志信息的输出#log4j.rootLogger用法:(注意appenderName可以是一个或多个)#log4j.rootLogger=日志级别,appenderName1,appenderName2,....#log4j.appender.appenderName2定义的是日志的输出方式,有两种:一种是命令行输出或者叫控制台输出,另一
Python快速入门 —— 第三节:类与对象
孤华暗香
Python快速入门 python 开发语言
第三节:类与对象目标:了解面向对象编程的基础概念,并学会如何定义类和创建对象。内容:类与对象:定义类:class关键字。类的构造函数:__init__()。类的属性和方法。对象的创建与使用。示例:classStudent:def__init__(self,name,age,major):self.name&#
python os 环境变量
CV矿工
python 开发语言 numpy
环境变量:环境变量是程序和操作系统之间的通信方式。有些字符不宜明文写进代码里,比如数据库密码,个人账户密码,如果写进自己本机的环境变量里,程序用的时候通过os.environ.get()取出来就行了。os.environ是一个环境变量的字典。环境变量的相关操作importos"""设置/修改环境变量:os.environ[‘环境变量名称’]=‘环境变量值’#其中key和value均为string类
一个历史事件和查理一世走上断头台有很大关系,这个事件是什么?
王老师聊围棋
今天我要讲的历史事件,查理一世被处死的始末。其实查理一世给被处死的时候,与一个事件有很大的联系。这个事件是“普莱德清洗”。提到这个事件,我们不得不提到一个人,这个人就是克伦威尔。可以说,查理一世能够走上断头台,克伦威尔有很大的功劳。为什么这么说呢。那我们就成英国内战的终结说起吧。我们都知道英国的内战是有保王党挑起来。在保王党军队一路凯歌进攻的同时。就在1645年6月14日,在纳西比荒原上进行最后的
果然只有离职的时候,才有人敢说真话!
return2ok
今天公司出了神贴。今天中午吃饭,同事问我看了论坛上的神贴了吗?什么帖子?我问。同事显得很惊讶,你居然没看,现在那个帖子可能会成为年度最佳帖子。这么厉害?我等不及了,饭没吃完就快速的奔向办公室,打开公司论坛,我要一睹这个帖子的神奇。写这帖子的童鞋胆儿真肥。这哪里是一个帖子,这是很多个帖子,组成了一个系列。某人从公司文化、管理、人事、项目管理等多个方面分析了公司的概况,并抨击了公司的各种弊端,并提出了
《Python数据分析实战终极指南》
xjt921122
python 数据分析 开发语言
对于分析师来说,大家在学习Python数据分析的路上,多多少少都遇到过很多大坑**,有关于技能和思维的**:Excel已经没办法处理现有的数据量了,应该学Python吗?找了一大堆Python和Pandas的资料来学习,为什么自己动手就懵了?跟着比赛类公开数据分析案例练了很久,为什么当自己面对数据需求还是只会数据处理而没有分析思路?学了对比、细分、聚类分析,也会用PEST、波特五力这类分析法,为啥
目前哪里有卖高仿包包,推荐十个渠道已更新
富腕表之家
1、工厂购买,推荐微信:【76929666】目前买的人最多的渠道。2、某宝购买,价格较高,质量没有保障。3、拼夕夕,价格是便宜,但是质量不敢想象。4、专柜购买,数量较少,经常断货,价格也太高不好接受。5、批发市场购买,可遇不可求,一般生活在批发市场附近的,根本不用考虑在哪里买高仿包包分几个级别?在当今的包类市场中,广州作为一个知名的货源地,已经成为高仿包行业的一个重要标志。随着市场的需求增加,高仿
insert into select 主键自增_mybatis拦截器实现主键自动生成
weixin_39521651
insert into select 主键自增 mybatis delete返回值 mybatis insert返回主键 mybatis insert返回对象 mybatis plus insert返回主键 mybatis plus 插入生成id
前言前阵子和朋友聊天,他说他们项目有个需求,要实现主键自动生成,不想每次新增的时候,都手动设置主键。于是我就问他,那你们数据库表设置主键自动递增不就得了。他的回答是他们项目目前的id都是采用雪花算法来生成,因此为了项目稳定性,不会切换id的生成方式。朋友问我有没有什么实现思路,他们公司的orm框架是mybatis,我就建议他说,不然让你老大把mybatis切换成mybatis-plus。mybat
k均值聚类算法考试例题_k均值算法(k均值聚类算法计算题)
寻找你83497
k均值聚类算法考试例题
?算法:第一步:选K个初始聚类中心,z1(1),z2(1),…,zK(1),其中括号内的序号为寻找聚类中心的迭代运算的次序号。聚类中心的向量值可任意设定,例如可选开始的K个.k均值聚类:---------一种硬聚类算法,隶属度只有两个取值0或1,提出的基本根据是“类内误差平方和最小化”准则;模糊的c均值聚类算法:--------一种模糊聚类算法,是.K均值聚类算法是先随机选取K个对象作为初始的聚类
Python开发常用的三方模块如下:
换个网名有点难
python 开发语言
Python是一门功能强大的编程语言,拥有丰富的第三方库,这些库为开发者提供了极大的便利。以下是100个常用的Python库,涵盖了多个领域:1、NumPy,用于科学计算的基础库。2、Pandas,提供数据结构和数据分析工具。3、Matplotlib,一个绘图库。4、Scikit-learn,机器学习库。5、SciPy,用于数学、科学和工程的库。6、TensorFlow,由Google开发的开源机
做好总书记心中的新青年
漂洋过海来看岐岐
习近平总书记在党的二十大报告中强调:“广大青年要坚定不移听党话、跟党走,怀抱梦想又脚踏实地,敢想敢为又善作善成,立志做有理想、敢担当、能吃苦、肯奋斗的新时代好青年。”青年的本领要从基层一线的服务中来,主动跟群众交友,促膝长谈交心,深入基层,为民排忧解难。俗话说,事业都是拼搏出来的,但事业取得成功的前提是要有过硬的本领、足够精湛的技艺,只要肯学习,坚持学以致用,努力求得真知、锤炼本领,就一定会有所收
一文掌握python面向对象魔术方法(二)
程序员neil
python python 开发语言
接上篇:一文掌握python面向对象魔术方法(一)-CSDN博客目录六、迭代和序列化:1、__iter__(self):定义迭代器,使得类可以被for循环迭代。2、__getitem__(self,key):定义索引操作,如obj[key]。3、__setitem__(self,key,value):定义赋值操作,如obj[key]=value。4、__delitem__(self,key):定义
2.2.6 通知类控件 Toast、Menu
常思行
本文例程下载:WillFlow_Toast、WillFlowMenu一、什么是Toast?Toast也被叫做吐司,是Android系统提供的一种非常好的提醒方式,在程序中可以使用它将一些短小的信息通知给用户,它有如下两个特点:Toast是没有焦点的Toast显示的时间有限过一定的时间就会自动消失所以一般来讲Toast的使用并不会影响我们的正常操作,并且它通常不会占用太大的屏幕空间,有着良好的用户体
C语言 判断回文数
Y雨何时停T
c语言 学习
一,回文数概念“回文”是指正读反读都能读通的句子,它是古今中外都有的一种修辞方式和文字游戏,如“我为人人,人人为我”等。在数学中也有这样一类数字有这样的特征,成为回文数。设n是一任意自然数。若将n的各位数字反向排列所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。二,判断回文数实现思路一:数组与字符串将数字每一位按顺序放
多线程之——ExecutorCompletionService
阿福德
在我们开发中,经常会遇到这种情况,我们起多个线程来执行,等所有的线程都执行完成后,我们需要得到个线程的执行结果来进行聚合处理。我在内部代码评审时,发现了不少这种情况。看很多同学都使用正确,但比较啰嗦,效率也不高。本文介绍一个简单处理这种情况的方法:直接上代码:publicclassExecutorCompletionServiceTest{@TestpublicvoidtestExecutorCo
基于Python给出的PDF文档转Markdown文档的方法
程序媛了了
python pdf 开发语言
注:网上有很多将Markdown文档转为PDF文档的方法,但是却很少有将PDF文档转为Markdown文档的方法。就算有,比如某些网站声称可以将PDF文档转为Markdown文档,尝试过,不太符合自己的要求,而且无法保证文档没有泄露风险。于是本人为了解决这个问题,借助GPT(能使用GPT镜像或者有条件直接使用GPT的,反正能调用GPT接口就行)生成Python代码来完成这个功能。笔记、代码难免存在
BART&BERT
Ambition_LAO
深度学习
BART和BERT都是基于Transformer架构的预训练语言模型。模型架构:BERT(BidirectionalEncoderRepresentationsfromTransformers)主要是一个编码器(Encoder)模型,它使用了Transformer的编码器部分来处理输入的文本,并生成文本的表示。BERT特别擅长理解语言的上下文,因为它在预训练阶段使用了掩码语言模型(MLM)任务,即
[Python] 数据结构 详解及代码
AIAdvocate
算法 python 数据结构 链表
今日内容大纲介绍数据结构介绍列表链表1.数据结构和算法简介程序大白话翻译,程序=数据结构+算法数据结构指的是存储,组织数据的方式.算法指的是为了解决实际业务问题而思考思路和方法,就叫:算法.2.算法的5大特性介绍算法具有独立性算法是解决问题的思路和方式,最重要的是思维,而不是语言,其(算法)可以通过多种语言进行演绎.5大特性有输入,需要传入1或者多个参数有输出,需要返回1个或者多个结果有穷性,执行
Js函数返回值
_wy_
js return
一、返回控制与函数结果,语法为:return 表达式;作用: 结束函数执行,返回调用函数,而且把表达式的值作为函数的结果 二、返回控制语法为:return;作用: 结束函数执行,返回调用函数,而且把undefined作为函数的结果 在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.例如,默认情况下点击一个<a>元素,页面会跳转到该元素href属性
MySQL 的 char 与 varchar
bylijinnan
mysql
今天发现,create table 时,MySQL 4.1有时会把 char 自动转换成 varchar
测试举例:
CREATE TABLE `varcharLessThan4` (
`lastName` varchar(3)
) ;
mysql> desc varcharLessThan4;
+----------+---------+------+-
Quartz——TriggerListener和JobListener
eksliang
TriggerListener JobListener quartz
转载请出自出处:http://eksliang.iteye.com/blog/2208624 一.概述
listener是一个监听器对象,用于监听scheduler中发生的事件,然后执行相应的操作;你可能已经猜到了,TriggerListeners接受与trigger相关的事件,JobListeners接受与jobs相关的事件。
二.JobListener监听器
j
oracle层次查询
18289753290
oracle;层次查询;树查询
.oracle层次查询(connect by)
oracle的emp表中包含了一列mgr指出谁是雇员的经理,由于经理也是雇员,所以经理的信息也存储在emp表中。这样emp表就是一个自引用表,表中的mgr列是一个自引用列,它指向emp表中的empno列,mgr表示一个员工的管理者,
select empno,mgr,ename,sal from e
通过反射把map中的属性赋值到实体类bean对象中
酷的飞上天空
javaee 泛型 类型转换
使用过struts2后感觉最方便的就是这个框架能自动把表单的参数赋值到action里面的对象中
但现在主要使用Spring框架的MVC,虽然也有@ModelAttribute可以使用但是明显感觉不方便。
好吧,那就自己再造一个轮子吧。
原理都知道,就是利用反射进行字段的赋值,下面贴代码
主要类如下:
import java.lang.reflect.Field;
imp
SAP HANA数据存储:传统硬盘的瓶颈问题
蓝儿唯美
HANA
SAPHANA平台有各种各样的应用场景,这也意味着客户的实施方法有许多种选择,关键是如何挑选最适合他们需求的实施方案。
在 《Implementing SAP HANA》这本书中,介绍了SAP平台在现实场景中的运作原理,并给出了实施建议和成功案例供参考。本系列文章节选自《Implementing SAP HANA》,介绍了行存储和列存储的各自特点,以及SAP HANA的数据存储方式如何提升空间压
Java Socket 多线程实现文件传输
随便小屋
java socket
高级操作系统作业,让用Socket实现文件传输,有些代码也是在网上找的,写的不好,如果大家能用就用上。
客户端类:
package edu.logic.client;
import java.io.BufferedInputStream;
import java.io.Buffered
java初学者路径
aijuans
java
学习Java有没有什么捷径?要想学好Java,首先要知道Java的大致分类。自从Sun推出Java以来,就力图使之无所不包,所以Java发展到现在,按应用来分主要分为三大块:J2SE,J2ME和J2EE,这也就是Sun ONE(Open Net Environment)体系。J2SE就是Java2的标准版,主要用于桌面应用软件的编程;J2ME主要应用于嵌入是系统开发,如手机和PDA的编程;J2EE
APP推广
aoyouzi
APP 推广
一,免费篇
1,APP推荐类网站自主推荐
最美应用、酷安网、DEMO8、木蚂蚁发现频道等,如果产品独特新颖,还能获取最美应用的评测推荐。PS:推荐简单。只要产品有趣好玩,用户会自主分享传播。例如足迹APP在最美应用推荐一次,几天用户暴增将服务器击垮。
2,各大应用商店首发合作
老实盯着排期,多给应用市场官方负责人献殷勤。
3,论坛贴吧推广
百度知道,百度贴吧,猫扑论坛,天涯社区,豆瓣(
JSP转发与重定向
百合不是茶
jsp servlet Java Web jsp转发
在servlet和jsp中我们经常需要请求,这时就需要用到转发和重定向;
转发包括;forward和include
例子;forwrad转发; 将请求装法给reg.html页面
关键代码;
req.getRequestDispatcher("reg.html
web.xml之jsp-config
bijian1013
java web.xml servlet jsp-config
1.作用:主要用于设定JSP页面的相关配置。
2.常见定义:
<jsp-config>
<taglib>
<taglib-uri>URI(定义TLD文件的URI,JSP页面的tablib命令可以经由此URI获取到TLD文件)</tablib-uri>
<taglib-location>
TLD文件所在的位置
JSF2.2 ViewScoped Using CDI
sunjing
CDI JSF 2.2 ViewScoped
JSF 2.0 introduced annotation @ViewScoped; A bean annotated with this scope maintained its state as long as the user stays on the same view(reloads or navigation - no intervening views). One problem w
【分布式数据一致性二】Zookeeper数据读写一致性
bit1129
zookeeper
很多文档说Zookeeper是强一致性保证,事实不然。关于一致性模型请参考http://bit1129.iteye.com/blog/2155336
Zookeeper的数据同步协议
Zookeeper采用称为Quorum Based Protocol的数据同步协议。假如Zookeeper集群有N台Zookeeper服务器(N通常取奇数,3台能够满足数据可靠性同时
Java开发笔记
白糖_
java开发
1、Map<key,value>的remove方法只能识别相同类型的key值
Map<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"a");
map.put(2,"b");
map.put(3,"c"
图片黑色阴影
bozch
图片
.event{ padding:0; width:460px; min-width: 460px; border:0px solid #e4e4e4; height: 350px; min-heig
编程之美-饮料供货-动态规划
bylijinnan
动态规划
import java.util.Arrays;
import java.util.Random;
public class BeverageSupply {
/**
* 编程之美 饮料供货
* 设Opt(V’,i)表示从i到n-1种饮料中,总容量为V’的方案中,满意度之和的最大值。
* 那么递归式就应该是:Opt(V’,i)=max{ k * Hi+Op
ajax大参数(大数据)提交性能分析
chenbowen00
Web Ajax 框架 浏览器 prototype
近期在项目中发现如下一个问题
项目中有个提交现场事件的功能,该功能主要是在web客户端保存现场数据(主要有截屏,终端日志等信息)然后提交到服务器上方便我们分析定位问题。客户在使用该功能的过程中反应点击提交后反应很慢,大概要等10到20秒的时间浏览器才能操作,期间页面不响应事件。
根据客户描述分析了下的代码流程,很简单,主要通过OCX控件截屏,在将前端的日志等文件使用OCX控件打包,在将之转换为
[宇宙与天文]在太空采矿,在太空建造
comsci
我们在太空进行工业活动...但是不太可能把太空工业产品又运回到地面上进行加工,而一般是在哪里开采,就在哪里加工,太空的微重力环境,可能会使我们的工业产品的制造尺度非常巨大....
地球上制造的最大工业机器是超级油轮和航空母舰,再大些就会遇到困难了,但是在空间船坞中,制造的最大工业机器,可能就没
ORACLE中CONSTRAINT的四对属性
daizj
oracle CONSTRAINT
ORACLE中CONSTRAINT的四对属性
summary:在data migrate时,某些表的约束总是困扰着我们,让我们的migratet举步维艰,如何利用约束本身的属性来处理这些问题呢?本文详细介绍了约束的四对属性: Deferrable/not deferrable, Deferred/immediate, enalbe/disable, validate/novalidate,以及如
Gradle入门教程
dengkane
gradle
一、寻找gradle的历程
一开始的时候,我们只有一个工程,所有要用到的jar包都放到工程目录下面,时间长了,工程越来越大,使用到的jar包也越来越多,难以理解jar之间的依赖关系。再后来我们把旧的工程拆分到不同的工程里,靠ide来管理工程之间的依赖关系,各工程下的jar包依赖是杂乱的。一段时间后,我们发现用ide来管理项程很不方便,比如不方便脱离ide自动构建,于是我们写自己的ant脚本。再后
C语言简单循环示例
dcj3sjt126com
c
# include <stdio.h>
int main(void)
{
int i;
int count = 0;
int sum = 0;
float avg;
for (i=1; i<=100; i++)
{
if (i%2==0)
{
count++;
sum += i;
}
}
avg
presentModalViewController 的动画效果
dcj3sjt126com
controller
系统自带(四种效果):
presentModalViewController模态的动画效果设置:
[cpp]
view plain
copy
UIViewController *detailViewController = [[UIViewController al
java 二分查找
shuizhaosi888
二分查找 java二分查找
需求:在排好顺序的一串数字中,找到数字T
一般解法:从左到右扫描数据,其运行花费线性时间O(N)。然而这个算法并没有用到该表已经排序的事实。
/**
*
* @param array
* 顺序数组
* @param t
* 要查找对象
* @return
*/
public stati
Spring Security(07)——缓存UserDetails
234390216
ehcache 缓存 Spring Security
Spring Security提供了一个实现了可以缓存UserDetails的UserDetailsService实现类,CachingUserDetailsService。该类的构造接收一个用于真正加载UserDetails的UserDetailsService实现类。当需要加载UserDetails时,其首先会从缓存中获取,如果缓存中没
Dozer 深层次复制
jayluns
VO maven po
最近在做项目上遇到了一些小问题,因为架构在做设计的时候web前段展示用到了vo层,而在后台进行与数据库层操作的时候用到的是Po层。这样在业务层返回vo到控制层,每一次都需要从po-->转化到vo层,用到BeanUtils.copyProperties(source, target)只能复制简单的属性,因为实体类都配置了hibernate那些关联关系,所以它满足不了现在的需求,但后发现还有个很
CSS规范整理(摘自懒人图库)
a409435341
html UI css 浏览器
刚没事闲着在网上瞎逛,找了一篇CSS规范整理,粗略看了一下后还蛮有一定的道理,并自问是否有这样的规范,这也是初入前端开发的人一个很好的规范吧。
一、文件规范
1、文件均归档至约定的目录中。
具体要求通过豆瓣的CSS规范进行讲解:
所有的CSS分为两大类:通用类和业务类。通用的CSS文件,放在如下目录中:
基本样式库 /css/core
C++动态链接库创建与使用
你不认识的休道人
C++ dll
一、创建动态链接库
1.新建工程test中选择”MFC [dll]”dll类型选择第二项"Regular DLL With MFC shared linked",完成
2.在test.h中添加
extern “C” 返回类型 _declspec(dllexport)函数名(参数列表);
3.在test.cpp中最后写
extern “C” 返回类型 _decls
Android代码混淆之ProGuard
rensanning
ProGuard
Android应用的Java代码,通过反编译apk文件(dex2jar、apktool)很容易得到源代码,所以在release版本的apk中一定要混淆一下一些关键的Java源码。
ProGuard是一个开源的Java代码混淆器(obfuscation)。ADT r8开始它被默认集成到了Android SDK中。
官网:
http://proguard.sourceforge.net/
程序员在编程中遇到的奇葩弱智问题
tomcat_oracle
jquery 编程 ide
现在收集一下:
排名不分先后,按照发言顺序来的。
1、Jquery插件一个通用函数一直报错,尤其是很明显是存在的函数,很有可能就是你没有引入jquery。。。或者版本不对
2、调试半天没变化:不在同一个文件中调试。这个很可怕,我们很多时候会备份好几个项目,改完发现改错了。有个群友说的好: 在汤匙
解决maven-dependency-plugin (goals "copy-dependencies","unpack") is not supported
xp9802
dependency
解决办法:在plugins之前添加如下pluginManagement,二者前后顺序如下:
[html]
view plain
copy
<build>
<pluginManagement