用 iPad + Linode 替换你的笔记本电脑
抛弃你的笔记本电脑,在云端编写代码——这比你想象的要容易。
2011 年 9 月 19 日,我告别了我信赖的 MacBook Pro,开始完全在 iPad + Linode 512 上进行开发。这是一个关于在云端工作三个月的令人惊讶的故事。

图 1. 沙发上的 iPad
这一切都始于几年前我购买了我的第一台 MacBook;尽管使用了 Linux 十年,但我仍然对 GNOME 或 KDE 都不满意。在 OS X 中,我希望在一个可靠的 BSD 实现之上找到一个流畅的窗口管理器。我喜欢硬件“开箱即用”,但我怀念像样的软件包管理和 Linux 生态系统的其余部分。
虽然我喜欢为自己的项目使用 Python 和 GAE,但在工作中,我们编写运行在集群上的重量级 C++/Qt 代码,例如 200,000 个处理器的 Jaguar 机器,因此我大部分时间都在 Linux 中度过,其中很多时间在远程系统上。通常,我会在本地的 MacVim 中开发,并在远程或 VMware Fusion 下的 Ubuntu 上运行我的代码。
命运多舛的一天,VMware 和 OS X 合谋破坏了我的共享文件系统。当 dd
尽可能多地恢复时,我开始考虑完全放弃本地文件系统。令我惊讶的是,这似乎是可能的——甚至是合理的。我越想越觉得有吸引力。那时我就知道,我必须尝试一下。
事实证明,你需要的不只是一个 iPad 和一个梦想,但也不需要太多
-
iPad 2(16Gb,Wi-Fi)。
-
Apple 无线键盘。
-
Stilgut 可调节角度支架/保护套。
-
iSSH(以及可选的 Jump)。
-
Linode 512 运行 Ubuntu 11.04。
-
Apple VGA 适配器。
-
总成本:约 800 美元 + 每月 20 美元。

图 2. iPad 和键盘盒
我选择了 Linode 512,它非常适合我的需求。您可以获得出色的 CPU 性能和极少量的 RAM。令人惊讶的是,当您在命令行中完成大部分工作时,这已经足够了,但很高兴知道我总是可以在以后升级它。
我还开启了每月 5 美元的备份。以低于一杯热巧克力价格的零成本数据安全?是的,请!
Linode 的界面引导您添加新节点。选择离您自己较近的区域——您需要尽量减少到服务器的往返时间。我大部分时间在慕尼黑,所以我的服务器在伦敦,ping 值为 30-40 毫秒,这很棒。
我在我的服务器上以 32 位模式运行 Ubuntu 11.04,但他们提供了多种预构建的 Linux 镜像,以及安装您自己的镜像的选项。
要访问服务器,您需要一个非常好的 SSH 客户端。在 iPad 上,我尝试过 iSSH 和 Prompt,其中只有 iSSH 对于认真使用是可行的。在平板电脑上设置 SSH 客户端最困难的部分是在不委托给第三方的情况下将您的私有 SSH 密钥放在那里。我将我的密钥拆分到多个服务中,并在重新组合后将其删除,但更好的方法是首先使用密码 SSH 登录,然后使用复制和粘贴将密钥复制到 iSSH 本身中。
我像云一样孤独地游荡我通常在 Combinat56 沙发上躺着,一手拿着 iPad,开始一天的生活,浏览错误跟踪器的聊天记录、mercurial diffs 和其他电子邮件。
实际上,我讨厌邮件应用程序——存档帖子时的愚蠢动画增加了不必要的延迟,并且存档按钮不舒服地放置在屏幕顶部。最近,我一直在使用 Python 脚本通过 IMAP 扫描电子邮件。
接下来,我懒洋洋地滑动到 Safari,查看我当天在基于 Web 的错误跟踪器中的票证,然后返回键盘,发送几封电子邮件,然后重新开始编码——iOS5 中新的四指滑动姿势确实改善了我的生活。
但是,我正在谈论编码,这让我想起了这个设置对我有效的原因:Vim。
Vim:我在家之外的家也许这种转变如此顺利的唯一原因是,我最喜欢的编辑器/IDE 在 iSSH 控制台上运行时的外观和感觉几乎与在我的 MacBook 上本地运行时完全相同。iSSH 支持 xterm-256color,这意味着即使在终端中工作,您仍然可以拥有令人愉悦的配色方案。我所有的插件都在那里,我的代码完成、快速导航等等。

