告别加工基地,去七号楼了

告别加工基地,去七号楼了

今天第一次在七号楼工作,得写篇博客留个纪念。

我最开始去应化所找牛老师,是苏老师介绍的。照毕业照的时候,苏老师在我前一排,领导人核心的位置,回头跟我说,"有这么个活,看看你愿不愿意干。"这个活儿的老板就是我后来的博士导师。

我就去了,找到无机分析楼313,一看里面坐个小年轻的,心想,这是助理了。我问,"牛教授在么?"小年轻的抬头笑呵呵地说,"我就是啊。"然后我俩开始谈这个活儿应该怎么干,目标,技术细节。末了,牛老师说,你还有啥问题没。我说,"有,这个楼里干活晚上能加班么,11点以后能不能就关门了。"那时我正经常跟各种门卫产生矛盾,原因之一就是热衷加班。牛老师说,能,没问题。

这是我在应化所工作的第一个地方,313,老板桌子旁边,把设备和机器摊开的时候,占领老板的桌子。有时候,还用阵列柜的台子,窗台。后来还去过317,那屋没窗户,我用里间,把设备内脏全挑出来,摊一桌子。设备跑一遍得几分钟,我拿个曲别针试着撬实验台下面的一个加锁的抽屉。直到毕业,也没有成功。想想费曼的技艺,我彻底折服了,人与人之间的区别,岂可以天渊来度量。

后来硬件组人越来越多,搬家了,软件组也一起搬走,去了加工基地。是个五层楼,楼顶有大字"加工基地"。似乎整个应化所只有这座楼顶上有字。对面楼旁边常年支着一个三米多高的天线,不是锅的那种,是树枝状的。这有个差别,锅的那种,除了雷达和微波,一般都是用来接收的,接收的,是没有能量发射的;树枝那种,是用来发射的。不过,俺们都知识波长和天线长度成正比,这种长度的天线,应该人畜无害。不过,每当我走过,都想起三体,日落红光中的发射塔。

加工基地只有五层,但是如果电梯刚好坏了,爬起来可远胜于此,约相当于十层楼高度,而且楼梯特陡。有一段时间,电梯经常坏,大家爬上去就不想下来了。五楼的厕所经常不能用,堵了,没水了,有人占着了,就要坐电梯下到其他楼层。如果电梯和厕所刚好同时坏了……

加工基地里,很有生活气息,时常飘扬着各种气味。你闭上眼睛,想像一个大厨房吧:烤羊肉,炒鸡蛋,炸臭豆腐,炒韭菜。我能想到的,大部分都闻过。不过,你绝不要误认为有人敢在加工基地炒菜。绝不要。关同学甚至说过,她在加工基地的时候都不敢吃东西。这是化学加工基地,天知道他们在厚铁门后面都在加工些什么。而且,好几个门上贴着"除非项目负责人同意,不得入内"。我才不会入内的,如果打开门看到一群防毒面具,不得后悔死。

每到下午5点左右,我就开始咳嗽。开始我还想,这是咋地了呢。有天突然明白了,准是有个家伙到这个时间就下班,把通风橱关了。后来,每到这个时间,我就取口罩带上,稍微好点。

七号楼启用前,我们兴高采烈的,可算要换到好地方去了。后来又听说,那里放置过放射源。辐射啥的,可比化学加工还牛,短期作用可以让人恶心呕吐,长期作用就更惨,你自己GOOGLE一下

福岛核电站、切尔诺贝利核电站就知道了。或者找要三防教材学习一下。包师弟说,没事,领导们在里面呆了挺长时间了,我心想,他们学化学的人学过核物理没?俺们找了中子所的同学帮测了,正常,没有沾染,然后放心入驻。

今天第一次去调程序,看什么都新鲜着呢。我觉得走廊里可以放个咖啡桌,放在那个塑料的鼎旁边就挺好,放鼎下边那个窗户旁边也好。风景不错,桌子也够多,不过还是一样挤,到处都是元器件。

今天最开始两三个小时,光拷东西了,机器跟死了一样。好在后半段风顺水顺,一调就成功了,感觉还不错。

对了,应化所最牛的楼我没去过。紧邻人民大街,原来的伪满洲国大陆科学院,里面一群鬼子先驱工作过。所以,最早的应化所前辈们,不少都是四个字或以上的名字,是抗战以后被我们收编了留下来工作的。那座楼有一阵要翻修,都拆得只剩下框架了,上面下文,这是文物,不能翻修。但是建筑方面的专家说,这样的框架承受不了恢复成原状,必须翻修。同时,文物方面的专家坚持,不能翻修,就得恢复成原状。建筑专家说,要整你整,我可整不了。后半段都是我瞎猜的,大家瞎说的,不过,那楼就以框架的形式在那立了好几年。现在好象是修好了。

