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

最近用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脚本膨胀到了超过两百行,有时候还需要手动处理…… 例如有一张里面艺术家跑到了第一行专辑信息里…… 最后好歹算是差不多弄完了。虽说这还是有点格式的文本(我觉得肯定是人写的),正则表达式处理还是很麻烦。如果处理系统有音乐相关信息的话,估计能够更好地完成任务(例如知道作曲家都有那些这样)……

尝试训练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,看来对别人的邮箱也是有用的。

关于ICS/JB下命令行启动程序segfault的问题

其实很多人研究过这个问题了,只是最近我碰到这次原因有些不同…… 症状是在命令行执行命令碰到segmentation fault,logcat里有: W/dalvikvm(12364): Exception Ljava/lang/NullPointerException; thrown while initializing Ljava/lang/System; W/dalvikvm(12364): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing Ljava/lang/ClassLoader$SystemClassLoader; …. I/dalvikvm(12364): java.lang.ExceptionInInitializerError: I/dalvikvm(12364): at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:125) I/dalvikvm(12364): at dalvik.system.NativeStart.main(Native Method) I/dalvikvm(12364): Caused by: I/dalvikvm(12364): java.lang.ExceptionInInitializerError: I/dalvikvm(12364): at java.lang.ClassLoader.createSystemClassLoader(ClassLoader.java:100) …. I/dalvikvm(12364): Caused by: I/dalvikvm(12364): java.lang.NullPointerException: I/dalvikvm(12364): at java.util.Hashtable.put(Hashtable.java:365) I/dalvikvm(12364): at java.lang.System.initSystemProperties(System.java:286) I/dalvikvm(12364): at java.lang.System.getProperties(System.java:260) …. 原因大致上就是LD_LIBRARY_PATH里少了东西。ICS以后的系统,启动Android那套VM需要LD_LIBRARY_PATH里必须要有一些路径,默认是/vendor/lib和/system/lib,试下来至少要/system/lib,否则会找不到库,然后…… 不清楚之后发生了什么,反正最后就导致上面那个错误…… 但是默认情况是有的,啥时候没有呢?其实这次碰见bug是因为,我为了弄到root把shell(/system/bin/mksh) setuid了…… …

Continue reading ‘关于ICS/JB下命令行启动程序segfault的问题’ »

Xoom更新4.1.1

之前听说Android 4.1.1在Xoom上公开测试了,昨儿听说已经OTA了,于是去系统设置里检查更新,没有…… 去网上看,说可以清除Google Service Framework的数据再试。试了一次,果然刷出来一个更新,4.1.1的。Google这是故意的么…… 下完之后,更新,刚过百分之十几,就成了个倒了的Android的样子,上面还有个红色三角。 根据经验,反正是升级败了。重启,去/cache,发现recovery目录里有last_log。看最后说啥验证失败。 E: failed to verify whole-file signature E: signature verification failed Installation aborted 我一开始以为是更新包验证败了,但是弄到电脑上,能正常解开……(更新包就在/cache里,一个zip) 那估计和上次一样,因为这是个补丁包,所以要先验证源文件正确,才能打补丁,而某些文件可能被改过了,在Root或者别的时候。 这时候我想起来,上次见到过一个叫OTA RootKeeper的东西,可以在更新后保留Root,就去装了一个,打开之后,选保留Root以及暂时unroot。 然后重启到EOS Recovery,尝试装那个zip,果然有apply_patch_check失败的,首先是/system/bin/gzip。进去一看,貌似被改成了到busybox的链接…… 大约是哪个busybox安装器干的好事。从网上下了一个4.0.4的完整镜像,从里面扒出gzip换掉系统里那个符号链接,再试,这次换成了ip。重复操作,搞定了ping和toolbox之后,这次是boot分区校验和挂了…… 重启到fastboot,刷那个4.0.4镜像里的,再更新,还是不行…… 想想大概是4.0.4那个镜像的boot改过了,去下载的地方,发现是root过的镜像…… 搜了一圈,就是找不到没root过的4.0.4 boot分区。 网上的恢复办法都是刷回3.x然后一路更新上来,好像很麻烦…… 我想,可以弄来3.x的boot.img和之后所有的补丁,一路打上来,弄到一个4.0.4的boot.img,再刷进去…… 在xda的http://forum.xda-developers.com/showthread.php?t=1597609这个帖子里有个网站,里面有3.0.1的原始镜像和所有升级包。把镜像里的boot.img和升级包里的所有boot.img.p扒出来,然后就是咋打补丁的问题了。 我记得android里有applypatch,于是去android source里面找,果然有这个东西。尝试编译一份主机可用的,居然成功了,命令如下: 在applypatch目录里 gcc utils.c imgpatch.c bspatch.c freecache.c bsdiff.c main.c applypatch.c -o applypatch -I../../../system/core/include/ -I../ ../minelf/Retouch.c -lbz2 -lz ../../bootloader/legacy/libc/sha.c ../mtdutils/mtdutils.c 然后跑,发现命令格式挺简单,就是 applypatch …

Continue reading ‘Xoom更新4.1.1’ »

在FreeBSD上装linux skype 4

折腾了一个晚上好歹是搞出来了…… 起因是把linux_base更新到了linux_base-c6,也就是CentOS 6。这是个相当新的版本,各种rpm找起来也比较容易。 但是问题是,ports里其他linux包基本都是老的,要么是fc4的,要么是f10的…… 反正用不了。于是统统删掉。但是这样linux程序基本就跑不了,缺很多包…… 于是就自己搞rpm来装。但是rpm这回又不好使,试了ports里rpm3/4/5貌似都不行。 怀疑是因为rpm调了cpio,而FreeBSD 8-STABLE里的cpio貌似还不支持xz? 因为CentOS那些新包是xz压缩的,于是就解不了。 后来干脆不管rpm了,搞个脚本: if [ ! -f $1 ]; then wget http://mirror.yandex.ru/centos/6.2/os/i386/Packages/$1 fi rpm2cpio $1 | unxz > ~/tmp cd /compat/linux sudo cpio -idv < ~/tmpif [ ! -f $1 ]; then wget http://mirror.yandex.ru/centos/6.2/os/i386/Packages/$1 fi rpm2cpio $1 | unxz > ~/tmp cd /compat/linux sudo cpio -idv < ~/tmp …

Continue reading ‘在FreeBSD上装linux skype 4’ »