service, manager and dao

酝酿这篇文章其实有一段时间了,只是最近晚上回家之后没啥动力(颓废?),于是只能在某个休息日的早上写了。

首先说明一下service、manager和dao指的是java web中常见的分层,我要讲的是自己在这种分层设计上的进一步理解,基于从学java开始到现在工作两年左右的经验。

简略地概括下现阶段我对分层的职责的认识:

Read More

使用expect+python拉取数据并生成报表

虽然脚本周一的时候就写好了,但是昨天才是第一次正式使用。加上昨天写了第二篇shell的tips,所以expect+python的脚本gen_report今天才写。

首先说一下背景。由于工作需要,有时我需要ssh到服务器上拉取运行数据生成报表。整个过程很枯燥,就是登录服务器,输入密码,运行二三十条很像的命令,把数据复制到microsoft excel或者libre office calc中计算。一言以蔽之:整个人肉操作。

很明显,如果让我天天干,我肯定不愿意。但是即使不是天天干,一周干一次,我也不愿意,因为命令执行很慢,来回弄肯定要半天。按照《时间管理 给系统管理员》,这种时候最适合写脚本了。

常规策略是在服务器上写好一个脚本,ssh上去执行一下,再使用scp把结果下载下来,最后使用比如python来解析生成csv等报表。但是,不行。首先遇到的问题就是服务器貌似不支持publickey,其次服务器上命令有限制(很常见,你不是管理员),不支持publickey的直接后果是ssh后执行命令和scp无法使用,只能另外寻找方法。

由于某些原因,我知道expect。虽然交互式的命令很好,但是如果你要让交互式的命令自动化的话,却很麻烦,比如ssh,ftp。这个时候expect可以帮助你解决问题。证明是网上搜索expect ssh login一抓一大把。所以我现在的考虑是通过expect代替ssh登录服务器执行命令。因为不能用scp,所以考虑把expect通过重定向或者tee放入某个文件中,最后让python解析这个日志文件即可。(最近重新看了点expect的书,貌似expect可以直接设置日志文件,不用tee之类的重定向,之后有空可以尝试下。)

基本策略确定了,方向基本也清楚了。由于涉及expect和python两种语言和程序,所以我选择shell做总控制的脚本。以下是总控制脚本即gen_report的内容(部分和工作相关的内容已经做了修改):

Read More

linux命令使用小记2

距离上一次发博客有一段时间了,这段时间其实写了一个shell+expect+python的通过ssh拉取数据的脚本,又用jython调用Java写了一个公司内用的脚本,感觉linux在平时的工作里面越发重要的。
话说回来,linux平时的命令行的使用也有点小成果,在这里和各位分享。

xargs

从当前目录下所有XML文件中查找FOO。find中使用xargs的作用和

类似,不过可以用于别的命令。比如:

删除文件中指定的文件或者目录等等。

Read More

scala版本的grails分页代码

大家平时见过这样的分页么?见过的话知道怎么写么?没见过的话有思路么?

就本人的话,在用grails时见到了这个强大的分页功能,但是对于里面的代码和思路一知半解。
今天心血来潮想要重新理解下原理,所以花了点时间分析了下实现,最终在回家的地铁上基本明白了其中的逻辑,特此写文分享。

在展示最终的scala代码之前,先说下分页中的几个概念,同时为了方便,这里取用grails中的变量名:

Read More

网站内容定时备份

不消说,网站内容定期备份是很有必要的,以下就讲下上周末我学到的网站内容备份的东西。

首先,考虑到wordpress导出的内容可能缺少网站配置等东西,我选择备份的是数据库中的内容,另一方面是可以通过shell+cron的方式定时备份。
备份的主要原理是通过mysqldump导出数据库内容,做成压缩包。考虑到要定期备份,所以套一个cron,每天执行。最后,考虑一个星期把网站的最新内容scp到家里的机器,每月开始删除上个月的备份。

shell脚本如下:

Read More

svn switch and git svn

本文之前就想写,但是当时对svn switch不是非常了解,而且没有解决多分支开发的问题。

到今天为止,靠着强大的git把多分支开发的问题基本解决了,就上来把这一段时间内的解决过程和最终的方案说一下,希望对仍旧被svn“蹂躏”的各位有用。

