printf 的妙用

这天同事问了一个问题,shell 中如何重复显示指定数目的字符?例如显示 72 个等号(=)作为一个分界线。脑子里马上想到 perl 和 python 中这个实在是太容易了:

$ perl -e "print '=' x 72"
$ python -c "print '=' * 72"

但是 shell 中可没有这样的语法,想了半天,只想到一个利用 printf 命令结合 sed 的做法:

$ printf "%*s" 72 '' | sed 's/ /=/g'

"%*s" 这个 format string 后面的第一个参数是字符串显示宽度,第二个参数才是真正要显示的字符串(这里是空串),与 C 语言中的 printf 类似。

虽然这个 printf 有点妙,不过后面跟了个 sed 才算解决问题,作为一种脚本语言,Shell 有时让人觉得实在是太弱了。应该有更好的解法……

Jan 4, 2009 at 4:14am | 2 Comments
Tags:

uptime

一晃已经在新公司 uptime 满 1 年了,甘苦自知。最近特别忙,一是新一版本发布在即,二是忙着给人擦屁股。让别人听自己的意见来干活,比埋头只干自己的可难多了。好在鄙人的意见都是具有建设性的,都有眼见的好处,目前没人找碴。难受的就是自己眼里很轻松的修改,别人那里成了累活,站在一旁看着强大的 vim 活生生被当成 notepad 用,要不是现在涵养有进步,一定会七窍生烟。

稍微闲一点,才发现 VPS 的 uptime 已经 96 天了,从上次迁移主机之后没有再出现任何问题。这个在 vpsvillage 购买的玩具般的 vps,已经使用了近半年啦。除了个 blog 和 wiki 外,最主要的用途乃是在公司使用 ssh 隧道做 socks5 代理,连接 MSN、Gtalk 和公司安全政策禁止访问的各类站点 :cool:,慢虽慢点,但是自由的感觉更重要。做个广告,还在用 bluehost,dreamhost 虚拟主机的、别再受那种鸟气了,玩玩 VPS 吧。

Dec 14, 2008 at 12:58am | 6 Comments
Tags: and

简单任务 2 - 计算并替换

用 iozone 跑出来的文件系统性能数据,格式示例:

# file-size     initial-read
1k 3029.832
2k 3010.015
4k 3223.711
8k 3303.412
16k 3488.440

简单任务:将 Nk 替换成 N*1024 的结果,m 和 g 依此类推。目的是要对处理之后的结果用 gnuplot 作图。

用正则表达式很容易匹配目标文本,但可惜不能直接计算。我的解法是先将整个文本替换成一个可执行的 shell 脚本 - 第一行插入 "cat << EOF",最后一行添 "EOF",中间的 k, m, g 替换成 "$((..))",然后用 shell 解释执行,利用 shell 进行计算。有点土,不过至少可以方便批量处理。

sed -e '1i\cat << EOF' \
-e 's/\b\([0-9]\+\)k\b/$((\1*1024))/g' \
-e 's/\b\([0-9]\+\)m\b/$((\1*1024*1024))/g' \
-e 's/\b\([0-9]\+\)g\b/$((\1*1024*1024*1024))/g' \
-e '$i\EOF' \
iozone-out.txt | bash

