20121225

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

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

1. 限制和解决方案

经常有人替我国导演和科幻作者们叫屈,说这样的环境怎么能出好作品呢;也经常有人为自己叫屈,类似他有这样的父母环境怎么能成才呢。不过,我看过一个故事,说法略有不同,名字忘了,应该还是个名篇。

故事里说,有个家伙因为被抢劫,捆得很结实,而又刚刚好能动弹一点,能一跳一跳地走。他被救以后,发现能演小丑什么的,留在马戏团工作。因为绳子约束,力量更大,而且能做很多原来完不成的动作。最后,老板想杀他放出狼来,他做好准备放手一搏,觉得胜券在握。老板娘一刀把他身上的绳子割了,喊"那谁,你快跑啊。"然后就没有然后了。这哥们离了绳子啥也不是,后来是不是被狼咬死,我就忘了。

这个故事告诉我,限制从来不一定是致命的阻碍,有时更可能是个磨砺人的挑战。

包师弟和ZHUMAO聊,说到某单位的网络真是不咋地,下载居然要收费,不过有个漏洞。包师弟说,这个漏洞就是下载邮件的流量不算钱。

这倒是也合理,不然就往网络中心或领导的信箱里成天发大附件就行了。同时,从原理上也说得过去,SMTH的时候,不是我乐意的,相当于接听电话不收费;而POP3的时候,已经是内网了。

ZHUMAO说,这个漏洞可用。他提到,先把大文件切成几份,然后用邮件发给包师递,包师弟根据一定条件收邮件,然后拼起来。

我说:你们应该用PYTHON整。ZHUMAO说:对,你整吧。

于是我就整了。没有写容错部分,一共197行,拿出来讨论一下。

2. 整体框架

整个软件分成两部分,是两个.py文件。一个是发送文件用的,名字叫 zhumao.py,另一个是收文件用的,名字叫 baoyu.py。

2.1 zhumao.py

发文件的zhumao要顺序执行这样一些操作:

* 编码文件

用base64或可打印字符,因为邮件是ASCII文本的,而大部分二进制文件都有ASCII控制字符,比如电影。之所以编码,另一个原因是我不想使用附件,实现的时候更麻烦一些,以后也可以改成用附件。

* 拆分文件

把文件拆成定长的几段,比如10K一段,然后再发送。最后一段可能稍微短一些。

* 标记及百分比,发送

在邮件的subject上做标记,比如 [来自zhumao,好片子] 这样包师弟接收的时候过滤邮件更容易一些。

然后找个SMTH邮件服务器发出去。

* 避免被服务器视为垃圾邮件发送者

邮件服务器可能会因为你一直发一直发认为你是恶意的,所以发一会要 sleep一会儿。对软件性能的影响,就是没有办法的事了。

2.2 baoyu.py

收文件这一端,要执行相反的操作,即顺序执行:

* 检查

用POP3检查所有的邮件头。

* 根据标记过滤,下载并删除

把符合条件的邮件,比如 [来自zhumao,好片子],下载下来,从服务器端删除。在这里,以后应该支持错误检校,出错重传。现在还没有支持,作为原型,就算对付吧,如果1G文件中间有一个坏的,就得重传全部。

* 合并文件

把文件从邮件body中析出来,然后拼成编码的文件。有些邮件服务器会在subject 之后加上乱糟的东西,比如 anti-spam
之类的,这破坏了一个通常的假设,即subject之后一行以后全是正文。这导致析出文件稍微麻烦一些。我为了实现简单,在body的最前面加了标记,后面也加了标记。反正邮件不是用人手,而是用zhumao.py发出的,所以这一部分可以视为
zhumao-baoyu 协议。

* 解码文件

把ascii文件解码为binary。

* 接收百分比

还要显示接收了多少。同时,因为邮件到达顺序可能与发送的不同,所以zhumao.py在发送的时候还在 subject 中还加入了共几包,当前这封邮件是第几包。

2.3 实现

列出上述框架以后,我先写zhumao.py,用 thunderbird 和 gmail 检验发送的内容;然后再写
baoyu.py,此时用已经实现的zhumao.py发送测试用例。因为我不熟悉python,很多语法和底层的机制 (如分割字符串)
,都是一边写一边查的。估计有更优雅的实现方案,不过那就不是我这样的初学者能提供的了。

