正则表达式与有一定格式的文本

最近用aMule扒下来一堆cd。这些cd很神奇,是一堆iso,里面是一些flac文件……

这些flac都没有歌曲信息,于是我想办法提取歌曲信息存进去……

首先是文件名。文件名还算有点规律,都是###-(#) xxx _ xxx _ xxx _ xxx这样的。但是搞了没几张就发现,这个不太靠谱。首先是,有时候分隔用的是_,有时候是__…… 其次有时候一个域内部也会有_,例如标题里面时常出现…… 再次,看上去不少文件名最后被截断了…… 于是为了搞出靠谱的歌曲信息,还是用别的办法。

其次,每个cd还有个Vol ## xxx.txt的文件。打开一看,好歹比文件名有规律一点,第一行是专辑信息,之后有些# xxx : xxx / xxx = xxx这样的行,最后还有一些#-# xxx的表示录音时间的行。于是搞了个简单的python脚本,parse这些信息存进去……

既然是parse文本,那就正则表达式。一开始可简单了。再配合glob找文件,mutagen保存歌曲信息,看上去都很美好……

直到处理没几张专辑之后我发现:格式貌似不止一种…… 接下来就是各种麻烦的事情……

有时候,因为是一个作品的各个部分,除了第一部分那行外艺术家之类信息统统没有,只有一个小标题……

有时候,艺术家信息在下面录音时间那行的末尾……

有时候,录音时间那些行不是#-#或者#,而是#、#-#、#-#这样……

有时候,xxx : xxx表示作曲:标题,但有时候,xxx : xxx表示大标题:小标题…… 还有时候,xxx : xxx就完全是个小标题……

有时候,大标题和小标题之间用—分隔,但有时候,用:分隔……

有时候,:变成了;……

有时候,/不见了……

反正一开始一个没几行的python脚本膨胀到了超过两百行,有时候还需要手动处理…… 例如有一张里面艺术家跑到了第一行专辑信息里……

最后好歹算是差不多弄完了。虽说这还是有点格式的文本(我觉得肯定是人写的),正则表达式处理还是很麻烦。如果处理系统有音乐相关信息的话,估计能够更好地完成任务(例如知道作曲家都有那些这样)……

上周投完了PLDI

这次是二作…… 上次是三作…… 反正就是我们几个……

这次的paper挺实用的,看上去肯定能中的样子。

弄了个新的带3G的Nexus 7,今天拿到一看,屏幕居然是碎的…… 外面玻璃是好的,大约是里面的液晶屏挂了。

于是找退货,Google Play Store连个退货链接都没有,倒是搜到了一个Return Policy。后来想还是打电话快,于是一个电话过去。

那边说给退,先给你发个新的…… 这个新的还要你先押钱,等到你把原来那个寄回去没有问题了再还给你……(虽说好像这个押钱只是保证你有这个钱,不会真扣……)

于是大约又要到下周才能弄到新的了,希望新的这个不会也是坏的……

Google这个Play Store比起Amazon真是弱多了…… 发货慢,界面还不友好……

PS. 居然刚刚ship了…… 看来Replacement是优先处理的么…… 印象好了点……

飓风来袭