以前应化所连个牌子都没有,跟个部队大院似的。不少人一直以为那就是部队,其实那是科研机构。现在有牌子了,非常大,得十米来长吧,搁地下,就在一进大门那。外面还是没牌子。

就这样,是以为记。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

不被淘汰的方法

不被淘汰的方法
昨天上课的时候又谈到,在项目组中你必须承担承任,就像类一样,如果不承担责任、没有方法、不接受消息的类,就不必存在。工程师在项目组中也是一样。然后,又谈到,我们应该承担什么样的责任才能不必淘汰。或者说,我们需要实现什么样的功用,才能不被淘汰,才能是对别人有用的人。
我首先想起的是以前某位老师教导的,有两种方法。
一种方法是,你得掌握一个窍门,别人不知道的窍门。老师当时还说,而且这个窍门你一定不能告诉别人,因为一旦别人也知道了,你就不值钱了。
其实这个方法不太靠谱。一方面,这样的窍门可能不容易发现,二方面,如果这窍门你容易发现,别人就也容易发现,就算你不告诉别人,别人也很快就知道了。所以很多年来,在技术上,我所在的项目组都没有内部的保守,这也没啥意义,反正过几年满世界都知道你那点秘密了。靠一个秘密保住饭碗,风险太大。
老师当时说的第二种方法是,你得会这样的一种方法,这种方法即使你详细地讲给别人,别人也不会,还得来找你才行。什么样的方法具有这样的特性呢,如果你的方法基于具有深刻的理论基础的话。所依赖的深刻的理论基础,如果你花费十几年时间学习,然后才能整明白这种方法,别人也一样,也要花费十几年时间学习。所以如果想找个人替你,也得找那种有十几年学习经历的;所以如果现在马上就需要这种方法,就只好由你来使用--再找一个也学过十几年的家伙的难度,跟花十几年再培养一个,很多时间也没啥区别。不过,我们谈的是十几年,如果只有几个月的培训时间,再培训一个也没啥困难。所以,这种理论基础得是深刻的,你学起来难,别人学起来也难的。好在大家智商差不多,你学习起来困难的,十有八九,别人学起来也不轻松。
无论什么知识,整个十几年,应该能整出点啥来了。至于什么样的知识更容易整出成就来,那是另一个话题了。此另一个话题这里可以开个头。那天看到网上一个贴子提到"是不是上学的年头越多,就越没出息",可以问个问题来作为回答,那就是"什么是出息"。
老师当年就教导我这两种方法:有窍门的,或者有深度的。
昨天讲课的时候,讲到这里,我说:其实还有第三种方法,当年老师没说,这么多年来我也才想到。
那就是在ACM比赛的时候,我对志愿者们说过的。"你们当志愿者,又不挣钱又受累,想要的是提前收获像工作时一样的经验。今天我教你们一个经验,几乎可以说是唯一经验,那就是--不辞劳苦。"
不辞劳苦,这时所干的工作,*根本*就不是不可替代的。不辞劳苦的,就是从事最无聊的,就是去干最没人乐意干的,选择看起来最不有利于将来的和自己的利益的。不辞劳苦,就是拿个破鼠标半个晚上画图标,就是一行行改代码,没有工具没有技术就消耗自己唯一拥有的耐心和时间来做,就是无暇疵排版。就是十数年如一日,守着元初的梦想和不确定的未来。
非如此,不足以称为不辞劳苦。而且,表面上看,不辞劳苦所做的工作是完全可替代的,谁也不乐意做的,但是,正是这样的工作因为是谁也不乐意做的,所以,也正是最不可替代的。没人乐意替代你,也没有能够替代你。康德从他的角度讨论过这个,合目的性的无目的。
这就是第三种不可替代的方法,不辞劳苦。
--------------------
博客会手工同步到以下地址:

北京今夜有星星

北京今夜有星星

昨天一出门,我啪地坐了个屁墩,结结实实地。我坐在那里,半天没起来。头几秒是搞清楚状况,接下来几秒用来确定腰间盘等部分尚可用,最后几秒抬起撑在地上的手掌,看看伤的情况。一概没大事,后背有些拉伤,尾椎骨有点疼。大清早,来来回回有几个行人扭头看我。我做出痛苦状,以表示自己不是傻气发作坐在那里。

后面又出来一位,我大喝一声"小心脚下,特别滑!"他没摔到。

