wpe7.jpg (11495 bytes)

我的征尘是星辰大海。。。

The dirt and dust from my pilgrimage forms oceans of stars...

-------当记忆的篇章变得零碎,当追忆的图片变得模糊,我们只能求助于数字存储的永恒的回忆

作者:黄教授

二〇一〇


一月一日 阴天

突然从梦中醒来,

发现除了自己谁也不爱,

一切都不可能从来,

世界充满了精彩,

我的生命是一段燃烧过的枯柴,

记忆里面充满了空白。

站在冷清的阳台,

倾听内心的独白,

是否真的明白,

有什么不能抛开?

为什么想要留下来?

为何要去漂泊四海?

昨晚加班到九点半,aee_event发送自定义消息给当前 active app不成功,看帮助大概是这样子的,这个实际上是ishell_sendevent的简化版,但是对于所谓的private-event就是自定义的, 必须要明确classid,就是说aee_event可以省略当前的applet的classid,如果发送系统的消息,但是如果是自定义的就不能了,不 过还没有验证,因为编译要很久。

《基督最后的诱惑》一向是被宗教界认为是禁片,不过至少它总的 线索还是复述了旧约中的大部分情节,基督是上帝之子,戴着神的旨意来拯救耶路撒冷及其人类, 它拥有各种神迹,最后按照天命上十字架为人类赎罪,只不过在十字架上钉死之前脑海中为了驱散肉体的痛苦想象中自己假如不被钉死在十字架上而是向凡人一样娶 妻生子,宜享天年,病死在妻子儿女周围,看着人类灭亡在天父的圣火之中是什么感觉。这就是所谓最后的诱惑,基督在十字架上的临死前的最后的犹豫。

整个电影情节都是令人颠覆伦理的震撼,基督是一个卑贱的木匠,为了谋生替罗马人制作十字架来钉死犹太抵抗组织成员, 整日生活在同胞的唾骂中,为了摆脱内心 的压力,他寻找妓女玛丽亚来派遣苦闷,并为此他经常偏头痛,有幻听幻视的毛病。犹大是一个忠诚的犹太抵抗组织成员,受命来诛杀犹太人的叛徒基督,在生与死 的一刹那,基督为了活命声称自己就是犹太传说中的上帝之子,信使弥赛亚,自己的私生子身份正好是上帝之子的证明。犹大在半信半疑之间犹豫,最后相信了基督 的话,并且要追随他的左右直到他拯救犹太民族,但是他警告基督如果他背离了犹太解放事业,犹大会毫不犹豫地杀死他。

于是,基督背起行囊告别家人前往沙漠声 称要去聆听神的旨意,在沙漠中苦熬了十天十夜之后,他的幻听幻视更加严重,看到蛇爬过来以为是撒旦的诱惑,看到篝火以为是魔鬼的化身,口渴难耐想象周围长 出了苹果树,为了吃苹果想象自己手里拿着斧头来砍树,最后受不了了跑出沙漠告诉在等待的犹大说上帝给了他一把斧头要他发动起义,犹大告诉抵抗组织觉得这个 基督半疯半癫自己都不明白自己是活着还是死了,自己对自己是上帝之子深信不疑正好可以利用来作为革命的幌子,于是组织了一帮人跟随并监视着基督到各地去发 动群众,宣讲革命道理。

基督第一个要拯救的就是和自己有过肉体关系的玛丽亚,这个妓女正好被犹太群众游街示众准备处以“石刑”, 就是用鹅卵石砸死。基督挺身 而出说出了圣经里面著名的那句话,He who without sins casts the first stone。同时羞愧地在内心深处忏悔和妓女通奸的罪行,当地的男人大都也和此女有染,只 不过痛恨她服务外乡人,并献身罗马士兵还趁机提高了价格,想要杀死她来挽回犹太民 族的尊严。这时候,人人都觉羞愧就放下了石头,于是玛丽亚从此侍奉在基督左右,加入了革命的队伍,走上了革命的道路。基督继续一路上宣讲革命的主张,但是 老百姓都觉得他疯疯癫癫让他们冒死反抗罗马人的统治必有用心,纷纷用石块来回应,犹大等革命同志觉得人民群众觉悟不高,必须要实施一些欺骗手段来达到目 的,于是来到一家正在举行婚礼的人家想要向他们阐述革命的道理,并且暗中调查这家人较穷招待客人的酒都没有只有一坛坛的水,犹大等几个革命同志自掏腰包偷 偷把水换成了酒,然后怂恿基督让他施展神力把水变成酒,基督整日处于半昏眩状态,稍受暗示,便有幻听幻视,便虔诚的“做法”,没 想到竟然成功,从此对于自 己的“神力”深信不疑,这家人也对基督顶礼膜拜,到处宣讲犹太人的弥赛亚降临人世,犹大等几个革命同志信心大增决定继续如法炮 制,找了一个乞丐说好两个罗 马金币让他装瞎子,找基督要神力,基督如法照施,“瞎子”大喊大叫的说自己复明了。走到一处葬礼,犹大又雇用了一个盗墓者钻到坟 墓里面藏起来,然后怂恿基 督表演“起死回生”的神力,果然那个盗墓者脸上缠着木乃伊的绷带就被基督从坟墓里面拉了出来,死者家属虽然看着活人不象自己的亲 人,可是早就吓呆了哪敢吱 声,于是犹大领导的这个犹太抵抗组织的游击队成为所有支队里面发展最快的,经上级研究决定把解放耶路撒冷的起义提前打响,于是基督来到圣城的神庙前向人民 群众宣讲革命道理,并且号召起义,推翻罗马人的统治,神庙里的祭祀听说起义不仅要赶走罗马人还要把他们也镇压,觉得还是罗马人来的可靠就派出军队镇压,革 命群众还没发动起来就惨遭镇压,起义失败了。

犹大向上级承认错误说对革命形势估计错误,没有正确估计到当地的犹太上层阶级也站在了罗马人一边,要求承担责 任受处分。上级分析了形势认为,责任不在犹大,是党委错估形势,没有意识到革命斗争的残酷性和长期性,为保存革命火种长期潜伏,决定把基督当作替罪羊交给 罗马人杀死。

此时,犹大对于基督又是一番 暗示与鼓动,于是这个基督就言听计从同意参加这个自杀行动,让犹大主动去罗马人告发他以便上十字架找死。犹大接受了组织的派遣成功的让罗马士兵找到基督逮 捕他,并从此顺利的打入敌人内部,后来长期潜伏为革命运动提供了大量的宝贵情报。可怜基督直到上了十字架,手脚被钉死在十字架上才从痴迷中清醒过来明白自 己成了革命运动的牺牲品,看着身边还有两个陪他就死的战友也被钉在十字架上,对于革命运动彻底灰心失望,开始幻想当初和妓女玛丽亚偷情的欢乐时光,想象着 自己如果不参加革命好好给罗马人造十字架挣的钱足够再娶一个老婆生一群孩子,过着不光彩但是富足的生活慢慢老死,为什么要走上这条不归路呢?这些想象改变 不了自己成为革命牺牲品的命运,但是却能够让他摆脱一些在十字架上煎熬的痛苦,最后经过一天一夜的折磨基督终于死在了十字架上,他死后犹大买通了看尸体的 罗马士兵把基督的尸体偷走,在坟墓里面埋了一块石头,然后再散布谣言说基督复活了,受蛊惑的革命群众打开坟墓没找到尸体就信以为真了,从此基督就深深地活 在了革命群众的心底,激励着他们一代又一代地反抗罗马帝国的统治,直到革命成功罗马帝国被推翻,基督才正式被追认为革命烈士,在全国各地都建立起了他的纪 念碑和纪念馆,每逢12月25日基督诞辰,世界各地的革命人民都自发地组织起来纪念这位伟大的革命先烈,缅怀他英勇不屈和罗马鬼子战斗到底的革命气概。

然 而两千年来对于基督的各种革命宣传都选择避开他的真实的内心世界的描述,刻意把他刻划为英勇不屈坚毅顽强的革命战士,现在这部电影真实地反映一个伟大战士 在疼痛折磨下的临死前的犹豫完全不会破坏它的高大形象,相反,瑕不掩瑜这种普通人的心理正可反映出领袖人物的不平凡之处。影片中对于犹大同志的正面形象反 映也使得这位战斗在敌人心脏里的无名英雄在天之灵的以告慰。此片有着高度的革民历史传统的教育作用,能够激发青少年对于当今革命来之不易的道理的深刻理 解,对于从小树立报效祖国,时刻为革命献身的伟大理想的培养有的不可多得帮助,建议各地政府领导认真组织观看,深入开展讨论,结合当前伊拉克人民,阿富汗 人民反对美帝国主义侵略的自杀运动加强为革命献身的思想教育,努力培养一大批敢于视死如归为革命理想上十字架做人肉炸弹的社会主义接班人。

我肚子饿了,想吐。


一月三日 阳光灿烂

电视上一个很象毛阿敏的中年妇女在卖力的讨好一个地方剧场,后来介绍是一个不知名的小地方为了宣传自己地方,以便给地方官加官进爵增加资本,同时办晚会赚 取无知青少年及其父母的口袋里的人民币请出了过气的毛妈妈出来赚钱,她的假睫毛好长,她的腰带真宽真紧,掩饰了岁月在她肚皮上的积累,当然如果不是假唱的 话,她的嗓音还是不错的。我这么评论这位歌手实在刻薄,只不过,昨天跑完马拉松之后荷尔蒙水平太高,更加的无法正确看待周围的客观世界。

反复理解gdi的例子程序总算有了一些体会,关于path,就 是opengl里面的displaylist,尽管我都没有实际使用过这个东西。path可 以由textout创建,变形输出字体的核心在于把path转换为一组point,一定要非常小心points和point这两个东西,一个是win16 的遗物使用的是short,而后者是long,我在debug下释放内存出错才发现这个区别,使用flattenpath可以自动把path里面的 beizier改变成可以直接用lineto来画得线段,而让我感到欣喜若狂的linedda实在是惊喜,学校里面学习的时候还不知道这个东西,现在看到 分外亲切。不过讲老实话dda我好像还没有真正使用过,我只是在疑惑能否用它来实现anti-alias的算法?使用ellipse的时候getpath 得到了13个点,其中都是pl_beizierto的类型,而使用了flattenpath之后得到的getpath的点数时33个,全部都是 lineto的segments了,也许windows-gdi内部也是这样子来实现真正的曲线画法吧?否则beizier曲线怎么画呢? flattenpath之后再linedda才能确定哪个点才能染色。妹妹的笔记本总是会有删不掉桌面快捷方式,现在简单的办法就是使用桌面的属性来清理 桌面图标把他们赶到文件夹之后来删除,然后可以顺藤摸瓜使用guid查询注册表。

昨天跑马拉松半程两小时完成还不过瘾又钻到全程队伍里面,当然后来都是在走路因为脚疼。

很久以前玩过一下setworldtransform,现在都 忘了,有两点要记得:必须设定setgraphicsmode为advanced,其次, xform的四个元素是matrix的旋转参数,必须是0-1之间的浮点数,否则会失败。并且transform必须在画之前设定。 最让我现在不明白的是SetMapMode应该怎样使用呢?最好不要用。


一月四日 阳光灿烂吗?我好像已经想不起来了。

去电影院想看《阿凡达》结果太晚了,只有看明天的了。电视里面 在放《非诚勿扰》,我突然意识到去年大概也是这个时候去电影院看的这部电影,也许后来的一些 事情也是有这部电影的原因吧?按照蝴蝶效应的说法任何微小的事件都汇兑哪怕千里之外的事件的走向产生影响,更何况是这样一部透着诡异的电影,因为电影的开 头几乎有一半就是我的写照:只不过我和主人公的区别在于他从那个天使投资人那里忽悠了两百万英镑,我不知道当时坐在我旁边的人的心里是怎样想的,但是有一 点我是确定的因为后来再没有机会问这一点了。一年以前我留下来的一个原因也许就是也想过一下那个非诚勿扰得好玩的瘾,好像有一小段时间还真的是跟着别人见 了不少的人,可是很快的,我觉得这个游戏并不好玩。现实和电影有挺大的区别的。


一月五日 阳光灿烂吗?不,有雨。

晚上去金弈电影院看了3D大片《阿凡达》,故事情节很简单,正如陆川所说的那样是一个很简单的故事。


一月十七日 阳光灿烂吗?我好像已经想不起来了。

1.dump file to somewhere
2. run trace32 for win
3. go to "build/ms"
4. do load_log.cmm
5. load the "elf"
6. load the "load.cmm"
google.cn要撤退了,国内的主流媒体的解读是一个美国商业公司公开对抗中国政府的法律,借助国民民族主义的原发情愫,作者暗示这是帝国主义列强希 望中国回到鸦片战争后丧权辱国的一系列不平等条约被几艘炮舰恐吓下被迫签订的时代,这个宣传伎俩一般都会奏效,这正如同清帝国期望国民继续忍耐中国传统封 建帝制残酷压榨到永远而不要接受新型资本主义制度一样的想法,只不过在全球化的今天除非公产暴政像被朝鲜一样实施绝对的思想控制与封闭才能做到,但其中的 代价就是国家经济要忍受不断更换货币才能不崩溃的边缘。诚然西学为用,中学为体的本质就是怎样能够既维持旧时代的既得利益集团,又能够抵御新型生产力制度 的挑战,最好的机制就是对国民思想的控制的同时又能够让他们自觉地积极的学习先进的生产技术技能并且不再学习的过程中思考当前制度的劣迹斑斑,这能够始终 做得到吗?这值得尝试,依靠所谓的“太平天国”式的宗教模式来控制人民的共产主义舶来品早已经过时了,因为要“与时 俱进”,原因当然是因为她过时了,因为 它不代表大多数,所以要代表大多数,因为它不符合大多数利益,所以要代表大多数利益,因为它不代表最先进的生产力,所以他要代表最先进的生产力,中国的语 言就是这么模糊不清,究竟是原因还是结果,抑或都是?李开复匆匆离开谷歌,说是要再一次让心飞翔,现在看来仿佛是因为提前知道了谷歌上层要从中国撤退的消 息的提前撤退?主流媒体为此却论断为谷歌撤退的原因,究竟是果还是因从来外人无从知道,正如中国的统治者喜欢扮演天威难测的游戏,因为被臣民看透了无形的 皇帝的新衣就意味着天皇从神坛上用自己的双脚走下来一样失去了统治的理由,既然不是天命神授又有什么理由剥夺被统治者的财富?究竟为什么能够以 “人民”或 者“民主”或者“共和”的名义来实行古老的帝制?为什么在普通西方社会的心目中大多数国名冠以 “人民民主共和”的定义词就等同于共产独裁?只因为那只是一 个只能被统治者念咏的名字,而他的被统治者们从来没有发出异类的声音的机会,这就是所谓的言论自由,因为话语权决定了名字怎样被朗读,决定了主流社会思想 的脉动,因为主流社会可以“被”思考,“被”发言,“被”感慨, “被”感动,“被”富裕,“被”解放,“被”愤怒, “被”激昂,“被”幸福。主流社会在谷 歌的行为“被”奇怪,“被”思考后,“被”恍然大悟,原来“被 ”意识到了这是一个西方淘金者来到中土“被”富裕的“被”繁荣昌盛的土地上冒险失败后的哀 鸣,广大“被”擦亮双眼的人民“被”了解到了谷歌背后是美国的参议员与国务卿的撑腰,从而 “被”得出了一个惊人的结论,这是一个谷歌的大阴谋哦,主流媒体 轻描淡写的“被”指引到了谷歌中国的经营困境的事实,同时广大读者“被”忽略了这些结果的一系列的原 因。究竟为什么一个简单的搜索功能怎样威胁到了泱泱大 国的最敏感的神经末梢?互联网之所以那么可怕就在于它是计算机科学家的理想,人人都有使用的权利,人人都有知情的权利,人人都用得起,他超越国家机器的控 制加速了信息的传播与普及。可是这种天真注定是依靠思想控制体制的国家机器的仇恨与恐惧,首先,谷歌“被”要求主动自律,删除依 靠算法自动获得的数据,而 他的竞争对手为了商业利益手动调节排名却是如鱼得水,因为扭曲事实不论是最高统治者还是唯利是图的百度都是乐意而为的。

花了大半天把著名的syncml-RTK编译了一下, 这也是一个所谓的体力活。首先,我讨厌在tools里面设定系统的目录搜索,所以我把linux模式下的include的<>改成了 “”,并 且把所有的.h,.c文件都拷贝到同一个目录。其次,在.dsp文件里面的project设置所谓的"additional include directory“,注意多个目录要用","隔开。当然我偏向使用相对路径。


一月十九日 阳光灿烂吗?是的!

什么样的电影让你感动的流泪?什么样的精神让你感到人的伟大?大概《The Pursuit of Happiness》是的,不仅仅是因为这是源于真实的故事,更出色的是Will Smith的出色的本色演技,我们可以很有理由的猜想电影的主人公身上有着和他相似的特质,仿佛这是一个专为它而创作的剧本。在中国的很多人是难以想象美 国底层劳动人民的痛苦,因为美国的穷人的痛苦在于在那样富裕的国家里的赤贫的巨大反差,相比中国的普遍贫困下的绝对贫困的倒不会有那么大的反差。同时这部 优秀的电影的中文名字简直让人怒不可遏:当幸福来敲门!这个名字完全把电影的主题给毁了!我对于这类明显的香港人翻译的风格非常讨厌,简直就是糟蹋了电影 的主题,为什么不老老实实的按照字面来翻译呢?这样的片子本来就不需要依靠哗众取宠的名字来吸引原本就不会喜欢他的观众,喜欢的人就喜欢,不喜欢的就不会 喜欢,这就是人类的天性。一点了,睡觉吧,明天还要上班,明天再说,不,是今天。

一月二十一日 阳光灿烂吗?是的! 天气热得让你不得不相信全球气候变暖了。

pGlobalAnchor->wsmGlobals->wsmBuf[0].usedBytes

syncml的工作有只能停顿下来了。所有的问题实际上都是传输上的,你在socket一层来编程实现http协议,就要面对很多问题,首先是网络 连接的 不可靠问题,socket的收发都是非阻塞的,必须要处理网络中断再连,发送与接受都在回调函数里面异步完成,发送http头和body就是syncml 的post数据还是分开来的因为头里面要包含content-length,body是从syncml-rtk引擎得到的。http1.1是可以keep -alive,但是网络是通过电信的proxy链接的,他在一定的数据量后返回的response说connection:close,你这个时候只能重 新建立连接了,这个是http级的问题,而现在当所有的问题都基本解决之后又遇到了服务器的500错误,这个是internal-server- error,应该也是我引起的吧?我猜想我可能搞错了syncml的workspace的内存管理方式,当我在发送的时候lock-read- buffer,发送完后unlock,就意味着内存回收了,那么在接受的时候,lock-write-buffer,只是分配了一块存储内存, unlock-write-buffer意味着完成分配内存的大小的确定,那么随后你肯定会使用lock-read-buffer来读他的,并且 unlock-read-buffer来释放,否则内存迟早要用光的,我一开始对于这个机制不太明白,这样做的一个问题就是假如我遇到服务器status 异常,比如500想要重发必须要连同http-header,body一起重新发送,这就意味着我在发送的时候如果unlock-read-buffer 的body的部分就没有机会回滚了,应该要当receive到server的response并且成功处理之后才释放所有内存,这当然增加了不少的逻辑的 复杂度,现在没有时间来做这个了,因为触摸屏的工作到了不能在拖延的时候了,因为要所谓的pvt,我也不清楚什么意思,反正要试产吧?


一月二十四日 天气非常的冷,你不由得开始强烈质疑全球气候变暖的论调。

用手机上网看新闻是打发BRT上无聊时间的唯一办法,你看到了中国政府强烈抗议美国政府干涉中国互联网自由的新闻,你也会看到大量所谓的 “民意”的回复, 都是咒骂美国多管闲事,支持中国政府的回帖,然后我忍不住就回复一下说,如此众口一词强烈支持政府的言论正常吗?假如我的这一篇也能被登出来的话我就相信 中国政府是保护互联网自由的了,不过我十分怀疑。于是,发言成功了,系统说稍后会显示出来,我等了一天也没有看到显示出来,这就是中国的互联网。这种证明 类似于catch22的证明:一个政府用是否国内有反对派的声音来证明自己是否受拥戴,同时又把反对者的嘴巴堵起来让他们无从发出声音。

转念一想,似乎我这么说太幼稚了,因为全国人民都知道只是不愿意说而已。

当 我还在为lock/unlock read/write buffer的处理而烦恼的时候,HB告诉我的方法非常好,的确,syncml这个所谓的workspace压根和传输层无关,我浪费一点内存把 syncml当作一个generator,把它要发送的buffer拷贝出来,然后把接收到的buffer在拷贝回去,不要再传输过程中使用它的内存管理 机制,我反正也没有多线程处理的同步问题。有很多时候你的脑子转不过一道坎就会陷入一个泥潭。

天气实在太冷了,以至于我这两天都要去游泳池干蒸湿蒸。好像这个 openCV版本比较好吧

ffmpeg -i input.mkv  -vcodec msmpeg4v2 -sameq -acodec -libmp3lame -ar 48000 -ab 128k -ac 2 output.avi


一月二十六日 阳光灿烂吗?天气非常的冷

