Loading...

从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,就跟“给我一个支点,我就能撬动地球”一样,是以把自己的能力夸大无数倍的前提下发出的豪言壮语,但是侧重点在于“寡人悟到了!”这个悟的过程以及所悟到的内容的理论可行性,带着难以言表的快乐,与微微的自豪感。

屠龙之技

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

新年计划

Filed under: 随笔 — 深柳堂主 @ 2008-01-08 10:14:04 Comments
  1. 平均每周写一篇日志。全年写50篇。我不是快手,不是话痨,这个目标不算高,但是比较符合自己。有话则长,无话则短。坚持原创,非自己原创的文章不转贴到blog中。[blog]
  2. 继续学习和使用windows控件。现在正在学习的是treeview和tabcontrol,基本入门。有精力的话,再学习“编写 Windows 标准控件”的内容。[programming]
  3. 再学习一种新的界面编程方式,例如wxPerl。[gui programming]
  4. 正则表达式的深入理解。把以前的烂尾工程做完(一年之内能否完成呢?)。有精力的话学习编译原理。[regex]

立此存照。

fanfou vs twitter, base64 vs tinyurl?

Filed under: 编程 — 深柳堂主 @ 2007-12-30 01:33:31 Comments

在fanfou上与网友分享链接时,链接表面显示的是你所输入的网址,可是,这只是障眼法;实际上,当你点击链接时,fanfou是按如下格式把你带到目的地的:

http://fanfou.com/linkto/aHR0cDovL3poYXNtLmNvbQo=

仿佛是你给了A地的女朋友一张地址纸片,约她按纸片上的地址到B地找你。可是,她上了出租车,司机却从A地出发,绕经C市,才又到达B地。明明A到B有直线可以经过,为什么还要取道C地呢?女朋友并没有因此而来迟多少时间,可好奇而细心的你却想弄清究竟。

我怀疑linkto之后是加密了的网络地址。至于加密算法,既然大小写并存,还有等号在里面,那么80%是base64了。验证之后,果然如此。我把另外一个网址也做成fanfou的格式,如下:

http://fanfou.com/linkto/aHR0cDovL2NvZGUuemhhc20uZ29vZ2xlcGFnZXMuY29tCg==

至于什么是base64算法,可以参考这里,此文言之甚详:老罗的矛与盾的较量(4)——奇妙的Base64编码

至于为什么fanfou采用base64,推测如下:

  • 为了使网址格式统一,
  • 更美观,避免出现乱码
  • 被访页面从统计工具上显示页面来源是fanfou,可以增强fanfou的知名度,满足fanfou的虚荣心 :)
  • 这种算法速度较快,可以迅速生成,立刻指向。
  • 这种算法可以起到简单的加密作用,同时解密也简单(可逆)。

但是,这种方法造成的后果是,fanfou所生成的地址太长。

例如,请对比下面的原始网址和fanfou链接:

http://3.1415926535897932384626433832795028841971693993751058209
74944592.com
/
http://fanfou.com/linkto/aHR0cDovLzMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzMzg
zMjc5NTAyODg0MTk3MTY5Mzk5Mzc1MTA1ODIwOTc0OTQ0NTkyLmNvbS8

好了,fanfou的事情告一段落,那位司机师傅也清白了:他没有私自带着别人的女朋友去不可告人的地方,而是统一按公司规定,先向公司告目的地,然后从公司取得统一的行程安排,所去的地方正好是原来的目的地。整个过程是安全而透明的,事先有计划,事中有记录,事后可追溯。

我们再来看一下fanfou的国外兄弟twitter是什么解决出租车路线问题的。

我把本文原创作者rex.zhasm的blog地址放入twitter,所产生的链接是:

http://zhasm.com

把刚才那个pi的超级变态网址放进去,仍然是原状:

http://3.141592653589793238462643383279502884197169399375105820974
944592.com

于是,我又进行更血腥暴力的实验:

http://www.iol.co.za/index.php?from=rss_Twitter&
set_id=1&click_id=79&art_id=nw20071229175550951C275909

地址放入twitter 中,产生的新的链接是:

http://tinyurl.com/2d39×2

之后把一个新浪博客的文章扔进去,链接还是tinyurl的。

原来是这样呀。我们对twitter作了不完全调查统计,至少有一部分网址转向符合以下规则:

  1. 如果网址是一级域名,即使长一些,也要完全显示。
  2. 如果网址是二级域名,或者是一级域名引申出来的链接,那么把链接改成tinyurl格式。

如果还用出租司机的例子做类比,就变成这样了:

司机先看看你去的地方是不是不拐弯能到的。如果您从长安街东头,一直坐到长安街西头,那么司机很爽快地把您送到目的地;但是,如果您要在中途拐哪怕一个小弯,对不起,咱做不了主,您得登记,按行业规定的路线送过去。

至于路线的安排,则是由tinyurl来制定。它所制定的路线是最短的,无论是http://zhasm.com这样短的路线,还是像刚才的pi一样的路线,都能压缩成http://tinyurl.com/yveppt这样短。

tinyurl这样的做法,其算法应该是不可逆的,根据所输入网址hash出一个N位的关键码。(不分大小写的英文字母,数字)。根据简单的数学原理,N=6时所记录的容量是:

36^6=2,176,782,336,即2个billion多。

根据一篇道听途说的文章: 第19次互联网报告之中国网页总数44.7亿个(2007年01月23日10:13)。 但是你想想看,一天看一百篇文章,能有几篇值得分享。大多数搜索出来的文章都是过眼烟云的垃圾。退一万步讲,tinyurl不够用了,我们再使用更短的一级域名来支持,(例如g.cn之类),稍长一些的关键码,因为36的10次方是3,656,158,440,062,976,一个让人数半天不知怎么念的数字。