我以前从来没见过这种路面,有冰,但是特别薄,冰是透明的,不注意反光就完全看不到。今天听北京人民说,这叫做"地穿甲"。不是穿山甲,是地面穿了一层甲。头一天晚上下了"冻雨",据我看是冷冻的雾,半夜时融化成水,清早里都结成冰铺在地面上了。东北的天更冷,一般把冰冻出裂纹来,所以不会出现这种东西。在东北,雪或者冰即使偶尔融化,也不是水气这么少的时候。我见过一次三九四九不出手的时候,下了场大雨。不过,第二三天结的冰很厚,全然不是北京这种让人冷不防的。

说实话,写到这里的时候,我想起了北京人民喜欢说的一句话,跟你讨论半天,尤其是否定你的时候,末了来一句,"好吧"。语气你自己想像,但是绝不是和你商量讨论呢。

好在冷空气带来了晴天。天天没太阳,天天乌突突。外面空气次得不行,学员们偏偏习惯开着窗户透气,这空气透还不如不透呐。终于晴天。早晨有蓝天,上午有太阳,下午阴天,晚上有星星。

附照片一张,以资证明,中间那几颗亮点不是噪音,是星星。

最近正读色诺芬《长征记》。这位大哥真是牛人也,跟波斯王子居鲁士去打国王,这边打得正欢,居鲁士挂了;有位带头大哥站出来带领大家回家,没多久带头大哥挂了。半夜大家都躺帐蓬里等死等天亮,色诺芬站出来说服大家要打回老家去。难得的是,色诺芬还是谦谦君子,正经是个好脾气的,屡次被大家背叛抛弃,仍然救助士兵如故。军事战术也好,少有的退师作战没有给养,还能占到些便宜。他的《长征记》激励亚历山大,原来波斯也没啥牛的,这才有远征亚洲。

可惜色诺芬这样的好人,后来也死掉了。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

北京北京

北京北京

1月底2月初,我在北京停留一周。西北四环,我不知道这里算是城郊,还是几座村镇的中间地带。

灰蒙蒙的天空,正午的太阳终于显露出来,月亮一样黯淡。眼前低矮的建筑,狭窄的胡同,远处高楼林立,隐在雾霾之中。豪华轿车上厚厚一层灰尘,它们飞速穿过西四环宽阔的马路,溶入到闪耀的车灯的洪流中。

我看到穿着深色掐腰西服的青年男女,里面是雪白的衫衣,他们涂脂抹粉,在终日不暗的人工光源照射下活力四射,然后挤在百货公司楼顶的食铺里吃得大汗淋漓。他们操着不太纯正的北京方言,谈论着与家乡遥远不可及的话题。

他们的后代会成为操着纯正京腔的北京人民。我不禁想,当他们的后代长大,那时的北京是个什么样的城市。过街天桥上很多大红的标语在雾气里隐约可见,我记得"首善之区"这四个字,取代了上次我看时看到的"包容"等北京精神。上一次我见到"首善之区",似乎是在鲁迅先生作品的脚注里。这么眼熟。

收音机是吉克隽逸祝福和号召的声音,还有李代沫的新歌。我翻出梁博的《北京北京》,他在选秀以后渐渐淡出了人们的视野,似乎没有新歌没有宣传。他说过,他热爱音乐,我现在更加相信了。

我还看到汪峰和几个别的明星穿着登山服的大幅广告,在城市中心,在地铁的灯箱里。他们似乎都向往远山,向往自由,向往天空。

你的行为告诉我们,你所热爱的到底是什么。他们,最终选择了北京,而不是他们所热爱的故园、旷野和音乐。