所以,大牛们读到此处,已经可以评判 zhumao-baoyu 方案了。初学者们请明天再来,我们继续一起学习吧。

此外,这个zhumao-baoyu草稿在计算机网络中也可以视为 smtp-pop3 协议基础上实现的文件传递协议,还可以扩展更多的功能,比如
baoyu 要求列出 zhumao端 提供的文件目录,选择文件下载。在协议之上建立新的协议,VPN中的l2tp、WAN口连接使用的
PPPoE,都与此类似,称为隧道协议。

在隧道协议中,表面上我们谈论的是一件事情,而实际上,我们真正想传递的,往往另有深意。就像年终岁尾,大家喝酒的时候,逼你喝酒的那些人,他表达的是:"你应该表达臣服于我,低个头啥的。"请脑补雄性大猩猩拍胸脯的动作。

突然想起来北京土著喜欢自称为"爷"的习惯,还有四川土著喜欢口头对别人的"婆娘"不敬这两件事,他们可能还会解释为"啊呀,我就是习惯了,没有恶意。"明知对方的感受,不郑重道歉的就是恶意。坏习惯是病,如果能改就改,如果不能改,就得治。我对四川同学说过,你说别人的媳妇啥都行,对我得例外。期待机会哪天对哪位北京同学喊一嗓子,你TM是谁的爷。

终于还是跑题了。

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

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