将 sed 表达式写到一个单独的 .sed 文件,可方便批量处理。再完善一点就先把 $ 和 ` 转个义。

for f in *.txt; do sed -f x.sed $f | bash > $f.new; done

谁有更好的解法?

Nov 24, 2008 at 9:50pm | 0 Comments
Tags: and

简单任务 1 - 合并连续的空行

学无止境。很多以前觉得正确的、好的方法,随着知识的积累、见识的长进,可能会变得不再正确或者最好。这在我脚本编程、工具的使用方面犹为明显。我计划将这作为一个主题,将平时遇到的“简单任务”和解法记录下来,日后有更好的方法再更新。

简单任务 - 将多个连续的空行合并成一个空行。来自一个实际问题:打印一个很长的 RFC 文档,希望能省一些纸张。

很久以前就遇到过这个问题,因为发现 sed 不能匹配 '\n',当时的解法是写了个 shell 脚本处理。Vim 可以用 '\n' 匹配换行符,解决方案是:

vim '+%s/^\n\+/\r/g' +x rfc.txt

考虑空行上可以有空白字符的话,还能再完善一点:

vim '+%s/^\(\s*\n\)\+/\r/g' +x rfc.txt

这是目前的“最佳应法”,欢迎提供更佳的解法。

特别鸣谢:刚开始缺少 '^' 怎么都不能成功,经老婆指正方才解决。你怎么也想不到,我老婆作为一个文科生,竟然能把 vim 使得出神入化,还在她们公司内部做了一个四十分钟的讲座!

Nov 23, 2008 at 9:12pm | 3 Comments
Tags: and

用 iMacros 成功约到周末练车

iMacros 简单的说就是一个基于浏览器的录宏回放插件,利用它可以模拟任何人工的点击,除了手工录制,它还提供一套简单的脚本,还有 javascript,vbscript 等接口方便进行复杂的逻辑控制。听说了这个插件后我就在琢磨怎么用来自动网上约车。

我报的是东方时尚驾校预约计时班,网上约车每天从早 9 点开放到晚 9 点,只能约 7 天以内的。一般周末约的人非常多,我这次因为周末外出不能上网,错过了约车的时机,只能等人退订了我再抢,这个机会非常小,但还是有可能。

断断续续研究了几个小时,终于写出了一个 javascript 脚本调用 iMacros 的接口,并且大约半小时就成功抢到了退票,呵呵。

大概总结一下:

  • Firefox 版本的插件安装地址
  • 录制很简单,点击 record 然后鼠标键盘正常操作,结束后按 stop,然后查看脚本源码,获得第一手感性认识,然后可以对照手册自己添加一些代码
  • SET !REPLAYSPEED FAST 用来设定回放速度为最快,即执行语句中间不等待
  • SET !ERRORIGNORE YES 用来忽略错误
  • REFRESH 用来刷新页面
  • WAIT SECONDES=3 等待 3 秒
  • ONDIALOG POS=1 BUTTON=CANCEL CONTENT= 看到弹出窗口后点 Cancel

写 js 用到的接口:

  1. iimPlay("CODE:...")执行 iMacros 的脚本语句,语句可以是一段,必须以 CODE: 开始,行间要用 "\n" 分隔,返回值为负数代表执行有错
  2. iimGetLastError() 返回最近错误对应的错误信息(字符串)
  3. iimDisplay(msg) 以独立对话框形式显示一个消息
  4. SET 语句只在一个 CODE: 块中有效
  5. Tag 未找到时会默认会等待 !TIMEOUT /10 这么常时间,默认值就是 6 秒
  6. 不支持使用 document.getElementById() 来判断 tag 是否存在

有了这些就可以用 js 来处理复杂的逻辑控制,我是在先在一个循环中登录,直到登录成功,然后点击预约按钮转到约车界面,然后点击相应的表格,表格对应的 id 可以直接查看源码得到,或者用 Web DeveloperColorzilla 等插件查看,判断返回值可知是不是约成功了,成功之后再点会变成取消,所以要增加 ONDIALOG 语句来点击 Cancel 按钮。

Oct 30, 2008 at 1:37am | 7 Comments
Tags: and

没想到法培考试系统是 Linux

今天考交规,考试机器开机后直接看到启动自举画面,很意外考试系统竟然是基于 Linux 的,kernel 还是 2.6.12,banner 是 Intel 什么的,没记住。大约是从网络 DHCP 拿到地址后直接 tftp 下载内核 image 然后解压引导,这部分我饶有兴趣的看了半天,不过 kernel boot 过程的输出全被关了,最后屏幕变全黑,中间出现一个叉叉形状的鼠标,原来是熟悉的 X,没想到考试系统还是个 X 程序,更没想到从这个叉叉鼠标到出现程序界面竟然要那么长时间,没看表,不过足足有六、七分钟,半柱香的时间了吧?

很快的做完,没有检查,直接交了卷,得 91 分,惊险,不过对得起我付出的那点时间了。

因为身份证没有领回,今天考试用的护照作证件,效果很不一般,监考以及考后给我办手续的都很恭敬地问:您是外籍吧? :cool:

Oct 14, 2008 at 9:00pm | 1 Comment
Tags:

面试不该做的两件事

今天的面试结束后,我的一位同事事后对面试者的评价是:“超级自信”,“进门先面试了我”,原来那家伙进门先问他叫什么,中文名怎么写,之前是哪个公司的。

我面试的那个则更离谱。由于时间比较充裕,我给了他大块的时间介绍自己的项目,此君说的泛泛,但是越来越 high,大概是觉得我不懂他做的东西,感觉很好,竟然闪起腿来。

结果是这两个人得分都不高,虽说真正原因还是技术方面,但是主观印象也不可忽略。

Oct 9, 2008 at 7:16am | 1 Comment
Tags:

出头

在围棋里边,棋要尽量避免被对手封住,因为一旦被完整地封住,轻则难有发展,重则需委屈求活甚至有性命之忧,即使活了也难免将来被两面搜刮;反之,出头了可以牵制对手的模样,进可发展实地,退可固守眼形,如此才是棋道。

我要说的并不是围棋。在外企干活,有个叫“visibility”的东西跟这个道理很像。组里有个同事最近升职了,在我们同组的人看来,他代码写得不怎么好,设计思路像初学者,工作效率也不高,答应的事情经常不能按时完成,但人家就是这个 visibility 好,敢于承担(做得好不好再说),勤于和各种 lead、manager 打交道,从他们的角度看,这个人很活跃,有潜力,要升就升这样的人。

这里要先给各位扫扫盲,据我的经理介绍,业内有一种理论,认为员工的潜力、表现和职位要求可以用下面这种九宫格来描述:

Potential
^ | |
| | A | C
| | |
|------+------+------
| | |
| | O | B
| | |
|------+------+------
| | |
| | |
| | |
`------'------'------> Performance

