Chrome 8 进程的疑惑

最近一直习惯用Chrome打开多个网页,时间一长,就发现硬盘一直在高速旋转。一开始以为是公司的监控软件的原因,就忍了。知道今天早上,电脑持续很长时间的没反应之后,弹出对话框说某个plug-in一直在运行……当时只有Chrome浏览器在工作,这个plugin只可能是Chrome的…… 关掉chrome后,硬盘还是高速旋转,打开任务管理器,发现还是有很多chrome进程在运行,很明显这些是跑飞了的chrome进程了。

 

杀死所有chrome残留进程之后,我重新打开chrome浏览器,打开几个tab,对比Windows任务管理器、chrome任务管理器,发现了一些有趣的现象:

 

Chrome运行时截图

 

Windows任务管理器中的Chrome进程

 

Chrome任务管理器中的Chrome进程

 

可以看出:

  1. Chrome任务管理器中所耗内存的数值比Windows任务管理器中显示的要小很多;
  2. 实际打开了8个Tab,在Chrome任务管理器中却有12个;
  3. Chrome任务管理器显示有17个Chrome进程,而Windows任务管理器却显示有18个Chrome进程。

等将来有时间时,好好研究一下这些问题。

-----------------------------------------------------------------------------------------------------------

Update: 2010-100-26

 

Chrome 8 dev升级到8.0.552.11已经有一段时间了,虽说该升级版本已经修复了一些Chrome进程僵死的bug,但运行时间一长,该问题还是会出现的。

 

手机引发的思维定势

早晨你一睁眼,发现早已天光大亮,不禁疑惑为什么手机的闹钟没有响。爬起来打开手机一看,满屏八糟的英文字母——Oh, my god,你的手机怎么了?!凭着自己几年程序员的经验,匆匆瞥一眼最后一行的提示,按下<Home>键,满屏的英文字母变成了一个巨大的惊叹号,然后就无论你怎么操作都不再有反应了……病毒?系统崩溃?还是硬件错误?

你略加思索,然后打开手机后盖,拆掉电池然后重新装上,开机,终于等来了久违的“HTC”这三个字母。你沾沾自喜,大多数软件问题都可以通过重启系统解决……“HTC”这三个字母很快就变成了Sprint的开机动画——你的手机是水货,Sprint定制的HTC的EVDO Android手机​——当你的信息更加坚定之时,突然手机左上角的提示等闪了两下,整个屏幕黑暗了……

你重新开机,重新看到HTC,重新看到Sprint,这次还看到了Android的小机器人,你开始紧张,左上角的红灯又闪了两下,屏幕再次变暗……反复几次,重启并没有解决问题……OMG,花几千块钱刚买了不到一年的手机竟然无法开机!你抓狂了……

中秋那天你陪你老婆去天安门看巨型牡丹,拍照时你那素有“破坏之王”美誉的老婆把你的手机摔了一下——一下摔倒了手机的右下角和右上角——感谢毛爷爷,你的手机捡起来还能继续用。是的,是能用的,因为昨天晚上你还用它给你妈妈打电话。但会不会是因为摔了那一下把某个芯片的焊点摔松了,尽管当时能work,时间一长就脱焊了?很有可能。

不管是不是硬件的问题,你都得先试试通过软件能不能修复——这也是你唯一有可能控制的东西。你想按一下<Reset>回复到出厂设置,但你又担心这样一来不仅删除了所有已经保存的信息,而且由于中美CDMA手机之间的差异,这手机必须得破解、写号之后才能用,而这,是非常恐怖的事情……好在你终于还是无法找到那个<Reset>小孔,否则你很难保证能战胜心中按下它的欲望。

看来这手机只能慢慢修了。可是你最近又非常忙,忙工作,忙自己的事情,根本没时间也没心情去搞一部坏了的手机。即使有了时间有了心情,你对于Android只有一个肤浅的认识,怎么进入debug模式都不知道,又谈何修复?于是你的头越来越大……