更多照片 [http://www.douban.com/photos/album/85517092/?start=0],其中有两张是长春。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

《C程序设计语言》句读 20130123

《C程序设计语言》句读 20130123

在这里[http://www.tudou.com/programs/view/XKF8AOADykU/]。

这次结束了第1.2节。华氏度转摄氏度的程序已经由整型版本改成了浮点数版本。这一次的主要内容是while的循环体,还有数据类型及实加于其上的运算间的关系。

--------------------

博客会手工同步到以下地址:

[http://giftdotyoung.blogspot.com]

[http://blog.csdn.net/younggift]

--

Sincerely,

YANG Guifu

School of Computer Science and Information Technology

Northeast Normal University

Changchun, P.R.China

----

杨贵福

无不大工。

《C程序设计语言》句读 20130117

《C程序设计语言》句读 20130117在这里[http://www.tudou.com/programs/view/IP0uddL3wX8/]。这次句读完了绪论,第1章刚刚开始。我按现在的进度估算了一下总共需要的时间。全书一共190页,如果每次2页,我们需要95次,如果每周一次,需要95周,需要1.76923076923年。不到2年的时间。我又想起当年考研还是考博时的犹豫,犹豫所需要的时间,还有学完要花费又几年的时间。当时一个贴子让我明白了一点。贴子说,一个家伙犹豫要不要考研,心想,等我毕业需要三四年,那时我都快40了。我还要不要考呢?他的朋友说,你以为你不考,过三四就不四十了么?句读C语言需要两年的时间。我自问自己,你真以为如果不句读C语言,这两年就能做更有意义的事情啦?我们有时并不是有更重要的事情要去做,不过是对现状的绝望。
今天有领导训示大家,关于科研考核什么烂糟的。不是科研考核本身烂糟的,我是说我的科研成果烂糟的。有位同事说,"计算机学科这么弱,跟化学生物物理同一个标准不合适。"我不太以为然,自己不行么,要么争气,要么认命,也没啥可争的。包师弟有云,"眉毛上的汗水,眉毛下的泪水,你总得选一个。"反正你如果有目标,总归得工作或者哭。不过我不敢跟我的学生们说,怕他们认为我是在励志。因为我总记得我们最终还有一条路可选,就是放弃目标。但这话不能跟同学们说,他们该投诉我了。同事提到的学科差异,领导开玩笑地说,"那就得怪你选错学科了。"大家笑。我没配合笑一下,而且非常激动。所以当另一位领域问俺们,不是,问我有啥想法时,我就表达了一下。我们学科弱不错,全世界的计算机都比化学生物物理弱,也不错。但是我们热爱这个学科,你不能说我们选错了学科。就算你把我们拆了,全分到各个系看机房,我们还是热爱这个学科。上述,我表达得有点语无伦次,现场效果也就是如此。其实我想说的是,我没有别的选择,我只喜欢计算机。所以,我也没有什么别的可以做的。人人网还是哪,以前有过微博类调查,说如果没有你学习从事的这个专业,你想做啥去。如果那样,我想去死。没有别的选择的时候,人生就完全不同了。至少,你不会因为选择痛苦--因为你别无选择。--------------------博客会手工同步到以下地址:[http://giftdotyoung.blogspot.com][http://blog.csdn.net/younggift]

读书怎么才能更快

读书怎么才能更快沙发上堆了不少书,这些都是计划要看完的。有的要精读,有的要粗读。精读和精读消耗的时间相差巨大。大抵上,读书想要更快,速度就在精读和粗读的速度差上了。当然,排除一种方法,就是你一顿瞎翻,啥也没记住。李笑来先生曾经说过,读书提速的方法,根本没有秘诀。无外乎多读,多读你的速度就快了。你可能问了,为啥啊。有人可能还听说过一种叫"快速阅读"的技术。练习以后,能一行一行地往下看,不是一个字一个字的看。大致上,跟竖着看书差不多。我小学的时候学过,貌似还有点用。英语阅读的时候,我能用别人一半的时间完成阅读和答题--当然准确率并不怎么出色。不过,即使我降速到原来的一半,准确率也就还是那样。这样看来,"快速阅读"似乎还有点用?这跟李笑来先生提到的没有秘诀是否矛盾呢?其实,不矛盾,都是一回事。一者,长时间地阅读,会自然地形成很多技巧,这些技术就跟走路多了的人会走路一样:把文字按行或按词组划分,不要每个字都读,跳着读,不要在心里出声,啥的。要想阅读超过人类的正常语速,还是挺容易的,只要读足够的量。所以,一般没有特殊训练,也容易达到。不过,当我们读教科书、经典著作,或者我们称为晦涩难懂的那些书的时候,问题就来了。这个时候快速阅读完全起到了相反的作用。比如第一次读《C程序设计语言》,比如读《纯粹理性批判》,比如读你明天要考试的那科教材。一目十行,合上就忘,甚至当时也不知道作者在说些啥。所以,计算机领域有一种说法,他们希望发明一种"慢速阅读"方法,从而能字斟句酌地一点点扣。这种时候最好的读书法是 不仅"读",而且"做"。正如CSAPP中说的,学习系统的最好方法,就是 "do
system"。当你沉浸其中,不看书实现一遍那些代码的时候,你就真正掌握了。有的似乎把这叫做在"内化"。扮演老师,给别人讲明白;找个实例按书里的路子剖析一遍……总之,经历过的事情,会让你刻骨不忘。这就是为什么讲起近三十几年的历史,三十几岁的人往往连书都不用翻,因为他们身在其中。当然,"do system"的方法,是个慢方法,而不是个快方法。不过,如果吃了东西都不消化,还吃它干什么。所以,"do
system"也是大量阅读中的好方法。更好的方法,是自己写一本。大量阅读,会自然形成阅读技巧,因此,会读得快。但大量阅读的作用,不止于此。其二,大量阅读会形成知识结构。这样,不仅技术使你读得快,知识结构还会使你越读越快。我面对那么书,也常常挠头,叹"吾生也有涯而知也无涯",悲夫。不过,到真正读的时候发现,有的书读起来比想像地快得多。比如我用一个晚上读完了今何在先生的《我的征途是星辰大海》,用大半个晚上读了半本二月河先生的《九王夺嫡》。这种速度和某些速读牛人比起来并不算什么,不过和我其他的记录相比就令我惊叹了。我读SICP的时候,有过2个小时1页的时候,读康德的时候,有好几天断断续续没翻过去一页的时候。和这些比起来,一晚上半本一本的速度就很快了。为什么会有这种差别呢?一个原因是,这些书的信息含量是不同的。信息论告诉我们:信息,是对无序的度量,只有当可能性未知时,即事件你还不知道结果的时候,告诉你的,才是信息。你明知道的事情,我再说一遍,对你而言是零信息。那种对话一般表达情感,或者是仪式,比如那句古老的"你吃了吗"或者"how
are you"。其实说话人对你吃了没有或者好不好一点也不感兴趣。小说和电影,如果只是为了欣赏,而非研究学习,那读起来就可以酣畅淋漓。按Johan Lilius教授对 the Big
Bang的评价,把脑子拿走一些看,效果会更好。按《破产姐妹》里胖姑娘的说法,对着电影大喊大叫,那正是享受电影。这样的时间,过得很快,其实也真的不多。一场电影1.5小时,可能康德还没有读完半页。另一种读起来快的书,就是里面的知识全是你知道的。我们翻金庸原版武侠的时候,感觉大概就是这样。谁什么时候要死了,什么时候要难过,后面还有啥阴谋,咱们全知道。只是为了再感动一次。可以几秒钟就翻过一页,如果不细品文字的话。还有精通一种语言的人,再学习其他的语言,看教材的时候,速度也非常快。因为他的头脑中,不管什么语言,都应该有变量声明、类型、结构体、数组、对象、判断、循环、函数、库。一般都这样,内容不变,只是语法上有差别。除非,你遇到了颠覆你人生观世界观价值观的东西。比如,LISP有那么一大堆括号不让人头疼,很多初学者的第一个问题是,这家伙没有循环怎么迭代,然后可能又遇到个问题,函数怎么可以没有名字,可能还会有人疑惑变量怎么可能没有类型。再比如,PYTHON初学者可能对结束没有";"还没有多大意见,缩进是语法的一部分,很多人好几年适应不过来。还有,当你打开罗素康德,看到他们所讨论的有的似乎你疑惑者,有的你根本不知道他们在说什么。他咔咔一顿推导,最后得出一个你万万不能支持的结论,突破了小资产阶级所谓"底线"。这可不行,还得掉头看他怎么推理的,或者扔掉再踩上一脚,评"什么破玩艺",或者"我可整不了"。所有这些,lisp,python,康德罗素,他们让我们不舒服,让我们阅读的速度大大降低,原因在于--他们正拓展我们的知识结构。探索新宇宙,开疆拓土,历来如此。想舒服,想快速,就停留在我们原有的知识结构上。拿起本小学数学,或者初中二元一次方程,那感觉,是不是很自信。我以前装机试软件的时候,曾经装过一个软件,考10以内加减法。我做完题,机器评论"你看是个天才"。但是我并没有什么满足感,只是觉得滑稽而已。大部分小学生看你现在要考试的教材,速度肯定比你慢上百倍。他的阅读速度,甚至认字和组词的能力,都阻碍他的理解。更重要的,你已经具备了这本教材的知识结构。知识结构的完备,大大减少了我们阅读时的信息量。读我们熟悉的东西,不过是增加细枝末节的了解,而框架的建立,而是伤筋动骨,痛苦而漫长。这也是为什么我们人类那么痴迷于"形而上",因为我们期待建立了它以后,剩下的可以不用想就推出来了。所以,大量阅读建立的知识结构支持我们更快的阅读,因为它大大减少了书本中我们要接受的 (未知的) 信息数量,那些都是我们已经知道的了。而且,随着你阅读数量的增加,知识结构的完善,你的阅读会越来越快。因为,你的知识结构越完善,在下一本书里,你未知的就越少。有人可能提到"知道的越多,未知的越多",那是针对知识总量而言的,而不是指特定的某一本。特定的一本书,你知道的越多,读起来铁定越快。除非,你是在研究,而别人只是在浏览。再回到我沙发上的那些书,精读和粗读。凡是新知识结构,都只能精读,这是没有别的办法的事情;娱乐的、补允细节知识的、学习别人表述方法的,那些读起来就快得多了。读书怎么才能更快?读得多了,就快了。你可能认为这是个悖论,因为你想知道读书快速的方法,就是为了多读书。不是的,你不是想多读书,而是想利用更少的时间读书。这个问题容易答多了:只有现在花时间多读书,以后才能少花时间。再说了,人生苦短,可也够长。你没用在读书上的那些时间打算干什么,打麻将么?--------------------博客会手工同步到以下地址:[http://giftdotyoung.blogspot.com][http://blog.csdn.net/younggift]
--
Sincerely,
YANG Guifu
School of Computer Science and Information Technology
Northeast Normal University
Changchun, P.R.China
----
杨贵福
无不大工。

精读经典,重新开始:《C程序设计语言》句读

精读经典,重新开始:《C程序设计语言》句读康德如此闻名,没有人敢慎重地说他写得都是些什么玩意,根本看不懂。但是,一直以来,很多人都提到,康德的著作太难读了,这抱怨还是针对汉译的。《纯粹理性批判》中文版,看着跟德文似的。所幸,邓晓芒先生著有《<纯粹理性批判>句读》,逐句翻译和扩展。这让我满怀希望,也许经过努力,总有一天能够明白。类似受到推崇和抱怨的,还有《C程序设计语言》一书,C和UNIX操作系统的发明人 K&R
两位先生的著作,是最优秀的C语言教科书。我在本科的时候幸运地从学校图书馆借到过这本,薄薄的小册子,讲解清楚明白。虽然我后来又读了很多书,它仍是对我影响最大的和最优秀的书之一。其他的,还有《牛虻》和《计算机解释的构造和解释》。牛的书,重构我们的人生观世界观价值观,或者知识结构,给我们新的生命。我对我的学生,我的学生也对我说过,要精读经典,重读经典,一遍又一遍。每一遍可能都有不同的体悟。贯彻这一原则,很久以来我一直想再次精读此书,并且希望我通读全书的过程能有益于你。所以,我开始录音这个过程,发布在网上。在这个录音中,有我的中文口音、我不认识的单词去查的过程,可能以后,还有你纠正了我的错误,我在以后的某次承认错误免得误导别人和对你的感谢。在这个录音中,还有我通读这本书的每一句,然后像英语精读课那样,划分句子成分,解释一些单词,从英语的语意,到计算机领域中它特殊的含义。还有我的各种猜测。这些过程,你都熟悉。你需要一本书,机械工业出版社 《C程序设计语言》英文版 第2版,作者 Brian W. Kernighan, Dennis M.
Ritchie,2009年3月第1版。其他的版本可能也行,内容也许略有差异。也许,你还需要一支笔,用于标注生词、句子的语法结构,一些知识点。你还需要一些时间,每一次大约45分钟。我会不定期更新,上传,然后在这里通报一下。我需要你的意见,如果你方便和乐意。受我的水平所限,难以保证正确和深入,愿与同样的初学者一起进步;也请大牛们指正,谢谢你帮助我进步。康德在《实践理性批判》中说:"有两样东西,愈是经常和持久地思考它们,对它们日久弥新和不断增长之魅力以及崇敬之情就愈加充实着心灵:我头顶的星空,和我心中的道德律令。"我想,他说的是,道德律令之于人类,就像星空一样真实地存在。可以触摸和感受,不可避免地影响我们,无法逃避。我们来自于它,归结于它。C程序设计语言,也是的。录音在这里,[http://www.tudou.com/programs/view/7uHPX99xDaA/]。--------------------博客会手工同步到以下地址:[http://giftdotyoung.blogspot.com][http://blog.csdn.net/younggift]

用邮件分割和传送大文件,python实现 III

用邮件分割和传送大文件,python实现 III4. 接收端baoyu4.1 导言和import这部分,是从zhumao.py中抄过来的。1 #! /usr/bin/python
2 # -*- coding: utf-8 -*-
3
4 # baoyu, 邮件接收者
5 __usage__ = "usage: %baoyu.py [--help]"
6 __version__ = "baoyu by Young 2012-12-21"
7
8 from optparse import OptionParser
9 import base64
10 import time
11 import sys
12 import poplib
13 import time
14 from email.Parser import Parser
15 from email.header import decode_header
164.2 helper函数们这里是一些在后面的业务逻辑实现中要调用的一些函数。它们在此声明和定义,定义的方式一般应依据动机、目的,而不是根据实现手段。也就是说,使用的词汇应该是分析阶段的词汇。函数被从"后面的业务逻辑"中抽取到这里,可能因为被调用很多次,也可能只调用一次,但是在业务上具有较为鲜明的特征。如果调用很多次,抽取出来的原因之一就是重用,这样可以避免后续维护的时候一旦有修改需求,这个功能相关的很多地方都要修改;如果只调用一次,但是业务特征明显,就是为了信息隐藏,以后或别人读代码的时候要容易一些。根据场合和组织方式的差异,这些函数有不同的称呼。在C++/java中,私有函数基本上实现了这样的功能;在flex/bison及我一时没想起来的很多领域中,它们被称为helper函数。17 ######
18 # helpers
19 ######
20 def getheader(header_text, default="ascii"):
21 """Decode the specified header"""
22 try:
23 headers = decode_header(header_text)
24 header_sections = [unicode(text, charset or default)
25 for text, charset in headers]
26 return u"".join(header_sections)
27 except:
28 return u"".join("invalidated encode")
29上面的代码是从某位貌似日本人的站点上抄来的,它的名字其实不应该叫做getheader,而是"根据charset解码"邮件头或正文。30 def get_msg(which):
31 return "n".join(server.top(which, 1)[1])这是根据 which指定的邮件id号,从邮件服务器上取得对应的邮件,但是不删除。server.top()。详见手册[http://docs.python.org/2/library/poplib.html],"POP3.top(which,
howmuch)"。33 def get_from(msg):
34 email = parser.parsestr(msg)
35 return email.get("From")上述的 pserser 就是 第14行 "from email.Parser import Parser"
中的Parser的实例,在下面的第82行。手册[http://docs.python.org/2/library/email.parser.html]。这个parser是专门用来从邮件中析出邮件头部等各个部分的。第35行,解析出From部分,也就是邮件发送者地址。baoyu.py根据这个来判断某封邮件符合"zhumao-baoyu"协议的发送者部分。这个粗糙的协议包括:发送者、邮件主题、第几封邮件、共几封。其中,发送者和邮件主题作为下载和删除邮件的过滤条件。37 def get_body(which):
38 msg = "n".join(server.retr(which)[1])
39 email = parser.parsestr(msg)
40 return email.get("BODY_START")与第33行开始的函数类似,get_body用于取得which指定的id对应的邮件的body。不同的是,get_body把这封邮件标记为已读。此外,上文提到,我们为了解析方便,在body的开头标记了"BODY_START:",所以此处,body可以视为"BODY_START"部分的值。42 def get_subject(msg):
43 return getheader(parser.parsestr(msg).get("Subject"))还是与第33行开始的函数类似,取主题部分。45 # e.g. [base64-2] 1/2
46 def get_cur_num(subject, subject_prefix):
47 start = subject.find(opt.subject_prefix)+len(opt.subject_prefix)
48 slash = subject.find('/', start)
49 return int(subject[start:slash])51 def get_all_num(subject, subject_prefix):
52 start = subject.find(opt.subject_prefix)+len(opt.subject_prefix)
53 slash = subject.find('/', start)
54 return int(subject[slash+1:])以上两个函数,是从邮件头里取得这是第几个包、一共几个包这两个数据,使用的方法是字符串处理,以"/"分割类似"[base64-2] 1/2"的邮件头部。4.3 命令行解析与发送端zhumao.py的命令行解析类似,解释从略。57 #--------------------------------------------------------------------
58 # 命令行解析
59 p = OptionParser(usage=__usage__, version=__version__, description=__doc__)
60 p.add_option("-F", "--file", dest="filename",
61 help="file need to be saved", metavar="FILE",
62 default="test.out")
63 p.add_option("-P", "--pop", dest="pop",
64 help="pop3 server", metavar="POP3_SERVER",
65 default="pop3.nenu.edu.cn")
66 p.add_option("-u", "--user", dest="user",
67 help="user name", metavar="USER")
68 p.add_option("-p", "--password", dest="password",
69 help="password", metavar="PASSWORD")
70 p.add_option("-f", "--from", dest="fromaddr",
71 help="from whom to be filtered", metavar="FROM",
72 default='[email protected]' )
73 p.add_option("-L", "--subject", dest="subject_prefix",
74 help="the prefix of mail subject as filter",
metavar="subject_prefix",
75 default='[zhumao_baoyu_mail]')
76
77 (opt, args) = p.parse_args()
784.4 准备连接邮件服务器82 parser = Parser()
83 server = poplib.POP3(opt.pop)
84 server.user(opt.user)
85 server.pass_(opt.password)
86 server.set_debuglevel(0)
87 sleep = 0.1
88 count = server.stat()[0]
89 d = dict()使用pop3接收,各种参数设置。第88行,取得stat命令时的邮件数量,即未读邮件数量。第89行,初始化一个字典 (映射)。后面准备把第1封邮件放到"1"的值里面,第2封邮件放到"2"的值里面,依此类推。这样,在拼邮件的时候,可以按key排序。4.5 接收邮件检查邮件,根据邮件头过滤,下载并删除符合要求的邮件,显示接收百分比。从第90行到第107行,是一个循环,用于遍历所有邮件,并在第103行当查找到所有符合要求的邮件 (数量达到要求)以后跳出循环。90 for i in xrange(1, count, 1):
91 current = get_msg(i)调用helper函数 get_msg,取得id为i的邮件 (的邮件头和body第一行) 。92 if (get_from(current).find(opt.fromaddr) != -1 and
93 get_subject(current).find(opt.subject_prefix) != -1):
94 b = get_body(i)如果邮件的发送者符合要求 (比如 [email protected]) ,并且主题的prefix也符合要求 (比如 [base64-2]),取整封邮件。如果不过滤直接在遍历的时候取整封邮件,因为邮件数量众多,带附件的邮件又很大,性能会比较低。而仅遍历邮件头,对网络带宽就没有那么高的要求了。95 print '+-------------------------'
96 print '|' + str(i)+' '+ get_subject(current)
97 # print '|' + b
98 print '+-------------------------'显示进度,避免用户着急。99 current_seq = get_cur_num(get_subject(current), opt.subject_prefix)
100 all_number = get_all_num(get_subject(current),
opt.subject_prefix)调用helper函数,取得当前是这一文件的第几包邮件 和 一共几包邮件。一共几句邮件,数值在遍历中一直不会变,但是重复计算了很多次。101 print (str(current_seq) +'/'+ str(all_number))再显示进度,第几封,共几封。102 d [current_seq] = b把第N封邮件放到字典键N的位置。参见前面提到的第89行,这里是向字典中插入数据。103 if len(d) >= all_number :
104 break
106 else:
107 print 'filtered out: '+str(i)+'/'+str(count)+'
'+get_subject(current)如果把这个文件对应的所有邮件都已下载完毕,跳出循环;否则的话,也告诉用户一声,这封邮件不符合条件,不然出现大量不符合条件的邮件时,用户看到的是程序假死。109 server.quit()收完邮件,关闭连接,保持优雅。4.6 合并文件111 # 合并文件
112 s=""
113 for k in xrange(1, all_number+1, 1):
114 s += d[k]
115接key的顺序遍历字典d,把对应的值拼接在一起。这个对应的值来自第102行的插入,此处是取出数据。字典d综上所述,在第89行初始化,在第102行插入数据,在第114行读取使用。如果不用字典,而使用一个链表,以下标代替key,也可以。4.7 解码文件我们拼接出来的文件是base64编码的,所以需要解码,然后写出。116 # 解码文件
117 s = base64.standard_b64decode(s)
118
119 file = open (opt.filename, "w")
120 file.write(s)
5. 回顾数据流发送端的数据流为: 文件binary -> 读入文件 -> base64编码 -> cut -> smtp.接收端的数据流为:pop3 -> merge -> base64解码 -> 写出文件 -> 文件binary。如果思想的传递,也能无误地这样传输,该有多好。6. 进一步的工作还有很多进一步的工作可以做,让这个协议及应用程序更好一些。比如,加错误检校,指定重传错误的包而不是全部重传,由baoyu访问zhumao的共享目录并指定下载某个文件,不使用SMTP/POP3而是通过论坛的贴子传递信息。还可以在传送前加压缩 (不过对于视频和音频,没啥意义)。还可以用这种隧道做成反向代理……未来有无数种可能。可能这正是人生的迷人之处,如果今天就能看到明天及所有以后的日子,那还有什么希望可言。完整代码在这里 [http://my.csdn.net/my/code/detail/33574] 和
[http://my.csdn.net/my/code/detail/33573].--------------------博客会手工同步到以下地址:[http://giftdotyoung.blogspot.com][http://blog.csdn.net/younggift]