本人的pim模块因为网络传输需要分配较大的buffer,因为我嫌动态分配内存麻烦就在自己的 struct里面开了两个几十k的buffer作为收发的缓存,但是在创建实例的时候失败了,找乐一下才发现是AEEApplet_New(int16 nIn,AEECLSID clsID,。。。)失败了,其中的原因在于它的第一个参数nIn是一个int16的类型并且是你自己的应用层的结构的内存大小,而且 AEEApplet_New首先检查nIn是否小于0,否则失败。
这个真是一个“绝好”的设计,我的意思是幸好的结构是超过了int16的上限并且第16bit恰好是1导致传入的参数nIn小于 0导致创建失败,否则创建的applet分配的内存不足我当然会内存越界去读写,不导致死机才怪。
结论就是你最好检查一下你的结构的大小有没有超过64k,(如果不检查有超过了的话,就祈祷正好sizeof(CMyApp)的大小正好是int16的 sign-bit是1,这样失败了总比莫名其妙的死机要好一万倍。
其次,就是结构里面的大的缓存还是用动态分配的好,虽然麻烦但是安全。


一月二十七日 阳光灿烂吗?天气非常的冷

ffmpeg -i input.avi -r 25 -f image2  my%04d.jpg

ffmpeg -f image2 -i my%04d.jpg -r 25 output.avi

有几点需要注意,1。数字格式一定要用%0xd所谓的x是一个数字,用0来补位,否则你再合成的时候就 不能识别了。2。祯率不设的话默认是15。我觉得我 对于zy已经有免疫力了,对于ldd我大概花了十年才获得免疫力,不过ldd非常聪明猜出了谜语的开头,虽然猜不出结尾。显然惊鸿一撇的撇字太过显眼了。


一月三十日 阳光灿烂吗?阴天

ffmpeg如果不把wav压缩成mp3,那么wmv好像是不能识别的,不确定。

关于synml我在揣测一个我的实现上的问题,大致想明白了要去验证。就是当同步或者备份过程中用户强制退出的处理,现象是最后一轮的数据成了多出 来的数 据,原因当然是由于我们的sqlite数据库在存储了数据之后syncml才能得到所谓的mapping信息,这个从逻辑上讲应该是在下一轮http- session中作为syncml的command及其数据的一部分发送的,虽然amoi的程序员正确的在清理现场中调用了所谓删除没有成功发送的 mapping数据,但是最后一轮已经存储到了我本地的数据库,(不存储就不会有mapping,这个是肯定的吧?就算是文件型数据存储也是如此,所以, 他们应该原来就没有考虑对吧?)那么现在遗漏的工作最好的解决就是依赖于数据库的事务回滚机制,当开始一轮数据的存储时候发起transaction,并 在这之前commit transaction,完成上一轮的事务,因为上一轮mapping发送成功的同时下一轮的数据也到达了,那么在随后的任何退出都要rollback transaction,同时与之配套的事我本地的那个记录数据同步修改变化的记录机制也要有这样的回滚机制,应该说我这个小小的数据记录机制很可惜没有 使用数据库,否则他们就在一个事务里面了,那么我只能开一个临时表存储这一轮的变化,只有在commit的时候更新内存中的变化表并且反映到文件里面的变 化表(这个内存/文件变化表原本是为了防止掉电恢复的。我忘了是否因为效率起见不是每一轮都更新文件,而是结束才更新文件。)这一步需要进行实现,幸好的 是我们的synml只能工作在前台,否则后台的话发起事务会不会影响到其它应用从总数据库呢?我很怀疑。此外就是在应用退出的现场清理,原则上都是回滚。

mdp的使用的确是很头疼,幸好我发现了一个之前讨论的问题就是指针对齐的问题,mdp要求bmp数据指针32位对起,这样子原则上你不能把bmp 的 byte指针强制cast成int32*,否则可能会crash,因为据说这是mips处理器架构的要求,pc放松了这个限制一般的windows程序员 都不大理会,那么对于图形来说这似乎是不可逾越的问题,我怎么能够保证我的rgb565的图片起始总是4字节对起呢,当然这其中的奥妙我猜想就是那个我一 开始不理解的参数subwin,现在你来看mdpimg里这个参数就应该明白他的作用了,根据hb的说法任何一个decent的内存分配机制都应该把 malloc分配的地址设为4字节对齐,所以原则上说bmp的buffer都是起始对齐的,那么你需要使用的其中的部分就是那个subwin,就让mdp 自己来处理吧,因为mdp是一个dma的机制很有可能为了内存访问的效率硬性规定了4字节对齐,那么作为mdp_disp_update之类的api就要 去帮她处理好这些问题。不过至此我的mdp调用还是失败的,我觉得register/replace之类的最终还是调用mdp_disp_update, 仿佛一个opengl的displaylist的样子,应该不是问题,这个东西很难调试因为仿真上是不支持的,只能打log,或者trace32,我至今 还不大会用trace32呢,非万不得已我是不想用,因为我要编译debug版本很费时间的。

所谓的dib你从idisplay是可以任意创建的,当然内存的buffer是她帮你分配的,所以我觉得其间的npitch也是系统指定给你的,不 知道为 什么js要去改变它,因为他在创建的时候给的三个参数w,h,depth就已经告诉系统他要的dib有多大,那么根据系统分配的实际的buffer大小计 算出来的npitch你当然不应该改变,至少不能比他大,但是它会浪费吗?肯定有些padding是必须的比如每一行的4字节对齐的要求,(这里似乎暗示 bmp的数据要做到平台通用也要满足某些架构下的内存寻址4字节对齐的问题。)当然我认为直接操纵数据始终使用byte指针是没有问题的,是程序员的首 选,但是难免不会有中间强转的事情发生,比如做alpha混色的时候为了应对byte混色溢出成16bit的时候,你很有可能cast称int16来操作 gb部分(从b到g,当然r是不行了,不过我记不清楚rgba还是argb格式了)意思就是如此。

另外我觉得我之前的刷新死机也许是因为一个递归的问题,在我的update里面调用idisplayupdate是否是让root-widget发 送 draw消息给我呢?如果是的话,我在收到draw的时候也许又不小心调用了idisplay,或者是我在多个地方调用idisplayupdate导致 栈太深了?总之我觉得这个就是高通的架构的毛病,按照hb的说法所有的消息机制实际上是call,那么首先这里效率是一个问题,其次这个栈会很深,反之 windows的消息是放在队列里面要你主动去取,而不是被系统被动的推送,这样子就保证了每个应用指在他应该的时间片里处理消息,也就是我之前的问题: 在windows里面调用sendmessage让接收消息的窗口执行的时候的时间片算谁的?是发送者还是执行者?显然是应该算作接收者因为他在执行,但 是看起来系统不大可能进行切换,因为假如像高通这种设计每个侦听者都给你注册一个回调,那你执行过程中不停地要切换到被调用者的上下文岂不是很累很慢?我 觉得这就打破了每个applet的时间片划分的机制,所以,我认为高通尽管有所谓的applet的时间片或者人物的切换但是使用call直接通知让时间片 的划分非常地不清晰,这样子用户的responsive不好,当然实时操作似乎需要这样子的。

保存着两个小工具以备不时之需。hfs是一个很小巧的web-file-serversumantra-portable是一个很小巧的 pdf-reader。此外再次提醒一下他的源代码。

无意中发现我的一些下载似乎不对。象棋巫师npop电子邮件sqlite源代码openSSL1.0,


一月三十一日 阳光灿烂吗?的简直就像是夏天

avi文件格式其实挺简单的,就是开头是magic word:RIFF,然后4个bytes的长度,接下来是他的名字'AVI '最后的是一个空格0x20,然后是LIST(长度四个bytes)。。。这里是详细的解说

在中国电视台频道里大概只有一两个有时候说几句真话,而其中之一是英语频道,这个正符合中国政府对待谷 歌中国的态度,如果你要再中国说真话,那么请不要用 中文。的确,事实就是共产党政府为了统治的目的随意扭曲事实是与生俱来的,在以前叫做“宣传”,现在叫做“和谐 ”。在1949年前的战场上他们尝到了类似 于洪秀全政权的自欺欺人的苦头之后,在打仗上不大敢说假话了,后来夺取政权了为了统治要“宣传教育”老百姓,这一套假话每天每时 每刻都说,后来三年经济困 难啦,连饭都吃不饱了,就停了几天,后来吃饱了又说。说到后来连一开始就知道是假的也开始相信了,这就是谎言说过一百遍变成真理。后来信息太不容易控制 了,就改变直接说假话为间接说,就是不说全部事实的假话。这个在美国法庭上宣誓作证的时候要求有两点:1。所说的都属实。2。属实的都说。经过了将近一百 年共产党进步了一点点,就是所说的也许都可能属实,在某种情况下。但是第二点,远远不可能做到。知道的不会说。

比如GDP增长这个东西是很专业的东西,弄到现在连一个县级长官都能明白,然后统计局长就发现国家总的 GDP增长和各省市上报的差距非常大,按照各省市加 总这个国家又可以在十到十五年间赶上美国了。这是第二次赶上美国了。上一次是大约五十年前,仿佛龟兔赛跑,乌龟总能够意外地赶上兔子,难道兔子总是那样漫 不经心的在比赛中睡觉?


二月一日 阳光灿烂吗?很热

愈堕落,愈快乐,我越来越无法自拔在这个泥潭里了,总有一天要出大问题了。

z似乎要结婚了,ld好像已经离婚了。晚上陪伴着一小杯千山红重温了一遍我认为杰出的艺术电影《艺校密档》(Art School Confidential)。的确,A true artist only lives in his narcotic creative moment of bliss.

不小心把一些半醺之际的话删除了,就这样吧。

斯琴高丽 - 黑白
歌词编辑:李泽昊 QQ:393235800
千千静听 带你心飞

寂寞袭来
不得不接受无奈
思绪像决堤的海
把我的世界冲的一片空白

泪流出来
却没有痛的感觉                       却没有痛的感
那么多年的期待
我带着麻木的伤痛离开

我慢慢的把过去的碎片打开
一切都被真实的记载
找不到你付出的痕迹               找不到你付出的梗概
只看见你虚伪的高姿态

突然才惊醒过来
除了自己你谁也不爱
想像你承诺的那些话
永远都不再存在

一切都不能重来
我像支燃烧过的火柴
你的世界变得精彩
我的世界变成黑白

我慢慢的把过去的碎片打开
一切都被真实的记载
找不到你付出的痕迹
只看见你虚伪的高姿态

突然才惊醒过来
除了自己你谁也不爱
想像你承诺的那些话
永远都不再存在

一切都不能重来
我像支燃烧过的火柴
你的世界变得精彩
我的世界变成黑白

你的世界变得精彩
我的世界变成黑白


二月四日 阳光灿烂吗?阴天

用户取消导致数据同步的不一致不能简单实用回滚来处理,因为要尊重一个事务,有些动作一定要在本地完 成,比如,同步结束之前的一刹那,要创建 anchorfile之前,你能取消吗?你取消了,但是syncml-rtk里面是早就创建了,因为所谓的next-anchor实际上是你同步开始的时 间点,这个一定会在同步装填terminate的时候发送给服务器的,因此你本地不存,下一次同步服务器就发现你丢失了锚点,自然发起了慢同步。同时,我 和hb的讨论是关于syncml是否尊重下一层的协议的完整性来决定事务分界,我给他的信息是仿佛


二月十日 阳光灿烂吗?浓雾

休假在家,慢慢的一点点地学习opencv,cvPyrDown然后cvPyrUp达到了某些去除噪音的效果,至少注解是这样子的,在我看来更像是 smoothing操作,因为很多的图片的尖锐角被去除了,这里一定是一半的尺寸才行。cvCanny要去学习一下原理,我现在的数学基础只够理解原理, laplace操作为什么可以用二项式展开来近似呢?dilate能消除canny的潜在的洞?注解这么说的。sobel一阶导数是怎么计算的,二阶为0 找到的时局部最大值,难道是边缘(edge)?有太多的疑惑,我的基础还不够,不过,我觉得这个领域有我一直期待的方法和答案。


二月十二日 昨天热的如同夏天,我穿这拖鞋T恤出门

使用canny效果不是很好,就是说颗粒度太小了,我不知道要设定什么样的上下threshold,直 接调用threshold函数也不好,因为上下限可 能是根据不同的图片而有所改变,至少我尝试不同的参数效果不算很理想,只有adaptivethreshold比较好,参数offset是2比较好,但是 这里面有一个意外,我在drawcontour的时候是在原来findcontours的画面上,结果contour叠加以后反而比较好看,当然这个纯粹 是视觉效果,完全没有什么特别的计算上的效果,只是看上去像是素描的效果。因为要使用pyramidup/pyramiddown,所以原图的尺寸必须是 2的倍数,于是你可以拷贝原图到一个修整的image,不过要使用setImageROI为目的地的尺寸。 循环使用 findcontour与drawcontour有点像是自反馈,效果是所谓的contour增长变大,仿佛erosion。不过没什么用吧?


二月十四日 下雨了,很冷

ffmpeg -i input.mkv -vcodec libx264 -b 4000k -acodec libmp3lame -ac 2 -ab 192k output.avi

/IMPLIB:newlibName 这个能够设定输出的lib的文件名字。


二月十六日 下雨了,非常冷

不知道为什么使用到SDL,应该是看到这个CAPTCHA(Completely Automated Public Turing test to tell Computers and Humans Apart),这个很有意思,这个是一个 letter-recognition的dataset. 然后我们找到了这个东西:

PWNtcha stands for "Pretend We’re Not a Turing Computer but a Human Antagonist", as well as PWN capTCHAs  这其中的一个插曲是一个“自然图片边缘”的识别。这 个是他们的网站,这篇论文对我来说还是太难了,我至今还缺乏其 中的数学基础。这个教授的网站。我觉得我上一次使用 opencv里面的adaptivethreshold函数,并且循环使用findcontour好像跟他们的效果有一点点像的意思,当然是不能比,只是 我觉得有一点点地效果的意思这 个是他们的效果集。 这个是这个pwntcha的源代码。他的测试数据集太大 了。其中需要用到SDL.这个市sdl1.2的源码。这个是sdl1.2的vc6的开发包。同时,这个还需要用到sdl_ttf的true-type的包这个是sdl_ttf的运行包sdl_ttf download web.

在编译的时候我遇到了一个疑惑,就是Link Error LNK2001: Unresolved External Symbol _main,这是当我link libcd.lib的时候,我不知道具体的原因,只能猜测,因为当我把main改称了wmain使用unicode版本的main就可以解决,但是我自己 是绝没有定义UNICODE这个宏,所以我只能怀疑是链接的库里面某个地方要使用unicode版本?不知道。随后的问题就是很讨厌的wchar_t在 wmain里面传进来的参数,我只好使用sprintf的%S来把wchar_t转为char的类型了。这个实在是我没办法的办法。

顺便上传一下mplayer的版本。


二月十七日 下雨了,非常冷

摘录了一些资料。This is really like a wild goose chase. 我完全忘记了为什么从opencv最后由跑到了vfw播放avi文件中sdiv的问题了,fourcc=sdiv实际上这个是endian的问题,应该是 反过来的vids。最后我只能得出结论是AVIStreamGetFrameOpen返回null是因为我安装的codec不是vcm的形式,或者另一个 可能性就是就是ddshow。(我也不知道自己再说什么。)反正我使用下载的wmsdk11的例子使用接口而不是avi的api就可以。这些接口的 guid应该都定义在strmiids.lib。


二月十八日 下雨了,非常冷

我 觉得opencv这本书非常的适合我,通俗易懂,不去纠缠数学的严密论证,因为我也看不懂。有这么一点很有意思,D:data; L:label;P:probability那么所谓的经验或者训练就是得到这么一个P(D|L),用中文来解释就是给定label你要复述他的数据分布 的概率。那么识别(recognition)就是P(L|D)就是说给定数据的label的概率,这样两个简单的条件概率就定义了ml里面的两大过程: training&testing。我觉得非常的完美与通俗,对我来说很容易理解。另一个应该理解的问题就是比如最简单的二维图像实际的矩阵表达 式代表的意义,或者说其中数据的维数不止二维,矩阵是二维,但是具体数据在颜色空间里面有他们自己的维数,假如我们要求解一个平均数,或者类似于重心对平 面来说,也许还要考虑颜色空间的平均值。也许使用k-means的算法来反复移动cluster-center是一个好办法。比如我们要求解一幅画的三个 “注意点”(这个三是人为给定的,取决于我们的主观或者计算能力,或者存储能力等等)那么首先随机象k-means那样把感兴趣 的几何点和这三个“注意 点”随机设定的位置相关联,然后再分别求解“注意点”在他们关联的几何空间的重心,以及颜色空间的均值(用几何空间 的距离作为权值?)。第二步再重复检测 所有的点与求解的三个注意点的“距离”(颜色空间加权几何距离),好像k-means一样再重新分配原始的点和这三个 “注意点”(称其为interest points?),重复第一步,直到converge。那么现在的问题就是我们得到的这三个“注意点”有什么用?或者是他们的实 际意义是什么?简单的 cluster-center代表了什么?这本书里面的练习题很有意思,就是说,如果我们再把这个“注意点”的个数从一一直累 加,看看每次得到的 cluster的variance最大值是否converge?或者求解一个“注意点”的个数k使得其cluster的 variance的最大值最小,这 样子的k值应该就是书里面所说的那种voronoi图一样的中心个数吧?反正我觉得这个意思即是书里面说的voronoi-iteration的意思。我 想按照书里面说的clustering的目的就是image-segmentation,这个是很难得,据说分三步:1.去噪音,2.分割,3.识别,按 照网站上的说法,第1,3两步软件已经做得很好了,就是第二步很难,尤其对于所谓的captcha的问题,核心的困难就在于此。

看 了wiki对于yuv的解释忽然就恍然大悟了,原来这么简单的道理我以前一直不理解,而且抵触,yuv色彩空间才是最合适的做法,因为他为了兼容黑白电视 和彩色电视,那么这个y信号就是我们天然的信号源,省却了很多,也许只要设定一个简单的threshold就得到了我们需要的contour的基本数据。 回过头来看作为一个矢量空间,是否颜色空间就是三维的?谁规定的?是计算的还是因为我们的成像技术的限制?


二月十九日 下雨了,非常冷,比加拿大都冷,因为屋子里没有暖气

我的解释是颜色空间也许根本就不是什么矢量空间?仅仅是其空间的大小,比如rgb24是因为我们需要空 间大小为24bit的,你非要把r,g,b当作三个 独立的vector来。(以上都是bullshit,我重新阅读wiki,回忆linear algebra的定义就知道,这根本就是不相干的概念,recall:有一些所谓的basis的vector-set可以span整个vector- space,而颜色有这样的basis吗?完全没有关系,可以简单的理解为根本没有这样的所谓basis,或者说他需要的basis和space的大小一 样多,这样的basis有意义吗?)(在我阅读wiki之后才想起了最初的定义,所以这一刻我否定又否定:basis=『(1,0,0),(0,1, 0),(0,0,1)』这个难道不是rgb24的一个basis吗?我看来经常不用脑子思考。当然我现在不清楚所谓的无理数是否能够被包含在线性空间里, 因为。。。)看来我连基本的颜色空间的概念都没有。rgb与yuv的关系是什么?是简单的数学变换?比如直角坐标系和脚坐标系之间的转换?我觉得我潜意识 里面总是认为颜色因为有所谓的三基色就被我当作是一个所谓的三维空间,对吗?维数(dimension)在vector-space里面根本不是这个意 思。(实际上也是这样子的吧,the number of tupples of vector is usually the number of dimensions。所以,rgb就是三维的?很混乱的思想。

阅 读wiki的定义让我勾起了一些甜蜜的回忆,我怀念那个留着山羊胡子的犹太老头,他教授的数学分析总是用一大堆的例子来,当然这是为了应对极差的学生素 质,对于大多数学生来说数学证明变成了一个特殊的条件反射式的“机器学习”过程,(人也不过是一种机器)当然更主要是他的幽默, 我曾经抱怨每一步证明都要 引经据典写所用到的定理公理很麻烦,他就说你去刻一个图章在每一步旁边来盖章好了,我还能说什么呢?教授linear-algebra的老教授其实我很怀 念,因为我觉得我没有花时间认真去学,那个学期上的课太多了,如果能够在学一遍就好了。好像他的erdos number小于3.

总之, wiki的巨大的,前无古人后无来者的科学,社会学上的意义将在他的出现后的很多年后才能被充分认识到。(这句话的意思要这样翻译,就是说在他的出现后, 人们不断地发现他的影响力在深入与持续的发展,这个趋势要经过很多年后才达到他的顶峰,现在他的影响力还在迅猛发展,也就是说很多人还没有深切地体会到他 影响了人类知识传播的手段与速度,也许不久的将来很多大学之类的教育机构要被淘汰了,那种专门培养专门研究型人才的教育机构在每个社会都成为一个越来越 小,越来越专业化的小小的机构,而不是普及教育机构,中国人现在还没有意识到这一点,依旧迷恋花大价钱把孩子送到所谓的“大学” 里面去受教育,其实,很多 人根本坐在家里就能够得到“普及”教育,因为他们一辈子都没有打算成为某个领域的研究者,而只不过就是要找一份谋生的饭碗,需要 进入所谓的大学吗?用 wiki就够了。)

我好像完全没有印象有那个function-space。field的概念还是第一次听说。

章子怡都能跑出来唱歌,你就知道这个世界有多白痴。


二月二十日 下雨了?出太阳了

我有一个简单的想法就是k-means的改进,因为k-means并不能告诉你究竟多少 cluster,那么我的想法就是设定一个threshold,让 每个cluster的covariance都要小于这个threhold,否则把这些cluster再做类似于k-means的细分,比如一分为二,这是 一个局部动作应该不会影响到已经分好的voronoi图,这个取决于这样一个推论,每一个voronoi分区再进行细分的话新的center不会更加靠近 其他的voronoi的分区的点,就是说这个新细分的sub-voronoi分区只会影响原本这个voronoi,这个应该就是原本的定义。这里面的细节 在于怎样决定threhold来停止和选择哪个cluster在细分,所以,计算所有cluster的covariance的variance,我可以唯 一预见的问题就是比如k=2而他们的covariance的covariance是零,这是常见的,但是很明显的这两个粗分割的cluster本身的 covariance都很大,所以,我一开始需要先设定一个covariance-threshold来细分,而设定一个covariance的 variance的threshold来决定停止也许也是必要的,比如我们有5个圆圈一样的分布,圆圈的半径都相同,那么5个cluster的 covariance不会因为在细分而变小,而这5个cluster的covariance的variance是0,所以这是停止的两个条件。我其实都忘 记了covariance和variance的定义,查询wiki就知道variance是covariance的一个特例,当随机变量相同的时候, covarince就变成了variance。

<Lords of Rings>的剧院版被删减的太多了,很多细节都看不到了,我现在觉得其中至少魔王的军队的三股力量是嫡系的orc,和来自中国的海军雇佣军,和来 自印度的大象兵雇佣军。


二月二十一日 下雨了?阴天

玩了一下cairo, 这原本在linux下很寻常的东西,但是windows下很罗嗦,使用ming编译我嫌麻烦,使用别人编译好的有经常不给lib,勉强运行但是不太明白怎 样显示使用png_surface在windows下画,也没有什么人关心windows下的操作,不过浅尝辄止是我的习惯,知道这类vector graphics的玩意也就够了,因为很多gdi就能做到的,我关心的也不是这个东西,原本是想使用autotrace/potrace之类的 vector-raster的转换方法的软件原理,另一个想要找到的是h264之类的压缩算法中寻找相邻图片中的相同部分的算法,如果能够剥离出来来使用 的话?

昨天胡思乱想了半天,1.计算质心有一个非常直观的算法,大概是logn的复杂度,就是两两之间求中点(如果质点相同,否则加权),2.那么 cluster的直观定义原本可以直接使用两两之间的距离来分类,不知道为什么没有人这么做。

找了半天,我发现还是autotrace可 以一用,potrace号称免费可是找不到源码。不过autotrace输入复杂的bmp的时候spline好像crash了,以后跟踪一下,在众多的 input/output中我去除了swf之类的,好像使用了libming,参数-output-format=pdf -output-file=mytest.pdf mytest.bmp我使用几个英文字母效果还不错。

There is no magic!我觉得这个autotrace应该是很古老的东西了,的确2000年左右的东西,而且是开源的,可以想象不可能和vector-magic之 类的商业软件相提并论,所以,很多时候还不如opencv的contour的结果,我想使用opencv的例子区改造一定也不错。这个领域的确有意思。 autotrace好象是很多代码拼起来的,至少那些input/output是这样子吧,那当然了,很有意义的东西,(不过,经常遇到复杂的图片就 crash,我把heap/stack都挑大了也没有用,所以是代码的问题。)好好学习!

ml部分超出了我的能力,看不懂,那个decision-tree是什么东西?

计算contour的moment当然是一种识别比较的好的feature,这个意义就在于你把所有的点的相对关系都放进来了,normalize 的概念 明白,就是大小位置无关,但是具体算法不清楚,怎样和坐标系无关也不太明白,大概是找他的中心偏移?freeman chain也是一个很有意思的想法,这个应该可以在围棋上试验一下,因为这是一个便宜的特征,旋转导致他的histogram做circular偏移,所 以才有所谓的pgh,pairwise xx histogram,忘了什么名字,还有一个什么cch,反正意思也是edge的两两相对位置关系?至于contour的bounding box/circle/ellipse等等就是另一些快速识别的特征,如同当初的3D里面的碰撞检测的粗检验算法,所有这些在opencv里面都帮你实现 了,你需要的就是学习使用,虽然只有制造工具和实用工具才是区分动物和人类的特征,目前我的状态还停留在类人猿阶段,就是使用现成的工具,需要很长时间才 能进化到人的阶段,不过回过头来看08年的时候我买了一个TV-card录制电视的video那时候还对于流媒体一无所知,现在至少没有当初那么完全的陌 生了,这就是这一年多来的进步。


二月二十五日 雾茫茫的,地板都是湿的

第四章的作业


二月二十七日 雾茫茫的,地板都是湿的

正在看你和张召忠讨论《阿凡达》的机器人问题,我听你说卡梅隆是从军方的研制计划得到启发才引进了这些个人形机器人,我觉得你除了有一副好皮囊似乎 没有什 么文化积淀,如果你对“卡梅隆”这个导演稍有些许了解,比如google一下,就知道他在三十年多前拍摄的电影《异形》里面就有 这个巨型的人形机器人,在 电影里面这个叫做“搬运工”(loader),在电影的结尾主人公就是驾驶这个和异形搏斗,和电影《阿凡达》几乎一样,所以,你 也就知道这个天才导演也已 经江郎才尽了,这部电影不过是炒冷饭而已,没有多少创意了。


三月一日 算出太阳了

作业里面有一个问题很有意思,就是使用高斯filter来smooth图像时候使用5x5作两次和使用11x11座一次是不是差不多,我在路上想明 白了, 的确是差不多,这个从试验中已经证实了,因为第一次5x5所作的convolution可以被叠加。买了一个蓝魔T17fhd,有这么一点要记住,所谓的 mp4的硬盘otg功能是带不动普通的移动硬盘的,一定要外接电源,我买的80g/480元/1.8寸硬盘虽然不需要外接电源,但是太贵了,并且mp4的 耗电只能支持不到一个小时,所以意义还是不大。试验TV-out发现tv就是tv,不可能支持480p/720p/1080i/1080p之类的,因为色 差输出就是电视输出,看来明天要买一个HDMI来试验才行。


三月二日 总算出太阳了吗?

guassian的smooth方法的参数效果是这样子的,param1/param2是尺寸,param3/param4是横向/纵向参数,那 么他们的效果是:9-9-x和0-0-x的比较x变化值为1,4,6时候,后者变化远大于前者。

统计局的统计方案需要向大众咨询,这是什么机构?是新闻“制造”机构还是事实“反映”机构?或者这些人 连最基本的统计学的原理与目的都不明白?还是因为长官意志的长期反映弱化了智商?


三月三日 总算出太阳了吗?

蓝魔T17fhd真的是没话说了,几乎是至上之美,首先视频格式的问题几乎达到了完美的解决,dts等等音频输出也是完美的结决,其次,解码码率几 乎达到 了硬盘播放器的水平,据电脑报的测试已经达到了50m/s,这个能力真让人佩服研发公司的dsp的编码能力,再次就是强大的otg功能几乎完美,当然 2.5寸硬盘拖不动是没有办法的,只能外接电源,1.8寸是没有问题的,其他的usb闪存/tf卡时不必说了,最后就是那完美的电视输出,首先使用耳机插 孔的色差输出达到ntsc/pal的电视格式完全没有问题,几天买了hdmi的线输出480p/720p/1080i都没有问题,等一下试验一下 1080p,我想应该也是没有问题的,电脑报的测试不我欺也!唯一让我美中不足的是他是4.3寸,当然这个看在16g的nand存储,699元的价格还是 可以接受的,为什么不做成5寸呢?那轻巧的身姿让人不敢相信有这么强大的功能。还带一个小遥控器,我觉得中国的嵌入式开发已经达到了世界的前列,因为广东 的这些公司前途无限!强!!!1080p没有问题!

使用cvCreateCameraCapture得到的IplImage实际上都是一些指针,就是你不可以释放,同时你得到的是及时的capture的就 是说他是不停变化的我花了好一会才证实到这一点。

所谓的人大代表很不幸的缩写是NPC,在游戏中就是那些按照既定程序执行的非可操作的人物,我觉得很贴切。


三月五日 浓雾弥漫

keeping mum我一直以为keeping就和housekeeping的keeping意思一样,mum我以为就是mam,所以,我总是以为一个家庭需要一个能管 家的妈妈,这个似乎和电影的意思一样,远远比所谓的《保持缄默》好的多的一个名字,比如说《能管好家的妈妈》。所谓黑色幽默就是说在《一条叫旺达的鱼》里 面银行抢劫犯在被警察追赶的时候还是红灯停绿灯行遵守交通规则,或者就是这部<keeping mum>里面杀人犯的祖母在处理后备厢里尸体的时候要求女儿坐在驾驶室里因为祖母的驾照还在见习期需要在开车的时候有持照者坐在副驾驶监督。所以一 个杀人犯无论在犯罪与否都能自觉自愿地遵守交通规则这是多么难能可贵啊,我看到这里感动的热泪盈眶,当然眼泪也是笑出来的。


三月六日 浓雾弥漫

erode是使用kernel来做的min操作,dilate正好相反使用max操作,效果是前者去除孤立的亮点,针对的是噪音增加了的信号,而后 者去除 的是正好相反的情况,它把成片的区域连接起来,意思就是噪音干扰是我们的信号丢失造成原本相连的信号分割了。在这两个操作衍生出来的 opening/closing就是说,opening=erode+dilate, closing=dilate+erode,opening和closing的效果都是保持了原来成片亮区的面积,前者去除了孤立的亮区,后者去除了孤立 的暗区,这个似乎和原始的erode/dilate一致,只不过据说更准确。更高级的morphology操作是gradient=dilate- erode这个效果是剥离出来亮度变化大的区域。tophat=src-open(src); blackhat=close(src)-src;这两个高级操作tophat/blackhat前者突出了局部的亮区,后者突出了局部的黑洞。以上都是 我的学习摘录。


三月七日 浓雾弥漫

这一道作业题出的很好, 就是你使用camera抓拍连续两张照片,后一张尽量保持不动增加一个茶杯,然后先转成灰度图使用absulte-diff求出其中的变化,然后使用 threshold的binary来过滤一些白噪音,在使用morphology的open在过滤一下白噪音,然后问题就是针对这一张结果图来找出杯子的 轮廓。具体做法是这样子的从左上角开始寻找255的白点,找到后使用floodfill来fill成100,从返回的connectcomp来记录 fill的面积,找到更大的就把之前的floodfill成0,记录下现在的面积,当然也是fill成100,直到找到最大的floodfill,最后把 它fill成255就是杯子了。其中我犯了一个低级错误就是用int 来比较灰度图里面的255,他是-1,所以一直找不到。

新疆npc在举行press conference,我一开始实在是耐着性子听他的一大套的官话空话,我不禁在想难怪新疆有人要造反,凤凰台记者提了三个问题,结果他一开始花了十几二 十几分钟把官话又说了一遍,我实在是没有耐性了,因为我自己都快忘记了问题是什么了,所以我也假设这种共产党吃喝干部肯定也记不住问题,可是忽然话锋一 转,这个看似肚子里都是官话的草包居然有条有理的外交辞令式地回答了全部问题,这个让我着实吃了一惊,就是共产党的这些高官虽然有很多看上去比清朝的官员 还要昏聩,实际上有不少肚子里还是有些能力,否则精明如胡锦涛这样子的人物不会让他继续呆下去了吧?也许吧。

《District9》的所谓alien就是美国的非法居民和中国的农民工,他们具有人类的功能但是不被当作人类。


三月九日 阴雨蒙蒙

cvFloodFill是一个非常强大的函数, 其中常见的一个错误就是你如果不设定mask的写上去的值,那么默认就是1,这样子8bit的图就是纯黑一样。所以,int32的第二个byte的值 100<<8就是一个不错的选择。同时你要记住这个mask必须是原来image的长宽多2个pixel,这里你使用setImageROI 是不起作用的。另外,这个mask是同时输入和输出,就是说你不setzero的话,他会非零的部分不让你画了。以上都是书里面反复告诫的,我依旧犯了 错。cvPyrSegmentation又是另一个强大的函数,你要理解这里他似乎不是一个完全实现了当初的设计意图,这个是我自己猜测的因为原来的参数 里面的返回一个connectedcomp的CvSeq可是,这个cc里面的contour没有赋值,就是说他告诉了你这个segment的面积, boundingbox,color,但是没有告诉你他的分布,同时要明白这个segment不一定要相通的,所以,当你发现boundingbox的 rect使整个图你不要像我一样的吃惊。那么怎样获得这个区域呢,不如contour,树上介绍使用cvfloodfill,于是我就只好去在rect里 面搜索等于color的pixel,我希望你不要像我一样反复翻一个低级错误,就是IplImage的imagedata是signed char*,那么你和cvScalar的double类型来比较当然是一个天上一个地上,因为负数转double可能是不行的,所以,你也不要使用所谓的 memcmp,我之前有成功真是奇怪,因为比较的长度如果是depth=8,nchannels=3你要怎么使用memcmp,我真的是糊涂。所以,如果 你要把一个segment的所有区域都找出来,只能是一次次的floodfill,一次次的把它们记录在mask上,有更好的办法吗?


三月十日 出太阳了,可是房间里面依然冷的像是冰箱一样

从第六章开始非常的难,第一题就不会,因为不理解,我总是认为detect line应该使用hough transform之类的,那么使用cvfilter2d创建filter怎么做呢?题目要求探测60度倾角的直线,难道不是使用hough transform?看了一个早上原理明白,但是怎样运用houghline就不明白了。看来前面五章都是给我这样的业余人士入门的。


三月十一日 出太阳了,可是房间里面依然冷的像是冰箱一样

看了一天才明白了一点。laplace变换是一个x,y二阶导 数的和, 这个和sobel是不一样的吧。我的理解就是sobel是更加一般化的偏微分实现,而laplace是更加适合寻找局部的maxima值,因为它是和,当 然二阶导数的峰值就是边缘。另一个就是现在的导数都是近似的,比如sobel使用的是二项式?或者抛物线?的展开式?那么它内部肯定就是使用 cvfilter2d,因为这个实际上就是convolution的计算,据书上说有所谓的frequency的算法计算复杂度不再是m*m*n*n,这 里m,n分别是矩阵和kernel的size,而是n*n*log(n),这个一定就是opencv强大的地方。不过使用laplace变换我有很多疑 惑,首先,dst必须是比src来的大的矩阵,这里“大”的意思是类型,比如8bit=>16bit,而且必须是 signed,这里就是我的错误, 你创建cvCreateImage的depth参数不能简单实用16,因为必须是signed,所以使用一个mask把与它或成 IPL_DEPTH_SIGN,看上去就是-16,然后就有了我的第二个问题,16bit的图片好像window没办法显示,因为gdi的bitmap元 素都是byte,我想使用cvconvertimage好像也不行。我不知道别人怎么做的,我最后只能自己手动把所有的16bit转为8bit,同时祈祷 没有overflow,当然也应该可以使用比例,比如除以32767?总之我得到的laplace怎么看都不像是书上的边缘的样子。从我的理解 laplace肯定不应该和sobel的二阶导数一样,尽管书上说前者是由后者实现的,我看代码也看不出来。

我觉得我开始理解了,比如{{-3,0,3},{-10,0,10},{-3,0,3}}这个3x3的kernel是用来计算dx的偏微分的, {{-3, -10,-3},{0,0,0},{3,10,3}}那么这个毫无疑问就是dy的对y求导数了,为什么呢?很简单,因为这个是convolution而不 是使用matrix的乘法,所以你也看到中间的和两侧的是10:3的比例,这个我就不懂事怎么来的,二项式展开式这样子的吗?不过这个并不是sobel的 实现,据说是scharr filter,总之,我觉得所谓的convolution 就是这样一种二维的求平均值的方法,那么这个是因为矩阵的二维特性,至于矩阵乘法我的看法是这个也不过就是一种把横竖产生相关性的一种做法,说到底我们使 用矩阵就是因为他们是一个反映二维关系的表达方式,那么要体现他们的关系或者说correlation,就是要这么一种掺杂了横竖的计算,让他们发生关系 来反映他们代表的内在的关系,所以,这就是我关于矩阵乘法的看法,二十年前当我被教授线性代数的时候从来没有人跟我说过为什么矩阵乘法是这样子的仿佛这个 是天经地义的,诚然,所谓定义原本不一定会有什么好解释的。


三月十四日 又是大雾天

我是这样子理解fourier transform的,就是可以看作是一个向量和一个矩阵的相乘(这不是废话吗?)这个矩阵是这样子的形式,let E(m)=exp(-2*PI*i*m/N) 那么这个矩阵就是这样一些所谓的向量组成的,let v(k)={E(k*0), E(k*1), E(k*2)...}; 那么这个矩阵就是NxN的M={v(0),v(1),v(2)...,v(N-1)};所以,一个向量X={x1,x2,x3...,x(N-1)}乘以 这个矩阵M就是傅立叶变换。(不过,这个实在是太幼稚了,我这就是在解说什么是线性变换,太小儿科了)。唯一想要说明的就是你可以把这些个v(k)看作是 fourier domain的basis,也就是说据说是频率空间的独立向量,那么原本在“时间”空间的(比如我们sample的信号),或者 “空间”空间的(比如图形 组成的矩阵,如果没有人告诉你他是什么,那么他和离散时间sample得到的信号有什么区别呢?jpeg就是这个的应用)向量表达为fourier domain的线性组合。我的理解是在很多在低阶空间的运算到了高阶空间就变成了线性的,好像降阶了,比如幂运算在对数里变成了乘法,乘法在对数里面变成 了加法。那么这样子去理解convolution在fourier空间变成了线性复杂度就容易了。这个应该就是所谓的convolution theoram。

不过我现在还是不明白DCT为什么是DFT的一半?也许是作者的比喻?还是数学的近似?fourier的变换的逆运算难道和它本身那么相似?我还看不懂。

所有这一切都源于我没有学习过Information theory的缘故。第六章实在是太重要了,因为这个是所有部分里面最最需要数学基础而且最最不容易直观理解的,我还没有看第七章,但是我都可以凭脚趾头 想象histogram那只不过是一个粗略描述事物的属性的方法,我觉得他丢失了太多的矩阵位置信息,因此,要比所谓的image- integration方法粗略的多。想想看,integration也不过是线性的复杂度,你难道不能用后者吗?当然平心而论两个东西风马牛不相及,只 不过我觉得histogram不运用空间位置的信息,淡淡就是一个统计数据比较粗燥。我时常这么想,假如我们要用一种快速而“不讲究很准 ”的方法来做“粗 略”判断的话,使用histogram也许太浪费了,不如随机采样,从概率的角度来看是等效的。我想,肯定已经有无数人这样子在做了。


三月十七日 阴天?晴天?

又感冒了,身体越来越虚弱,记忆力越来越差。快想不起来昨天做的什么了。试图编译pixie,后来发现只有第一版似乎才支持vc6,结果还是缺了几 个文 件,plus你还要安装windows版本的bison/flex,所以,这个玩意很牛叉的他应该是定义了某种语言然后产生什么东西?可能就是rib文件 的语法?编译的目的其实仅仅是想跟好的了解使用,所以,使用的话还是用windows 的开发sdk就好了。zlib123也放在这里吧,现在已经124版 了,以后老版就难找了。windows版本的bisonwindows版的flex.

存旧的练习


三月二十一日 阴天?晴天?灰蒙蒙的,也许内蒙古的沙尘暴穿越千里袭击了厦门

买了一本关于颜色的书,难以想象的价格29元,但是这是一本很不错的书,因为他回答了我的一部分问题,为什么三原色是rgb,也许是由于人类的眼睛 的感光 细胞有三种,分别对红绿蓝敏感,但是随即一个问题,如果我没有搞错的话,就是rgb三原色组合所有其他颜色是所谓的additive,就是线性组合,但是 线性组合是包括减号的,我试图理解其中的解释,也许另一个所谓的开式神经元和闭式神经元组合形成了加减号?不过,至少这本书回答了一部分的问题。不管我是 否正确理解与否。


三月二十三日 很热,仿佛夏天来了

和L讨论颜色,不得要领,因为我也不确定我的理解是否正确,rgb的起源也许是人眼的结构有关,更应该是精度的需要把?否则为什么选择三维矢量?我 不知 道。讨论中我说也许使用类似非笛卡尔坐标系的表达要比rgb有某种优势,比如极坐标,那么今天晚上看的hsv/hsi系统应该就是这么一个想法,hue是 rgb之间的夹角,或者说相对方位?saturation S=1-3MIN(R,G,B)/(R+G+B)是颜色的纯度,intensity 是总体的强度I = (R+G+B)/3,不过当我在努力试图理解这个表达的意图时候,我倒是觉得它更像是一个统计学上的方法,比如,你觉得S是描述rgb最小的值的,I则是 描述整体的值,H描述的是rgb三者之间的关系,总之,我的感觉就是这样子的,如果你的表达方式能够表达这样的三维矢量的关系那么他就有某种得天独厚的优 势。

我对于高等数学的理解非常的肤浅,我始终都不明白为什么要引入复数,现在有一点点的理解就是,这个目的是要找到一种循环函数,因为i=sqrt(- 1)有 着这样一个奇妙的特性,他的周期是4,i,-1,-i,1,就是说i^n是周期为4的循环,那么这就不难理解为什么三角函数能够在某种程度上替代它了, cos(nPI/2)={1,0,-1,0},看到了吗?这个循环函数还不是真正的周期为4,cos(nPI)={1,-1}是周期为2的。

上个周末的确是沙尘暴,我没有错。


三月二十四日 雾天

所以,我觉得我是对的,使用复数在dft里面的原因就是他是一个周期函数,如果你能找到另外一个周期函数,那么你就可以定义一个新的傅立叶变换。所 以,你 看到DCT也就不奇怪了,因为三角函数也是周期函数,(这个是一个非常非常的基本的概念,可惜我的大学教育是一个失败的典型,老师没有说过的我就不懂,其 实,即便说过我也不见得理解,中国的大学里面不主张上课提问,不懂就不懂,下课早就忘了,即便想问也很难回到当时的context,连问题都解释半天不要 说回答你的问题了,所以,一个小小的疑惑累计成了一连串的疑问,最后导致什么也不动了。)


三月二十九日 雨天,蒙特利尔

经过了三十多个小时的跋涉终于抵达了目的地,蒙特利尔。刚下飞机看到一丝阴翳,觉得这是一个bleak的早晨,随后是一天的忙碌在朋友的帮助下终于 安定了 下来,现在终于坐在了电脑前,唯一想写下来的一句话竟是如此:当我再一次从中国回来后的一觉醒来的感觉竟然是这样一句话,I feel my mind is purified and my heart is rinsed.当然有很多的无奈与寂寞,然而,我觉得这里更加的适合我的心灵。

临出发的时候依然忘记了最最重要的事情,我买的《learning openCV》没有带。万幸有一本电子版,否则不知道该怎么办了。

我经常犯的一个低级错误是深度的常量IPL_DEPTH_8U,而图片的格式CV_8UC3,那么你自己创建的图片默认都是bgra的格式。 可能是我总是使用cvLoadImage得到的是微软的格式吧,所谓的rgba?


三月三十日 阴天,蒙特利尔

昨天去买了一个LG rumour2的手机,让我有了一些真切的使用体会,的确这是一款专门为短信使用的手机,其实,这就是技术的一种满足用户需求的体验,使用text的最大 的头疼就是数字键盘不是qwerty的问题,那么这个问题不是不能解决,只是你认为是否值得解决。我现在才开始体会手机的绰号rumour的含义,谣言与 长舌妇的舌头都是跑的飞快的,同样的这款手机就是这样子的。那个销售员给了我一个意想不到的cool的号码,区号当然是蒙特利尔的,听上去就是 “我要 死”,我的手机号码很夸张,“去去留留吧吧吧”,看来为了这个号码也要一直保留它了。

我觉得我只能使用我自己的方式来理解所谓的时域或空域转换到频域的变换,线性变换的定义就是使用在目标空间的一个base,使用这个base的线性 组合来 表达我们的向量在目标空间的向量,那么频域空间是使用所谓的周期函数,周期函数或者使用复数,或者使用三角函数,前者就是傅立叶变换的形式,后者就成了 DCT,我们把我们通常的矩阵里图像值,或者颜色标量,写成了。。。我以为我想明白了,写下来才发现不是的。。。因为这个不是线性变换,所以,不是线性组 合。

所以,你只能类比,观察:周期函数是这样一组向量,相邻的角度差固定为PI/N,这个向量应该是周期比较短的,下面一组向量相邻的角度差是 3*PI/N, 这个角度向量比上一个变化率就慢了。以此类推,下一组的相邻角度差是5*PI/N,。。。假如我们想象这个发生在一个极坐标空间,好像是N个向量均匀分布 在0-360角度上的N个向量组成的base,然后,使用我们原来的“时空域”的向量与这个base做transform,其实 就是我们的这个N维向量与 base的N个向量的点乘,得到了频域空间的N个标量,或者说频域上的N维向量,这就是变换,不过我观察到的变化结果比如DCT总是左上角有些白色,其余 都是黑乎乎一片,这可能就是所谓的左上角是高频部分,低频部分都趋近于零,这个大概就是一种近似?不过我的疑问在于对于一个nxm的图片矩阵变换的那个N 是否就是这里的nxm呢?如果是的话,那意味着什么?

使用cvConvertScale要明白他的意义,这个原本是做一个类型转换,比如深度8的byte图片转为深度32的浮点,那么这里的类型转换是 紧紧的 类型转换,意义上来看你要进行scale,比如1/255,否则这个图就太白了,太亮了。为什么呢?我也没想明白。

应该是这样子的,仿佛opengl里面的深度一样全部映射到了0-1之间。所以,转换的时候要除以255。cvDCT好像应该支持inplace的,但是 不成功?


三月三十一日 阴天,蒙特利尔

provigo的全自助式购物方式为何无人报道。 这个只有在中国古代的梦想中才有吧?


四月一日 昨天下午,阳光很灿烂

使用DCT可以直接inverse,而使用DFT的inverse必须scale,参数就是CV_DXT_INV_SCALE,这个证实了以前 mudur 所说的DFT/DCT都是无损的操作,只有在quantization的时候才是jpg图片丢失数据的操作。


四月四日 昨天下午,阳光很灿烂

DFT/DCT可以有逆运算就像所有的线性方程组的解一样,这本来就是线性代数的一个具体应用一样,我始终没有建立这个观念,非要想上好一 会儿。解线性方程组就是线性变换,两个的意义看上去不一样,实际操作一样,这其中应该是有很深刻的内涵。

一些基本的数据结构我都跳过认为很简单,后来遇到问题有要回过头来读,这就是一知半解,比如基本的问题,怎样把一个IplImage*转为 CvMat*, 从c++继承的角度来看,作者说是都是CvArray*这个抽象类的子类,话是这么说,实际上为了兼容c,CvArray*根本就是一个void指针, IplImage和CvMat也毫无多少相思之处,之所以使用IplImage是为了使用intel的IPP库,所以,我为这个简单的不能再简单的问题还 着实烦恼了不少,最后才发现一个很handy的做法,cvGetSubRect这个当然省的你自己几行代码,但是反过来变换要使用什么函数呢?当然退一万 步来说从CvMat到IplImage是不大可能的,因为父类不能表到位子类,因为他没有那么多的数据,所以,不用费神。实验了一下任意的图片来做 convolution的kernel,当然做完了才意识到convolution不适合于很大的kernel,因为从根本上看他是某种求平均数的概念, 很容易就溢出了,便全白了,即使使用convertscale平移,也很无道理。所以,这个想法很无意义。不过,我原本是想和书上的的使用DFT计算 convolution的快速算法来比较的。先做到一半

cvDFT是支持inplace的,而且也不是一定要使用所谓的optimal size,所以,那个不是必须的是为了优化的。


四月五日 昨天下午,阳光很灿烂,今天阴云密布温度下降了很多

不分白天黑夜的看那部三个老男人的电视剧,剧情和女人基本无关,其中只有几集有几个女配角出现,基本上剧情都是语言文字的游戏,这就是yes,prime minister/minister。

四月六日 阴天

不知道为什么开始有过敏症状,难道过敏也是一种老年病?我在加拿大之前的六年中从来没有过敏的症状,这次在中国呆了一年多回来就会过敏?水土不服是 应该 的,刚回国也有一些症状,现在看来人的内环境和外部环境息息相关。

reshape的意思是改变channel或者row,不过我不知道是否只对“紧密型”的数组有效?例子里面是创建一个两列单通 道的浮点矩阵,然后reshape变为双通道行数不变,这意味着列数减半,当然我想行与行之间必须是紧凑的吧?

看了openCV附带的intel的ipl手册才意识到这个项目的确应该是绝大部分是intel的部分,否则以开源的人力与能力很难做到这一步,至 少我看 到的大部分功能都是intel之前就有的,不过也许这些作者原来就是intel的?反正这是一个大好事,现在不很清楚的是intel的ipp中的ipl是 否能够单独剥离出来?估计不可能,这个绝对是要花钱的。不是开源的。

我常常想也许大多数人都会和我一样觉得有些问题是挺困难的吧,这个问题困扰我是因为我不知道自己是不是太弱了。比如这个编译的问题1063是因为模 板的内 存使用太多的缘故,这个我现在再次遇到的原因是因为我使用了这样一些模板,首先是一个set,其中的type是一个结构,然后我希望能做一个这个set的 所有的组合(combination)后来找不到现成的模板方法治好退而求其次使用所有的二元组合,就是这个set的所有的element两两组合,然后 我要求他们两两之间的一个correlation的关系,就是一个float,于是我需要组成一个map,问题就处在这里,在制作那个set的时候我记得 使用了一个comp的帮助类,用他的operator()作为参数pred,结果在构造map类的时候忘记了,结果vc6的编译模板出来的错误 /warning又臭又长,花了好一会儿才明白是map类也需要构造一个比较大小的帮助类。

我的全部想法其实很简单,ml里面有一个所谓mushroom有毒无毒的机器学习的例子,这里是数据文件。这里是原来的例子,这个是我自己的一个小实验。 我想做的就是寻找这样一些poison或者edible的必要条件,就是说,找出这样的条件以至于只出现在poison而不出现在edible,或者正好 相反,然后再去求解这些必要条件的概率,我觉得bayes定律很多就是人类经验的直接反映,不过他有一个所谓的naive的形式,在这个形式下假设那些 feature都是彼此independent的,当然bayes网络好像不需要这个假设,那么我就想找出我的这些必要条件的之间的彼此关联度,所谓 correlation,也就是说当她们都为poison的必要条件时候同时出现的概率有多大,当然对于彼此独立的feature这个应该是一个符合随机 的概率,我猜想符合p(a)*p(b)=p(a,b)这本来就是独立随机变量的定义,不是吗?所以,我可以通过这个training数据来验证那些 feature之间是独立的,然后筛选出更好的,或者说减少/合并那些feature。不过,淡淡编译这个小程序就卡了我半个小时,肚子太饿了。

我的过敏是不是由于我在过去的一年多里服用了太多的抗生素?去年感冒就有好几次,服用抗生素成了家常便饭,比我之前在加拿大六年多还要多。

网络总算是通了,原来bell现在希望给用户的dsl升级为30m,就是安装一个小小的filter养的东西,当然新用户他就坚持派 technician 来,所以,才需要多等了一个星期。我现在把四台台式机都设定了远程桌面访问,所以,从两台笔记本来访问网络来控制服务器。如果有的系统默认没有给你 administrator的用户,那么这样改注册表HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \Winlogon \SpecialAccounts \UserList添加一个dword的项,administrator设定值为1.


四月九日 阴天

我想我还差的很远,正如别人评价的那样。《kingdom of heaven》其实是一部非常不错的电影,只不过需要看两三遍才能理解。看到网上说的hal.dll的找不到的错误是由于boot.ini错误造成的。


四月十三日 晴天

连续两天做题目,还是有所长进吧?不过还是不宜公开吧。放在不发表的地方吧,搜索引擎是猜不到的。

四月十四日  晴天

我觉得这是一个非常经典的证明,虽然不复杂,但是我能够想出来我还是很满意的,查询wiki的时候学习到这样一个关于metric space的定义:

A metric on a set of X is such a distance function between elements of X such that function d: x*x --> R where R is real number and * is not multiplication, but the set operator which  I forget the name. For all elements x,y,z in X, the metric function satisfy following:

1. d(x,y)>=0  (non-negativity)

2. d(x,y) = 0 if and only if x=y (identity of indiscemible)

3. d(x,y) = d(y,x)  (symetric)

4. d(x,z)<= d(x,y) + d(y, z) (triangle inequality)

Then it says "The first condition is implied by the others." And this is where my proof comes from. How to prove the first one is already implied by the others. Or in other words, actually the first requirements is not independent.

Using proof for contradiction. Assume d(x,z)<0 is true, then applying rule 4 for a special element x itself.

a)    d(x,z)< 0     (assumption  and  x != z this is important for below)

b)    d(x,z)<= d(x,z) + d(z,x)   (rule 4)