好在还有去年的一部旧手机可以用,虽说破了点,但能打电话,将就一下吧。你翻箱倒柜把它找出来,插上卡,开机,果然还能用。

你稍稍冷静了一下,边洗脸刷牙边考虑接下买什么手机……HTC的?算了,坏了的这个就是HTC质量的写照,本来去年就是本着支持国产(虽说HTC是台湾的企业,但你坚信台湾是中国不可分割的一部分,因此你对所有的台资企业和大陆企业一视同仁)品牌和Google去买的这款手机。Moto?高端的贵了点,低端的差了点。Nokia、三星直流不予考虑。iPhone?贵了点,还得换运营商,而且那两家运营商的资费都很不靠谱,还三天两头骗我们,算了……要不就还是先用这个能用破手机,然后等iPad2出来买个iPad吧,反正买智能机也不过就是为了能在漫长的等待的过程中看电子书,比如等班车的时候,等着下车的时候,等着上菜的时候……

吃早饭的时候,你决定边吃饭边再做一下最后的努力来看看那个HTC的手机能不能修复。你又重启了两次,还是那个样子。突然,你意识到,左上角红灯闪的时候,都是电池没电的征兆……可这手机是昨天晚上才充好电的啊……你试着插上电源,开机,你成功了!

于是你终于搞清楚了问题的所在:昨晚睡觉前,你的手机还可以正常工作,可是在夜里不知道某个时候,手机的某个程序崩溃了,这就是你今早第一次开机时看到的满屏英文字母要说的事情……这个问题应该是可以通过重启系统解决的,可由于昨夜系统崩溃后,手机的电源控制模块不能正常工作,很快就把手机电池的电耗光了,于是今天早晨你每次开机的时候,都只能开到一半,因为系统检测到剩余电量不足,就强行关机了。

本来是个非常简单的问题,而你的惯性思维斗了一个大大的圈子,才发现其本质所在。你应该庆幸,你也有了经验,不再是乳臭未干的小子。你应该悲哀,因为不知道什么时候,你就会为你的思维定势所累。

Ksh中的$*和$@

The meaning of $* and $@ is identical when not quoted or when used as a
parameter assignment value or as a file name.

 

However, when used as a command argument, "$*" is equivalent to "$1d$2d..." , where d is the first character of the IFS parameter, whereas "$@" is equivalent to "$1"
"$2" ....

How to Clone VMs in ESXi

 

1. Create a new VM (clone2) without a disk equipped.

2. Use the VM tool to clone the disk from
the existing VM to the new VM. Usually, you can find all the VMs in the /vmfs/volumes/datastore1/.

vmkfstools -i /vmfs/volumes/4c3b50b8-d57dc2fc-d2b7-00241d1852fa/Test_wjh/Test_wjh.vmdk /vmfs/volumes/4c3b50b8-d57dc2fc-d2b7-00241d1852fa/clone2/disk1.vmdk

 

 

3. On the client add the cloned disk to the
VM clone2

 “edit settings… ->  Harware -> add “hard disk” -> “using
existing virtual disk” -> find the “disk1.vmdk” and choose it.

 

4. Power on the VM.

 

[Warning]:

  • You must shutdown the VM which you want to clone.
  • The cloned VM is identical to the original one, including the physical address(MAC) of the network card, the network configuration and so on. So, please change such config after clone. 

Linux下如何删除已安装的realplayer

由于realplayer在Linux下只能通过realplay*.bin来安装,装好后不能通过yum或rpm卸载。现在的realplayer已然成为名副其实的垃圾软件,Linux下尤其如此。

 

卸载它的办法就是通过locate realplay命令找到所有realplay相关的文件,然后统统删除之!

 

realplayer=$(locate realplay)
echo $realplayer
rm -rf $realplayer

Splashtop Remote——让你在iPad上也能用Windows下的应用

今天看到这样一篇博文:在iPad上也能用Windows下的应用?我能!

 

