新年第一天,我还在坚守工作岗位。也是在今天决定将自己的主力浏览器从Firefox向Chrome迁移。
已经无从得知具体是什么时候开始用Firefox的,只依稀记得当初用Fedora Core 1当桌面。那时Linux下主流的浏览器就是Mozilla怪兽和Opera,我对后者一如既往的不习惯。第一次用Firefox是因为Mozilla的土鳖用户界面实在无法容忍,那时候它的名字还是Firebird 0.7。到0.8的时候正式改名为Firefox,从那时候起这个浏览器大概真正算是可用了;-)
如今,Firefox发布已整整5年有余,版本号也到了3.5,3.6。某种程度上来讲,加上插件后它已经不能再算是一个简单的浏览器了,已俨然成为一个巨无霸浏览平台,Integrated Browse Environment。
Firefox发展到现在,稳定性已经不再是大问题了。我还记得1.x和2.0.x时代内存泄露问题一直没有被有效解决,直到3之后才有所改观。
目前我觉得其最大的瓶颈在于其性能,尤其表现在Disk I/O上。大家知道Firefox以SQLite来存储数据,其数据文件可以增长到几十甚至上百M,对这样在普通硬盘文件系统上的数据库文件频繁读写更新,性能能好么?当然,用Linux折腾的人已经想到把profile移动到利用物理内存创建的tmpfs上来改善性能,但毕竟太繁琐不可能普及,Windows上的Firefox Portable放到高速SSD存储上用倒是个不错的方法,冏。还有个问题就是Firefox的JavaScript引擎性能的低下,不知道的可以去看看评测,或者直接用@virushuo大虾的phpjsrsa页面做个简单的测试。Firefox 3.5.x和Chrome dev相比,差了近20倍…
目前阻碍用户向Chrome迁移的,可能主要还是Firefox丰富的插件在Chrome下有无好的替代品。
我个人迁移到Chrome的主要原因有以下几个特性:
- 多进程设计
每个tab一个独立sub-process的设计,各个tab之间可以不互相影响。万一有一个崩溃掉也不至于crash掉整个浏览器进程。当然,实际还是遇到过一个页面导致tab崩溃,继而所有tab均出错的情况 http://twitpic.com/wq93u - 沙盒(SandBox)技术有效阻止恶意入侵
以下来自Wikipedia,就不翻译了:The Sandbox Team is said to have “taken this existing process boundary and made it into a jail“; for example, malicious software running in one tab is supposed to be unable to sniff credit card numbers entered in another tab, interact with mouse inputs, or tell Windows to “run an executable on start-up” and it will be terminated when the tab is closed. This enforces a simple computer security model whereby there are two levels of multilevel security (user and sandbox) and the sandbox can only respond to communication requests initiated by the user. - Incognito模式
- 扩展
安装,删除,启用,停用或者升级后重载,都无需重启浏览器即可完成,强。比较恨Firefox更新,启/停用Add-ons之后必须重启才能生效这一点。 - V8 JavaScript引擎
- Task Manager
很有特色的工具,作为一个浏览器拥有task manager可谓绝无仅有了。
以前基本不在意这个所谓的JavaScript引擎到底能有多大区别,虽然也曾经多次看过主流浏览器JavaScript引擎性能相关测试,惊讶的发现Firefox的引擎性能竟然如此低下。Chrome的V8几乎一枝独秀,貌似只有最新版Opera的Prestro有望与之一较高下。
除了上面提到的这些特性之外,还有一点让我下定决心迁移:平时工作需要用到用Oracle ADF开发的Web应用,页面中还包含大量JS,经常导致Firefox高CPU占用且失去响应。失去响应也就罢了,最恶心最不能忍受的就是按某些特定的按钮,多次(至少7-8次)导致Firefox崩溃,继而xorg-server崩溃。这在我看来几乎有点不可思议的,浏览器崩溃能导致Linux的X Server完全崩溃并自动重启!这个后果是严重的,我甚至去找开发人员和launchpad问,也没找到问题的根源。后来才知道是ADF惹的祸,用Chrome即使所有tab都崩溃也没事;-)
目前Google Chrome只有Windows平台有稳定分支,Linux和Mac只有Beta和Dev两个channel。其中Beta相对比较稳定,而Dev则是新特性的试验田,比较激进更新很快,据说会比较不稳定,但我一直在用Dev,感觉还是很稳定的。
Chrome 必备之扩展列表
- Proxy Switchy! (替代Multiproxy Switch)
这玩意儿在Linux下一直有问题,到1.6.x才算可用。但是发现在Linux和Windows下切换代理会影响全局,这… - Domain Details (Header Spy替代品)
- Tab Menu (Tab增强)
- Super Drag
- Click&Clean (Windows Only)
- Xmarks Bookmark Sync
- Chromed Bird (我觉得是最完美的浏览器扩展类Twitter客户端,选项太强了!)
- Smooth Gestures
- AdBlock (不用多说了)
- FlashBlock (有两个同名的,自己甄别吧)
- Firebug Lite
- Chrome Flags (Flagfox equivalent)
- Chrowety (Another good Twitter Client)
- Chroemilk (RememberTheMilk)
最后,提一下目前Chrome在日常使用中存在的缺陷,还没有解决方案(若你知道,请告诉我):
没法和Firefox 3.x一样缩放Zoom Text Only,也没有此类扩展。做了一点研究,发现问题是Chrome本身,或者说上游的Chromium就没有此特性,所以短期内看来是无法解决了。
若在墙内碰到无法访问扩展安装扩展,可以用加上参数启动Chrome通过ssh -D开的tunnel proxy访问并安装;-)
Linux
google-chrome --proxy-server=socks5://host:port
Mac OS X
/Application/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --proxy-server=socks5://host:port
上面这个命令启动Chrome会出错,真不知道怎么从Terminal加参数启动Chrome…
Windows
%userprofile%\AppData\Local\Google\Chrome\Application\chrome.exe --proxy-server=socks5://host:port
补充一点:Chrome内置中文分词技术,光标移动到页面上的任何中文内容,尝试双击某个中文字符,然后看看会发生什么;-)
各位读者看到日期,估计又要郁闷了。实在对不起大家了,在draft里躺了太久,今天终于下定决心完成之;-)
一转眼,就到了2009年的最后一天了。
到这个新的国度也快要满两年了。
这一年,Twitter和Google Reader成为了知识和信息获取的核心(FriendFeed基本不看了)。
俩女儿,悉悉和尼尼都长大了,能说会跑。我和TAOTAO则都老了…
12月过得不是很顺利,不过终于要熬过去了;-) 去年的12月也有够倒霉的。
昨天下午还看到一件囧事,Macquarie shopping center的express car parking里看到一哥们儿在我去年撞瘪车门的同一个停车位上,把他可爱的敞篷Saab 93的左前部分都撞坏了。貌似恼羞成怒,横在道中央给保险公司打电话。痛恨那黄色的混凝土柱子啊,靠!
即将过去的一年里,给自己设定的目标大部分都完成了。新的一年里,会有更多的目标任务,还有挑战,bring it on!
离开回家的日子越来越近了,非常期待与家人团聚,一起过这个年。已经记不太起最近一次回上海是啥时候了。久违了,上海。
发现自己是2007年7月24日开始用Twitter,用dabr,iPhone上的Tweetie都可以看,官方应该有提供此API。最初是被搞Enterprise 2.0的同事忽悠了才开始用Twitter和LinkedIn的。
随着Twitter上朋友的圈子的扩大,follow的推优众逼近200关口。在这个数字附近起伏了很久,自己也逐渐发现timeline的信息量已经超过自己所能承受和有效获取的范围。该是时候梳理并且做一些取舍了。在必要的时候unfollow掉一些对自己来说价值不大的推优,也是不得已而为之。记得有人说过Twitter上follower和followee之间的关系不像传统IM的联系人那样是对称的。简单来说:不是你follow了我,我就一定得follow你的。若别人觉得你的tweet对他有价值的时候,自然而然就会follow你了。
其实说实在的,我很崇拜那些follow上千人还能做到基本不漏掉重要tweets的牛人,仰视中。
那么,除了unfollow之外就没有其他更好的解决方法么?
答案当然是有,这要得益于Twitter官方引入的新特性List。
官方对Lists的简单解释是:
Twitter users can now organize users they follow (or users that they don’t) into groups, or “lists”.
一个Twitter用户可以用来组织管理他们follow以及还没有follow的帐号(用户)的工具-列表。
优点:
- 可以当Email的filter来用,分离不同的用户。
- 不需要follow某个推优就可以将其加入到一个List。
- 列表可以是公开或者私有的,满足不同用户的需求
缺点:
- 目前只能通过Web或者支持list的客户端来follow列表。大多数客户端还继续停留在石器时代。
- Twitter官方没有给每个List提供独立的RSS feed。不然的话用Google Reader备份和快速搜索某个列表/推优圈的tweets简直易如反掌。
- 一个用户可以创建20个列表。不能算是个缺点,说限制更妥当,一般来说够用了。
我目前的解决方法:
将自己认为重要的推优加入到VIP(Very Important Pigs^_^)列表。这样的话,平时只要只要关注好这个列表就不会遗漏任何有价值的tweets了。至于大推友圈的timeline,能撇到多少是多少。当然,这个VIP列表是在不断增长中的;-)
在我的另外两大信息源:FriendFeed和Google Reader里也做了同样的设置,以免错过有价值地信息,目前看来效果还是不错的。
Twitter客户端:目前iPhone上的Tweetie 2和国人的TwitBird(有免费版本,Premium版本感恩节曾经免费过)支持官方的List。
以上只是我自己在使用Twitter过程中遇到问题并尝试去解决地过程,分享一下或许会对有同样困惑的后来者有所帮助。欢迎围观!
其实kexec这个快速启动技术出来已经有好几年的时间了,被传地很神秘。快速内核“热”切换,这个热字其实有着一定的误导性,导致不明真相的围观群众盲目崇拜。
先简单介绍一下kexec
kexec (kernel execution) is a mechanism of the Linux kernel that allows “live” booting of a new kernel over the currently running one. kexec skips the bootloader stage (hardware initialization phase by the firmware or BIOS) and directly loads the new kernel into memory, which starts executing immediately. This avoids the long times associated with a full reboot, and is useful on systems with high availability requirements, where minimizing downtime is of essence.
kexec是Linux内核的一个补丁,让您可以从当前正在运行的内核直接引导到一个新内核。在上面描述的引导序列中,kexec跳过了整个引导装载程序阶段(第一部分)并直接跳转到我们希望引导到的内核。不再有硬件的重启,不再有固件操作,不再涉及引导装载程序。完全避开了引导序列中最弱的一环 — 固件。这一功能部件带来的最大益处在于,系统现在可以极其快速地重新启动。对企业级系统而言,kexec大大减少了重新启动引起的系统宕机时间。对内核和系统软件开发者而言,kexec 帮助您在开发和测试成果时可以迅速重新启动系统,而不必每次都要再经历耗时的固件阶段。
kexec的好处:要求高可用性的系统,以及需要不断重新启动系统的内核开发人员,都将受益于kexec。因为 kexec跳过了系统重新启动过程中最耗时的部分(也就是固件初始化硬件设备的阶段),所以重新启动变得非常快,可用性得到了提高。
我个人一直觉得这个技术是适合被应用在生产环境中的服务器上来减少重启所需要的时间,从而减少系统和整个IT基础架构的宕机时间,提高可用性。而在桌面个上,其意义并不是太大,因此一直没有去尝试。
今天趁着Ubuntu Server有内核升级的机会,就顺便体验了一把传说中的kexec快速启动。
两个测试环境
Ubuntu Server 9.10 Karmic Koala x86
Running kernel: 2.6.31-15-generic-pae
New kernel: 2.6.31-16-generic-pae
Debian GNU/Linux squeeze/sid x86
Running kernel: 2.6.30-2.686
New kernel: 2.6.30-2.686
你没看错我也没打错,一样的也可以,因为我只留了一个内核,囧
kexec工作需要先满足的两个条件
- kernel patch: 编译的时候得选上CONFIG_KEXEC=y,该选项会打开kernel execution。
Debian sid, Ubuntu desktop和Ubuntu Server的内核都已经开启该选项。 - userspace tool: 安装kexec-tools包
Debian GNU/Linux和Ubuntu, Ubuntu Server (所有命令均假设用户有root权限)
apt-get install kexec-tools
Arch Linux
pacman -S kexec-tools
使用kexec
kexec的执行过程包括两个步骤
- 在当前被使用的内核下,将要使用的新内核载入到内存中
- 重新启动到之前预先载入的新内核
第一步:加载新内核
kexec -l kernel-image --append=command-line-options --initrd=initrd-image
kernel-image:需要重启进入的那个新内核的内核文件
command-line-options:新内核启动时必须要传递给它的命令行参数,记住在不确定的情况下,传递/proc/cmdline的内容总是最安全的
最后一个可选项initrd:启动时用到的initrd image。
更多信息请参阅man page。
第二步:载入完成之后”切换”到新内核
kexec -e
至于command-line-options,不同发行版有些出入,我就大胆假设一下能坚持看到这里的都能看明白:
Ubuntu Server
root=UUID=8850aec2-d10a-43b4-8c86-10c8d350a12e ro quiet splash
全新安装的Ubuntu 9.10,GRUB2,LVM上是这样的鸟(我工作机上的)
BOOT_IMAGE=/vmlinuz-2.6.31-16-generic root=/dev/mapper/ubuntu-root ro quiet splash
Debian squeeze/sid GRUB2
root=/dev/sda1
测试结果
1. Ubuntu Server
这个服务器跑的是文本模式,ssh到服务器载入新内核之后执行kexec -e。终端冻结无法再执行任何操作,可以看到服务器按照初始化相反的顺序关闭当前的系统:关闭进程,关闭系统服务,将cache buffers写回到文件系统,撤销交换分区的使用,unmount文件系统,重启。
可以注意到这次重启跳过了bootloader阶段,直接从内核阶段开始。这时候Linux内核获得对系统的控制权,它设置所需要的数据结构,侦测现有系统上的设备并载入所需的驱动程序,初始化这些设备,包括初始化和文件系统相关联的虚拟设备,如LVM或者software RAID。启动过程中最后一个环节涉及到用户级别初始化,由内核执行init(/sbin/init)完成。用户级别初始化阶段,内核检查文件系统的完整性,挂载/etc/fstab里列出的文件系统,激活交换分区(或者交换文件),启动系统服务,设置系统终端,并完成所有其他设置。
注意:测试了几次发现这么干有时候会导致服务器终端(显示器+键盘)无法操作,但是ssh过去还是可以正常操作的。不知是操作不当还是bug。
2. Debian sid gdm作为系统服务启动
在XFCE4桌面下执行,桌面会冻结,无法进行任何操作。重启完成后会直接看到GDM登录窗口,很容易理解。
总结一下
其实所谓的内核”热”切换,归根结底还是一个系统重启,uptime归零,不同之处在于跳过了传统的bootloader stage(包括hardware -> firmware/BIOS stage -> first level bootloader/MBR -> second level bootloader/GRUB ),直接进入了kernel stage。
很难说到底能节省多少时间,但是保守估计在不同的硬件上至少可以节省5-10秒的启动时间,甚至更多。目前还不知道kexec能否正常工作在amd64/x86_64和ppc平台上。
本文仓促中完成,若有不当之处,欢迎围观并请不吝指正。
参考及延伸阅读
http://en.wikipedia.org/wiki/Kexec
Reboot Linux faster using kexec
使用 kexec 快速重启 Linux
Inside the Linux boot process
GRUB and the x86 Boot Process
Boot Process, Init, and Shutdown
名字很奇怪吧?
故事得从我左侧脸上的一个小黑点开始,得有三四年历史了。一直没在意,只以为是痘印而已。
来到澳洲之后某一天老婆发现这个东西貌似一个黑头或者痣,而且有微微凸起的趋势。在澳大利亚这样一个上空有臭氧空洞,紫外线异常强悍且Skin cancer泛滥的国度,还是小心点好。在领导的强烈意志之下,我只得顺从。找到GP看一下,然后推荐一个Skin specialist看一下这到底是什么玩意儿。
其实不用自己掏钱,早就该去解决了。作为一个暂时持有457工作签证的民工来说HBA提供的Health Insurance确实是无可挑剔的了。甚至要比Commonwealth of Australia的Medicare都要好多了,基本上所有的费用都是100% cover,还有额外的Massage,每年可以配眼镜等等福利(可惜我用不到),当然也是有waiting period的鸟。
顺便说一句,HBA还有非常棒的iPhone app哦!事实上BUPA旗下的Mutual Community和收购来的MBF都有,用来查询网点和最近的医疗机构或者Specialists。
刚到澳洲的时候,BEA买的insurance是MBF的,和他们打过几次交道,不是很愉快。有兴趣的可以搜一下我过去的文章就知道了,一笔$2580的费用搞了5个月才搞定。
当时9月底去预约这个specialist,竟然最早也得到12月初。澳洲当前医疗体制的问题可见一斑了,人民对医疗服务日益增长的需求和永远不够用的医护人员之间的矛盾就显现无疑。虽然政府给予公民和满足条件的永久居民免费的医疗服务(基本上可以认为是免费的),但是缺乏经验丰富的医务人员的一直是pain in the arse,估计得打持久战。买私人医疗保险可以从某种程度上解决排队的问题,但是临床经验不足还是一个问题,所以就经验来说,中国的医护人员绝对可以秒杀这里的同行了。
一早便赶到Chatswood的诊所。这位来自香港的specialist技术还是过关的,不过Mandarin不过关,基本上交流以90%的英语+10%的国语,很囧。他用仪器一看便知是black head,也就是黑头。只是阻塞的时间太长了,导致皮下组织形成了了一个比普通毛孔大的空洞,油脂积聚在里面难以消除,所以就肿起来了。其实和普通的黑头没有太大的区别。他当即就决定用器械直接挤出那些玩意儿来,几分钟就搞定了,基本上不怎么疼。竟然挤出来不少东西,汗。留下一个不大的血印和一个小孔,据说10天内会恢复。不过有可能还会有同样的问题,因为皮肤组织无法恢复到原来的形状了。不过问题不大,自己挤掉就可以了…
之后就是掏钱拿receipt走人,等着回去找HBA报销了^_^
转眼都12月了,时间过得真快。离开我回家只有2个月多几天了,非常期待;-)
下载: