我是小白,请问大神们,mvn clean package d-U install 和mvn -U clean install有区别吗?

JAVAEE(7)
ORACLE的JDBC JAR 包 无法从MVN仓库中下载, 需要自行安装
&com.oracle&
&10.2.0.4.0&
MVN安装命令:
mvn install:install-file -Dfile=D:\ojdbc14.jar -DgroupId=com.oracle -DartifactId=ojdbc14 -Dversion=10.2.0.4.0 -Dpackaging=jar
POM中依赖的配置信息 要与安装的信息保持一致。1515人阅读
Maven(13)
公司开发APP,服务器端的开发任务落到了我的手里,作为一个应届小白,就按照普通的方法来搭建SringMVC+Hibernate+MySQL,期间引入了很多的jar包,当我将项目导入SVN,让另一个同事检出的时候,感觉有别扭,一个是jar包随着项目一并检出,另一个是jar包要是发现有冲突,还要一个一个找出来删掉再重新检出。这样做起来很麻烦,想到之前在另一家公司里实习的时候,那时候接触到的项目管理工具Maven,抱着试一试的态度,接触了一下Maven,没想到,一下就深深得爱上了Maven。
受我怀念的顶礼;(又让我回忆道在实习公司里的种种)
受我沉醉的顶礼;(了解Mavne之后的迷恋程度)
受我怨恨的顶礼;(相见恨晚)
Maven实战》里作者是这样比喻Maven的
作者把PC里的每个硬件比作是项目里的每个jar包,maven比作一个供应商。将需要的硬件(jar)列在清单里(pom.xml),然后提交给供应商,然后,供应商会根据列表,依次发送给你,替你测试过,还享有几年保修的服务。这样理解Mavne再好不过了。
其实Maven不仅仅有管理Jar包这个功能,它是一个项目管理工具,贯穿了整个项目生命周期,编译,测试,打包,发布。。。
首先介绍使用Maven要重要的两点使用Maven首先要遵循它的目录结构
这样才能按照Maven的规则来玩
再来就是pom.xml文件
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"&
&com.al.mavenDemo&
&mavenDemo-model&
&0.1.1-SNAPSHOT&
maven项目新建好的pom文件如上代码
modelVersion—当前POM模型的版本
groupId—项目属于哪个组,这个组往往和项目所在的组织或公司存在关联(www.baidu.com)可能就要写”com.baidu.app”
artifactId—maven项目在组中唯一的ID,上面的groupId下可能拥有几个子模块,如user、login、service等等,就可以这样写app-user、app-login、app-
version—项目当前的版本–1.0-SNAPSHOT。SNAPSHOT意为快照,说明该项目还处于开发中,是不稳定的版本。随着项目的发展,version会不断更新,如升级为1.0,1.1-SNAPSHOT,1.1,2.0等
下面介绍一些Maven的一些命令和如何在Eclipse使用Maven管理项目
Maven常用命令:
1. 创建Maven的普通java项目:
mvn archetype:create
-DgroupId=packageName
-DartifactId=projectName
2. 创建Maven的Web项目:
mvn archetype:create -DgroupId=packageName
-DartifactId=webappName-DarchetypeArtifactId=maven-archetype-webapp
3. 编译源代码: mvn compile
4. 编译测试代码:mvn test-compile
5. 运行测试:mvn test
6. 产生site:mvn site
7. 打包:mvn package
8. 在本地Repository中安装jar:mvn install
9. 清除产生的项目:mvn clean
10. 生成eclipse项目:mvn eclipse:eclipse
11. 生成idea项目:mvn idea:idea
12. 组合使用goal命令,如只打包不测试:mvn -Dtest package
13. 编译测试的内容:mvn test-compile
14. 只打jar包: mvn jar:jar
15. 只测试而不编译,也不测试编译:mvn test -skipping compile -skipping test-compile
( -skipping 的灵活运用,当然也可以用于其他组合命令)
16. 清除eclipse的一些系统设置:mvn eclipse:clean
mvn -version/-v
显示版本信息
mvn archetype:generate
创建mvn项目
mvn archetype:create -DgroupId=com.oreilly -DartifactId=my-app
创建mvn项目
mvn package
生成target目录,编译、测试代码,生成测试报告,生成jar/war文件
mvn jetty:run
运行项目于jetty上,
mvn compile
编译并测试
清空生成的文件
生成项目相关信息的网站
mvn -Dwtpversion=1.0 eclipse:eclipse
生成Wtp插件的Web项目
mvn -Dwtpversion=1.0 eclipse:clean
清除Eclipse项目的配置信息(Web项目)
mvn eclipse:eclipse
将项目转化为Eclipse项目
mvn deploy:deploy-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar -DrepositoryId=maven-repository-inner -Durl=
发布第三方Jar到本地库中:
mvn install:install-file -DgroupId=com -DartifactId=client -Dversion=0.1.0 -Dpackaging=jar -Dfile=d:\client-0.1.0.jar
-DdownloadSources=true
-DdownloadJavadocs=true
显示详细错误 信息.
mvn validate
验证工程是否正确,所有需要的资源是否可用。
mvn test-compile
编译项目测试代码。 。
mvn integration-test
在集成测试可以运行的环境中处理和发布包。
mvn verify
运行任何检查,验证包是否有效且达到质量标准。
mvn generate-sources
产生应用需要的任何额外的源代码,如xdoclet。
下面来介绍一下如何在eclipse中使用Mavne
如果你是在eclipse上或本机上第一使用maven,那么在创建后需要等待一段时间,因为需要下载一些与maven有关的插件
创建后的目录结构为
依赖是使用Maven坐标来定位的,而Maven坐标主要由GAV(groupId,artifactId,version)构成。因此,使用任何一个依赖之间,你都需要知道它的Maven坐标,在这个网址里,通过输入所需要的jar包名,就会列出个版本清单
比如要使用gson这个jar包在仓库里输入gson搜索,选择使用的版本,然后将dependency复制出来,粘贴在pom里,如
&com.google.code.gson&
保存后,maven会自动为你下载gson所需要的依赖包
随着项目的增大,你的依赖越来越多,比如说你依赖了一堆spring的jar,有org.spring.framework:spring-core,org.spring.framework:beans,org.spring.framework:spring-web, org.spring.framework:spring-mock。它们的groupId是相同的,artifactId不同。为了管理其版本,你对它们进行过统一的升级,逐个的将version改成了最新版。但是,显然,当POM很大的时候你说不定会犯错误,而当版本不一致的时候,一些诡异的兼容性问题就可能出现。
&org.spring.framework&
&spring-core&
&${spring.version}&
&org.spring.framework&
&spring-beans&
&${spring.version}&
&org.spring.framework&
&spring-web&
&${spring.version}&
&org.spring.framework&
&spring-mock&
&${spring.version}&
这里我们定义了一个Maven属性,其名称为spring.version,值是2.5。在这个POM中,我们就能用spring.version的方式来引用该属性。我们看到,所有spring相关的依赖的version元素现在都成了{spring.version},当Maven运行的时候,它会自动用值2.5来替换这个引用。
当我们需要升级spring的时候,只要更改一个地方便可,而且,你现在能很高的保证所有的spring依赖包都是同一个版本。
依赖范围(scope)
对于Junit,一般来说你只有在运行测试的时候需要它,也就是说,它对于src/main/java的classpath没什么意义,并且,将Junit的jar文件打入最终的发布包也不是好事,这无谓的增加了发布包的大小。
于是,junit对于主源码classpath不可用,对于测试源码classpath可用,不会被打包。
再举个例子,在开发javaee应用的时候我们一定会用到servlet-api,它对于主源码和测试源码都是必要的,因为我们的代码中会引入servlet-api的包。但是,在打包的时候,将其放入WAR包就会有问题,因为web容器会提供servlet-api,如果我们再将其打包就会造成依赖冲突,解决方案如下:
&javax.servlet&
&servlet-api&
&provided&
将依赖范围设置成provided,就意味着该依赖对于主源码classpath,以及测试classpath可用,但不会被打包。这正是servlet-api所需要的。
这里归纳一下主要的依赖范围以及作用
依赖范围(scope)
主源码classpath可用
测试源码classpath可用
需要注意的是,当我们没有声明依赖范围的时候,其默认的依赖范围是compile。
依赖管理(dependencyManagement)
当你只有一个Maven模块的时候,你完全不需要看这个部分。但你心里应该清楚,只有一个Maven模块的项目基本上只是个玩具。
实际的项目中,你会有一大把的Maven模块,而且你往往发现这些模块有很多依赖是完全项目的,A模块有个对spring的依赖,B模块也有,它们的依赖配置一模一样,同样的groupId, artifactId, version,或者还有exclusions, classifer。细心的分会发现这是一种重复,重复就意味着潜在的问题,Maven提供的dependencyManagement就是用来消除这种重复的。
正确的做法是:
在父模块中使用dependencyManagement配置依赖
在子模块中使用dependencies添加依赖
dependencyManagement实际上不会真正引入任何依赖,dependencies才会。但是,当父模块中配置了某个依赖之后,子模块只需使用简单groupId和artifactId就能自动继承相应的父模块依赖配置。
这里是一个来自于《Maven权威指南》的例子:
父模块中如此声明:
&org.sonatype.mavenbook&
&a-parent&
&mysql-connector-java&
子模块中如此声明:
&org.sonatype.mavenbook&
&a-parent&
&project-a&
&mysql-connector-java&
你依赖配置越复杂,依赖管理所起到的作用就越大,它不仅能够帮助你简化配置,它还能够帮你巩固依赖配置,也就是说,在整个项目中,对于某个构件(如mysql)的依赖配置只有一种,这样就能避免引入不同版本的依赖,避免依赖冲突。
&&&&每个菜鸟都有一颗大牛的心,但是成为大牛并不容易。本人的博文是自己在平时的生活中工作上记录下来的点点滴滴,也许能帮到你也许能坑到你,仅做参考。毕竟人生处处是坑,如何去解决这些坑,才是最重要的~
静态Blog:
文章:14篇
阅读:42109
阅读:29780
阅读:38203
阅读:28338
文章:10篇
阅读:48925一、源码分析 源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂。 源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。 我认为是阅读源码的最核心驱动力。我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦): 1、只关注项目本身,不懂就baidu一下。 2、除了做好项目,还会阅读和项目有关的技术书籍,看wikipedia。 3、除了阅读和项目相关的书外,还会阅读IT行业的书,比如学Java时,还会去了解函数语言,如LISP。 4、找一些开源项目看看,大量试用第三方框架,还会写写demo。 5、阅读基础框架、J2EE规范、Debug服务器内核。 大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:我能读懂吗?其实,你能够读懂的 耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫。这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构、框架的设计图。 下图是我总结出目前最应该学习的源码知识点: 二、分布式架构 分布式系统是一个古老而宽泛的话题,而近几年因为 “大数据” 概念的兴起,...
时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
当我们在使用php开发的时候,基本不需要关心热更新这件事的,因为PHP本身已经帮我处理好了,只需要提交代码,PHP重新解释一遍即可。而go则是静态语言,编译后得到的是直接被机器执行的,所有代码已经翻译成相对应的机器指令并且在运行时已经加载到内存,不能动态更新。那么如果想热更新就成了件麻烦的事,但是作为后端开发人员,很渴望支持这种功能,毕竟在线上能新增功能、修复bug客户端完全无感知是多么完美的事。
本文暂不讨论http这种无状态服务更新,网上能搜索到很多文章关于如何利用fd继承实现优雅重启。这里主要讨论使用golang 1.8新增的plugin来实现业务的更新,并且业务是类似游戏的有状态服务。官方文档中对plugin的描述比较简单,他可以动态的加载so和执行导出的方法,并且仅仅提供了两个方法:打开模块和提取符号,甚至连关闭都没有(-_-)。 一个程序包含两部分:数据和算法,那么既然是有状态服务,数据部分肯定不能动,那么热更就只能动算法部分了。这时我们需要一个容器,将这两部分隔离开,一方面是存储数据,另一方面要动态加载so。隔离了数据和算法,只要数据存在,我们就可以随意更新算法了。在开始编码之前,要先解决几个问题: 1、同一个so文件只会...
这篇文章主要分析的是linux及windows的socket处理,如何避免惊群及进程间负载均衡的探讨, 这里的惊群主要是指多进程对于新建的连接如何避免同时争用accept现象的处理。 ### 进程的创建 * linux & 进程创建的方式主要通过fork来创建出子进程 ```c // src/os/unix/ngx_process.c ngx_pid_t ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data, char *name, ngx_int_t respawn) { ... pid = fork(); ... } ``` * windows & 进程创建的方式主要通过CreateProcess来创建出子进程,并且通过非继承的方式创建子进程(即子进程不共享父进程的文件句柄)。 ```c // src/os/win32/ngx_process.c ngx_pid_t ngx_execute(ngx_cycle_t *cycle, ngx_exec_ctx_t *ctx) { ... if (CreateProcess(ctx-&path, ctx-&args, NULL, NULL, 0, //此变量为0表示句柄不继承 CREATE_NO_WINDOW, NULL, NULL, &si, &pi) == 0) { ngx_log_error(NGX_LOG_CRIT, cycle-&log, ngx_errno, "CreateProcess(\"%s\") failed", ngx_argv[0]); return 0; } ... } ``` ### ListenSocket的建立 * linux & 由主进程先监听端口, 监听完后fork新的子进程共享父进程的socket句柄,所以在linux中...
多线程相对于其他 Java 知识点来讲,有一定的学习门槛,并且了解起来比较费劲。在平时工作中如若使用不当会出现数据错乱、执行效率低(还不如单线程去运行)或者死锁程序挂掉等等问题,所以掌握了解多线程至关重要。 本文从基础概念开始到最后的并发模型由浅入深,讲解下线程方面的知识。 概念梳理 本节我将带大家了解多线程中几大基础概念。 并发与并行 并行,表示两个线程同时做事情。 并发,表示一会做这个事情,一会做另一个事情,存在着调度。单核 CPU 不可能存在并行(微观上)。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用。但是每一次,只能有一个线程使用它,一旦临界区资源被占用,其他线程要想使用这个资源,就必须等待。 阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待,等待会导致线程挂起。这种情况就是阻塞。 此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程在操作系统层面被挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。 非阻塞则允许多个线程...
Elasticsearch search after分页查询案例分享 1.准备工作 参考文档《高性能elasticsearch ORM开发库使用介绍》导入和配置es客户端 2.编写创建索引表和初始化数据方法 创建索引表和初始化数据的组件DocumentCRUD 实现本文不做重点介绍,请访问视频教程了解: /**
* 创建索引表并导入测试数据
public void initIndiceAndData(){
DocumentCRUD documentCRUD = new DocumentCRUD();
documentCRUD.testCreateIndice();//创建索引表
documentCRUD.testBulkAddDocuments();//导入测试数据
} 3.定义searchAfter dsl配置文件 新建配置文件-esmapper/searchafter.xml 定义searchAfterDSL &properties&
&property name="searchAfterDSL"&
&![CDATA[{
以demoId,_uid为searchAfter的分页条件 _uid值格式type#_id 由索引类型加#号加id拼接而成
如果按照多个字段的值做searchAter分页,则用逗号分隔每个值
#if($searchAfterId) ## 第一次检索的时候,没有searchAfterId变量,只有做翻页操作的时候才会传递代表分页起点的searchAfterId变量进来
"search_after": [#[...
# spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想,是真的么?,忙到这几个字都没时间打么?毕竟大家都很忙的,所以忙并不是啥理由. 那是因为啥呢?感觉就只有一个理由能站得住脚了,就是因为"懒". 哈哈.... 尬聊了一段,活跃下气氛,下面进入正题 ## **场景** 在实际工作中,大家可能也都遇到过这样的情况 : 一个正在更新迭代过程中项目,会收到大量业务部门的需求,这些需求可能会来自于不同业务部门,或者不同的产品经理 而项目的onwer则需要接收到这些需求,对这些需求进行初步的分析和排期,但是在排期的过程中,会有这样一种尴尬的情况发生. 比如,有两个互不嗒噶的产品经理,针对同一功能点,提出了两个不同业务改造的需求点,两个需求点要求上线的时间很接近,但是又出于某种原因,不能同时上线,或者产品经理根本无法确定上线时间,而告诉你尽快完成开发/测试,他则根据实际情况确定业务需求的发布时间 那么,对于这种情况,通常会采用开分支的方式进行开发,即不同版本的并行需求的开发在不同分支上同时进行开发,那么,团队成员(开发/测试),则可以同时的开展工作...
什么是微服务 首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务。 传统的WEB应用核心分为业务逻辑、适配器以及API或通过UI访问的WEB界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。一个打车软件的架构图如下: 尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用。例如Java应用程序会被打包成WAR,部署在Tomcat或者Jetty上。 这种单体应用比较适合于小项目,优点是: 开发简单直接,集中式管理 基本不会重复开发 功能都在本地,没有分布式的管理开销和调用开销 当然它的缺点也十分明显,特别对于互联网公司来说: 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断 代码维护难:代码功能耦合在一起,新人不知道何从下手 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉 扩展性不够:无法满足高并发情况下的业务需求 所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互...
前言 声明,本文用的是jdk1.8 花了一个星期,把Java容器核心的知识过了一遍,感觉集合已经无所畏惧了!!(哈哈哈....),现在来总结一下吧~~ 回顾目录: Collection总览 List集合就这么简单【源码剖析】 Map集合、散列表、红黑树介绍 HashMap就是这么简单【源码剖析】 LinkedHashMap就这么简单【源码剖析】 TreeMap就这么简单【源码剖析】 ConcurrentHashMap基于JDK1.8源码剖析 Set集合就这么简单! Java容器可分为两大类: Collection List ArrayList LinkedList Vector(了解,已过时) Set HashSet LinkedHashSet TreeSet Map HashMap LinkedHashMap TreeMap ConcurrentHashMap Hashtable(了解,,已过时) 着重标出的那些就是我们用得最多的容器。 其实,我也不知道要怎么总结好,因为之前写每一篇的时候都总结过了。现在又把他们重新罗列出来好像有点水,所以,我决定去回答一些Java容器的面试题! 当然了,我的答案未必就是正确的。如果有错误的地方大家多多包含,希望不吝在评论区留言指正~~ 一、ArrayList和Vector的区别 共同点: 这两个类都实现了List接口,它们都是有序的集合(存储有序),底层是数组。我们可以按位置索引号取出某个元素,允许元素重复和为null。 区别...
& 本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。 上一篇总结了可能出现的异常场景,并对RabbitMQ提供的可用性保证进行了分析,在出现服务器宕机后,仍然可以正常服务。另外,需要尽快恢复异常的服务器,重新加入集群,推送未消费的消息,通过监控可第一时间接收到错误并进行处理。 另外,我们想主动了解消息堆积和消费的情况,以及服务器节点的压力,RabbitMQ提供了几种方式便捷、直观的了解,包括Web管理插件、REST API、rabbitmqadmin脚本。 通过介绍,你会了解到: * web管理插件 * REST API * rabbitmqadmin脚本 * Nagios和监控RabbitMQ ### web管理插件 RabbitMQ的插件是由Erlang语言写的,并且和服务器一同运行在同一个Erlang VM中,通过下面的命令启用web管理插件: ``` java sudo ./rabbitmq-plugins enable rabbitmq_management ``` 启动之后,访问15672端口,可看到Web管理页面主页面: ![RabbitMQ主页面](http://oc3r3rke2.bkt.clouddn.com/70.jpg) ##### 添加用户 默认会提供一个默认用户guest,密码也是guest,线上环境需要创建一个新用户,并把guest用户删除。 首先切换到Admin标签页,可以查看或添加用户,添加用户时,可...
ulimit用来限制每个用户可使用的资源,如CPU、内存、句柄等。下面以CentOS 6.5为例进行总结。
根据GNU协议又称革奴计划,是由Richard Stallman在日公开发起的。它的目标是创建一套完全自由的操作系统。Richard Stallman最早是在net.unix-wizards新闻组上公布该消息,并附带《GNU宣言》等解释为何发起该计划的文章,其中一个理由就是要“重现当年软件界合作互助的团结精神”。为保证GNU软件可以自由地“使用、复制、修改和发布”,所有GNU软件都有一份在禁止其他人添加任何限制的情况下授权所有权利给任何人的协议条款,GNU通用公共许可证(GNU General Public License,GPL)。即“反版权”(或称Copyleft)概念。
Python3中的函数介绍: 1.函数的定义 , 2.函数的调用, 3.函数的参数, 4.函数的返回值, 5.函数的变量, 6.匿名函数, 7.高阶函数
遇见这个问题,是公司的小伙伴跟我说,每次使用mybatis的时候,简单的连表查询,用Map接收的时候,都是像DB定义的字段一样,类似以下 student_name,student_id,没有转换为驼峰,但是又不能因为这一个定义一个javabean来映射数据库字段集合,这样,会有无穷无尽的javabean,完全不是办法,然后我看了下mybatis-spring-boot的配置文档http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/,发现有这么个属性
mybatis.configuration.map-underscore-to-camel-case=true 看着属性意思,很像是 map 下划线转换为驼峰,然后我天真的以为,加个这个,就会将Map里面的key转换为驼峰的命名方式,然后我自己测试了一下,发现自己还是太天真,没转过来,该是什么还是什么(心里面是B了狗了).... 没办法,接着找了了一下,发现官方文档http://www.mybatis.org/mybatis-3/configuration.html#properties,描述过这个的作用
才发现,这个属性的作用,是作用于javabean的field的,并不是map,ㄟ( ▔, ▔ )ㄏ,那没办法了,只能自己动手了
-------------------------------我是分割线-------------------------------------- 既然 map-underscore-to-camel-case 不能作用于map,那么...
& 原文发表于:[以太坊智能合约开发第六篇:truffle开发框架](https://www.marser.cn/article/141.html) 在前面几篇教程中,我们实现了一个简单的 ***Hello*** 合约,并通过 ***solc*** 编译器将合约代码编译后,部署在私有链Ganache上。本篇将介绍通过truffle框架来构建自动编译、部署合约代码。 ### truffle框架 Truffle是基于Solidity语言的一套开发框架,它简化了去中心化应用(Dapp)的构建和管理流程。本身是采用Javascript编写,支持智能合约的编译、部署和测试。 truffle开发框架提供了很多功能,简化了我们的开发、编译、部署与调试过程: * 内置了智能合约编译、链接、部署和二进制文件的管理 * 方便快速开发的合约自动化测试 * 方便扩展的、脚本化的部署与发布框架 * 方便的网络管理功能。不论是公有网络还是私有网络 * 基于[ERC190](https://github.com/ethereum/EIPs/issues/190)标准,使用EthPM & NPM进行依赖包管理 * 内置控制台功能。项目构建后,可以直接在命令行调用输出结果,方便了开发调试 * 可配的构建流程,支持持续集成。 * 支持外部脚本的执行 接下来,我们将通过truffle框架来构建 ***Hello*** 合约的编译、部署过程。 ### truffle安装 ```shell...
上一篇,我们实现了一个简单的智能合约。用户输入什么字符串,合约就原样返回什么。在文章最后抛出了一个问题:如果我们事先在合约里定义好 **Hello** 字符串,如何与 **name** 变量进行字符串拼接? 在智能合约里进行字符串的拼接可不是一件简单的事情。本篇就来介绍智能合约里的字符串拼接。 ### 尝试 我们先用绝大部分语言都通用的连接符 ***+*** 和 ***.*** 来尝试着修改代码: ```javascript //pragma关键字:版本申明。 //用来指示编译器将代码编译成特定版本,以免引起兼容性问题 //此处不支持0.4.0之前的编译器,也不支持0.5.0之后的编译器(条件为 ^) pragma solidity ^0.4.0; //contract关键字:合约申明 //和Java、PHP中的class类似 //此处是申明一个名为Hello的合约 contract Hello { string str="Hello "; //public: 函数访问属性(后续文章为详细阐述) //returns (string): 定义返回值类型为string function say(string name) public returns (string) { return str + } } ``` 运行 ***node deploy.js*** 部署脚本后,抛出了一个异常: & TypeError: Operator + not compatible with types string storage ref and string memory & return str + name...
& 原文发表于:[以太坊智能合约开发第四篇:实现Hello World智能合约](https://www.marser.cn/article/139.html) 绝大部分开发者学习一门语言的时候,都是从输出一个 ***Hello World*** 开始。我们也从实现一个 ***Hello World*** 合约为切入点,开始进入智能合约的世界吧。 ### 环境准备 安装好 ***node*** 和 ***npm***。这里对node和npm的安装过程,不做详细介绍。本篇依赖的环境版本: & Node : v8.9.0 & Npm: 5.5.1 在你的代码目录里,创建名为 ***smartcontract*** 的文件夹,并创建如下两个文件 ***package.json*** 、 ***Hello.sol*** 。 & smartcontract & ├── Hello.sol & └── package.json 在 ***package.json*** 文件里,添加如下依赖包配置: ```json { "name": "smartcontract", "version": "0.0.1", "dependencies": { "fs": "0.0.1-security", "solc": "^0.4.21", "web3": "^0.20.0" } } ``` & fs模块用于文件的相关操作 & solc模块是编译器 & web3模块是以太坊提供的工具包,主要用于与合约的通信 接下来执行 ***npm install*** 下载相关的依赖包。 ### 编写合约代码 环境准备好后,就可以开始编写合约代码了。 打开 ***Hello.sol*** 文件,编写代码...
& 原文发表于:[以太坊智能合约开发第三篇:安装节点工具Ganache](https://www.marser.cn/article/138.html) 在正式开始编写智能合约之前,我们需要先安装一个以太坊客户端,也就是我们常说的以太坊节点。上一篇有提到Geth,但是它会消耗很多时间来同步以太坊的所有区块数据,并占用很大的磁盘空间。目前已经有几十G大小,不久将达到上百G。在开发过程中,我们推荐使用以太坊区块链的私有链Ganache来搭建节点。 ### Ganache Ganache可以快速启动个人以太坊区块链,并可以使用它来运行测试,执行命令、检查状态,同时控制链条的运行方式。 ### 安装 打开官网 http://truffleframework.com/ganache/ , 并点击 ***DOWNLOAD*** 按钮: ![下载](http://www.marser.cn/2018/04/ganache-1.png) 下载完后,直接按提示即可以安装成功。打开后的界面如图所示: ![安装成功](http://www.marser.cn/2018/04/ganache-2.png) 可以看到 ***ACCOUNTS*** 面板里已经生成了10个账户可用。每个账户里都有100枚ETH。 ### Ganache特征 通过Ganache,我们可以: & 快速查看所有账户的当前状态,包括他们的地址、私钥、交易和余额 & & 查看Ganache内部区块链的日志输出,包括响应和其他重要的调试...
很多人都说比特币是区块链1.0,以太坊是区块链2.0。在以太坊平台上,可以开发各种各样的去中心化应用,这些应用构成了以太坊的整个生态。目前,以太坊是区块链世界里生态建设最好的底层公链。本篇将以通俗易懂的方式介绍以太坊开发中涉及到的相关概念,带领大家轻松入门。
Shiro可以帮助你完成安全模块的设计与实现,减少代码侵入性,轻松高效地解决安全需求。
声明式注解结合全局异常处理器轻松搞定参数校验逻辑,避免方法中重复手写if/else
时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
#coding:utf-8
Gabor滤波器参数可视化
参考:https://blog.csdn.net/lhanchao/article/details/
import cv2
import numpy as np
import math
# λ(波长)变化
kernel1 = cv2.getGaborKernel((311,311),10,0,5,0.5,0)
kernel2 = cv2.getGaborKernel((311,311),10,0,10,0.5,0)
kernel3 = cv2.getGaborKernel((311,311),10,0,15,0.5,0)
kernel4 = cv2.getGaborKernel((311,311),10,0,20,0.5,0)
cv2.imshow("lambda: 5", kernel1)
cv2.imshow("lambda: 10", kernel2)
cv2.imshow("lambda: 15", kernel3)
cv2.imshow("lambda: 20", kernel4)
kernel1 = cv2.getGaborKernel((311, 311), 10, 0, 10, 0.5, 0)
kernel2 = cv2.getGaborKernel((311, 311), 10, math.pi * 0.25, 10, 0.5)
kernel3 = cv2.getGaborKernel((311, 311), 10, math.pi * 0.5, 10, 0.5, 0)
kernel4 = cv2.getGaborKernel((311, 311), 10, math.pi * 0.75, 10, 0.5, 0)
cv2.imshow("theta: 0", kernel1)
cv2.imshow("theta: 45", kernel2)
cv2.imshow("theta: 90", kernel3)
cv2.imshow("theta: 135", kernel4)
# ψ的变化
# σ的变化:
kernel1 = cv2.getGaborKernel((311,...
摘要: 微处理架构——处理复杂事物   许多公司,比如Amazon、eBay和NetFlix,通过采用微处理结构模式解决了上述问题。其思路不是开发一个巨大的单体式的应用,而是将应用分解为小的、互相连接的微服务。
# vue-router路由 * 单页面跳转是通过路由实现的,在这里的跳转是移动锚点,而不是页面; * 在Vue中所有的页面都可以看作是组件(components); ## 1. 基本单页面应用 {{name}} parent1 parent2 ## 2. 参数处理跟子路由 1. 使用name传值 2. 使用params传值 {{$route.name}} parent1 child1 child2 parent2 parent2 ## 3. 组件群 1. 再组件中设置路由群 2. 配置路由 let routes= [{ path:'/', components:{ default:parent1, left:child1, right: child2 }, name:'parent1', }]; **注**:注意此处的components是复数形式,components的属性值 == 路由群中的name值
目前在JAVA的世界中,maven已经成为事实上的构建标准,很多开源库的管理构建也是基于maven的,maven本身的学习曲线比较陡峭,遵循“约定优于配置”的理念,maven存在很多约定。本次我先描述下,关于版本的定义的选择,SNAPSHOT or RELEASE? 版本之争 在maven的约定中,依赖的版本分为两类——SNAPSHOT和RELEASE。SNAPSHOT依赖泛指以-SNAPSHOT为结尾的版本号,例如1.0.1-SNAPSHOT。除此之外,所有非-SNAPSHOT结尾的版本号则都被认定为RELEASE版本,即正式版,虽然会有beta、rc之类说法,但是这些只是软件工程角度的测试版,对于maven而言,这些都是RELEASE版本。既然Maven提供了这两类版本号,那么他们之前的优劣势是什么?分别在什么场景下使用? 解读SNAPSHOT 同一个SNAPSHOT版本的依赖可以多次发布(deploy)到仓库中,也就是说同一个SNAPSHOT版本的依赖可以在仓库中存在多份,每一份都是代码在某一个特定时间的快照,这也是SNAPSHOT的含义。 如上图,很好地表达了SNAPSHOT的细节,也阐述了一个SNAPSHOT很重要观点——SNAPSHOT不是一个特定的版本,而是一系列的版本的集合,其中HEAD总是指向最新的快照,对外界可见的一般也是最新版,这种给人的假象是新的覆盖了老的,从...
新机器上需要搭建各种环境,要下载各种安装包。于是得到各个软件的官网去下载安装包,有点麻烦,这次写个文章记录下来常用安装包的下载地址吧,持续更新...... JDK: jdk-8u161-linux-x64.tar.gz
wget http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165bee98c45e0808/jdk-8u161-linux-x64.tar.gz jdk-9.0.4_linux-x64_bin.tar.gz
wget http://download.oracle.com/otn-pub/java/jdk/9.0.4+11/cbf959763f/jdk-9.0.4_linux-x64_bin.tar.gz Tomcat: apache-tomcat-7.0.82.tar.gz wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-7/v7.0.82/bin/apache-tomcat-7.0.82.tar.gz apache-tomcat-8.5.24.tar.gz wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-8/v8.5.24/bin/apache-tomcat-8.5.24.tar.gz apache-tomcat-9.0.2.tar.gz wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.2/bin/apache-tomcat-9.0.2.tar.gz Jetty: wget http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.8.v/jetty-distribution-9.4.8.v2017...
简单说一下 autojs ,这是一个开源(https://github.com/hyb1996/Auto.js 看账号貌似是个96年的小朋友?)的利用 Android 的无障碍服务实现的自动操作软件。
-------------------18.2.22 凌晨更新---------------------- 这次更新同时支持了群聊和普通聊天,并且加入了 face++ 的 人脸识别API 实现了【颜值测试】功能,增加了趣味性。。。 这里需要注意的是 你需要自己去 face++ 申请接口 https://console.faceplusplus.com.cn/register ,注册个账号然后创建一个 app_key 就行了 【颜值测试】效果截图: ------------------------------------------------------------- 上代码: "auto";
//设置无障碍模式 fast为启用缓存
//请求截屏权限
因为增加了这个权限请求 启动脚本必须在 autojs APP界面 否则会有问题,主要是连电脑调试要注意
if(!images.requestScreenCapture()){
toast("请求截图失败");
toast("打开微信聊天界面");
* a4 : 聊天界面 时间控件 id
* apt: 聊天列表页 聊天摘要
* jg:聊天界面 头像
* aec , ae2:聊天界面
* jh : 聊天昵称
* y:头像和消息的父级
一个消息块
* aab : 聊...
Java 判断图片类型
## 静态编译 编译时一个将源代码翻译成低级语言的过程。编译过程比较慢,在设计Go时,编译速度是主要的设计目标之一。静态类型意味着变量必须指定一个类型,如整形,字符串,布尔,数组等,可以在声明变量时指定变量类型,大多数情况下,让编译器自动去推断变量类型。 ## 垃圾回收 变量有一个确定的生命周期。例如函数中定义的局部变量,当函数退出时变量就不存在了。语言的垃圾回收机制可以记录不在使用的变量,然后释放他们占用的内存。垃圾回收机制带来一些性能影响。 ## 代码运行 go run命令会先编译然后再运行你的代码,会在一个临时目录下编译这段代码,然后执行,最后自动清除生成的临时文件。如果只是编译代码可以使用go build。 ## 变量赋值 第一种方式: ``` var power int power = 9000 ``` 第二种方式: ``` var power int = 9000 ``` 第三种方式:用于声明一个变量并给变量赋值,go可以推断变量类型,在第一次声明变量时,使用:=,此时确定了变量类型。但随后对于此变量的赋值,使用=。 ``` power := 9000 gg := getPower() func getPower() int{ return 9001 } ``` 第四种方式:go支持多个变量同事赋值 ``` name, power := "Goku", 9000 ``` ## 函数声明 函数...
Flume 作为 cloudera 开发的实时日志收集系统,受到了业界的认可与广泛应用。Flume 初始的发行版本目前被统称为 Flume OG(original generation),属于 cloudera。但随着 FLume 功能的扩展,Flume OG 代码工程臃肿、核心组件设计不合理、核心配置不标准等缺点暴露出来,尤其是在 Flume OG 的最后一个发行版本 0.94.0 中,日志传输不稳定的现象尤为严重,为了解决这些问题,2011 年 10 月 22 号,cloudera 完成了 Flume-728,对 Flume 进行了里程碑式的改动:重构核心组件、核心配置以及代码架构,重构后的版本统称为 Flume NG(next generation);改动的另一原因是将 Flume 纳入 apache 旗下,cloudera Flume 改名为 Apache Flume。IBM 的这篇文章:《Flume NG:Flume 发展史上的第一次革命》,从基本组件以及用户体验的角度阐述 Flume OG 到 Flume NG 发生的革命性变化。本文就不再赘述各种细枝末节了,不过这里还是简要提下 Flume NG (1.x.x)的主要变化: sources和sinks 使用channels 进行链接 两个主要channel 。1, in-memory channel 非持久性支持,速度快。2 , JDBC-based channel 持久性支持。 不再区分逻辑和物理node,所有物理节点统称为 “agents”,每个a...
## 前言 由于需要在阿里云测试scrapyd部署,所以就想在上面安装Anaconda,以方便完成部署测试。 我的阿里云系统是centos7+版本 ------------------------------------ ## 安装 在目录下新建文件夹anaconda ``` mkdir anaconda ``` 然后cd进去,用wget的方式下载压缩包: ``` wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh ``` 下载完成后 用bash直接安装: ``` bash Anaconda3-5.0.1-Linux-x86_64.sh ``` 安装过程中报错: ``` Anaconda2-5.0.0-Linux-ppc64le.sh: line 317: bunzip2: command not found tar: This does not look like a tar archive tar: Exiting with failure status due to previous errors [root@node1 ~]# ``` 原因是没有bunzip2,这里只能终止安装,先安装bunzip2 ``` yum install -y bzip2 ``` 安装好后继续执行bash打算安装Anaconda,但是提示之前解压的anaconda文件已存在。需要在命令上做改动: ``` bash Anaconda3-5.0.1-Linux-x86_64.sh -u ``` 就完成了安装。 ----------------------------------- ## 设置环境变量 安装好后,运行命令: ``` conda list ``` 提示没有这个命令,原因是安装好后没有给它添加环境变量...
# 1、@SpringBootApplication Spring boot 的项目一般都会有 * Application的入口类,入口类会有main方法,这是一个标准的java应用程序的入口方法 @SpringBootApplication 注解是 Spring boot 的核心注解 ,它其实是一个组合注解: ![输入图片说明](https://static.oschina.net/uploads/img/10948_x9Wg.png "在这里输入图片标题") # 2、@Configuration ![输入图片说明](https://static.oschina.net/uploads/img/11528_52GO.png "在这里输入图片标题") 在Spring boot 项目中推荐使用@SpringBootConfiguration替代@Configuration # 3、EnableAutoConfiguration 启动自动配置,该注解会使Spring boot 根据项目中依赖jar 包自动配置项目的配置项 # 4、ComponentScan 默认扫描 @SpringBootApplication所在类的同级目录以及它的子目录 # 5、关闭自动配置 通过上述,我们得知,Spring boot 会根据项目中的jar包依赖,自动做出配置,Spring boot 支持的自动配置如下 (非常多) ![输入图片说明](https://static.oschina.net/uploads/img/11528_52GO.png "在这里输入图片标题") ![输入图片说明](https://static.oschina.net/uploads/img/21...
阅读目录: 1. 关闭防火墙和Selinux 2. 安装所需环境JDK 3. 下载Zookeeper 3.4.x版本 4. 配置并启动Zookeeper 5. 验证并配置自启动 6. 说明 1. 关闭防火墙和Selinux
Linux的防火墙是咱们新手的噩梦,很多情况会出现能ping通,但是访问不了Web页面。所以开始就干掉它!
1.1 关闭防火墙
[root@localhost ~]# /etc/init.d/iptables stop
iptables: Setting chains to policy ACCEPT: filter
iptables: Flushing firewall rules:
iptables: Unloading modules:
1.2 开机自动关闭防火墙
[root@localhost ~]# chkconfig iptables off
1.3 查看Selinux状态
[root@localhost ~]# sestatus
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
``` ps -A | grep apt $ ps -A |grep apt 1057 ? 00:00:00 apt.systemd.dai sudo kill 1057 sudo rm /var/cache/apt/archives/lock sudo rm /var/lib/dpkg/lock ```
第一次接触mongo,记录在安装mongo的过程中的踩坑过程 执行下面的命令安装mongo,在启动时,报错。 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10
echo 'deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen' | sudo tee /etc/apt/sources.list.d/mongodb.list
apt-get update
apt-get install -y mongodb-org
echo "mongodb-org hold" | sudo dpkg --set-selections
echo "mongodb-org-server hold" | sudo dpkg --set-selections
echo "mongodb-org-shell hold" | sudo dpkg --set-selections
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections
service mongod start 报错信息如下 Job for mongod.service failed because the control process exited with error code. See "systemctl status mongod.service" and "journalctl -xe" for details.
命令行输入journalctl -xe查看详细的错误信息 1月 30 16:03:11 yang mongod[10520]: utility, e.g. service mongod start
1月 30 16:03:11 yang mongod[10520]: initctl: Unable to connect...
集群总结: 1、Redis Cluster数据分区规则采用虚拟槽方式(16384个槽),每个节点负责一个部分槽和相关数据,实现数据和请求的负载均衡。 2、搭建集群划分四个步骤:准备节点、节点握手、分配槽、复制。redis-trib.rb工具用于快速搭建集群。 3、集群伸缩通过在节点之间移动槽和相关数据实现 - 扩展时根据槽迁移计划把槽从源节点迁移到新节点 - 收缩时如果下线的节点有负责的槽需要迁移到其他节点,在通过cluster forget命令让集群内所有节点忘记被下线节点 4、使用smart客户端操作集群达到通信效率最大化,客户端内部负责计算维护键值-& 槽 -& 节点的映射,用于快速定位到目标节点。 5、集群自动故障转移过程分为故障发现和节点恢复,节点下线分为主观下线和客户下线,当超过半数主节点认为故障节点为主观下线时标记它为客观下线状态。从节点负责对客观下线的主节点触发故障恢复流程,保证集群的可用性。 6、开发运维常见问题包括:超大规模集群带宽消耗、pub/sub广播问题,集群倾斜问题,单机和集群对比等。
思考-分布式Redis不一定好 1、Redis Cluster:满足容量和性能的扩展性,很多业务“不需要” 大多数是客户端性能会“降低” 命令无法跨节点使用:mget、keys、s...
https://www.bysocket.com/?p=1124 按照这个操作完报错,经过多次测试发现容易忽略的问题。 1.用eclipse开发的话,需要安装插件sts,可以在软件市场中搜索下载。安装完,选择main类,右键会有 run as --》spring boot app 2.异常:This application has no explicit mapping for /error, so you are seeing this as a fallback. 原因是【Application启动类放的位置不对】要将Application放在最外层,也就是要包含所有子包。 比如你的groupId是com.google,子包就是所谓的com.google.xxx,所以要将Application放在com.google包下。 请参考以下结论:spring-boot会自动加载启动类所在包下及其子包下的所有组件. 3.eclipse run as(或者debug as)后,javaw进程会在后台,不会自动结束。 需要在下次调试前,手动kill javaw.exe 进程。
上一篇我们介绍《构建dubbo分布式平台-maven构建ant-framework核心代码Base封装》,今天重点讲解的是ant-utils工具包的构建过程。 导语:ant-utils是核心工具包,提供整个架构通用工具类库 1. 创建ant-utils工具包子项目,继承ant-parent根项目,其中pom.xml配置如下: &span style="font-size: 14"&&?xml version="1.0"?& &project
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"&
&modelVersion&4.0.0&/modelVersion&
&groupId&com.sml.sz&/groupId&
&artifactId&ant-project&/artifactId&
&version&1.0.0&/version&
&artifactId&ant-utils&/artifactId&
&name&ant-utils&/name&
&url&http://maven.apache.org&/url&
&description&ant核心工具包,提供整个架构通用工具类库&/description&
&dependencies&
&!-- 通用工具包 --&
&depend...
先来测一个静态网页。 - 被测试网页:NGINX默认首页 - URL:http://localhost/ 这里可以算tsung的文档最坑的地方了。如果你照着官网上的入门指南一步一步做下来,我可以告诉你一定跑不通!理由是,**tsung给出的工具tsung-recorder生成的配置文件不是完整的配置文件!!** 如果你想入门,请忘了tsung-recorder,并严格按照以下步骤操作,否则后果就是各种运行时异常。 # 1. 创建文件 `~/.tsung/tsung.xml` 内容如下: ```xml ``` 以上是tsung最小配置的骨架,**里面的东西一个都不能少,而且必须按照这个顺序来配置!!**(该死的官方文档,读的时候有一种只见树木不见森林的赶脚)。 # 2. 添加客户端 一个客户端(client)是一个系统进程(Erlang/Elixir程序员注意,是系统进程,不是BEAM进程。一个系统进程就是一个Erlang虚拟机)。 ``` ``` 这里定义了一个客户端,它在localhost这台主机上开4个进程同时发送请求。最好把`cpu`的值设得和该主机的CPU数量相等,太低无法完全利用测试主机性能,太高则有一些并发问题。Tsung保证会把这些进程分配到不同的CPU内核上。注意:**即使客户端开在本机上,Tsung也会通过SSH远程开启进程,而且不会使用密码。所以请确保SSH配置为Pub...
Cortex-M3里,对于GPIO的配置种类有8种,输入输出模式各有四种。 输出模式: 1.GPIO_Mode_Out_OD 开漏输出 2.GPIO_Mode_Out_PP 推挽输出 3.GPIO_Mode_AF_OD 复用开漏输出
4.GPIO_Mode_AF_PP 复用推挽输出 输入模式: 1.GPIO_Mode_AIN 模拟输入
2.GPIO_Mode_IN_FLOATING 浮空输入 3.GPIO_Mode_IPD 下拉输入 4.GPIO_Mode_IPU 上拉输入 I/O输出指的是STM32对“外部”(相对于STM32I/O口的外部,可看成芯片的外部)驱动硬件,可以理解成对外部输出高低电平,不同的模式只是在输出电平的方式上各有不同。 开漏输出(Open Collector Output):其中的“漏”级(Drain)指的是场效应管的漏级,相当于三极管的集电极(Collector)。则“开漏输出”的含义很明显:使用三极管的集电极或场效应晶体管MOSFET的漏级作为输出端,输出高电平时需要在集电极增加上拉电阻拉高输出电位(此时三极管工作在放大状态)。 由三极管电流放大特性(小电流控制大电流)可以知道该种输出方式适合作为电流型驱动,从负载抽取电流的能力相对较强(20mA左右)。 推挽输出(Push-pull Output):推挽结构一般是指两个三极管分别受两个互补信号的控制,一个晶体管的发射级和另一个晶体管的集电极连接作...
前言 声明,本文用得是jdk1.8 前一篇已经讲了Collection的总览:Collection总览,介绍了一些基础知识。 现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组。线程不安全 LinkedList 底层数据结构是链表。线程不安全 Vector 底层数据结构是数组。线程安全 这篇主要来看看它们比较重要的方法是如何实现的,需要注意些什么,最后比较一下哪个时候用哪个~ 看这篇文章之前最好是有点数据结构的基础:Java实现单向链表,栈和队列就是这么简单,二叉树就这么简单
当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、ArrayList解析
首先,我们来讲解的是ArrayList集合,它是我们用得非常非常多的一个集合~ 首先,我们来看一下ArrayList的属性:
根据上面我们可以清晰的发现:ArrayList底层其实就是一个数组,ArrayList中有扩容这么一个概念,正因为它扩容,所以它能够实现“动态”增长 1.2构造方法 我们来看看构造方法来印证我们上面说得对不对:
1.3Add方法 add方法可以说是ArrayList比较重要的方法了,我们来总览一下:
1.3.1add(E e) 步骤: 检查是否需要扩容 插入元素 首先,我们来看看这个方法:
![这里写图片描述](http://img.blog.csdn.net/05200?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2J1ZGluZzAwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) ![这里写图片描述](http://img.blog.csdn.net/19115?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb2J1ZGluZzAwNw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) #### 添加一个环境 ``` Manage Environments(右上角的齿轮) =& Add =& 填写环境的名称 =& Add ``` #### 添加登录接口 ``` # 比正常的请求多设置一下 "Tests" # 将登录接口返回的response中的token加入环境变量, 如: pm.environment.set("token", JSON.parse(responseBody).data.authorization); ``` #### 添加一个集合 ``` 1. New collection (左侧 目录) 2. 填写名称,如:"需要token的请求" 3. 切换到选项卡"Authorization" 4. 选择相应的 TYPE 5. Token 中填写 {{token}} 6. 点击Create 创建集合 ``` #### 添加需要token的请求 ``` 在刚创建的集合中添加的请求, Headers中都会自动添加 token, 如果token失效, 重新请求一下登录接口即可...
### 写在开头 ``` 使用jhipster声明的OneToMany在One的一方DTO中是没有与Many的DTO的映射关系的, 为了在One的一方DTO中使用Many的DTO, 使用以下三步解决此问题。 ``` ### 步骤 ``` 1. OneDTO 中的"mark 1"处为自己写的一对多的关系, 此处变量名称不能与实体One中相应的变量名称一致,否则编译失败。 2. OneMapper 中的"mark 2"处 uses属性添加ManyMapper。 2. OneMapper 中的"mark 3"处使用@Mapping注解声明 Entity 转 DTO 的映射关系。 ``` ### Entity ``` @Entity @Table(name = "one") public class One { ... @OneToMany(mappedBy = "one") private Set manys = new HashSet&&(); ... public void setManys(Set manys) { this.manys = } public Set getManys() { } } @Entity @Table(name = "many") public class Many { ... @ManyToOne private O } ``` ### DTO ``` public class OneDTO { ... // mark 1 private Set manyDTOS = new HashSet&&(); ... public void setManyDTOS(Set manyDTOS) { this.manyDTOS = manyDTOS; } public Set getManyDTOS() { return manyDTOS; } } public class ManyDTO { ... private Long oneId; ... public...
### 免登陆 ``` # 生成秘钥 tianshl:.ssh tianshl$ ssh-keygen -t rsa -P '' # 将公钥添加至服务器的authorized_keys中 tianshl:.ssh tianshl$ ssh-copy-id -i ./id_rsa.pub root@192.168.1.54 ``` ### 创建脚本 ``` # 项目根目录下创建脚本,名为:update.sh, 内容如下 #!/usr/bin/env bash # 更新 git pull # 打包 mvn clean package -Dmaven.test.skip=true # 上传 scp target/etl-0.0.1-SNAPSHOT.war root@192.168.1.54:/root/ # 删除原日志 | 终止服务 | 启动服务 | 查看启动日志 ssh root@192.168.1.54 "rm etl. ps -ef | grep etl | awk '{print $2}' | xargs kill -9; nohup ./etl-0.0.1-SNAPSHOT.war & etl.log 2&&1 &; tail -f etl.log" ``` ### 配置IDE ``` Run / Edit Configurations... / "+" / Bash 1. Name 填写 2. Script 选择 update.sh 3. Working directory 选择 项目根目录 ```...
时代的潮流浩浩荡荡,上升到国家发展战略与基础设施的人工智能,正以不可思议的速度占据着我们生活的头条。如果说2017年宣告了人工智能接棒时代脉搏,那么2018年的人工智能将作为颠覆性变革力量迭代世界机器的运作。
### 新增Python3编译环境 ``` Tools & Build System & New Build System 将默认内容替换为: { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python" } 保存为 Python3.sublime-build ``` ### 选中Python3环境 ``` Tools & Build System & Python3 ``` ### 使用Python3编译运行 ``` Ctrl + b ``` ### 可能遇到的问题 ##### 问题 ``` UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) ``` ##### 原因 ``` 默认是ascii编码但是输出中包含中文 ``` ##### 解决 ``` Preferences & Browse Packages & Users & Python3.sublime-build 修改配置文件, 配置文件中新增一条 "env": {"LANG": "en_US.UTF-8"} 修改后如下: { "cmd": ["python3", "-u", "$file"], "file_regex": "^[ ]*File \"(...*?)\", line ([0-9]*)", "selector": "source.python", "env": {"LANG": "en_US.UTF-8"} } ```...
# django ``` # 刚写的就不复制粘贴了 https://my.oschina.net/tianshl/blog/1611257 # 列一下目录结构 root@tianshl:~# cd server/ root@tianshl:~/server# tree server server ├── db.sqlite3 ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` # gunicorn ##### 安装 ``` pip install gunicorn ``` ##### 配置 ``` # 修改django项目的settings.py INSTALLED_APPS = [ ...... 'gunicorn', ] ``` ##### 运行 ``` root@tianshl:~# cd /root/server/server/ root@tianshl:~/server/server# gunicorn --pythonpath /root/server/venv/bin/python3 -w 3 -b 0.0.0.0:80 server.wsgi # 测试能否正常运行, 然后ctrl+c结束进程 ``` # supervisor ##### 安装 ``` pip install supervisor ``` ##### 配置 ``` # 默认配置 # 使用echo_supervisord_conf命令查看默认配置 root@tianshl:~# echo_supervisord_conf # 自定义配置 root@tianshl:~# mkdir /etc/supervisor root@tianshl:~# mkdir /etc/supervisor/conf.d root@tianshl:~# echo_supervisord_conf & /etc/supervisor/supervisor.conf root@tianshl:~# vim /etc/su...
## 更新model #### 需求 ``` 概览表增加"创建时间,修改时间,软删除" ``` #### 以往的方式 ###### 1. 修改model.jh, 在实体 Overview 中增加三个属性 ``` /** * 数据概览 -- 概览 */ entity Overview { id Long, ... /* 以下属性为新增的属性 */ /* 创建时间 */ createTime ZonedDateTime, /* 更新时间 */ updateTime ZonedDateTime, /* 是否删除 */ delFlag Boolean, } ``` ###### 2. 生成配置文件 ``` jhipster import-jdl model.jh ``` ###### 3. 运行项目使配置生效 ``` 运行项目时提示"Validation Failed",原因是配置文件的MD5值不同, 此时需要以下操作 1. 修改 DATABASECHANGELOG 表中相关记录的 MD5SUM 2. 在overview表中手动新增三个属性. ``` #### 现在的方式 ###### 1. 修改model.h, 在实体 Overview 中增加三个属性 ###### 2. 生成配置文件 ###### 3. 修改生成的配置文件 ``` src/main/resources/config/liquibase/changelog/15_added_entity_Overview.xml 将 changeSet中新增的三个column提取至新的changeSet中, 如下: 注意: changeSet的id不能与之前的相同 ``` ###### 4. 运行项目使配置生效 ``` 不需要手动修改MySQL,自动生效 ```...
十分钟讲清楚区块链侧链技术
### 1.虚拟环境 ``` tianshl:workspace tianshl$ mkdir server tianshl:workspace tianshl$ cd server/ tianshl:server tianshl$ virtualenv venv --python=python3 tianshl:server tianshl$ source venv/bin/activate ``` ### 2. 安装依赖 ``` (venv) tianshl:server tianshl$ pip install django (venv) tianshl:server tianshl$ pip install djangorestframework ``` ### 3. 创建项目 ``` (venv) tianshl:server tianshl$ django-admin.py startproject server (venv) tianshl:server tianshl$ tree server/ server ├── manage.py └── server ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ``` ### 4. 更新配置 ``` (venv) tianshl:server tianshl$ cd server/ (venv) tianshl:server tianshl$ vim server/settings.py # 1.修改 INSTALLED_APPS = ( ... 'rest_framework', ) # 2.添加 REST_FRAMEWORK = { # Use Django's standard `django.contrib.auth` permissions, # or allow read-only access for unauthenticated users. 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly' ] }...
![Surface Studio](https://upload-images.jianshu.io/upload_images/a2c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) --- ## 概述 & 当下web服务端开发中最火的名词中绝对有**微服务**的一席之地,其也成为当下互联网后端服务架构演进历程中最闪亮的技术之一。微服务的基本思想在于考虑围绕着业务领域组件来创建应用,这些应用可独立地进行开发、管理和加速。在分散的组件中使用微服务云架构和平台,使部署、管理和服务功能交付变得更加简单。既然服务被分割和微小化了,我们很容易想到如果将其和docker结合,让docker承载着一个个的微服务运行,如此一来将会让服务间耦合度降低,部署简洁,同时系统的架构也更加清晰,便于长期演进,基于此想法有了这篇文章的入门实践! --- ## 创建基于maven的spring bt项目 - pom.xml中加依赖: ``` org.springframework.boot spring-boot-starter-parent 2.0.0.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test ``` - 我们只需要在启动类中添加一个简单的restful接口就行了,为了后续浏览器能验证一下,访问/hello接口,能向浏...
& 本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。 上一篇介绍了各种场景下的最佳实践,大部分场景可以使用「发后即忘」的模式,不需要响应,如果需要响应,可以使用RabbitMQ的RPC模型。 RabbitMQ以异步的方式解耦系统间的关系,调用者将业务请求发送到Rabbit服务器,就可以返回了,Rabbit会确保请求被正确处理,即使遇到网络异常、Rabbit服务器崩溃、整个机房断电等特殊场景,针对这些场景,Rabbit提供了各种机制确保其可用性。 本篇通过总结可能出现的特殊场景,对Rabbit提供的可用性保证进行分析,学习它的实现方式,你会了解到: * 总结异常场景 * 集群并处理失败 * 连接丢失和故障转移 * 主/备方式 * 跨机房复制 & **推广下我的个人公众号「情情说」,第一时间分享我的工作、学习和生活,如果对你有帮助,希望可以关注下。** ### 异常场景 在实际工作中,有很大一部分时间用在解决各种异常情况,比如针对用户输入的验证,JDK中提供的各种异常类,网络异常等,这些相对来说比较好解决。 Rabbit服务作为调用者和处理者的桥梁,至关重要,如果因为网络异常、单台服务器崩溃、机房瘫痪等原因导致Rabbit服务不可用,会影响所有依赖的业务系统。 ##### ...
遇见这个问题,是公司的小伙伴跟我说,每次使用mybatis的时候,简单的连表查询,用Map接收的时候,都是像DB定义的字段一样,类似以下 student_name,student_id,没有转换为驼峰,但是又不能因为这一个定义一个javabean来映射数据库字段集合,这样,会有无穷无尽的javabean,完全不是办法,然后我看了下mybatis-spring-boot的配置文档http://www.mybatis.org/spring-boot-starter/mybatis-spring-boot-autoconfigure/,发现有这么个属性
mybatis.configuration.map-underscore-to-camel-case=true 看着属性意思,很像是 map 下划线转换为驼峰,然后我天真的以为,加个这个,就会将Map里面的key转换为驼峰的命名方式,然后我自己测试了一下,发现自己还是太天真,没转过来,该是什么还是什么(心里面是B了狗了).... 没办法,接着找了了一下,发现官方文档http://www.mybatis.org/mybatis-3/configuration.html#properties,描述过这个的作用
才发现,这个属性的作用,是作用于javabean的field的,并不是map,ㄟ( ▔, ▔ )ㄏ,那没办法了,只能自己动手了
-------------------------------我是分割线-------------------------------------- 既然 map-underscore-to-camel-case 不能作用于map,那么...
& 本系列是「RabbitMQ实战:高效部署分布式消息队列」书籍的总结笔记。 [上一篇](https://my.oschina.net/qqtalk/blog/1793038) 介绍了AMQP消息通信,包括队列、交换器和绑定,通过虚拟主机还可以隔离数据和权限,消息持久化和发送方确认模式确保了消息不丢失。 本篇主要介绍如何运行和管理RabbitMQ,在介绍之前,会有个DEMO演示消息发送和接收,一方面对AMQP的元素有更直观的认识,一方面为后面介绍监控做数据来源。 通过介绍,你会了解到: * 消息发送和接收简单实现 * 服务器管理-启动和停止节点 * 权限配置 * 使用统计 ### 消息发送和接收简单实现 该Demo主要用于收集日志,消息发送者是各个应用子系统,消息接收者是日志收集服务,使用RabbitMQ可以很容易实现。 基于Spring Boot框架实现,主要类的作用如下: * LogRabbitConfig:创建队列、交换器、绑定等初始化操作; * Sender:消息发送者; * AllReceiver:所有级别日志接收者,接收所有级别的日志; * ErrorReceiver:错误级别日志接受者,只接收错误级别的日志; * LogSenderTest:测试用例类; 消息模型如下: ![Demo的消息模型](http://oc3r3rke2.bkt.clouddn.com/57.jpg?imageView2/2/w/400) ###...
背景 由于最近在整理session&cookie的一些原理https://my.oschina.net/qixiaobo025/blog?search=session 我们可以看到在cookie没有开启的情况下 servlet会通过传输sessionid来完成用户的标识~ 我们来考虑这个问题,服务端如何来判断客户端是否开启cookie了呢??? 问题 对于cookie是否禁用 在客户端的判断比较容易 但是在服务端来说基本不太现实。 我们可以判断cookie被启用 但是比较难以判断cookie是被禁用的。毕竟当客户端没有传入cookie 也有可能是客户端第一次访问而已。那么如何判断是否是cookie被禁用呢? 一个简单能思考到的方案如下: 客户端访问指定url 服务端设置cookie 设置重定向 客户端重定向到服务端 服务端检查客户端有没有携带cookie 携带cookie则认为cookie启用否则认为cookie被禁用 考虑下列场景 请求url上增加了;jsessionid的【注意不是QueryString而是url进行了重写】 可是carOwner项目都是移动端客户 莫非移动端客户都禁止了cookie??? 分析 当cookie被禁用了之后 那么为了记住用户的身份 必然需要在客户端向服务端进行请求的时候传递一些必要的信息 在cookie启用的场景下需要传递sessionId那么在cookie禁用的场景下呢?自然是通过传输sessionId s...
什么是微服务 首先微服务并没有一个官方的定义,想要直接描述微服务比较困难,我们可以通过对比传统WEB应用,来理解什么是微服务。 传统的WEB应用核心分为业务逻辑、适配器以及API或通过UI访问的WEB界面。业务逻辑定义业务流程、业务规则以及领域实体。适配器包括数据库访问组件、消息组件以及访问接口等。一个打车软件的架构图如下: 尽管也是遵循模块化开发,但最终它们会打包并部署为单体式应用。例如Java应用程序会被打包成WAR,部署在Tomcat或者Jetty上。 这种单体应用比较适合于小项目,优点是: 开发简单直接,集中式管理 基本不会重复开发 功能都在本地,没有分布式的管理开销和调用开销 当然它的缺点也十分明显,特别对于互联网公司来说: 开发效率低:所有的开发在一个项目改代码,递交代码相互等待,代码冲突不断 代码维护难:代码功能耦合在一起,新人不知道何从下手 部署不灵活:构建时间长,任何小修改必须重新构建整个项目,这个过程往往很长 稳定性不高:一个微不足道的小问题,可以导致整个应用挂掉 扩展性不够:无法满足高并发情况下的业务需求 所以,现在主流的设计一般会采用微服务架构。其思路不是开发一个巨大的单体式应用,而是将应用分解为小的、互...
Lombok 通过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的 java 代码。典型的是对于 POJO对象的简化(如自动帮我们生成Setter和Getter等),有了Lombok的加持,开发人员可以免去很多重复且臃肿的操作,**极大地提高java代码的信噪比**,因此我们必须尝试并应用起来
# 02:WebFlux 快速入门实践 ## Spring Boot 2.0 spring.io 官网有句醒目的话是: ``` BUILD ANYTHING WITH SPRING BOOT ``` Spring Boot (Boot 顾名思义,是引导的意思)框架是用于简化 Spring 应用从搭建到开发的过程。应用开箱即用,只要通过一个指令,包括命令行 `java -jar` 、`SpringApplication` 应用启动类 、 Spring Boot Maven 插件等,就可以启动应用了。另外,Spring Boot 强调只需要很少的配置文件,所以在开发生产级 Spring 应用中,让开发变得更加高效和简易。目前,Spring Boot 版本是 2.x 版本。Spring Boot 包括 WebFlux。 ![image](http://upload-images.jianshu.io/upload_images/adf?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## Spring Boot 2.0 WebFlux 了解 WebFlux ,首先了解下什么是 Reactive Streams。Reactive Streams 是 JVM 中面向流的库标准和规范: - 处理可能无限数量的元素 - 按顺序处理 - 组件之间异步传递 - 强制性非阻塞背压(Backpressure) **Backpressure(背压)** 背压是一种常用策略,使得发布者拥有无限制的缓冲区存储元素,用于确保发布者发布元素太快时,不会去压制订阅者。 **Reactive S...
# 从linux源码看socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情。 大部分高性能网络框架采用的是非阻塞模式。笔者这次就从linux源码的角度来阐述socket阻塞(block)和非阻塞(non_block)的区别。 本文源码均来自采用Linux-2.6.24内核版本。 ## 一个TCP非阻塞client端简单的例子 如果我们要产生一个非阻塞的socket,在C语言中如下代码所示: ``` // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM, 0); ... // 更改socket为nonblock fcntl(sock_fd, F_SETFL, fdflags | O_NONBLOCK); // connect .... while(1) { int recvlen = recv(sock_fd, recvbuf, RECV_BUF_SIZE) ; ...... } ... ``` 由于网络协议非常复杂,内核里面用到了大量的面向对象的技巧,所以我们从创建连接开始,一步一步追述到最后代码的调用点。 ### socket的创建 很明显,内核的第一步应该是通过AF\_INET、SOCK\_STREAM以及最后一个参数0定位到需要创建一个TCP的socket,如下图绿线所示: ![inet_family](https://static.oschina.net/uploads/img/95807_GSaV.png "inet_family") 我们跟踪源码调用 ``` socket(AF_INET, SOCK_STREAM,...
前言 声明,本文用得是jdk1.8 前面已经讲了Collection的总览和剖析List集合: Collection总览 List集合就这么简单【源码剖析】 原本我是打算继续将Collection下的Set集合的,结果看了源码发现:Set集合实际上就是HashMap来构建的!
所以,就先介绍Map集合、散列表和红黑树吧! 看这篇文章之前最好是有点数据结构的基础: Java实现单向链表 栈和队列就是这么简单 二叉树就这么简单
当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、Map介绍 1.1为什么需要Map 前面我们学习的Collection叫做集合,它可以快速查找现有的元素。 而Map在《Core Java》中称之为--&映射.. 映射的模型图是这样的:
那为什么我们需要这种数据存储结构呢???举个例子 作为学生来说,我们是根据学号来区分不同的学生。只要我们知道学号,就可以获取对应的学生信息。这就是Map映射的作用! 生活中还有很多这样的例子:只要你掏出身份证(key),那就可以证明是你自己(value) 1.2Map与Collection的区别
1.3Map的功能 下面我们来看看Map的源码:
简单常用的Map功能有这么一些:
下面用红色框框圈住的就是Map值得关注的子类:
```java @GetMapping("/download") public void download(HttpServletResponse response, @RequestParam String path) throws Exception { // 让servlet用UTF-8转码,默认为ISO8859 response.setCharacterEncoding("UTF-8"); File file = new File(path); if (!file.exists()) { // 让浏览器用UTF-8解析数据 response.setHeader("Content-type", "text/charset=UTF-8"); response.getWriter().write("文件不存在或已过期,请重新生成"); } String fileName = URLEncoder.encode(path.substring(path.lastIndexOf("/") + 1), "UTF-8"); response.setContentType("text/csv"); response.setHeader("Content-Disposition", String.format(" filename=\"%s\"", fileName)); InputStream is = OutputStream os = try { is = new FileInputStream(path); byte[] buffer = new byte[1024]; os = response.getOutputStream(); while((len = is.read(buffer)) & 0) { os.write(buffer,0, len); } }catch(Exception e) { throw new RuntimeException(e); }finally { try { if (is != null) is.close(); if (os != null) os.close(); } c...
在安卓开发中,页面跳转可以用Intent类来具体实现: Intent intent =new Intent(MainActivity.this,second.class);
startActivity(intent); 在安卓开发中页面传值有多种方法,常见的可以用intent、Bundle、自定义类、静态变量等等来传值,甚至可以用SharedPreferences来保存键值对等数据。 在Flutter中,页面跳转和传值也具有相应的方法,只不过方式更加符合目前的技术潮流标准。 具体的实现的是:final Map&String, WidgetBuilder&
根据Flutter的文档,routes的灵感来源于reactjs,routes可以翻译为路由,可以看到这种routes的思路在目前的设计中彼此借鉴,routes的思路不仅在前端流行,比如在vue、reactjs、Angular中用到,而且在后端应用中也非常成熟。 一:在flutter中实现页面的跳转的代码: import 'package:flutter/material.dart';
void main() {
runApp(new MaterialApp(
title: '页面跳转',
home: new FirstScreen(),
class FirstScreen extends StatelessWidget {
Widget build(BuildContext context) {
return new Scaffold(
appBar: new AppBar(
title: new Text('第一个页面'),
一 添加自定义监控项目 ========== zabbix很受欢迎的原因之一是:能够自定义监控项目,之前我们看到的很多的监控项目都是在模板里面提现的,但是当我们需要一些个性化的监控项目,比如某一个业务的监控数据 需求:监控某台web的80端口连接数,并出图 两步:1)zabbix监控中心创建监控项目;2)针对该监控项目以图形展现 1)创建监控项目 ---------- 1. 对于第一步,需要到客户端定义脚本 ,脚本的名字及位置可以自定义 vim /usr/local/sbin/estab.sh //内容如下 ``` #!/bin/bash ##获取80端口并发连接数,也就是查看80端口中处于ESTABLISHED状态的链接有多少个,一般正常的也不会超过100 netstat -ant |grep ':80 ' |grep -c ESTABLISHED ``` 1. 更改执行脚本的权限,主要为了授予zabbix用户执行这个脚本的权限 ``` # chmod 755 /usr/local/sbin/estab.sh ``` 1. 客户端上编辑配置文件 ``` # vim /etc/zabbix/zabbix_agentd.conf ``` 在配置文件中修改以下参数的值, ``` #表示使用自定义脚本,相当于开关,如果等于0,他就没办法使用脚本 UnsafeUserParameters=1 ``` 还要在配置文件中找到UserParameter参数,并设置自定义监控项下面的键值key为my.estab.count,后面的[*]...
fork()是做什么的请问man,fork()调用的返回值说明: 1. 在父进程中,fork返回新创建的子进程的pid; 2. 在子进程中,fork返回0; 3. 出错返回一个负值; 一个简单的测试: #include &iostream&
#include &unistd.h&
int main()
pid_t a1 = fork();
pid_t a2 = fork();
std::cout && "a1 = " && a1 && std::
std::cout && "a2 = " && a2 && std::
} 执行结果如下: a1 = 1397
a2 = 0 四种结果,是不是有点糊涂,让我们修改下程序更直观的看调用: #include &iostream&
#include &unistd.h&
int main()
pid_t a1 = fork();
pid_t a2 = fork();
std::cout && "{" && std::
std::cout && "\tpid = " && getpid() && std::
std::cout && "\tppid = " && getppid() && std::
std::cout && "\ta1 = " && a1 && std::
std::cout && "\ta2 = " && a2 && std::
std::cout && "}" && std::
wait(NULL);
} getpid()是获取当前进程的id,getppid()是获取父进程的id,'\t'是为了格式化输出,这回输出结果是: {
pid = 1...
## 安装Protobuf - 下载包,3.0+; - 解压包; - make; - make check; - make install; ## 构建模板 指定3.0+版本 ``` syntax = "proto3"; message gps_data { int64 id = 1; string terminalId = 2; string dataTime = 3; double lon = 4; double lat = 5; float speed = 6; int32 altitude = 7; int32 locType = 8; int32 gpsStatus = 9; float direction = 10; int32 satellite = 11; } ``` 生成protof文件: ``` protoc -I=src/main/resource/proto --java_out=src/main/java src/main/resource/proto/protobuf.proto ``` 引入依赖: ``` com.google.protobuf protobuf-java 3.5.0 ``` 如果使用json,引入依赖: ``` com.google.protobuf protobuf-java-util 3.5.0 ``` ## 构建对象并序列化放到redis ``` System.out.println("===== 构建一个GPS模型开始 ====="); Protobuf.gps_data.Builder gps_builder = Protobuf.gps_data.newBuilder(); gps_builder.setAltitude(1); gps_builder.setDataTime(" 16:21:44"); gps_builder.setGpsStatus(1); gps_builder.setLat(39.123); gps_builder.setLon(120.112); gps_builder.setDirection(30.2F); gps_builder....
#coding:utf-8
Gabor滤波器参数可视化
参考:https://blog.csdn.net/lhanchao/article/details/
import cv2
import numpy as np
import math
# λ(波长)变化
kernel1 = cv2.getGaborKernel((311,311),10,0,5,0.5,0)
kernel2 = cv2.getGaborKernel((311,311),10,0,10,0.5,0)
kernel3 = cv2.getGaborKernel((311,311),10,0,15,0.5,0)
kernel4 = cv2.getGaborKernel((311,311),10,0,20,0.5,0)
cv2.imshow("lambda: 5", kernel1)
cv2.imshow("lambda: 10", kernel2)
cv2.imshow("lambda: 15", kernel3)
cv2.imshow("lambda: 20", kernel4)
kernel1 = cv2.getGaborKernel((311, 311), 10, 0, 10, 0.5, 0)
kernel2 = cv2.getGaborKernel((311, 311), 10, math.pi * 0.25, 10, 0.5)
kernel3 = cv2.getGaborKernel((311, 311), 10, math.pi * 0.5, 10, 0.5, 0)
kernel4 = cv2.getGaborKernel((311, 311), 10, math.pi * 0.75, 10, 0.5, 0)
cv2.imshow("theta: 0", kernel1)
cv2.imshow("theta: 45", kernel2)
cv2.imshow("theta: 90", kernel3)
cv2.imshow("theta: 135", kernel4)
# ψ的变化
# σ的变化:
kernel1 = cv2.getGaborKernel((311,...
原本是想写一篇关于Java类加载机制的博文,后来发现这个主题有点大,其中涉及的细节点太多,一篇博文,三言两语恐怕无法讲明白,于是乎决定从整体到局部,先来谈谈类的生命周期,从整体把握一个类从“出生”到“凋亡”的过程,其中涉及了类加载、使用、卸载等各个阶段,有了整体的认知后,再深入细节并结合具体实例,探讨加载原理、类加载器等相关知识。今天就让博主带领你开启第一段旅程:类的生命周期详解。 # 类的生命周期 类的生命周期是指一个class从加载到内存直至卸载出内存的过程,共包含**加载**(Loading)、**验证**(Verification)、**准备**(Preparation)、**解析**(Resolution)、**初始化**(Initialization)、**使用**(Using)和**卸载**(Unloading)7个阶段,如下图所示: ![Java类的生命周期](https://static.oschina.net/uploads/img/35832_jTfM.png) 其中验证、准备、解析三个阶段统称为**连接**(Linking),而加载、连接、初始化又可以统称为**类加载的过程**,所以我们有时又可以称类的生命周期包含加载、连接、初始化、使用和卸载这5个阶段,或者是类加载、使用、卸载这3个阶段。 回到上图,加载、验证、准备、初始化和卸载这5个...
目前在JAVA的世界中,maven已经成为事实上的构建标准,很多开源库的管理构建也是基于maven的,maven本身的学习曲线比较陡峭,遵循“约定优于配置”的理念,maven存在很多约定。本次我先描述下,关于版本的定义的选择,SNAPSHOT or RELEASE? 版本之争 在maven的约定中,依赖的版本分为两类——SNAPSHOT和RELEASE。SNAPSHOT依赖泛指以-SNAPSHOT为结尾的版本号,例如1.0.1-SNAPSHOT。除此之外,所有非-SNAPSHOT结尾的版本号则都被认定为RELEASE版本,即正式版,虽然会有beta、rc之类说法,但是这些只是软件工程角度的测试版,对于maven而言,这些都是RELEASE版本。既然Maven提供了这两类版本号,那么他们之前的优劣势是什么?分别在什么场景下使用? 解读SNAPSHOT 同一个SNAPSHOT版本的依赖可以多次发布(deploy)到仓库中,也就是说同一个SNAPSHOT版本的依赖可以在仓库中存在多份,每一份都是代码在某一个特定时间的快照,这也是SNAPSHOT的含义。 如上图,很好地表达了SNAPSHOT的细节,也阐述了一个SNAPSHOT很重要观点——SNAPSHOT不是一个特定的版本,而是一系列的版本的集合,其中HEAD总是指向最新的快照,对外界可见的一般也是最新版,这种给人的假象是新的覆盖了老的,从...
搭建完jenkins,然后开始搞docker环境
我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=14ilrzyibc6u1
## 6.1 压缩打包介绍 1、常见压缩文件 ①windows下的.rar .zip .7z ②Linux下的 .zip .gz .bz2 .xz .tar.gz .tar.bz2 .tar.xz 家用带宽ip不固定,带宽为下载带宽 机房带宽ip固定,上传和下载都为一样的 ## 6.2 gzip压缩工具 gzip压缩工具 ``` find /etc/ -type f -name "*.conf" -exec cat {} && 1.txt \; gzip 1.txt压缩命令 gzip -d 1.txt.gz /unzip 1.txt.gz解压缩命令 gzip -# 1.txt #范围1-9 ,默认6,不能压缩目录,压缩级别数字越大压缩程度越大 zcat 1.txt.gz 查看压缩文件内容 gzip -c 1.txt & /root/1.txt.gz gzip -d -c /root/1.txt.gz &/tmp/1.txt gunzip -c /root/1.txt.gz & /tmp/1.txt file 1.txt ``` ## 6.3 bzip2压缩工具 ``` bzip2 1/txt /bzip2 -z 1.txt yum install -y bzip2 bzip2 -d 1.txt.bz2 bunzip2 1.txt.bz2 不支持压缩目录 bzip2 -c 1.txt & /tmp/1.txt.bz2 du -sh /tmp/1.txt.bz2 bzip2 -d -c 1.txt.bz2 & /tmp/1.txt bzip2 -9 1.txt 压缩级别 1-9 ,保持默认压缩级别为9,保持默认就可以 file 1.txt.bz2 bzcat 1.txt.bz2查看bz压缩文件内容 ``` ## 6.4 xz压缩工具 ``` xz 1.txt /xz -z 1.txt xz -d 1.txt.xz unxz 1.txt.xz xz -c 2.txt &/tmp...
JS类—— html5.js,让你的IE浏览器支持H5新特性:http://html5shiv.googlecode.com/svn/trunk/html5.js
(记得要注释判断哦) JQuery库百度在线CDN:http://libs.baidu.com/jquery/2.0.0/jquery.min.js bootstrap核心JS代码:https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js
bootstrap官方在线引用地址:https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css
11.14/11.15 Apache和PHP结合 11.16/11.17 Apache默认虚拟主机
声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Arrays: 介绍:数组的工具类,这个类主要是对我们的数组进行操作 数组排序 sort排序,数组从小到大排序,toString是打印的意思,binarySearch搜索,搜索78的下标在第几个,打印出来 如何做到从大到小排序,如下图,做个比较器,-1和1颠倒一下就变成从大到小来排序了 如下图:fill 覆盖,把里面的数据都覆盖成100 如下图:是比较跟截取,equals比较,比较内容是否一样,copyOf截取,截取前面5个打印出来 集合框架: 集合算法: 数组集合 链表集合 哈希集合 介绍:集合在java中代表着无限存储容器,它比数组厉害,数组是有限长度,申请为3个就是3个,你少用几个它也不会缩回来,不够了也是不能扩容,而集合就是在数组的基础上做了一个可伸缩的容器、无限扩展的容器,集合平时也是帮你们存数据的,就是比数组方便一些 数组集合: 原理: 假设下面图中的是集合容器,依次类推的往里面加数据,第一次存储A1进来,第二次不够存了就申请一个比上一个大1的数组出来,然后就把老数据导入到新数组之中,之后的数据就放到后面来,A1、A2加入...
近年来,机器学习和深度学习不断被炒热,tensorflow 作为谷歌发布的数值计算和神经网络的新框架也获得了诸多关注,spark和tensorflow深度学习框架的结合,使得tensorflow在现有的spark集群上就可以进行深度学习,而不需要为深度学习设置单独的

我要回帖

更多关于 mvn clean deploy 的文章

 

随机推荐