对于文中介绍的可以在iPad上也能用Windows软件的Splashtop Remote很感兴趣,因为传说Chrome OS也会用类似的机制来解决Windows软件的兼容问题,即“一部分运行在PC上,起daemon的作用,另外一个运行在iPad上,跟PC的软件进行通信,使用户能够控制或管理PC上的软件程序和数据。” 这应该和VNC起的作用类似。

 

估计iPad和即将发布的gPad(Chrome OS Tablet)乃至Android Pad们很快就会利用这种方式开拓市场,甚至蚕食PC市场了。试想如果将来有公司(比如这个DeviceVM)推出一项服务(可以免费,也可收费),为用户提供现成的Windows应用,而用户所需要做的就是在iPad或gPad上安装Splashtop Remote,打开这个应用就可以自动连接到DeviceVM的Windows PC/Server,利用现成的Windows程序了——省去了自己购买并维护PC的很多麻烦,节省了购买大量Windows软件的开支,何乐而不为呢?而且这也正契合了时下的云计算潮流。

 

我能想到的问题是,这种方式使用Windows软件的体验会不会大打折扣?因为在使用VNC登录到Mac OS X的时候,即使在局域网内,图像质量很差,操作很不流畅。也许像Splashtop Remote这样的应用可以保证图像的质量,但是网络本身也会成为一个瓶颈,尤其是3G网络。看来在LTE普及之前,这种应用只能使用WIFI了。

 

顺便到Apple App Store里看了一下,发现了几张官方的截图,可以看出,图像质量还是有一定的损失的:

 

 

 

 

 

 

Tcl/Expect中利用exec调用管道"|"和awk的注意事项

Tcl/Expect中利用exec调用稍微复杂的shell命令时,经常会遇到一些小问题,常见的就是pipeline(|)和awk。

 

Tcl/Expect调用多个shell命令并使用|将其串接在一起时,需要注意的是必须在"|"前后加上空格" ",否则tcl/Expect会报奇怪的错。

 

Tcl/Expect调用awk命令时,需要把awk的' '中的命令改为用" ",并把$1, $2之类的变量改为/$1, /$2。

 

下面的ksh命令判断test_process是否在运行:

ps -fu bonny|grep -v ps|grep MMCAP|grep -v grep|awk '{print $2}'

 

改为Tcl/Expect后,为:

exec ps -fu $myname | grep -v ps | grep COOLrunMMCAP | grep -v grep | awk "{print /$2}"

 

 

另外, http://www.linuxquestions.org/questions/linux-software-2/ksh-tcl-173092/ 列出了一些ksh命令转换为tcl语句时经常遇到的问题(本人未曾验证过,请谨慎使用)。

 

Here's some conversion rules that I have proven, if anyone has any more info ( in any fashion ) , please advise.

-----------------------------------------------------------------
Rule: Remove "
-----------------------------------------------------------------
ksh: cat *.passwd 2>/dev/null | cut -d":" -f1 | sort | uniq
tcl: exec cat *.passwd 2>/dev/null | cut -d: -f1 | sort | uniq
-----------------------------------------------------------------

-----------------------------------------------------------------
Rule: Replace '(..$1..)' with "{../$1..}"
-----------------------------------------------------------------
ksh: ps -eaf | awk '(print $1}' | grep $1 2>&1
tcl: exec ps -eaf | awk "{print /$1}" | grep $user_login_to_test
-----------------------------------------------------------------

-----------------------------------------------------------------
Rule: Replace "..." with {...}
-----------------------------------------------------------------
ksh: grep "^$(user_login:" /etc/passwd /etc/shadow 2>&1
tcl: exec grep {^$user_login:} /etc/passwd /etc/shadow
-----------------------------------------------------------------

-----------------------------------------------------------------
Rule: Replace '...' with "..." or {...}
-----------------------------------------------------------------
ksh: grep 'Version' user.tcl
tcl: exec grep {Version} user.tcl
tcl: exec grep "Version" user.tcl
-----------------------------------------------------------------

 

