Loading...

急就章

Filed under: 随笔 — 深柳堂主 @ 2008-02-15 23:02:18 Comments

善始善终,不能始乱终弃……

1. fanfou.com

原来准备写一个fanfou的工具,现已实现了理想中的大部分功能。关于分享、私信的处理,暂时不在我能力范围之内。不过,倒是有很高的兴趣来学习。

现在觉得,使用Php写这样的工具,把这样的工具放在自己的blog空间上,是不太好的选择。这与采集工具一样,会占用太多的资源,尤其是作为网络程序,不好控制。我曾经设想使用推荐制,限时制,乃至会员制,来限制饭友的使用。但是无论哪种方法都大大地与我的初衷背道而驰。网络给予人的是自由,而不是这样或那样的限制。

现在觉得使用本机版程序是比较好的选择。这样一来,占用的是用户的CPU和带宽,不会对某一服务器造成太大冲击--如果有的话,也只能是可怜的fanfou.com了。不过,我对它的潜力抱积极的乐观态度。

还有一种方法,就是伟大的开源方式了。我准备在做出完整的本机版程序之前--这可能需要太长的时间--先把源代码无私地公开出来,事实上我早已经这样做过了。如果您读过批量抓饭脚本:一次性打包输出自己全部的饭否消息!的话,您知道我在说什么。

我计划把与之相关的几个函数写出来,主要是curl:远程文件的抓取,sqlite:数据库的打开,建立,保存,regex:使用正则表达式对文本进行深度解析。附上详尽的解释,尤其是regex部分。

为什么要先写计划,而不是先完成呢?因为本文的主旨是“善始善终,不能始乱终弃”,我写在这里,防止自己食言而肥,因此立此存照。

2. yeeyan.com

最近在yeeyan.com搜索到自己喜欢的一篇文章,正在翻译。已经完成85%+了,剩下的部分是硬骨头了。我的目标是“举重若轻”,争取把长难句也翻译得不显山不露水,风过了无痕。

目的:别把英语扔远了;把学英语跟兴趣爱好联系起来;做出一点点贡献,增加一点点人气和点击量;为自己干瘪的blog增加内容。

善始善终,不能始乱终弃;防止食言而肥,立此存照。

3. iRegEx.org

早就有建立正则表达式网站的雄心,一向摩拳擦掌,苦练内功,http://fanfou.com/regex就是明证之一。经常在chinaunix潜水的我,前两天突然发现,www.regex.net.cn悄然开张了。就差一步呀!我像彪哥对着泰勒的“尸体”那样滴下了发自肺腑、痛心疾首的泪。为了促成跟该网站的良性竞争,防止它垄断坐大,我毅然决然地推出了自己的网站。由于现在刚刚开始布展,一切都还没有做成熟,一向低调的我就不在这里大事张扬了。我先不告诉大家我做的网站叫“爱正则”。等我做好了,再向大家公布!

善始善终,不能始乱终弃;防止食言而肥,立此存照。

批量抓饭脚本:一次性打包输出自己全部的饭否消息!

Filed under: 编程 — 深柳堂主 @ 2008-01-27 18:03:06 Comments

一直盼望哪位大侠能写个“批量导出饭否消息”的程序。请教过郭万怀,fanfou还没有批量导出全部消息的api。现有的api最多只能导出20条消息。于是我使用perl+curl实现了全部抓取的功能。现在还是perl脚本版的。有对话框界面的不急,慢慢来。

已经实现的功能:

  • 根据fanfou id,批量导出fanfou消息。
  • 导出的内容有:fanfou消息本身,该消息发布的时间,该消息的id号,形如oj1Wil-g4wk。

Todo List:

  • 做成gui版的。
  • 批量删除、分享(自己的消息)。
  • 使用sqlite实现本地存储、sql语言查询。
  • 支持标签分类。需要在发布消息时在消息开头或末尾加上[]、[]等分隔符。

如果您想批量导出自己的fanfou消息,同时知道如何运行perl脚本,那么直接改动下面的脚本即可;如果您不愿自己动手,我可以代劳。您只须加我(zhasm)为好友,然后饭密我一条消息,发个请求即可。这是为了保证您要抓取的,是您自己的内容。敬请谅解。我会在最晚2个工作日之内发给您。