首先说下多分支开发的问题。在svn下多分支开发唯一的方法是把代码checkout到不同目录中。svn switch并不能承担分支切换的功能。svn switch从它的功能来说是让一个工作副本中包含来自多个库的内容。我能想到的典型场景是“分支”合并到主干上时,当前的主干副本来需要来自其他库,即开发完成的分支的内容。其他可能是一些“异常情况”,反正不要被switch这个单词骗了……

那么svn是否有别的命令支持分支切换么?我个人没有查到。其实从我这一段时间的research,我对svn进一步的认识是:svn没有分支的概念。得出这个结论的过程可能比较长,而且有比较多的个人标准,这里就不展开了。重点是如何解决多分支版本开发问题。

Read More

google calendar使用小记

使用google calendar有一段时间了,当初是看中了重复的事件(event)这个功能。现在经同事指点,又学到了一点新东西。另外自己对事件和任务(task)有了进一步的理解。

日历分类

你可以建立多个日历,比如按照类别的。分成多个日历之后,你可以选择性地显示日历,比如只显示个人的(personal),只显示工作的(working)。其次,你还可以选择性的和他人共享日历,把你的日程分享给其他人看。
说到日历共享,个人认为团队共享某个工作用的日历可能比填写日报更好一些。

事件和任务

google calendar中项目分事件和任务两种,任务理论上不等同于全天事件。任务应该可以被拆解成一个或多个事件。换句话说,你给自己设定某个任务,需要分派到哪天做什么。比如今天我要完成这篇文档,我设置了“[blog]google calendar使用小记”任务,过期时间设定为5月1日。晚上整理时分配今天几点写博客。
当然,个人的任务可能时间要求并不是很高,但是可以尝试这么去做。

vim recording小试

大家是否有这种经验,“不知道为什么按出recording状态,按ESC貌似无法直接退掉”的情况,个人已经有过好几次了。
与其出来烦人还不如了解它,昨天我就花了点时间学习recording。怎么说,还是有点用的。
首先说明的是recording是怎么按出来的:命令模式下按q。假如你想按退出的:q,右手有点慢的话就有可能出现recording。顺便说一句,q:出来的是command history,command history状态下:q或者enter都可以退出。
那么recording是干啥的?简单来说就是命令序列,加快工作效率的。基本使用是q开启录制,接着选择寄存器,比如1,2,a之类的。之后的到第一个q为止的命令都会加入序列中。录制完成之后@1(1这里为寄存器的名字,你也可以选择其他寄存器)就可以重复寄存器中的命令序列。举个简单的例子:

你需要复制1. 20行,除了Vyo20p(选中行复制,进入下一行,粘帖20次)之外,你可以q1Vyopq录制命令序列,20@1执行20次。
这个例子可能还不能体现recording的好处,接下来举第二个例子,注释10行代码

Read More

linux命令使用小记1

bash的快捷键

现在碰到的服务器上的用户的默认shell都是bash,所以主要讲下bash的一些快捷键。
删除整行命令:Ctrl + u,对不回显的密码输入同样有效
向前删除单个单词:Ctrl + w,在vim里面同样有效
运行最近一条命令:!! 就是两个感叹号,个人是从sbt(scala下的一个构建工具)里面学来的
搜索最近的命令;Ctrl + r,输入关键字,比如你最近输入了vim /path/to/file,那么Ctrl + r,再输入vim,那么就可以显示出这条命令,回车就直接执行了
在搜索最近的命令的基础上,!vim 可以执行最近这条vim的命名。这个用在什么地方最好呢?如果你最近tail了某个文件,输入!tail就可以直接执行tail了,不用输入文件名
清屏命令:Ctrl + l,效果和clear一样
上一条命令和下一条命令:Ctrl + p,Ctrl + n,个人不是很喜欢用上下键,因为要移动右手,而且有些键盘需要按FN才有上下,比如hhkb-pro,不过这个仁者见仁,智者见智
暂停屏幕输出:Ctrl + s,恢复屏幕输入Ctrl + q,这个用来干嘛呢?类似tail时scroll lock
更多bash快捷键,请google

Read More