还有就是http://wiki.tcl.tk/1039列出了使用exec的一些常见问题。

expect_out(buffer)中包含send的数据

 

expect_out(buffer)中包含send的数据

我一直以为在Expect中一旦执行send之后,expect_out(buffer)就会被清空,直到有新的数据被填入,而恰恰就是这些数据被用在expect语句中。而今天在调试时发现的问题却令我大吃一惊,原来expect_out(buffer)不会被自动清空,而expect到的数据很可能不是你真正想要的,非常有可能是历史数据。"expect_out(buffer) has the content of the previous send" 一文也指出了这个问题。

 

 

比如在我的代码中,有如下片段:
set prompt "#"
set lockfile "/root/tmp/.cool.lock" 
send "
if /[ -e $lockfile ]; then
        cat $lockfile
else 
        echo /"COOLID: $coolid/" > $lockfile
        echo DONE!
fi
/r"
sleep 1 ;# necessary
expect {
        timeout {
                puts stderr "WARNING: $ME: cannot verify if the Linux AP is locked by other COOL session!";
                exit 2;
        }
       -re "COOLID: (/[1-9](/[0-9])*).*$prompt" {
                puts stdout "expect_out(buffer)=$expect_out(buffer)"
                puts stdout "expect_out(0,string)=$expect_out(0,string)"
                puts stdout "expect_out(1,string)=$expect_out(1,string)"
                puts stdout "expect_out(2,string)=$expect_out(2,string)"
                puts stdout "expect_out(3,string)=$expect_out(3,string)"
        }
        "DONE!"  ;# do nothing    
}

 

无论$lockfile是否存在,expect总会得到COOLID: 68,而expect_out(buffer)的出如下:

[root@bjvsmcl05 ~]# expect_out(buffer)= 
Last login: Fri Jul 23 09:32:13 2010 from bjbldd
[root@bjvsmcl05 ~]# 
[root@bjvsmcl05 ~]# if [ -e /root/tmp/.cool.lock ]; then
>         cat /root/tmp/.cool.lock
> else 
>         echo "COOLID: 68" > /root/tmp/.cool.lock
>         echo DONE!
> fi
COOLID: 1234
[root@bjvsmcl05 ~]# 
[root@bjvsmcl05 ~]#
expect_out(0,string)=23 09:32:13 2010 from bjbldd
[root@bjvsmcl05 ~]# 
[root@bjvsmcl05 ~]# if [ -e /root/tmp/.cool.lock ]; then
>         cat /root/tmp/.cool.lock
> else 
>         echo "COOLID: 68" > /root/tmp/.cool.lock
>         echo DONE!
> fi
COOLID: 1234

 

由此可见,由于expect_out(buffer)中含有send的echo "COOLID: 68",因此永远都能匹配到这个数据。

由于没有找到一种可以清空expect_out(buffer)的方法,无法实时地将expect_out(buffer)清空。我能想到的解决方法有两种:一是更改send和expect的内容或方式,避免send的内容中出现expect的模式(pattern)。比如在我的程序中把上述代码段改为:
set lockfile "/root/tmp/.cool.lock"   
send "cat $lockfile/r"
expect {
        -re "COOLID: (/[1-9](/[0-9])*)" {
                puts stdout "expect_out(buffer)=$expect_out(buffer)"
                puts stdout "expect_out(0,string)=$expect_out(0,string)"
                puts stdout "expect_out(1,string)=$expect_out(1,string)"
                if { [string compare $expect_out(1,string) $coolid] } {
                        puts stdout "ERROR: $ME: $pcname has been reserverd by COOL session $expect_out(1,string), please choose another Linux PC instead./n"
                        exit 2;
                }
        }
        "cat: $lockfile: No such file or directory*" {
                send "echo /"COOLID: $coolid/" > $lockfile/r"
        }
}

 