饭密给我的消息,可以包含如下内容:

  1. 您的邮箱。
  2. 分隔符,默认是tab,您也可以;、,诸如此类。
  3. 序号(1-N,还是N-1.默认是n-1)。
  4. 是否加上时间戳。(默认包含)。
  5. 是否加上消息的id. 此处指的是fanfou为您每一条消息自动生成的形如oj1Wil-g4wk序列号。如果您不明白此为何物,可不必包含此项。如果批量删除或批量分享,则保留此项。

好了,以下是代码部分,附有注释。您如果在您的机器中运行此代码,需确保安装有WWW::Curl::Easy模块。需要说明的是,该脚本的运行速度取决于网络速度与机器自身速度。在我的机器上,抓取700余条消息大约花费3分钟时间。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#!/usr/bin/perl -w
#
# this script is to grab all the fanfou items for the given id.
# rex.zhasm rex[at]zhasm[dot]com
# 27 jan 2007
#
#
 
use strict;
use WWW::Curl::Easy;
my $output="output.txt";
open(OUT,">$output") or die "can not open file to out put!";
#print all the messages into the file: output.txt";
 
my $id="zhasm";			#specify the user's id.
my $url = "http://fanfou.com/".$id;
 
# Init the curl session
my $curl= WWW::Curl::Easy->new() or die "curl init failed!\n";
$curl->setopt(CURLOPT_URL, $url);

从asm到perl,我的编程之路

Filed under: 编程 — 深柳堂主 @ 2008-01-17 13:35:06 Comments

我首先知趣地声明:本人对编程只是有着叶公之好的门外汉,此处只表达本人粗浅认识和想法,充满着大惊小怪的大呼小叫;见怪不怪的业内大牛请绕行。

asm篇:暗黑破坏神

余生也早,接触计算机却晚,是在01年4月份与计算机喜结良缘。大约是02年,刚喜新厌旧地把basic扔到一边,在自学C语言。听人吹嘘asm的强大(硬件级控制),心痒难耐。那时觉得,只要学习了asm,基本上直接就进入黑客大牛级别了,就仿佛刚上学前班的一个牙牙学语的儿童,忽然得知了一条保送清华博士后的捷径。

那时引以为自豪的是当时用turbo C编写了一个黑白棋程序。我的梦想是把它转换成asm语言版本和vc版本。使用asm是为了锻炼自己功力,使用vc是为了把编出来的程序让别人使用。毕竟,在dos界面下编写和运行程序,总觉得寒碜得掉渣。

买了本清华的汇编教程自己啃。一上来就是胡天胡地的寻址和林林总总的中断。太抽象了。后来在西单买了本影印版的《IBM PC汇编语言程序设计》。两相比较,感觉清华的书像是写给业内人士的,适合当作reference;而IBM这本书,读起来才是写给初学者的tutorial,引导你一步步入门。虽然是影印版,但是用到的生词也就那几个,记住之后一劳永逸,比起清华的佶屈聱牙不知所云还是好懂多了。这一阶段的猛攻为计算机英语阅读打下基础。以后我接触的其它编程资料,都是直接阅读原版,资料比翻译过的更齐全,更权威。

把这本书啃完,觉得8086的历史已经一去不复返了,32位平台下的编程才是正途。

于是也搜索到了Iczelion’s Win32 Assembly教程。逐一细读,测试,天天泡罗云彬的汇编乐园,aogosoft的bbs,老罗的缤纷天地。masm32 gui 的问题也解决了,写出了几个自娱自乐、自给自足的小程序。对masm32+数据库(ODBC)的编程上,也有了自己的一点心得。

当时学asm,还有一个很XX很XX的念头在里面:破译注册码。这是最令初学者心动念头,在人前摆酷也是立杆见影。有一点点汇编的底子,入门还是不费多大力气的。最简单的是爆破,就是找到类似 if(测试码正确) 的地方,改为if (测试码不正确)。不过,最有成就感的,还是调试,跟踪,找出算法,写出注册机。我当时最高成是,为豪杰解霸家族的一系列产品作出一个N合1的注册机。当然是只限于测试使用,没有傻到把它发布到网上去。时间应该是2003年,托非*典的福,我有足够的时间来潜心跟踪算法。再往后,就对破解这个领域失去兴趣,就跟孙悟空跳到了如来的掌边,画个到此一游的记号,撒泡尿就回来了,没再往前跨出一步。