c)     d(y, z) <= d(y, x) + d(x, z)    (rule 4)

d)    d(x,y) <= d(x,z) + d(z,y)      (rule 4)

Now sum up c,d and apply rule 3 to get

e)   0<= 2d(x,z) which is contradictive to assumption a. Then we finished proof!!!


四月十五日 晴天

讨论线程优先级完全无结论就只好各自做实验来验证,问题真的那么简单吗?比如几个优先级不同的线程一起运行,低优先级的永远没有机会运行 吗?看上去是这样 子吧?可是实验并不能验证这么intuitive的想法,我想很多人都认为这是理所当然的,我排除了线程的priorityboost,虽然没有检查 priority-class,但是应该是一样的。同时我最后还把critical-section,以及输出打印的干扰去除了。最后的测试是这样子的。

我有修改了一下,去掉了critical_section,这样与许有一两个结果错误或者被删掉了,但是无关大局。同时我也意识到了上一次错误的结 论的原 因,因为运行次数在这里仅仅是我的while-loop的次数并不是thread切换的次数,因为cpu太快了一个时间片可以运行我的计算很多次,所以, 结论就是最能反映thread在切换后是否被运行应该使用一个很大的循环,所以,你看result10000-no.txt
thread[0] with priority THREAD_PRIORITY_IDLE runs 1173
thread[1] with priority THREAD_PRIORITY_LOWEST runs 1208
thread[2] with priority THREAD_PRIORITY_BELOW_NORMAL runs 1170
thread[3] with priority THREAD_PRIORITY_NORMAL runs 877
thread[4] with priority THREAD_PRIORITY_ABOVE_NORMAL runs 2151
thread[5] with priority THREAD_PRIORITY_HIGHEST runs 27274
thread[6] with priority THREAD_PRIORITY_TIME_CRITICAL runs 31682
应该是最准确的,同时我把创建线程的顺序改成了低的先创立,所以,结论有两个:
 
