Category: Programming

  • [fabric]多种策略的工程同步

    继续接上篇。 理论上来说,rsync是最好的工程同步方式。只是和fabric自身的ssh登录没有整合,现在我找到了一个简单的解决方法。同时我也准备了其他两种方法:打包上传和远程svn update,这样加上不同步总共有四个部署策略。 解决rsync依赖主机名和密码的方法很简单:因为rsync是在本地运行,只要在rsync之前执行一个简单的远程命令就能获得主机名和密码。代码如下: remote_srcdir = ‘source’ run(‘hostname’) # simple workaround for host prompt local(‘sshpass -p %s rsync -pthrvz –delete –exclude=.git –exclude=*fabfile* –exclude=target . %s:%s’ % (env.password, env.host_string, remote_srcdir)) 这里写死是密码登录了,理论还有证书登录,暂时不考虑。 打包上传的方式,改造自upload_project import tempfile, os remote_srcdir = ‘source’ _, archive_path = tempfile.mkstemp() _, archive_name = os.path.split(archive_path) try: local(‘tar -cz –exclude-vcs –exclude=*fabfile* –exclude=target -f %s .’ %…

  • rsync与fabric

    接上篇。 最近学习rsync,突然想到自己之前使用fabric上传工程时与其用tar上传再解压缩还不如用rsync增量传输,后者可以更快。查了下fabric的文档,发现有提供几个方法: fabric.contrib.project.rsync_project(*args, **kwargs) fabric.contrib.project.upload_project(local_dir=None, remote_dir=”) 第一个就是使用rsync,第二个其实和我之前的方法一样采用压缩包传输的。rsync_project个人认为实际上就是local(“rsync xxx”)的模板,参数并不是很全。 但是使用了之后我还是考虑使用第二个方法upload_project,原因是rsync和fabric的ssh登录是分离的:rsync_project需要我重新输入一次密码,不输入的话就需要退化成local加上sshpass。再考虑到一开始可能没有输入密码,代码可能会变成这样: rsync_cmd = ‘rsync –exclude=.git –exclude=*fabfile* -pthrvz . -e ssh %s:source’ % env.host_string if env.password: local(‘sshpass -p %s %s’ % (env.password, rsync_cmd)) else: local(rsync_cmd) 如果不想输入两次密码的话,就必须在代码上或者命令行上写上密码,不是很安全。考虑再三,还是使用fabric提供的upload_project,虽然压缩可能慢一点。

  • 尝试用fabric部署应用

    说来惭愧,个人是最近才知道fabric的。但是一上手就觉得fabric非常不错,解决了我长久以来的部署问题。 原因我的部署方式是: 登录远程服务器 svn update/git pull deploy.sh 后来觉得把未测试的代码签入代码库不是很好,想直接复制本地代码到远程服务器上再部署,于是第一步变成了: 打包本地代码文件 scp到远程服务器上 在远程服务器上解压缩

  • 【开发提速系列】自己动手,丰衣足食

    之前几篇都是单个主题的,针对某一块内容。现在这里给出的是针对某些特定问题的解决方案,可能不是很通用,但希望对各位有借鉴意义。 Expect与数据拉取脚本 个人认为expect是一个将交互脚本化的工具。 我之前遇到如下问题:通过ssh登录使用动态密码并限制命令的服务器执行一系列操作。一般来说,动态密码和命令限制导致常规的自动化手段不能用的,手动肯定可行,但是个人不认为每天没脑一样重复输个十条一模一样的命令是一件舒服的差事。所以我尝试并选择了expect。典型的expect命令如下: set prompt “$ ” set password [lindex $argv 0] spawn ssh foo@bar.com expect “*Password:*” send “$password\n” expect $prompt send “foo” expect $prompt send “bar” expect $prompt exit 上面的代码通过参数输入password完成了不能直接自动化的部分,剩下的让expect帮忙输入即可。 如果说只是让expect输入几条命令,貌似没啥。实际上,我用expect是来拉取运行数据的,一次大概要输入42条命令。具体参见这里和这里。使用后拉取报告时间从2h急剧缩减到3min。吐槽一句,通过ssh拉取运行数据太原始了…… Attic与验收测试 虽然最近看了FIT的一些博客说,验收测试不是想象中那么好,但是个人使用的话问题不大。具体参见这里和这里,当然还有github上的代码主页。典型的脚本: http.SetUri http://www.google.com/search http.SetParam q foo selenium.GetBy htmlunit selenium.AssertCurrentTitleMatches ^foo.*$ selenium.Close 总结 至此,开发提速系列全部完成。可能由于自己工作时间不长没有太多新意或者干货,但是还是希望对各位读者有用。欢迎拍砖。

  • 【开发提速系列】使用NIX作为开发环境

    如果你不是专门做限制在Windows下的开发的话,试试在nix(mac osx/linux)下开发吧,有很多tip可以帮你提升开发速度。 编码问题 如果原先在windows下开发的,转到nix下之后可能遇到的第一个问题不是软件,而是各种编码问题。以下是一些常见问题的解决方法: ssh乱码 luit -encoding your_encoding ssh luit是一种临时性的解决方法,不用改变你的terminal的编码。encoding设置为远程服务器的编码。 文件内容乱码 想临时看一下的话,尝试一下 iconv。典型使用如: iconv -f file_encoding -t utf-8 input_file | less file_encoding为你input_file的实际编码,默认iconv直接输出到stdout。想要转发到文件,加个 >output_file即可。 文件名乱码 iconv不能用于文件名转换,你需要的是convmv。典型用法: convmv -f filename_encoding -t utf-8 -r directory 因为文件名转换不能类似iconv输出到stdout,所以convmv实际是需要你确认的。比如上面的命令只会尝试性地转换,除非你加上–notest参数。

  • 【开发提速系统】开发基础

    作为程序员最应该关注的几块之一。主要分IDE(Eclipse),构建工具(maven),服务器操作(linux)。 IDE 做Java开发常用的IDE是Eclipse,高效使用Eclipse对你开发提速立竿见影。 首先是快捷键,要像使用Photoshop一样记住常用的快捷键。 其次是减少不必要的鼠标操作,个人认为vi key binding/vrapper,emacs key binding/emacs+插件是几个不错的选择。 还有一些特定的点,比如使用m2e而不是每次都修改了pom.xml(maven的构建定义文件)后在命令行中mvn eclipse:eclipse,还有尝试使用eclipse默认附带的mylyn管理你的开发任务,聚焦你当前的工作文件(IBM的文章1,文章2)。 构建工具 对于大型项目来说,maven是个不错的选择。不过大部分人可能都没有深入了解过maven,我个人之前也是。如果你有时间的话,建议阅读一些maven的书籍。我个人在阅读之后了解到mvn deploy可以打包上传jar上定义在pom.xml中指定的repository上,原先我只知道通过mvn package再手动上传到repository。

  • 【开发提速系列】常规软件使用篇

    日常工作中使用的软件说多不多,说少不少。除去开发用的工具之外,个人认为主要是IM、浏览器、邮件客户端和文本编辑器。 IM 个人主要使用阿里旺旺。一个技巧是Alt + Q,快速发送信息给指定的人。否则要点开主界面,输入对方昵称,回车打开,再输入内容发送等大概四步,次数多了感觉有点麻烦。 浏览器 以firefox为例。 首先要整理好你的书签,便于你快速定位到你需要的页面。常用的网址使用目录定位比搜索更快,而且内网页面不能通过外部搜索访问到。 其次建议使用lastpass等同类工具管理你的帐号和密码。除了减少记忆负担之外,自动登录等功能真得很好用,特别是在内网没有使用SSO(单点登录)到处都是登录界面的时候。 第三,(mac用户请忽略)习惯于鼠标的尝试下鼠标手势,习惯于键盘控制的尝试下vimperator等插件。常规操作方式涉及界面定位,比如新开tab等,鼠标手势和键盘控制的话就不需要了。 第四,假如你希望改变常用的某些网页的界面和行为,比如一直显示搜索框,而不是某个固定页面显示,greasemonkey(chrome是tempermonkey)是一个不错的选择,适合想用firefox做一些页面hack的人。 邮件客户端 学习如何高效使用邮件是一门学问,这里我只给出我实践过的几点。 使用文件夹分类还是tag分类?个人现在用tag分类。针对需要跟进的邮件增加followup;需要保存时使用thunderbird按照月份存档;寻找某封邮件时按照标题,tag,关键字,发件人等搜索,这是使用最强大的邮件服务gmail时得到的经验之一。 文本编辑器 linux下面一般vim/emacs足矣,windows下notepad大部分时候不够。个人觉得sublime,notepad++挺不错。一般来说,开发用的文本编辑器一般要有编码支持,语法高亮等功能。不过,最重要的衡量标准还是顺不顺手。

  • 【开发提速系列】开始与工作环境篇

    准备想把这写东西当作分享讲的,不过试讲了一下感觉不好,还是写成系列博客吧。 原先演示文档大概有五十页的样子。部分和工作相关,写到博客中会有删减和改写。 虽然我们程序员有一台电脑和网络就能工作,但是为了更高效的工作,在最基础的地方花功夫也是值得的。 打字 打字速度很重要,对程序员的重要性有如手对程序员的重要。 提高打字速度是一个花功夫的过程,但个人觉得,不能忽视的是数字上的标点符号。如果你在打代码的时候还会用一指禅打标点符号的话,快点速成下标点符号的打字练习吧。 交换ctrl和capslock的位置

  • 并发,缓存与guava

    作为一个已经用了很长时间缓存的javaer,老实说到今天为止才真正知道缓存该怎么用。为什么这么说呢?考虑如下代码: public Object compute(Object key) { Object value = null; if ( (value = cache.get(key)) == null ) { value = compteValue(key); } cache.put(key, value); } 是不是很熟悉?典型的缓存客户端代码,但是这段代码是有问题的。问题不在cache,而在于这段代码本身。考虑如下的场景:

  • 简易顺序执行框架attic开发笔记2

    接上篇。 空格的处理 本来想自己写词法分析的,结果自己编译原理基础不牢固写出来老是死循环,所以使用opencsv。核心代码如下: CSVReader csvReader = new CSVReader(reader, ‘ ‘); String[] fields = null; while ((fields = csvReader.readNext()) != null) { // do stuff with fields } csvReader.close(); 这里使用空格代替CSV默认的分割符号冒号。