Perl篇:仙剑奇侠传

我一直纳闷(和庆幸),在原来我们的大学里,这所纯文科的学校图书馆,怎么会有perl的骆驼书。我只是好奇地翻开看了几眼,却与perl结下不解之缘。由于知道了一点点perl的语法和正则表达式的皮毛,我才拥有了文本解析的强大武器。正如Jeffrey Friedl在他的《Mastering Regular Expressions》里面说的,“一旦你拥有了它,就会不由自主地想,在没有它的日子,我可该怎么过”。在此之前,我曾幼稚地以为,哪里需要什么与正则表达式,notepad和m$word里的搜索替换功能不是挺强大的么?

自学计算机知识以来,给我震撼最大的两样东西,一是二叉树,另一就是正则表达式了。前者为我解释了在海量数据中如何快速精准定位的理论实现,后者为我展示了高级搜索替换的不二法门。1024个数据,如果按照二叉树作好排序,可以最多只比较10次,就能找到所需数据。大量文本,只需要一条s/patterns/newvalues/g;就能把内容全部替换为目标值。(虽然它对ASCII码类的支持,比UNICODE的支持,更自然一些。谁让这是洋鬼子发明的呢?)我像菩提门下那只手舞足蹈的猴子一样,满心喜悦,溢于言表。

以我迄今所知,只有perl这种语言,能与正则式无缝链接。其它的语言跟正则表达式之间,都有着隔靴难搔之痒。从asm的角度来仰望perl,简直不可思议。比如正则匹配的if ($var =~ /regexstring/),比如散列赋值的$hash{key}=value…这种感觉,仿佛是瑞士手工作坊里的老钟表匠,到日本参观了现代化的电子表生产线:自己一点点地实现,并非不可能,或许还能细心、从容、优雅地打磨得更精致;但是如果想提高效率,则非生产线莫属了。你知道每一个细节的原理流程,你知道每个齿轮精确到微米的直径,你的手感比灵游标卡尺还要灵。可是,你做得慢腾腾。

我是如此地醉心于perl的语法,时常编写几行程序满足自己对文本解析的需求,在windows/linux中都不在话下。但是,如果不只是自娱,还要“愚他”的话,就该考虑gui了。asm的gui我熟,因为它走的是c语言的sdk+api的路子,教程多多,而且有庞大的MSDN作后盾,不愁找不到资料。这是一条根正苗红的贫农路线。但是对于perl,想实现gui,该何去何从呢?

我曾经退回到asm阵营来,尝试让masm32+gui支持regex,自己写过引擎,以失败告终。但是即使支持了regex,能高效地实现散列么?perl高效的语法让我的asm自惭形秽。是呀,perl曾经放过豪言:perl一句,顶其它语言数十数百句(这是从语法简洁度上来说的,跟执行效率不成正比,跟政*治更不搭边,不许联想)。

于是,我尝试了tk,但是感觉不爽。之后热情冷却下来,在perl和asm之间游离。终于,又发现了wxWidget。在语言上,它支持c++,c#,Python,Perl;在平台上,它支持Windows,*nix,Mac。不错,很不错。我就是需要这种两栖乃至多栖的东东。

书从疑处翻成悟

正如书中交待,wxPerl的特点是:It is less Perlish – but it’s more OO。对于怪异的语法,我有独到的武器:手抄代码。这仿佛是“理解的要执行,不理解的也要执行。在执行中加深理解。”