总之,以上数据表明,如果使用tinyurl,是前途光明的。具体到twitter和fanfou中,自觉使用tinyurl也是立见其利:如果说一句话时非得包括一个长长的地址,你在tinyurl的亲切关怀下就能表达更多的内容,在140个汉字或140个英文字母中所提供的信息量越大。何乐而不为?

为什么fanfou不用tinyurl呢?猜测如下:

  1. 技术要自己研发,用着才踏实。
  2. 国外网站有被hexielization的危险。
  3. 如果要支付高额成本,价格问题谈不拢。
  4. 该技术或需大量硬盘,或需大量带宽,同时其利甚微,不值得做。
  5. 跟宗教一样,源自外国,到了中国,即自成具有中国特色的体系,不受外国教皇控制。
  6. 与国情相似:国外酌情搞外包,国内事无事无巨细,一概小而全。
  7. 现有模式就挺好。用户没有觉得不方便呀。

浪淘沙 姑姑的短信

Filed under: 文字 — 深柳堂主 @ 2007-12-19 21:47:49 Comments

今日收到二姑短信一条,调寄《浪淘沙

岁月去遥遥
无迹可蹈。
转眼又是新岁邀,
不拦流光催人老,
谁敢阻挠。

年轮四十遭。
少女成媪
期盼后嗣立业昭
而立之年该成家
二姑急躁

这不由让我想起之前写的《水调歌头》。不过,显然不能以旧作应付。推敲一番,写出如下几行:

浪淘沙 和二姑

去日竟迢迢,
奔三近了,
燕然未勒髀肉膘。
同龄儿女已恁高,
绕膝欢笑。

水涨船亦漂,
物价狂飙。
囊中何有钻戒包。
薪桂米珠居不易,
买房尚早。

简单翻译一下,就是,

时光过去如此匆匆,
眼看就是奔三的人了。
我像范仲淹一样叹着功未成就,因此无计还家;像刘备一样感叹征战不再,双腿离鞍已久,髀肉生出,建功立业的雄心无以施展。
同龄人都已为人夫人妇人父人母,
与膝前的儿女欢享天伦之乐。

如今物价飙升
人民币对外升值,对内滞胀,
手无余钱,又怎能买得起钻戒。
木柴贵得像桂树枝,米贵得像珍珠,生活在长安,纵有乐天之才也是白居不易,况似我辈庸碌者;
哪里敢奢望买套自己的住房呢?

上阙从主观出发,感叹事业未成,何以家为;下阙从客观出发,说明对了现在生活状态的无能为力。

效果来看,向姑姑解释了原因。从词的角度来说,只能说是勉为其难罢。

——————————–分割线———————————-

PS: 本词只有倒数第二句不是韵脚。为了押韵而把胡乱拼凑,将内容弄得乱七八糟的话,是我所不喜欢的。第二阙虽然说的都是实情,但是显得一览无余之白,没有曲径通幽之妙。相比之下,杜翁一句“安得广厦千万间,大庇天寒士俱欢颜”,就大气得多,穷则独善其身,达则兼济天下。不是单表一人之如何如何,而是上升到全部“寒士”。

本来是游戏笔墨,结果写成这个鬼样子,也是始料未及的。就此止笔。

21 Dec 2007

长城砖上雪

Filed under: 摄影 — 深柳堂主 @ 2007-12-11 22:11:47 Comments

今日因公再登长城。这次时间相对宽裕,也就趁机多拍几张照片。回家后传到flickr,却被告知:免费用户的上限已到,您已经上传了200张图片了!看来,免费用户不止有每月100M的限制,还有总图片200张的限制。我开始反思,是删除其中可有可无的图片,还是另找其它的图片服务站点了。闲话少说,图归正传,我把今儿拍的照片贴在这里,专辑名为“长城砖上雪”。昨日北京普降瑞雪,长城与有荣焉。残雪尚存,遂择优入画,以资留念。

为节约传输速度,我将小幅图片贴出。请点击该图以观看大尺寸版的原图。

  1. 冬日长城·阳面


  2. 冬日长城·阴面

    DSC02054

  3. 长城砖上雪,之一

    DSC02068

    之二:

    DSC02082

    之三:

    DSC02084

  4. 忽然看到历史悠久的长城砖刻,想起时下沸沸扬扬的自由女神像上的中文“到此一游”事件,不由哑然:我们中国人连自己的伟大的长城都舍得刻划,还在乎你外国人的破烂女妖精?有图为证:

    DSC02079

    不过,倒也不可因此小觑友邦人士的贡献,如图:

    DSC02076

    果然如此,来而且不往非礼也。谁能甘心被白白非礼?孰先孰后,却也无须追究。

  5. 对此,我们能说什么呢?弱国无外交,只能仰仗中国之富而强,我们才能坚而挺。雄起吧,中国!

    DSC02088

    正面视图:

    DSC02090

  6. 愤青版长城图片暂告终结。来个小资版:琴键·退潮

    DSC02096

    积雪与阴影相对,既似静态参差的钢琴键,又似动态起伏的海滩退潮。故名。

  7. 本次最后一张:雪叶。我本怀疑sony dsc-t100的成像能力,不过感觉操作更易上手,确有自己的存在理由。看来,像机就得买两台,一台卡片机,便于出门携带:小巧玲珑抓拍机,随时随地记信息;一台大单反,便于高质量成像:光圈快门白平衡,完美配置力求精。

    DSC02092