传说中非常厉害百年一遇的飓风真的来了。
之前听说有飓风,我本来觉得大致上会和去年那次飓风差不多,最后啥事没有。
昨天跑去长岛上的Stony Brooks比赛,去的路上天上就布满乌云了。比完之后,听说因为飓风长岛铁路要提前关门,最后一班车五点五十,那时候已经快五点了,于是人们匆忙地宣布完名次发完奖,纷纷奔向火车站或者各自的车里去了。我们搭着最后一班长岛火车回到了曼哈顿,刚回来的时候还有地铁,于是我们决定先吃个饭再回去,谁知吃完了傻眼了,地铁系统关闭了一 最后打的回去,至少是平安到家了。
回家知道周一课程取消,于是今天一天就窝在家里。渐渐的风开始大了起来,雨倒是一直不大。有好几次,外面一阵风声,我感到屋子都在晃,挂在台灯上的小物件也跟着一起晃,美国人的房子这也太不结实了… 下午很早就断网了,打电话去Time Warner ,居然有自动应答系统,说我们知道你们那儿网断了,要不要修好了给你打个毛病电话啊?结果到现在了网还是断的,不知道明早会不会修好。幸好手机开了啊g流量,拿着手机tethering上网,速度也不错。虽说貌似tethering了就没有什么g了,不过速度也还行。
没法出去吃,中午就泡面解决,晚上没有泡面了,自己做饭吃… 明天大约还是这样,也可以下面。因为周日在比赛,周六训练,所以没有机会囤积粮食,只好用这些存粮来解决问题了…
看新闻貌似台风其实只是外围擦过纽约,居然就有这么大的影响。貌似57街有个塔吊断了,上面一半在空中晃来晃去… 40街以下很大一块貌似断电了,幸好我这儿还没有,只是灯常常闪。新泽西、queens那边貌似有不少地方都被淹了,曼哈顿岛上南面据说也有这个情况。说起来电视棒真不错,这种时候就能看电视了解情况了,断网了也没问题。
晚上得知明天也停课了,或许能继续宅在家里。反正在家一样干活,晚上无聊了还能看看美剧动画什么的。对受灾不是很严重的地方来说,飓风也不是那么糟糕嘛。

64位系统上的老程序

之前写的某小程序在新的64位系统上seg fault了……
gdb之后,发现是getenv()返回了一个很小的负数…… 但是getenv()返回类型是char*,应该或者返回地址或者返回NULL啊……
编译的时候有个warning,说将int转化为了pointer……

其实就是忘了#include 了…… 于是getenv()没有声明过,默认成了返回int
32位系统上无所谓,反正int和char*一样大。64位就不一样了,int只有32位。
于是,在没有声明的情况下,返回值只拿到了后32位…… 再赋给char*自然也不行。

所以c这个没有声明直接可以用的特性有什么好的,而且连个没声明的警告也没有(貌似新的gcc会给……),不如直接编译失败……

尝试训练Gmail垃圾邮件过滤器

起因是我VPS发出来的邮件被扔到 Spam 里去了……
首先根据之前经验,观察邮件的原文里的 Google 的 SPF 的评价,标记为 neutral。
为了试图将其往更好的方向转变,首先我跑去 GoDaddy 在域名信息里搞上了SPF,顺便去 PhotonVPS 开了个 ticket 让他们设好Reverse DNS。SPF用于说明这个域名允许哪些IP以他的名义发邮件,而Reverse DNS用于IP到域名的反查,如果发送者IP的反查结果能和发送者邮箱域名部分匹配上,对于垃圾邮件过滤识别结果也有帮助。这俩倒挺快,GoDaddy 那个完全是程序完成,PhotonVPS 那个 ticket 也是一会儿就有人搞定了。
再发一封邮件试试,嗯,SPF 评价为 pass 了。但是,这封邮件还是跑 Spam 去了……
Google 的理由依旧是这个邮件很像垃圾邮件,跑去看帮助,大约也就是啥你这IP好像发垃圾邮件啦,你这内容像垃圾邮件啦之类。我服务器就发发自检报告,又不骚扰别人,有啥像垃圾邮件的……

既然这样么,只好试试训练他了。GMail 有个”Not Spam”按钮,大约是能够训练垃圾邮件分类器,告诉他这个不是垃圾。
尝试性的一封一封邮件发,一封一封标记”Not Spam”… 过了大约五六封,还真不扔到Spam里去了……
再发几个,也是这样。

刚才还收到了自检报告,看来基本上算训练成了。但是不清楚这个训练对发到别的邮箱的邮件有没有用,其实整个事情起因就是发到贾叔邮箱的确认邮件进了Spam导致他找不到……
当然,如果只关心自己的邮箱,那貌似把发送者加为联系人就成了。但是我不是这个情况……

PS: 后来尝试给贾叔发了个邮件,结果这封邮件没有进Spam,看来对别人的邮箱也是有用的。