The adventure of my iPhone 3G

常在河边走,哪有不湿鞋… 好吧…我一打梦觉,就湿了…不过,故事还是得从头说起…

我是一个版本控,对于版本有着近乎强迫症的冲动。
我知道这不理智:更新太快,自己当小白鼠或者垫脚石;更新太频繁,白费很多毫无意义的人力和时间。
但人不总是那么理性的思考问题。特别当这个问题,其实并不是那么的重大的时候…

奇特的是,我对于手机操作系统和软件的版本,却有着出奇的耐受力。iPhone从买来到现在,就为了“复制粘贴”功能,刷了一次iOS3.x,之后就再也没动过了。
至于理由,主要原因当然还是因为我的iPhone是有锁版的水货,升级不是那么方便。但也可能和下面这篇很有名的文章有些许联系。

<Can We Make Operating Systems Reliable and Secure?>
by Andrew S. Tanenbaum, Jorrit N. Herder, and Herbert Bos

When was the last time your TV set crashed or implored you to download some emergency software update from the Web? After all, unless it is an ancient set, it is just a computer with a CPU, a big monitor, some analog electronics for decoding radio signals, a couple of peculiar I/O devices (e.g., remote control, built in VCR or DVD drive) and a boatload of software in ROM.

This rhetorical question points out a nasty little secret that we in the computer industry do not like to discuss: why are TV sets, DVD recorders, MP3 players, cell phones, and other software-laden electronic devices reliable and secure and computers not?

这是很值得思考的一个问题,但还是不要把话题扯远了,拉回来说我的iPhone 3G历险记。

最近,越来越多的App Store程序开始鄙视iOS 3.x的系统,我终于开始觉得忍无可忍,决定花点时间来刷机,升级为iOS 4.x的系统。

下面是必备的两个网址,可以说是列举的太清楚了:

我先大概说一下这些乱七八糟的东西是什么意思。

在iPhone里,设置->通用->关于本机 下面可以看到:

  • 版本 就是你的iPhone操作系统iOS的版本。这也是我升级的目标,从3.x升级为4.x。新增的内容,可以从上面提到的第一个链接里看到。
    你基本可以理解为把Windows XP SP2 升级为 Windows XP SP3。
  • 型号 是你机器的模型号。我的是MB046LL。稍微Google一下,就知道我这机器是美版有锁的。
    所谓有锁,就是说这机器因为合约的问题,只能使用美国AT&T公司的网络(通常这意味着手机更便宜),其他的SIM卡插上去无法激活,用不了。
    所以我这种机器,需要Unlock解锁 ,才能使用我中国移动的SIM卡。(另外一种办法是使用卡贴,就是在SIM卡上加一层东西,让iPhone误以为是AT&T的SIM卡)
    而Unlock需要用到的软件,叫做UltraSnow超雪。
    iPhone上的程序出于安全性和稳定性等等因素的考虑,是在一个个沙盒中运行,与外界有着清晰定义的边界,同时,权限也受到极大的限制。
    因此像UltraSnow这种程序是不可能以正常的方式实现的,他需要更高的权限。
    要想获得更高的权限,以安装UltraSnow,我们需要先JailBreak越狱我们的iPhone,让我们逃出iPhone沙盒的监牢,自由驰骋。
  • 调制解调器固件 就是我们通常说的Baseband基带版本号。 这也是刷机最容易出问题的地方。
    原因在于,刷机刷坏了,我们可以简单的重新刷一遍覆盖回去。但基带版本却只能升高,不能降低。
    前面提到过UltraSnow解锁,其实就是需要在基带中找到他的漏洞以破除限制。
    我们有iPhone Dev Team等一些组织在进行解锁和越狱的工作,但这毕竟需要时间。
    在破解出来以前,如果你提前升级刷新iOS, 导致基带升级,就会让你的iPhone能够越狱,却无法解锁,从而变身为iPod Touch。

在刷机之前,必须先确认好上面这些信息。从上面提供的两个链接,可以查到所有你需要的版本信息。

对于我的iPhone 3G而言,最新的iOS版本是4.2.1,也是我升级的目标版本号。值得一提的是,这个版本号是Final的,也就是说对iPhone 3G而言,以后这个版本号不会再增加了。

4.2.1对应的Baseband号是05.15.04, 我如果刷官方的固件(也就是来自苹果的iOS4.2.1映像),就会把我的iPhone的基带升级到05.15.04。虽然4.2.1可以越狱,但05.15.04这个基带版本是UltraSnow不能解锁的。