图 3. iPad 上的 Vim
我发现 Ubuntu 的默认 Vim 没有我想要的一切,但别担心!自己下载和构建它很容易。请参阅列表 1(也可在
我真的不记得我安装了哪些插件以及我实际使用了哪些插件。我只是从我的 MacVim 安装中复制了现有的 .vim 文件夹。但我每天肯定会使用这些
-
a.vim
-
cctree.vim
-
clang_complete.vim
-
color_sample_pack.vim
-
command-t.vim
-
cscope_maps.vim
-
NERD_tree.vim
-
scratch.vim
-
searchfold.vim
您可以从 http://www.vim.org/scripts 获取所有这些插件,但您可能希望安装 pathogen 并通过那种方式获取它们。请注意,command-t 需要您构建一个存根——按照 command-t.vim 中的安装说明进行操作,它就可以正常工作。
要使用 clang_complete 插件,您需要 clang。输入 apt-get install clang
应该可以解决问题。我必须摆弄一下才能让它在我的项目上工作,其中包括将所有 -I 和 -D 命令行选项添加到项目目录中的 .clang-complete 文件中。
每个人配置 Vim 的方式都不同。列表 2 显示了我的 .vimrc(也可在 https://gist.github.com/1357590 中找到)。这里的一些内容与我们的内部跟踪器系统有关,您不会感兴趣,但应该清楚大多数这些内容的作用以及哪些键绑定到它们。
简而言之,这是从我的 MacVim 环境的无缝过渡。如果我使用 Xcode 开发 OS X 应用程序或经常使用 Eclipse 或 Visual Studio,这种改变可能会让我崩溃。
碰巧的是,由于 GNU Screen 的魔力,在远程 Linode 上的终端中工作甚至比在本地工作更好。
GNU Screen 很神奇GNU Screen 就像终端会话的窗口管理器,为您提供多个选项卡、可搜索的历史记录、活动/空闲通知以及——最棒的是——持久性。

图 4. GNU Screen 栏
所以,我启动 iSSH,点击我的 Linode 连接,然后重新连接到已经运行的 Screen 会话。我所有的终端选项卡都和我离开时完全一样。其他 SSH 隧道仍然设置好了。我的光标仍然在相同的位置。剪贴板也和我离开时一样。就好像我从未离开过一样,因为对于我的副项目,我有一个不同的 Screen 会话,其中运行着一组不同的选项卡和编辑器实例——完美的分离。
能够每天返回到完全相同的会话是多么令人愉快,这很难夸大其词。在 MacBook 上,通常会有一些其他分散注意力的程序,那是我在这段时间打开的,当然,任何远程连接都会被断开。至少,我会在晚上将 MacVim 用于其他事情。这可能主要是一种心理上的好处,但感觉我可以像离开时一样轻松地重新进入状态。(列表 3 显示了一个示例 .screenrc 文件,也可在 https://gist.github.com/1357707 中找到。)
优点、缺点和 VNC在工作中,我们开发图形并行调试器,所以我不能把所有时间都花在终端上。对于动手测试和 GUI 工作,我需要 X。iSSH 有一个可行的解决方案,即使不是完美的,但对于一些额外的费用,我发现 Jump 要优越得多。
虽然它仍然不如使用鼠标与传统的 GUI 程序交互那样快速和准确,但 iSSH 的屏幕“触摸板”和特别是 Jump 的点击圈都比我预期的要好。而且碰巧的是,受到限制并非都是坏事
评估程序或对话框可用性的一个好方法是尝试仅用一根手指使用鼠标。——Joel Spolsky
iPad 上的 VNC 远没有用一根手指移动鼠标那么糟糕,但它确实让您考虑屏幕分辨率较低、字体较大以及鼠标控制没有经过多年玩Quake 和 Starcraft 磨练的用户。如果我说我没有希望 iOS 有蓝牙鼠标支持,那我就是在撒谎。
也许这是一种生活方式今天不是那些日子之一。我拆开一个巧克力羊角面包,泡一杯新鲜的茶,然后开始工作:快速 hg pull -u && make
开始重新编译,然后 Ctrl-X 到我的编辑器选项卡,并在重建发生时继续编码。Ctrl-X 是我的屏幕“热键”;它默认为 Ctrl-A,但在无线键盘上,这会在终端中留下 Unicode 字符——我认为这与 Apple 在 iOS 中对一些常见 Emacs 键绑定的支持有关。这很奇怪,但很容易解决——除非你是 Emacs 用户,我想。

图 5. iPad 和羊角面包
编码几分钟后,屏幕底部的栏通知我编译已完成。我 Ctrl-X 返回,启动一个健全性测试套件运行,以确保没有任何可怕的事情在夜间被破坏,然后再次继续编码。在四核 Linode 上编译的速度大约是在我的 MacBook 上的 VMware 中的两倍。它也完全、无比地安静。唯一的声音是我工作时键盘发出的雨滴般的噼啪声。它甚至不会变热——与努力工作的笔记本电脑的键盘相比,这是一个令人惊讶的清爽变化!
我滑动到 DuckDuckGo 应用程序,并在 Qt API 中查找一些东西,然后滑动返回。这正变得像第二天性一样,但我仍然想念用于任务切换的键盘快捷键。
经过一两个小时不间断的开发,英国团队醒了,第一批即时消息到达了。感谢上帝,iOS5 更新!我使用 imo messenger 应用程序,这很好,但当然,在通知中心之前,每条推送的消息都会用令人沮丧的弹出窗口中断我正在做的任何事情。现在,新的通知中心的行为更像 growl 通知——它让我知道,然后又消失了。
我完成了我正在处理的函数,然后四指滑动到聊天应用程序;是我的老板提醒我上午 11 点的电话会议。
基于 Skype 的电话会议在 iPad 和 iPhone 上都能正常工作;至少,像 VoIP 电话一样工作良好——也就是说,在有人重新配置 Linux 音频驱动程序几次错误启动后才能正常工作。我很高兴不必再考虑这个问题了——使用轻薄的消费者客户端和强大的 Linux 服务器,我真的很享受两全其美。
在 Skype 通话期间,我的 iSSH 会话在后台超时。它只保持大约十分钟。幸运的是,只需单击一下即可重新连接我,并通过 GNU Screen 的魔力,我又回到了我离开的地方。
就像往常一样,在修复一个错误时,我遇到了另一个明显不相关的错误。
我没有摆弄一些 Web 界面,而是切换到抓取屏幕截图(我推荐 vncsnapshot)以及任何日志文件或堆栈跟踪,这些都通过在 Linode 本身上运行的命令行脚本完成。我们使用 Best Practical RT 跟踪器(为了我们的罪过),它方便地附带了一个 Perl 脚本,可以从命令行与之交互。这样做实际上比以前通过浏览器上传更快更容易——一个带有错误描述和附件的命令,我就完成了。
云始终与你同在而且,已经是午餐时间了!我关掉 iPad,和其他人一起走了。我离开时正在进行的远程重建仍然会在那里——无需担心任何上传会被中断;毕竟,这一切都发生在 Linode 上。

图 6. iPhone SSH
午餐时,我拿出我的 iPhone 并再次连接到 Linode。不幸的是,构建在早期就失败了——办公室暂存机器之一的磁盘空间不足。iPhone 键盘有点痛苦,但对于 rm -rf /tmp/build-2011-*
来说已经足够了。我在等待甜点上桌时启动了一个新的构建。
现在我感觉吃得很饱,有点昏昏欲睡。为了保持清醒,我移动到一个站立式工作站,并在远程集群上启动了一些运行时间更长的性能测试。我发现我使用 iPad 在许多不同的工作配置之间移动——比使用笔记本电脑时更频繁。我不确定为什么——也许是因为拥有单独的键盘和屏幕使找到舒适的打字姿势更容易,或者也许只是新鲜感。
测试将需要大约一个小时或更长时间。我关闭 iSSH 并查看我的同事对即将到来的规范所做的最新规范/计划更改,这些更改存储在 Google Docs 中。
哦,Google Docs,你为什么这么恨我?具有讽刺意味的是,在云端工作中唯一不顺利的部分是使用 Google 基于云的 MS Office 替代品。移动文字处理器是个笑话,经常丢失光标位置和大量文本。电子表格版本更好,但与桌面版本相比仍然是一种可悲的体验。没有好的本地应用程序,所以唯一能做的就是强迫 Google 显示网站的桌面版本并忽略脚本错误。我希望我能说服我的团队切换回 OpenOffice.org。
测试终于结束了,结果出来了。我移动到休息区,并使用 VGA 电缆连接到大型高清电视——每次看到控制台模式的 Vim 以高清巨幕显示,我都会感到高兴。
日志中存在一些奇怪之处。我复制并粘贴了一些代码片段给一位同事,并在聊天中讨论了它们。我很高兴复制和粘贴工作顺利,尽管拥有三组不同的缓冲区(iPad、Screen、Vim)确实会时不时地导致混乱。我不禁想知道我的同事是否注意到我上个月一直在使用 iPad 而不是笔记本电脑。
下午六点左右,该回家了。尽管整天都在高强度使用,但我的 iPad 仍然显示 15% 的电池寿命。我从不带充电器上班,也从未需要过。这本身就是一种自由的味道。
一天的结束那天晚上晚些时候,我拿出 iPad 并打开 Pages 完成一篇博文。房子很安静。只有远处城市的喧嚣声从外面飘进来,与这令人愉悦的无线键盘上轻轻的按键声混合在一起。
我开始这个实验是因为我从根本上相信大多数人不想重新排列窗口、照顾他们自己的通用计算机或备份他们的数据。迟早,几乎每个人都会像这样工作,我想体验一下那会是什么感觉。我预计会发现一些行不通的东西,但随着日子变成几周,几周变成几个月,我发现我一次也没有回到我的笔记本电脑。
我不怀念重量。我不怀念编译时键盘变热。我不怀念它的脆弱性,无论是物理上的还是虚拟的。我不怀念电量耗尽。令我惊讶的是,我发现我很快乐。在云端编码并不适合所有人,但对于我的工作流程来说,这是一个完美的契合,我喜欢它。
几分钟后,完美宁静被我 MacBook 风扇的喷气发动机般的双引擎声打破,它们在后面的架子上全速运转。我简直不敢相信我过去整天整夜都在忍受这个。
尽管如此,我还是让 MacBook 运行着。它正在做我仍然经常需要的唯一一件事。它正在翻录 DVD。