[http://giftdotyoung.blogspot.com]

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

20121217

Linux shell脚本,Linux下的西红柿时间管理法 IV

Linux shell脚本,Linux下的西红柿时间管理法 IV

续 清理

本来以为三次就写完了,用了几天这两个脚本,发现了一点问题,所以还得再说
两句。希望这次就真的结束了。

我习惯不用计算机的时候,扣上盖,然后机器休眠。这个习惯与上述西红柿时间
管理结合在一起产生了一个问题:at任务还在继续,再唤醒机器的时候,时间管
理还在继续,可能正进行到第5分钟,也可能是第12分钟,而我希望重新计时。

重新计时也很简单,再执行个20.sh就行了。这么做带来的问题是,这个新的时间
管理起始点建立了,旧的却没有清除掉,所以可能过不了几分钟,旧的休息时间
就到了。

清除掉旧的任务也容易。比如执行 atq 显示当前的任务为:

~ $ 20.sh
~ $ atq
3890 Mon Dec 17 21:31:00 2012 r young
3891 Mon Dec 17 21:32:00 2012 r young

3890和3891就是当前的两个任务。清除的命令是:

~ $ atrm 3890; atrm 3891
~ $ atq
~ $

任务果然清理干净了。

但是每一次都要atq,然后去读那两个任务号,然后再atrm,挺麻烦的。所以,有
了下述脚本,用于清理旧的时间管理任务。

代码如下:

1 #!/bin/bash
2
3 task=$(atq -q r | cut -f1 )
4 if [ -z "$task" ]; then
5 echo "No task in queue r."
6 exit 0
7 fi
8
9 for t in $task
10 do
11 atrm $t
12 done

第3行,用atq显示任务列表,然后管道给cut,得到第1列,也就是任务号,看起
来的效果就是:

3890
3891

这些数据赋值给了变量 task。

第9行,遍历数组task,对于其中的每个变量 t ,应用atrm操作,相当于:

atrm 3890
atrm 3891

这样,每当我开机的时候,不必再atq看是否有任务,然后再记住任务号什么的,
只要执行 clear_at.sh,旧的任务就清理掉了。

既往不咎,一切重新开始。

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

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

[http://giftdotyoung.blogspot.com]

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

20121209

那些年,我们一起喜欢的诺基亚

那些年,我们一起喜欢的诺基亚

我的手机旧得不行了,只好换了个新的。旧的不行的意思,如同现在的小青年所说的,并非拿起来就散架,而仅指"感觉"不那么好了。每天都要充电,下午的时候就会耗干净自动关机,打开通讯录会停在那里几分钟……诸如此类。

这个淘汰掉的手机,买的时候也2000多元,现在不用,甚是心疼。当初买的时候是奔诺基亚去的,立场不坚定,临时决定换成了MOTO,windows操作系统的。于是,两年多来,我经常要对别人说"这不是黑莓,这只是长得像黑莓的摩托罗拉。"

此前,我的手机是诺基亚1110那种直的,小手机。再之前……时光如流水,令人感叹。

我的第一个手机是大学四年级的时候买的。当时在外面打工,我有个BP机,经常会收到"短信"之类的,那都是上帝发来的,表示有活了。然后我要跑到电话亭--有人值守的,和美国电影里的不一样,交上5角钱,把电话打回去。我买手机的主要原因,是电话亭上全写着大字"肆角",但是值守的人总是要收伍角钱。更早的时候,上面的玻璃上写的是"叁角",你猜对了,值守的人一定要收肆角。

我对每次要跟人讨论再被拒绝非常愤怒和疲惫,于是买了一个手机。当时我想的是,反正每个电话5角,到哪里打都是。后来二猫妈提醒我,电话亭是每三分钟5角,手机是每分钟5角,而我的每个电话通常不止一分钟。不过手机当时早就买完了,我只好感叹我的算术有多么的差。

第一个手机是Panasonic的,黑的,有现在两个手机那个厚,纯英文的。纯英文没有造成任何干扰,因为当时没有人给我发短信。倒是Panasonic这个名字,每当我提起来,就有人说,"不就是松下么。"确实就是。不过我用英文不是特意显摆,而是在那手机之前,我对日本的这些公司还分不太清,天天见到手机上写的这个词,就记住了。

后来,还用过一个摩托罗拉的,当时它还没有萌到改名叫MOTO。紫色的,形状像个猪腰子。我记得本来是二猫妈的,女式的。后来联想庆祝飞船上天征文接龙,评委说书人给了我一次一等奖,奖品是个鲜红的联想掀盖手机。联想手机给了二猫妈,换下来猪腰子归我用了不少时间,直到换成诺基亚1110那种。那个联想手机为我对国产品牌的见解积累了一些素材,彩屏的,但是除了彩色,别的跟黑白手机没有任何两样。

那时候,联想好像还不叫Lenovo,就叫联想。中央电视台的广告里,一双手推开两扇窗,外面是蓝天白云,低沉而洪亮的男中音说,"人类失去联想,世界将会怎样。"最终,人类失去了联想,世界也没有怎么样,还是那样。而且,让人类失去联想的,正是Lenovo自己。

我拿着非智能黑白的手机去的芬兰。某次,师姐向我显摆她的智能彩屏手机。她说,她的手机能听歌,我说我有MP3;她说,她的手机能拍照,我说我总随身带个相机;她说,她的手机能看电子书,我说那太对眼儿了,累挺;她说,没事的时候还能打个游戏呢,我说,哪有没事的时候啊。

我当时还不知道诺基亚能砸核桃,不然真应该拿出来跟智能彩屏手机比较一下。

最终,为了能用网络,能gtalk,我换成了MOTO。当google离开中国的时候,我消沉抑郁了挺长时间。后来,gtalk经常联不上,我就成天开着软件,它自动尝试登录,失败,再尝试登录,再失败,再尝试。大部分GPRS流量,都这样消耗掉了。能连上GTALK的朋友几乎看不到我说话,只是大部分时间掉线,偶尔上来下去的折腾。他们告诉我还有QQ和飞信微信这些方式,但是那些都不是我换成MOTO的原因。

我守着MOTO,一共用了两块电池,直到每天充电,通讯录也打不开了。后来,它放弃了我。

最近,我买了诺基亚X2。不错的手机,只是GTALK的时候必须就只GTALK,别的什么也不能干。它不支持多进程。GOOGLE日历也不能用。

还是最近,我又买了诺基亚E71。不错的手机。GTALK能用了。GOOGLE日历还不能用。随机配了张光盘,里面有个软件叫做PC套件。网上大家都说,装个PC套件就好了,可以把手机日历与OUTLOOK同步,然后OUTLOOK与GOOGLE日历同步。

可是,PC套件安装失败,因为证书过期。我刚买的手机,光盘里的软件证书就过期了。网站很难连接,连接了说不对本地区提供下载。有人说,是因为诺基亚重组改生产线什么的。我知道,就是因为Symbian不再能创造价值,被退休了,不再有经费维护。

这些年来,诺基亚陪伴过我们大家,跟我们一起度过这样的一个时代,喧嚣而迅速。但是它最终的命运不过如此。我们把所有的东西都抛在身后,包括我们自己,努力狂奔。我们还要大叫,"我就是这样的。"好像如果不抛掉自己就不再是自己了。

我见到过朋友们换了很多手机,换了电话号码。其中有一些逐渐失去了我的消息,直到他们需要我的那一天。而我,永远失去了其中一些人的消息。每一次换手机或者电话号码,我都群发短信,我相当长时间保留着旧电话号,并让它开机。电话号码,不仅是当你需要别人的时候,更重要的,是别人需要你的时候,它能有效。我一直保持着24小时开机的习惯,我一直在这里。

我见到IT公司们风起云涌,爆炸一样眩目,然后又消失在人们的视线里。我见到各种技术出现和衰落,有人预言在将来的多少年里它会流行得一踏糊涂。请各位根据自己的人生经历自行脑补以上这两段的实现。渐渐的,我不再关注现在,只关注过去和未来。现在如此短暂,实在不值得为此刻的任何欢愉浪费哪怕一个小时的时间。

冬夜越来越长。雪还是下个没完,长春已经不再关注清雪了,反正明天还是要下。路上积了厚厚的一层,黑的白的灰的。路灯下,清洁工人穿得像一群桔红色的熊,伸直胳臂向四下里撒溶雪盐。公路会在几天后融化出灰黑色的路面,人行的路正变成越来越大的雪堆。

这样的冬夜里,我想起小学骑车路过的水泥厂旁边的河和路。那里的雪是一层一层的,一层白,是雪,一层黑,是水泥厂的灰尘。骑车通过的时候,冬天要格外小心,因为路上的冰上全是汽车的车辙。得完全按车辙骑,一不小心骑歪了,就会摔倒。

夏天回通化的时候,我看到那条路已经修得我完全认不出来了,平整宽阔,旁边的水泥厂拆了,立在那儿的是个不错的小区。真是很好,只是我没有与它一起生活的这段时间,它变得令我如此陌生。

很多这样的东西都会弃我们而去,除了冬天这样的小路,除了我的MOTO,还有黑岛游戏小组,还有westwood,还有那些年我们喜欢过的诺基亚。

说起黑岛,起初它并不是游戏小组的名字,而是《丁丁历险记》里的一册。Star Trek
里的库克船长,最初可能是那位真的船长,在凡尔纳的《机器岛》里提到过,他被东南亚或澳大利亚的土著杀了,可能还吃了。不过,他们以另一种方式活了下来。黑岛、库克船长,喜欢它们的那些人长大,变成牛人,然后把它们以另一种形式复活,在自己的作品中生活下去。

《那些花儿》里唱,"她们都老了吧,她们在哪里呀"。她们也许在世界的哪个积满灰尘的角落里哭呢,也许早就死去了。但是,我真的希望,读着这一篇博客的某一位,也许你将来发达了。到那时,请不要忘记陪伴过你的诺基亚。请……把它买下来,请让它的名字在另一种产品中复活,让又一代人会喜欢它。

也许,单纯地为了能让那些我们喜欢的继续或重新陪伴我们,我们不得不努力,既使这努力令我们如此痛苦。


又及。昨天读孟子那段著名的话,"君视臣如草芥,臣视君如寇仇。"原来还有一段在后面。王问,"听说有臣下在离职以后君主死了,臣下还为君主服孝的,这怎么整的啊。"孟子说:"君主在臣下离职以后三年,还给他留着房子;臣下要去哪,送到国境,还派人把臣要去的新地方打探安排好。这样的君主,臣下自然会服孝。像那种人走灯灭,刚说要辞职就收回房子的,还指望臣下服孝呐?"

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

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

[http://giftdotyoung.blogspot.com]

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