记一次坑爹的乱码解决过程

某日,我在网上下载了一些音乐,然后打开,发现了乱码。Linux系统上出现乱码本不是什么好大惊小怪的事,但是,在经过N种方法来回折腾依然无法解决的情况下,我意识到,这大约是我见过的最奇葩的一种乱码了。先上图:
An Example of the Messy Code

网站从Octopress迁移至Hexo

经过我两个小时的折腾,总算是重新把网站弄起来了。Ruby实在是坑爹,各种gem装得目录结构乱七八糟的……(强迫性人格障碍的典型表现)而且速度还慢……
曾尝试用Python和Tornado模板自己写一个静态页面生成器,然后发现我想多了。我果然还是不适合写UI……
一通Google之后,最终决定使用Hexo。它使用node.js(也就是javascript)作为编程语言(这样说恰当么?反正就是这个意思啦),据说速度极快。最重要的是,AUR源里有Hexo打好的包,能用pacman管理就是好。
主题试了一圈下来还是默认的Light看着最舒心。以后千万不能再手贱自己写主题了!!
膜拜一下Hexo的作者tommy351。自己改了一下高亮配色和Widgets,把以前Octopress的Markdown文档做了一点点修改,这样就算上线了吧。

通用存储及分布式文件共享系统的设想

Update: 本计划已无限期暂停,在可预见的未来没有重启计划,如有需要资料的欢迎发邮件索取

众所周知,网盘这东西对大众来说不可或缺,国内的在线存储服务也欣欣向荣。但是,由于各种原因,我们仍感到这些不能完全满足我们的要求。
比如各种限制、各种暂停分享、还有各种必须付钱才能用的VIP服务等。各大公司想挣钱无可非议,毕竟网络存储绝对是烧钱的主,但作为一个搞技术的人,决不能整天写登陆界面,对吧?
动机在新浪微盘数据结构解析中说了,在那之后我又研究了其他的网盘,萌生了这么一个设想。
简要的说,这个系统可以大大方便文件的传播与获取,延长资源的存活时间。

Pascal中鲜为人知的那些技巧

做为一个搞信息学竞赛这么长时间的人,再加上估计很快就要转C++了,我觉得我有必要留下一些关于Pascal语言的资料,于是就有了这篇文章。我只负责解释用法,对基础概念不了解的请自行Google。所有这篇文章里的东西应该都能在Free Pascal自带的文档里找到,我写出来是为了众多不喜欢看英文的同学们,如果你愿意自己去看一下,一定会收益匪浅。

不同进制的表示

平时我们写的常量都是十进制数,但我们有时需要写一个比如十六进制数怎么办呢?我们当然可以手动计算一下,但还有更优雅的方法。

writeln($Ff,#32,&10,#32,%100);

你觉得它会输出什么呢?它输出255 8 4!所以以$开头的是16进制数,&开头的是8进制数,%开头的是二进制数。顺带一提的是,以#开头的数会转变成对应ASCII码的字符,其实它可以和前面的三个符号共同使用,即#$20#%100000都代表了空格。

新浪微盘数据结构解析

注意!这个是微盘而不是威盘
研究这个问题的起因是有一次我需要从微盘上批量下载一堆文件。做为一个会写程序的人,我怎么能亲自做如此ugly的工作呢?这种事情当然要交给电脑做了!为了做到自动获取文件连接,于是就不得不研究这个问题了。

公钥加密

各种加密方法大体可以分成两类,一类是对称加密,另一类是非对称加密。

凯撒密码是对称加密中的一种,他的加密方法是把A变成B,把B变成C,于是解密的时候只要把字母替换回来就行了。也就是说,任何知道加密方法的人就可以解密。

RSA是一种非对称加密算法,他的特点是任何人都可以加密,但只有我可以解密。做个比喻,人人都可以把锁头扣上,但只有拥有钥匙的人可以开锁。这个分发出去的用于加密的东西叫做公钥,也被称作证书。而留在自己身边的“钥匙”就是私钥,是绝对不能被第二个人拿到的。

于是乎,你可以把公钥发给别人,别人把数据用你的公钥加密后传给你,你用私钥解密后阅读。在这个过程中,任何人截取到数据都是无效的,因为它没有你的私钥。

RSA还有一个特点,就是可以用私钥加密,用公钥解密。你会问,公钥人人都能拿到,相当于人人都能解密,那这样加密有什么意义呢?意义在于,它可以作为身份验证。用私钥加密的过程叫签名,而验证签名就是用对应的公钥解密。因为为只有用对应的私钥签名的文件才能用公钥解密,既然它可以用公钥解密,就一定是由对应私钥签署的,而私钥只有你有,于是这份文件就一定是你发布的。网络上的HTTPS就是依靠着个。一般来说,用私钥加密的都是MD5、SHA1 之类的,加密原文太耗系统资源。

对付这种非对称的加密方式,有一种叫做“中间人攻击”的攻击方法,它会使双方之间的通信完全暴露。我就偷懒不写了,大家自己找资料。

Sync with iDevice on Linux

It’s a bit hard to connect an iDevice with Linux because Apple is not so open and we have to use iTunes to sync with our iDevice for a long time. Luckily we now have a set of tool so that we can control our device on linux. The most important two library are libimobiledevice(libiphone) and libgpod.

libimobiledevice, like it’s name, is a library who provides the interface to access the iDevice. It provides a higher level of access such as photo, bookmark, install/uninstall softwares and even sync music. And it doesn’t need jailbreak.

What I want to mention is how musics synchronized with an iDevice. Under the iTunes folder (You may never seen that before. That’s ordinary.), there’s a file called iTunesDB. That’s the file which libgpod really works with. This file contains the name of songs, singers’ names, your play lists and so on. Unfortunately, because Apple don’t want it be modified by any programs except iTunes, they add some hash info into the file. If iPod found the hash is incorrect, it refused to display the songs. There was once a project called iPodHash, but it seems to be die due to a DMCA notice. Apple engineers have changed the hash algorithm for several times and the latest version haven’t been reverse-engineering, as a result, now we can only sync with a old version of iOS.

If your iDevice is jailbreaked, you can change a key called DBVersion(Sorry, I forgot where it is.). It tells iPod which version of hash algorithm it should use so we could use a known hash on new iOS. This process depends on libimobiledevice too. It only support to sync with iOS 4 or older. That means it’s useless even if you changed DBVersion on your iOS5 device. By the way, you may will not find a iTunesDB file but a iTunesCDB instead. It’s a compressed version of iTunesDB using zlib.

I feel so sad that such a project is closed and now I can only sync with my iPod on Windows.