低优先级的线程不会完全没有机会,应该是一个概率一样的,不是绝对的低就不运行。
加入同步锁之类的应该会改变行为。

两次的实验结果。1 2。

here comes...

Form The Windows SDK of MSDN, you can find this statement as below:
"The system treats all threads with the same priority as equal. The system assigns time slices in a round-robin fashion to all threads with the highest priority. If none of these threads are ready to run, the system assigns time slices in a round-robin fashion to all threads with the next highest priority. If a higher-priority thread becomes available to run, the system ceases to execute the lower-priority thread (without allowing it to finish using its time slice), and assigns a full time slice to the higher-priority thread. For more information, see Context Switches."
(Ref:http://msdn.microsoft.com/en-us/library/ms685100%28VS.85%29.aspx)

Again, MSDN said "if a higher-priority thread becomes available to run, the system ceases to execute the lower-priority thread ". What means "cease" in English?

Java may have different behaviors because it has to consider the problem of cross-platform. But .net only uses native system API and never care cross-platform. So the behavior of .net should be same as the native windows application. Whatever, as the MSDN mentioned above, the lower priority thread should be "ceased" at any windows application when a higher priority thread want to run. 

here goes...

So, you probably still are puzzled with my previous results which has too less loop to run a "full-time-slice". Just look at my data and you will see, it consists primarily two threads running. All the others, I guess you can ignore as they are created by that sequence so that at least they got a run at very beginning. (Actually I just quickly tested by creating thread in reverse order, from high priority to low. see below results.) So, basically what I can see is that primarily only two threads are running alternatively, critical and highest.
And I think? The "Highest"! Of course the "critical" himself cannot be counted! Otherwise what is use of time slice? (I think this is the point you might go wrong by considering the "just-finished-time-slice-thread" as one of candidates.)
 
So, this two-player-game goes on.
 
 thread[0] with priority THREAD_PRIORITY_IDLE runs 1080
thread[1] with priority THREAD_PRIORITY_LOWEST runs 1080
thread[2] with priority THREAD_PRIORITY_BELOW_NORMAL runs 1078
thread[3] with priority THREAD_PRIORITY_NORMAL runs 865
thread[4] with priority THREAD_PRIORITY_ABOVE_NORMAL runs 3003
thread[5] with priority THREAD_PRIORITY_HIGHEST runs 26928
thread[6] with priority THREAD_PRIORITY_TIME_CRITICAL runs 31501

here goes again...

Of course, I cannot agree "technically" how "If a higher-priority thread becomes available to run, the system ceases to execute the lower-priority thread (without allowing it to finish using its time slice), ..." can be implemented without FIRST stopping the running of low-priority thread and then "checking".
 
Just image there is only one CPU and one thread is running, how can you know there is another high-priority thread is ready without stopping "APPLICATION" to give system a chance to check? By interrupt, I assume, still the intterrupt handler needs CPU for running its program by STOPPING running thread.
So, basically what I understand this rather "humanity" description as the I/O blocks a high-priority thread before and put it in waiting and then run the low priority threads. When interrupt comes, (which is so ruthlessly that it doesn't care about time slice. Anyway, how can interrupt know about time slice?) then the scheduler needs to make a decision after I/O interrupt finishes: whether to continue the time-slice of low priority or starting with previous blocked high-priority thread? Of course here the priority plays its role. However, never can you assume a high-priority thread can interrupt the running thread time slice because there is no way for you to do this without first to run! (See the chicken and egg problem here?)
 


四月十六日 阴天

学习了一些新东西。一个class的initialization可以做三样东西,给常数赋值,给reference赋值,给没有default constructor的member data赋值。

class B{ public: B(int x){;}};

class A{ const int I; int &r; B b; public: A(): I(6),r(I), b(I){ ;}};

priority-inversion发生的条件是高priority的线程等待低priority的thread完成释放资源,但是他又被中等 priority的thread阻断了。所以一个解决办法就是在线程拿到资源后就暂时提高优先级。

virtual inheritance是发生在多重继承的时候共同祖先被多个后代重复生成以至于产生ambiguous。语法是class A: public virtual B这样子的结果是继承的是“虚”方法表,当然会有另一个真正的祖先实体,(我的理解虚表是偏移量,你还是必须有一个实体结构来指 示偏移的东西。)

我的一个结论,也是我刚刚想起来的,就是把计算密集型的线程 的优先级定的低一些,而把i/o密集型的定的高一些。

这么多天我把mushroom的事情忘得一干二净了!!!

有人说使用Private destructor而public constructor可以达到final的效果。

type conversion operator is like this: operator Type();

And remember that you cannot cast const to non-const parameter unless using const_cast etc. For example, if they require a non-const reference, but you have a const object, then simply const_cast<A&>(a) to remove that const. (Isn't it too late to memorize this? Every time I have const problem, I just simply remove the original const. My bad.)

关于如何声明使用成员函数指针一直都是一个困惑,因为我没有用过。花了大半个小时才看明白例子,于是扩展如下:

class A;

typedef void (A::*FuncType)(int);

class A{

public:

FuncType array[2];

FuncType funcType;

void test1(int x){;}

void test2(int y){;}

A(){ array[0] = &A::test1;  array[1] = &A::test2; funcType = &A::test1;}

int main(){

A a;

for (int i = 0; i < 2; i ++){  (a.*a.array[i])(i);   (a.*a.funcType)(i); }}

 所以,有两点记住,当给成员函数指针赋值的时候,你使用的是类型而不包括任何实例,因为成 员函数只不过是带有类的隐含参数的特殊函数,所以,funcType = &A::test1;  其次,你在使用的时候,一定要把实例带上,这个和普通函数调用不同的。(a.*a.funcType)(i);一定要加上挂号dereference,我 为了这个折腾了快一个小时。

如果是private inherited,那么使用using Base::method声明就可以把它重新声明出来到public等等。有的文章说,private inheritance和composition有时候等效的。同时我的一个错误概念就是private继承对于子类访问父类数据来说没有什么影响,只是 父类数据放在什么地方而已。

突然想读一下自己以前写的喃喃自语,回想一些尘封的记忆,那是多么幸福的时光啊。现在的心境明显的苍老了,不只是身心,有时候。。。真是无语。 speechless,只有这时候才能真的明白什么叫做天凉好个秋。

当一个类被继承之后,祖先的指针指向子类的实例,就自动指向被继承的那部分祖先,因为后代包含了一部分的祖先。


四月十八日 纽约 晴天

来到了纽约,十五年之前我来过一次。今天,终于在第五大道,broadway等等注明的街道走了一下,吃了一个五块钱的街头的热狗,这个东西和中国 的烤红 薯一样,闻起来不错,吃起来其实不怎么样。在费城坐那种二战制造的小飞机你才知道美国居然有这样的飞机在飞。纽约估计我是不太适合这里,反正是到此一游 吧。

topcoder practice.


四月二十日 蒙特利尔 晴天

从纽约回来了,兴奋了一个下午,毕竟100k以上是我现在无法拒绝的,当Gelena问我是否高兴的时候,我说I am more than happy and I cannot resist. 她说,you are so great and they cannot resist, either。我知道这个是好话,其实,我还差的远了,一个fibonacci这样的问题我在紧张之下居然会写错,不过他们善于从简单的问题深入下去,比 如怎样优化,为了省却一次赋值fibonacci的两个变量你要交替使用,但是你能避免一次比较操作吗?无论你是否是为了比较fib的两个较大,还是自定 义了一个交替变化的bool,然后另一个interviewer问我N很大的时候会怎样?我才开始意识到overflow,怎样避免呢?我一开始说使用 int64,她说不太好,那么我说我是否能够预先知道int范围内fib的最大值呢,毕竟这是一个well-known的问题,她说不一定,我才想到其实 溢出就变小。然后她又问我能否估计出这个数列的大约个数,我粗略估计fib比乘2差不多姑且按照2的幂来估计,所以,一个问题引出了很多问题。另一个非常 有意义的问题是这样子的,在一个10x10的格子上随机种树然后找出是否存在一个左右贯通的路径,在随机产生上我的方法被提出优化,因为随机产生坐标很可 能重复,后来他给我提示我才明白有一个更加简单通用的方法,那就是你干脆走一条随机路线,在路线上随机种树,种树的概率由树剩下的个数除以剩余的空格数, 这实在是一个绝妙的算法,两部分的算法归结为一个,既解决了随机坐标很可能重复很多次的问题,又避免了寻找路径使用递归的很多罗嗦事,这个我绝对想不到。

在topcoder上我看了半天才意识到不一定是我的算法慢,应该是我做练习的时间晚了,所以第一个提交的分数是别人的很多倍。这个问题让我回忆起了我至今没搞明白的trace32的问题,嵌入式程序员应该掌握的 基本功我还没开始有结束了,是啊,那种等待dumping的时间让我觉得我都被浪费了。


四月二十二日 蒙特利尔 晴天

心烦的时候就上topcoder,现在这个250分的题目我已经做到一次coding无编译错误,一次性检验成功,连 我自己都觉得太不可思议了。

四月二十三日 蒙特利尔 晴天

原来对于dynamic programming就很发出,从来就没有真正写过,这个也没有办法,递归其实不一定需要,只不过有些头疼了。

重新完了一下在ubuntu上的编译,发现又要从头学起,就找出来08年底在datawind和andy一起研究怎样移植到mips上的那些笔记, 现在看 起来还是有些含混,因为安装各种lib,以及他们之间的依赖这实在是很头疼的,我又一次忘记了那些命令,连tar cvf这样都要重新google,实在是难为情,不过我的记忆力真的是不行,忘记了libconfig的刷新是怎样的。头疼的厉害。把握大部分的衣服都扔 了,并不是喜新厌旧,因为我从来都不穿,就算送给救世军你也要洗干净,何况那都是些垃圾。只有那件皮衣虽然破烂却很怀念,其他的皮衣其实质量都远不及这件 据说是意大利的出品,有机会补一下吧。阳光这么灿烂,去跑步吧。


四月二十六日 蒙特利尔 晴天

睡眠不足。topcoder的练习场的题目和历届邀请赛的题目难度相差甚大,看到很多人使用插件,我接受新事物很迟钝,还是以后再说吧。昨 天那个1050分的题目折磨了很久,递归超过两秒就算错,我也不想改了,头疼。

四月二十八日 蒙特利尔 大雪纷飞

睡眠不足。topcoder的分数只能参考,根本不是性能等等的因素,只是提交早晚的体现,当然话说回来,晚来了你是可以另开一个账户抄代码的,所 以, 唉,这个问题没法解决,我又从来不敢去tournament,只是在练习场里消磨时间,300分以下的也不费脑子,用这一种头疼去解决失眠的头疼,头疼。

昨天看电影《backup plan》,这是一部典型的女性电影,讲述的是在现代社会男女在压力下不愿意承担繁育后代的牺牲,但是女人由于先天荷尔蒙的刺激又对于繁殖后代有冲动就采 取人工授精方式成为单亲母亲,但是这个时候遇到的男朋友却要成为别人的精子繁育出来的孩子的爸爸,这个可能在美国社会有一些现象吧。

要去边境办签证了,真有点视死如归的感觉。临走前最后的一个题 目


四月二十九日 蒙特利尔 晴天阳光灿烂

昨天去边境办签证不成功,美国警察的意思是你现在又不打算立刻过关就没有必要办,要我还是从机场走的时候办,的确也是如此,我的那张机票已经贵的离谱了, 单程比来回还要贵。

在remote desktop上怎样关机?这个问题问了无数遍,这就是google的强大,最简单的就是alt+F4,否则那个关机的选项总是断开让你不知所措。微软的 声音驱动架构改成了所谓的uaa总线驱动下的架构,知道一个名词。

topcoder上的大虾是很牛, 写代码已经精简到了令人叹为观止的地步,不仅仅是使用插件用一大堆的宏定义了一大堆的模板,应该说使用stl已经是一个巨大的进步,在使用那些个 codeprocess之类的插件代码就更加的快了,当然更加牛的是算法的精确理解,比如这个500分的题目,看看我的答案就知道差距在哪里,首先,使用 permutation是要从最小的开始的,题目里面说了“不一定要distinct”然后我就按部就班把所有的 permutation都跑一遍,这就是 脑经不清楚,其次,我意识不到"ab"说到底就是01等效,结果作permutation之后再映射回原来的字符串,因为我以为自己严格的按照题目要求使 用重复的排列来计算,这就是算法不清楚的地方,求平均值的时候,重复的permutation不产生平均只是正确的,这就是binary产生平均值的重要 一点,我的答案超过了两秒限制,看大虾的解答深有收获。(topcoder不让拷贝别人代码,我就重写了一遍,当然不是使用那些插件的宏。)

而且今天犯了一个低级的错误,?:的优先级比四则运算低,结果 5 - (i)?(5/i):0; 是有问题的,看了半天才想到真是郁闷,因为原本我的意图是判断i是否可以做分母除法,现在意义都变了,i加上挂号也没有用。


四月三十日 蒙特利尔 晴天阳光灿烂

看伊朗阅兵觉得有些好笑,比如还有骑在后座上的摩托车兵,仿佛回到了二次大战时期,看到在拖车上的装甲车让人疑惑会不会是模型,否则为什么不开车阅 兵?印 度的阿琼据说以前也是这样子阅兵的,总体感觉就是觉得越是落后软弱的国家越是要穷兵黩武,我想美国人民以前经常看到世界上其他国家这样子好笑吧,也许以前 中国也是这么好笑,现在进步了一点。


五月四日 纽约 晴天阳光灿烂

来了四天了,上班了两天了,好累。这里的生活确实是紧张,这个钱真的不那么好挣。那个terminal系统确实的复杂。


五月九日 纽约 阴天

观看Military channel的朝鲜战争,结合我们小时候的教育现在你有了一个比较完整的画面。这几天我究竟生活在什么状况呢?每天都加班到晚上八点以后,最糟糕的是十 一点,如果我做的是什么困难的编程工作我也就服气了,问题是最多的不是做什么而是明白要做什么。系统应该是开发了很多年淡淡使用都是很复杂的,你想整个编 译后的可执行程序被称作big有一个多g,系统应该是非常的快否则不可能占据市场。每个所谓的api都有作者就有所谓的使用权,就是privilege的 限制,因为是unix这个很容易理解,整个系统就是一个window的远程客户端查询服务器数据的这样一个terminal,编译的时候使用一个所谓的 mbig的版本,这当然是可以理解的编译这么大的一个程序需要多长时间?他们肯定有一个高效率的编译系统,当你提交你的要求runcs这应该是一个自己设 计的dependency检查,编译,链接的应用,需要一个版本参数,比如3000,怎么检查编译log,gl看到的chaoes,应该有众多的程序员都 在同时使用,所以使用一个小小的gtail mbig3000这个几乎等价于greb mbig3000 -f |tail,我是重复kz的说法,应该是我记得不对。运行bcmp有权限,所以使用所谓rrrr bcmp 501,这个501是一个开发server,编译完了所谓的mbig他被部署在某个地方,运行的时候rrrr bcmp 501 //big mbig3000这个//big告诉使用的时候所谓big,以及后面的版本,20分钟idel后被系统消灭,所以要重新编译。朝鲜战争的确是美国人心痛的 战争,因为的确是一个没有打赢的战争,应该要这样客观的看,虽然志愿军伤亡是美军的很多倍,但是看看美军的近五万战斗阵亡,想想看太平洋战争期间美军的阵 亡,当时面对的强悍的日军,所以,这个伤亡是很大的,还有众多的联合国军和南朝鲜军,所以,这是一个平局的说法并不过分。

昨天走到125街,看到wagner的纪念碑写着:The pursuit of happiness is not just verbal affirmation. It requires decent housing, fair employment, and equal opportunities for all our citizens. 这几样恰恰是当前中国所欠缺的,这也是美国从建国之初的独立宣言所追求的we take it for common sense that every one has the right to pursuit of happiness.美国为了实现这样一个common sense奋斗了两百多年,号称人民政权的共产专政却从一开始都没有意识到这是一个common sense,难道常识在一个国家是常识,在另一个文焕过度里就不是了吗?如果从一开始就不承认这是常识,又怎么不会出现今天的怪现象,这么一个十几亿大国 的总理提出了一个有尊严的生活的概念之后全体国民才开始讨论什么是有尊严的生活的概念,这如果不是一个常识,又凭什么可以认识到他的实质无非就是 “像样的 住宅,不错的工作,和平等机会”,这么一个简单的内涵。这就是the pursuit of happiness,每个人每天都在奋斗的内容。


五月十日 纽约 非常冷

欧元真的有大问题吗?是市场反应过度吗?北方欧盟想要放弃南方欧盟吗?对于英德法等富国觉得希腊greek 就是贪婪greed的代名词,不想拯救,结果现 在市场的对于欧元的不信任让欧盟不得不大出血拿出了一个号称1 trillion欧元的救济方案,真是让人更加怀疑欧盟内部出了大问题,否则至于吗?这笔钱绝对是天文数字,超过了很小国的全部家当,所以,欧盟越是这么 信心十足的撑面子,越让我觉得fishy。

泰国的红山军占领首都要求政府下台,政府无计可施,因为政府不敢镇压因为泰国是一个靠旅游业吃饭的国家,安 全形象是他的生命,否则如果泰国是一个中国89 年以前的自给自足的经济体的话只要派出一个营的士兵加上几辆装甲车不出半天时间最多杀死几十个示威者就能够平息类似于“反革命政变阴谋 ”的示威,好小子, 居然敢要挟政府?你明白什么叫做无产阶级专政吗?可是,全球化让这种野蛮粗暴高效率的解决办法根本out of question,就算今天的中国也不敢再这样干了因为外向型经济导致政府更加的投鼠忌器,并不是因为所谓政府需要维护“人民” 政权的标签,这个遮羞布从 来不是原因,大不了宣布示威者不属于“人民”就可以继续维护“人民当家作主”的谎言,反正每次被杀的都 是被境内外反动势力收买的“流氓无产阶级”,不属于 “人民”,所以,政府替“人民”清除不属于大多数“人民”的“人 民”还是为了“人民”,这就是“为人民服务”的精神。


五月十三日 纽约 非常冷

bell canada简直是不可理喻,两个月charge我的手机五百多块!

中国现在应该是在某种火山爆发的前夕了,我觉得历史上振臂一呼应者云集就是这个时刻,想想看在一个多月的时 间里连续发生六起毫无关联的在六个不同省份的都 是集中报复无辜的小学生幼儿园的报复社会的仇恨行为你就知道这些人的对于社会的不满与愤怒已经达到了无法控制的地步,他们不能也知道徒劳地对抗手拿钢枪的 公检法,毕竟如同几年前的那位手刃十几个警察的武松式的大虾的人太少了,这些人只能对付最容易伤害的婴儿与幼童,因为这是唯一能够撼动这个统治集团的软 肋,不管你的官有多大不管你的权威有多高你很可能有个小孩子现在还很容易的被这些压迫被不公平对待的人能够轻而易举的伤害的。这就是着一个多月以来愤怒的 人民发出的讯息。

昨天我觉得我内心对于K的想法其实可能不公平,实际上他是一个非常有能力认真的人,他给出的建议我觉得是很 有真知灼见的,从优化的角度来看都是非常有价值 的,这种能力应该是对于代码执行有着深刻理解的程序员才有的素质,我从他的claim知道大概他以前做过类似在java jini大概就是从c调用jvm需要去hack调用栈之类的工作,我能够猜想的就是直接写汇编编造调用栈,因为理论上讲jvm是一个黑盒子应该不想让你直 接去调用的,这大概如同luk那一次在车上滔滔不绝的介绍他hack dll的调用接口制造所谓的api拦截一样的异曲同工的效果,这样他把第三方的dll拦截而不需要对方重新编译部署直接就hook到他新的dll吧。我猜 想。

泰国的红衫军会怎样结局?

看到有人说“君要臣死,臣FACEBOOK“(非死不可)。


五月十五日 纽约 阳光灿烂

昨天学习webservice使用c#,感觉现在的kids过于幸福了,visual2008过于傻瓜化了。

五月十七日 纽约 阳光灿烂

印象是一盆清水,时间却是一个不断倾泻的沙漏或迟或早会把清晰的印象弄得模糊。就像刚刚到蒙特利尔时候一样 一切都是那么清晰深刻,那个时候写下来的记忆是 那么的鲜明敏锐,后来都把一切都司空见惯了。如今在纽约也是一样。昨天去中央公园跑步我就爱上了这个地方,宁可多付几百块房租也想住在这附近,反正无牵无 挂省钱干什么?生不带来死不带去。

今天认识了yuki,参加了一个meetup遇到了不少各式各样的人,他们来学习中文还是凑热闹,我回家的路上才明白“虞姬”是 她说的中文名字。晚上终于可以上网了,无聊之际想起了topcoder,这个问题颇费了些思量,可是你想想这个是250分 得题目你需要想多久呢?我有了想法,可是眼睛太疼了,明天再说吧。


五月十八日 纽约 阴雨很冷

晚上听冷的。早上眼睛还是疼,所以就不写昨晚的那个程序了。前天去central park跑步碰到了一群跳拉丁舞的街头舞蹈人群,其中一个白人年轻女子和一个黑人青年的恰恰非常的吸引人,男的穿旱冰鞋,女士无肩长裙,腰间围着的衣服更 加飘逸,两个人配合的绝妙。后来我花了十块钱买了一盘cd,回来没听就忘了。

c#再简单也是一个对于我全新的计算机语言,虽然和java很像,但是你总要话上一两天或者几个小时来学习 一下吧,尤其这是一个web service的客户端工程,其中的数据结构一层套一层看得我头都晕了,k问我什么时候能完成,我比较小心不想太夸张就说下星期一怎样?因为我对于使用 proxy穿越防火墙没有概念,他反问为什么要那么长时间,我本来还想说验证可能有些测试要做,赶紧改口说那么就周末吧,结果他干脆说不如明天完成,后天 code review,我还能说什么?当然,这个要求其实也没有什么过分的,正常应该式这样子的,无非就是晚上多干两三个小时罢了。


五月二十三日 纽约 阴雨很冷

被解雇了,顿时生活立刻没了着落,下个星期修正一下再做打算。

这个是一个任务派遣的算法实 现,其中finishedJobVector可以在完成后更新实际的render分钟,这样就可以作为参数更新等待的任务的预估的时间。遇到一个细节, set的iterator被当作了const,因为你不能更改排好序的set,当然我清楚我没有改排序的key,我又不想remove修改再 insert,所以我就把那个结构的要修改的成员声明为mutable。这是我第一次发现mutable的实际用途。


五月二十四日 纽约 阴雨很冷

台式机发疯了只有ubuntu能够连接internet,Windows下总是显示cable被拔出,不过 我不想改变了,就是用ubuntu吧,几乎能够 做大部分的工作,你安装一个wine还可以玩windows下的游戏,显示windows的partition使用sudo fdisk -l,然后你就可以使用mount来mount了,比如sudo mount -t ntfs -o umask=022 /dev/hda1 /mnt/windrive

今天改变了算法, 使用真正的贪心算法


五月二十五日 纽约 阳光

vol_id有问题,使用blkid好了。sudo blkid -o device得到device,-s LABEL -o value得到label,-s UUID -o value得到uuid,-s TYPE -o value到type,在/etc/stab表里面建议使用uuid而不是device名字,因为那个可能会变。 花了一个晚上学习bash自动生成这个/etc/fstab的文件结果是这样子的。


五月二十六日 纽约 阳光

我觉得现在ubuntu已经非常非常的成熟了,我昨天安装了我需要的一切,编译环境ide使用 codeblock,eclips太慢了,根本不实用,大概 java原本就是这样自吧。html编辑器使用Kompozer,中文输入法使用ubuntu自带的智能拼音。游戏你可以使用wine来load,现在唯 一可能有问题的就是office了,不过,阅读应该没有问题,除了编辑。所以,几乎可以完全抛弃windows。想要把所有的文件都发布出来

这个发布的任务折腾了我一天,你想我的shell-script跟没有学过一样,最后朋到了一个文件名中间有空格 的问题,我找乐很 久才找到办法,就是修改IFS=$(echo -en "\n\b")最后还要存回去,其他使用find当然可以,但是得到的是绝对路径,我需要相对路径。这样自for i in $( ls $dir ); do就可以返回含有空格的文件名,包括folder。
发现ubuntu下使用filezilla非常的快,终于摆脱了cuteftp。不过这个html编辑器不大稳定,7。0版本是ubuntu的官方版本总 是crash,我只好下载了一个8。0的alpha版本
这个就是我的小小的脚本,很简单的。结果在这里。 

五月二十七日 纽约 阳光,然后就要下雨了,我听见了雷声

学习云计算,挺复杂的,一开始连各种各样的安全key豆糕不清楚,登录的pairkey和使用ssh的完全 不同,另外一个错误就是昨天做了一天的工作还是有错误,这里的原因是linux的分区没有label造成的,这是改进的。这里还是有一个问题,就是我把活动硬盘山村也放在fstab里面是一 个大问题,我下午发现mount的只能读,我还试图chown,后来才意识到这个在ubuntu上是不允许的。amazon的key是要改变成chmod 400的,这个是下载的工具。 我现在可以连接了,但是怎么创建ami还不清楚。现在才明白fstab的option, user means the owner is the one who creates, noauto makes sense now for those removeable disk. for NTFS, the type ntfs-3g allows RW。I am starving.


五月二十八日 纽约 阳光

我的理解是ec2-tool-api设置的key,certificate x509是验证身份的,那个key我怀疑就是所谓的ec2帮你产生的userid/password,ec2叫做 privatekey/secrectprivatekey,其实就是 userid/password,不过就是用户自己选择太危险,索性就有系统产生,那么创建了instance的时候需要的所谓的keypair实际上是 rsa的public/privatekey,这个是要在你声称instance之前产生并且放在即将运行的instance上面,这样你就可以用ssh 来连接了。
when you use "scp", the -i gives the identity file, this one should be rsa public/private key pair, you don't have to give your name/password(privatekey/secretprivatekey) because they are already stored in your environment. Open ~/.bashrc, there is ec2_exported key/cert for x509.
So, you need to generate public/private key pair BEFORE you create your instance.

OK, OK, OK! It is done as following:
1. use the ec2-api-tools because it is much faster and simpler than the console management.
2. here is the lists of ubuntu ami in ec2.
3. so, I choose the "desktop ubuntu9.04".
4. ec2-run-instances ami-caf615a3 -i myUbuntu904.pem (we must place ssh-private key file AFTER ami param!!!)
5. you can install freenx client.  to install .deb:  dpkg -i nxclient_3.4.0-7_i386.deb
6. you need to connect to your running instance. To do that you need the public DNS, Unfortunately I cannot find it except the instance ID from the ec2-run-instance. So, I have to use elasticfox. So, the public DNS, seems to be fixed: ec2-184-73-47-155.compute-1.amazonaws.com(of course it may not be fixed)
7. ssh -i myUbuntu10.pem root@ec2-184-73-47-155.compute-1.amazonaws.com   (this is a good ami as it allows you to use root without password)
8.  when connected, you need to add a new user because freenx doesn't allow you to connect with root: user-setup    (this is done in ec2 :))
9. now run the freenx back in your ubuntu here, by using the public DNS as the host and user/password you create on ec2. WOW what do you see?
10. don't forget to stop your instance cause amazon charges you by hours! ec2-terminate-instances instanceID

You don't have to ec2-add-keypair everytime as you can use with it created before.


五月二十九日 纽约 阴天

想改变apache的起始路径,修改/etc/apache2/httpd.conf 添加 directoryindex myownpath结果不起作用,重新启动apache: /etc/init.d/apache2 restart依然无效,最后只好把/var/www删除换成软连接,一开始不行发现是我的usb盘映射mount的permission是root的, og都不能读写?不明白怎么回事,因为。。。只好手动mount然后sybolic link,结果ok了。
不要使用ubuntu的hibernate功能,这个危险而且无效。
实际上要使用site-avaiable下面的配置文件这个是所谓的virtual site,改变起中的documentroot "mysite" and directory "mysite" which have both default as /var/www, and then you can sudo a2dissite default && sudo a2ensite mysite. Now you need to restart apache2 by"/etc/init.d/apache2 restart"
shot! my mount is read only again. I should mount just a directory?  sudo mount --bind olddir  newdir
折腾了好久才明白了perl的basic:
By default, apache2 is setting its cgi directory at /usr/lib/cgi-bin, so, the cgi is nothing but with directly:  http://127.0.1.1/cgi-bin/fileList.cgi
And how to call shell within perl? It is so easy that I don't realize: system  "./script.sh  /media/MYTFCARD/MyWeb/diabloforum"; Don't forget it is like shell which is up to an interpreter to interpret it. So, it is within "string". Also, there is some problem with apache2 because I must generate correct html syntax which is like this.
Anyway, don't write auto in /etc/fstab for usb disk because it maybe "readonly". And make sure the directory is set to be 777 before mounting.


五月三十日 纽约 阴天

昨天处理中出错,响了一晚上。
So, this is how it should be done and I am such an idiot that I cannot even read and follow whatever is clearly written in plain English!
There are several different credentials:
1. Your login email and your password, this is for amazon web service management login.
2. Your ec2 "soap" requests need "private key" and "x509 certificate". You have to download this from Amazon ec2 security credential webpage. These two things are what ec2-api-tools needed. That is how you setup your ".bashrc" export so that you can use these command line tools.
3. When you run instance, you need to connect with your instance with ssh connection which requires RSA private/public key pairs. You need to generate these keypairs with your ec2 tools by using ec2-add-keypairs. Better give a meaningful name without .pem because you see you only got a returned private key and you save it somewhere. However, amazon actually keeps the public key which is not shown to you. So, the file name has ".pem", but actually when you pass a param to your ect-run-instances ami-xxx -i myRSAPrivateKeyFileName. The name of "keypair" actually confuses me for quite some time because there are indeed two keys, private and public, but I cannot only see the private. Also amazon seems deliberately create confusion by following.
4. This is what I said amazon deliberately create confusion. Your actual userid/password in your web service is also called private key and secret private key. These are two long strings which replace user name and password. Where do you use it? When I setup my "elasticfox", I do need that. Also probably when I register "bundle". No, they are called your "AWS access key" and "AWS secret key".
5. Now do you see how confusing it is? When you are creating an instance, you must give the "ssh RSA keypair",otherwise you cannot connect with it. However, those api do have some other parameter allow you to use alternative "SOAP private key and SOAP x509 certificate". Therefore these two things bundle together and I got confused naturally.
6.Another confusion arises from the "bucket name‘. When you work with s3cmd tool, the bucket name is something like "s3://mybucketname/subname". However, when I try to upload the bundle using ec2 api tools, it is a different story! ec2-upload-bundle -b //mybucketname.s3.amazonaws.com -m manifestfile -a accesskey -s secretkey This is really a mess! How can I figure out this without using google?
7. How do you upload your bundle?
a. You need to do this in your instance as "root". That is why you need to ssh -i myRSAPrivatekey.pem root@publicdns
b. After login, you need to also your x509 private key file and certificate. (note above ssh is another one!) How you do it? scp -i myRSAPrivateKey.pem myx509Privatekey.pem myx509certificate.pem root@publicdns:/mnt   (look, you can place them anywhere you like, but surely you don't want your key to be bundled with ami, right? so, /mnt will not be.)
c. ec2-bundle-vol  -k <private_keyfile> -c <certificate_file> -u <user_id> (This is also done in your instance, therefore you see, your instance should install the ec2 tools. Gash, the ami I am using have a very old version of ec2 api tools. These two files are what you scp before. The default directory for image is /tmp. And user-id is the 12-digit id given by amazon. (Another confusing point as there are other kinds of user-id called canonical id, which I don't even know how to use.) This will take quite some time, imagine it compress the whole system into image files and deivide into parts.
d.  ec2-upload-bundle -b <bucket> -m image.manifest.xml -a <access_key> -s <secret_key>  Now we reach the confusing part again. What is bucket name again? As I explained in above, when I use s3cmd tool, the bucket name starts with s3://, and here it won't work!!! You cannot add ":" and ... And here again, it is your "access key", "secret key" for AWS. Another key pair? Why do they call it key?
e. You have to register your ami by ec2-register <bucket-name>/image.manifest.xml (And you can do this anywhere, say in your local pc as I found out ec2 tools in my instances are very old. I have to do it locally.)
OK, these are all what I have done for a whole morning. I think I finally understand which is which about all keys, keypairs. (Do I?)
I also noticed the "filezilla" has some problem of continuing connecting to host even when you cancel the uploading queue. Which means, you should manually stop connection. I got warning such that more than 8 connection is connecting to ftp host.


when you are using scp, becareful to check: since ubuntu10 ami only gives you login as user "ubuntu", then you do: scp -i myRSAPrivatekey.pem ubuntu@publicdns:/home/ubuntu Don't use /mnt because you are not root now! and you will get write permission error ! I thought about this before, but ...

it is really a handy design, when I run java -version and I got some hint like openjdk-6-jre-headless contains java along with some other packages. So, just sudo apt-get install openjdk-6-jre-headless
so, you scp both ec2 api and ami tools to your instance. Add these lines in your .bashrc at end.

export EC2_PRIVATE_KEY=$HOME/Desktop/Amazon/key/myKey.pem
export EC2_CERT=$HOME/Desktop/Amazon/key/myCert.pem
export EC2_AMITOOL_HOME=/usr/local/ec2-ami-tools-1.3-49953
export EC2_HOME=/usr/local/ec2-api-tools-1.3-51254
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk/
export PATH=$PATH:$EC2_AMITOOL_HOME/bin
export PATH=$PATH:$EC2_HOME/bin


So, you have to sudo apt-get install unzip in your "clean" instance. And better to unzip them to "/usr/local" for better management. Also you need ruby to be installed for your handy ec2 tools. Even you install ruby by apt-get, it is not enough, because you need libruby1.8-extras!!!
你能想象我非了常不多5个小时去解决一个非常无聊的问题吗?我在instance上面,ok, I am fed up with this SCIM, it is simply too SLOW!. Let me write it down in English!
First I use this ubuntu10 ami which is a server version running very fast and you are also have option to install something seemingly very cool which I don't know what is it. (cluster!!!!) then, I want to make an ami, and this "ec2-ami-tool" creates trouble, whenever I run sudo ec2-bundle-vol ... I run into error of command not found etc. But in my .bashrc it already setup the "EC2_HOME" AND "EC2_AMITOOL_HOME". What I don't understand is that the "ec2-ami-tools" needs some sort of installation, which I don't make because I just unzip it without properly installation. I follow the install-readme.txt by settingup the "EC2_AMITOOL_HOME' etc. but there is another thing, the "pem" for this "ami tool" needs to be put in ‘etc/ec2/amitool/..." something...
I am now starving...!
Later I have to hack the file "ec2-bundle-vol‘ which is just one sily line:
home=${EC2_AMITOOL_HOME:-${EC2_HOME:?Neither of EC2_AMITOOL_HOME or EC2_HOME environment variables are set}}
ruby -I $home/lib ${home}/lib/ec2/amitools/uploadbundle.rb $*

The problem is my sudo seems clear up my path and all env. So, it is empty. I try and search a lot, then later just give up by hardcode the path like.
mypath=/usr/local/ec2-ami-tools-1.3-49953   
ruby -I $mypath/lib $mypath/lib/ec2/amitools/uploadbundle.rb $*
and what's more, you need to place the "cert_ec2.pem" to place to a place like "etc/ec2/amitools/". Why? check the ec2-ami-tool directory under "etc" and you will understand, because I haven't setup "EC2_AMITOOL_HOME", it mistakenly searching this place for the certificate. Should I change the certificate? To me, it seems a security problem.
Also, I suspect the ec2-api-tools doesn't allow multiple connection. maybe not, I am not sure. I am dog tired and hungry!

To disable selinux:  echo 0 >/selinux/enforce

How to create an ami backed by EBS? I cannot expect it is so easy! I do everything I could to install various tools like ec2,s3cmd, ec2ami and ruby, jvm6, etc. Then I ssh to my instance run ec2-create-image. What? It kicks me out! and it fails. Then from the parameter instance id, I guess this can be done from local. Indeed, compared with S3, ebs is much, much simple. No wonder nobody cares about ec2-ami-tools. Why not?
I changed my access key, secret key, then the previous ami are unaccessable!
What should I do after I create my image as it shows its status as pending? Stop? I think so...Wrong! You have to terminate your instance for saving the ami in EBS.


五月三十一日 纽约 阳光灿烂

昨天和今天早上实验了一个上午,就是一个白痴的问题,能否创建两个ebs的 image?好像总是不成功,期间夹杂这无数的bash的低级问题,比如 echo -n .可以给循环里面连续输出,echo -n "new line\n"可以换行,可是echo -n *就是一个灾难我花了好久才找到原因是这个*有问题。
Also, using sudo passwd root, you can get back your passwd of root, later you can sudo visudo to uncomment the #%sudo ALL=NOPASSWD: ALL . Now I understand in Ubuntu ec2, how they manage to allow you omit password when doing sudo.
Here is a little script I googled and modified to suit my test. However, I tried very hard but cannot make ssh working from this shell.
现在我发现创建image失败的原因是我不够耐心。 it will take quite some minutes for creating ami. Here is my script which patiently waiting for creating ami.
To create volume, you need zone: us-east-1a[, b, c,d]
I am totally beaten. I run ffmpeg locally very well, but the instance report error of io. What can that be?
The simplest shell concept is var=$(printf "%04d.jpg", $counter); So, I don't need awk for such trivial job.
A handy shell to lauch ec2.
I think I should not feel desperate because it is not the reason that I cannot be root user. Ubuntu works fine without allowing you to be root. In my local machine, it works. and this is proof.
In visudo, I allow root to have no password, but ssh login reject me by advise me to use ubuntu to login. Something must be done with this ESB version.
I want to convert all jpg file as %03d.jpg format.
#!/bin/bash
counter=1;
declare -a filename
path=./mypic

ls  $path | grep .jpg |  while read file; do
        dst=$(printf "./target/%03d.jpg", $counter);
        src=$path/$file;
        sudo mv  $src $dst
        counter=$((counter+1));
done


Before I was blind, now I can see. The volume and snapshot is the key!


六月一日 纽约 阳光灿烂

昨天做了一件傻事,我upload一个大文件到我的instance,本来准备放在attached volume上,结果忘记了,非了好几个小时的上传时间,最后terminate instance。
你可以直接修改ami以便attach任意的volume.

      Use the ec2-register command with the block device mapping information. The following example registers an AMI with three volumes (one for the root device, and two extra):
           The first is an 80 GiB root device volume at /dev/sda1 created from the snap-12345678 snapshot. The root volume's DeleteOnTermination flag is set to false. Remember that if you specify a size, it must be equal to or larger than the snapshot's size. You can omit a size value and the volume uses the snapshot's size.
           The second volume is mapped to /dev/sdh and created from snapshot snap-88888888. The mapping uses the default size of the snapshot and doesn't specify a value for DeleteOnTermination. The default value is true.
           The third volume is an empty 40 GiB volume mapped to /dev/sdj. The volume's DeleteOnTermination flag is set to false.
      PROMPT>  ec2-register -n My_Image_Name -d My_image_description --root-device-name /dev/sda1 -b /dev/sda1=snap-12345678:80:false -b /dev/sdh=snap-88888888 -b /dev/sdj=:40:false
      In response, you get the ID for your new AMI.
      IMAGE     ami-61a54008

This is actually how I setup my instance for ec2 api tools, you need first: sudo wget http://s3.amazonaws.com/ec2-downloads/ec2-api-tools.zip

export EC2_PRIVATE_KEY=$HOME/.ec2/myKey.pem
export EC2_CERT=$HOME/.ec2/myCert.pem
export EC2_URL=https://ec2.us-east-1.amazonaws.com
export EC2_HOME=/usr/local/ec2-api-tools-1.3-30349
export PATH=$PATH:$EC2_HOME/bin
export JAVA_HOME=/usr/lib/jvm/java-6-openjdk/

我试图修改ami,以便启动指定的snapshot,但是不成功因为他要我的manifest,我想我还是 不要修改root- device了,只要增加新的ebs的volume就好了,实际上我刚发现我昨天的image没有丢失我uploaded big files,that is reasonable, because it is an image of my root-device plus my attached volume which is 1g。

This is another handy script to wait for the image to be available.
When you are going to create any image of running instance, obviously you will be kicked out by ssh connection.! Keep that in mind. It is possible that you are running something important or in background, is it true?
Also when you run instance, you can access the instance specific data passed by "ec2-run-instances" as parameter of user-data. But you need to know your ami-launch-index, here is the http host: http://169.254.169.254/2007-01-19/
GET http://169.254.169.254/2007-01-19/meta-data/public-keys/0/openssh-key : this gives you a way to retrieve the invisible "ssh public key", whereas you usually keep the private key when creating instance.

1. GET http://169.254.169.254/2007-01-19/meta-data/ami-launch-index
2. GET http://169.254.169.254/2007-01-19/user-data
3. Now you need to split those "|" delimetered user data, or whatever delimeter you prefer to.
Actually you can simply use ec2-register to modify your ami so that it attaches different volume created from various snapshots just like command above. However, this api requires "manifest" which is an xml doc describing various properties. I tried to download one from my old S3 ami, however, it seems too risky to modify this to suit my simple purpose. So, eventually I just ec2-detach old volume, attach a bigger volume which is also created from the snapshot of that old volume. Then run instance, attach new volume, by doing so, I keep my old data but with a larger volume. Of course it implies you can distribute your data volume among various instances.
The startup script must be placed in /etc/init.d and must begin with #!/bin/sh.  It needs to be updated with update update-rc.d FOO defaults don't forget to chmod +x FOO.

Do you want to run ssh without prompted by the "yes/no" for the host that you connect for the first time? Go to /etc/ssh/ssh_config and add "StrictHostKeyChecking  no“, perhaps, you also need add -q at your ssh command line.

update-rc.d FOO defaults here the FOO should not contain any path, i.e. `basename FOO`

the index of cut starts from 1. So, you need counter=$((counter+1)), Why do they require double parenthesis?

When you create too many instances, there are too many volumes as I setup the volume as "deleteonterminate=false". Then I have running instance problem.

The snapshot of volume is stored in S3 which is why there are no "zone' for snapshot. And it is the "incremental difference" of volume. So, when volume fails, you can get backup from your snapshot, no matter where it is, because s3 is universal. Good!
I suspect the reason why create image is so slow is because there are many people are queueing for this lengthy operation.
I am doing a simple experiment to run a startup script.  And here is how I start my 4 instance by passing user data delimitered by "|".

ec2-run-instances  ami-af5fb6c6  -k myAmiTestKey -z us-east-1d -d "before | I was blind|, now| I can see" -n 4
so, when you create instance, you can attach the volume, this is the way of how Amazon solves data distribution other than NFS which uses by HP cluster. Good!


六月二日 纽约 阳光灿烂

As for mapreduce, I don't see anything special. It is more like a commercial product than a new technique one. As for simpleDB, there is a common issue of distributed system when you need "consistency read" which means multiple agent may have different latency of same write request, therefore following read request may create inconsistency of all result of agents. This is quite a commonsense in distributed system. So, I can see Amazon offers a second choice to allow read incomplete or non-global, or vote or whatever it calls which implies no mandatary global consistency. What is the term in distributed system for this? I forget.

gnome-terminal opens a new terminal window.

You don't have to add S3cmd path into your .bashrc because you simply place s3cmd under the path /usr/bin and its S3 directory. And here is its config file: '/home/ubuntu/.s3cfg'

六月三日 纽约 阳光灿烂


This is how to find out the  frame number of duration of video with  ffmpeg.
#!/bin/bash


if  [ $# -eq 1 ]; then

time=$(ffmpeg -i input.rmvb -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n'| egrep ^"  Duration:" | cut -d"," --fields=1| cut -d" " -f4)
frame=$(ffmpeg -i input.rmvb -vcodec copy -f rawvideo -y /dev/null 2>&1 | tr ^M '\n' | awk '/^frame=/ {print $2}'|tail -n 1)

        hour=$(echo $time | cut -d: -f1)
        minute=$(echo $time|cut -d: -f2)
        second=$(echo $time|cut -d: -f3)

        echo "hour=$hour, minute=$minute, second=$second, frame=$frame";
fi
total duration: ffmpeg -i input.avi 2>&1 | sed -n "s/.* Duration: \([^,]*\), start: .*/\1/p"
fps:   ffmpeg -i input.avi 2>&1 | sed -n "s/.*, \(.*\) tb.*/\1/p"

ffmpeg -i input.avi -vcodec copy -acodec copy -ss 00:10:00 -t 00:0030 output.flv
Unfortunately the above line produces some clip with audio/video not synchronized! How? Why?


六月四日 纽约 阳光灿烂

During Korea War, when North Korea nearly push United Nation Army into sea. Macarthur proposed to land in Inchion behind front line of North Korea. This is a 1 vs. 5000 gamble. President Truman and chairman of Joint Chief Staff were all strongly against this plan. Special missionary from president Truman was sent to Tokyo to try to persuade the World War II Warlord to abandon this big risky military adventure. Macarthur didn't speak anything until the end of meeting after he refilled his iconic pipe with tobacco. He stood up and said firmly, "Gentlemen, I will land on Inchion in September, or you will have a new commander in Far East." And then the tide of war was turned by his determined decision.
i create a volume from a snapshot of 10G. In console management window, it clearly shows it has capacity of 40G as I desired. However, when I attach this volume with my instance in EC2, it only shows 10G as others after mounted. After repeated test like this, I begin to suspect the "df" in instance might only show some default or previous mounted device's info. So, to test my theory, I do this:
sudo dd of=/mnt/data2/mytest1.txt count=20G  What can be the result? maybe I still need the parameter of if=/dev/zero. However, I don't have luck for a file bigger than 495M.
I found the suitable testing way: sudo dd if=/dev/sda1 of=/dev/sdg where sda1 is my root device, and sdg is the EBS to be tested.

This is my question:
hi all,

I create a snapshot from a 10G EBS volume in order to create a bigger EBS volume, say 40G so as to extend storage capacity which is typically suggested by Amazon docs. However, when I mount the device, I found it is always 10G size of the newly attached volume. Here is my command.
-----------------info about snapshot which shows it has originally 10G size.
nick@nick-ubuntu:~/Desktop/Amazon/ami-test$ ec2-describe-snapshots snap-b2502fda
SNAPSHOT    snap-b2502fda    vol-69139b00    completed    2010-06-04T05:14:54+0000    100%    441118265725    10    Created by CreateImage(i-80a0a5eb) for ami-32a44c5b from vol-69139b00

----------------create instance and ask to attach a new volume of size 40G
nick@nick-ubuntu:~/Desktop/Amazon/ami-test$ ec2-run-instances ami-6743ae0e -b '/dev/sdk=snap-b2502fda:40:true' -k myAmiTestKey  -z us-east-1d
RESERVATION    r-f4ed3a9f    441118265725    default
INSTANCE    i-5477703f    ami-6743ae0e            pending    myAmiTestKey    0        m1.small    2010-06-04T15:17:14+0000    us-east-1d    aki-5f15f636    ari-d5709dbc        monitoring-disabled        ebs   

---------------now I ssh to connect to instance to mount and check its capacity by using dd to create a big file:

ubuntu@domU-12-31-39-0F-1D-C3:~$ ls /mnt
lost+found
ubuntu@domU-12-31-39-0F-1D-C3:~$ sudo mkdir /mnt/data1
ubuntu@domU-12-31-39-0F-1D-C3:~$ sudo chmod 777 /mnt/data1/
ubuntu@domU-12-31-39-0F-1D-C3:~$ sudo df /dev/sdk
Filesystem           1K-blocks      Used Available Use% Mounted on
udev                    877744        84    877660   1% /dev
ubuntu@domU-12-31-39-0F-1D-C3:~$ sudo mount /dev/sdk /mnt/data1
ubuntu@domU-12-31-39-0F-1D-C3:~$ sudo df /mnt/data1
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sdk               1032088    547896    431764  56% /mnt/data1

----------------Here I create a big file to verify its capacity.
ubuntu@domU-12-31-39-0F-1D-C3:~$ sudo dd if=/dev/zero of=/mnt/data1/mytest.txt bs=1G count=30
dd: writing `/mnt/data1/mytest.txt': No space left on device
1+0 records in
0+0 records out
495321088 bytes (495 MB) copied, 13.2025 s, 37.5 MB/s
ubuntu@domU-12-31-39-0F-1D-C3:~$

--------------------finally confirm its capacity by df
ubuntu@domU-12-31-39-0F-1D-e2fsck -f /dev/sdx2C3:~$ sudo df /mnt/data1
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sdk               1032088   1032088         0 100% /mnt/data1

So, the server error 500 in instance is solved. I realize it is an ip issue unless I tried wget instead of GET. So, the outside server cannot see you behind firewall and internal dns server etc. 1. allocate elastic IP by ec2-allocate-address==>ip, 2. associate ip with instance: ec2-associate-address ip -i instanceid.
3. now you probably want to restart your ssh connection because soon it will be invalid. ssh -i your.pem user@ip. Now you can wget downloadfileUrl.

(The above conclusion may not be true because elastic IP only allow instance to be visible outside, which doesn't prevent instance to access www.)

There is no number limit for ssh connection, I think.
OK, I think I found the problem! The reason of EBS volume is that I didn't format file system before mounting. i.e.  yes | sudo mkfs -t ext3 /dev/sdm And then we can mount the device.
But after I create a spot instance, I try to associate it with the elastic address, it doesn't work! I cannot ping it, not even itself. OK, mistake, it is the resource itself refusing to be downloadable! Spot instance or normal should be the same!

Now I understand that! Using mk2fs will give you the volume, but it is already formated. You lost your data. So, if the volume is not empty, just do following:
e2fsck -f /dev/sdx2 and resize2fs -p /dev/sdx2

Pay attention to the --instance-type m1.large.

finally  I find the script I am looking for. To print out all file:  cat $(find . -name "*.sh") | grep "instanceid="


六月七日 纽约 阳光灿烂

Now I am going to use spot instance which is much cheaper. Here is the handy script to start.  Pay attantion to the instanceid which is at 12th field when spot-instance-request change from open to active.

So, CGI actually uses evironment variable to pass data from web server to cgi script. QUERY_STRING etc.

When using Debian instance, the ssh "stricthostauthetication no" will be rejected first time. Secondly it is OK.

sudo apt-get install mysql-server

sudo apt-get install mysql-client-5.0 

sudo apt-get install apache2

handy command to send files to my instance, note: I save instanceid in id.txt, host in host.txt, ami in ami.txt. so that my go.sh and done.sh will read the current instanceid or previous ami. 

connect to ssh handy command.

I think it is a kind of stupid to write php which I dislike at all. 

if you have your module installed somewhere outside the "inc@" path, you have to do like java to add a line at top.

use lib "/mypath";


六月八日 纽约 阳光灿烂

1. database: you will find very simple create table script. MySQL is a bit weak as doesn't support foreign key. (However, it is also sometimes tricky to use foreign key when delete/update. So, it's a tradeoff.)
2. cgi: a simple cgi script for Linux/Apache/MySql/Php(LAMP) which accept insert record of customer table and display all of them.
3. www: the simple web page for submitting data. Here is the backup

There is quite some trick while doing floating point calculation with bash. here is a small script to calculating average price of spot instance in ec2.

sudo tasksel install lamp-server

Debian has a kind of problem of javax security or something problem and I decide to give up. It is better to use Ubuntu10.

Also, in Debian, I have a problem to install lwp-request package which contains handy GET/POST methods. I try to install perl -MCPAN -e shell. And after nearly hour of trying, I give it up by using "wget" which will write to a file.

I don't know why, but blender cannot work with -s #n -e #m which are start and end frames.


六月九日 纽约 阳光灿烂

$array = (ec2-describe-images -o self) this is how it is called. In order to run a script file, you "dot space it": . pathoffile

To work around with command line argument of powershell, you can use batch file like this. start.bat is: powershell -command "myps.ps1 arg"

D:\ec2>powershell -command "./go.ps1 hello world"
My handy tools.


六月十日 纽约 阳光灿烂

windows 太傻了,我要被气死了。powershell虽然看似强大,但是那个什么windows2008的安全限制让人抓狂,微软的东西现在就是一个字,懒,烂, 滥,你要是堵安全漏洞真的像是堵决堤的洪水,这个也限制,那个也限制,最后windows2008的设计就是你不要上网最安全。拔掉网线最安全了。

今天的工作


六月十一日 纽约 阳光灿烂

The following allow you to run diskpart as administrator.
start-process diskpart -verb runAs
So, the basic procedure of disk operation is like this: 
1. initialize disk: pay attention to "clear readonly". Also, you may just create partition primary instead of convert MBR because you only 
convert MBR when the disk is a GPT or GUID partitioned table? But it is equivalently to initialize disk.
DISKPART> SELECT DISK n
DISKPART> ATTRIBUTES DISK CLEAR READONLY
DISKPART> ONLINE DISK
DISKPART> CONVERT MBR
2. However, don't be misled to attempted to create volume because it is for dynamic volume. Of course you need to format the disk before 
using. And to use it you still to assign a drive letter for it.
select disk=1
format fs=ntfs label="data" quick
assign letter=d

六月十二日 纽约 阳光灿烂

Probably it is such an low-level mistake. First, in winxp, if you install service-pack 3, there will be a limit for running diskpart.
That having been said, however, my problem is that my script is not saved as ansi mode, so diskpart doesn't recognize. This sucks.
You maybe want to edit "gpedit.msc". In win2008, there is one security option such that enable all user run executable at standard user level
and I guess this is the thing prompting for "runas". So, let's try to disable it.
In windows 2008 how do you switch off annoying "runAs" prompt? Do following:
run gpedit.msc\computer configuration\security setting\security options\Run all users, including administrators, as standard users.
modify this option to make "disabled".
Reboot system. Now we don't have any runas prompt any more.
s3cmd tool download.
ec2-api-tools download.
ec2-ami-tools download.
This is today's work.

六月十三日 纽约 阳光灿烂

今天跑步好累,yuki跑得太快了我追不上。powershell的一个简单的调用就是所谓的dot-space,. myscript.ps1。然后就可以使用其中的函数了。函数的参数可以使用所谓的
switch。今天的改进

六月十四日 纽约 阳光灿烂

基本常识:& xxx.ps1这个是在命令行工具执行ps,但是在ps1里面要调用ps,你应该使用start-process powershell -argumentlist "-command psfile.ps1 psarg1 psarg2"
-redirectstandardoutput "psexelog.txt"
In order to change ps default starting location: c:\windows\system32\windowspowershell\v1.0\profile.ps1    i.e. set-location e:\script
add "-noexit" to hold window. This is an parameter for powershell.exe
$a="{0:N2}" -f $a; This will format $a to be precision of 2digits.

六月十七日 纽约 阳光灿烂

去法拉盛理发买凉鞋。condor的安装有些问题,一定要设定allow_read/write的host。总之,我之前的设定有问题,不能运行。
什么是shakedown?我听了两遍google才明白美国华盛顿国会山上的唇枪舌剑,共和党德州议员指责白宫“敲诈”(shakedown)BP200亿美金,民主党议员包括副总统拜登都冒
出来强烈反对。不管谁对谁错,我只觉得这些议员都是美国社会的精英,因为美国的民主制度能够让美国最重大的国策能够在精英中碰撞磨砺琢磨,我再次为太平洋对面的中国
感到悲哀,因为制度决定了一切,纵然有短暂的表面的繁荣,从长远来看注定要陷入馄饨。在法拉盛没有吃到馄饨。
法拉盛的小笼包真好吃。

六月十八日 纽约 阳光灿烂

听到有人这么说:“什么是爱国主义?就是保卫这个国家不受政府的迫害。”
二十世纪的三大邪恶轴心的两个是纳粹德国和前苏联,因为两个是一样的,都是社会主义国家,都是极端的独裁,都是个人崇拜,都是动不动就能够让百万人头落地。还有一个就不说了。
The following is excerpt from here
global configuration file for all nodes public and private:

CONDOR_HOST = <public fully-qualified host name of CM>
CM_IP_ADDR = <public IP addr of CONDOR_HOST>
COLLECTOR_IP_ADDR = <public IP addr of CONDOR_HOST>
HOSTALLOW_READ = *.public.net, 192.168.1.*
HOSTALLOW_WRITE = *.public.net, 192.168.1.*

local configuration file for central manager:

NETWORK_INTERFACE = <public IP addr of CONDOR_HOST>

local configuration file for submit machine:

NETWORK_INTERFACE = <public IP addr of submit machine>

local configuration file for checkpoint server (we have one running):

NETWORK_INTERFACE = <public IP addr of checkpoint server>

The private nodes must be able to reach the servers using the servers'
public IP addresses since the Condor services listen on those interfaces
only. On our network each private node runs Red Hat 9 and has a file
/etc/sysconfig/network-scripts/route-eth0 to set up static routing;
this file contains:

<public IP addr of CM> via <private IP addr of CM>
<public IP addr of ckpt server> via <private IP addr of ckpt server>
<public IP addr of whatever> via <private IP addr of whatever>

In case you have submit nodes or checkpoint servers running on machines
without internal network interfaces or you flock jobs to another network
that the private nodes cannot reach directly (this is your situation,
Oliver), you may need to set up IP masquerading on the gateway machine
for the private nodes. To tell the privates nodes where the default
gateway is, specify in /etc/dhcpd.conf on the DHCP server the line

option routers <private IP addr of gateway>;

or give this information explicitly to the node if static addressing
rather than DHCP server is used. Then on the gateway machine you need
to turn on IP masquerading by executing the command

echo "1" > /proc/sys/net/ipv4/ip_forward

This command needs to be executed everytime the gateway machine is
rebooted. You can probably put this command in /etc/rc.d/rc.local to
have it run automatically. To test that IP masquerading is working
correctly, log on to a private node and look at the output of the
"route" and "traceroute" commands, or you can simply try pinging some
far away but pingable machine from the private node and verify that it
responds.

Oliver: In your case you will have two separate global configuration
files for the two pools; both should have the lines

HOSTALLOW_READ = *.public.net, 192.168.1.*, 192.168.2.*
HOSTALLOW_WRITE = *.public.net, 192.168.1.*, 192.168.2.*

It might also be a good idea to set up actual checkpoint servers in each
pool at work and at home and set STARTER_CHOOSES_CKPT_SERVER to true.
This way if a job submitted at home flocks to the pool at your office
then it will checkpoint to the checkpoint server at the office rather
than to the submit machine at home. But if you have only 10 machines in
a pool, maybe there isn't enough traffic to make you worry about this.

If there are firewalls in the way between the networks, configuring the
Condor pools is trickier but still possible.

六月十九日 纽约 阳光灿烂

要破产了。powershell has namespace and you need correct one. And the strong type declaration helps to invoke the method.
You have to declare it as following:
 [System.Collections.ArrayList] $my=new-object  System.Collections.ArrayList;

Then you can call "$my.RemoveAt(2)"
$cn = new-object system.data.SqlClient.SqlConnection("Data Source=NICKMINI\sqlexpress;Integrated Security=TRUE;Initial Catalog=NickTest");
$ds = new-object "System.Data.DataSet" "dsChildSites"
$q = "SELECT *"
$q = $q + " FROM [NickTest].[dbo].[employee]"
$da = new-object "System.Data.SqlClient.SqlDataAdapter" ($q, $cn)
$da.Fill($ds)
99.9999%的中国人都没有看过的绝对的禁片《red corner》,这个是匪夷所思的电影,李察基尔的表演是绝佳的,在1997年代绝大多数的中国人,包括我自己都会,以至于
直到今天都会选择不相信,因为我们生活在《1984》的国家里,老大哥对我们的教育是。。。现在,我觉得speechless,因为语言在这部电影里面是多余的。从内心深处来说,
我也希望绝大多数的中国人不要看这部电影,因为这是一部恐怖片,令人不寒而栗的恐怖片。绝对不要去看!绝对!这个评论是代表了美国主流的意见,我十分的同意。

六月二十日 纽约 阳光灿烂

powershell special characters: 
<`>[n r t a b 0] ===> newline return tab alert backspace null
powershell needs to install this:
add-pssnapin sqlserverprovidersnapin100
add-pssnapin sqlservercmdletsnapin100
OK, this is what I learned:
1. System.Data.SqlClient.SqlConnection: 两个途径创建这个对象,使用new-object先创建对象,在设定connectionstring的属性,或者直接在constructor里面使用
connectionstring作为参数创建。无论如何你要调用open方法。
$con.connectionString="Data Source=NICKMINI\sqlexpress;Integrated Security=TRUE;Initial Catalog=NickTest"
2. to create System.Data.SqlClient.SqlCommand, you need call "CreateCommand" method from sqlconnection.
直接创建对象然后设定他的connection属性为之前创建的sqlconnection对象。以及他的commandtext属性为sql-query
And the following is what is best described then my sloppy English:
If you have experience in Visual Studio this style of coding is very natural and easy – and not too unlike VB or C#. You use the New-Object 
cmdlet to instantiate objects. Then you use those object’s same methods and properties that you would in VB or C#. This example creates a 
SqlCommand object and then a SqlCommand object. Next, it sets the SqlConnection object’s ConnectionString property with the required 
connection string. Then it uses the SqlConnection object’s Open method to open a connection to the target database. Next, the SqlCommand 
object’s CommandText property is assigned a SQL SELECT statement. Then a while loop is used to read the result set produced by the SQL query.
3. SqlDataReader的创建来源于sqlcommand的ExecuteReader,但是你一定要记得一点,否则就会像我一样被折磨很长时间,你要先读一下才能有数据,我真是一个白痴没有
理解这一点,很可能是我断章取义的实验powershell的script的结果。
取消stdout输出使用|out-null
这是今天的学习,现在要去shopping我已经弹尽粮绝了。这是我发现的最好的教材
Somewhere in China, people are talking about "Better city. Better life." And it becomes "Bitter city. Bitter life."
ubuntu9.04安装condor比较罗嗦,首先检查先觉软件,比如flex,还有libx11-dev因为需要x11的头文件。其次,condor编译使用的gcc,libc的版本很低,因此需要使用
sudo ./configure --disable-gcc-version-check --disable-glibc-version-check
事实上以上重新编译并不成功,后来我使用debian lenny的.deb安装包很容易的。

六月二十三日 纽约 阳光灿烂实际上后来下雨了

这是昨天做的实验。然后去面试,直接做了二十道题目,其实还是有些难度的因为有不少问题我都是从来没有在实际中遇到的。下午又去面试,问的几个简单问题也不容易,比如
你怎样防止一个class生成copy constructor,当然是你自己做一个声明称private,别人就不会再做了。string的c_str指针怎样让他不变化,变化的原因当然是他内部有buffer
自己分配的内存。不变化需要声明那个string为const。这些问题看来都是程序员的心得,我答不上来。关于alternate key,我现在google才明白实际就是我们的unique字段。
This is just a memo as it is actually a failed testing. Just in case we might try this later for linux.
problem: in windows instance, the attached volume is by default "false" for "deletion on termination" which means the created volume would stay after
instance is terminated so that we may end up with hundreds volumes which is very expensive. 
goal: want to change ami so that device volume is "true" for delete on termination of instance.
test: I try to call "ec2-register" with parameter -s snapshotidofrootdevice -b "xvdg=snapshotid:sizeinG:true" -b "xvdf=snapshotid:sizeinG:true"

Please note, I use the "snapshotidofrootdevice" which is root device snapshotid. Even though the ami is created successfully it can NOT boot!
Also the platform of ami is wrong, is Linux instead of windows.

Possible reason: Amazon documents says windows ami made by using snapshot directly from root device might NOT boot. But linux should have no such problem.

Conclusion: we might be able to test this in future for Linux.

七月一日 纽约 阳光灿烂

中午饥肠辘辘去高盛做毒品检查,听上去怎么这么别扭,就是drug-testing这个所有金融公司都要的,就是验尿而已。昨天搬进了这个Manhattan最北边的地方,没办法租金太贵了。
吃了一片pizza就花了六块多,这个鬼地方简直就是抢钱一样。回来的路上看到bedbath这个专卖床上浴室用品的店想买一床被子,因为昨天晚上只盖了一条床单冷的睡不着,
看来看去犹豫不决,因为要79或者99,想想看还是舍不得,日子还很长,还是省一点吧。走了好几站发现一个sleepy,就看一看,很奇怪的是床上睡了一个挺漂亮的中国女孩儿,
慵懒舒适的仿佛在妓院里春睡一样,我不知道我为什么有这种感觉,总之,空荡荡的床垫群众就她一个,显然不是店员,因为店员是个男的,非常殷勤小心地伺候我。我随便问了问
价格觉得和bedbath差不太多,不过显然这个被子或者说comforter不是他们的主要产品,而且一望而知是开封的样品,我指出后他很小心的说可以降价给我,大概是半价的样子吧。
我求之不得,反正现在缺钱,管不了了。回来的路上顺便在old navy又买了两件衬衣一条裤子,算是给前线的美军捐款了。这个打杂的工作也不知道什么时候能够定下来,什么
时候才能发银子呢?
总算明白了condor要这么设置:可以放在condor_config.local
HOSTALLOW_CONFIG = *
ENABLE_RUNTIME_CONFIG = True
SETTABLE_ATTRS_CONFIG = *
PERSISTENT_CONFIG_DIR = c:\condor
ENABLE_PERSISTENT_CONFIG = True
这样子你就可以condor_config_val,药查询你要加上 -master才行,我原来一直没有注意到这一点,(没人告诉我我就想不到的,看文档也不一定能明白。.config.MASTER.taskid)
前两天租房子,结果招来了一大群骗子,都是自称人在西非尼日利亚或者英国伦敦,房子钥匙在身边要你把押金会给他。因此,那两天我的邮箱里除了印度的猎头的email就是
尼日利亚的骗子的最多了。他们都是一个腔调的蹩脚英语,大概是模板拷贝的,I would like you to know ...

七月三日 纽约 阳光灿烂

花了一两个小时就卡在一个powershell的一个愚蠢的问题,同样的代码我在ps的function里面调用就不行!!简直就是无厘头!
$shell=new-object -com Shell.Application; $ZipFolder = $shell.NameSpace("$zipFile");
在function a里面可以,在a里面我有调用function b在b里面这个函数不起作用!除非我因为昨晚少睡了三个小时的关系出现幻觉,否则我实在搞不懂,最后把b拷贝到a的调用
处才行,也许脚本的function有问题?我不能相信微软有这个可能,zip文件作为folder创建的namespace使用copyhere方法的额外参数不工作。这个我可以理解,毕竟两者差别
太大了,难为那位程序员了。
花了一天时间才完成了这么一个简单的代码,很气愤,其中有几个问题,当你使用shell.application来做拷贝的时候,如果文件夹实际是zip文件的话,copyhere的确是不能够
使用参数来阻止ui界面和yestoall来强制覆盖目的地文件的,唯一我能做的就是先删除。但你做文件夹压缩为zip的时候,我花了很长时间才明白,那个空文件必须有zip文件的magic
word才行,set-content $zipFile ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18));这一行代码我被折磨了好久才意识到他的作用。
住在纽约manhattan的贫民窟里,每天饥肠辘辘。

七月四日 纽约 阳光灿烂

折腾了一个早上才发现可能是powershell调用zip方法的缺陷,就是说压缩结束也许zip文件并没有立刻ready使用,因为我随后调用awssdk使用powershell上传到s3出现压缩
文件读写错误。只好睡眠两三秒后在执行。后来才意识到putobject很简单那个大侠给你了例子,但是下载getobject似乎不是对称的简单,大侠没有给例子,我就不知道怎么做了。
最后只好在回到s3cmd,所以最后的结果是这样子的,zip/unzip是这样子的s3上传下载的调用是这样子的,在上传的时候设定了acl-public保证公开性。
如果使用7zip上述的两个问题都不存在了:目标目录覆盖可以使用参数-y,压缩可以立刻结束使用。结论微软太烂了,能不用微软的东西尽量不要用。开源的质量好多了,又快又好。

这里有一个细节powershell不允许命令使用数字开头,所以,安装好的7z的可执行文件名7z.exe我改名为sevenZ.exe,这个又是微软白痴的地方。唉,微软不亡,天理不容啊。

下载7z的网址: http://www.7-zip.org/download.html 这个是新的版本

七月六日 纽约 阳光灿烂

对于初次使用condor这个也许是有意义的:启动sudo一系列的daemon比如 condor_master,condor_schedd,condor_negotiator,condor_collector,condor_startd,我可能
实在ubuntu9.04上的安装默认为personal condor吧。错了9.04没有现成的我是手动安装debian的.deb吧?遇到问题怎么办?检查配置:condor_config_val -config告诉
你配置文件,最好你只改动.local,遇到问题怎么办?检查log,condor_config_val MASTER_LOG告诉你master的log,同理schedd的log。正在使用google拼音打字,觉得
微软实在是没救了,我在frontpage里面打汉字或者英文无比慢,自从使用Google拼音非常的快,但是一旦转到英文模式又变得很慢,现在发现我不需要转换模式,只需要打字,
如果按回车键就输入英文了真是太方便了,Google的牛人就是多,或者说开发的到位。
检查到的问题是schedd没有正常启动发现log里面一个/var/run/condor下面的watchdog的pipe没有创建成功,所以,我怀疑是权限的问题,自己创建这个condor的目录重新启动
schedd就好了。
看到一个大侠关于powershell的脚本管理的讨论就是究竟适用脚本还是使用function,他使用function也有另一个做法,就是文件名是函数名字,内容是正常function除了
function名字以外的所有部分,这样据说可以免掉了dot 文件的步骤,当然他讨论了很多内存使用调用快慢parse脚本次数等的高级问题,对于我已经不需要了。
刚才在厕所里面想起了k给我的教育,就是tail -f filename,这个东西就能够判断出一个人的经验多少吗?也许吧,我是很少使用linux。因为我始终认为一个脚本程序员也许
永远无法成为真正的系统程序员,而脚本这个东西不过就是程序员是否想花那么多时间去学习的问题,当然问题的本质是程序员应该都是本性慵懒才对,就是说他们认为这个值得
花时间去学能够减少将来的工作才去学吧?因为懒,所以有道理。

七月七日 纽约 阳光灿烂差不多有一百度

我觉得我越来越不想用windows,ubuntu10简直是完美了,居然可以正确的找到usb无线网卡,这个对于我这个Linux-noob当然是惊讶的,因为现在的Linux已经不是十年前的
业余玩家了,我敢说不出十年微软帝国就要开始面临生存危机了,当然我指的是windows因为微软毕竟已经多元化了很多的分支了。
我的问题是这样子的,ubuntu10.04安装之后有一个无线网卡的firmware的问题,这个我其实以前也碰到过早忘了。我的broadcom4311网卡缺少firmware,这个是因为版权的问题
ubuntu不能把它的firmware分发,只能提供工具来教你把他的firmware挖出来,这个就是著名的b43-fwcutter,这个可以使用apt-get安装,但是首先要sudo aptitude 
然后sudo aptitude install b43-fwcutter不过我不知道为什么自动不成功,后来我还是按照权威网站一步一步的做:制作b43-fwcutter
wget http://bu3sch.de/b43/fwcutter/b43-fwcutter-013.tar.bz2
tar xjf b43-fwcutter-013.tar.bz2
cd b43-fwcutter-013
make
cd ..
然后“挖”出那个firmware:
export FIRMWARE_INSTALL_DIR="/lib/firmware"
wget http://mirror2.openwrt.org/sources/broadcom-wl-4.150.10.5.tar.bz2
tar xjf broadcom-wl-4.150.10.5.tar.bz2
cd broadcom-wl-4.150.10.5/driver
sudo ../../b43-fwcutter-013/b43-fwcutter -w "$FIRMWARE_INSTALL_DIR" wl_apsta_mimo.o
重新启动就可以了。
dmesg这个命令很有用。查找网卡硬件使用lspci。

七月八日 纽约 今天大约有93度

奇怪,现在输入法有不同了。我真心希望谷歌拼音能够使用wine来运行。昨天的成果就是解决了笔记本的无线网卡使用问题,事实证明了另一个问题,我花了人民币100多块的无线usb网卡质量
比较差,因为就算在路由器旁边也只显示百分之四五十左右,而实际笔记本自带的无线网卡就算隔壁房间也有70%以上,而同样的环境下usb的只有20%不到。当然这里面也许不仅仅是天线灵敏度的
问题,因为原本usb之上实现就是有代价的,也许本身就是设备的极限吧?
ibus-daemon好像不会自动启动,有人建议制作启动脚本,这个其实挺好,我纯粹为了实验仿照/etc/init.d下面的惯例制作一个symbolic link,然后sudo update-rc.d ibus-daemon defaults
这样子也许也是没有必要吧,因为也许明天就不用ibus了。

七月九日 纽约 今天大约有93度

In perl, This is the simplest file operation:
#!/usr/bin/perl
my $file = $ARGV[0] || "-";
    
    open FILE, "< $file" or die "Can't open $file : $!";
    
    while( <FILE> ) { print $_; }
    
    close FILE;
Use "ctl+D" to end input.
1. "-" is input.
2. open file,just use open FILE_STRUCT $fileName. Or in above, "< $file" means accept stdin, but I found < is useless????
3. "or die": interesting syntax in perl.
4. $! is error message.
5. while( <FILE> ): <FILE> is file constructor?
6. $_: is current line.
7. $ARGV is command line parameter, so "-" or first argument is assigned to $file.

These are pretty basic for perl programmers, but for me many are just new.
When initialize a hash, don't use "{}", i.e. %hash={}; because it will create an enty like "HASH(0x8a0b880)". Of course the address is random. Instead,
you should use its constructor "()": %hash=(); blender -b /blenderdata/myblenderfilename -F JPEG -x 1 -o /myblender#### -s 5 -e 10 -a
So, in windows, you need to start "condor service": net start condor, which will run condor_master. Then, later you can just condor on -all to spawn all
daemon.
SqlServer needs attach/detach. Also when login to sqlserver management studio, the server is .\sqlserverexpress, don't add "host name" before "\" as
ec2 always start a new host name.

七月十三日 纽约 昨天和今天都很凉快

大概是这样子的:影响condor_config_val的是HOSTALLOW_CONFIG 以及condor_config里面和config相关的选项,而Windows版本需要额外的cred验证,所以,调用condor_status
的时候你可能需要先使用condor_store_cred来存储你的credential,我认为collector_host名字才是重要的,因为condor_host并不一定有用吧,如果两者都没有设置则需要
cm_ip_addr设置。

七月十四日 纽约 昨天和今天都很凉快,下雨了

这是一个很长的故事。从后往前说,firestarter大概是绕过了ufw因为我在ufw李关闭了防火墙但是实际上没有,因为firestarter这个小软件另外打开了,这个应该是可以理解的
本身ufw就是一个小脚本,连文档里的show居然都不支持。所以,最好centralmanager吧防火墙关闭。设定condor_host使用中心的ip。把七七八八的限制都关闭,设定一个所谓的
假的domainname,就是default_domain_name设定为一个比如rendermax.com,no_dns=true,这样子使用ip+rendermax.com做域名比较好看。worker只运行master,startd,collector
windows上的所谓credd在linux是不需要的,在cm运行。总之,condor_status查询的是collector,但是schedd要负责收集,所以,你指定condor_host用意是设定collector_host
否则就没有意义了。我动态修改没有成功,最后手动改config,因为condor_config_val只是查询condor_config的设定,虽然默认也是-master,所谓的指定daemon的查询或者
set仅仅是在daemonname.variable加上这个文件,然后又一个.config.daemonname里面是这些的索引。condor_config_val -address "<ip:port>" VARIABLE是远程查询。
查询所有节点的语句:condor_status -avail -format "%20.20s\n" StartdIpAddr
condor_config_val -address "<ip:port>" -startd -set var=val;
condor_reconfig "<ip:port> -startd;

七月二十四日 纽约 昨天和今天下雨了,但是还不是很凉快

仿佛很久了,上个星期累死了,因为考试brainbench perl test,考的也不好3.32有很多水分。上班真的好累。ec2上的security group我搞错了结果导致一系列的莫名其妙的问题,基本 上和防火墙的道理一样:
tcp 0  65535  0.0.0.0/0 
udp 0  65535  0.0.0.0/0 
这个是亚马逊的规定,意思等于说全开放,我当初不是很确定就把0.0.0.0/0设成了default group,这是有其他意义的。
我的环境:
ubuntu9是cm,winxp是加入的节点没有daemon可以提交任务,任务只能在cm提交
目的:
从cm提交指定任务在winxp运行:
我的提交的任务书大概就是这样子的:

universe = vanilla

executable = printname.bat
output = printname.out
error = printname.err
log = printname.log
requirements = TASKID==MINI
queue

操作:
设定TASKID在远程winxp节点:
condor_config_val -address "<192.168.1.2:9618>" -startd -set TASKID=MINI
这个命令默认是发给-master的)
condor_reconfig "<192.168.1.2:9618>"
结果:使用condor_config_val -address "<192.168.1.2:9618>" TASKID
这个命令默认是发给startd的)

Requirements 我现在还不知道怎么去除默认的部分。
连运动的时间都没有了。纽约的劳动人民日子真苦啊,白天靠咖啡硬撑,晚上心率不齐睡不好。用了这么多年的cuteftp之后才感觉还不如试一下filezilla,这个是我学习perl
的古代的书,导致我多花了50块钱,当然是我自己没有学对,perl5.8是不可能10几年前就有的。beyondcompare当然是超级工具了。

七月二十五日 纽约 昨天下雨了,但是还不是很凉快

我本来想安装samba,但是很迷惑samba和samba4还有一大堆的samba*的名字,应用管理程序也让我很迷惑,安装了又卸载,后来发现我的nautilus被corrupt的因为我的place
出现错误unable to open file。还好我现在比以前有经验多了,不至于发现任何问题就重装ubuntu,Google了一下大概知道这个是nautilus的问题,所以我刚才说我知道我的
nautilus出问题我撒谎了,因为我后来sudo apt-get autoremove nautilus 然后再重装nautilus就ok了。另一个问题就是condor central manager重启要给worker一点点时间重新加入。

七月三十日 纽约 昨天下雨了,但是还不是很凉快

纽约真是一个鬼地方,我四件衬衣两条裤子熨一下就要了我八块美金,就这还是不行好多个block求着人家干的,星期天没人干活。地铁上要钱的理由很充分,他每个月的房租又一千块,每天需要三十六块钱生活,我自己的房租就是这么多,我该给他钱吗?满屋子的蟑螂,烦死了。

七月三十一日 纽约 昨天下雨了,但是还不是很凉快

早晨在inwood森林里面慢跑感觉太好了,这是住在这个贫民窟的最好的理由,实际上west207街周围是很不错的社区,大都是挺有钱的人家,只不过地铁站出来的207街简直比法拉盛还要乱,还要脏,还要穷,因为这里穷苦的拉丁裔直接就是在大街上摆摊卖自己的旧衣服旧碗盆,当然很多东西你可能只有在yardsale才看到的垃圾都在这里摆出来了。我常常 在想只要你半年找不到工作你就沦为和这些人一样的社会最穷苦的人民了,你常常看到在炙热的下午207街的穷苦百姓砸开消防水龙喷水降温,纽约市政府对人民的义举视而不见, 因为美国的宪法规定人民有起来推翻暴政的权利,因此,人民当然可以这么干了。这在几千年封建历史的中国是不能想象的。人民只有被屠宰的权利。

八月一日 纽约 今天阴天很凉快

我的ubuntu应该是修改了网卡的状态,关闭了网卡,结果winxp就意味网线被拔掉了,我不清楚是不是这个有效:sudo /etc/init.d networking stop。总之,折腾了很久,干脆升级为ubuntu10.04。现在31g为/,另外的11g为home,还有一个8g应该作为backup或者download之类却被我设为了/opt,害得我home不够。高盛是一个金融公司,当然比不上彭博社,很多都是凑活着用,一大堆的陈旧系统靠着一个所谓autosys来定时运行,这个和scheduler大概没什么区别,plutus也许是他们自己开发的吧,中心都是围绕着所谓的potofolio运转,所谓的timeseries的定义吧,他们也许称之为一个model,还是一个formula,我还没搞清楚,不过就是投资的分析,预测,当然他们有一个riskreducement的计算,好象是用amoxia?一个optimization的东西,也许也是metlab演化的?我对于这些还都是一无所知。反正挣工资攒机票钱,交房租吧。

八月六日 纽约 今天阴天很凉快

活着,如同所有的普通人一样的活着,出卖劳动力换取补偿劳动力的生活资料,一个被剥削被压迫的劳动者。早上八点出门,晚上八点以后回家,回到一个寄居的充满蟑螂的旧房子。活着。联想法都没有的活着,每天在纽约的地铁里看金庸武侠小说消磨时间,来回两个小时,生命中的12分之1,不计睡觉时间的话就是1/8。只是我每天还没有睡到八个小时,也许七个,六个。活着。晚上看Tom Hanks的《查理威尔森的战争》感觉很过瘾,向苏联这样的邪恶帝国在二十世纪被消灭真是人类之大幸,现在回首人类二十世纪的一场噩梦基本上都是社会主义造成的,如今世界上仅存的几个邪恶轴心一多半还是贴着社会主义标签的封建独裁,包括我出生的国家依然被一个小集团在残酷的统治着。

八月十四日 纽约 今天阴天很凉快

活着。在mystery与misery之间徘徊。我想我的生涯应该开始进入虚拟阶段了,只要开始使用虚拟机,你大概就不太想再回过头去使用真实的裸机,尤其现在基本上是网络时代,只要不
是开发驱动之类的系统底层工作,大部分人都应该可以满足,且慢gamer不行。我在网上搜罗win7一开始不太敢当真,后来google了md5检查才相信是真的微软版。在win7上还是使用xpmode
好一些吧,因为vmware居然要我的volume-edition的xp的注册码真是吃饱了撑的,virtualpc原本也挺好就是当时不支持使用usb,但是xpmode是可以的,不过我使用以前增加注册表
administrator的办法居然不能让我使用administrator用户,也许还有别的设置吧。昨天使用powershell连接数据库总是失败,最后居然Google到这是64位机的问题,只好使用32位的ps。
谁说64位软件已经成熟了?大部分人都不怎么用的吧?昨天真累啊,其实每天都不轻松,虽然我时时刻刻为自己为生活所迫从事这个工作感到羞耻,但是为了生活有什么办法,当然并不
时说这个工作真的那么容易,虽然很多事无脑作业,但是无人告诉你流程你自己绝对想不出来,这个是系统当初的设计配置自己摸索几乎不可能,比如别人把你使用putty登录做成了Proxy
的代理,你只能在菜单里选择host你有什么办法登录到别的地方?系统在一台特定的server上把其他server上面mount的harddrive都mount,没人告诉你,你自己能够猜得出来吗?大大小小
几十个数据库,不计数的server,每天也许有T级的数据在处理,一天要浏览上百封邮件,加上自动邮件大概有一千几百,时常被人im,没人替换只好等到下午两点才吃午饭,为了生存,
为了paycheck,这就是美国的劳动人民。可是我也没有什么好抱怨的,美国绝对就是一个自由平等的地方,只要你有本事有能力,有经验,按照那个家伙说的年薪25万也不是不可能,他说他
拒绝了barcley的十四万的offer,我想应该不是吹牛,senior按照猎头的说法都是十二万以上的,这里不是没有能人只不过还有很多能力很强的人还需要h1的支持,否则。所以,我现在都
懒得理睬那些印度猎人混混,等攒些钱,攒些经验再说。其实真正的程序员才不至于像我这样堕落跑到纽约这个没前途的地方,看来我还不算是真正的程序员,因为江湖豪杰从来就没听说为
钱发愁的。
在纽约燥热的地铁里徒然地等待舅舅不来的火车,我唯一能够发泄的就是诅咒万恶的共产主义,因为正如鲁迅所说那样,共产党员整天都给你灌输什么主义道德,实际上却是赤裸裸的吃人。
想到这里不禁担心我越来越像狂人日记的人物。共产主义最根本的一点就是不承认人类的动物本能,而做了一个巨大的假设,就是人类能够应用意志来自觉执行书本里的教义,后来在苏联中
国等等所有国家的实践者立刻就发现这不现实,于是改良了一下,或者使用欺骗,或者使用恐吓,或者使用诱惑,这一点上所有的宗教都是一样,每个周末207街那些西班牙牧师用高音喇叭
狂嘶滥吼疯狂地要逼你加入基督教,我原本是很欣赏白人的教堂的,仿佛一个修炼身心的地方,现在看来宗教只不过是一个精神产品提供者,根据需求者的要求定制产品而已,对付207街的
这些社会底层无知无识者,你只能使用地狱来恐吓,使用天堂,来生来诱惑,使用免费土豆来吸引,当然这个总比穆斯林的大马士革弯刀的胁迫好的多了。
我决定彻底放弃微软的Frontpage,实在是太白痴了,自动语法检查关闭都来不及,总是要自动升级,微软我为你哭泣,比尔盖茨创下的家业不出二十年就要败光了。这个nvu挺好的,大概就
是ubuntu下的kcompozer.
现在使用虚拟机更加不在乎病毒木马了,根本就是随便安装软件了。哈哈哈。。。奈我何?!
买了一个四口usb的kvm,虽然不如ps2的好,但是这年头去哪里买ps2的鼠标?我买的那个差劲的要死,新买的主板压根就不支持ps2的keyboard!只好买了新的键盘。干了一个月工资还没全
拿到已经花了不少了,扣掉税不知道还有多少。买的那个kindle2刚买了就后悔,不过没钱再买10.5寸的,新的电脑如果不玩sc2的话显卡就暂时不买了。6个核实什么概念?太神奇了吧?

八月二十五日 纽约 昨天下雨了

if os.name == "nt":
config_file = "c:\\s3cmd\\s3cmd.ini";
else:
config_file = "/etc/s3cmd/.s3cmd.ini";
make sure you chmod -R 777 /etc/s3cmd
In linux the clipboard is not global, so when you close the application, it is gone.

it takes me so long to realize that the perl script I copied from windows has this "new line" problem when running in linux.Here is a handy script
I download from web which remove those nasty windows "CRLF".
$a=`pwd`; chomp($a); #because there is newline there. 

killall ibus-daemon 2>/dev/null
ibus-daemon -d &

Forget about IBUS, use  scim!!! 


八月二十七日 纽约 没有下雨仿佛已经是秋天了

关于perl连接sybase是这样子的,Linux下使用dbi是很常见的,我懒的使用,因为上班的地方使用Windows的batch+Java+shell+perl的混合体还不如使用Windows下来的方便。(没道理的)
1.使用odbc当然你要自己创建好的dsn最好是system的。sybase里面有端口的设定。以前没有使用过sybase以为是一种古董,其实数据库产品没有什么时髦的只要稳定高效可靠使用方便。acqua
这个东西挺好的。一个server上的多个database前缀使用“。。”而不是通常的一个“。”,所以使用用odbc你就要use win32::odbc而odbc的连接名都是类似的,new odbc(DSN=;UID=;PWD=)
调用存储过程和query查询没有区别,不像dbi还要区分使用prepare/execute,这一点凭良心odbc傻瓜化了,不过数据库引擎的性能我就不知道了。fetchrow回来最好是用datahash付给一个
perl的%hash这样子就可以使用字段名来去数据了。高盛的Email过滤不知道怎样反正我是不打算传递这些简单的samplecode不值得,反正Google也有的是,写下来帮助记忆。
2.存储过程很多年没有写过了,早忘了有权限的问题,创建的时候要指明group,比如dbo.procname,然后你要grant execute on myproc to someuser,这一点我失败了很久才意识到。此外
perl里面有一个很好的qq函数qq[sqlquery without quote]这个很cool你不用再加引号了,然后调用odbc的sql函数。
下班坐在地铁里常常内心羞愧,仿佛如歌词里面唱的,想起来真堕落啊,我居然为了生存干起了这个行当,为了赚取可怜的一点工资,在montreal的时候觉得70k/80k是挺不错的收入了,到了纽约
才知道护士一年也有70k,应召小姐一个月就有70k,所以我被二包扣掉之后的80k就是高盛里面除了打扫卫生的我最低了,真的叫做被包了二奶了。当然这个还不是最主要的,我是总觉得自己越来
越没有机会了。不过我想一个人就算在苦难也是有机会的,还是要努力。想起来这就是废话。
昨天kindle里面发现了yes,prime minister居然除了一个金融危机下的新剧本,9.99不知道要不要买来看。两个月的开销就是5k,我还是生活在manhattan最穷最乱的贫民窟里,这就是纽约。
昨晚上在amzone上调试ec2,Windows往linux发任务主要遇到的都是路径读写权限的问题,现在都是使用executable=/bin/bashi然后把脚本当作参数文件或者input文件传递,transfer_executable=false
忘记拷贝一个样本了,如果没有先在线下调试ec2还是挺麻烦的。没有时间了,赶紧要准备去被剥削了,想起来小时候学习马克思政治经济学里面总是描述西方资本主义国家的劳动人民被资本家剥削压迫
过着暗无天日的生活,劳动人民整天向往着解放区的晴朗的天空,现在回过头来看,这样子的鬼话却能够蒙蔽十几亿人口,只要你把信息的大门一关就行,这就是为什么共产党今天要把Google赶出中国
的最根本的原因。

九月八日 新泽西 没有下雨仿佛已经是秋天了

转眼就是劳动节了,这里的所谓的labor's day。没有什么阶级色彩的就是一个公共假日,要不是yuki的电话我还准备去上班呢,yuki和她的bf送了一个DVD player,还帮我把餐桌装好了,我在人类活动的大多数领域里面都是不太称职的。前天去黑人的理发店里了一个短的不能再短的头,感觉挺怪异的,因为一辈子没有像被共产党专政机关准备枪决得囚犯一样的短发。powershell的脚本在2008上有一个所谓的安全机制就是下载的ps1文件被lock,你要unlock才行,在condor提交任务的时候注意使用transfer_executable=false否则跨平台的提交总是有问题的,arguments和input_file究竟是否一样呢,我觉得应该理解成类似于参数文件的形式,(input_file的name作为argument?)这里有一个漂亮的公墓,我在里面跑过一次步,旁边是Lincoln park,很漂亮有一个大的运动场,本来总是在怀念inwood park,现在可以稍稍安慰一下自己。看王朔的小说怀想童年时代,那个暗无天日的年代,共产暴政把人们扭曲的不成模样,现在的年轻人完全无法理解王朔的小说,那是一个时代的大扫描,大特写。
其实,所有的executable都设定为perl,脚本设定为参数文件,应该是input_file,这样子可能是最好的。
condor_config_val -address "<ip:port>" SOMEATTR 不能说明cm就能看得到,要把这个属性放在startd里面,因为当初修改也是condor_config_val -startd -set att=val,

1. condor run as "condor" user in ubuntu, but it will act as "nobody" when run the job. So, this creates problem for condor_config_val -set task_status=3 -startd as it is rejected
for r/w in persistent_dir(/etc/condor). The config_file is hidden file as .config.startd.task_status and it is "root" rw only
2. The solution is: sudo visudo (equivalent to sudo nano /etc/sudoers) to add:
condor ALL=(ALL) NOPASSWD: ALL
nobody ALL=(ALL) NOPASSWD: ALL
The first line is not enough as when running job, condor run as "nobody".
3. input_file in "sub" file is just a data file, you need to set "arguments=nameOfInputFile". Also overwrite Arch=?="INTEL" || Arch=?="X86_64" as ubuntu claims itself as this.

The issue is like this: Even condor run as user "condor" in ubuntu, which is different from other linux flavour as "root". It doesn't mean it has problem because the job still should
not run as root at all. This is a basic security issue and no job should be allowed to modify system configure as "root" user, even though condor has the ability to allow it by "sudo".
So, there is no point to install condor to run as root. "Condor" as a user is enough. There is another case when we run condor_config_val from remote machine as administrator to setup
remote machine's configure. This has already been authenticated.

九月九日 新泽西 没有下雨仿佛已经是秋天了

关于nobody的争论没有结果,是否nobody的password是一个随机设定的?我没有找到答案,反正如果一个user的home是dev/null应该就是不能登陆吧,或者至少他会不明其所以然吧?就是说只有input没有echo?
我不确定我的理解。总之,condor使用sudo提升并不等于危险,因为你怎样能够登陆到nobody呢?win2008的磁盘不够了,创建一个ami然后run instance的时候--block-device-mapping "/dev/sda1=snap-c26b28a9:50"
这里的50=50g,但是运行后win并没有自动扩展,你要到diskmanagement里面extend到指定的size。

九月十日 新泽西 没有下雨仿佛已经是秋天了

contingent worker本来就是卖艺不卖身的,结果tom前天找我谈的意思是我还是在出租肉体和头脑的同时偶尔的出租一下的真感情献身一下,我觉得很烦,这份工作原本就是二奶似的,也许还不如二奶,大概最多相当于高级应召,只不过纽约的高级应召是24小时工作制,我是十二小时工作制,但是人家一个月的工资就差不多是我一年的薪水了,说不定还不用交税,现在又跟我谈什么献身加班,搬出合同来,问题那个什么agreement是compatible和Goldman sucks的,我才不管的,反正我表面上唯唯诺诺心理无比气氛。叫我去另一个bb机那个玩意在家办公,让我发通电宣布每星期献身日程表,我就装做不懂,不过我确实不懂,找乐半天帮助才找到public folder的calendar,这些都是办公室文化的一部分,很烦人,最后下午开会总算让我高兴了一下,让我这个congtingent封了一个primary support的头衔,准时7点下班,让那些fulltime的继续献身或者回家在线献身,说的是好听什么primary,无非就是蒋介石手边杂牌军的时候给的集团军的番号,黄埔子弟兵都叫整编师,所谓集团军压根就不给粮饷。反正我就混着吧,守住卖艺不卖身的底线吧。
高盛的一个窗口是这样子的sftp -o10920 goldmec@192.168.x.x 我ip忘了,看上去这个应该是一个proxy,所以就算你有防火墙的出口也是有记录的,而且这个是在某个特定server,你登陆使用那个ui的ssh是要留记录的。哦,我想不对,应该是说citi使用ftp上传到goldman,我们只是在防火墙内部下载?所以那个ftpserver对内对外使用不同的端口,这个解释更加合理。
我老是忘记创建新的win-cm要先store-cred,始终找不到一个persistent存储credential的方法。执行condor_config_val -address "<ip:9618>" -set TaskId=3 -startd这个命令在Linux的cm仿佛也是不行的,
看来还是要使用sudo,虽然linux的cm允许Linux的worker直接执行脚本那也不过是因为路径要一样的拷贝执行,并非是同样用户,应该还是nobody,因为condor Daemon本身是condor这个用户,为什么不能够runasuser?
也许sub文件里要明确才行,让我晚上在实验。卖艺之前就算不卖身也应该洗澡,这个是职业道德,难道妓女就没有职业道德吗?

九月十二日 新泽西 已经是秋天了

新泽西的阳光是炙烈的,新泽西的秋雨却也有透骨的冰凉,打在一个满身零件到了大修年龄的无动力双足越野机器上催生了某种记录的念头,然而头脑仿佛磨损的旧唱片转来转去都是曾经的陈词滥调,有联系的同年龄的思考动物们越来越明显地在短短的谈话里重复已有的命题,重复,或者说仿佛函数指针错误地从列表开始遍历仿佛是一个衰老的征兆,看到同学录上的闲言闲话则是另一种风光,大约女人们愿意好奇地知道自己当年的同类现在模样,或者展示她们作为生物单位的繁殖的成果,男人大约喜欢展示他们作为社会生活的推动者所生产与拥有的社会资源。这种论调在普通人与正常人眼里是有一点点的pathetic的调调,也不奇怪,当他们谈论2011年毕业二十周年聚会的时候我还没有想好我这辈子要做什么,或者三个月以后要干什么,半年以后要到哪里。
机械劳动二十分钟的工作我会花超过四个小时写sql来完成,这就是无聊,在高盛的日子里,没有什么值得回忆的,update 一个表,使用一个十分复杂的查询来做只能这样子:update tablename set col=val from table1
inner join table2 on joincond1...通常这个table1是你要update的表,table2是一个复杂的查询,记住,复杂的查询不能直接作为表在update里面,至少Sybase是这样子的,那么你要生成临时表,Google上到的大多
是这样子的:declare @table1 table(col_def1,col_def2...) select into @table1 from ... where...不过这个语法好像不被接受,后来我只能这样子select into #table1 from ... where...注意这里使用的是#而不是declare的@,当然我估计这之间的区别也许包含了临时表和内存中的表,你declare的表示要drop table掉的,否则。。。
达尔文的beagles回忆录是很无聊的,我想只有在我晚年躺在轮椅里等死的时候才会看,如果我能够的话。据说他在五年的航行中并没有形成进化论的观念,这是很出人意料的。

九月十四日 新泽西 已经是秋天了

如果你想使用变量作为tablename,你只能使用所谓的dynamic-sql,就是@sql=‘select * from ' + @tablename 然后exec(@sql),如果我要用perl来调用stored proc,要是proc有好几段的返回值,最好是把所有的结果集中在一个临时表里面然后在最后再select出来,所以我使用select 'abcd' as a,'efgh' as b into #temp 然后Insert into #temp select * from...最后在select * from #temp,值得注意的是这个#temp是
一个临时表,他的字段长度由第一个select的'abcd'决定了。
看cspan的国会听证,觉得资本主义制度实在是落后腐朽,一个联邦大法官的清白竟会被反反复复的诘责,翻来覆去的就是一个保释公司的老板请他吃了一些午饭,帮他修汽车,请他去拉斯维加斯旅行了一次,帮他修理房子一次,所谓午餐也都是八九个人去吃牛排总共还不到三百块,这在美国算什么呀,吃快餐也要十块钱都不奇怪,何况由服务的餐厅?修理汽车房子之类的能花多少钱?这个在社会主义国家根本就上不了台面,大法官从来没有收过现金,没有拿过回扣,唯一帮忙的就是有时候降低一下保释抵押金,不过这个也是正常的因为开庭前法庭会按照最保守的估计订立保释抵押,但是有时候审判的罪行减免成本就降低了。一般的法官都懒的管这种事情,大法官勤政多管了一些闲事,就被指责了。这个就是资本主义的腐朽,不懂的与时俱进的道理。

九月十八日 新泽西 已经是秋天了

新泽西的阳光比蒙特利尔更加炙烈,我买的Philips电视有一个月的netflix免费使用,逼得我不得不去买dvd机,可是alex说不要买dvd去买ps3,的确300块确实比很多一百多的bluerayDVD要合算,就算再便宜也要将近一百的只是一个解码芯片,而ps3是一台高新能的图形工作站也不夸张,而且是一个浏览器,sony似乎想把它变成媒体中心,因为game毕竟仅仅针对一小部分用户,所以毫不奇怪的,netflix也被ps3捆绑在一起了,这真的是一个不可阻挡的潮流,因为cableTV公司的在线点播被netflix及其ps3,xbox之类的平台所并吞并不是不可能的。电影的战国时代到来了,那么电影院如果没有3D支撑也可能会如同CD一样慢慢退出很多市场。
华尔街大概有一个不成文的规定,那就是坚决不雇佣阿拉伯人,这个你只要在高盛的公司员工花名册上一看便知。实际上纽约地区的劳动人民从心眼里讨厌阿拉伯后裔,当然大多数人心里都会认同一个观念就是穆斯林大概是一个暴烈的伪宗教,所以,在世贸中心旧址旁新建清真寺那便是触了众怒,我在那里看一大堆人采访报道,差一点就要上电视了,不过还是对自己的英语感到心虚就赶紧逃了,再说中午饭出来溜达的时间也够久的了。总而言之,我所接触的阿拉伯人大都很粗野,基本上都是靠骗人生存的,我买家具就是一个铁证,当然我也是傻,为什么要去这些阿拉伯人店里去买呢,为什么就心疼钱不肯多花那么几百块钱在ikea/walmart之类的店里买呢?包括sleepy这种店我觉得也是阿拉伯人开的,以后坚决不再去光顾。

九月二十四日 新泽西 已经是秋天了

伊朗总理的胡言乱语绝不是新闻,问题是在二十一世纪居然还有大国的领导人敢于这样做,我们绝不怀疑在其国内还有千百万人相信,这就不是新闻了,每次看到阿拉伯的愚昧无知我就想起了我小时候被蒙蔽的情形,真是无独有偶,政府能够花言乱语的国家都是相似的。

九月二十八日 新泽西 已经是秋天了

经过了蒙特利尔的春天的严厉,纽约的夏天的热烈,新泽西的秋天的萧杀,生命在无尽的随波逐流。没有程序的生命是空洞的,是没有梦的长睡不醒。

十月一日 新泽西 已经是秋天了

不知不觉发现又是星期五了,真是幸福啊,我终于能感受到普通人混日子领工资的无知无识的的快乐。我觉得我发现了我的ubuntu的问题,就是那个1.5g的zip文件不是上传的临时文件,而是工作节点下载的文件解压后忘记删除了,本来这是非常简单的问题,应该想到,只不过文件的大小是1.5g就不自觉的不相信他是condor老老实实传回来的,因为你在sub文件里面命令condor这么做的。
在纽约最讨厌的是阿拉伯人,其次是西班牙裔,再次就是黑人了。昨天参观911纪念馆感觉对于当时的惨烈还是认识不足,为什么美国人还能够这么宽容对待阿拉伯人体现了文明的力量,可是阿拉伯人正在滥用这种宽容,我十分赞同焚烧卡兰经的做法。

十月二日 新泽西 已经是秋天了

netflix有关塔利班的纪录片是令人震惊的,这个措辞不当,只是我少见多怪,塔利班的战士使用手机遥控土制炸弹,其次是巴基斯坦的教育是非常令人难以相信的,如同中国从前的洗脑似的教育,当然比起那些伊斯兰学校毕竟算是现代教育了,那些所谓的可兰经学校是可怕的,简直就是一个恐怖分子的培训所。
一个人老了就只能写脚本或者是Java/csharp之类的了。

十月三日 新泽西 已经是秋天了

big bang theory很搞笑,还长学问,Google之后明白了什么是friends with benefits

十月七日 新泽西 仿佛是冬天了

这个是csharp的一个demo,主要是使用正则表达式替换变量,变量使用xml存储。说老实话csharp这个工具的确是把编程的门槛降低了非常的多,大概很多高中生都可以熟练使用,这个本来是软件发展的方向,否则每个人
都要自己写一个库一辈子能做多少事情?当然我也并非完全喜欢微软现在这个东西,vs2010+win7毛病挺多的,首先鼠标选择就不正常,真不知道是怎么测试的?微软测试不用鼠标吗?
为什么Daemon也起不来,log也不写?十有八九是磁盘满了,我Google才发现这个简单的原因。如果人类失去Google会怎么样?失去联想活得更自在,不损一根毫毛,可是离开了Google就要天下大乱了!

十月九日 新泽西 仿佛是冬天了

不知道有多少人是bigbangtheory的fan,我听说中国的白领热衷于更加庸俗的连续剧。高盛的server不让你的nds使用ftp连接,不过qa-server却可以,并且nds也可以,于是这个qaserver就成了中转站,这些陈年系统除
了vi就没有别的编辑器了,不过原本vi就是默认的,只不过我以前一直以为emacs更加好用。其实我基本没有用过。被逼无奈使用以下其实挺好的。我被逼的要去创建一个qa环境,unix系统文件结构不同也就罢了,我抗
议了一两个星期希望能够远程mount一个production的drive,公司policy不允许,我有建议使用软连接,也不允许,最后建议使用所谓的tokenize的技术,就是使用ant之类的替换。这才发现使用eclips来连接cvs服务器
其实很方便,以前很讨厌eclips。

十月十日 新泽西 仿佛是冬天了

五十年代的老电影其实挺好看的,《vikings》就是一部不错的电影,女主人公也许是泰勒,但实际是Janet Leigh,其中的vikings异常剽悍,我完全可以想象这个种族征服英伦三岛的能力,那个凭借体力与勇气的年代,他们仿佛是海上的蒙古骑兵,但是体力上要更加的强壮。看过了这部电影你才能意识到《帝国时代》的场景是怎么来的。但当时英伦三岛最强的武器就是长弓。

十月十一日 新泽西 仿佛是冬天了

回到家突然雷雨大作居然看到了下冰雹,真是奇妙。聆听周孝正教授的讲座让人如醍醐灌顶,很多都是人人心中有各个不敢开口想,就更别提在大庭广众之下谈论的问题,首先,所谓的共产党这个组织就是一个封建农民
起义集团夺取政权后的贵族阶层,毛泽东建立的中华人民共和国就是一个封建帝制王朝,毛泽东就是一个需要全体人民欢呼他万岁的皇帝,共产党集团占总人口不到百分之一,如同前清的三百万满人一样以不到百分之一
的人口统治着99%的人民,占有着全国超过70%,80%的社会总财富。

十月二十二日 新泽西 已经是冬天了

起五更睡半夜,每日忙不停,但是且慢看上去最忙的人往往有很多时间。跟随我将近八年的罗技鼠标有些小毛病了,于是花了十块钱买了一个微软的有线鼠标。
You have been there and you know exactly where it ends.

十月二十八日 新泽西 已经是冬天了

人到中年,忙得连一声叹息的时间也没有,并不是你比年轻人每天的时间减少了,而是你比他们花费的时间增加了。在没有编程的日子里,你的生活是一片白纸,因为你没有写下什么,大多数人都是生活在白纸里,因此他们的生活过得很快,一晃眼就走完了生命。在未来能够保存下来的大部分是计算机所能阅读的代码,所以,你的生命被无限延长了,这就是你的生命的意义,因为你的生命虽然是生物化学的巧合,但是你给了他新的意义,不是为了重复的繁殖,而是向前进的进化。南面的墨西哥变成了比伊拉克战场还要危险的地域,因为毒品大王们开始掌握整个国家。遥远的共产暴政如一百多年前的清政府一样希望维系自己的统治,但是他的腐朽不可能为他的生命的延续有任何帮助。

十月三十日 新泽西 已经是冬天了

上个星期yoki做了我的stylist帮我挑了两件穿的出去的衬衣和裤子,在新泽西你能买到的就是只有几块钱的衣裤,manhattan是时尚的代名词,不过我只需要过得去的体面与使用。看lady gaga的mtv还是挺有意思的,JerseyBoy好象是一个团队什么的,不过这里的mtv制作的都不错,演唱会的现场气氛强烈,灯光表演一流,相比国内港台的那些欺骗脑残患者的玩意简直是天上地下,(不过,我想我是没有资格这么评论的,我从来也没
有去看过什么演唱会,连录像都没有看完整过。)
csharp有时候也是让人刚到脑残的,string的split就不能split字母组合吗?当然这个请求过分了。powershell对象传递参数和我的理解不一样。
纽约的最高法院刻着这样的话:The true administration of justice is the firmest pillar of good government. 对于共党暴政来说这个是不需要的因为他们只需要专政,只要在所有的一切前面加上“人民”两个
字就够了,所以,有了中华“人民”共和国是一个政党为“人民”服务的“人民”民主专政的国家,他们不需要“人民”认为他们是一个“好”政府,因为他们可以在他们所做的一切前面加上一个“人民”二字就够了。
独自在纽约为资本家卖命非常的羡慕在中国那片乐土上生活的共产党员们,我想一个人的最高理想就是想他们一样整天吃喝嫖赌抽,工作轻松自由却又能挣到大钱,远远比这里的劳动人民和资本家都幸福的多,这里的
华尔街的高管们我估计一年的工资可能还没有国内一个县长局长挣的钱多呢。
实际上,powershell对象在csharp里面是可以这样子的,addscript,然后addparameter,但是.ps1接收到的参数个数$args.length和你预期的不一样,后面被无端端的加了一个"true",这样子我要去改.ps1的代码,所以我放弃了,还是采用旧的方式把参数和scriptname放在一起,test1.ps1 'param1' 'param2'把这个作为addscript传递,.AddCommand("Out-String");这样子,我的目的至少达到了,就是返回值改成了string[],当然这是这样子的Collection<PSObject>的第一个对象是返回值,可能是一个"\r\n"分隔符的字串,这就是我抱怨split不允许多个组合的地方,我只能先把\r去除或者替换成null,然后再split by \n。很小的东西,但是你也要实验,所以,这里你发现vs2010里面的unittest非常的贴心。

十一月二日 新泽西 已经是冬天了

公司的服务器中了病毒,一时间搞得乱七八糟。

十一月七日 新泽西 已经是冬天了

我加入多线程的时候是小心翼翼的,因为,我讨厌滥用线程,否则就是你自己的噩梦,首先我不知道ec2-api是否线程安全,虽然ec2web也许根本就不存在这个问题,比如就是webservice,但是我本地使用的ec2-toolsapi呢?脚本语言也许是安全的,但是condor-api呢?linq呢?就算是线程安全,并发造成调用失败我就必须增加处理逻辑,linq的save没有返回值我怎么知道始终都能成功呢?相信始终都能成功肯定是天真的。我遇到了一个意想不到的错误,createspotinstance的requestid返回是空值,至少数据库里面是空的,看log不像是返回空,Amazon创建了instance,所以更像是linq失败了。所以,我的直觉是在几个critical的阶段需要小心万分,就是创建request/instance,消灭instance等等,这些时候数据丢失就是灾难的,因此,我发现我的central-manager被关闭是因为requestid空值,导致错误得把cm的ip当作了instance,后来我的检查idle的代码就把cm关闭了。这就是灾难。csharp的多线程基本上和java的线程类一样,不过底子里面还是winapi,比如你要waitall就要使用winapi原生的同步对象,我选择了autoresetevent,不过我一开始还没意识到这个就是event,没有set结果你的waitall就死等了,不过我现在倾向于构造一个线程包装类来传递参数而不是是要那个线程的run的参数,我讨厌无类型的object,这个大道的效果近似于threadlocalstorage,印象中也是winapi的底子,当然,我只是说效果上等同,就是普通的类,因为csharp的threadrun方法可以是类的方法不一定需要static的方法,这一点很不多的。电视里面又在播放avantar,看起来怎么那么像是wow。遇到了死锁,遇到了数据丢失。。。夏时制结束了,所以,确定无疑的是冬天了。
有时候常常为自己辩解,仿佛自己是一个trigger,because I cannot self-terminated, you have to fire me.所以,这个无意义的工作还要继续下去,因为我需要钱,上个月的amazon的账单是三百多,这个月的第一个星期就快两百了,所以,云计算并不是一个便宜货。

十一月九日 新泽西 已经是冬天了

突然想起了去年我在给C推销exception的妙用的时候,总是没有一个例证能够说服他,现在这个就是一个最好的例子,在一个可能出现多种多样不可预测的世界中生存的法则就是宛如一台以不变应万变的自动机,麋鹿兴于左而眼不瞬,泰山崩于前而面不忧,他强任他强,明月照大江,他横任他横,清风拂山岗,就是失败了我就不写进数据库,我的自动机状态不改变,我的逻辑也就不会混乱,那么这时候数据库的写就显得非常重要,当然,如果是optimistic concurrency conflict的时候,如果你能保障不造成冲突(这很难,比如随手一笔内外循环都重复写保存,或者子函数也写,调用者重复写,或者不可避免的要反复提交,比如我要得到数据行id才能生成任务文件,然后在保存任务状态,那么不提交是没有办法获得任务id的,只有在该状态提交前先提交获得任务id等等)你唯一需要关心的就是commandtimeout,因为
我看到的服务器100%运行下不失败才奇怪,冲突的解决目前应该是keepchange就可以,因为别人改了你没有改的,就用他的好了,我改得一定是最后的吗?应该是,因为当前我的concurrent操作都是针对不同记录,唯一的冲突是子函数的修改不同字段的冲突。所以。。。当然我也很天真,以为csharp的conflict的resolve就是帮你再次提交,这一点我从来就没有相信过,只不过我看了微软那么多的例子和google的讨论从啦就没有人提过你应该再次提交,当然这个是有理由的,因为没有人相信讨论这个问题的人会天真到不懂的再次提交,想想看,当你在try-catch做resolve的时候,你还是optimistic的认为不会再发生conflict?见鬼!所以,提交是你作为一个程序员的天职,我很天真。

十一月十日 新泽西 已经是冬天了

有时候,我对于事务的看法是非常冒犯的,看到那么多人因为看了cctv播放的连续剧就对于清朝的统治津津乐道,似乎又忘记了满人曾经非常残暴的扬州三日,嘉定十屠,其实,这个也许比起所谓的南京大屠杀更多,更残忍,但是我们这个健忘的民族仿佛一群猴子,早上给三个桃子,下午给四个桃子,被改编成早上四个桃子,下午三个桃子就开始欢呼雀跃。因为他们忘记了共产党当年的所谓三年自然灾害人为害死的人有三四千万,饿死也不让去逃荒,这个比封建统治还残暴,封建皇帝虽然横征暴敛但是也不能禁止人民在饿死前呻吟,共产党把持了所有的话语权,你连呻吟一下都没有就静悄悄的饿死了。再假如当年日本人如果有更多的信心与时间来统治中国,比如不去发动太平洋战争,又比如美国没有打赢日本,那么今天可能中国还是日本的殖民地,那么今天的中国人的健忘也会慢慢接受日本人的统治,就如同当年接受满人的统治一样,甚至有时候会觉得日本人比蒋介石统治还好一些,比如给每个老百姓免费做一个带照片的良民证,这个在蒋介石时代做不到,在共产党时代也没有做到,因为做身份证你还要自己掏钱。这个心情和当初在满人统治下的中国人觉得明朝皇帝荒淫无道的感觉是类似的,日本人也可以说是所谓有道伐无道,替天行道。所以,谁来统治都是一样,普通人能够饱暖淫欲就认为是太平盛世,没什么区别。

十一月十二日 新泽西 已经是冬天了

我觉得中国的现状就是清朝末年的模样,大概是在一锅水沸腾前被强制压住锅盖仅仅能够延缓爆发,却增加了将来喷发的烈度。为什么金正日总是强调先军政治?为什么全世界贫穷到极点的“流氓国家”都乐中于发展核武器?
中国在60年代也一样是一个流氓国家,经济上一穷二白,人民没有丝毫的机会接触外界,政治上极端狂热,四处输出革命,同样地像今天的北朝鲜一样拼了命要发展核武器。因为这个是独裁统治的护身符,萨达姆没有核武器所以作为流氓国家被国际社会消灭了。
当一个流氓国家的国家机器强大到没有强大的外来力量无法从内部推翻其统治的时候,唯有从内部彻底瓦解他。所以,今天的人民需要的不再是武器而是信息与互联网,如果认清了这个革命的道理就明白这是流氓国家机器与我们斗争的战场。

十一月十四日 新泽西 已经是冬天了

我常常感到义愤填膺,就是一个独裁政府为了一己之私能够颠倒黑白道无以复加的地步,比如今天为了反对美国对于中国处于黑暗统治下人民的同情就要质疑所谓解放伊拉克的正义性,像萨达姆这样一个十恶不赦的恶魔却要对他讲究什么她对伊拉克人民的贡献,仅仅想象一下他在侵略科威特以后下令焚毁科威特大量油井造成人类历史上空前罕见的油田大火所造成的环境经济损失就足够审判他了。可是共产政权却常常对此轻描淡写,现在的愚民政策不能完全依靠蒙蔽人民,因为除了朝鲜与古巴其他流氓国家很难做到,因此只能依靠误导人民,让他们只关注政府希望他们关注的事件,这就是宣传的指导思想。
如果按照共产党自己的老祖宗的理论,这个政权早就应该被人类社会所摒弃了,因为他早已在阻碍社会生产力的进步发展,那么作为主导的经济基础居然没有办法要求遏制他的上层建筑做相应的变革,这究竟是理论的错误还是这个独裁体制的超越理论的生命力?看麦大妈的sweaty&smokey的演唱会,简直难以相信麦大妈都已经五十几岁了,麦大妈是谁?Who is that girl? 为什么选择阿根廷开演唱会?因为她唯一一次以圣女的姿态出现就是在阿根廷。又蹦又跳简直就是一个老妖怪。但是她确实非常的妖,如果在年轻一些那么lady嘎嘎也要叫嘎嘎了。

十一月二十五日 新泽西 已经是冬天了

今天是感恩节。被一个简单的问题折磨了半天,这个是以前就碰到过并解决了,但是没有记录下来所以就又犯了一次错误。默认情况下condor的config是设定为只有condor用户才能写的,所以,ubuntu下condor是condor用户,
那么我以我自己的帐号登录想要使用condor_config_val来修改当然就不成功了。

十一月二十七日 新泽西 已经是冬天了

今天又是遇到一个无法解释的问题,在condor_reconfig -startd这个命令中如果我老老实实的执行,比如perl里面$result=`condor_reconfig -startd`;结果总是返回空,并且一切设置都不成功,我一开始以为是那些实际存储的.startd.feature文件的权限问题,这里所谓的feature就是你要condor_config_val -set feature=value -startd里面的feature,但是发现这个必须是又condor_daemon运行的用户才能读写的,改了也无关。
后来查看从前的代码发现唯一的区别就是debug的文件输出,比如`condor_reconfig -startd >mydebug.txt`;如果没有这个文件输出,命令就无法成功,你说是不是无厘头?我后来才想这个condor_reconfig实际是让condor
重新读配置文件可能是异步的,但是我认为perl里面的``和system都是exec+wait,所以,抱着试一试的态度改成了@arg=("condor_reconfig", "-startd");system(@arg);结果你认为怎样?一样没有用!难道condor里面写文件会有什么不同的效果导致区别?

十一月二十九日 新泽西 已经是冬天了

看了看天涯的论坛帖子,明白了我还是过于低估了人民的觉悟,感觉其实我能够明白的道理普通人也大都能够明白,因为我是一个普通人,更主要的是这个时代是互联网时代,知识与思想的传播是前所未有的,在我的童年时代一直到今天政府都把持着最广泛的传媒,如电台电视报纸杂志,非正统的思想在不同时期都只能依靠当时的特有的传播渠道传播,60/70年代主要是靠所谓的手抄本,这个是一个绝大的讽刺,在20世纪的文明时代,印刷术早已普及的年代,人们却只能使用近乎原始的方式传播思想,80年代也许偶尔的在政府办的报纸里工作的人忍不住写了几句真话,结果捅了马蜂窝,那几本什么经济导报之类的杂志报纸被停刊整顿,却想不到掀起了一次革命,当然政府最后通过自己的传媒定性为叛乱,用坦克和机关枪镇压下去了,从此人民群众学了乖知道这个政府是会动真格的杀人保卫红色政权的,直到突然一下互联网在中国的普及,一下子这个政府发现越来越无法管制人民的思想,因为科技的进步导致了政府传媒不再一遍遍的重演皇帝的新衣,不是人民的眼睛突然擦亮了,而是突然普通人有了发声的工具,忽如一夜间,人们的想法好像突然进步了,因为即便你没有第一个想到,但是听到别人的心声,你会思考判断采纳发扬,因此,中国人民的进步就不是十年二十年前可比的。所以,我才看到那么多人和我一样讨厌中央电视台的那个大裤衩子大楼的标志,讨厌用亿万金钱堆砌出来的亚运奥运金牌。但是,这仅仅是第一步,没有了一个人民投票选举的制度,哪怕众口一词也难以烁金,仿佛虽然总数有十三亿,前面没有一张选票的那个1,后面跟着的十几个0总数还是一堆0.
In times of tyrany and unjustice, law is used to oppress people. Outlaw places itself in history.

十二月一日 新泽西 已经是冬天了

我一直怀疑商民族是一个没有道德感的民族,所以,这个种族的祖先才老是讲一些大道理。天涯社区引用的一句话很有意思,就是当前中国的矛盾是人民日益增长的智商和共产统治集团日益增长的贪欲的矛盾。

十二月五日 新泽西 已经是冬天了

好累啊,深度潜水。
aws的micro instance内存太小,加一个swap,记录一下command: sudo dd if=/dev/zero of=/home/1024Mb.swap bs=1M count=1024 sudo mkswap /home/1024Mb.swap sudo swapon /home/1024Mb.swap
然后再加一个swapfile在fstab:/home/1024Mb.swap none swap sw 0 0

十二月十二日 新泽西 已经是冬天了

计划是这样子的,使用secondary-server做上传压缩等等的工作,那么需要一个nfs的文件共享,所以,就简单的安装smbfs
sudo apt-get install smbfs

sudo mount -t cifs //184.72.250.21/userData /home/ubuntu/data -o user=nickhuang99,iocharset=utf8,file_mode=0777,dir_mode=0777
不过这个是要手动Mount的,所以,最好是这样子的加在/etc/fstab里面:
//184.72.250.21/userData /home/ubuntu/data cifs credentials=/home/ubuntu/.smbcredentials,uid=1000,gid=1000 0 0
所谓的.smbcredentials的内容就是username=Myuser password=MyPassword。不过创建一定要使用root来,我使用ubuntu创建然后sudo chown root都不行,又出了什么权限的错误。
我先把目标设成777,这样子似乎没有什么区别吧,因为看mount的权限总是当前用户的,不过condor的demeon创建的nobody用户是可以访问的。

十二月十三日 新泽西 第一场雪

看天涯和搜狐博客我感到有些震撼,就是说民智已开,依靠互联网思想的传播以前所未有的光速在扩散,如同核裂变一般迅速,很多时候你不在感到孤独,你发现有无数人和你有着相似的想法,甚至更经常的你感到思想的碰撞,因为你看到更多的闪亮的头脑。中国是有希望的,只要有互联网;因为有了互联网,中国才有了希望。的确,我也在调整我的预测,也许最近一次的所谓中央经济工作会议内部认为这个政权至少还能维持十年,可是,我觉得现在主动权已经不再把握在那些披着共产毛皮的封建领主手里了,因为现在实际上是中国的主体人群在考虑由谁来接替或者如何接替才是他们的利益的最大化。这就是中国的现实。

十二月十五日 新泽西 第一场雪

黄教授说:“一个人即便做不到有求必硬,但至少要做到宁直不弯。”
王朔的名言就是,朋友分两种,一种可以性交,另一种不可以性交。我觉得这种概括不如说这个世界都是由1和0组成的更有意义。
Don't cry for me, Argentina.