就可以正常工作了。
另一种方法是按照"expect_out(buffer) has the content of the previous send"的例子中的方法,set prompt,保持原始代码中send的内容不变,将expect的正则表达式改为 -re "fi(.*)$prompt",如此一来希望的输出就在expect_out(1,string)中了,然后利用string或者lsearch命令对匹配到的数据进行分析。

结论:今后在编写Expect脚本时,不仅要考虑每一步的send/expect,也还要考虑到这一步的expect的内容有可能出现在之前的历史数据中。

 

 

Here Document

Here Document

Syntax:

command << label 
input line 1 
… 
input line n 
label

This allows you to redirect input to a shell script from within the shell script itself.

  • << label indicates that label marks the end of the here document
  • label must appear on a line by itself to end the here document
  • << 'label' prevents the shell from doing parameter and command substitution in the here document
  • <<- label deletes leading tabs (but not spaces) from the here document

Here Document Example 
(from page 189 in "Learning the Korn Shell")

pgmname=$1 
for user in $(ypcat passwd | cut -f1 -d:) 
do 
  mail $user <<- EOF
  Dear user, 
  A new version of $pgmname has been installed 
  in $(whence $pgmname). 
  Regards, 
  Your friendly sysadmin 
EOF 
done

 

原文: http://snap.nlc.dcccd.edu/reference/scarlatos/cis2.50/note6.html

浅析Apple iPhone4天线问题的危机公关

 

浅析Apple iPhone4天线问题的危机公关

 

iPhone4的天线问题甫一曝光,乔帮主就故态复萌了,拿出25年前打死不认亲生女儿的尽头,摆出死猪不怕开水烫的嘴脸,直言这个问题是由于用户的握手机的姿势不对引起的,言外之意就是碰到问题的这些用户太白痴,连如何正确握手机都得要别人教。很不幸的是,敝人也是习惯左手握手机,也是被乔帮主鄙视的那群人之一。

乔帮主的言论客观上激起了媒体和更多用户的不满,一大撮人巴不得Apple出事呢,现在苦苦等待了好几年的机会终于来到了,岂有坐视的道理?于是媒体铺天盖地的报道iPhone4的天线问题,科技专栏作家不断发表自己的看法,评测公司不断发布最新的评测……

Apple深知此事不能不了了之,于是又宣称会尽快推出新的固件来修正之前iPhone的信号显示的bug——iPhone4的信号之所以在握住某个点之后会大幅下降,主要原因是之前的信号显示是被夸大了的,也就是说之前的信号其实本来没有那么好,iPhone会故意将信号条设为满格,给用户以iPhone信号良好的假象。我相信这样做的绝不只Apple一家,其他厂家肯定也会搞这种小动作,只是程度不同而已。

但很快就有新的分析和测试出炉,固件升级不可能解决iPhone4掉话的问题,因为这个问题是由硬件引起的,确切而言是天线的设计缺陷——软件不可能修复这种硬件的缺陷。而直到此时,Apple还没有同意免费为用户提供可以解决掉话问题的iPhone4保护套,用户还不得不掏30美元去买保护套。

媒体继续穷追猛打,Apple必须得给出一个说法了。于是本周五,乔帮主专门召开了一个发布会来解释iPhone4的信号问题。一向喜欢在最后5分钟报道米国人民生活于水深火热之中的《新闻联播》当然不会放弃这样一个好机会,专门报道了这个消息——迷信水果出品的一小撮不明真相的群众们,你们该醒醒了!即便牛B如iPhone4者,照样问题多多!还是赶紧买我天朝自产的XX吧!……

感谢CCAV,在我吃饭的时候报道了这条消息,吃完饭后我赶紧上网仔细看了看相关报道。今天在新浪科技上看到了《直播实录:苹果iPhone 4信号问题发布会》。看完之后,坦白讲,我被乔帮主的真诚感动了。下面简单分析一下乔帮主的思路。

 