这一武器,我在c中用过,在c++中用过,在数据结构中用过,在asm中用过……结论是屡试不爽。我一遍一遍地读代码,抄代码,思考代码,改变一点点,加入一点点,自然就理解了。渐悟和顿悟的感觉都很爽。就像多年前有次做完家教返校途中,公交车上,我突然理解了MFC,哦,原来就是封装呀。假我以时日,我也能把masm32封装成面向对象的,高度集成的MF·MASM32。那一刻,我有着与阿基米德从浴缸中跳出相类似的喜悦和冲动。虽然自己编写MFMASM32,就跟“给我一个支点,我就能撬动地球”一样,是以把自己的能力夸大无数倍的前提下发出的豪言壮语,但是侧重点在于“寡人悟到了!”这个悟的过程以及所悟到的内容的理论可行性,带着难以言表的快乐,与微微的自豪感。

屠龙之技

我一直把编程及其相关的学习当作业余爱好来对待的。有时也在反思,是不是为了不必要的富兰克林的哨子,花费了太多的代价。业余时间,有人爱看球赛,有人演算哥德巴赫猜想,有人背诵圆周率,诸如此类,热衷于各类不损人不利人的活动,并能从中找到让自己满足的小快乐。以前读过毛姆的一本书《刀锋》,不明白那个经历过生死,周游过世界,读过了吠陀经,最终领悟了人生真谛的拉里,为什么想去做一名的哥来了却残生。现在想来,也不错。

提供中英文对照的正则表达式cheatsheet的pdf和png下载

Filed under: 编程 — 深柳堂主 @ 2007-11-29 21:45:06 Comments

正则表达式是我比较喜欢的编程工具之一。近日在网上发现了regular expressions cheat sheet的PDF版,于是翻译成中文,放在这里与大家分享。同时还推出了PNG格式,分别放在flickr和yupoo上。

该sheet上的正则表达式是perl风格。内容包括了Anchor,POSIX,Assertions,Quantifiers and Quantifier Modifiers,Escape Character and Metacharacters,Special Characters,Groups and Ranges,Pattern Modifiers,以及一些例子。

翻译时,一些术语参考了何伟平译的《Perl语言编程》第3版,并保留了原有英文(例子部分除外,以节约篇幅)。

由于没有搞到源文件,文档的制作是使用foxit pdfeditor 2.0,而不是使用最喜爱的latex。不过,我也给原作者发了Email,希望能早日收到回复。大家请访问他的主页,那里还有更多的cheat sheets。都是英文的,原汁原味。

好了,以下是深柳堂主http://zhasm.com推出的资源。

注:由于foxit pdfeditor的编码问题,发现该文档在ubuntu下阅读会出现乱码。对此深表遗憾。只能等待得到latex源码后才能彻底解决该问题。作为变通,请下载png版本。见谅!

由于中文字符原因,仅支持adobe reader(windows/linux均可),但是不支持(xpdf, evince,foxit pdfreader)。请下载png版。文件更小,解析度也不错。

点此下载PDF版(任一)(132K):

  1. 在boxstr.com上:regex cheat sheet
  2. 在mediafire上:regex cheat sheet

点此下载PNG版(155K):

  1. 在flickr上,点击看大图

  2. 在yupoo上,点击看大图

最后,再推荐一个.net的regularexpressions cheat sheet地址

——————————————更新分割线——————————————–

13.Dec.2007:

提供sed_awk正则表达式之PDF手册下载。从网上搜索到的,6.5M。扫描版,质量一般。请点击:

windows下的绿色unix工具集UnxUtils以及个人补充

Filed under: 编程 — 深柳堂主 @ 2007-11-26 10:29:27 Comments

注:本文所提及的工具附于文后。

假如你用惯了linux,那你很有可能跟我一样,是被一堆个头不大,却是精明能干的小工具所吸引的:im, ssh, perl, grep, agrep, fgrep, sed, wget, agrep, unzip, cp, mv, rm (我常用的,也就这些)……这些工具在windows不是不存在,只是有的工具加上了gui界面,个头太大;有的改成了彻头彻尾的windows版。这一切,让人感觉,不爽。

可是,你值得安装一整套cygwin么?你有必要安装虚拟机么?当然没必要。本文要介绍的,是一组小巧的实现方案:UnxUtils。自14-04-2003年4月14日之后,它有了升级版本,但是仍然都是03年、04年的作品。只要你需要,就不妨拿来用,不要因为它陈旧而轻视它的实用性。

下载UnxUtils以及UnxUpdates之后,解压到自己中意的文件夹,把\usr\local\wbin文件夹的绝对地址加到

