0FI_AA_12kettle 增量抽取mysql报错全量抽取不会报错。

## 由来 很多时候我们需要监听一个文件的变化或者目录的变动,包括文件的创建、修改、删除,以及目录下文件的创建、修改和删除,在JDK7前我们只能靠轮询方式遍历目录或者定时检查文件的修改事件,这样效率非常低,性能也很差。因此在JDK7中引入了`WatchService`。不过考虑到其API并不友好,于是Hutool便针对其做了简化封装,使监听更简单,也提供了更好的功能,这包括: - 支持多级目录的监听(WatchService只支持一级目录),可自定义监听目录深度 - 延迟合并触发支持(文件变动时可能触发多次modify,支持在某个时间范围内的多次修改事件合并为一个修改事件) - 简洁易懂的API方法,一个方法即可搞定监听,无需理解复杂的监听注册机制。 - 多观察者实现,可以根据业务实现多个`Watcher`来响应同一个事件(通过WatcherChain) ### WatchMonitor 在Hutool中,`WatchMonitor`主要针对JDK7中`WatchService`做了封装,针对文件和目录的变动(创建、更新、删除)做一个钩子,在`Watcher`中定义相应的逻辑来应对这些文件的变化。 ### 内部应用 在hutool-setting模块,使用WatchMonitor监测配置文件变化,然后自动load到内存中。WatchMonitor的使用可以避免轮询,以事件响应的方式...
归并排序就这么简单 从前面已经讲解了冒泡排序、选择排序、插入排序,快速排序了,本章主要讲解的是归并排序,希望大家看完能够理解并手写出归并排序快速排序的代码,然后就通过面试了!如果我写得有错误的地方也请大家在评论下指出。 归并排序的介绍 来源百度百科: 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 过程描述: 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素b[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个有序表取完,然后再将另一个有序表中剩余的元素复制到r中从下标k到下标t的单元。归并排序的算法我们通常用递归实现,先把待排序区间[s,t]以中点二分,接着把左边子区间排序,再把右边子区间排序,最后把左区间和右区间用一次归并操作合并成有序的区间[s,t]。 原理: 归并操作的工作原理如下: 第一步:申请空间...
详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
本文主要讲述了OpenStack中调度策略的一些常见使用方法,及测试和源码分析。
H2是Thomas Mueller提供的一个开源的、纯java实现的关系数据库。
作为新一轮科技革命的重要代表,人工智能已经成为当下科技领域最前沿的课题。
有时候因为场景需要,我们需要修改kubernetes节点的主机名,假设有三个节点分别是: host1,host2,host3,cni组件使用calico,需要将host1改为master。 在修改kubelet节点主机名的时候也需要修改calico服务中的主机名。具体步骤如下: 一.修改系统主机名 [root@host1 ~]# hostname master 二.修改kubelet节点主机名 修改kubelet启动参数--hostname-override=master 重启kubelet服务 [root@master ~]# systemctl restart kubelet 这时查看kubelet运行日志 [root@master ~]# journalctl -xe -u kubelet 会看到如下报错 Mar 23 13:15:27 master kubelet[13508]: E:27.320556
13508 kubelet_node_status.go:106] Unable to register node "master" with API server: nodes "master" is forbidden: node "host1" cannot modify node "master" 停止kubelet服务并删除当前节点 [root@master ~]# systemctl stop kubelet
[root@master ~]# kubectl delete node host1 删除kubelet.kubeconfig,kubelet.key,kubelet.crt,kubelet-client.key和kubelet-client.crt [root@master ~]# rm -f /etc/kubernetes/kubelet.kubeconfig
[root@master ~]# rm -f /etc/kubernetes/s...
由于经常在不同语言中切换,需要记录时间序列开发中常遇到实用写法,暂置于此,不断修改中。。。 常用的库 library(DMwR)
library(xts)
library(quantmod)
library(jsonlite)
library(RCurl) 查看变量的类型 class(theTS) 例如输出: [1] "xts" "zoo" 取时间序列的首尾时间 start(theTS)
例如输出: [1] " CST" end(theTS)
合并两个时间序列 rbind.zoo(currentTS,historyTS)
为了避免麻烦,需保证两个序列时间不重叠 改时间序列的列名
names(theTS) &- c("Open", "High","Low", "Close",
"Volume" ,
"Amount") 这个写法如此不同,左侧一般是变量,这里竟然是一个动作,R 语言有独到之处。 异常处理
tryCatch({
error=function(e){
Sys.sleep(3)
finally={}
) 从文件读数据
theData &- na.omit(read.table(theFileName,sep=",",header=F,fill=TRUE,fileEncoding ="gb18030"))
文件中数据,用","区分数据列,没有header 写入文件 write.zoo(theTS,theFile,sep=",",col.names=FALSE) 以,分隔字段,...
从上家公司离职已经快半年了,与蓝牙打了一年的交道,从小白一个到略知一二。最近在整理上一家公司做的一些项目,突发奇想,自己封装一个蓝牙库,方便以后的使用。
关于Maven的配置: 用过Maven的开发人员应该知道Maven可以通过配置 conf文件夹下面的settings.xml文件来修改maven下载的包,默认是下在c盘的用户文件夹下的.m2中,日积月累.m2会越来越庞大,自然会影响windows的响应,所以一般我们都会将其移动到其他非系统盘下。具体是修改下面这段配置: 默认是:
&!-- localRepository
| The path to the local repository maven will use to store artifacts.
| Default: ${user.home}/.m2/repository
&localRepository&/path/to/local/repo&/localRepository&
--& 修改后: &localRepository&D:/Maven/.m2/repo&/localRepository& 这样就将下载的包下到D盘下的.m2中。 这里在补充一个很好的maven的远程地址即阿里云maven地址。 后来发现了 国内maven的救星【阿里云maven】真是由衷的感谢啊!具体配置如下,同样是操作conf下面的settings.xml文件: 将原有被注释了的那段&mirrors&找到并全部替换成下面这样: &mirrors&
&id&alimaven&/id&
&name&aliyun maven&/name&
&url&http://maven.aliyun.com/nexus/content/groups/public/&/url&
&mirrorOf&central&/mirrorOf&
我发了一篇文章《没用过Node.js,就别瞎逼逼》是因为有人在知乎上黑Node.js。那篇文章的反响还是相当不错的,甚至连著名的hax贺老都很认同,下班时读那篇文章,竟然坐车的还坐过站了。大家可以很明显的感到Node.js的普及度还不够,还存很多误解。甚至说很多小白用户也得不到很好的学习。大神都功成身退,书也跟不上,大部分都是2013年左右的,Node.js版本都是基于v0.10左右的,现在已经v9了。想想也是有点可惜,使用如此广泛的Node.js被大家默认,却没人来科普。 反思之后,我就想准备一个科普的Live,于是就有了《狼叔:如何正确学习 Node.js?》,相信能够对很多喜欢Node.js的朋友有所帮助。Live已完成目前1200多人,230人评价,平均4.8+,还算是一个比较成功的Live。现整理出来,希望对更多朋友有用。 - 感谢 [@justjavac](https://my.oschina.net/justjavac) 大神的[ 免费的计算机编程类中文书籍](https://github.com/justjavac/free-programming-books-zh_CN/#%E7%BD%AE%E9%A1%B6) 收录并推荐 - [github地址,以后在仓库里更新](https://github.com/i5ting/How-to-learn-node-correctly) - [Live地址,声音版](https://www.zhihu.com/lives/9286875...
& 原文: 容器中数据持久化主要有两种方式: * 数据卷(Data Volumes) * 数据卷容器(Data Volumes Dontainers) ## 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录,可以绕过UFS(Unix File System)。 * 数据卷可以在容器之间共享和重用 * 对数据卷的修改会立马生效 * 对数据卷的更新,不会影响镜像 * 数据卷默认会一直存在,即使容器被删除 * 一个容器可以挂载多个数据卷 **注意**:数据卷的使用,类似于 Linux 下对目录或文件进行 mount。 ### 创建数据卷 示例: ```shell docker run --name nginx-data -v /mydir nginx ``` 执行如下命令即可查看容器构造的详情: ```Shell docker inspect 容器ID ``` 由测试可知: * Docker会自动生成一个目录作为挂载的目录。 * **即使容器被删除,宿主机中的目录也不会被删除。** ### 删除数据卷 数据卷是被设计来持久化数据的,因此,删除容器并不会删除数据卷。如果想要在删除容器时同时删除数据卷,可使用如下命令: ```shell docker rm -v 容器ID ``` 这样既可在删除容器的同时也将数据卷删除。 ### 挂载宿主机目录作为数据卷 ```shell docker run --name nginx-data2 -v /host-dir:/container-dir nginx ``` 这样既可...
一、前言 最近有点想弄一个站内搜索的功能,之前学过了Lucene,后来又听过Solr这个名词。接着在了解全文搜索的时候就发现了Elasticsearch这个,他也是以Lucene为基础的。 我去搜了几篇Elasticsearch教程,发现很多都是基于linux的,但我linux耍得并不熟,很少用。仅仅会一些简单的命令,等真正去用到linux的时候再慢慢啃吧。 于是发现了一篇写得很好的教程: blog.csdn.net/laoyang360/… 首先是对Elasticsearch的安装,上面那篇教程也有说,并且给出了一键安装的脚本。这里就用来记录我个人的安装历程吧。 PS:日18:58:12更新:这里我已经不建议在Windows下装Elasticsearch了,因为装起来还是麻烦,也有一堆的小问题~(后面也有在Linux下配置Elasticsearch的过程,建议用linux环境下学习Elasticsearch(要是学生建议去买个服务器,有优惠的),实在不想出钱,用虚拟机也行~ 二、Windows下安装Elasticsearch(不建议) 2.1安装Elasticsearch 安装Elasticsearch以window服务的方式来运行,它的给出的版本是2.3.3。于是我也去安装2.3.3了。 在官网上可以在搜索框中查找对应的版本
要以windows服务的方式运行,教程给出的链接已经挂了。我搜到了一篇 www.cnblogs....
在前端中,视图层和数据层需要进行单向或者双向数据绑定,大家都已经不陌生了,有时候 2D 做的比较顺了之后,就会想要挑战一下 3D,不然总觉得痒痒的。这个 3D 机架的 Demo 我觉得非常有代表性,首先,3D 机架用途非常广,尤其是在电信行业,就算不是机架,在比如工业方面 3D 模型以及数据绑定的应用也是非常广泛的,毕竟现在工业物联网已经是大趋势了。
存在即合理,每一项新技术的出现都有它存在的道理,学习新技术个人觉得首先就应该搞懂它的来龙去脉、历史渊源,因为业务才决定了技术,应对应地根据不同业务进行技术选型,而不是一味追随大公司的解决方案,为了技术而技术。 从小型的几个人访问的网站到数亿用户访问的大系统,采用的技术、架构也必然需要对应地改变,以下本人根据《大型网站技术架构-核心原理与案例分析》一书的读书心得来介绍大型网站架构演进。 大型网站软件系统的特点
特别需要关注的有以下4点: 高并发,大流量。需要面对高并发用户,大流量访问。 高可用。系统无间断地提供服务,不能出现宕机。 海量数据。需要使用大量服务器存储、管理数据。 安全环境恶劣。需高度注意黑客攻击问题。 大型网站架构演化发展历程
以下按业务规模的从小到大的10个阶段分别介绍对应采用的技术架构: 1.初始阶段
开发一个小型网站,只需一台服务器即可,服务器上只需部署应用服务器、数据库服务器,然后部署应用即可访问。架构图如下: 2.应用服务和数据服务分离
当应用系统的业务规模较大时,出于对应用的性能、数据库存储空间的考虑,这时候需要考...
自己编写的jar,想要通过maven方式进行分发必须发布到maven仓库。如果没有自己的私服,我们可以使用折中的办法来实现。 maven客户端从maven仓库拉取构件时,实际上就是通过http协议去拉取对应仓库地址上的,对应目录中的metadata文件,查询需要的版本,就可以找到jar文件,下载到本机仓库。从而完成了依赖构件的拉取。 就是说,我们可以使用任何http服务器,按照一定的目录结构部署构件,从而当做一个私服来使用。 http服务器也没有?那好吧,悄悄告诉你,几乎所有的git服务都支持直接通过http访问指定文件的功能。(web界面中的Raw按钮点击就会跳到这个地址) 本文以国内最流行(~~红薯看到一定笑的很开心~~)的git服务——[码云](https://gitee.com) 为例,演示如何创建自己的私服。 ### 创建仓库 首先登录码云,创建项目: ``` 名称: mvnrepo 是否公开:公开 ``` 其他随意填写,然后点“创建”按钮完成创建。 必须公开,否则maven无法使用它作为仓库。 那么你的项目路径应该是:https://gitee.com/{你的域名}/mvnrepo 比如我的仓库地址是:https://gitee.com/pollyduan/mvnrepo.git ### 拉取仓库到本机 首先明确这个git项目拉取到本机的位置,记住,有用。比如我拉取到 ...
Fragment 页面切换更新问题
1.Lamp环境准备
2.下载支持中文的Sphinx ---& coreseek
3.安装环境
m4,gcc,gcc-c++,automake,libtool
4.安装中文分词组件mmseg
##安装mmseg
$ cd mmseg-3.2.14
$ ./bootstrap
#输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/mmseg3
$ make && make install
5.安装coreseek前准备
依赖mysql及依赖库
mysql-server
mysql-devel
6.安装coreseek
$ cd csft-3.2.14 或者 cd csft-4.0.1 或者 cd csft-4.1
$ sh buildconf.sh
#输出的warning信息可以忽略,如果出现error则需要解决
$ ./configure --prefix=/usr/local/coreseek
--without-unixodbc --with-mmseg --with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ --with-mmseg-libs=/usr/local/mmseg3/lib/ --with-mysql
$ make && make ins tall 配置 # # Minimal Sphinx configuration sample (clean, simple, functional) # source...
spring cloud实现可靠消息一致性
mac 使用Karabiner配置键盘映射,可以方便快捷很多,比如打开软件,切换窗口,快捷操作
html-webpack-plugin插件有许多属性可以设置,可以自行百度查看; 这里主要是使用chunks属性来配置,用 chunksSortMode: 'manual',属性来使得引入文件根据chunks的排序顺序引入
shell入门的文章,对shell不太熟悉小伙伴可以看看
EXcel,图片删除,超链接提取,VBA函数
因为去年和今年的两个项目都用到了js定时器做轮询请求的情况,这篇博客记录下项目中用到的场景和出现过的问题
2018全球人工智能技术大会(GAITC)将在5月19日-20日的北京国家会议中心举办,本次大会由中国人工智能学会领衔,李德毅、姚期智等院士担任大会主席,包括微软、京东、搜狗、Skype等企业的众多国际一流人工智能专家也会亲临现场!
前言 声明,本文使用的是JDK1.8 从今天开始正式去学习Java基础中最重要的东西---&集合 无论在开发中,在面试中这个知识点都是非常非常重要的,因此,我在此花费的时间也是很多,得参阅挺多的资料,下面未必就做到日更了... 当然了,如果讲得有错的地方还请大家多多包涵并不吝在评论去指正~ 一、集合(Collection)介绍 1.1为什么需要Collection Java是一门面向对象的语言,就免不了处理对象 为了方便操作多个对象,那么我们就得把这多个对象存储起来 想要存储多个对象(变量),很容易就能想到一个容器 常用的容器我们知道有--&StringBuffered,数组(虽然有对象数组,但是数组的长度是不可变的!) 所以,Java就为我们提供了集合(Collection)~ 1.2数组和集合的区别 接下来,我们可以对数组和集合的区别来分析一下: 数组和集合的区别: 1:长度的区别 数组的长度固定 集合的长度可变 2:内容不容 数组存储的是同一种类型的元素 集合可以存储不同类型的元素(但是一般我们不这样干..) 3:元素的数据类型 数组可以存储基本数据类型,也可以存储引用类型 集合只能存储引用类型(你存储的是简单的int,它会自动装箱成Integer) 1.3Collection的由来与功能 Collection的由来: 集合可以存储多...
陪产假结束了,今天又开始正常上班了,正好赶上米粉节活动,又要忙上一阵了,米粉节活动时间为4.03 - 4.10,有不少优惠,感兴趣的可以关注mi.com或小米商城app。 今天给大家送了福利:小爱音箱F码,据说卖的比较好,不太好抢到,借着这次公司福利,分享给大家,以表大家的支持和鼓励。 掘金的运营真的很贴心,主动找到我说:我的福利文章不是技术型文章,不能推送到信息流,只能在个人主页看到,为了让更多的人参与这次抽取,建议写一篇技术文章,末尾加上送福利的内容。再次感谢掘金运营小哥「刺客」的贴心和建议。 RabbitMQ实战的后续章节还没来得及看,这篇就总结下之前在项目组分享过的技术点:Netty事件监听和处理。 通过介绍,你会了解到: * 事件监听、NIO、线程模型等相关概念; * Netty总体结构; * 事件监听和处理; * 项目实践总结; 本篇先介绍下前两节,下一篇介绍后两节。 本篇最后会说明下福利的抽取规则,大家积极参与 &_& #### 相关概念 Netty是一个NIO框架,它将IO通道的建立、可读、可写等状态变化,抽象成事件,以责任链的方式进行传递,可以在处理链上插入自定义的Handler,对感兴趣的事件进行监听和处理。 所以,先介绍下事件监听、责任链模型、soc...
初探 Nuxt.js 秘密花园
## 前言 & 鸟菜啊真是一个菜鸟,写该系列的第一节,也就这节。心里十分虚。应为鸟菜啊深入接触的只有高级语言。汇编语言只会简简单单玩了下,机械语言就更不用说了,只是在网络上看过,也只是看过,而且还不懂。但是为了给大家能深入理解计算及语言,找了很多资料,懂了点,厚着脸皮写。有不足之处,欢迎之处 计算机语言很多,按照发展来分类的话分为 机械语言,汇编语言,高级语言。本节解析这三个语言与计算机语言。这个是隐节。主要是为了第三节,做的铺垫。 & 现在鸟菜需要实现一个网络库 ## 机械语言 & 当计算机被创造出来的时候,机械语言就诞生了。读过计算机相关专业的人,接触过编程的人,长期接触网络等计算机方面的人。都会知道机械语言就是0与1组合成的。0与1是硬件最容易识别的状态。所以机械语言也被称职硬件语言。那机械语言到底是什么了,就是一种指令集的体系。 #### 什么是指令与指令集 ##### 深入理解 加法指令。 分析 1+ 2=? 大家会说这有什么分析的。不就是 & 一加二等于几吗? 这句解释是错误的。是因为一加一更加适合和方便人类思维与识别能力,并不是按照逻辑方式得出的答案。按照逻辑是 & 一 与 二 相加 等于 计算机不是人类,不会按照人类的逻辑...
框架永远不要停留在使用的阶段,阿里代码规约是目的是码出质量码出高效,码是一个动作,需要实际,就我个人而言,无“码”不欢,如果现在给高中生一个demo,他们也能写出一个RPC框架调用的业务实现。这就是为什么要读源(高)码(薪)。
探究dubbo如下核心:PRC实现原理、PRC从发出请求到收到返回结果这整个过程的详细过程、PRC的负载均衡原理、服务暴露、服务发现的原理以及实现细节、多线程中dubbo是如何做到将返回结果和每个线程一一对应的,事后多想想如何设计一个优秀的RPC业务流程。
上次服务注册是基于API实现的,这次服务发现是基于spring容器实现的。Spring容器会将ReferenceConfig转为ReferenceBean, 从注册中心获取服务者信息,代码思路跟服务注册一致。
消费者订阅在注册中心订阅服务者信息。默认使用的FailbackRegistry实现,其中retry是后台的一个定时任务。RegistryProtocol.doRefer中涉及到了zookeeper订阅和cluster集群容错。
完成了invoker对象的转换,invoker对象包含了服务方的url和消费者的url,路由规则接着就是创建动态代理对象(动态代理对象的创建有jdk,cglib,jav...
此文讨论如何停止打断性的宣传,而通过社交媒体管理、推荐引擎以及自然语言生成软件把宣传融入兴趣点。
Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录 下或者类路径下的/config下,一般我们放到resources下。 1、修改tomcat的端口为8088 ![输入图片说明](https://static.oschina.net/uploads/img/21733_mB9v.png "在这里输入图片标题") 启动后 ![输入图片说明](https://static.oschina.net/uploads/img/22007_tyGi.png "在这里输入图片标题") 重新启动看效果 2、修改DispatcherServlet Spring boot 2.x 由原来的server.servlet-path 改为server.servlet.path 但是测试发现无效。不知道为啥 to be continue。。。
一 使用 Xtrabackup 在线对MySQL做主从复制[参考来源](http://seanlook.com//mysql-replicas/) ============== mysqldump适用于10G以下的数据导出,也很快,当数据在100G-500G时,就需要用到Percona-Xtrabackup备份工具,它可以实现MySQL在线热备数据,可进行全量、增量、单表备份和还原 ### XtraBackup优势 : 1. 无需停止数据库进行InnoDB热备 1. 增量备份MySQL 1. 流压缩到传输到其它服务器 1. 能比较容易地创建主从同步 1. 备份MySQL时不会增大服务器负载 ### 使用场景: 实现读写分离,减轻主库负载或数据分析,为了数据安全,做备份恢复,主从切换做高可用;如果读操作压力特别大,还可以做一主多从,而且不同的slave可以扮演不同的角色;还有一种级联复制,即 A-&B-&C ;主主复制,其中一个主库强制设置为只读,主从切换后架构依然是可用的 复制过程是slave主动向master拉取,而不是master去推的,所以理想情况下做搭建主从时不需要master做出任何改变甚至停服,slave失败也不影响主库 二 Mysql主从复制常见故障及解决方法[参考来源](http://www.10tiao.com/html/706/.html) ======== 原理就是通过将Mysql主库的sql语句复制到从库上,并...
Java的优雅停机通常通过注册JDK的ShutdownHook来实现,当系统接收到退出指令后,首先标记系统处于退出状态,不再接收新的消息,然后将积压的消息处理完,最后调用资源回收接口将资源销毁,最后各线程退出执行。 通常优雅退出需要有超时控制机制,例如30S,如果到达超时时间仍然没有完成退出前的资源回收等操作,则由停机脚本直接调用kill -9 pid,强制退出。
服务注册与发现使用:eureka, 服务提供方是用spring boot + jersay 构建的微服务架构,服务方法消费类型为@Consumes(MediaType.APPLICATION_FORM_URLENCODED)。参数接收使用@BeanParam 注解的javabean. 调用方:spring boot+jersay
& 在使用UUID作为数据库主键时,当数据量达到一定数量的时候(上亿条),性能比序列差很很明显。为了提升性能,可以考虑把UUID的长度降低(数据库本身有字节存储UUID类型的可以无视)。 & 经研究,发现JDK自带的UUID类中toString方法其实是把128位字节转换为16进制数值,这里考虑使用62进制,既0-9a-zA-Z,为此,专门编写了一个UUID字符串生成法。 首先,需要一个将long型值转换为62进制的工具类,代码如下: ``` public class Numbers { final static char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; final static Map digitMap = new HashMap(); static { for (int i = 0; i & digits. i++) { digitMap.put(digits[i], (int) i); } } /** * 支持的最大进制数 */ public static final int MAX_RADIX = digits. /** * 支持的最小进制数 */ public static...
默认情况下,SpringApplication会将所有命令行配置参数(以'--'开头,比如--server.port=9000)转化成一个property,并将其添加到Spring Environment中,命令行属性总是优先于其他属性源。 如果不想将命令行属性添加到Environment,你可以使用SpringApplication.setAddCommandLineProperties(false)来禁用它们。
如果不喜欢将application.properties作为配置文件名,你可以通过指定spring.config.name环境属性来切换其他的名称,也可以使用spring.config.location环境属性引用一个明确的路径(目录位置或文件路径列表以逗号分割)。 $ java -jar myproject.jar --spring.config.name=myproject
$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
转载自: IntelliJ IDEA Tomcat配置 详解 1& 进入 Edit Configurations
2& 点击 + ,选择 Tomcat 服务器,如果是本地Tomcat 选择 Local
3& Tomcat Server -& Unnamed -& Server -& Application server 的 Configuration ,找到本地 Tomcat 服务器,再点击 OK按钮
1 所示,我们可以切换随时为项目切换不同的容器
2 所示,我们可以指定给运行的容器设置 VM 参数
3 所示,这分别是在两种命令下的触发的事件。这个是 IntelliJ IDEA 特有的,也是重点 On Update action 当我们按 Ctrl + F10 进行容器更新的时候,可以根据我们配置的这个事件内容进行容器更新。其中我选择的 Update classes and resources 事件是最常用的,表示我们在按 Ctrl + F10 进行容器更新的时候,我们触发更新编译的类和资源文件到容器中。在 Debug 模式下,这个也就是所谓的 HotSwap。这是这种热部署没有 JRebel 插件那样好用 On frame deactivation 当我们切换 IntelliJ IDEA 到浏览器的时候进行指定事件更新,这个一般是因为 Web 开发的时候,我们需要经常在 IntelliJ IDEA 和各个浏览器之间来回切换测试,所以才有了这种需求。IntelliJ IDEA 是为了帮我们在做这种无聊切换的时...
第一部分:
对于参加工作一年以内的同学。恭喜你,这个时候,你已经拥有了一份Java的工作。这个阶段是你成长极快的阶段,而且你可能会经常加班。但是加班不代表你就可以松懈了,永远记得我说的那句话,从你入行那一刻起,你就要不停的学习。在这一年里,你至少需要看完《Java编程思想》这本书。这本书的内容是帮助你对于Java有一个更加深入的了解,是Java基础的升级版。这本书很厚,当初看这本书,我花了整整三个月。正常速度的话,应该可以在半年左右看完。我这里不要求过高,只要你在一年以内把这本书看完即可。当然了,我所说的看完,是充分吸收,而不是读一遍就完事了,因此有些内容你可能会看不止一遍。总而言之,这个阶段的核心学习思想就是,在工作中实践,并且更加深入的了解Java基础。
第二部分: 对于参加工作1年到2年的同学。这部分时间段的同学,已经对Java有了一个更加深入的了解。但是对于面向对象的体会可能还不够深刻,编程的时候还停留在完成功能的层次,很少会去考虑设计的问题。于是这个时候,设计模式就来了。我当时看的是《大话设计模式》这本书,并且写了完整版的设计模式博客。因此,我要求大家,最多在你工作一年的时候,必须开始写博客,而...
Openstack是把大机器虚拟成很多小机器从而达到大的分成小的来用,大大提高资源使用率。 Hadoop是把小机器合起来用,用于解决单台大机器无法解决的计算和存储等问题。
转载自:https://www.cnblogs.com/zhangguangju/p/7027904.html 这两个选项的设置,依赖于 项目的部署方式 是 exploded exploded 是 在idea tomcat 的配置中选择 artifacts 时的不同模式。 一种是war,另一种是war exploded. 这两种的区别可以参考这里(https://my.oschina.net/zjllovecode/blog/1789497)
下面具体说On Upate Action 与 On Frame Deactivation的区别 1、on update action 首先来看 on update action 相关的解释,从字面上理解 就是 手工触发 update 动作的时候 做什么:
update resources ---- 更新静态的资源,比如html,js,css等 运行模式和调试模式都是立即生效。
update classes and resources ---- 更新java,jsp和静态资源 ( 1. java 修改后,会被编译成.class 然后覆盖到target/kao文件夹下,IDE调试模式的情况下,立即生效。IDE运行模式下,不立即生效,需要redeployed才可生效。
2. jsp修改后,再次被访问的时候,会自动更新,重新编译成.java----&.class 保存在tomcat的work目录下。由于是访问时才检测是否修改,是否需要重新编译,所以 IDE 运行模式 和 IDE调试模式下,都是立即生效。刷新下页面就可);
redeployed ---...
详细解读阿里巴巴开源技术,包括框架、组件、引擎、数据库/存储、平台/系统、解决方案、工具、中间件、Web Sever、设计等十大类73款!
1、背景 前几天新同学入职,一不小心将跳板机上的 crontab 清空了,导致凌晨一大批任务异常,同事问了运维同学也没有备份,这一百多个任务要是恢复起来可不是件容易的事儿。还好我去年某天开始做了定时备份,每分钟一次 backup 到本地磁盘,最后很容易的将 crontab 给恢复了。 这件事情过后我也在想,一台跳板机整个部门都共用一个账号, Linux 水平和安全意识又参差不齐,其实很难避免以后还会误操作,比如一下子将 home 目录全干掉。所以我想 backup 最好不要保存在本地,于是想一条命令将其备份到 hadoop 集群上去。 2、问题 当时觉得这个问题很简单,于是随手写了一条类似这样的命令: */1 * * * *
/bin/cat &(seq 10) && /root/a.log 2&&1 本地测试了没问题,但是 crontab 怎么都不成功,也看不到错误日志,a.log 一直是空的。 这个我就比较好奇了,按理说 a.log 应该是能拿到所有的标准输出和标准错误的,究竟什么原因导致 crontab 既不执行又不报错呢? 3、分析 debug 终极大法还是得看日志,本 case 最让人疑惑的在于没有日志,如果能找到日志所有的迷雾应该都能烟消云散。 于是,我尝试看看 /var/log 下有没有 crontab 的执行日志,看了...
Session,强制下线
只需三步即可部署开源项目云收藏,打造专属个人的收藏系统,就是这么简单! 云收藏项目已经开源2年多了,作为当初刚开始学习 Spring Boot 的练手项目,使用了很多当时很新的技术,现在看来其实很多新技术是没有必要使用的,但做为学习案例来讲确实是一个绝佳的 Spring Boot 实践。 从开源到现在,写了一些教程给大家介绍如何部署云收藏,如何在IDE中运行云收藏,但是仍然有很多的朋友不知道如何使用,如何部署?就像“请提供一份云收藏数据结构” 这样的问题我至少都回答了一百多次,并且在 github 关闭了近十个类似的问题。 这也从另外一个方面可以看出,部署云收藏项目对一些朋友还是比较复杂,现在有了 Docker 我们就可以愉快的解决这个问题,只需三步就可以部署云收藏项目,打造专属个人的收藏系统。 ## [云收藏](https://github.com/cloudfavorites/favorites-web) 一些朋友可能还不了解[云收藏](http://favorites.ren),给大家简单介绍一下: 云收藏是一个使用 Spring Boot 构建的开源网站,可以让用户在线随时随地收藏的一个网站,在网站上分类整理收藏的网站或者文章,可以作为稍后阅读的一个临时存放。作为一个开放开源的软件,可以让用户从浏览器将收藏夹内容导入...
## 更新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,自动生效 ```...
### 新增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"} } ```...
### 需求 ``` 对MySQL数据库中某个表的某个字段执行k-means算法,将处理后的数据写入新表中。 ``` ### 源码及驱动 ``` http://download.csdn.net/download/xiaobuding007/ ``` ### 源码 ```java import java.sql.*; import java.util.*; /** * @author tianshl * @version
上午11:13 */ public class Kmeans { // 源数据 private List origins = new ArrayList&&(); // 分组数据 private Map& // 初始质心列表 private L // 数据源 private String tableN private String colN /** * 构造方法 * * @param tableName 源数据表名称 * @param colName 源数据列名称 * @param cores 质心列表 */ private Kmeans(String tableName, String colName,List cores){ this.cores = this.tableName = tableN this.colName = colN } /** * 重新计算质心 * * @return 新的质心列表 */ private List newCores(){ List newCores = new ArrayList&&(); for(List v: grouped.values()){ newCores.add(v.stream().reduce(0, (sum, num) -& sum + num) / (v.size() + 0.0)); } Collections.sort(newCores); return newC } /...
### ElasticSearch ``` 现有三台服务器[192.168.1.30, 192.168.1.31, 192.168.1.32],使用这三台服务器搭建ElasticSearch集群 ``` #### CentOS 使用 yum 安装 ###### 编辑 repo ``` vim /etc/yum.repos.d/elasticsearch.repo # 内容如下 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` ###### 使用yum安装 ``` yum install elasticsearch ``` ###### 创建用户 ``` useradd elastic ``` ###### 修改权限 ``` # 数据 chown -R elastic:elastic /var/lib/elasticsearch # 日志 chown -R elastic:elastic /var/log/elasticsearch # 配置 chown -R elastic:elastic /etc/elasticsearch chown -R elastic:elastic /etc/sysconfig/elasticsearch # 指令 chown -R elastic:elastic /usr/share/elasticsearch ``` ###### 配置 ``` # 主节点 192.168.1.30 vim /etc/elasticsearch/elasticsearch.yml # 修改以下几项 cluster.name: etl_es node.name: node-30 node.master: true node.d...
![这里写图片描述](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失效, 重新请求一下登录接口即可...
### Logstash ##### 使用yum安装 ###### 编辑 repo ``` vim /etc/yum.repos.d/elasticsearch.repo # 内容如下 [elasticsearch-6.x] name=Elasticsearch repository for 6.x packages baseurl=https://artifacts.elastic.co/packages/6.x/yum gpgcheck=1 gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch enabled=1 autorefresh=1 type=rpm-md ``` ###### 安装 ``` sudo yum install logstash ``` #### 配置 Logstash ``` # 参考 https://www.elastic.co/guide/en/logstash/current/configuration-file-structure.html # input项配置源数据,此处为监听 "/log"目录下满足"insert.*.log"匹配的所有日志文件 # filter项过滤input输入的数据, "insert.*.log"中每条日志形式如:" | type | cid | src | eventId | reason", 所以使用" | "拆分每条日志 # output项是输出数据,此处为输出至ElasticSearch # 新建配置文件 insert.conf vim conf.d/insert.conf # 内容如下 input { file { path =& "/log/insert.*.log" } } filter { mutate{ split=&["message"," | "] add_field =& { "date" =& "%{[message][0]}" } add_field =& { "type" =& "%{[message][1]...
### 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' ] }...
### 写在开头 ``` 使用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 选择 项目根目录 ```...
# 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...
我想说的就是今天我所说的可能一切都是错的,大家通过不停的学习、练习和总结, 形成自己的一套架构设计原则和方法
索引对大数据的查询速度的提升是非常大的,Explain可以帮你分析SQL语句是否用到相关索引。
![](https://ws3.sinaimg.cn/large/006tKfTcgy1fpvathnbf6j31kw11xwl3.jpg) ## 前言 分布式锁在分布式应用中应用广泛,想要搞懂一个新事物首先得了解它的由来,这样才能更加的理解甚至可以举一反三。 首先谈到分布式锁自然也就联想到分布式应用。 在我们将应用拆分为分布式应用之前的单机系统中,对一些并发场景读取公共资源时如扣库存,卖车票之类的需求可以简单的使用[同步](http://crossoverjie.top//Synchronize/)或者是[加锁](http://crossoverjie.top//ReentrantLock/)就可以实现。 但是应用分布式了之后系统由以前的单进程多线程的程序变为了多进程多线程,这时使用以上的解决方案明显就不够了。 因此业界常用的解决方案通常是借助于一个第三方组件并利用它自身的排他性来达到多进程的互斥。如: - 基于 DB 的唯一索引。 - 基于 ZK 的临时有序节点。 - 基于 Redis 的 `NX EX` 参数。 这里主要基于 Redis 进行讨论。 ## 实现 既然是选用了 Redis,那么它就得具有排他性才行。同时它最好也有锁的一些基本特性: - 高性能(加、解锁时高性能) - 可以使用阻塞锁与非阻塞锁。 - 不能出现死锁。 - 可用性(不能出现节点 down 掉后加锁失败)。 这里利用 ...
& 在之前的Spring Boot基础教程系列中,已经通过[《Spring Boot中使用@Async实现异步调用》](http://blog.didispace.com/springbootasync/)一文介绍过如何使用`@Async`注解来实现异步调用了。但是,对于这些异步执行的控制是我们保障自身应用健康的基本技能。本文我们就来学习一下,如果通过自定义线程池的方式来控制异步调用的并发。 本文中的例子我们可以在之前的[例子](https://github.com/dyc87112/SpringBoot-Learning/tree/master/Chapter4-1-2)基础上修改,也可以创建一个全新的Spring Boot项目来尝试。 ### 定义线程池 第一步,先在Spring Boot主类中定义一个线程池,比如: ```java @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @EnableAsync @Configuration class TaskPoolConfig { @Bean("taskExecutor") public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(10); executor.setMaxPoolSize(20); executor.setQueueCapacity(200); executor.setKeepAliveSeconds(60); executor.s...
SpringBoot CLI 是spring Boot项目的脚手架工具。而本文的Spring Cloud cli则是基于SpringBoot Client的一个插件,用于支持Cloud相关的组件。 由于各种原因,目前用起来并不是很爽: - repo 经常连不上 - 启动非常慢,要等半天 - 遇到问题排查不是很容易 但是,功能很有意思,值得期待。也许有一天变的像 docker swarm 那样直接启动分布式的服务,就完美了。 SpringBoot Client文档: https://docs.spring.io/spring-boot/docs/current-SNAPSHOT/reference/htmlsingle/#getting-started-installing-the-cli SpringCLoud Client 文档: http://cloud.spring.io/spring-cloud-static/spring-cloud-cli/1.3.2.RELEASE/ 组件仓库:https://repo.spring.io/webapp/#/home ### 安装springboot client 通用的安装方式是下载编译版,设置PATH环境变量即可。 下载如下的二进制包: https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/1.5.10.RELEASE/spring-boot-cli-1.5.10.RELEASE-bin.tar.gz 解压并设置环境能量: ``` tar xvfz spring-boot-cli-1.5.10.RELEASE-bin.tar.gz cd spring-1.5.10.RELEASE export PATH=$PATH:$PWD/bin ``` 官网文档还提供了其...
# 环境要求 1、Java SDK 1.8 [下载](http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk8-downloads-2133151-zhs.html) 2、Eclipse IDE for Java EE Mars 2 (4.5.2) [下载](https://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/mars2) 3、Apache Maven 3.3+ [下载](https://maven.apache.org/download.cgi) 4、MySql 5.7+ [下载](https://dev.mysql.com/downloads/windows/installer/5.7.html) # 导入到Eclipse 1、检出JeeSite4源代码: ``` git clone https://gitee.com/thinkgem/jeesite4.git ``` 2、拷贝`web`文件夹,到你的工作目录(不包含中文和空格的目录)下,重命名为你的工程名,如:`jeesite-demo` 3、打开`pom.xml`文件,修改第13行,artifactId为你的工程名,如:`jeesite-demo` 4、导入到Eclipse,菜单 File -& Import,然后选择 Maven -& Existing Maven Projects,点击 Next& 按钮,选择第2步的`jeesite-demo`文件夹,然后点击 Finish 按钮,即可成功导入 5、这时,Eclipse会自动加载Maven依赖包,初次加载会比较慢(根据自身网络情况而定),若工程上有小叉号,请打开Problems窗口,查看具体错误内容,直到无错误为...
前三篇详细总结了Mybatis的基本特性、常用配置、映射器,相对于Hibernate,映射器的配置相对复杂,但有很好的灵活性和扩展性,可以应对各种业务场景。熟练掌握这些内容,可以流畅的使用MyBatis进行开发了。 后面准备介绍MyBatis的解析和运行原理以及自定义插件,今天看了书籍的这部分,都会涉及到反射和动态代理这些基础,本篇文章总结下这些,便于理解原理。 通过本篇的介绍,你会了解到: * 反射和动态代理是解决什么问题的 * Class对象 * 反射能做什么 * 动态代理的实现方式:JDK动态代理、CGLIB #### 理解反射和动态代理 ##### 反射 首先看看官网对反射的定义: &可以通过java代码,获取当前加载类的字段、方法、构造函数等信息,并在安全限制内,使用反射字段、方法、构造函数进行操作。 简单来说,可以在运行时获得程序中每一个类型的成员信息。程序中定义的对象,其类型都是在编译期确定的,而反射可以动态地创建对象,并访问或调用其成员。 ##### 动态代理 所谓代理,是一个人或组织代替另一个人或组织做事,主要有3个角色:访问者、代理人、被代理人,访问者经由代理人,与被代理人交互,中间会加入一些自己的处理。 ![图片来自互联网](http://oc3r3rke2.bkt.clou...
今天在技术经理的现场优化中,把一条需要40000ms的sql语句优化到9ms左右,将近提高4500多倍的速度 优化前: SELECT `o`.* FROM `order` `o` INNER JOIN `virtual_order` `vo` ON `o`.`virtual_order_id` = `vo`.`id` INNER JOIN `user` `u` ON `o`.`user_id` = `u`.`id` LEFT JOIN `crm_department` `d` ON `o`.`salesman_department_id` = `d`.`id` LEFT JOIN `order_team` `ot` ON `o`.`id` = `ot`.`order_id` WHERE ((d.path like '1-46-%') OR (`d`.`id`=46) OR (`o`.`salesman_aid`=93) OR (`ot`.`administrator_id`=93)) AND (`vo`.`is_vest`=0) ORDER BY `vo`.`created_at` DESC LIMIT 20 40790ms 优化后 EXPLAIN SELECT o.* FROM `order` `o` LEFT JOIN `crm_department` `d` ON `o`.`salesman_department_id` = `d`.`id` LEFT JOIN ( SELECT order_id
FROM `order_team` Where `administrator_id`=93) as ot ON `o`.`id` = `ot`.`order_id` WHERE o.is_vest=0 AND ((d.path like '1-46-%') OR (`d`.`id`=46) OR (`o`.`salesman_aid`=93)) ORDER BY `o`.`created_at` DESC LIMIT 20; 9.21ms
Detect languageAfrikaansAlbanianArabicArmeni...
Spring Boot项目使用一个全局的配置文件application.properties或者是application.yml,在resources目录 下或者类路径下的/config下,一般我们放到resources下。 1、修改tomcat的端口为8088 ![输入图片说明](https://static.oschina.net/uploads/img/21733_mB9v.png "在这里输入图片标题") 启动后 ![输入图片说明](https://static.oschina.net/uploads/img/22007_tyGi.png "在这里输入图片标题") 重新启动看效果 2、修改DispatcherServlet Spring boot 2.x 由原来的server.servlet-path 改为server.servlet.path 但是测试发现无效。不知道为啥 to be continue。。。
由于众所周知的原因,至今仍有大量生产环境的代码跑在 Python 2.7 之上,在 Python 2 的世界里,并没有一个官方的类型系统实现。那么生产环境的类型系统是如何实现的呢,为什么一定要在在线服务上实现类型系统?下文将针对这两个问题进行深入讨论。
块级与行内元素 块级: div 、ul、li、h1-h6、body、from、table 行内: span、a、b、strong、title、i 行内块: img、input、td 清浮动的方式 .clearfix:after{
display: block,
clear: both,
content:"",
visibility: hidden,
.clearfix{
.clearfix:before, .clearfix:after {
content: " ";
.clearfix:after {clear:}
.clearfix: {zoom: 1} CSS居中
行内元素: text-align: center
flex布局: display: flex;justify-content: center
单行文本: height=line-height
多行文本: display:table-cell;vertival-align: middle
块级元素: 使用css3属性: transfrom: translate(x,y)
盒子模型 内容content、填充padding、边界margin、边框border、 W3C标准盒模型:width = contentWidth+padding+border+margin。 盒子在页面占据的大小包括了margin,...
第一步:安装node.js,因为node.js带有npm工具 装好nodejs之后,配置好环境变量 可以用两个命令检验安装是否成功 node -v
这是查看node版本
这是查看npm工具版本 因为npm安装速度慢,所以用淘宝的命令cnpm,输入一下命令: npm install -g cnpm --registry=https://registry.npm.taobao.org # 全局安装 vue-cli
$ cnpm install --global vue-cli
# 创建一个基于 webpack 模板的新项目
$ vue init webpack my-project
# 这里需要进行一些配置,默认回车即可 $ cd my-project
$ cnpm install
$ cnpm run dev
### 配置文件解析 ``` 600s . -Xmx2048m -Xms400M -Xss100m -XX:MaxPermSize=256m -server -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote 8 65s 128 15s false true true ``` 参考:https://blog.csdn.net/qyf_5445/article/details/8152042
解释:make password
[root@cham2 ~]# mkpasswd
make password
^C [root@cham2 ~]# mkpasswd
直接输入不行的 -bash: mkpasswd: 未找到命令 [root@cham2 ~]# yum install -y expect
要安装一个包。 已加载插件:fastestmirror
随手生成一个密码 #mkpasswd 指定密码长度12位 #mkpasswd -l 12 还可以指定3个特殊符号 #mkpasswd -l 12 -s 3 也可以不要特殊符号,只要小些大写 #mkpasswd -l 12 -s 0
su命令 su命令是用于切换用户
**普通用户显示$,root用户显示#** su的优缺点;
 su的确为管理带来方便,通过切换到root下,能完成所有系统管理工具,只要把root的密码交给任何一个普通用户,他都能切换到root来完成所有的系统管理工作;但通过su切换到root后,也有不安全因素;比如系统有10个用户,而且都参与管理。如果这10个用户都涉及到超级权限的运用,做为管理员如果想让其它用户通过su来切换到超级权限的root,必须把root权限密码都告诉这10个用户;如果这10个用户都有root权限,通过root权限可以做任何事,这在一定程度上就对系统的安全造成了威协;想想Windows吧,简直...
上一篇我们介绍整个请求的过程,这一次我们来讲边边角角和细节。
下载redis的压缩包 wget http://download.redis.io/releases/redis-4.0.9.tar.gz 解压文件 tar -xvf redis-4.0.9.tar.gz 安装gcc yum install gcc 切到redis目录 cd redis-4.0.9 编译安装 make MALLOC=libc
cd src && make install 创建redis目录,并且把redis.conf文件复制到目录下更名为6379.conf mkdir /etc/redis && cp ../redis.conf /etc/redis/6379.conf 修改6379.conf vim /etc/redis/6379.conf
## 修改为后台进程启动
daemonize yes
## 解除本机绑定
# bind 127.0.0.1 加入到服务 cp /root/redis-4.0.9/utils/redis_init_script /etc/init.d/redisd
vim /etc/init.d/redisd
## 在开头加入注释
# chkconfig:
# description:
Redis is a persistent key-value database 开启/关闭redis服务 service redisd start
service redisd stop 加入开机启动 systemctl enable redisd
systemctl daemon-reload
本文利用apache ftpserver工具实现文件的上传下载和删除。具体如下: 1、下载相应的jar包
commons-net-1.4.1.jar 2、实现代码如下: public class FtpUtils {
//ftp服务器地址
public String hostname = "192.168.1.249";
//ftp服务器端口号默认为21
public Integer port = 21 ;
//ftp登录账号
public String username = "root";
//ftp登录密码
public String password = "123";
public FTPClient ftpClient =
* 初始化ftp服务器
public void initFtpClient() {
ftpClient = new FTPClient();
ftpClient.setControlEncoding("utf-8");
System.out.println("connecting...ftp服务器:"+this.hostname+":"+this.port);
ftpClient.connect(hostname, port); //连接ftp服务器
ftpClient.login(username, password); //登录ftp服务器
int replyCode = ftpClient.getReplyCode(); //是否成功登录服务器
前言 高阶函数指满足以下条件中的1个或者多个 1、入参是函数 2、出参是参数 package scalapackage
* Created by Germmy on .
object GaojieFunction2 {
//这个也是定义函数的一种方式,其中func:Int,表示的是函数名是func,返回值类型是Int
//=&Int=x,表示的是入参是x,类型是Int
//=&x * x,表示的是方法体
val func:Int=&Int=x=&x * x
val arr=Array(1,2,3,4,5)
def main(args: Array[String]) {
//完整写法
//x=&func(x),这个整体可以看成是一个匿名函数,x是map中的每一个元素,方法体是调用func函数
val arr2=arr.map(x=&func(x))
for(i&-arr2){
println(i)
//简略写法
val arr3=arr.map(func)
for(i&-arr3){
println(i)
这个例子中,arr.map就是高阶函数,它接受一个匿名函数作为入参。...
导语:设计模式是无数码农前人在实际的生产项目中经过不断的踩坑、爬坑、修坑的经历总结出来的经验教训,经过抽象之后表达成的概念。能够帮助后来的设计者避免重复同样的错误或者弯路。 我抽空整理了一下设计模式,用自己的话总结了一下,自认为通俗易懂。 简单工厂模式: 包括三种角色,抽象产品、具体产品和工厂角色。其中在工厂直接完成对具体产品的创建。工厂模式的好处是需要创建对象的时候只需要输入一个正确的参数就可以获得所需要的对象,而无需知道其创建细节,这种模式将对象的创建和对象业务的处理分离,降低系统的耦合度,使得两者修改起来都相对容易。 工厂方法模式: 该模式包括四种角色,抽象工厂、具体工厂、抽象产品和具体产品角色。与简单工厂模式相比,抽象工厂负责定义创建产品对象的公共接口,而工厂子类则负责生产具体的产品对象。这样可以将产品类的实例化操作延迟到工厂子类中完成。这样,当需要生成一个具体产品对象时,首先要生成该对象的产品工厂。这样的好处是可扩展性很好。 抽象工厂模式: 在工厂方法模式中,具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下一个具体工厂中只有一工厂方法或...
ed,是一个行编辑器的名字,我居然今天才听说。一直以来,只会使用vim/vi编辑器。 在Shell Programming in Unix Linux and OS X这本书中第三章读到这个编辑的使用方法,真的感觉到很头疼。有位牛人说,它是“有屎以来最虐人的编辑器”(the most user-hostile editor ever created)。 Ken Thompson,大神 Unix操作系统的作者Ken Thompson于1971年8月发布ed的第一个版本,是Unix操作系统三个最基础的组件。哪三个组件?编译器、编辑器和shell。 谁还会用这玩意啊?shell编程的时候要使用。听说,在所有东西都不行了的时候,这个编辑器可能会救你一命。据说,在不指定编辑器的情况下,Oracle的SQL*Plus就使用ed。 你要是弄错了,ed只会显示一个“?”。 ed test.txt //用ed打开一个文件,它会只会显示一个数字,即该文档中的字符数 上图中,我在每一行前面添加4个空格。在交互模式下,输入下面的命令: 1,$s/^/
/ 必须具备一定的正则表达式(regex)知识,才能操作。 “1,$”限定范围,从第1个字符到最后一个字符 s,substitue,替换 p,print,显示 g,有多少个,就操作多少次...
前++的结果是a=14,b=6,c=8 后++的结果是a=13,b=6,c=8 前++的结果 后++的结果
Spring两种事物处理机制,一是声明式事物,二是编程式事物 声明式事物 1)Spring的声明式事务管理在底层是建立在AOP的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过等价的基于标注的方式),便可以将事务规则应用到业务逻辑中。因为事务管理本身就是一个典型的横切逻辑,正是AOP的用武之地。Spring开发团队也意识到了这一点,为声明式事务提供了简单而强大的支持。Spring强大的声明式事务管理功能,这主要得益于Spring依赖注入容器和Spring AOP的支持。依赖注入容器为声明式事务管理提供了基础设施,使得Bean对于Spring框架而言是可管理的;而Spring AOP则是声明式事务管理的直接实现者。和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。但是即便有这样的需求,也存在很多变通的方法,比如,可以将需要进行事务管理的代码块独立为方法...
“Stop Trying to Reinvent the Wheel(不要重复造轮子 )”, 可能是每个程序员入行被告知的第一条准则。在公司里面,我也会对团队里面每个新进的成员反复灌输这个理念。但要真正做到这一点也非易事。
一、导入依赖的包【maven】
&!-- 引入poi,解析workbook视图 --&
&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi&/artifactId&
&version&3.16&/version&
&/dependency&
&dependency&
&groupId&org.apache.poi&/groupId&
&artifactId&poi-ooxml&/artifactId&
&version&3.14&/version&
&/dependency&
&!-- 处理excel和上面功能是一样的--&
&dependency&
&groupId&net.sourceforge.jexcelapi&/groupId&
&artifactId&jxl&/artifactId&
&version&2.6.10&/version&
&/dependency& 二、写入
//第一步,创建一个workbook对应一个excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
//第二部,在workbook中创建一个sheet对应excel中的sheet
HSSFSheet sheet = workbook.createSheet("用户表一");
//第三部,在sheet表中添加表头第0行,老版本的poi对sheet的行列有限制
HSSFRow row = sheet.createRow(0);
//第四步,创建...
在一个对象数组中,找到指定属性值的元素
Python中没有找到其他实现的方式(可能我孤陋寡闻了),在这里使用reduce来解决这个问题 stus = [
'id': 'a',
'name': 'aa'
'id': 'c',
'name': 'cc'
'id': 'b',
'name': 'bb'
from functools import reduce
ret = reduce(lambda pre, cur: cur if cur['id'] == 'c' else pre, stus, None)
print(ret)
{'id': 'c', 'name': 'cc'}
一 请求与响应流程 1.1 请求的封装 1.2 请求的发送 1.3 请求的调度 二 拦截器 2.1 RetryAndFollowUpInterceptor 2.2 BridgeInterceptor 2.3 CacheInterceptor 2.4 ConnectInterceptor 2.5 CallServerInterceptor 三 连接机制 3.1 建立连接 3.2 连接池 四 缓存机制 4.1 缓存策略 4.2 缓存管理 在Android刀耕火种的哪个年代,我们做网络请求通常会选用HttpURLConnection或者Apache HTTP Client,这两者均支持HTTPS、流的上传和下载、配置超时和连接池等特性,但随着业务场景的负责化以及 对流量消耗的优化需求,Okhttp应运而生,自诞生起,口碑就一直很好。 但是,大家都说好,好在哪里?既然这么好,它的设计理念和实现思路有哪些值得我们学习的地方? 今天就带着这些问题,一探究竟。 An HTTP+HTTP/2 client for Android and Java applications. 官方网站: https://github.com/square/okhttp 源码版本:3.9.1 在正式分析源码之前,我们先来看个简单的小例子,从例子入手,逐步分析Okhttp的实现。 :point_right: 举例 OkHttpClient okHttpClient = new OkHttpClient.Builder()
Request request = new Request.Builder()
符合CMMI体系建立的项目管理文件夹模板 ├─00_项目管理 │ ├─00_01_项目计划 │ ├─00_02_工作周报 │ ├─00_03_会议纪要 │ ├─00_04_重要邮件 │ └─00_05_其它项目管理文件 ├─01_系统需求 │ ├─01_01_客户调研 │ └─01_02_需求分析 ├─02_系统设计 │ ├─02_01_框架设计 │ ├─02_02_界面原型 │ │ └─02_02_01_美工UI设计 │ ├─02_03_详细设计 │ └─02_04_数据库设计 ├─03_Source_Code │ ├─03_01_trunk │ │ ├─dotNet │ │ ├─html │ │ ├─java │ │ └─mobile │ │    ├─Android │ │    └─iOS │ ├─03_02_branches │ │ ├─dotNet │ │ ├─html │ │ ├─java │ │ └─mobile │ │    ├─Android │ │    └─iOS │ └─03_03_tags │    ├─dotNet │    ├─html │    ├─java │    └─mobile │       ├─Android │       └─iOS ├─04_测试文档 │ ├─04_01测试计划 │ ├─04_02测试用例 │ ├─04_03测试报告 │ └─04_04测试问题记录 ├─05_系统实施 │ ├─05_01_试运行 │ └─05_02_上线 ├─06_项目结项 ├─07_运维文档 ├─08_参考资料 ├─09_配置管理 ...
最近,在做大数据的知识储备,整理了一写自己学习的笔记,浅谈Hbase数据及设计,不足之处,还请大家多多指点。
首选,HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统。就像Bigtable利用了Google文件系统(File System)所提供的分布式数据存储一样,HBase在Hadoop之上提供了类似于Bigtable的能力。HBase是Apache的Hadoop项目的子项目。HBase不同于一般的关系数据库,它是一个适合于非结构化数据存储的数据库。另一个不同的是HBase基于列的而不是基于行的模式。
HBase 是一个NoSQL数据库,用于处理海量数据,可以支持10亿行百万列的大表,下面我们通过与关系数据库的对比来了解Hbase数据库的表设计
关系型数据库的表结构,为了更好的理解HBase表的思路,这里先回顾一下关系数据库中表的处理方式
例如有一个用户表user_info,有字段:id、name、tel,表名和字段需要在建表时指定
create table user_info (
name 类型,
由于众所周知的原因,至今仍有大量生产环境的代码跑在 Python 2.7 之上,在 Python 2 的世界里,并没有一个官方的类型系统实现。那么生产环境的类型系统是如何实现的呢,为什么一定要在在线服务上实现类型系统?下文将针对这两个问题进行深入讨论。
搜索是大数据领域里常见的需求。Splunk和ELK分别是该领域在非开源和开源领域里的领导者。本文利用很少的Python代码实现了一个基本的数据搜索功能,试图让大家理解大数据搜索的基本原理。 布隆过滤器 (Bloom Filter) 第一步我们先要实现一个布隆过滤器。 布隆过滤器是大数据领域的一个常见算法,它的目的是过滤掉那些不是目标的元素。也就是说如果一个要搜索的词并不存在与我的数据中,那么它可以以很快的速度返回目标不存在。 让我们看看以下布隆过滤器的代码: class Bloomfilter(object):
A Bloom filter is a probabilistic data-structure that trades space for accuracy
when determining if a value is in a set.
It can tell you if a value was possibly
added, or if it was definitely not added, but it can't tell you for certain that
it was added.
def __init__(self, size):
"""Setup the BF with the appropriate size"""
self.values = [False] * size
self.size = size
def hash_value(self, value):
"""Hash the value provided and scale it to fit the BF size"""
springboot+vue的前后端分离与合并
本文主要内容:①我为啥拖延;②MariaDB的BSL许可证;③BSL示例。下一步准备介绍下MySQL和MariaDB的版权细节问题。
原文出处,在 Spring For All 社区(http://spring4all.com ): http://www.spring4all.com/article/213 最近,开源社区发生了一件大事,那个全国 Java 开发者使用最广的开源服务框架 Dubbo 低调重启维护,并且 3 个月连续发布了 4 个维护版本。 我上次在写[放弃Dubbo,选择最流行的Spring Cloud微服务架构实践与经验总结](http://mp.weixin.qq.com/s/bciSlKearaVFQg1QWOSn_g)这篇文章的时候,就有很多的网友给我留言说,Dubbo 又开始更新了。我当然是清楚的,我也一直在关注着 Dubbo 的走向,在几个月前技术圈里面就有一个消息说是 Dubbo 又开始更新了,大家议论纷纷不知真伪。我还专门跑到 GitHub 上面进行了留言询问,最后在 Dubbo 的 gitter 聊天室里面找到了确信的答案,说是正在组建团队。虽然稍稍有所期待,但也不知道阿里这次拿出了多少的诚意来做这件事,于是我昨天又到 GitHub 逛了一下,发现从 9 月开始,阿里三个月连着发布了四个版本,还是非常有诚意的,值得关注。 ## Dubbo简介 Dubbo 是阿里巴巴公司一个开源的高性能服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案,使得应用可通过高性能 RPC 实现服务的输出、输入功能...
### 如何7步实现根据源码包创建rpm包 --- & 本文是"[7 Steps to Build a RPM Package from Source on CentOS / RedHat](http://www.thegeekstuff.com/2015/02/rpm-build-package-example/)"一文的简单翻译。 **version: 0.1.0 ** 有时你可能需要获取一个开源应用的源码包,但是可能没有无法通过该应用的RPM文件来安装到系统。 在这种情况下,你既可以编译源码安装,也可以以源码包来创建一个rpm包文件,实现安装应用的功能。 同样存在一种情况即你想要创建一个你自己开发的自定义的RPM包。 这篇指南解释了如何提高源码来创建一个rpm包。 为了创建rpm包,你将需要源码包(通常为一个压缩文件,其内也包含了SPEC文件)。 SPEC文件包含以下说明:如何创建rpm包,包内包含的文件,安装的路径。 RPM将展现创建过程中的测试过程。 执行spec文件中的prep块中定义的系统命令和宏命令。 检测文件列表的内容 执行spec文件中的build块中定义的系统命令和宏命令。在这一步中文件列表中的宏命令也被执行。 创建二进制包文件 创建源码包文件 一旦RPM执行了上述步骤,将创建二进制的包文件和源码包文件。 二进制包文件包含所有安装或卸载包的额外信息的源文件。 通常安装包的所有...
## 介绍 为了演示Hutool-http的http请求功能,因此这个栗子用红薯家的开源资讯开刀,在此做个简单的Demo。 ## 开始 ### 分析页面 1. 打开红薯家的主页,我们找到最显眼的开源资讯模块,然后点击“更多”,打开“开源资讯”板块。 ![](https://static.oschina.net/uploads/img/04312_zJD8.png) 2. 打开F12调试器,点击快捷键F12打开Chrome的调试器,点击“Network”选项卡,然后在页面上点击“全部资讯”。 ![](https://static.oschina.net/uploads/img/04634_1ahd.png) ![](https://static.oschina.net/uploads/img/04743_eJBy.png) 3. 由于红薯家的列表页是通过下拉翻页的,因此下拉到底部会触发第二页的加载,此时我们下拉到底部,然后观察调试器中是否有新的请求出现。如图,我们发现第二个请求是列表页的第二页。 ![](https://static.oschina.net/uploads/img/05000_V7Sj.png) 4. 我们打开这个请求地址,可以看到纯纯的内容。红框所指地址为第二页的内容,很明显p参数代表了页码page。 ![](https://static.oschina.net/uploads/img/05156_dTb8.png) 5. 我们右键点击后查看源码,可以看到源码。 ![](https://static...
在一般的web应用开发里通常会使用开发工具(如Eclipse、IntelJ)集成tomcat,这样可以将web工程项目直接发布到tomcat中,然后一键启动。经常遇到的一种情况是直接修改一个类的源文件,此时开发工具会直接将编译后的class文件发布到tomcat的web工程里,但如果tomcat没有配置应用的自动加载功能的话,当前JVM中运行的class还是源文件修改之前编译好的class文件。可以重启tomcat来加载新的class文件,但这样做需要再手工点击一次【restart】,为了能够在应用中即时看到java文件修改之后的执行情况,可以在tomcat中将应用配置成自动加载模式,其配置很简单,只要在配置文件的Context节点中加上一个reloadable属性为true即可,示例如下: &Context path="/HelloWorld" docBase="C:/apps/apache-tomcat/DeployedApps/HelloWorld" reloadable="true"/& 如果你的开发工具已经集成了tomcat的话应该会有一个操作界面配置来代替手工添加文件信息,如Eclipse中是如下界面来配置的: 此时需要把【Auto reloading enabled】前面的复选框钩上。其背后的原理实际也是在server.xml文件中加上Context节点的描述: &Context docBase="test" path="/test" reloadable="true"/& 这样Tomcat就会监...
Dynamo是Amazon提供的一个分布式存储NoSQL 数据库,它采用去中心化、松散耦合的方式,组成一个支持高度扩展的Key/Value 数据库,本篇我们着重分析一下,它是如何采用采用一致性hash而达到可高度扩展的。
Activiti DMN 规则引擎 规则匹配 表达式
## 前言 因今年公司新产品线较多,为了降低耦合,达到业务分离、重用,提高内部开发效率的目的,采用了基于服务组件、前后端分离的架构体系。与之前传统单应用架构相比,系统部署、配置更加复杂,为了能够频繁地将软件的最新版本,及时、持续地交付给测试团队及质量控制团队,以供评审,所以引入持续集成工具Jenkins,从而实现公司新产品持续集成,自动化部署。 ## 环境准备 - 操作系统:Windows10 - Java环境:下载 jdk-1.8.0-131-X64.zip,配置Java环境变量(参考:http://jingyan.baidu.com/article/b941bcc9ce521.html) - Maven环境:下载apache-maven-3.5.2-bin.zip,配置Maven环境变量(参考:http://wiki.jikexueyuan.com/project/maven/environment-setup.html) - Tomcat环境:下载apache-tomcat-8.5.20-windows-x64.zip,配置Tomcat环境变量(参考:http://jingyan.baidu.com/article/8065f87fcc0f.html) - Jenkins环境:下载Jenkins2.73.2 for Windows ## 安装Jenkins 1. 运行下载好的Jenkins安装包jenkins.msi,选择安装路径,点击”安装“,等待安装完成; ![11](https://gitee.com/lsjcoder/img/raw/master/%E4%BB%A3%E7%A0%81%E7%...
最近看到一个非常酷炫的menu插件,一直想把它鼓捣成vue形式,谁让我是vue的死灰粉呢,如果这都不算爱?。?开个小玩耍,我们一起来探索黑魔法吧。观看本教程的读者需要具备一定的vue和css3的知识. 本文结构 1.效果演示 2.使用方法介绍 3.关键步骤讲解 正文 1.效果演示
在线演示live demo 2.使用介绍
项目地址:github.com/MingSeng-W/vue-bloom-menu,clone项目到本地
a. 首先在单文件组件里引入menu组件,导入common文件夹stylus里的menuConfig.stylus.
b.配置相应的参数
* radius:default为100px,item距离menu的button的距离。
startAngle:defaut为0,item开始的角度,以时钟3点钟方向记为0,然后顺时针方向为递增方向。
endAngle:default为315,最后一个item的角度。
itemNum:default为8
animationDuration:default为0.5s,每个item动画的执行时间
itemAnimationDelay:d...
作者:社区 徐靖峰 原文地址:http://www.spring4all.com/article/156 在服务比较少的年代,一个系统的接口响应缓慢通常能够迅速被发现,但如今的微服务模块,大多具有规模大,依赖关系复杂等特性,错综复杂的网状结构使得我们不容易定位到某一个执行缓慢的接口。分布式的服务跟踪组件就是为了解决这一个问题。其次,它解决了另一个难题,在没有它之前,我们客户会一直询问:你们的系统有监控吗?你们的系统有监控吗?你们的系统有监控吗?现在,谢天谢地,他们终于不问了。是有点玩笑的成分,但可以肯定的一点是,实现全链路监控是保证系统健壮性的关键因子。 介绍Spring Cloud Sleuth和Zipkin的文章在网上其实并不少,所以我打算就我目前的系统来探讨一下,如何实现链路监控。全链路监控这个词意味着只要是不同系统模块之间的调用都应当被监控,这就包括了如下几种常用的交互方式: 1 Http协议,如RestTemplate,Feign,Okhttp3,HttpClient... 2 Rpc远程调用,如Motan,Dubbo,GRPC... 3 分布式Event,如RabbitMq,Kafka... 而我们项目目前混合使用了Http协议,Motan Rpc协议,所以本篇文章会着墨于实现这两块的链路监控。 ## 项目结构 ![项目结构](http://ov0zuistv.bk...
本博文是我参加 K8S技术社区深圳站Meetup分享的PPT内容,主要介绍Kubernetes在vivo容器云平台的应用与实践,重点介绍我们跟业界大多数方案不一样的地方,包括整体架构(HA/Security)、定制化的应用滚动方案、Ingress方案及部署实践、容器网络方案以及在TaaS方向的探索与实践等等。
Spring For All 社区作者: 纯洁,原文地址 [传送门](http://spring4all.com/article/144) 上次写了一篇文章叫[Spring Cloud在国内中小型公司能用起来吗?](https://mp.weixin.qq.com/s/vnWXpH5pv-FAzLZfbgTGvg)介绍了Spring Cloud是否能在中小公司使用起来,这篇文章是它的姊妹篇。其实我们在这条路上已经走了一年多,从16年初到现在。在使用Spring Cloud之前我们对微服务实践是没有太多的体会和经验的。从最初的开源软件[云收藏](https://github.com/cloudfavorites/favorites-web)来熟悉Spring Boot,到项目中的慢慢使用,再到最后全面拥抱Spring Cloud。这篇文章就给大家介绍一下我们使用Spring Boot/Cloud一年多的经验。 在开始之前我们先介绍一下几个概念,什么是微服务,它的特点是什么? Spring Boot/Cloud都做了那些事情?他们三者之间又有什么联系? ## 技术背景 ### 什么是微服务 微服务的概念源于2014年3月Martin Fowler所写的一篇文章“[Microservices](http://martinfowler.com/articles/microservices.html)”。 微服务架构是一种架构模式,它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。每个服务运行在其独立的...
我们能从很多地方学习到怎么起一个 Electron 项目,有些还会介绍怎么打包或构建你的代码,但距离「真正地发行一款 Electron 产品」这一目标,还有很多工作需要做... 这是 Electron 系列文章的第二篇,这一篇文章将和大家分享我是怎么去构建**自动化的 Electron 开发构建工程**的,说白了,就是**怎么把敲的代码变成一个用户可以下载安装的包**,当然随着之后应用复杂度的提升和技术再选型,工程体系可能随时会重构或演进,但至少可以给大家一些参考,欢迎留言交流。
http://storm.apache.org/releases/0.9.7/Guaranteeing-message-processing.html 本文是对Storm官方文档的翻译并结合了自己的一些理解。最后发现网络上已经有了很多的翻译版本,自己翻译收获还是不一样的。 文中可能会有翻译理解不到位的情况,还望不吝指教。另外在阅读本文前须要对storm的一些基本概念有所了解,包括spout,bolt,tuple,拓扑等
### lvm讲解 ``` DiskA 分区分别为Physical Volume1、Physical Volume2;DiskB 分区为Physical Volume3,在这里Physical volume1,2,3就是磁盘分区 也就是物理卷;然后由单个或多个物理卷组成物理卷组,最后在物理卷的基础上划分出逻辑卷,而逻辑卷格式化后挂载上就可以使用了 ``` #### 准备磁盘分区阶段 - fdisk /dev/sdb - 创建三个新分区,大小分别为2G - 改变分区类型为8e(fdisk中使用t更改类型) 1. 创建新分区 ``` //这里我创建了5个2G的分区,多出的2个留待测试用 [root@24centos7-01 /]# fdisk /dev/sdb 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 //创建第一个分区 命令(输入 m 获取帮助):n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p 分区号 (1-4,默认 1):1 起始 扇区 (9,默认为 2048): 将使用默认值 2048 Last 扇区, +扇区 or +size{K,M,G} (9,默认为 ):+2000M 分区 1 已设置为 Linux 类型,大小设为 2 GiB //创建第二个分区 命令(输入 m 获取帮助):n Partition type: p primary (1 primary, 0 ext...
I/O复用模型,是同步非阻塞,这里的非阻塞是指I/O读写,对应的是recvfrom操作,因为数据报文已经准备好,无需阻塞。说它是同步,是因为,这个执行是在一个线程里面执行的。有时候,还会说它又是阻塞的,实际上是指阻塞在select上面,必须等到读就绪、写就绪等网络事件。
**1.混淆工具版本** 本文使用的是ProGuard这一款Java代码混淆工具。 因为在我们实际的开发工作中,有些程序包含了公司核心产品的代码,所以为了保护自身的知识产权,避免程序包不小心外流出去,我们有必要进行一些保护措施,在程序开发完之后,需要将程序代码进行混淆。 本文使用的是ProGuard v5.3.3版本。 下载地址:http://www.jb51.net/softs/242707.html **2.混淆工具安装步骤** 2.1下载后的文件是一个压缩包: ![输入图片说明](https://static.oschina.net/uploads/img/41208_UU6w.png "在这里输入图片标题") 2.2 解压压缩包 ![输入图片说明](https://static.oschina.net/uploads/img/41219_crA0.png "在这里输入图片标题") **3.混淆工具使用步骤** 3.1 解压后,执行 bin目录下的proguardgui.bat ![输入图片说明](https://static.oschina.net/uploads/img/41328_A5vq.png "在这里输入图片标题") 执行proguardgui.bat后如图: ![输入图片说明](https://static.oschina.net/uploads/img/41356_BC65.png "在这里输入图片标题") 注意:执行proguardgui.bat后会出现一个cmd命令框,不要关闭,最小化即可。 3.2 点击左侧菜单栏中的...}

我要回帖

更多关于 kettle增量抽取和全量 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信