O 位置表示职位要求,C 位置的人就是潜力和表现都超过职位的要求,这种人该升职、加薪,这个很显然。那么 A 位和 B 位的人哪个更应升职?答案是 A,就是说,从经理的角度看,处于 A 位的人可以让他承担更多的责任(潜台词就是更利于经理在自己的 career path 上爬梯子),B 位的人应该期望加薪而不是升职。

明白了这个道理,剩下的就看你的了。:P

Sep 30, 2008 at 9:42pm | 3 Comments
Tags:

其实我是个 C 程序员

最近开始修改其他人的 ksh 脚本,边改边庆幸不是跟这些人一起用 C 开发程序。在下虽然现在只写脚本,但是用 C 时养成的习惯已经在脑中根深蒂固,不管看什么程序,最见不得与自己习惯相违背的代码。shell 虽然很灵活,但有些一般性的原则总不能不遵循吧?试举数例:

  1. 函数定义一会 function f 一会 f(),其实两者区别很大,就算没搞清楚,保持一致应该不难吧?
  2. 函数内部变量不加 typeset,到处都是全局变量
  3. 代码缩进风格不一致,空格和 TAB 混用?建议大学程序设计入门改成教 python,先学会写整齐的代码再说。
  4. 变量名字这里大写那里小写,时不时又出来个大小写混合,还好你没听说 camelCase
  5. 重复代码宁愿贴来贴去,也不抽象出一个函数
  6. 函数不加返回值,有返回值的也不检查
  7. 公共函数不加注释,不检查输入参数
  8. 不检查空串,经常出来个 awk syntax error,或者 grep 等在那(因为输入文件名为空)
  9. set -x 不删除就提交了
  10. log 语句太少,阅读 journal 是不够的,出错之后看源码是必需的
  11. 临时输出宁愿重定向到中间文件,而且文件名是个随意的

据说美国人曾抓住一个前苏联高级间谍,审问的几个人故意当着他的面作出各种愚蠢假设和推理,最后间谍听不下去,招了。让一个严谨的程序员抓狂的,莫过于阅读有上面这些类问题的程序。

Sep 3, 2008 at 6:07am | 1 Comment
Tags:

玩玩开源

将以前写的一个 Code Review 小工具放到 Google Code 上了。放上去一是玩玩开源,体验一下 Google Code 的功能,二是发挥它的“萤火之光”。东西是很简单,但是前同事离职创业的时候把这个东东拷回家了(偶然在他的电脑上看到 :-),让我觉得这个小玩意还是有点用的。

类似的工具很多,但要么不通用,例如 Sun 有个 wx webrev 全套工具很好用,可惜只支持内部的代码管理工具,要不就是太大,例如 Review Borad,太庞大了。而我这个刚刚好,简单说一下就是提供一个工具可以比较两个文件或者目录,生成各种格式 diff 的静态 html 页面,另有有一个 wrapper 脚本可以在当前 svn 工作目录从还未提交的修改生成代码复查的 web 页面,比原始的 diff -r 或者 svn diff 好读得多,反正用在我们自己项目里面非常方便。

增加其他版本控制工具的支持也不难,但是我们现在用 svn,所以我就先不给自己找麻烦了。其他就看主页 coderev 吧。

(Update on Aug 23, 2008) 将版本控制相关的命令抽象了一下,定义了一些 entry point,SVN 和 CVS 的操作放到单独的 lib 里面实现,很像驱动程序了,呵呵。这个设计我自个很满意,写好了之后加个 CVS 支持只花了几分钟,等用到 git 的时候相信也能很快实现。

Aug 20, 2008 at 1:01am | 3 Comments
Tags: and

← Previous  1 2 3 4 5 … 25 Next →