我的电脑(右键)->属性->高级->环境变量->系统变量->path值

注意,在所加的地址之前,应该有个分号“;”以示区分。这样,你随时随地就能打开一个”cmd”console,使用如下工具:

agrep.exe; ansi2knr.exe; basename.exe; bc.exe; bison.exe; bunzip2.exe; bzip2.exe; bzip2recover.exe; cat.exe; chgrp.exe; chmod.exe; chown.exe; cksum.exe; cmp.exe; comm.exe; compress.exe; cp.exe; csplit.exe; cut.exe; date.exe; dc.exe; dd.exe; df.exe; diff.exe; diff3.exe; dircolors.exe; dirname.exe; du.exe; echo.exe; egrep.exe; env.exe; expand.exe; expr.exe; factor.exe; fgrep.exe; find.exe; flex.exe; fmt.exe; fold.exe; fsplit.exe; gawk.exe; gclip.exe; gplay.exe; grep.exe; gsar.exe; gunzip.exe; gzip.exe; head.exe; id.exe; indent.exe; install.exe; join.exe; jwhois.exe; less.exe; lesskey.exe; libfl.a libfl.lib ln.exe; logname.exe; ls.exe; m4.exe; make.exe; makedepend.exe; makemsg.exe; man.exe; md5sum.exe; mkdir.exe; mkfifo.exe; mknod.exe; mv.exe; mvdir.exe; nl.exe; od.exe; paste.exe; patch.exe; pathchk.exe; pclip.exe; pr.exe; printenv.exe; printf.exe; ptx.exe; pwd.exe; recode.exe; rm.exe; rman.exe; rmdir.exe; sdiff.exe; sed.exe; seq.exe; sha1sum.exe; shar.exe; sleep.exe; sort.exe; split.exe; stego.exe; su.exe; sum.exe; sync.exe; tac.exe; tail.exe; tar.exe; tee.exe; test.exe; touch.exe; tr.exe; tsort.exe; type.exe; uname.exe; unexpand.exe; uniq.exe; unrar.exe; unshar.exe; unzip.exe; uudecode.exe; uuencode.exe; wc.exe; wget.exe; wget.hlp which.exe; whoami.exe; xargs.exe; yes.exe; zcat.exe; zip.exe; zsh.exe;

根据自己的需要,我加入了自己常用的三个工具:vim,perl,ssh。

  • vim建议直接安装完全版,它自己就包括了console版和gui版。
  • perl:如果用得频繁,用得深入,建议你安装完整的active perl。但是,如果你只是使用正则表达式进行一些简单的文本处理,不用它的其它库的话,从activeperl里提取两个文件足矣:wperl.exe,perl58.dll。它能完美地运行我80%的脚本。使用它来预处理latex源文件,简单高效。(有一个小bug要事物声明:如果该程序没有任何输出的话,仔细检查你的程序吧!它不会提示你出错,而是学习甘地,以非暴力不合作的姿态进行消极罢工。)如果你vim用得好,处理文本只用vim也可,虽然它的正则式风格怪怪的。
  • ssh:我使用过putty,但是它还要自己开一个console,与windows自带的consol不兼容。现在使用OpenSSH for Windows,发现这是一个比较好的选择,与以上环境更融洽。我提取出一个ssh.exe,以及5个dll文件,就能完整地运行ssh客户端,远程操作自己的dh主机了。wget & unzip下载wordpress、安装插件,速度快得吓人;vim修改文件,也比使用ftp再edit快捷直接得多。

由于没有使用python,上面的方案就没有python的份了:( 如果你需要,自己在以上方案的基础上加以改动,应该可以。至于apache+php+mysql,这些都体积庞大,功能独立,有其集成解决方案,不在本文讨论之内。

以下是本文提到的各工具的官方地址:

其中,由本站http://zhasm.com修改过的文件在此:(使用了国外的存储空间;教育网用户需代理)

  • 精简版的perl(400Kb):wperl.exe,perl58.dll:点此
  • 精简版的ssh客户端(1.7Mb):点此
  • rex.zhasm自己使用的UnxUtils文件(5.5Mb),包括了上述的perl与ssh:点此