首先,在所有智能手机中iPhone4拥有最好的销量和最佳的口碑——iPhone4天赋异禀,瑕不掩瑜——先定好基调很重要。

所有的手机都不是完美的,iPhone4不是,其他手机也不是,iPhone4存在的天线问题在其他手机上照样存在——老乔我阴沟里翻船了,你们在岸上的也休想有好日子过!空口无凭,图片为证,老乔把其他手机的信号锐减的情况逐一摆在大家面前。需要注意的是老乔在演讲中提到说类似的问题也存在在诺基亚手机中,但在presentation中却不见又诺记的图片,因此我怀疑Apple至今肯定还没有诺记信号问题的切实证据,老乔故意制造烟雾弹。也有另外一种可能是,在乔帮主眼中,就诺基亚那样低劣的工业设计,根本不配是Apple的对手,因此在presentation中放它一码。

 

 

接下来乔帮主介绍了Apple在手机天线上的投入——神秘的“black”实验室、过硬的技术人员和大量的资金投入——两层含义:我们很重视手机天线的设计的,尽管iPhone4的天线存在问题,但绝对不可能是大问题;我们有这么大的投入尚不能解决的问题,其他公司又怎么能彻底解决呢?
然后乔帮主拿出了hard data来说明iPhone4的问题,除了掉话率iPhone4比iPhone 3GS稍高一点之外,返修率和退货率都要低很多。在这里,乔帮主的下面这张slide制作的实在是太有水平了,不仔细看怎么都不觉得他是在承认iPhone4的问题,分明是在炫耀他的成绩嘛!

 

其实iPhone4的这些数据很难说明问题,因为一是因为它上市的时间太短了,而且上市的地区有限(iPhone 3GS是在欧美多国同时上市的,而iPhone4只有少数几个国家);再者就是天线信号显示条都可以随意更改,这数据又有何不可呢?

至于问题的解决方法,乔帮主终于同意了免费为用户提供手机套——这是对他们最为有利的方案,如果接受媒体和业内人士的召回的建议,Apple的损失将是惨重的。为了进一步打消某些人仍然抱有的召回的幻想,乔帮主在Q&A的环节中干脆暗示召回也很难解决问题,原因就是这是智能手机的通病,不可能在短期内有最终解决方案。
最后,乔帮主竟然主动爆出了正在调查iPhone4的距离感应器的问题——如果有谁还幻想着在天线问题过去之后再炒作距离感应器的问题,还是省省吧!
另外,乔帮主还深情的自我表白:“我们这样做的原因是,我们爱自己的用户;如果我们把事情搞砸了,我们会自我检讨,并更加努力地工作。当我们取得成功时,我们所获得的奖励就是留住了用户。或许我们本应让公关人员来打发这些麻烦事,但我们没有,而是亲自来解决。所以,在过去22天时间里,我们一直都努力解决这个问题。我们认为,已经抓住了问题的核心。”
这是一个堪称经典的危机公关演讲!

联想起最近国内的唐俊面对“学历门”的态度,汪晖教授面对“抄袭门”的反应,乔帮主的水平实在比他们高出一个档次——既承认了自己的错误,又捎带打击了对手,既安抚了消费者和媒体,又能使自己的利益最大化。谢谢乔帮主又给我们上了一课!

PS:

 

根据Apple的声明,很多人推测Apple很可能在10月份推出重新设计的iPhone4.我认为这很有可能,因Steve Jobs不可能容忍有瑕疵的产品在市场上销售太久。另外,至于有很多人质疑乔帮主在iPhone4发部前就已经知道它的天线问题,我觉得可能性也不是很大,凭着乔帮主要求Mac开发者搞半年才能拿出一个入他老人家法眼的的滚动条而最终发布时又不得不把这滚动条放弃的高要求,很难想象他会容忍有问题的iPhone流入市场——即使事先他真的已经知道了这个问题,估计那也是离WWDC很近的时间内才知道的,箭在弦上不得不发了……