
用过 Spring 的 @EnableScheduling 的都知道,我们用三种形式来部署计划任务,即 @Scheduled 注解的 fixedRate(fixedRateString), fixedDelay(fixedDelayString), 以及 cron. cron 不在这里讨论的范畴。我们着重在如何理解 fixedRate 和 fixedDelay 的区别。
在 Spring 的 Scheduled 注解的 JavaDoc 对此的解释很简单
public abstract long fixedRate
Execute the annotated method with a fixed period in milliseconds between invocations.
public abstract long fixedDelay
Execute the annotated method with a fixed period in milliseconds between the end of the last invocation and the start of the next.只是说是 fixedRate 任务两次执行时间间隔是任务的开始点,而 fixedDelay 的间隔是前次任务的结束与下次任务的开始。
大致用示意字符串来表示如下(每个 T1, 或 T2 代表任务执行秒数(每次任务执行时间不定),假定 fixedRate 或 fixedDelay 的值是 5 秒,用 W 表示等待的数)
fixedRate: T1.T1WWWT2.T2.T2WW.T3.T3.T3.T3.T3.T4.T4.T4.T4.T4.T4.T4T5T5WWWT6.T6........
fixedDelay: T1.T1.WWWWW.T2.T2.T2WWWWW.T3.T3.T3.T3.T3.WWWWW.T4.T4.T4.T4.T4.T4.T4.WWWWWT6.T6......
一般来说能理解到上面两个场景已经差不多了,相比而言 fixedDelay 简单些,盯着上一次任务的屁股就行。 Read More
- 当我们被问及 HTTP 的 GET 与 POST 两种请求方式的区别的时候,很多答案是说 GET 的数据须通过 URL 以 Query Parameter 来传送,而 POST 可以通过请求体来发送数据,所以因 URL 的受限,往往 GET 无法发送太多的字符。这个回答好比在启用了 HTTPS 时,GET 请求 URL 中的参数仍然是明文传输的一样。
GET 果真不能通过 Request Body 来传送数据吗?非也。如此想法多半是因循着网页中 form 的 method 属性只有 get 与 post 两种而来。因为把 form 的 method 设置为 post, 表单数据会放在 body 中,而 method 为 get(默认值) 时, 提交时浏览器会把表单中的字符拼接到 action 的 URL 后作为 query parameter 传送。于是乎就有了这么一种假像:HTTP GET 必须通过 URL 的查询参数来发送数据。
其实 HTTP 规范并未规定说 GET 就不能发送 body 数据,在 RFC GET 中只是说The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI.
只是说 GET 意味着通过 URI 来识别资源。
我也是本着传统上对 GET 与 POST 区别的误解很多年,今天突然意识到 GET 应该可以使用 body, 况且 HTTP 本身是一个纯文本的协议。没有测试就没有 100% 的发言权,所以做了如下的测试 Read More - 本人所用的键盘是 WASD VP3 61 Key 的 -- Poker 3 方案,可以不借助于软件直接键盘上设置为 Caps + hjkl 来作为方向键。Caps 跳线为 Fn, 并选择一个 Layer, 把原本 Fn + ijkl 的方向键组合键重新映射为 Fn + hjkl 即可。
办公室的 61 键的键盘借于朋友体验,所以又重新把 DAS 87 键摆了出来。由于习惯了 61 键的 Caps + hjkl 的方向键,在 87 键盘上每次按方向键时右手都要离开它的 Home Row,很是不爽。别说是 87 键,即便是有些键盘把方向键压缩在右 Shift 下方,都无法接受右手右下移去按方向键。
Caps 键没什么卵用(只会用 Caps 来输入大写字母的当我没说),却常年占据着黄金位置(左手掌无需移动就能按到),所以主意是如何把 Caps 另作他们,对于 Vimer 来说最理想的方向键是 Caps + hjkl。
Mac 下有个键盘映射的工具 Karabiner, 先前的版本 KeyRemap4MacBook 只支持到 Mac OS 10.8, 而 Karabiner 也只能支持 10.9 到 10.11。而我的 Mac 系统是 macOS Sierra 10.12, 有一个不完全特性的 Karabiner 叫做 Karabiner-Elements, 它不能像 KeyRemap4MacBook 和 Karabiner 那样支持直接组合键的映射。因此在 macOS Sierra 一直未能把方向键映射成某个功能键(如 Caps) + hjkl,不得不用物理方向键。
有两种方法把 Caps + hjkl 映射为方向键
Read More 本博客迁移到现在的 VPS 上已是两年有余,在有评论到来时从来就没收到过提醒邮件,以前是放在租的主机上,所以那些都有人配置好了的。其实一直没把 Wordpress 未能发送邮件的问题放心上,自己收不到倒无所谓,但评论者接收邮件提醒算是件重要的事。
今天一同事说我的博客无法进行评论,我一段时间以来只有一丝感觉为何这么久没人评论了,只想大家都不爱说话罢了,并未意思到博客本身的问题,也在此表示感谢。于是自己测试了下,登陆用户评论没问题,游客无法评论,最后查到是
wpDiscuz与Math Comment Spam Protection插件起冲突了,于是把后者禁用了就没问题。至于评论提交后响应有些慢是由于不得不用的Akismet插件的原因。为评论的问题既然登陆到了 VPS 上了,也顺便把两年来的邮件发送问题也诊断一下,其实做来很简单,就是当初配置 VPS 时少做了一步。当前所用的 Linux 发行版是 Debian,之前记录过一篇 Debian Linux VPS 为 WordPress 的系统准备,其中提到 WordPress 发送邮件用的是 exim4,
所以第一步,修改
/etc/exim4/update-exim4.conf.conf,dc_eximconfig_configtype的值由 'local' 改成 'internet'dc_eximconfig_configtype='internet'
然后重启 exim4 服务,可用命令
service exim4 restart. Read More
用 Java 进行编码基本还是离不开 IntelliJ IDEA 或 Eclipse, 看别人完全用 Vim 进行 Javascript 项目编程很是眼红,估摸着能不能把 Vim 打造成一个更强的 Java IDE。语法高亮是不在话下,最主要是给它加上自动完成功能,不光对当前类,项目中的方法或变能能提示,而且必须像 Java IDE 那样理解所有的项目依赖。这就是今天试用的一个 Vim 插件 vim-javacomplete2,另种可能更好的方案 YouCompleteMe + Eclim 还会再研究。
提到 Vim 的自动完成功能,有必要了解 Vim 自带的提示功能- ctrl - n/p: Vim 根据当前缓冲区的关键字来提示,像 Sublime 或 Visual Studio Code 中的关键字提示
- ctrl - x 进行自动自动完成模式,接着一些操作如 ctrl - l/n/t/i 完成类似于 ctrl - n/p 的操作; ctrl - k 能基于字典自动完成,完整按键是 ctrl - x ctrl -k
- ctrl - x ctrl - o, 这个单独拉出来,是使用 Vim 的 Omni Completion 功能来自动完成,因为将要用到的 vim-javacomplete2 就依赖于这个功能
除 YouCompleteMe 插件外,另外还两个 Vim 下的自动完成插件是 NeoComplete 和 VimCompleteMe。
摘要部分算是说完了,现在开始体验 vim-javacomplete2 对 Java 项目的自动完成功能。它所有完成的代码提示不仅要支持基本的 Java 类库, 当前项目的类, 手动添加的 jar 包 ,还能支持maven,gradle和 Eclipse 的.classpath文件中定义的 classpath, 这完全能应付我们实际中的项目了。实际运作也是一个 C/S 结构,这个插件会启动一个 javavi server, 用 javaparser 来解析依赖, 然后 Vim 中用 omnifunc 经 socket 连接到 javavi server 获得提示列表的。 Read More
Apache ZooKeeper 是一个面向分布式应用程序的高性能协调服务器, 至于它的具体介绍像能提供命名和配置管理、同步和组服务等, 请自个 Google. 虽然对 ZooKeeper 早有耳闻, 也只最近因为项目中有 Kafka 内部用到了 ZooKeeper, 所以才促使我着手去了解一下 ZooKeeper 为何物. ZooKeeper 脱胎于著名的项目 Hadoop, 它也像 Hazelcast 那样未采用严格意义的 Master-Slave 的集群方式, 而是动态选出 Leader, 这避免了单点故障的问题.
既然是集群, 实际应用是会在不同的机器上启动服务, 现如今有了 docker 很容易用它来测试多主机环境, 用docker search zookeeper就知道了. 本实例中暂不涉及 docker, 而是在同一个系统中用多个端口来启动三个 ZooKeeper 实例进行测试. 下面以 Mac/Linux 为例:下载安装 ZooKeeper
到 https://zookeeper.apache.org/releases.html#download 下载, 写下此文时的最新稳定版是 zookeeper-3.4.9.tar.gz, 下载后解压到某处, 为方便起见把解压后的 zookeeper-3.4.9/bin 加到系统环境变量 $PATH 中, 以后方便任何时候运行 zkServer.sh, zkCli.sh 这样的命令. Read MoreVim 自 7.0 开始支持 tab 页了,这就像很多数文本编辑器那样方便在多文件中切换,而不是只能使用 Buffer 暗地里来回切。默认时标签上显示 tab 序号加上当前打开的文件名。
注:Visual Studio Code 1.1.1 目前尚不支持 tab 功能。
Vim 中关于 Tab 的操作命令如下:
vim -p file1 file2 file3.... 在多标签中打开多个文件
:tabe[dit] 或 :tabnew 在当前标签后打开新的标签
:tabn[ext] 或 gt 切换到下一个 tab
:tabp[revious] 或 gT 切换到上一个 tab
:tabn [N] 切换到第 N 个 tab
:tabfir[st] 切换到第 1 个 tab
:tabl[ast] 切换到最后一个 tab Read More
这是我自最早接触 Javascript 的排序之日起一直萦绕在脑海中的问题。比如一个简单的 Javascript 数组排序
[3, 2, 4, 6, 5].sort(function(e1, e2) {
return e1 - e2;
});当然我那时候还不会用 JSON 和无名函数来写上面的代码。 反正经常是搞不清楚想要升序或降序时,是应该 return e1 - e2 还是 return e2 - e1 ?,没把握就试一下,总是二选一。
现在许多语言对集合排序都是使用排序函数的方式,总不想每次都琢磨不定,每次都去试。需要 TDD 时测试用例必须覆盖排序用例, 但还是希望以后书写排序函数时心里有个底。当然,比如在 Java 中对集合进行排序我们可以深入到源代码来理解排序函数是如何影响元素顺序的。
简单通俗点,是否有一种浅显的方式来理解排序函数呢?待我把答案慢慢叙来,就我个人理解就两个原则: Read More
Vi 中的光标操作是其他众多命令,如(d-delete, c-change, yy) 的基础。它犹如汇编中的寄存器/寻址方式,成为了许多 Vi 的初学者望而却步的一主要原因,特别是在某些系统版本的 Vi 中无法正常使用方向键移动光标的情况。那么好的习惯还是请试着用 h, j, k, l 来当方向键,对于键盘控来说,把手从字母上移动到方向键上去都是在浪费时间。
本来是想直接记录一下在 Vi 中怎么进行删除、修改操作的,然而却发现 Vi 的光标操作是无法逾越的一道沟。在这里,我会试着去理解每一个按键的更自然的意义,现在开始拉清单 Read More
在 Vi 中如果想选取文本作为 Shell 命令来执行该如何做呢? 想法的背景是想在 Vi 中编辑 Shell 命令,主要是对参数的修改,然后直接选择执行,而不希望复制再贴到 Terminal 下看结果。方法其实很简单,用不着使用 VimShell,关键这个插件的安装还依赖于另两个插件。方法就是:
1. 可视模式选择文本,选择技巧, 按 v 逐字选择,j 从光标位置到行尾,最有用的莫过于大 V,以行为单位选择,所以按一下大 V 直接选中当前行
2. Shift+; 进到 :'<,'> 提示符
3. 输入 w !sh, 回车即可,要用 fish 就用 w !fish效果

原理(这个表述其实不怎么准确):其实进行的是一个管道操作,把选择的文本内容输送给 sh 执行,相当于
echo "echo 'Hello world'" | sh
如果想把执行结果输出到文件或是剪贴板, 就可借题发挥下了,比如 Read More