所以正确的做法是保留当前的基带升级。这种方式需要自己制作iOS4.2.1的固件,而不是使用官方的固件。制作方法在Mac上用PwnTools,在Windows上用SnowBreeze。制作好之后,在最新版的iTunes里用Shift+Update进行升级就可以了。这样就可以即升级了系统,又保留了基带,还越了狱。

到目前为止,都还正常。问题开始于我对基带版本的追求。

我之前刷iOS3.x的时候的基带版本是04.26.08。虽然05.15.04是没破解的,但05.13.04是有破解的,所以我想先刷到对应的iOS4.0.2,以升级基带到有破解的05.13.04,然后再保留基带升级iOS到4.2.1。

想来一切顺利,但可恶的苹果在iTunes里恢复固件的时候设了一个障碍,就是网上看到的那个SHSH Blob。这个东西是用来阻止你升级到较老的iOS版本的。也就是说,我用iTunes升级4.2.1没问题,但升级到4.0.2就必须得有那个SHSH Blob,也就是苹果的“YES, GO AHEAD”的响应。要绕过这个,你得首先之前备份过4.0.2针对你设备的SHSH Blob。这既可以自己用工具备份,也可以用Cydia来备份。如果用Cydia备份过,就可以改hosts文件来指向Cydia提供的一个伪造的应答服务器,欺骗iTunes让你升级到较老的iOS版本。

简言之,对我而言,就算失败了。于是,我一怒之下,直接升级到了4.2.1,当然固件也就升到了没有破解的05.15.04。这纯粹是冲动的惩罚… 于是iPhone也摇身一变,成了iPod Touch。

由于4.2.1是Final的iOS,我也不指望以后再升级这个手机。更关键的是,有更多更新的设备让iPhone Dev Team等去忙,要干等iPhone 3G 05.15.04的解锁是不现实的。

我最后的期望就是继续升级到iPad baseband 06.15.00。这个基带是有UltraSnow破解的,但坏处是:

1. GPS废了;
2. 以后不能再回退到iPhone的官方固件或基带;
3. 据说有耗电量大,发热等情况。

升级过程也不是很顺畅,因为RedSn0w的“install ipad baseband”在我的几台电脑上都要异常退出,我最后是在一台Mac OS X Snow Leopard的虚拟机里,用PwnTool做了个自制固件来升级基带到iPad的06.15.00。不过如前所述,PwnTool制作自制固件一般都是为了保留基带不升级。所以你得下载专门的一个Unlock版。

之后就很自然的装UltraSnow解锁基带, 除了GPS都正常了。耗电量和发热的问题也是可以解决的。只需要用RedSnow来Deactive你的iPhone,然后装SAM来从你的iPhone自身激活自己。

最后值得一提的,4.x系统里多任务的选项就不要开了,iPhone 3G那点内存,完全没法支持多任务的。尽管iOS 4.x的内存管理比3.x好太多太多 。

Google Code Jam 2011 (Qualification)

书接上篇

1. [84%/98%] Bob Trust: 两个机器人并行依次按钮

由于要依次按钮,所以并行能节省的时间,只有另外一个机器人移动的时间,而它按钮的那一秒钟是不能节省的。

2. [87%/82%] Magicka:依次合并或者清除元素

由于即使是大数据集,合并列表和冲突列表个数也不过36和28,所以最好直接把这两个列表反向来进行匹配,而不是在后面的匹配测试中去正反测试两遍。
另外注意先合并,后判冲突。

3. [90%/85%] Candy Splitting:加法改异或

按题目叙述,不难发现Patrick的错误加法真值表与异或XOR运算相同。由于没有进位,可以单独看每个二进制位。
如果某一个二进制位上,1的个数为奇数,则无论如何划分,都不可能使得最后异或结果相等。
如果1的个数为偶数,则可以任意划分,但需要保证可怜的Patrick至少分到一个糖果。
所以排序后取最小的数给Patrick,其他的全部留给Sean。

4. [58%/97%] GoroSort:概率排序

首先注意,下面这个Smallest的条件很容易被忽略掉:
The second line of each test case will contain a permutation of the N smallest positive integers.

然后由于每个数都已经知道最后需要所在的位置,所以排除掉已经在目标位置的情况,其他的每hit一次,有1/2的机会回到正常的位置,再加上,占据现有位置的那个数,以后会有1/2的机会回到它自己的位置,所以只需要每个不在目标位置的数上累计加一就能得出结果。

这题最挨打的,就是那个%.6lf。 我是用整数表示,然后后面加6个0。这个实在太误导了,让人以为会计算很复杂的概率。

PS 最后,这次的GCJ Command Line Tool还蛮好用的,呵呵~

GCJ 2011 Qualification Round Solution Download