
我的征尘是星辰大海。。。
-------当记忆的篇章变得零碎,当追忆的图片变得模糊,我们只能求助于数字存储的永恒的回忆,
作者:黄教授
二零零八
《runaway bride》实在是一部有趣的电影,我在想象我参加过的婚礼多少都是有些恐惧的,实在可以说是人生中最折磨人的时刻,不过话说回来了,作为逃跑新娘这个社会多少是会宽容的,会把你当作冲破包办婚姻的新女性主义者或者是勇敢寻找自己理想的强者,对于逃跑新郎我只看到一两个,grant在《four wedding,one funeral》里面挨了结结实实的一记重拳,我觉得这是最轻的惩罚,大概新娘的娘家兄弟来的不多否则一定会让他来个终生残废之类的,因为女人的婚礼在传统上仿佛就是超市买来的物品开了封就不好退货了,(这当然是中国的传统,这里在北美好一些,只要你保留了包装与发票在规定时间内退货是可以的,)电影里的三个逃跑新娘的准新郎其实遭遇都还不错,因为他们最多被社会笑话笑话甚至还当作是同情对象,当然这是当那个新娘养成了婚礼上逃跑的习惯之后社会才认可新郎是受害者,所以第一个新郎是最难当的因为人们会有对他有最多的猜测,随后的新郎一个个都会越来越受到社会的同情甚至敬仰因为他们勇敢敢于挑战别人不敢或者不愿承担的责任与危险,去和这个被男主角,一个专栏作家,所称作的“man-eater”在教堂的婚礼现场决战,看谁更能忍受那种折磨看谁先逃走。我在国内好像参加过不下二三十场的婚礼,每次对我都是一种折磨,第一婚宴总是很晚才开始,我总是饥肠辘辘,所以后来每次参加婚礼我都要先吃一顿,第二婚礼仪式实在是千篇一律你有没有那种看电视台白吃主持人将非常白吃的话有吭哧吭哧将不出来你恨不得跳上去帮他讲出来的感觉?每次看听这样的场面对于一个头脑正常的我都是一次精神上的折磨,你可以想象在中国当共产党的官员都是多么的经得起折磨因为那些冗长弱智的讲话你要天天经受着模拟的神经是多么多么多么的坚强,我只有这个时候才理解共产党官员为什么总喜欢用酒精麻醉自己这样的工作一点都不必再“中美合作所渣滓洞集中营”李寿严刑拷打来得轻松,精神上的折磨一定是更加的残酷。第三让我很感到embarrassing的是中国的婚礼的目的意义,原本我猜想一定是在原是部族群婚社会里突然宣告说你众多的性伙伴里面对于男女成员各自减少了一个(那个时代同性恋还不时兴吧?因为这个东西对于增加人口没帮助社会不鼓励),为了让大家不至于搞错认清一下他们的面孔省得上错床引起不必要的部族内冲突,那么把大家召集来看一看新郎新娘的面孔,(为什么是熟人朋友?因为这些人都是新娘新郎潜在的或者是曾经的伙伴嘛。)渐渐德在原始社会的末期按照恩格斯的说法部族长老开始监守自盗利用职权把部族公有财产留给自己的子女于是私有财产出现了,婚礼成为显示私有财产多寡的一个时机,再接下去私有财产的清单里包含了老婆的多少,于是举行几次婚礼就代表你有多少私有财产的一个标志了。同样的,中国现代婚礼多少也是一个社会地位与私有财产的展示会,新娘的相貌也是要折合成一定的人民币计入新郎的家产的一部分的,同样作为拥有傲人身姿相貌的新娘野心欣然为自己代表的水涨船高的社会标底物而感到高人一筹,这是非常自然的嘛,五六十年代在中国去一个漂亮的老婆大概说明你家里可能有所谓的自行车收音机之类的“三转一响”,大概八十年代是彩电冰箱摩托车吧,因为按照马克思的劳动价值时间理论女人的价值也在增加,到了九十年代和今天大概没有价值百万的住宅美女是不会承认你在社会的位置的,同样的那个婚礼也自然不会发生。在今天我想婚礼当初那种“昭告天下”男女伙伴“不要再和我上床”的意义越来越次要,而其社会地位的昭示作用越来越重要,电影里的女主角在解释她为什么从婚礼上逃跑的一个原因时候说,她感到害怕因为她为每个准新郎改变她自己包括她吃什么类型的煎蛋,所以在婚礼进行曲中向那个她为之而改变一切的男人走过去的时候感到惊慌失措,因为她差不多convince了那个男人她是什么样的女人而实际上她并不是,这就是大多数婚姻的实质,所谓“与敌同眠”因为你有一晚上半夜惊醒发现身旁睡着一个陌生人,两个人都围了对方而作了适当的隐藏与改变只为了走进教堂然后在真实的家庭生活中摘下面具显露赤裸裸的另一面,很多人只是在祈祷“假面舞会”结束的时候自己与对方的心理承受力不至于支撑不住家庭的重负。朱丽亚罗伯茨和 理查基尔的电影往往有很多小资倾向基本上是给社会的intellectual看的,很多劳动阶层对于其中的电影对白可能有理解的困难,揭示的问题和橄榄球爆米花时装八卦新闻有一定的距离,里面有一段比较精彩的告白,凭着我很差的记忆里 复述如下,I can guarantee it will have hard time, I can guarantee there will be a time when one or both of us want to get this out, but I can also guarantee that if I don't make a choice now I will regret it for all my life.话虽然是好话,但是你怎么知道你会后悔?我要原本早上要做一个sprite结果看了这部电影什么都没做,真是耽误事啊。
制作sprite是不能用jpg的,因为去背景色的时候会失真,骗得过眼睛却骗不过程序,只能用bitmap这实在是很头痛的事情,也许这就是为什么wesnoth用的是png的原因吧,据说这个是lossless的,可是微软的那个libpng.dll去哪里找libpng.lib呢,当然我可以采用png.org的源码去编译新的lib可是如果操作系统有的我就不要再分发那不是更好吗?微软对于开发还是很讨厌的一件事。头疼啊。此外看那个png的library实在是很麻烦,我有过看ijl的经历还是很头疼似乎更加的复杂吧?png比jpg更复杂对吗?终于在我的旧电脑里面找到了我曾经编译过的wesnoth的工程。 我想用ternary-raster-operation来画一个silhouette可是我的头脑好像浆糊一样,对于黑白两色和前景背景亮色我每次都要画一下真值表,在古巴的时候我干脆用一个256的循环把所有的可能性都试一遍,我觉得我现在是太懒了,懒得想问题宁可华裔两个小时写一个很傻的程序也不愿花几分钟去想一想。
一月二日 今天天气很好吗? 好不容易出太阳了
关于ternary-raster-operation你要把所谓的post-fix想象成是一种stack来存放操作赋予操作元,比如SRCERASE=SDna那么你在wingdi.h的注解就可以看到dest=source AND (NOT dest)我一开始理解错了以为有两个独立的栈,一个operator,一个operand,就是简单的operator压栈,operand压栈,然后两个同时出栈,其实不是的,而是一个共同的栈,类似于nested的挂号式的顺序,就是压栈顺序为SDna然后出栈的时候operator取决于一元还是二元,比如a是二元,那么必须Hold住,等待下一个operator n,这个是一元的等待immediate operand,就是D,那么结果作为a的一个operand,等待下一个operand就是S。(我这里被微软的程序员耍了一下,猛一看NOTSRCERASE=DSon,我瞄了一眼wingdi.h发现是这样dest = (NOT src) AND (NOT dest)顿时紧张起来以为自己理解上有很大的偏差,结果你也知道,TNND为什么弄这种玩笑?直接写NOT(src OR dest)会很难吗?难道DSon这样不直观吗?我的方法画silhuette不能适应所有的形状。
一月三日 今天天气很好吗? 冷死了!
花了一天时间企图编译<wesnoth〉结果运行期有一个错误,追踪了很久不得不放弃,1.3版本以后据说用了booster更加的麻烦,看样子将来只有尝试linux下编译了,我觉得可能是自愿文件的问题吧?有一个image error,但是跟踪一次要十几分钟编译一次也要十几分钟我实在是无能为力了,运行的时候要设成window模式-w才能跟踪。今天学到两个小算法。
我觉得美国人是天生的战士,因为在西部拓荒时代人人都持枪。《the quick and the dead》
一月五日 今天天气很好吗? 有些冷!窗前屋檐下的积雪融化又结成冰柱掉了下来
M的damage-control应该是对的,这是我做不到的,有一小会儿我认为sort-first有得天独厚的优势sort-last因为无法解决透明物体的问题实际上没有什么大用,但是睡了一觉醒来我才意识到M以前跟我说的,最后sort-first还要回到sort-last,所谓的hybrid实际上最后还是要用sort-last来解决loading-balance的问题,那么如果sort-last不能解决transparency的问题那么整个parallel-rendering就都没有什么意义了,而且在回过头来想想看sort-last只有在90年代才有意义,或者很小的数据要很大的屏幕的时候才有大用,因为你要是一个一个primitive的检验坐标是不可能的,如果用hierarchical的idea比如octree之类的spacial结构最终会有一个时候多个结构都落在多个屏幕分区上,那么这个数量会导致增加rendering node的努力失败,所以sort-first才真的是有scalability的问题。所谓opensg,我以为就是一个distributed scene graph,没有什么大的并行的方案,chromium不过是一个distributed opengl的版本,就是app不用重编译就能进行MDSI这类并行的效果,typically sort-first。那么刚刚兴起的所谓equalizer是个什么咚咚呢?我以为也不过是一个儿童玩具,大概就是对于单机多gpu用多线程来做并行渲染,对于cluster他不过是实现最最原始的sort-frist,sort-last的简单功能,大概是用配置文件和回调函数(对象继承的函数重载),反正pixel-merge居然是用的direct-send这种O(n)的玩意,可见是给初学者玩玩新鲜的幌子。
一月六日 今天天气很好吗?有些冷!窗前屋檐下的积雪融化又结成冰柱掉了下来
GetWindowInfo可以获得所有window相关信息。TNND这个是win2k的东西,又不行。你可以在WM_GETMINMAXINFO里面修改default的max-size但是不能超越GetSystemMetrics里面设定的系统值,总之,超过系统最大resolution的windows是不存在的因为没有意义。我觉得这条路不通。 真后悔没有保存一个版本下在我在被一个奇怪的现象所折磨!TNND,那个叫做GetWindowRect。最让人恼火的就是由一些基本的东西我想找人问一下都没有,这就是孤独。为什么我的bitblt画的不是clientarea呢?好像把整个window包括caption都在画?为什么???
默认的应该都是window的左上角,所以如果你要映射clientarea,最好用setwindowOrgex把那个坐标系移动一下吧?(还没有试验,应该是对的吧。)OffsetViewportOrgEx应该也可以吧?不用了,傻瓜,用clientToScreen,screenToClient转换就可以了,当然我还没有试验bitblt,应该也可以吧?证实了!TNND使用GDI还真的是有一点点地挑战,因为你要takecare的东西真的不少,但是我相信我这样做是最正确地因为相对于API来说所有的建立在这之上的骗傻瓜的玩意一定更加的复杂,也许初看起来使用容易实际上他们要记忆的东西一定比api来得多因为api都是按照最精简的设计的。(windows除外,这帮混蛋简直是毫无计划的乱输出一通API,明明一条路可以的非要有多种可能性!怎么想的?什么叫做canonical?学过没有?)
<Keeping Mum>是一部典型的英国式的黑色幽默或者说黑色喜剧,大概一部家庭生活剧很少会有人会把它跟serial-killer联系起来,尤其是这个killer是一个六七十岁的面容慈祥的老奶奶,老奶奶年轻的时候和女儿失散了,丈夫大概是和别的女人偷情所以被她除掉了,后来大概看见不平的事情就喜欢用这样类似的极端手段解决,关在监狱里几十年终于释放出来了就悄悄地跑到女儿家里做官家,女儿的生活可以说是一塌糊涂,丈夫是神父(mr.bean)生活刻板不会套女人的欢心,一心一意传递上帝的福音,儿子在学校里总收到坏孩子欺负,女儿大概不停地交那些很糟糕的男朋友,在这种情况下女主人偷偷地和一个美国人就是她的高尔夫教练偷情,老奶奶看在心里奇在心头,不动声色地悄悄剪断那些在学校里欺负小外孙的坏孩子的自行车刹车,当然这些小孩子都从悬崖上掉下去或者在公路上摔得半死,老奶奶然后又把那个高尔夫教练除掉了,因为他偷偷来接老奶奶的女儿去墨西哥独家寻欢,当然老奶奶顺便也把讨厌的邻居杀掉了连同他讨人嫌的狗。老奶奶除了平抽空杀人还引导古板的女婿在不到时候讲一些宗教笑话鼓励他多和女儿过过性生活,慢慢地这个家庭从破碎的边缘被拯救回来了,但是老奶奶杀的人太多了被女儿孙女发现了只好吐露实情,当然已开始她们很难接受老奶奶这种爱的方式,老奶奶只好离开顺便把想要告发的另一个讨厌的邻居杀了,不过这一次仅仅用煎盘吓唬了一下那个讨厌的老太婆就心脏病复发吓死了。那么多尸体都沉到池塘里自然要长青苔水草之类,结果老奶奶走后又花草公司来要清干池塘消除水草,老奶奶的女儿在妈妈的教导下也学会了一不做二不休把那两个清水塘的干掉了沉到了水塘里喝一大队尸体作伴了。神父在一系列的实践中都蒙在鼓里,但是它深刻地感觉到了自己的生活在一天天地好起来,于是写了一片布道词到基督教大会上宣讲,题目就是《God's Mysterious Ways》,应用圣经的话就是My way is not your way,对上帝的所谓最好不要多去质问,享用上帝的mysterious way就好了。这就是英国式的黑色幽默,这一类的代表自然就是著名的电影《一条叫做旺达的鱼》。
昨天晚上的片子也很有意思《Art School Confidential》,这是对于所有欣赏西方现代艺术的人的一个入门电影,有不少儿童不宜的内容,同时你看了一定会哈哈大笑不止的,这就是现代艺术,你如果是在那个顶尖上你就可以肆无忌惮的做一个asshole,其他在下面的人你能做的就是cocksucking。粗鲁归粗鲁但是却是实情,大概一个卧底的警察完全的儿童涂鸦被当作了艺术作品,西方大学里种中学生教授最丑恶的东西你都看得到。
一月七日 今天天气很好吗? 天气难以想象的暖和!
终于折磨到了一个头,世界的复杂就在于你犯的错误往往不是一个,问题的解决的困难也在于你需要把多个混合的错误一一解决,在大多数人眼里世界之所以神秘在于你认为你改掉了你认识中的错误世界应当拨云见物显露原来的面目,可实际上还有第二个第三个的错误迷惑你的眼睛,但是有时候一个白痴也有上佳的运气用一个完全错误地揭示碰巧在一个绝无仅有的机会上错搓得正,但是你可以靠运气成功一次,你不能一辈子靠运气,所以最终的道路还是要回到老老实实的探索与学习中。这一次是两个方面的问题混合在一起,首先GDI有一点点状态机的味道,当然只能说味道,很多时候系统作了一件事就又把状态复原了,而你从他现有的状态你并不能知道系统是怎么做的,而微软往往又不愿意告诉你,或者说不知道你原来不知道却想要知道,(废话)。其次,我对于一个window的组成总是概念模糊,你我以为caption-title是天生就有的?我以为menu是自然而然就画出来的?client-area在没有caption和没有menu的情况下肯定是不同的,对于程序员来说操心这个实在太麻烦了,所以所有的坐标都尽量让你用以clientarea左上角为原点的的坐标,可是window的backgroundbrush当初并不知道你的clientarea有多大,所以默认的bkbrush(注意不是hdc的brush这是不同的)当然还是从window左上角为原点,于是每次系统帮你做清洁的时候都回SetBrushOrgEx把这个brush平移到clientarea的原点,所以,我们看到你load进来的bitmap之类的图示正确显示在clientarea的(如果你设定他为backgroundbrush的话,你曾经想过为什么caption没有把它的顶部截掉呢?至少我没有想过,认为这都是理所当然的,以为天生的。)。再次,我一直怀疑有一个潜在的可能出错的地方,我获得了hdc的时候忘记releaseDC是否会对我下一次获得起影响?我现在还不知道这是不是原因,但是凭直觉我觉得这应该是针对多线程同步的作用的那种lock,应该对我现在没有影响吧?总而言之,GDI其实很简单,一句话你想干什么都可以,这就是我想追求的,而使用任何封装的高级的工具给我的感觉就是在别人预设好的圈子里打转转让我有一种说不出的郁闷感。
TransparentBlt是win2k的,所以应该只有一条路没有选择。
一月八日 今天天气很好吗? 你知道今年的冬天有多么暖和吗?积雪都融化了。
看美国的大选实在是让人羡慕,美国真是人才济济,主要是一个好的制度能够让人才脱颖而出,这就是美国长盛不衰的秘密,一个众人皆知却没有几个国家能够做得到的,民主制度在于能够举贤。我原本一向看好希拉里,可是这次奥巴马脱颖而出找是让我吃了一惊,美国不论是他们两个谁当选都代表了一个change,第一个黑人总统还是第一个女总统,这都是一个巨大的进步,想想看美国普通人心目中已经不再由种族肤色性别的概念就知道人们注重的是人的能力,而今天中国的政治仅仅从以前的老人正值走出来还徘徊在黑箱密室操作的阶段,人们选择领导人只能揣摩上意,完全没有什么人才的竞争机制,或者说他们竞争的只是密室斗争的能力,这是国家的不幸人民的不幸。顺便说一下,奥巴马毕竟年轻演讲要强过希拉里,希拉里的演讲鼓动性和文采记忆力都比奥巴马差不少,而且谢谢家人的时候绝口不提他的老公,可能还在为他今天的讲话生气,毕竟攻击性太强的言论不太好吧。
昨天发现原来《yes,prime minister》原来还有一个姐妹篇《yes,minister》,只好动用巨资在购买这个DVD,不过这个非常值得,预算委员会决定再怎么节衣缩食都要买。
一月九日 今天天气很好吗? 风很大。
看英阿马岛战争让人感到热血沸腾,英国在极端困难的情况下打赢了这场战争维护了大英帝国的尊严与荣誉,让英国人为之一振有了信心从衰退中走出来,今天英国的人均生产毛额差不多是超过了美国大概在欧洲排前列,这场战争的胜负应该是有着重大的作用,试想如果英国打输了,今天的英国会怎样? 人生的最大享受就是躲在被窝里在一个风高夜黑的冬天的晚上看《yes,prime minister》,同时等待着<yes, minister〉的到来,同时品尝法国红葡萄酒。
一月十二日 今天天气很好吗? 还好吧。
终于我知道了battle-for-wesnoth运行期的问题,不是什么资源文件的问题,(虽然我还是看到了错误信息却找不到。)是一个coding的错误,大概1.17版问题还比较多吧,同步的问题就很多,alex还提到说文件存储时候不是存当前状态而是存全部。有一个unit_animation的基类,派生出很多子类,然后code用dynamic_cast把基类强 制转换为子类,你想msdn里面关于c++的说明是运行期检查类型信息这种错误抛出异常,这就是问题,我不知道这个版本的window版编译肯定是被改动过,或者他们用的是vc200x之类的编译起比较聪明?总之今天费了我快一个小时才找到这个小错误很高兴!同时在constructor前的explicit局msdn解说是对于多个参数的constructor是meaningless因为不存在convertion-constructor的问题,我对此将信将疑,总之,我想gcc和vc6有很大的不同,非常的烦人。(据说在这一点上vc6编译速度胜过gcc,没有比较不敢说。)这两天一口气把<yes,minister〉都看完了现在开始反复看,其中的妙语连珠真是难以尽数,相比之下,日本的<别了,首相>感觉要捎差一点,毕竟文化的积淀还差不少,其中最后的部分恰好和<yes,minister〉开头部分不谋而合,一个新官上任的新首相总是哇哩哇啦将一同改革民主进步的措施,然后那些资深老练的公务员就微笑地告诉你说这些政策早已在执行了,哈哈这个下马威着实得厉害。
我个人觉得boost简直就是一团糟,里面定义了一大队的宏,居然硬要我使用lib,我找了半天才找到#pragma comment的lib定义,结果又有一大队问题,它倚赖zlib但是又把zlib改了什么,烦死了。我个人觉得这种开源大概没有什么人工作在windows平台上,所以人人都是些自以为是的傲慢的家伙。
一月十四日 今天天气很好吗? 还好吧。
另一个问题我搞错了,explicit对于constructor的修饰问题是conversion-constructor,并不是什么参数的conversion。比如A的constructor只带一个float的参数,那么你再用赋值A a=0.5的时候就会调用conversion constructor,如果你声明constructor用explicit的话就禁止了conversion。有意思的事如果你声明了两个constructor:explicit Conversion(long double f){} Conversion(int i){}然后你这么调用const long double l=4; Conversion con=l;你认为哪一个constructor会调用呢?当然是那个可能conversion的constructor就是参数是integer的那个。这里是关于type-cast的总结。
一月十五日 今天天气很好吗? 挺好的。
GDI的一个真理就是永远都按照状态机的方式来处理事件,每次都保存原来状态最后在恢复,比如画背景的时候也还是要考虑clientarea和screen的作别变换,虽然重复但是省掉了很多麻烦。画hexagon网格最好的办法是用循环画polygon。
我现在明白美军在伊拉克的部队加装薄装甲的原因了,RPG是一种射流武器就是说它能够穿透很厚的装甲,早期的非反应装甲不是他的对手,因为你增加装甲厚度赶不上RPG的威力这样不合算,但是这类武器有一个致命的缺点就是它只能在极短的距离起作用,比如在装甲表面爆炸产生的金属射流才具有穿透力,因此装甲车之类的薄装甲车辆有一个简单的应对办法,在装甲外面再加一个保护网让RPG在穿透防护网的时候爆炸,这有一点点原始的反应装甲味道,但是简单有效,所以悍马之类的薄装甲车辆也可以防御RPG了。
关于clienttoscreen我还是弄错了,这个坐标是针对全屏幕的,所以要知道clientarea的原点offset,我只能用嘴笨的办法把窗口的原点和这个clientarea的原点求差值,这个办法实在是泰国尴尬了,但是有更好的办法吗?所以就是getwindowrect和clienttoscreen结合起来求差。
一月十六日 今天天气很好吗?很好,今年的冬天非常的暖和,经常都是零下五度以上。
通过getwindowrect,clienttoscreen的综合得到clientarea的左上角坐标x实际上是边框的宽度,所以如果要完整显示图片宽度加上两倍x,高度加上一倍x。设定SetwindowPos如果用SWP_SHOWWINDOW实际上是发一个消息,因此你必须在这个函数调用前用setclasslong设定backgroundbrush。gdi里面有一系列的坐标变换可以尝试一下。
在诺曼底登陆的前夜,盟军的总指挥艾森豪威尔预先写下了一封登陆失败的辞职信,其实这样大规模的两栖登陆作战成败往往在伯仲之间,当时盟军哪怕掌握的完全的制空制海权登陆作战仍旧面临着很大的失败的危险,隆美尔和当时另一位指挥官好像是曼施泰因对于装甲部队的使用上有着很大的分歧,隆美尔主张在登陆的那一刻就要用优势的装甲部队把盟军赶下海去,曼施泰因则主张装甲部队靠后部署作为防守反击来使用,这样的分歧在日军防御硫磺岛的时候也发生过,就是在盟军这样强大的海空力量下有多大把握打赢反登陆的问题,所以你可以看作是乐观主义和保守主义之争,在那样的情况下反登陆时要取得全胜还是拖延等待援军或者给敌人于最大限度打击的问题,希特勒过于相信从东线调集部队的机动力了,当然那个时候德军捉襟见肘这也是不得已的办法。在硫磺岛防御的目的成为拖延因为在内无粮草外无救兵的情况下胜利是不可能的,唯一能做的事让登陆方付出最大的时间与伤亡代价,那么按照同样的思想曼施泰因的想法就是固守待援,隆美尔则更加的富于赌博心理,结果希特勒最终来了一个折中,一部分坦克部队靠前一部分坦克部队靠后,这实在是最大的问题,两种策略实际上都不能够贯彻,更糟糕的是希特勒开始嗅到他的将军们正企图把他搞下台,在诺曼底登陆的一个月后就发生了那次著名的炸弹暗杀行动,所以当时希特勒坚决不把装甲部队的指挥权交给隆美尔而是一定要等到登陆开始是有原因的,但是这正好更加映证了德国的将军们开始认为希特勒成为他们夺取胜利的绊脚石,到底孰因孰果实在是一个很难评价的事情。总之盟军的成功是建立在巨大的优势前提下,德军的失败并非完全是因为指挥的无能,人力有时有穷奇迹岂能常有?
一月十八日 今天天气很好吗?很好, 但是风很大。
头脑中始终有一些误区,比如dc的brush和bitmap的关系,bitmap是dc的存贮空间,所以select了就可以存了,同时bitmap也是brush的存储空间,可以创建patternbrush,但是归根结底两者并无联系。这正如dc的brush和backgroundbrush一样风马牛不相及。回忆了一下关于hexagon的坐标问题,为什么会导致两个晚上的时间呢?第一是头脑不清楚,第二是问题的复杂。比如有clientarea和windowarea的区别,其次坐标原点在左上的时候直线方程的斜率就和习惯不一样了,然后就是一个白痴的小问题,我为了节省一个变量就自然地把row/2的整数除法结果来使用,就是说row=2或者3的时候应该是一样的,后来忘记了结果变成了row*value/2意义完全不一样了,这是一个教训,不应该这样图省事,多声明一个变量halfRow=row/2要好得多!切记。
《art school confidential》是一部很好的片子,让你想到了小时候看《读者文摘》理解选的外国小说《他是死了还是活着》,所谓的艺术家大都不能在生前得到肯定,所以四个画家抽签决定谁要死去,所谓的死当然是假死,就是向外宣布他死了然后他生前的作品就可以买一个好价钱了,这个从投资的角度看是对的,因为一个人死了自然所有的作品都是绝版了,只能少不能多了,所以价钱就上去了,于是那个抽签的画家就只好一辈子隐姓埋名了,当然钱不回比另外三个少可是不能再“活着了”。电影里面的艺术家也是如此,成了杀人犯关进了监狱就出名了。其中的所谓格言也不错,对于艺术的定义大概是人类的一种本能就是为了吸引交配的一种形式,而所谓的“真正的”艺术家不是那种天天在《时代》杂志露面天天考虑餐后演讲的名人,应该是一日三餐食不果腹天天生活在narcotic moment of creative bliss,当然这些画家为了创作的灵感无所不用其极,酒精毒品女人等等,偶尔地杀几个人也是获得灵感的极好方式。
一月十九日 今天天气很好吗?很好 ,但是风很大。
这就是gdi麻烦的地方,我设定了windoworg,但是随后又被人改了回去,所以这个办法不可靠。同时getBkColor也得到白色即便你已经设定了bkbrush,这是合理的吧,大概就是一个default值。使用TextOut你设定SetTextColor,SetBkColor然后可以使用SetBkMode设定transparent就可以写透明字了,我猜想这个好似rop2的binary-raster的方法一样吧(胡说,应该是使用hollow_brush而已吧。)一个非常简单的概念有耗费了不少时间,如果是做worldtransformation的话,你可以用bitblt,但是设定SetGraphicsMode和SetWorldTransform的时候你是针对destinationDC的,我却“逻辑上”认为是针对sourceDC,到底什么是简单的“逻辑”呢?看来要么我没逻辑,要么全世界都没逻辑,当然是前者了。还有一个逻辑问题,使用getwindowdc获得的dc并不像我想象的仅仅是一个指针或者引用之类的(本质上是kernelobject表里的index),肯定是由某种lock机制,另一方面在强调一下,gdi还是类似于状态机的你针对当前dc的所有操作释放后都失效了,这是好事,但也增加了一下麻烦,比如原本多重图性操作效果可能不一定是叠加的吧?(有点糊涂了)不过bitmap旋转式很好的一件事!只是我必须得给我的sprite传递dc而不是hwnd,因为worldtransform设定是针对当前dc的。让人百思不得其解的是旋转后的bitmap的坐标是怎样的呢?CombineTransform不是很正确,因为他大概就实矩阵相乘所以你自己要设定好矩阵的default值,msdn说的都不算数,比如translate说出edx,edy都不用那肯定是不行的,你必须设定default可是就是这样还是不大对。比如translate+rotate结果却仅仅是translate,可能bitblt还是有些限制吧。这部分非常的糟糕,资料太少。
一月二十日 今天天气很好吗?很好 。
基本常识:一个bitmap如果被一个dc使用就不能再被select了,这是一个我总是在犯的错误,那么有什么bitmap复制的快速方法呢?GetDeviceGammaRamp我猜想适用于校正gamma,应该使用一系列的rgb值来描述颜色变化吧?(什么时候才会有这种应用?艺术家的眼睛?)
超级白吃的问题!我的vc6是n多年前从国内带来的盗版,(这也是我唯一正在使用的盗版软件吧?哈哈)那么为什么很多windowsAPI我的编译器都说没定义呢?这个问题很简单就是版本的问题,在windows.h的宏里面还是WINVER0X0400那当然有问题了!我当年大概还是在用win98的年代就有了这一个盗版吧?这个问题大概是今天使用.net的人不会有的问题,或者vc6应该自己在安装的时候就检测window版本:GetVersionEx来改写那个宏定义,难道是因为盗版的缘故他不敢检验或者删了这一段?(啊,现在才明白,故事还很长,因为那个vc6版本是一个类似于试用版的东西,大概是针对win98之类的,因此不光是头文件,连同lib文件都是一致的,所以简单更改这个是不行的!user32.lib之类的都不全。)关于bitblt的worldtransform有一个问题就是它是以原点为圆心的旋转,所以应该要做两次变换,试验一下吧。刚才玩得有一点点心跳,说来不值一提只不过我从来没有这么做过,所谓编译都不过是.h与.lib的游戏,操作系统当前的dll是可能千变万化的,比如win98,win2k,winxp的dll可能都不同了,那么当时的编译器vc6可能只能适应当时的dll,而是用老版本的.lib.h,那么PLATFORMSDK照理说应该使编译器无关的,可是我觉得微软的platformsdk2003并非如此,可能我还是要做什么样的修正才行,这也是为什么他建议每次运行都要设定环境变量,这个实在是很烦的事情。总之,我目前简单从platformsdk替换了我的vc6的user32.lib,把我的vc6的include的windows.h的winver改为0x500,于是就可以EnumDisplayDevices发现我的显卡有两个display_device,还有一个netmeeting的虚拟的mirror_driver之类的。很好。TranslateBitmapBits看起来很有用的样子,以后试验一下吧。GetDCOrgEx不是我想象的样子,不知道是什么东西,现在有好几个origin我不明白,一个是window的,一个viewport,一个clientarea,从world-->page-->device-->physical这一系列的变换的坐标分别是什么呢?要记住使用float类型的三角函数!!sinf, cosf,这种低级错误!OK,证实了,combinetransform和数学上的定义一样的,你可以定义变换的次序,比如我要让sprite转身,那么你要定义先移回原点在旋转,就是自转,反之为公转,当然我所不知道的事情是bitblt必须是从原点到原点,就是两个dc都是从原点开始,这是我一直出错的原因!!!
一月二十一日 今天天气很好吗?很好 。
CreateColorTransform不是我所想象的用法,完全没有关系。做bitblt的时候使用自身的dc仅仅靠更换bitmap用srccopy是无效的,这个不知道为什么也许是因为自己不能拷贝自己吧?使用createbitmap有一个问题就是微软的bitmap是合别人的不一样的,是上下颠倒的(当然这取决于你怎么看上下的问题),但是从数据的角度看,你是从数组的头获得图像左下角的部分,所以(是这样吗?还是因为window坐标原点在左下上角所以先从左上角画图?)总之,要用createDIBitmap才行。使用GetDIBits能够取出你希望的格式,这个要做为alphablend的数据还要在处理,实在想不出使用jpg的任何好处,为什么大家不使用png?这真是奇怪的事情,也许图性公司内部的确都是使用png之类的,只是我不知道而已。(或者大家早就在使用32bitjpg也是可能的。)哈哈,天大的笑话,我没耐心,读了上句就不想看下一句,大概白吃都会想到不应该所有的alphablending都是perpixel的就是说如果没有alpha-channel也是可以做alphablending的,这就是常识,所以api不可能设计的那么傻,问题是msdn的描述让我感觉很简陋,为什么一定要premultiply alpha呢?仅仅是因为处于系统处理速度的考虑吗?也许是有道理的,如果一个api非常的慢那么很可能根本就不开放,这大概就是原因吧?再重复一遍常识:bit操作不可替代算术操作,尽管有某些算术操作可以用bit操作来实现,比如与零的一系列操作(有意义吗?)这也就是为什么单单使用bitblt始终无法实现某些效果的原因,除非适用alphablend,这个应该是离散数学的问题吧?什么是canonical的operation?也许就是不可替代,(有交集吗?应该没有,也许也有,不过这个是定义的问题,我们可以把一切与零进行的操作不定义为算术运算,而是逻辑运算,于是就没有交集了。)这个让我想起来在古巴度假的日子里我把ternary-raster-operation的256种运算统统尝试了一下,我想知道的是这些定义是否是有某种数学原理,比如这些运算span所有的其他运算通过他们的组合?(不过也许更准确的说这是个无意义的问题,本来就是canonical的运算来组合,只不过这256是目前大家常用的而已。)因此这是个无意义的问题。
这个实在是太初级了,我现在才发现getWindowDC和GetDC的区别,一个是clientarea,我费了很大劲去变来变去原来都是因为这个关系!bitblt最常见的错误是我的width,height不对,实际上能够获得dc得数量很大程度上取决于内存的多少,当然win98/95据说只有5个,因此我的函数迪归调用不断获得dc应该问题不大,当然这种做法应该避免。如果要让sprite研中心旋转,destDC的x=-bmwidth/2,y=-bmheight/2,srcDC的x=y=0;translate的偏移还是从左上角到clientarea的原点,(这一点似乎一开始比较的出乎我的意料但是想一下就明白了,左上角的偏移量),
一月二十二日 今天天气很好吗? 不是吧?
需要纠正一个错误认识,当位图作为brush的时候填充会按照module原则重复,但是bitblt却是严格按照source位图的大小限制,因此当dest比src来的大的画就是相当于nullbrush的空,因此你不能用这个来画一个mirrorimage,只能用xform的transform来使用reflect。(我不知道我从那里得到的这种错误印象,也许是因为我自己一列一列的画得到的印象吧?)我现在刚刚学到region发现我的很多工作可以交给gdi去做,比如我的hexagon如果用createpolygonrgn的话我就不用烦心point是否在hex内的问题了,这个是标准的cg算法,就是数有多少次和boundary相交,这个在scanline里面有两种模式:alternate,winding,一个是boundary无方向,一个有方向,所以,重新改写!!!这就是hex的简单的办法!!!这也就是我怀疑的简单的办法,battleforwesnoth因为要跨平台所以只能自己去写,我粗略看了一下,他的办法不会比我的简单多少,当然他还要返回最近的和次最近的hex,这一点我没有做,不过这个并不复杂,总之这不是什么很复杂的东西,但是很不容易写对,遇到九组组和判断出错的机会非常的大。msdn里面有些是明显的程序员写作风格,忽略细节忘记参数。createcompatibleDC的时候会自带一个默认的1x1的monochrome的bitmap。BeginPaint我现在才开始明白它主要是用来画一个path的,这个很有用,可以做clip。SetWindowRgn就是你所需要的全部!
《The Cat People》是一部老版的同名电影,就是八十年代末重拍的那部片子,1942年代美国的中产阶级生活已经远远超过我们的想象了,生活质量和现在相差无几,不过唯一让人讨厌的事男男女女都抽烟,尤其是在任何地方抽烟。
Region非常的强大!我想我现在才开始接触一些gdi的核心的部分,就是clip,path之类,一条光明的道路在眼前展现 。终于找到了TrackPopupMenuEx。回来再说吧。
重新学习advancedrendering&animation的讲座才开始明白很多,原来在本科的graphics里只是了解一个名词的并不真正明白,现在才开始明白一点,对于数学的要求其实还是有一些的,比如c0,c1,c2 continuety之类的概念在calculus里面似乎不大提,或者使用另一个term,或者我根本就忘了,总之现在明白为什么在飞机汽车设计中那么重要,因为这些都是流体力学里要求的,作为工具graphic必须要满足他们。回顾这些经典理论你也许会觉得没什么了不起,可是科学就是这么积累的,作为全人类也不过就像一个个体一样一点点地积累而来的,所以从这点来看我还有太多太多的空白了。学一点是一点吧。 我一直对于menu有一个理解到误区,从用户的使用角度来理解大概看过计算机的就不干说不知道什么是menu,但是从程序的角度来看实在是不简单,今天明白了一点,createpopupmenu+trackpopupmenuex就是目前我需要的。
一月二十三日 今天天气很好吗? 下雪了
clipping和path还有region是gdi的最核心,我玩了快一个月才刚刚开始接触这个,的确windows的核心是消息,gdi是windows的灵魂,目前应该说windows是世界上最复杂的软件系统,“复杂”有很多的理解,大型计算机也许也复杂但是针对的使用者都是专业程序元,基本上很多东西都没有,唯独windows是什么都要兼顾。今天有一个很搞笑得故事,RGNDATA和BITMAPINFO类似的都定义了一个类似的char buf[1]或者RGBQUAD quad[1]的东西,我从一开始就百思不得其解,既然是不定长又何必要用这么个1长度的数组?结果我也没办法当参数取传入来获得,也不能赋值自己建造,究竟微软的程序员当初是怎么想的?如果是考虑size要alignment与dword着我还能理解,但是实际上也不是。使用getRgndata就更搞笑了,我从一开始阅读msdn就感觉这个玩意可能要call两次,赶紧google了一下,果然第一次长度和指针都用空来获得实际长度,然后分配内存再call一遍,于是从这一点才能明白当初某些微软程序员是怎样思考的,这一类结构的设计很粗糙有可能就是只让输出使用的,或者标准的用法就是treat as byte stream,then allocate memory and then you use pointer。也许是故意不把char buf[1]声明称char* buf是希望使用者惊醒线性内存分配的提示,让你不会犯错误,我想这大概就是原因吧!ExtSelectClipRgn总是有毛病,第二次就只能得到null-region了,不明白,GetWindowRgn也有一个dirty-trick就是普通的classic-window原本是没有windowregion的,所以你会得到error,这实在是ugly,所以现在一旦遇到莫名其妙的问题,我的第一反应是赶紧google,否则你会为这些奇奇怪怪的问题浪费不知道多少时间。rgn是一个对象,一定要记住创建,使用ExtCreateRegion创建的是变换的region,和坐标系的变换完全无关!记住不要double变换,可以想象是几何体的变换,这不属于整个坐标系的变换。CombineRgn是正确的,现在的问题是extSelectClipRgn为什么不对呢? 吃完午饭在实验似乎是对的,GDI时常让我有一种不稳定的感觉,也许是我的电脑中了木马之类的,我有很强的感觉我的电脑被人装了hook,很多时候键盘按下去反应时间很长,哎,这个世道实在太乱了。使用extSelectClipRgn的时候脑子里面的集合操作的“diff”有顺序关系,xor则是diff的绝对值(和顺序无关)。
一月二十四日 今天天气很好吗? 不下雪了
我完全的忘记了上个月我在干些什么:
bsub -n 32 -o binary32.txt -ext "SLURM[nodes=32;exclude=n14]" mpirun -srun ./binarySwapText.exe
我有时候会被蒙蔽因为我不够坚定,比如你运行p个process的时候你想让每个process产生不同的随机数,通常我们使用srand(time(0))就足够了,可是在cluster上为什么我看到的时一样的结果呢?根据这样的现象我居然开始怀疑我运行的是否为多个版本,恰好我随手运行bsub -n 8 mpirun ./myGatherTest.exe系统很懒惰的就把那个孔显得node的8个smp的内核分配给我了,这样我看到的当然就是在同一个node上的八个进程,为什么随机数也是一样的呢?你会不会像我一样的开始怀疑1+1=2?很简单的事我对于这些庞然大物还缺少敬意,事实上cluster很大的一个技术在于始终同步上,这一点是系统级的,我侧试了一下几乎精确到毫秒级,这是非常非常可观的,考虑到我的测试方法本身就有局限(就是简单的gettimeofday),可能比这个还要高!这是非常不容易的技术!所以time(0)这种秒级的数字当然是一样的,(就算毫秒也是一样)。这就是cluster的技术所在!难怪人家要卖几百万加币!
再次强调一下,lsf与slurm没有什么“空间”上的差别,所谓partition是一种概念,就是说bsub之类的shell都是工作在这两者之上的提供了“调度”“容错”等等的功能。等等,我的记忆好像消失了,我才想起来我是使用remote-graphic的shell所以他事先就去分配了运行的资源,所以这个和slurm,lsf无关。mpi_allgather的使用很简单,就是sendbuf实际上和recvbuf可以无关的,但是一般人都会用一个长buf,然后把sendbuf指向自己的block(就是自己的index所在的block)这样就collect了。gdi+里面有一个神奇的“color-transformation”真是闻所未闻!
电影频道的最大好处与坏处就是他不停地重播同一部电影,每次我看《art school confidential》我都要大笑不止,如果说艺术家大部分是疯子的话,学艺术的女生就是疯子中的疯子,而疯子在英语里面有很多的词都有细微的差别,crazy,mad,insane,lunatic,mental disorder,nut,maniac,hypersexual也可以说是一种疯狂吧?frenzy?影片里面有很多东西你不一定能够真正明白,也许本来就是导演留给观众的,比如男主角的老师sandy到底是一个欺世盗名的伪学者,还是一个有些真知灼见但是大部分时候郁郁不得志只能沦落到一个cocksucking的失败事例?女主角对男主角的所谓吸引是否真的入她的lesbian伙伴所说的仅仅是fallinlovewith every talented painter?或者这正是导演所谓借学生的最说出来的主题,艺术原本就是这种弥补attract mating不足的手段,或者因此而导致的情绪宣泄,我想后者大概更符合弗洛伊德的理论。中国传统文化一方面肯定食色性也,另一方面又是重要把他们肯定的某些形式从这一框架里剥离出来,这在我看来真正是pathetic。
ExtSelectClipRgn的返回在跟踪情况下不会正确,因为当时的窗口并不显示,所以正常情况下都是complexregion的返回值变成了nullregion。
The SetMetaRgn function intersects the current clipping region for the specified device context with the current metaregion and saves the combined region as the new metaregion for the specified device context. The clipping region is reset to a null region.
这个也许揭示了为什么有的时候你的clip-region是一个nullregion。使用saveDC,restoreDC可以达到类似于opengl的pushmatrix,popmatrix的效果。
《decoy2》这种搞笑得电影绝对的让人无话可说,college-hot-chicks are all hypersexual aliens。而识别这些blonde alien的办法就是看她们是否有bellybutton,或者是否总是说hot。
一月二十五日 今天天气很好吗?不下雪了
关于HRGN还是要转变一个观念,就是在大多数函数里面必须先创建,比如combineRgn里面不能只用一个handle来承接返回的rgn,我想系统会自己释放内存的,(就是rgndata里面的那个buf),听说GDI+里面有浮点数的坐标这真是一个好消息否则gdi里面anti-aliasing带来的问题实在太麻烦了,大部分操作如果你自己一个像素一个像素的变换一定很难看的,因为锯齿问题太严重了。 使用同心圆依次作为cliprgn并结合缩放来画ripple效果或者是fisheye效果都不太理想,因为太慢了,这里的原因是我不能够把bitmap作为brush来fillrgn因为brush并不能缩放,必须用bitblt结合cliprgn一次次地画,结果特效变成了动画,这实在是搞笑,另一个简单的途径但是我一直逃避,就是最直接的pixel操作,因为我有过直接操作bitmap缩放无法完美地rasterization的问题,就是浮点与整数转换填充的问题,这就是我为什么说听到gdi+支持浮点坐标是个好消息的原因。坐标变换里面比较麻烦的事情是rgn和hdc的变换的同步,比如同样一个xform的transform你可以使用setworldtransform来变换hdc的坐标系,但是要变换rgn要先获得rgndata在用extcreatergn来创建,那么做后你画的时候就可以在world的原点了,如果rgn不牵涉到变形,比如仅仅作为clip来使用那么使用offsetrgn更加的方便。总之,坐标变换我总是搞错,每次都要试验好几次才明白,这是一个比较痛苦的地方。
放大镜使用scale,bitblt加上cliprgn,但是效率还是不高,如果使用mousemove事件的话图像有比较大的话flicker比较严重。看了一下windows自带的magnifier我觉得功能差别还是挺大的,因为那个是另外开一个窗口仅仅把screen的图像按照固定倍数放大一次然后进行平移,而我这个却因为不断要在原图上修改效率当然差很远了,那么怎样改呢?
Stanly Kubrick真是一个超级天才!他的电影总是引起巨大的争议,然后十年后成为不朽的经典载入史册。
一月二十六日 今天天气很好吗? 很好,出太阳了
用像素变换的办法作了一个fisheye的特效,效果还可以但是效率和我估计的一样不行,我猜想原因在于getpixel,setpixel这种api是非常的昂贵的,也许直接把bitmap拷贝到内存操作会好一点,不过这很值得怀疑,另一个就是因为我要不停地在鼠标移动的时候把变换的部分抹掉bitblt的操作也是很昂贵的。今天另一个收获就是我怀疑extselectcliprgn这样的函数不会自己清楚状态,就是说releasedc并不会为你恢复原来的cliprgn,这是我的猜想,总之gdi有不少的毛病,至少我经常发现有些莫名其妙的问题,比如第二次运行的时候现象就消失了,我猜想一定是我修改了什么状态出错以后系统没有及时恢复,要么就是我电脑里的木马太多了,昨天下载了一个免费的avast查出来一大队的木马,这个在我的意料中,只是我实在是懒得重装系统,我有些硬件的驱动可能找不到了吧?这实在是麻烦的事情,(又一个木马居然是藏在我的声卡应用程序里,难怪我的声卡总是出毛病?)所以,总而言之,如果extselectcliprgn然后就使用null在恢复原来状态,这样也许就没有毛病了。
一月二十七日 今天天气很好吗? 很好,出太阳了
用alphablend函数又一个很好的应用就是增亮背景,这个是我一直想要的效果,用bitblt无论如何做不到,但是这个函数又一个小问题,就是如果srcDC和destDC是同一个的时候你可以把不同部分的图像进行混合,但是src与dest的部分不得有重叠部分,在我发现这个问题之后重读alphablend的说明发现这已经提到了,哈哈我没有耐心去读而已。所谓的增强要纠正一个我的误区,我始终有一种错误的想法就是按照颜色值乘一个系数,这个实际上是做不到的,用同样的位图作任何alphablending都是原图,如果你使用黑色刷子倒是可以按比例调暗,但是有什么样的办法可以按比例调亮呢?我觉得仅仅依靠alphablending是做不到的,用白板能做到的是所有颜色都增加一个常数,这个也许就是gamma增强色吧?但是使用过就知道这是有一点失真的,当然如果预处理的时候按比例硬要造出一系列的按像素亮度变化的alpha当然是可以的,不过这有一点点地假吧?试验一下。ExtFloodFill原来是这样子的,很好很好,大概就是学图形课里面的flood-algorithm吧?再提醒一个超级简单白吃的问题,fopen如果不用"rb"模式读单个byte可能会失败,大概是非字符的都不对吧?另外png是使用big-endian的,所以要记住啊。 折腾了一天我实在是搞不懂,StretchDIBits为什么不能够转化jpeg和png格式呢?难道是因为设备不支持?ExtEscape返回都是0按照msdn的说法是没有实现,这不是搞笑吗?可是并没有报错啊?oleloadpicture不能使用png格式,真是倒霉。
一月二十八日 今天天气很好吗? 很好,出太阳了
如果出现link2001的问题,大多数时候是这样的,你使用的事dll,所以需要multi-thread-dll不能够用静态库比如libcmt.lib之类的,这其中的原因我还是不十分清楚,今天和昨天又花了差不多一天一夜在编译libpng的库,说起来ijl和他非常的相像,基本上是windows平台上的噩梦,因为windows平台的程序员一般比较天真以为这个世界上都是和自己一样的傻瓜,同时window上制作dll实在是要比linux麻烦不少,我今天大概有 犯了一个错误吧,就是我已开始要把库编译成静态库,然后链接到我的程序里,因为libpng用的是纯粹的c,就是文件后缀明用的是.c这样vc就按照c编译,而我的project是c++结果链接的时候调用约定不是_cdcl我当然要用extern "C"来改库的头文件,结果库有不答应了,因为我使用的是共同的头文件,结果又要编译完了改回去,我当时并没有清楚的意识脑子一团浆糊,过了很久才明白过来,干脆全部强制用/TP的c++编译省掉了混合编译的麻烦,这实在是头疼的事情,我差不多把所有的时间都花在了编译链接的问题上了,至于说png转换为DIB的毛病我还没来得及看呢,这就是痛苦的地方,明明是图形的问题却在编译上画了这么多的时间。debug宏命令实在是痛苦的事情,我只好用#pragma message("my message")这样原始的办法一块一块地找,非常的麻烦。费了浩大的劲才找到了正确的macro的组合产生dll的输出,注意如果dll没有dllexport定义的话是没有输出lib的,这是个常识。 找了好久才找到,如果定义宏的时候,比如把函数返回类型,参数等等用一个结构来包装,那么这很可能需要一个通用的宏,结果我忘记了这个宏的变量还包含一对挂号,结果结成了双挂号,我找了好半天。ijl与libpng都喜欢这么干。
msdn的话不可全信,比如SetDIBitsToDevice的src坐标说是左下角的坐标,结果我被折磨了很久都看不到图像,去看别人的源代码,应该给的是左上角,当然图像是翻转180度的,于是你在解压缩pgn格式的时候要先进行上下处理,这里面转了好几个弯子,我有些想不清楚,也许msdn说的是对的,但是讲的不太清楚,总之,花了浩大的力气才把人家的libpng制作成了dll供以后使用,这个工作其实也不轻松吧,因为这个library和ijl一样光是看懂使用就有大段大段的代码,难怪这些年来直接使用png与jpeg的很少,jpeg大部分是用intel的库,有些人用oleloadpicture,还有些就是使用从ijl小小修改的所谓面向对象的库,比如有个什么image的玩意,干的和我差不了多少,(实际上我怀疑连intel的都是从ijl改来得。)对于png那简直就更少办法了,绝大多数人都使用gdi+来做,但是我实在是讨厌那个要已开始初始化的gdi+,所以坚决不用。在强调一个重复了n多遍的问题,SetDIBitsToDevice得参数看似两个,一个是bitmapinfo,一个是具体的bitmap-bits可是不要被他骗了!实际上这个是“线性”分配的内存,就是说bitmapinfo后边就是数据,或者是index,或者是rgb,你不要以为可以分开来。(这是不对的,两个是可以无关的,哈哈又犯了一个主管的错!)还有一件事,就算你在头文件里面有那个dllimport,dllexport的宏,可是不知道什么原因我居然还要在声明一个extern"C",这似乎有问题。
还有一件事我不理解,png的格式里面,就是IHDR里面的bitdepth我的理解就是bpp,可是结果总是8,难道我理解错了?简单读了一下,bitdepth有别的用途,就是可以作为gama的计算,实际上bpp并不一定有意义,因为dib根本就不care反正是truecolor。所以,这是我的误区。
看电视里现场直播的布什总统在国会的演讲,整个讲演过程布什总统没有讲稿,全场每隔两三分钟就全体起立鼓掌,演说内容涵盖国内国际的方方面面,布什总统讲的激昂流畅,令人十分佩服,我想这里面没有什么空话套话,因为你肯定记不住的,就凭着一点我觉得共产党在国一百年也没有办法找出一条让人才脱颖而出的办法,国会里有一两个议员在打瞌睡结果被记者拍到了,这就是民主国家的新闻的威力,你做大官有如坐针毡,不想中国的官员都是老爷太爷。 几乎可以肯定的是SetDIBitsToDevice不能转化png与jpeg,不知道为什么msdn这么说?
一月二十九日 今天天气很好吗? 很好,出太阳了
gamma矫正据说应该放在系统颜色部分去做,这样节省了大量操作,png的gamma就是先把文件颜色变换到0-1之间,然后计算gamma变换,在gAMA存储里面gamma值是乘过100000的,所以,sample = integer_sample/(2^bitdepth-1)变换到0-1,sample = light_out^(gamma/100000)还有一个重要的事实我忘记了,png里面的颜色是bgr,记得要转换,我费了很久才明白,实在是有一点点让人泄气。非常的令人头疼,dib如果用SetDIBitsToDevice的时候,你要事先把png的上下颠倒,bgr->rgb并作gamma矫正,但是如果你把这样的bitmap作为hbitmap的bits你得的又是一个上下颠倒的图,因为hbitmap不是DIB而是DDB,这怎么办呢?注意我使用createbitmap来制作的。终于解决了,使用StretchBlt有两点注意,src的左上角是0,h,高度是-h,哈哈。同时明白了一个误区,bitdepth跟bpp不同,他指的是一个channel的,所以rgb要乘以三。
微软真是混帐,不,应该说是intel的那帮人比较的混帐,搞出一个什么little-endian,我都已经被搅得头昏脑涨了。在bitmapinfo里的colortable是一个个的rgbquad,{bgra},但是微软自己定义的颜色colorref却是0x00bbggrr,现在你该明白问题了吧,其中的rgb顺序颠倒了,(注意是32位取址模式下,按照little-endian的结构,rgbquad在内存里是“实际的顺序”是argb,而colorref的实际顺序是rrggbb00,我实在不懂为什么当初要这样定义?)所以,问题处在bitmapinfo的colortable定义的是bgra的顺序使得png必须这样转换rgb->bgra。
还有另一条途径创建这种bitmap,createDIBitmap用于把这种dib变为ddb,这个就不再需要使用stretchblt了。 折磨了很久很久我才明白我的白痴,什么样的alphablending可以成为透明色?不能想当然!如果blendfunction里的constantalpha设定为不用0xff,那么alphablend是按照每一pixel的alpha作blend,dest=src+(1-alpha)dest,那么请问什么情况下才是透明色?仅仅透过改变alpha是永远做不到纯透明的,一定要把src变为纯黑呀!这是制作sprite的唯一方法,可是我有种错觉以为有了alpha通道就可以在不破坏原图的基础上做到sprite效果,这是不可能的。(这种问题是否太白痴了?)png可以有alpha,于是写了一个小小的函数传递一个backgroundcolor去修改颜色制作sprite,这个要比传统的执作mask的办法好一点点,就是指需要call一次alphablend函数,而不需要两次bitblt,但是bitblt是纯粹的bit操作应该要比alphablend的src_over操作来得快一些。
一月三十日 今天天气很好吗? 风很大
gamma矫正非常的重要,尤其是screen-gamma的差别非常大,这个大概是各种显示系统的问题,比如pc一般是2.2,(在libpng的帮助里有一些基本的介绍),createDIBitmap的初始化部分可以现象是用户传进的数据,必须用户自己释放,只是作为初始化而已,我为了确信作了一个简单的测试。这个函数可以保证你创建的hbitmap是一个windows可以正确使用的handle,所以很有用,当然前提是你必须正确地读取png,还是要记住,上下颠倒,rgb顺序颠倒,gamma矫正,(backgroundcolor我觉得完全没有什么用,也不知道怎样用?)
一月三十日 今天天气很好吗?风很大
整整一天时间我被自己的错误所惩罚着,我不知道为什么我会得出昨天关于gamma矫正的结论,难道说我有幻觉?gamma矫正的确需要但是你可以交给libpng去做,比如使用png_set_gamma函数里面传入screen的gamma2.2你不需要再次自己去计算gamma,我也许是因为变异环境复杂导致的错觉或者是代码版本错误的问题,总之,今天画了一天的时间学到了一个简单的事实:如果你不按照png的建议去该系统的gamma-ramp那么就只好使用这种gamma校正的方式,同时记住你得原始数据就改变了,这样从windows系统读取getdibits的时候就是现成的数据,不需要进行rgb顺序转化,但是你还是需要上下颠倒。理所当然的你的png很可能是没有gamma的。我感到不太理解的就是如果png需要gamma的时候除了file-gamma之外你还需要screen-gamma,而当png根本没有gamma的时候你却不需要screen-gamma,(我试图解释,原因是因为我loading的时候已经根据pc的gamma作了矫正2.2于是存储文件的时候,是适合pc的png,如果在mac显示问题就又大了,这实在是一个麻烦的问题,除非我loading的时候不改变screen-gamma而是改变系统的显示的gamma就是保存原来的文件属性,这样存储文件的时候就不会有screen-gamma的成分在里面了,在mac显示的时候只要加上mac的gamma就可以了。)但是这个实在是太罗嗦了,为了一幅图片去改变系统的gamma实在是不可能的事情,所以,我现在明白了如果你要写一个游戏在window,mac上都运行正确或者用两套图片文件,或者在游戏开始的时候进行必要的系统gamma调整,这实在是。。。 我想我终于可以吃晚饭了,我翻了一个异常低级的错误然后为此花了好几个小时debug,很经常的,我感觉我很可能实在是太差了。比如从rbg扩展到abgr我的code是正确的,可是我忘了如果从rgba到abgr我的code就是错的,上一次我被问到做swap我就脑子一片空白的这么做,现在我有这么干了,实在无话可说。(png用的大概是network-order,所以是rbg,rbga,windows用的是little-endian,所以是abgr,bgr)暂时放一个备份吧,我的实验太乱了。
一月三十一日 今天天气很好吗? 阴天吧。
感觉比较混乱,我比较讨厌libpng必须额外加一个zlib,不是我对于他有什么意见,都是开源的跨平台的都挺好的,不过我想简单一点做成一个dll,试验了半天比较的没有主意,zlib的macro写得比较fancy,参数写得很奇怪也许是为了不同调用约定压栈的缘故吧?总之没找到合适的宏,最后只好先把它编译成静态库,又用了一个它的ZLIB_INTERNAL的宏才成功,顺便记忆一下libpng的编译的宏,省得以后又要用#pragma message来找半天:这个东西原本不值一提,对于c语言的专家也许是小菜一叠不过对于我却非了不少功夫才找到,PNG_BUILD_DLL,PNG_NO_MODULEDEF,PNG_DLL,另外pnglib里面有一个png_set_bgr可以声调我自己转换的麻烦,效率也许会更高一些吧。
《3:10 To Yuma》是一部神奇的电影,大多数中国人是很难理解的,反正我觉得作为中国文化熏陶下非常难以接受,当然如果看过《red river》之类的也许稍微容易些,所谓的信仰是一件非常难得事情,一件毫无所谓“理性”的东西,比如你相信一件事你基本上不需要理由,也基本上不去考虑什么现实的后果,从生物进化的角度看这是一个覆灭种族的特征,注定是要被淘汰的,可是这确实是一件非常珍贵的东西,你要牺牲很多。 你知道最白痴弱智的电影是什么吗?《house of dead2》就是《僵尸战记2》名字是我自己翻译的,大概你可以想象很多人的脑子大概比大猩猩还差不少。
二月三日 今天天气很好吗? 记不清了。
感觉精神不好,洗衣服的工程又推迟了,因为我又找到了一件替换的衣服。地图的算法远远比我想想的复杂,实际上我已开始完全没有意识到这是有关地图的算法,我以为简单的flood算法就够了,可是。。。如果我需要的仅仅是rgn是否需要silouette?我想不清楚,下午我以为convex-hull就可以了,后来吃完晚饭才发现地图比convexhull复杂的多,最后我得到了一个不准确的结果,有很多噪音,首先小的rgn丢失了,其次有很多尖角的rgn有多出来了,输入美国地图我得到了230个rgn,比美国的州多出了将近两倍,当然本来有些地图边缘不规则多出来了,大的州看上去是对的,丢了夏威夷等小岛,还有就是四色问题,着色是一个很复杂的问题,对于下一步计算rgn之间的相邻关系是在是一个很不好解决的问题,我当然可以使用getrgndata从变原来着手可使微软的rgn的定义可能和我想的不一样,边缘的点是否准确十个问题,而且计算量也不小,总之算法不很清楚。更糟糕的事我心情格外的不好,想起了很多很多,关于ll也许。。。早上看了一部<china syndrome>的老电影,这个名字和中国一点关系都没有,是一个核技术的名词,觉得这个世界实在是很不安全,假如一两个核电站的操作员突然有什么离奇的想法的话这个地球可能就成为地狱了。<election〉这部电影也很有意思,印象深刻的事美国的高中生的学生会主席的竞选的认真程度超过了中国国家主席的竞选,当然难度也超过了中国任何一级官员的选举,如果美国一个普通高中学校都是这样的话,你可以想象这两个国家的人的差别有多么大,社会发展到一定程度对于人的需求往往不在需要传统上的所谓“知识”,比如在中国的传统教育中心算能力的要求很高,这对于很多智力发展也许是对的,但是这是一个open-question,如果计算器可以做的工作是否还需要人去做?我想更多的时候要求的是怎样使用计算器而不是把人变成计算器。当然很多人不同意这一点,这也不奇怪,我也不是完全否定它们,总之这个问题不那么简单。
msdn说的不准,也许是因为我得版本太旧或者xp改掉了什么,GetSystemPaletteEntries返回值总是0,同时你想用null指针获得palette的个数也不会成功,同样适用GetDeviceCaps使用sizepalette也不行,总之我只好数了一下,是10个,记住就好了。此外想了半个晚上我猜想我找到了微软的算法,应该是一个computation-geometry最简单的办法,就是用scanline来扩展rgndata的办法,排序也只需要对set的比较方法的functor定义为从上倒下,从左到右,试验一下看看对不对,然后使用extcreatergn检验一下我得结果。
非常非常非常的复杂!看美军的训练我感觉有一点就是,不需要勇敢聪明的士兵,但是需要勇敢聪明的军官,下级军官素质决定了部队的战斗力,感觉pla现在的士官水准大概不比八旗兵强多少。
看陈文茜访问谢长厅的访谈感觉这个人其实还真的是象李敖评价的所谓“全台湾最聪明的人”,相比之下可能那个什么马英九实在是一个绣花枕头,但是所谓大巧不工,在美国人民经历过尼克松的水门事件后向卡特这样的老实木匠反而会成为人民的宠爱,这就是民主。陈文茜这个肥婆其实还是比较伶牙俐齿的。 陈水扁跑到南海去干什么?我有一个大胆的假说,这是从“中天新闻”得来的启发,就是当初美国人很关切阿扁会不会再下台前挑起两岸冲突比如扣留大陆渔船,我当时评论说大陆不会在乎个把渔民的生命财产所以不会有用,但是如果在南海挑动国际纠纷却不能说没有一点机会,所以这也许是一个投石问路,或者说阿扁在下台前没事干,邦交国都跑遍了,没地方去了,所以只好到处找地方跑,所以就去了。
二月四日 今天天气很好吗? 非常的好!
昨天晚上写了一个非常复杂的mergeRect的函数,但是效果并不好,而且现在看来这个与微软的rgn的实作不相符,比如圆的rect分割就是一层一层的,你需要解决的事degenerated rect也就是segment如何与邻近的segment融合为一个rect的问题,而不是把邻近的rect分割合并为最大的rect,因为创造一个最大的rect连带无数朵小的rect并不见得减少了rect的总数,所以没有什么意义,而且没必要。另外一条路也并不好,我曾经想用path来创建rgn,但是path如果碰到分叉,合并问题一样很复杂,更糟糕的事我得试验证明beginpath内只能是单向,就是说你的path不能“分进合击”最后汇合,而必须要“一条路走到底”,类似于一笔画做法,这个更加的复杂。我现在唯一不太情愿的就是把相邻的segment融合为一个rect的时候产生的误差的问题,简单的取平均肯定有不少问题吧?(且慢下结论,如果我把方向问题留在最后合并时候在解决不就好了吗?比如先建立一系列的subpath,然后。。。我觉得这个比较的好!好的。)
二月五日 今天天气很好吗? 不知道。
只有看《yes,minister》才能让我暂时忘记我得烦恼。CreatePolygonRgn有毛病,因为这些顶点在使用PtInRgn的时候居然返回false,这是怎么回事?左上角属于rgn,右下角不属于rgn,这是有原因的,好像是连续性的问题,比如黑白图,对角线的从黑到黑,与从白到白不应该交叉,但是对角线分别为黑白的话就会交叉,于是只能去掉一个对角线的从属关系,这样一个rgn内部不再有这种交叉的问题。
二月七日 今天天气很好吗? 下雪了吧。
怎样解释int a=25;int b=a++*a++;结果b=25?原因很简单但是我却把expression-evaluation和operator的precedence混在了一起,表面上看运用operator-precedence来看a++应该同时开始计算,但是,从函数的角度讲*是一个函数要先进行参数evaluation,a++是一个expression所以,要evaluate,结果都是5,因为原本a++就是返回没有inc的值,所以,我觉得有人问这个宏有什么错?#define SQUARE(X) ((X)*(X))我是觉得没有什么错,错也只在使用者的逻辑,就算是你加上挂号这么做(a++)*(a++)了明确了优先级结果也是一样的。当然这个宏是错的:#define SQUARE(X) (X*X),这个事我以前经常犯的错误忘记了会有操作符优先级引发的问题,(就是不能有expression作X)
#define SecondInYear 60*60*24*365UL结尾这个ul很重要,我还是第一次见到这个。
__FILE__这是与文件的文件名。 美军的伤亡为什么小?因为战场救治好,越战期间99%marine的伤员都生存了,你想半个小时内medevac的直升机就能赶到战场运走伤员这是什么样的效率?越战期间大部分是海军陆战队在作战。有一个奇怪的现象我解释不了,如果基类的constructor声明在protected里面,那么子类是不能调用的,而其他任何protected的方法或者数据成员都没有这个问题,为什么?
<The Pursuit of Happiness>是一部非常让人感动的电影,will smith的确是一个出色的演员,你很难想象一个人是怎样在那样艰难的日子里度过的,我以前觉得中国的穷人日子过得很苦,美国的穷人要富裕的多,可是很多时候日子的艰难是人的心理感受,比如你处在一个人人都需要尊严与体面的社会里失去这些的痛苦远远大于人人都不在乎的社会里来的大,痛苦往往不仅仅是来源于物质上的匮乏,肉体的痛苦又时候比精神来的容易克服,有时候。特别是一个非常smart的小伙子非常非常的有进取心,有责任感追求幸福生活的勇气与能力让人觉得特别羡慕,当然也感觉非常非常的敬佩,但是那绝对不是普通人可以做的到的,想想看一个人每天紧紧靠几块零钱生活,走投无路以至于在地铁厕所里借宿,同时在顶级的投资公司力作没有工资的实习生,唯一的希望是全班几十人里面只有一个有机会得到六个月后的工作机会,不但要养活自己还要照顾儿子,每天晚上在交汇慈善机构排长队等待避难所里的住所,被房东扫地出门,白天推销,以至于要靠卖血暂时维持生活,等等,这也许就是所谓的美国梦,因为不管怎样他始终没有失去希望。这是一部非常好的电影,中国人应该了解美国的穷人的生活,可能比加拿大的穷人更加的困难。
二月八日 今天天气很好吗? 没有下雪。
我花了很久也没有找到重载"reference-operator"的办法,主要是语法上和"address-operator"没办法区别,应该是有办法吧?如果有谁知道这个就是专家了,专门搞奇技淫巧的专家。what is new?
二月十一日 今天天气很好吗?没有下雪。
很久没有玩坐标变换了几乎都忘光了,或者这是一个借口因为以前也不是很清楚,gllookat实际上相当于camera设在原点,向z轴负方向看去,那么你要进行一个相应的变换,比如lookat的eye是[0,0,-10],center是[0,0,-8]所以你看到的matrix里面第一项是负的,我为此想了好久都不明白,(我都忘了我是怎么使用lookat的,还以为就是纯粹的object变换坐标呢。)所谓的viewport-transformation我一开始不是很清楚,因为openGL里面我没有看到变换的矩阵,modelview,project都有matrix为什么viewport不需要呢,后来才明白,它是不用matrix的,用一个vector表达,viewVector(winx,winy, winWidth,winHeight)所以,你就知道了,求得cananical的[-1,1]的小立方体的坐标后,进行一个乘法就可以了,不过要记住,winWidth-1,winHeight-1,同时window坐标是原点在左上角,所以最简单的应该是x=(x+1)*(winWidth/2),y=winHeight-(y+1)*(winHeight/2)
差不多将近一天我才想起了右手法则,真太糟糕了,因为我忘记了这个最基本的常识于是我发现所有的逻辑都不对,由此我也惊叹我们周围有一些宇宙最基本的法则,我以前常常在想为什么基本粒子要有一个自旋的属性,难道这是宇宙最基本的特征值吗?我想应该是的,所以,掩饰一下我的过错就说我又重新发现了最基本的物质属性:自旋方向,笛卡尔坐标不是一个随意定义的坐标系,在二维的时候我是靠记忆知道x,y的相对位置,但是在三维的时候你必须要依靠右手,当时我在学图形课的时候其实没有意识到其中的意义,opengl的坐标变换在第一次学习的人眼中实际上是基本的照猫画虎。所以总结一下,opengl里面的matrix是这样的顺序,modelviewMatrix*projectMatrix,所以后来的modelviewmatrix都是从左边乘过来,因此在vect*currentMatrix的时候相当于最左边的最先变换,(也许用stack来实现更加准确),那么viewport-transformation相当于scale winWidth, winHeight,translate winx,winy,当然也可以写成一个matrix,不过我的疑惑是为什么opengl没有开放这个matrix给glget?也许因为平台的缘故吧?这个东西交给glut之类的应用library去做,或者是因为还有困难不能统一?
看《yes,minister》有一集说的是部长大人批评公务员是非部分是moral-vacuum,但是最后他自己也不得不做同样的事情,晚上边喝whisky边向太太诉苦,太太安慰他说,他和公务员不一样,他还没有真正成为moralvacuum,只不过有conscience但是不用罢了,好像whisky priest。我听了很有同感,很羡慕whisky,不过我还是偏好red wine。
二月十三日 今天天气很好吗?没有下雪。
hp的说法是现在版本的mpi library(libmpi)即便是你使用多线程哪怕多个县城都在call-mpi只要不是同时都可以,只有在多个线程同时都调用mpi的时候才需要链接libmtmpi,而以往的lib则需要link -libmtmpi哪怕你自己保证多个线程每次只有一个调用mpi,所以这就是我那天小实验的疑惑,我用pthread作了多个线程调用mpi,我当时没发现我使用默认的lib有什么问题,其实问题不在编译,而在运行,这类问题有时候小实验是很难发现的,编译命令为mpiCC -lmtmpi source target我总是忘记不需要lib字因为这是默认的,只要你的library命名为libxxx那么编译的时候就只要-lxxx就行了。TNND这些都是纸上谈兵,我从来没有尝试过,结果一实验就不行了,首先确定如果是普通的non-thread-compliance-library调用mpicall一定会出错,但是使用-lmtmpi链接的时候有出错undefined reference to `MPI_Type_create_subarray'这个是明显的linking的错误,但是我尝试了各种-L都不行为什么?
二月十六日 今天天气很好吗?非常好。
脖子疼得要死。我猜想boundingbox对于occlusion有很大的关系,所以。。。linux下STL的实现非常的不同,set.insert如果take一个iterator指示插入位置,函数并不返回iterator,同时equal_range如果找不到的话也许返回的就不是一个区间了,因为STL的区间都是[)的半开区间,你说怎么返回吧?
二月十八日 今天天气很好吗? 不知道。
老生常谈的问题,windows定义的rect或者说region的面积是指包括左上边,左边,不包括右边,右下边,所以计算面积right-left不需要加一,这个启示本来都是正常的想法,不知道为什么我会想到加一?也许因为我总是有画轮廓线是region本身的概念吧,至少contour-tracing是这样做的,这也是一个小的区别,一条水平线段,用window的rect表达bottom=top+1,可是在silhouette里面也许top=bottom,这比较的讨厌吧。
看美国独立战争,非常的令人感动,独立战争之初民意是怎样的呢?只要看一看<common sense>的销售量达到了圣经的销量就知道在大街小巷里人人都在心里呼唤着推翻君主制。华盛顿曾经遭遇了一连串的失败几乎是山穷水尽的地步,在圣诞节之前,国会甚至号召所有的州在同一天祈祷上帝,在出击德国雇佣军的前夜华盛顿自己选择的口令是victory or death。在当时应该有一首非常令人感动的民歌《Johnny's Gone For a Soldier》其中的歌词讲述的是一个美国民兵的恋人怎样竭尽全力支援前线,倾家荡产给自己的男朋友买一支步枪,这样的军队的士气当然是英国职业军队所缺乏的。纪录片里说在十二月的寒冬里大陆军还有很多人是赤脚或者使用布缠足。林肯好像也被俘虏过?是投降。独立战争是一场旷日持久的战争,美国的通货膨胀大概有2500%,大陆军里有18000人当了俘虏,有一半死在监狱里,独立战争的艰难远远超过了我的想象,因为我忘记了美国人的对手是当时的世界霸主,大英帝国。
天天看英国的官僚体制,回过头来看日本的总理大臣感觉还是有不少差别的,但是有一点我觉得比较难以相信,就是日本妇女的地位真的如《再见了总理》中那么高吗?但是有一点我的印象非常的深,日本的官僚平民化已经一点也不比欧美国家差了,总理出门并没有让十字路口的警察改变交通秩序,总理夫人对于当不当总理一点都不在意,甚至冷嘲热讽巴不得早点辞职走人,对比法国的第一夫人上台就离婚就可以理解在一个平民化的政府里总理绝对不是什么人人都热衷的特权阶层,东亚政府中也只有日本有这样的雏形。
咱们的人民政府来了一封信说多给了我将近三千块,我不知道这是上一次的还是什么,反正我从来都搞不懂事怎么回事,总之,只有信政府的。外面的天气很好,下着小小的冰粒子,天气一点都不冷,可是我的心里却很冷。从来没有这么感觉沮丧,生活仿佛是一个轮回,不知不觉又走回了起点,人这种动物最多只有十年的信仰。
二月十九日 今天天气很好吗?不知道。
以前的东西又忘了,(*it+=3)=100;实际上*操作符优先级最高所以变成了模板类的type的引用+=然后再赋值,所以iterator丝毫没有位置的变化。
在美国独立战争期间,魁北克是英国一个十分重要的要塞,与补给基地,据说那里储存有权北美最大的弹药库,美国人派了两只远征队去夺取他,结果付出了成千人的代价几乎全军覆没,而魁北克方面伤亡几乎微不足道,大概十几个人吧?
二月二十一日 今天天气很好吗? 是的。
我把prerequisites改成了heap的版本,现在就简单多了,当初我不理解这个问题,总认为可以一步到位计算sorting,问题是真正recursive的数据结构是不存在的,数学家认为理所当然的东西不一定存在于现实中。
花了半天时间安装新硬盘及操作系统,这是一个很好的选择,原来的系统我基本上不去动他,在新硬盘上装新系统,万一我需要运行久系统或者有什么软件设置等等的我还可以靠改变bios启动硬盘顺序切换回旧系统,perfect。
二月二十二日 今天天气很好吗?是的。
昨天折腾了快板天明白了一个简单的道理,使用ghost实际上变成了编写脚本,因为ghost只能在dos下使用,所以,你只需要用symantic的工具制作一个启动盘,但是因为我没有软驱,结果一直不知道怎样制作启动光盘,可以使用subst drive dir虚拟一个软驱,然后把ghost-boot盘存在那个虚拟软驱然后可以长启动光盘就可以了,实际上这些都不是必需的,用nero直接制作启动光盘也是一样,如果要使用鼠标,加载一个mouse.com就行了,这些东西我记得小时候玩游戏的时候经常作,现在都忘光了。
二月二十五日 今天天气很好吗?是 ,才怪。
我决定每天至少要再topcoder上作一道练习题。生活变得空虚无聊,没有什么目标。看了一片揭示当年《为了六十一个阶级兄弟》的内幕报道感触良多,这篇文章是我当年读中学的课文,印象还是挺深的,当时年技校不会去问为什么,的确没有人去问为什么会有那么多人突然中毒,当然即便你问了给你的答案也不过是混进革命队伍的反革命分子心怀不满的投毒事件,其实原因很简单,有人这么做是因为他们感觉不幸福,受到了不公正的待遇,这在每个社会都存在,GCD的解决办法很简单,一个词就是阶级斗争,在一个词就是你死我活,这样一来什么问题都没有了,因为阶级斗争不可调和这样的情况不会消失,因为你死我活这样的结果你不会去抱怨,能活下来就不错了。今天有人提所谓“和谐社会”真是让人好笑,三十年河东,三十年河西,终于开始正视社会成员中的哀怨与不满。想想看,连春节都要在工地上修水库,每天还吃不饱,干活没有出全力就被批判,这比当年封建帝制逼迫农民服徭役强在哪里?或者我还是没有完全把这个政权当作封建集权制来看待?
一整天都在看在伊拉克的华裔美国大兵陈果的博客,很有些羡慕因为他做到了很多我们普通人做不到的,如果我能够年轻时随也许我也还有勇气去从军,可是。。。
摘录了一小段他的日记,我一直以为他说的是他的笔记本电脑,可是结果竟然是枪,哈哈,有意思。
她就是我的恋人--- 枪!!!
二月二十七日 今天天气很好吗?是 ,才怪。
topcoder的1000的题目我通常要做将近一天,因为有时候感觉很累就停下来休息一天,结果题目没看清多做了很多麻烦的功能,又因为我的中国造的计算器居然出错害得我找了半天的bug,这很骇人听闻对吧?又听说过计算器计算出错的吗?反正我的这个总不对,明明可以用整数计算的返回精确值的,可结果却是浮点数的近似值。先存一个版本吧。
看马英九和谢长廷的电视辩论会感觉不论哪一个人都是一个社会的精英,美国总统大选的候选人辩论会更加得好,所谓社会政策,治国之道,领导理念这些东西其实是非常复杂的决策问题,绝对不是普通人能够一朝一夕所能判断的,但是最起码这些东西必须拿到台面上来讨论,一个社会的进步程度最根本的标志是他的决策效率,人民本身的勤劳善良聪明才智并不是社会进步的直接体现,这正如一个人的 的能力天赋各不相同一样。如今中国的制度是有极大的问题,问题就在于行政效率,什么民主自由都不是根本目的,根本的目的是效率,但是民主自由反过来是保障效率的最好的手段,这一点我觉得才是核心。
ctv的晚间新闻播音小姐好像换了,是同一个人换了造型还是换了一个人?我的认人能力有很大问题,不知道这是否因为我现在思想跟接近电脑?(自吹自擂),应该是两个人。那个小妞儿戴眼镜很清秀的。
stryker说他所在的部队美军第二装甲骑兵旅是美国四大独立率团之一,这消除了我的疑惑,我一直以为它属于美国第一个骑兵师。很好。
二月二十八日 今天天气很好吗?是,才怪。
下载了一个mysql玩一下,登陆就是mysql -h host -u user -p pword,其中默认的是root。总的来说c-api要比什么php之类的清除多了,至少我不会觉得被人玩。现在经过好几年才慢慢开始明白开源的好处,这些东西是当你有了一定基础以后才会有的体会,当年Z说得好,微软的东西是对用户友好不是对程序员友好,unix/linux相对来说要对程序要友好一些。
F**K,费了我整整三个小时才搞明白存储blob数据的时候也就是存一个图片文件之类的二进制数据再sql里面你要是用特殊的“escape”字串,再mysql里面就是调用一个mysql_real_escape_string的函数替你封装,记住传出参数代表 经过“调制”以后的字串长度,我就是在这里粗心大意费了很久很久都没有找出来指针的错误,同时记住sql里面的双引号与单引号没有区别。
二月二十九日 今天天气很好吗? 非常的好。
我大胆的说一句,如果再windows下编程如果没有透彻了解dll那么等于还没有入门,所以我现在就是还在门槛上。1。同一个dll能否被load两次?首先文件名包含路径名,所以如果路径也一样windows是不会让你loadlibrary两次的,因为内部有一张表维护当前的loaded dll。如果你调用FreeLibrary那么等于清除了表。其次,window很搞笑的,当年栽linux下为了防止别人删除一个文件你就运行一个background程序打开这个文件,这是一个拙劣的办法但是至少还可以,windows好笑的事如果你要删除那个已经被loaded的dll,不行,可是你可以把他拖拽移走!这实在是太搞笑了!!!结果我在运行期把一个已经被使用的dll替换了另一个版本!这实在是有些匪夷所思,当然了运行的程序如果不freelibrary再loadlibrary也不会受影响,可是。。。2。我的记忆力太差了,每次再c++程序里面调用dll里的函数总是忘记name decoration的问题,如果你调用的时候想用原来代码的函数名,那么dll里面第一是用默认的__cdecl其次,如果实在c++编译器下使用extern "C"把函数的名字装饰去掉,所以就是extern "C" __declspec(dllexport) type __cdecl funcName(paramType...);__cdcl是为了保险因为不一定你正确设置了默认的调用约定吧?3。老生常谈,dllke亿看作是另一个程序,windows德kernel的对象比如文件handle之类的不透明的东西都只有在本地有意义,越界无效,linux里面有相关process文件列表继承的独特属性,windows好像不是天生的,所以把一个文件handle传递个dll当参数是无意义的,当然好像有个所谓的“共享的”办法,创建的时候起个名字,大家就可以共享了,听说过没试过。
使用platformSDK你唯一需要记住的就是,不要shi用原来的vc6的basetsd.h因为微软更新了一些基本的类型定义,大概是为了于64位兼容的问题吧?(我猜的。)不要把platformsdk的路径加进来,拷贝单个没有的.h和.lib到当前vc相应路径,这是比较干净的办法。这样只需要更新一个basetsd.h文件,尽量保持原来的vc6。
如果使用httpAPI来做一个httpserver的时候,最好定义一下UNICODE因为url都是unicode,同时要记住localhost是不能解析的,因为还没有dns服务器吧?所以使用http://127.0.0.1:80/记住最后的那个slash是必需的!把微软的例子拷贝了一下就做了一个简陋得http-server,以前可能也是照猫画虎但是始终没有理解,什么tomcat之类的都去见鬼吧,明明一个简单的玩意被告成了一个吓人的东西。当然那时我被吓得,我是吓大的。
英国媒体曝光了英国的哈里王子在阿富汗服役的消息,他只好回国了,我非常非常的敬佩这个年轻人,不仅仅是因为作为王子身先士卒,而是因为欧洲贵族阶层的子弟的培养传统让大多数东亚家庭感到生子当入哈里王子。
一开始我有一点转不过弯子来一直在想我怎样写一个http的客户端?后来才想起来不就是ie吗?我当然也可以模仿ie弄个无界面的包装一下packet发送,不过这个现在还不需要。宽字符前面加一个L,printf里面的%s改称%ws。在重复一个基本的基本的东西,以后一律用TCHAR这样只要定义UNICODE宏就可以选择ansi和unicode两种了!!!我始终没有unicode编程的概念原因在于没有一定要使用的原因,现在再http里面必须了,所以总算有原因可以用了。
终于发现IE实际上非常的强大,他已经帮你做了很多很多,为什么IE能够显示jpg图片,因为他要自己去分析文件头的部分,因为http是一个基于文件的协议,他才不管三七二十一反正都是文件。
三月二日 今天天气很好吗? 非常的好。
NAT映射端口始终不成功,为什么?肯定还是我没搞明白,我的router-modem上的计算机映射之后并没有显示public-address这也许说明我没做对?当然现在局域网是没有问题如果防火墙关闭的话,或者设定exception程序,及其exception得端口,二者缺一不可,我当时以为制定程序自然就制定他所需要的端口,看来防火墙没有这样简单,也许是做不到,也许是为了更席位的控制,总之,还要再试验。现在这个市道太乱了,我的电脑里面充满了各种各样的病毒与木马,我重装系统之后我感觉我并不是真正的administrator而是一个假的,听上去匪夷所思,可是看看我的dos吓得homedirectory居然使administrator.montrealXXX难道这不奇怪吗?
如果想知道当前可执行程序自己的文件名,可以使用GetCommandLine,注意使用PTCHAR来兼容ansi/unicode,(这里面有些东西还是不很清楚,winmain,main的argv好像是不能使用unicode的,所以要自己去调用commandlinetoARG之类的函数??)GetProcessWorkingSetSize给你一个清晰的系统分配的page多寡,GetProcessIoCounters可以统计程序的i/o多寡。以上不太对,获得当前可执行程序的全名应该使用GetModuleFileName,因为其他的命令行并不一定包括路径,startupinfo又是一个和window关系很大的东西,比如window的大小位置title,desktop等,environmentstring更加不沾边,GetCurrentDirectory和window模仿linux的getcwd一样并不一定是exe的路径。关于防火墙的管理的api是一个INetFwMgr的COM接口,定义在netfw.h里面,这个在MSDN里面找不到,要去platformSDK里面去找。
试验了很久端口映射总是不成功,但是把我的电脑设定城DMZ确实可以,现在等于那台电脑的private-add被完全映射到了internet,当然在局域网内部访问的时候还是要使用局域网的地址,当在internet的时候可以使用public-ip来访问。mysql输入了大约七八百张照片就出错了,也许是什么内存资源忘记释放了,明天查一下吧。
三月三日 今天天气很好吗? 好像不是。
sql有个问题,因为它本身并不需要care unicode,所以我不应该全部都是用_TCHAR,但是如果我的insert的数据里面又unicode我又必须在insert与距离面嵌入TCHAR,这个非常的啰嗦,存储的二进制数据当然应该用char*但是如果有的field使用wchar,又必须不停地在_stprintf和sprintf之间转换,也许asp,jsp之类的脚本takecare了这些?这就是用纯粹的c接口调用mysql的麻烦处。再mysql用户界面上你可以用\T输出到文件,而不是在一开始的shell上直接调用c:>mysql mylongin.sql这样不行的,因为mysql会是用默认登陆本地的mysql而不察看mylogin.sql里面的参数。
也许是我昨天记错了,我的DMZ的mysqlserver现在不能使用private address192.168.2.x了,必须使用public address,这实在是混乱。到底是bell在捣鬼吗?mysql奇怪的语法使select的临时数据集必须要加挂号给于一个as aliasname,我记得以前oracle不需要,对吗?我的记忆力太差了。我实在是糊涂,因为mysql再windows里作为service存在的,所以是不能够直接用mysqld-nt启动的,需要使用net start mysql, net stop mysql来控制,同时昨天的错误终于找到了就是server端得max_allowed_packet太小的缘故,因为blob数据会大于1M所以default的设置不行的。
三月五日 今天天气很好吗? 下雪了或者下雨了。
httpapi有不少的问题要去处理,我首先不知道怎样传递多幅照片,单个照片firefox也不认,ie虽然正确显示但是只有第一张说明response德packet我传的不对,并且很快就会爆出64或者1229的错误,大概是什么netname错误,现在还不清楚是怎么回事。今天偶然看到msdn上面的directio部分,抄了一个例子检查我的营盘结果大小少了一点,不知道为什么,这个结果和“manage computer”上的一样,但是和硬盘的大小就是不一样,我怀疑会不会硬盘厂商为了招揽顾客把十进制的40G将错就错,就是说40x1000x1000x1000就是平常说的40G和二进制的40x1024x1024x1024当然差了不少。那个函数叫做devicecontrol。#操作符很有用,我这两天总是位sql的statement烦恼,现在好了用这个macro。#define stringer(x) (#x)或者不加挂号?这样就省去了自己给每个但双引号加\的麻烦。 看到md5感到很好奇,我在想如果把md5看作一个映射,那么对于所有的128bit的字符做映射,结果在继续映射,最终一定会形成一个环,我的问题是这个环有多大,有多少?最理想的当然是一个,不过这个有人证明吗?
从set里面删除当前iterator指向的元素会很糟糕因为这个iterator很可能失效,至少这是我观察到的,linux/window都是如此,甚至连vector的erase方法都是不可靠的,因为微软的实现说是返回当前下一个iterator,可是好像也不对,至少再linux不太对。另外一个令人讨厌的问题就是64位长整数的问题,微软的这个__int64时我深恶痛绝的,首先__int32何int32或者int都被编译器看作不同的类型,iostream不承认__int64/__int32时已经重载过的,其次,linux用的事longlong,printf用的是%lld微软则是%I64d这实在是太麻烦了,用macro重定义都不好办。
三月六日 今天天气很好吗? 非常的好。
我觉得我应该放下一切包袱,生活没有什么大不了的,只要我下定决心去做我认为对的事情就没有必要认为结果是怎样的,反正这是矛盾的逻辑,好像matrix-reloaded里面讨论得如果一个decision在你take-decision之前已经决定了,(比如你试运行实现编译好的程序,所有的选择支都是预设的)那么你决定与否都无关紧要,(听上去好像宿命论,实际效果是自我暗示,说得好听叫做坚忍不拔,如果失败了叫做执迷不悟,如果干出了伤天害理的事情叫做。。。)总之我做什么与不做什么都是有理由的,任何结果都可以有一大队的事后诸葛亮来评述,重要的不是决定对不对,重要的是我今天作了什么,如果我晚上睡觉前能把我今天作的事情回忆一遍没有无所事事,那么今天就可以好好的睡觉了。(当然就算我今天无所事事了一天,我还是会睡觉的,因为在你回忆完一天之前早就睡着了。这就是生活的矛盾。)
以上都是垃圾,包括刚才那一句说明。
utf-8,utf-16不是unicode?看来没有亲自玩过的东西我永远不理解。以后要使用_itot来转换数字,使用unicode/ansi兼容的代码要从现在开始养成习惯。花了一个小时开始学习html的格式,这是我一直很鄙视的东西,不过现在看起来还是很好的东西,<input type="reset">或者"submit"是针对整个form的,所以要定义form,这大概就是为什么我不能显示多个照片的原因?
三月七日 今天天气很好吗? 凌晨怎么能知道?
折腾到凌晨我才开始怀疑是否那是一个bug,问题就是如果用户不断刷新他的浏览器,那么浏览器和服务器之间的连接就不断被更新,这个解释对不对?也就是说一个浏览器窗口在同一时间只能允许一个和服务器的唯一连接,一旦刷新那么连接就失效了。如果这个结论是对的,那么程序没有错。我也就可以睡觉了。可以吗?不可以吗?
三月八日 今天天气很好吗? 好像是阴天。
我在想一个简单的问题,这个问题我从来没去想过,因为理所当然,html的格式是纯文本,那么他怎么能够显示图片一类的binarydata呢?99%学过计算机的人对这个问题不屑一顾,因为可以用一个名字来表示嘛,<img src="image.jpg">,那么我的问题是我自己传送http的packet,就是那个httpresponse结构我要把图片数据放在哪里?50%的人也许会说有一个fromfilehandle,你可以把文件的handle放在datachunk,可是如果我的图片不是来自于文件是从数据库读出来的内存地址呢?也许40%的人会说放在cache里面,这样对不对试验一下再说吧。
(结论是以上不对,所谓服务器端的cache与客户端得cache根本就是风马牛不相及的,怎样存放binary的数据呢,同样道理,必须用content-type来定义。)
三月十日 今天天气很好吗? 风雪交加。
本来一直要坚持每天...
三月十二日 今天天气很好吗?风雪交加。
好像忘记交房租了。折腾到两点,问题时mp3文件太大了,我的mysql根本就不行,mysql_store_result就死在那里了。另外thread pool有一个理解的问题,所有的http的handle支能有一个,因为addurl只能加一次。所以还真的有一点点observer的意思。播放音乐是<bgsound loop=true src="filename">美女给我的任务还是有一点困难的。
三月十三日 今天天气很好吗?风雪交加。
今天发现window-live新开辟了一个sky-drive,我正好把我几个想保存得project存起来。
My-GDI-SDK(link-only) MySQL(link-only) HttpServer(link-only)
顺便说一下,我计划建一个网站来挣钱,当然要先免费十年才行,哈哈。http://76.68.250.205:80/
三月十五日 今天天气很好吗?风雪交加。
今天星期六,前几天吧,加拿大议会投票表决是否延长驻札阿富汗部队的时间,渥太华议会大厦前一定又是一片的抗议人潮,我没有看到具体的画面,但是总理harper大概是调侃的话我倒是从新闻里听到了,大意是加拿大是最讲人权的国家,全世界的警卫只有加拿大的经委会给抗议者送毛毯,这句话听上去也没什么错,其实加拿大人根本和美国人的反战不一样,当初出兵阿富汗也是一个加拿大的政治传统,本身恐怖主义从来就不会对加拿大有仇,因为我们周围有一个巨大的恐怖主义目标的吸铁石,美国。出兵阿富汗只不过是看在以前女皇的面子上跟着英国去的,当然美国邻居的面子也有一点谁让加拿大80%的贸易都来自美国呢?拿人钱手短。不过呢,前几天大概中国政府在西藏又杀了几个抗议者,我并不是完全不赞成开枪对付示威者,但是最起码21世纪动真枪之前能否使用橡皮子弹?在全世界最危险的伊拉克巴格达被全世界所为最人道最和平主义人士斥为屠杀者的美国士兵全副武装外还会携带橡皮子弹,不是美军不明白恐怖分子的残人与不惜代价,而是因为美国人知道杀戮并不能消除仇恨,中国现代政府的管理意识在很多问题上还停留在两三个世纪前的封建时代,马恩列斯毛邓都明白政治体制要去适应经济基础,经济基础的代言人是社会各阶层的政治诉求,如果下言不达上听连几百年上千年前的封建君主都会担心水亦覆舟,而如今的胡温却俨然不知所措,foreseen, but do nothing!藏人是否该杀这个问题我想老毛在世会比较慎重处理,中国人口这么多不在乎杀几个人,问题是在什么时间什么地点以什么方式来杀。
这一点加拿大做得就比较好,我们去超市买牛羊肉里面煮的时候总是有血,因为文明国家屠戮的时候希望观看屠戮者的心理感受能好一点,于是用电击不放血,请特别注意我这里强调的不是被屠戮者而是观看屠戮者的感受,被屠戮者反正是一死,差别不大痛苦少一点总是有限,观看者可能还要活几十年,有了文献可能就要被人看到几百几万年,所以人道主义就是你怎样考虑哪些观看者的心理感受,如果一个政府不考虑这一点那就是不人道。美国政府考虑到了观看者的感受因此他在伊拉克杀再多的人,我以为都是人道的。这是一个野蛮政府与文明政府的最好的对比,不是针对你做什么,而是针对你怎么做。
三月十七日 今天天气很好吗? 阳光灿烂。
线程池其实还是有些复杂的,复杂就复杂在能否保证你得server始终很强壮,内存泄漏是基本的防止的内容,关于死锁我想除非我统统使用带timeout的wait函数,否则很不容易做到。基本上我认为这是一个producer与多个consumer的模式,mysql支持多线程模式,只不过init函数不是线程安全的,因此我只要再主线程力作资源分配,再threadproc里面仅仅做很简单的任务循环。早晨仅仅完成了coding,晚上或者明天早上debug吧。第一步先实现多线程,第二阶段在实现异步通讯,其中在分两小步,mysql部分的异步,与http-server部分的异步。
关于DC,我认为他是我所认识的仅有的几个真正的programmer,(当然我不认识多少人,号称学过计算机的人倒是遇到不少。)他喜欢谈他的一些强烈的看法,比如他以为printf之类根本就不应该使用,要使用带n的版本_snprintf,当然考虑unicode就是_sntprintf,woshen以为然,因为buffer-overflow是最常见的潜在的隐患,关于变量初始化他也反复强调,对于我管与效率的argument他的说法我认为更加的实际,因为需要optimised的地方其实很少,大部分的函数调用不了多少次,我以前常常犯一些纸上谈兵的毛病,在基本的编程里面常常在想代码在汇编下是如何执行的,这个看上去很注意效率其实是一个自以为是,第一,编译器的优化远超过普通程序员的想象,第二,在还没有完成基本框架的编程初级阶段谈优化是本末倒置,很多时候所谓的被优化的代码直接就在编程的阶段被清除出去了,优化完全太早了。DC对于代码的clean&clear的强调到了让人窒息的程度,我已经打算放弃自己的命名习惯迁就他了。他还是非常强调他的重用性,比如模仿windows的dialog再mac机下模拟消息循环这样他的代码的接口部分达到平台无关,又比如他说他的device-driver时twain和usb通用的,这一点我一无所知,以后我会好好学习这方面的东西。有一点我表示同意,DC对于design这个词的滥用非常的情绪化,他认为他接触的很多design的人根本就不了解实际纯粹纸上谈兵,对此我深以为然,我的comment时designer首先应该是一个很好地programmer。今天我浏览了一下他的设计文档,发现这个project很讨厌的就是要去兼容很多的古老的硬件与模式,比如mono,比如16色,比如各种压缩模式等等。他设计了自己的packet结构,关于他的类似于window-gdi的rect来定义更新区域,这一点我很感兴趣。
DC决不是什么超级牛人,我以为他的大部分知识都来自于几十年的实践经验,这恰恰是很多人所缺乏的。如果他的理论背景足够高的话那就是非常的强了,但是往往很多人沉溺于理论就不愿意亲自动手了,明显的理由当然是他有更重要的理论工作去做,不过我以为世界上除了少数顶级的科学家有资格这么说以外,其他人大多是一种借口,不需要事必躬亲,但是你最起码需要知道事情是否可以做,是否容易做。
eeepc受到了,使linux版本的。
三月十九日 今天天气很好吗? 阳光灿烂。
DC今天讲的一个东西我很有感触,就是创建线程的返回的handle应该什么时候关闭,我以前从来没有想过这个问题,我一直有一个错误的概念是这个东西会随着线程的结束而自然结束,DC说不会,所以,他只给我看process-manager里面的svhost有8000多个handle,说这是handle泄漏,我有些将信将疑,我嘴上争辩说那个svhost是个空壳子,但是我心里知道他应该是对的,一个进程使用超过八千多个的handle不是泄漏是什么?同样IE的GDI对象的泄漏应该也是有的吧?DC给我展示他的仿照GDI的东西,有一些实在mac上模仿,有些是在任意device上的模仿,据他说是把window的菜单font等资源掉出来然后再pda等等硬件上直接使用,我还一时转不过弯了,但是他的那些类似于photoshop的功能的一些实现速度相当的快,我有些简单的东西自己做过,比如我曾经用bitblt做过一个放大镜的效果速度比windows得慢了不知道多少倍,他的东西速度这么快据他说是因为他只用加减法,乘除一律使用某些表来实现,我对此有些慌恐,他的钢笔型的扫描仪驱动所作的图像修正非常的惊人,我说为什么没有申请专利,他说当然有不过不是他的名字,我不知道这个答案是否可信,不管怎么说这些东西在十年前的确是很了不起的。无论如何DC都是一个令人敬畏的老头。
半夜三更爬起来拆卸eeepc才发现我的型号和youtube上的不一样,tnnd的内存无法扩充因为我打不开后盖,整个连在一起的。上当了。我觉得这实在是一个最好的理由学习linux,因为我实在不太愿意使用一个512m的机器上的xp。
三月二十日 今天天气很好吗? 下雨了。
试验了一天才有些确信可能有些什么变化发生了,httpapi好像不能正常使用了,我可以接受但是不能发送,我已开始一直以为我的code的有问题,但是我把微软的例子又试验了一遍,结果也不行了,说明也许sympatico把什么服务封掉了吧?比如http的包的发送?我实在不能解释1450系统资源不足的错误!明天我去实验室试一下看看吧。DC对于工具的使用的执著到了疯狂的地步,vc6的大部分工具我几乎都没有怎么用过,这一点让我很惭愧,同时DC的反应也比我来得快,让我觉得很惭愧,我不但比二三十岁的小孩子来得慢,也比五十多岁的老头子来得慢,唉。但是我绝对不会放弃!只要不断努力那帮小孩子我是绝对不放在眼里的。
明天是复活节。
三月二十一日 今天天气很好吗? 阴天。
我问DC我平常可以做些什么来准备,他说让我去看他的代码,我本来也就是一个装装样子,没想到给自己拦回来这么些东西,当然我也比较高兴他不忌讳我拷贝代码,我原本是把他给我的安装盘进行拷贝的,连带把所有的备份也可了过来,讲句老实话我压根没打算看,因为也未必有什么意义,唯一可以参考的是他的图形编辑方面。于是只好取下在一个虚拟机来装windows-server,回想起来HM在我和他做project的时候就提过他是在VM上debug,那个时候有些神往,不过我想一是我比较的懒,二是我对于所有的新技术新应用都保持一个怀疑的态度,按照DC的话来说就是:工程师并不打算去解决不存在的问题。如果现有的技术资源够用,为什么要增添新的烦恼?新的软件意味着新的bug,我们目前的问题都解决不完为什么要增加新的?
很多时候我觉得topcoder很不公平,很多老手都是用了不少的类库之类的,否则让我现场编码我怎么可能用最短的时间敲键盘呢?我觉得有时候我两三百分的题目几乎可以避免编译的错误,包括typo但是至少还会有一两个逻辑或者边缘条件错误,但是看了一下那帮人的代码还是很让人泄气,比如我们都知道gcd的算法,但是这么写代码我还是很困难的。int gcd(int a, int b)return b?gcd(b, a%b):a;
寻找数N以内的所有相对N的质数,我是凭直觉把N的所有factor求出来存起来,然后再去用[1,N)检验这些factor,看到别人直接用gcd来求[1,N),其实要快不知道多少倍?我对于基本的概念还是mei有真正理解。真正的高手一举手一投足就看出来了。
alex这小子非常的强,可以说是我见到的linux的geek级人物,当然我指的是主要的是系统管理这一层,并不是说他编程不突出,而是我反倒忽略了。我一直以为实验室不能使用hp-rgs的原因是网络的问题,今天他成功地用linux版本连接到服务器了,其实远离都是一样,既然是应用程序使用网络协议就没有window/linux的区别,我一直想不到这一层。同时我也曾他那里得知可以用synaptic来下载新的程序来安装我的eeepc。今天连续安装了fedora和win2k的虚拟机,以后确实方便多了。记住用nero来刻光盘的iso时使用save-track命令,这实在是让人想不到我找了非常得久。eeepc使用的事debian的变种xandro(记不住。)
httpapi在学校的机器上工作,不知道为什么在我的两台电脑都有问题。晚上到垃圾的路上又给了街头的乞讨者两块钱,在这个复活节的寒冷的夜晚,在寒风中乞讨你能想象这是一种多么艰难的选择?我大概不仅在同情他们而且在同情自己,也许在我灵魂的深处藏着见不得阳光的邪恶,如果能够依靠施舍减轻那当然是最好了。基督教教人向上现在并不用什么下地狱之类的恐怖手段了,更多的仿佛是心理医生让人去消费自己的精神能量。如果可能的话年底也许我可以捐献一些菲薄的奉献。做了三十个俯卧撑累得气喘吁吁。
三月二十二日 今天天气很好吗? 阳光灿烂但是很冷,风很大。
看台湾的政治感到很搞笑,政治人物常常动不动就赌咒发誓甚至说出来性命不要的话,在加拿大我想这种话是很难听到的,有什么大不了的事情要性命相搏,难道你的话就那么没有人相信,或者那么的有必要让别人相信?感觉用这种口气说话就仿佛殖民者刚来非洲美洲骗当地土著的情形一样,我的有限的和本地同学交往的经历只有一次我听到一个同学说I swear I am not lying。为了什么事情我忘了,反正不是什么大事,大概就是老师的作业是怎样布置得之类的鸡毛蒜皮的事情,不过我当时还是吓了一跳,事后回想起来,在基督教的传统里swear是很神圣的事情,轻易不敢用,用了当然没有人不敢不信。中华文化传统对于这些胶条根本没人信,说是都信佛实际上没有认真地相信有地狱报应之说,因为脑子活分可以把宗教信仰当工具用,实际上一个人信什么本来并不重要,完全是一个精神需要,重要的是你觉得你有信仰了,晚上睡觉踏实了,因为信仰本来仅仅是一个行为的“一致型”准绳,如果你的行为有了一致性,你自然不再为决策苦恼,因为可以参考从前的行为,或者你的信仰的条律,所以,不是为了什么而信仰,而是因为要有一个行为指南而信仰。
三月二十三日 今天天气很好吗? 阳光灿烂但是很冷,风很大。
教训啊教训!我费了一两天时间在寻找一个不存在的bug,这就是很少做复杂工程的经验的缺失,同样的代码在不同的目录下运行结果不同意味着什么呢?当然是编译环境的不同呀!这是一个常识,那么究竟是什么不同呢?1。makefile之类,可以在工程文件里选项寻找。2。路径设置。结果时发现我犯了一个低级错误,我明明知道再platformSDK下很多头文件与vc6不同,结果想当然的不去做深入检查,(不过当时存了另外一个想法,因为我以前的程序都是在vc6甚至是sp6之前的,我侥幸的想要尽可能保持vc6的头文件系统,于是遇到编译不同的我尽量在vc6的基础上增添sdk的东西。)这种做法是危险的,比如sdk的winsock2.h有了很大的改变,我当时见招拆招以为sdk仅仅是添加了一些别名而已,现在看来为了兼容64位程序改动得非常之多,有一个基本的就是对齐(alignment)的问题,64位程序据说是不可能和16/32位程序混合运行的,所以那些pack 4之类的都有改变,对于win32的宏定义都不同,我真是想当然结果吃了大苦头。结论就是sdk的东西还是在sdk环境下编译吧。(不过我是否做得到呢?我实在是懒虫一个。)
最主要的问题解决以后其他都比较容易了,当然我还有别的错误,比如http里面的很多结构都是不定长的结构,是不能用queue之类的来存取结构的,如果一定要用也只能用指针,就是类似于bitmap的结构里面的那些不定长得palette,所以,我在使用httpreceiverequest的时候绝对不能只用sizeof(HTTP_REQUEST)的来作为buffer的size。本来这是一个很小的玩意,写一个数据结构来管理就可以了,不过我太懒了,回过头来看台湾tvbs的政治论坛辩论会,非常的有意思,可以议论的很多,但是一个明显的感觉就是作为政治人物在台湾要比在中国大陆累得多,这样的唇枪舌剑对人的头脑逻辑辩才的要求非常的高,绝对不是天天找秘书写讲稿开会打瞌睡,晚上大通宵麻将能应付的过来的,这才是人民对于政府官员的要求。同时亭节目里的观众call-in也非常有意思,感觉人民的眼光是雪亮的,很多时候人民的思想其实非常的成熟,我想这是民主制度训练出来的,因为认识一个学习的动物,没有实践学习的过程是不可能成熟的,这就是所谓西方民主社会的来源之所在,人民需要一个学习的过程,如果片面强调时机不成熟而剥夺人民学习民主的机会,那么人民可能永远都不可能学会民主自由的思想与价值,gcd的所谓时机不成熟的谎言让我想起了伊索寓言里那只望着葡萄的狐狸的语言,不要再说什么够不着的葡萄是酸的,你不应该总是欺骗自己葡萄是酸的所以我不去,你应该告诉自己葡萄是我应得,现在就挑起来摘自己的葡萄吧。
台湾的这些所谓的名嘴都非常得厉害,尤其很多的女人非常的灵牙利嘴,好厉害!台湾的女人好厉害! 马英九的台语讲的有些结结巴巴。三个女人一台戏好热闹,外号就是“火线娇娃”!国民党三大美女名嘴:郑丽文,兰萱,尹乃箐。
三月二十四日 今天天气很好吗?阳光灿烂但是很冷,风很大。
晚上在绿房子吃了一顿6块钱的糟肉饭,因为这个是最快的,冰箱里有一块牛排,本来想再烤了吃,可是怕等不及肚子饿。生活变得朝九晚五,慢慢就会成为一个钟摆,人生的路也仿佛在不知不觉中回到了起点,曾经有一个上天赐给我的机会摆在我的面前,我在最后一刻犹豫了,尽管在数字上是吻合的,我还是犹豫了,我对于我前方的道路看不清楚,同时更不想背负一丝一毫的负担,如同刚刚来加拿大在多伦多乘飞机莱蒙特里尔的路上的心情一样,匆匆地瞟了一眼路边随风起舞的小草,前进的脚步不能有一丝一毫的停顿。理查德克莱德曼的浪漫钢琴曲悠扬地想起来,充溢在都是之间,徘徊在我的心底耳边。DC对于工具的使用是最让我佩服,我惊天又看到了一个我不知道的功能,ctrl+}寻找挂号的匹配,这些细节在很多人眼里不值一提甚至被讥笑成奇技淫巧,的确,无他,但手熟尔。古龙小说里的超级剑客在比试武功的时候对于每一个不知多么小的细节都精益求精,因为高手之争争之毫厘,再coding里细微的差别积累成巨大的差距,在某些方面我还是差不少的。决不是说DC在所有方面都强,这决不对,他对于指针的运用还是差一些,大概是写汇编太多的原故,很多coding也有些多余,对于软件工程算法效率的某些方面大都是朴素的实际体会,实用但未必最好。我想我用两年时间大概可以在大部分方面与他看齐吧?这也许说得太早了些,毕竟了解还太少,不过想当初我对于计算机一窍不通的时候就能有决心在五年内赶上黄连声,这样的决心应该是要有的。
三月二十五日 今天天气很好吗?阳光灿烂 。
费了很大得劲最后还是回到老路上来了,http-server应该是一个stateless的server,这是基本的定义,并且是最容易实现的,我当初执著的一定要形成一个能完成事务的,用一个线程dedicate一个connection的想法非常的麻烦,改写了好几个不同的request的模式,发现还是用最简单的,因为我现在都是用一些零星的时间在改这个东西,经常忘记以前要干什么为什么要这么做,早上终于又回到了起点,完成了多线程并行访问的httpserver+mysql。当然原本mysql就是支持多线程访问的,仅仅在httpapi部分监听者是一个线程,其它都是执行任务访问数据库生成网页的“工作”线程。就这样吧。
拖拖拉拉一个多星期才总算改完了多线程版本,编码很简单主要是当初那个“vc6”和“platformsdk”的冲突问题折磨了我快一个星期。存一个版本在这里吧。服务器地址如下,内容不适合未成年人请自我约束:http://74.12.223.226:80/ 请大家帮助测试一下性能吧。(其实我知道我在这里吧ip地址登出来立刻就会有一大队的搜索引擎跑过来了。)
三月二十六日 今天天气很好吗? 阴天。
昨晚上作了一个很奇怪的梦,醒来也忘得差不多了,看我那台老掉牙的备用电脑被很多人疯狂的浏览,哈哈,我真应该写一个log记录下访问者的ip,看看那里的人比较喜欢陈观希的自拍,不过呢,很高兴程序还算稳定,意思就是说应该还没有内存泄漏资源泄漏等等的问题,不然早当机了。接下去就是实现DB和http-response的分别的异步通讯,否则大文件如mp3那样的还是会有问题。浏览的人或者机器还是很疯狂的。哈哈。
历史上最超级搞笑,无聊,恶心,恐怖,白痴,无理头的电影是什么呢?《grindhouse》
三月二十七日 今天天气很好吗? 阳光灿烂,大雪纷飞,我不开玩笑的。
这年头就是逼良为娼的时代,我以前对于这些流行的web应用总是不屑一顾,现在为了争银子起见不得已用业余时间在家里架设一个色情网站,欢迎大家踊跃访问,不过看了一下log一天下来没有几个人,10个线程只有一个有工作,看来陈冠希的那点东西大家都不屑于看了,一定要找一些猛料,也许把成人频道十二点后的限制级电影放上去?不过我怕银子没有挣到我的sympatico高速网超标罚款到不少。昨晚原本要写一个简单的垃圾邮件转发的东西,遇到一个小问题,今天再说吧。要么还是先做一个简单的图片收集的“爬虫”?看了一下IE的wininet-api应该很容易。先吃饭吧?
晚上步行8000多号去W家送我的保税表,从来就搞不懂这些东西,既不清楚政府给了我多少钱,也不知道我花了多少钱,反正银行户头上有多少钱我是知道的,其它一概不清楚。步行速度大概是1000号/10分钟,这个多少号是蒙特利尔的长度单位,就好像1.5,2.5,3.5时面积单位一样,卖卖官子吧。学习html发现这个东西很简单,难怪那些小孩子都明白,当然标准的html之外微软的ie作了超强的extesion,知道了上传文件的按钮是input type=file,从纯粹programming的角度看这是浏览器自己去调用系统对话框,就如同一大队的控件与一些gdi的命令一样,这样可以帮助我理解。
晚上回来要做这样一件事情,用atexit注册清理程序,因为http的handle不释放问题很多。
晚上和同学在小肥羊吃饭又不由自主地讲了那个著名的笑话,一个美国人自豪地向朋友介绍说他叔叔当年凭着唯一的一句法语周游整个欧洲没有遇到任何问题,大家对于法国文化深入欧洲的各个角落心驰神往就问他那句奇妙的法语是什么,他说:gracias。这个笑话来自于<mr.Bean's holiday〉的导演。
DC下午给我演绎了gdi对象泄漏的严重后果,当给老板演示的时候一窗口突然消失了很是尴尬。随后他和我一起debug,一个好方法就是再process-manager里面观察gdi-object的增加数量,这个是我现在唯一能想到的办法,也许vc6里面有类似的工具吧?好像没有吧。内存泄漏时有工具来检测,对象呢?我的那个家里的小server也有类似的问题,不出一天就放生数据库访问的错误,是因为某种内存的泄漏吗?应该是吧。
三月二十八日 今天天气很好吗?阳光灿烂 ,但是有些冷。
我检查了log,错误显示是数据库访问错误,我没有进一步的资料只能猜测。
实际上发邮件是一个很简单的东西,我说简单是因为你不管新邮件系统的安全性等等的设置,原来一直困扰我的那个对话框其实和mapi完全无关使oe弹出来的,你只要再oe的security里面去掉什么“警告当别的程序以我的名义发送”的一个选项。
三月三十一日 今天天气很好吗?阳光灿烂,但是有些冷。
如果你看了<hostel〉这部电影你绝对不敢再去东欧那些国家旅行了,这是我看过得最血腥最残暴的恐怖片,这里我要修正一下恐怖的定义,加拿大的电影号称是恐怖与行,其实大都是带着一点点玩闹性质的,好莱坞的恐怖是让你干脆就边看边吐。
数据库访问错误应该只有两个可能吧?一个是长时间idle以至于lost-connection,可是mysql明确说这个bug在之前的版本已经改正了,(就是不在位default选择)另一个可能是本地数据集太多了,就是我的本地缓存占的内存太多了。针对第一个可能,我写了一个简单的连结重置,针对第二个可能我明天打算把针对美个线程连结的缓存改为全局针对所有线程连结得来节省内存。问题是我现在还不能判断到底是连接的次数还是连结的时间长短导致数据库错误?各位能不能多去点一点这个图片库呢?http://74.12.223.226 当然里面有不少儿童不宜的,最不济那些搜索引擎看到这个ip应该也会像秃鹫看到尸首一样蜂拥而上。我一直想采用W的建议写一个自动测试,结果昨天天气非常好出去爬山了,晚上把两个月的衣服都洗了。。。有人吐了吗?
据说是愚人节,但是对于我来说应该没有什么区别,晚上回家的路上心情格外的郁闷,是一种莫名的郁闷。ctrl+shift+U可以用来变小写为大写。为什么郁闷呢?不是很清楚,大概是觉得自己蹉跎一生郁郁不得吧,更直接的是觉得肚子太饿了,这个理由可能更佳的真实。早上试验了半天也不明白到底内存有没有泄漏,很像,可是。。。昨天,M&G把我找去,重新拾起那个块被我忘记的课题,M问我是否要换一个课题,G拼命说不要,我心里在想换什么呢?昨天在telnet命令行用smtp试图发邮件,的确主要的网站都不太怎么能够轻易的发邮件,我在心里还向是否我应该自己去写一个smtp,现在看来。。。计划太多了,晚上是否应该看那个triangle-plane-intersection的算法呢?究竟应该怎么办?前方的路太模糊了,我需要一盏guiding star。这两年我觉得我的vision越来越模糊了,心中的目标都不知道便宜到哪里去了,究竟我有没有destiny?
四月二日 今天天气很好吗?阳光灿烂,但是 后来下雨又刮风。
W发给我非常有教育意义的一个链接,他回答了我的关于mysql巨大数量的handle的疑问,非常的有教育意义,摘抄在这里。
究竟是什么原因呢?数据库连接失效看网上的分析大概有三种可能:1。早期mysql的default设置是8小时断开,或者多少秒idle断开,但是5.xx版本以后default已经改为用不断开。2。客户端主动断开。3。max_packet_number设置不够,比如default是8m,如果数据集太大就拒绝连结,可是我也设成了32m,应该没有问题了。如果是我的自己的缓存导致的内存泄漏,那么我应该观察到程序的内存使用一直上升才对,可是我看到的是当大量图片被浏览时候我的程序的内存使用先升后降,这个事很正常的,因为我的缓存cache一开始北海没有全部占用的时候上升,后来全部占用了,遇到小的图片时候换出大的图片内存使用就下降,很合理的解释。甚至我为了debug关闭了缓存直接返回后就释放数据记者应该绝对没有内存泄漏的问题,可是当我连续快速重复点击链接的时候又爆出了invalid access specified rtlfreeheap的错误,网上的说法是这个发生在exe与dll之间分别用debug和release编译时候new和delete跨越dll边界造成的,因为debug和release版本的new与delete是不一样的,比如debug版本要检查分配的heap内存是否越界,(这个我以前就遇到过,看网上的说明时debug版本在分配的内存前后设置边界,就是多几个byte,delete的时候检查是否被改过)所以但从这一点就知道两个版本的分配的内存数量不一样,其实地址有差异,自然会有访问越界的问题。可是我的程序应该也没有这个问题,因为数据集是mysql分配的,释放也是他,我的程序也没有做什么呀。会不会十多个请求导致http-api的内部buffer溢出呢?这个想法也太夸张了。我其实想不明白因为到底问题是什么我不清楚,只是看到大量访问后mysql查询出错,并不知道为什么?
四月三日 今天天气很好吗?阳光灿烂 。
DC给我讲解了一下他的得意地pch,简单说就是头文件预编译,其中的一个好处就是省却了复杂工程里面的头文件的混乱,有依赖性德在头文件编译时候就发现了。今天终于把我的httpserver又改回了原来的类似于appartment的threading-mode,就是说所有的线程各自运行在自己的空间里,每一个线程有独立的数据库连接,对于mysql这样业余的数据库,我实在是有些不放心,还是不要节省那点资源了。这种增加了数据库连接失去之后的自动恢复部分,又立刻县城自己恢复还有就是监听线程在始终找不到可用线程时候强制恢复等等的策略。我持续按住F5健飞快的刷新请求,还不错server很健壮的。现在就看长时间空闲之后会不会又当掉,能不能自我恢复。网络上说,如果你娶到一个好妻子,你会幸福,如果你娶到一个坏妻子,你会成为哲学家。我想我的理想是当一个哲学家。哈哈。
四月四日 今天天气很好吗?阳光灿烂 ?我看不见什么阳光。
我像今天是最后一天改进这个server的小小project了,周末一定要开始图形部分了,否则下个星期meeting真不知道该说什么。本身mp3文件和图形文件没有什么区别,我的数据库和代码都已经写成一致的处理了,只不过在入口处我把music的链接拿掉了因为文件太大了,我本地下载都不知道等了几分钟,看来对服务器带宽的要求太高了。改成异步通讯仅仅是调用一个函数的问题,不过很讨厌的是改变原本的程序流程,这个事我不太喜欢做的事情,这让我想起了DC无穷多的不可理喻的地方,一个函数超过700行代码,而且它的代码是那种else缩进的风格的,可能要比我的风格多出30%的行,所以可以称之为“千行函数”,其中无穷的if-else而且使用大量的全局标志,if嵌套好几重的,你可以想象这就是非科班出身全拼亲身摸索实践出真知的结果,当然我也很佩服他读这些代码的能力,(肯定会有错误这是不用说的,因为没有人是神仙,都会犯错的。)问题是他就是不肯,也难怪50几岁的人对于自己的自信是比年轻人多得多,如果我在他面前可以成为年轻人的话。不过有一个小东西值得记录,再vc6下debug跳出来汇编浏览窗口(disassembly)是非常让我讨厌的,有时候我断点设错了找不到出来的函数,DC告诉我的他的方法是把那个disassembly窗口始终打开但是隐藏起来,然后看stack窗口看是哪一个函数调用的就可以出去了,这的确是不错,在对于工具的使用上DC是非常的精通,或者说因为我基本上不怎么用调试工具的关系。(这句话有些问题,我回想这可能说明几个问题:1。我写代码bug少?我不太相信,可能少一点因为有时候慢。2。我很少调试非常庞大的project?可能吧,当时在cluster上并行的debugger学起来非常的繁杂,而且图形的数据那么大就算有了你也看不懂那些数据代表什么。3。我不 重视工具的使用,工欲善其事必先利其器。)
今天早上的努力好像有白费了,server在晚上的时候又挂掉了,但是我几乎可以肯定我的程序没有内存泄漏的问题,因为没个线程在自己的空间运行(数据不共享)所以也没有同步的问题,(唯一共享的是http-request-handle,但是对于这个东西我认为它本质上就是windows里面做异步i/o的那个文件handle一样,这么普通的东西可能也没有问题,而且我是用一个单独的线程监听,所以也没有同步的问题,对于以前http-responese的时候用户吊线我现在统统忽略因为他根本不是错误,这么一步不排除似乎问题是处在mysql身上?再做一下测试吧,如果我的数据库恢复失败那就说明时mysql的问题了。试验一下让搜索引擎来帮忙测试吧,比如我把几个关键字写在下面很快就有大量的引擎像秃鹫扑死尸一样冲上来。
陈冠希和张柏芝的“艳照门”照片不在这里:删除了。
陈冠希和所谓的阿娇的不雅照片不在这里(这个女人是干什么的,我始终不知道,哈哈。。孤陋寡闻至此。)不在这里:删除了。
(我想看看到底我自家的破电脑能够承受多大的压力)
我觉得我的服务器现在很强壮了,下午的错误是因为我输入负数index造成的,虽然拿个线程出现了访问错误,但是其余的线程海正常的运行,所以我一点都没有察觉服务器那投出了严重错误,说明程序的robust很不错的。心情终于开朗起来。
现在这个版本非常的稳定了,问题变成服务器能够支撑多少人同时访问,效率如何。
四月七日 今天天气很好吗?阳光灿烂 。
我的服务器非常的强壮(robust),首先,每个线程个绝不互相影响,即使有几个线程当掉了,只要监听线程工作,整个系统还是能够正常工作的,其次,数据库出现的异常我虽然没有办法防治,但是我可以让线程重新连结,虽然这个改进非常非常的简单,但是效果非常的好。我现在这个版本已经正常运行好几天了,始终正常,再重新连结之后内存清理应该会更好的运行。所以这个模式我觉得比较得适合小型服务器和较低并发的状况,他的稳定性很好。
四月八日 今天天气很好吗?阳光灿烂 。
连日来不断的有报道关于藏独分子干扰奥运圣火,我觉得这是一件好事,国无外患常亡,大多数中国封建王朝的灭亡常常是因为“天下太平,万方来朝”,当然这从来就是统治者的一厢情愿,天下从来没有太平过,万方从来没有真心实意来朝过,中国目前的cctv+人民日报模式的“媒体专政”塑造出了这么一个“天下太平,万方来朝”的海市蜃楼,生活在其中的人们如同当年鲁迅《呐喊》自序里面那些昏睡在不透气的铁皮屋子里一样,有个别人稍微警醒实际上要承受比旁人更加痛苦的清醒的死亡进程,从内心来说在昏睡中死去要比在昏睡中死去痛苦更加百倍,结果都是一样为什么不能少些痛苦?所以索性天天看cctv那些“1984”似的“老大哥”无休止的洗脑新闻,因为那些经过精心删减挑选的消息“令人振奋,团结一心,催人上进”。你只要翻看一下世界上的宗教布道就可以找到类似的效果,世界上的所有的精神控制,包括无数多的所谓邪教都是如出一辙。
所谓西藏事件大多数有理智的人并不怀疑暴力的成分,问题时gcd还要用从前的方式来处理媒体,比如立刻驱逐媒体,全境封锁,这些做法在当年处理“sars”爆发简直如出一辙,西藏独立不独立大多数西方民众只是从心理上同情,但是对于传染病的消息封锁那是所有西方政府都不能坐视不管的,因为这是切身利益相关的,结果就是gcd意识到用老的一套“捂盖子”事后塑造大批“英雄事迹”的那一套行不通,老外不买你的帐。后来学乖了,但是对于西藏这样的事情下面的官员没有一个敢掉以轻心,还是老法子比较管用。
归根结底,如果没有冰川的到来猴子是不会从树上下来的,如果没有各个方面的内忧外患gcd是不会进化的,可能永远蹲在枝叶凋零的树顶上向人群展示它的红屁股。
我抽了一些我每天“宝贵”的时间看了一下youtube上的各方意见,感觉这一切都是gcd自作自受,首先,cctv指责西方媒体歪曲报道拿了很多尼泊尔之类国家的暴行的照片混淆视听,不错新闻媒体在全世界大多数国家都是一种商业产品,只有极少数政府专制下是宣传工具,那么作为商业竞争当顾客需要而供应商没有产品的时候怎么办呢?回过头来看西方媒体为什么会这么做?原因是没有渠道,事件一发生所有的西方媒体被赶出了西藏,有必要吗?除非你准备使用大规模流血镇压,否则让喇嘛打死一两个西方新闻记者不是更好吗?我觉得gcd反应过度,害怕这个东西规模扩大影响所谓的奥运,你越怕他就越来,索性豁出去,让喇嘛们砸烧抢捎带脚的干掉一两个记者更加血淋淋,(估计下面的官员不敢负责,保乌纱第一。)你封锁了新闻然后指责西方的小媒体歪曲,拜托,那些个小电视台哪有钱去雇人去西藏,连大媒体都没有消息,他们更加没办法,不得已只好从资料库里面找了。这能怪谁?其次,世界人民对于一件事有多个版本的一件本来就习以为常,不要以为大多数人都是傻瓜,那些激进分子哪个国家都有,基本上都不是主流,(否则就不算激进了),那么怎么处理这些人?人的精神能量不释放会造成更多的后果,给他们一个发泄的场所,比如西方社会资产阶级为了麻痹劳动人民的反抗精神就直接妓院妓女合法化,用这一套怀柔方法瓦解阶级矛盾,gcd也完全可以效仿,以来增加税收丰富劳动人民精神生活,做到既有州官放火也有百姓点灯的与民同乐的“和谐”社会,同时也把一大批从事三产的劳动妇女正式纳入无产阶级的行列,一夜之间增加几千万的潜在的共产党后备军也是一件大好事,各阶层都有“民意代表”的人大制度将来也可以考虑在妓女中直接发展几名具有三个“代表精神”的“人大代表”,否则这个“人民”代表大会制度就不够完善了。西方的人权社会很多还做不到真正的人民代表大会制度给超前一步连同妓女都代表了岂不是更好?说不定很多各级省市领导人还可以在“两会”期间“亲切会见”新当选的妓女代表,新朋老友欢聚一堂,共同叙谈当年夜话,其乐融融,创造出一个“超和谐”和会。
疲惫的一天。
1。如果你要创建compatiblebitmap,那么不要从memoryDC创建,因为他是mono的,要从原来的dc,同时你不要把你创建的bitmap捆绑到original的那个dc,药用comaptible的dc才能在上面画东西,msdn写得很明确,我也试验了吃了不少苦头。
2。你如果用getcurrentobject获得的bitmap的handle,你使用getobject会失败的,同样那个handle用globallock会爆出非handle的错误,我的解释是那个内存是不能访问的系统内存,因为brush用这种办法是可以的,至少msdn的例子是这样的。
3。慎用invalidaterect指定特别区域重画,或者validaterect指定特别区域不画,因为我自己后来忘记了调整了布局结果始终都画的不对这才想起了这个害人的东西,其实最好的办法适用画的先后顺序,这样可以避免使用invalidaterect,当然这是个人看法。
4。使用所谓的scrollwindow,你要把资源里面的windowstyle改称resizeable,否则你就是瞎忙,同时所谓的scroll,都是要自己重新画出来的,(当然我估计有些控件可能是帮你做了一些工作,但是基本上是你自己重画的。)
5。关于当前window里面得snapshot存到磁盘文件,原本我的方法是使用一个compatibleDC和自己创建的compatible德bitmap,然后永远有的dc进行bitblt,但是这有缺陷,首先,原有的dc有可能包含了重叠的东西,比如你当前的窗口上有另一个窗口,(我的例子就是我打开savefiledlg的window也重叠在一起了,所以这个是纯粹的snapshot,并且scrolwindow的看不见部分有可能就存不上了,所以最好的做法是不用bitblt而是使用一个专门的画全部方法在你创建的compatibledc连同compatiblebitmap上重画一遍,注意refresh-background也要不仅仅局限于clientrect部分。重复前面说过的,一定要用compatibledc,不可以用原来系统地dc。
6。所谓的resize的window实际上是windowstyle这个是在创建windowclass的设定的,如果是mfc的话,应该在资源文件的属性里,(其实我在就想到了,但实在dialog资源的属性里找了很久就是看不见,哈哈。。。)所以,wm_size,wm_sizing仅仅是一个通知事件,是不能像scroll事件那样来实现resize的。
rdp=remote-desktop-protocol这个东西要有时间去看一看,应该是一个核心的东西。
四月九日 今天天气很好吗?阳光灿烂 。
我的记忆力太差了,做过的东西没有留下记录就忘得一干二净,所谓鼠标右键菜单其实非常的简单,就是使用一个所谓的trackpopupmenu的函数去画通过createpopupmenu所创建的菜单,只有一两个东西需要注意,trackpopupmenu的坐标是相对于screen的,所以,你要用getwindowrect来获得相对坐标,所谓菜单都是一些id,自己定义一下就是了。另外创建createcopatiblebitmap失败的原因不是内存太大的问题,而是bitmap必须宽度满足align32的要求。听说yahoo要破产了,我赶紧把我所有的再yahoo-group的存档转移到微软。
四月十日 今天天气很好吗?阳光灿烂 。
DC说getdibits里面的那个pal的flag从来就没有看到有人用过,我也将信将疑,联想微软很多gdi函数都有些虎头蛇尾,比如我原来试验了很久才发现用bitmap的压缩格式存储jpg,tiff是没有实现的东西。此外,我今天对于paletteentry的rgba顺序和bitmap-colortable的rgbquad的bgra顺序发了好一阵呆,是否我应该自己去调换呢?我的意思是如果我存储palette的bitmap时候,比如8pp?DC说不用,我还是将信将疑。
四月十一日 今天天气很好吗? 下雨了很冷。
回到家发现服务器当掉了,最后一个错误好像是121=ERROR_SEM_TIMEOUT=“The semaphore timeout period has expired”,我猜想会不会是网络连接的超时?比如dns服务器的超时?我在命令行敲入ipconfig /displaydns先是localhost的timetolive是一个大约4天多的秒数,会不会使这个超时呢?
DC总要显示他比我强,我不知道双击window-caption导致最大化是什么事件,他就笑,说那时属性,让我取handle-ongetminmaxInfo,我说fullscreen不是自动的吗?他又开始揶揄我的所谓automatical,我要设定maxsize,要使用systemparametersinfo来获取workarea的面积。处理mouse-wheel实在是太简单了,总的来说对着事件写回调函数我当年没有学过任何计算机的都可以做到还能很快成为小公司的程序元,可想而知,但是要进步到一个初级偏上的程序元,就是能够按照msdn熟练使用各种api,那还真要上过计算机本科才行。今天又明白了一个简单的道理,在处理bitmap的时候,系统compatible的hbitmap句炳并不能获得所谓的palette,你要明白palette是和dc相联系的,因为bitmap都是一样的,(尤其是16色以下的依靠palette的颜色),需要靠系统地palette来解析,所以才会出现所谓的不同机器的色差,这个和显示器的色差又是另一回事,比如某种256色本系统没有就只能找相近的颜色代替,那么你在存储256色等得bitmap图时候怎样获得palette呢?我一开始想当然的以为用getcurrentobject获得当前的hpalette,然后用getpaletteentries来获得palette,1。我昨天说了paletteentry的rgb顺序与bitmapinfo的colortable就是rgbquad的rgb顺序颠倒,2。使用getpaletteentries只能获得系统默认的20个palette,这是我一直没有想通的,后来看见dc跟踪才明白不需要这一步,因为你一定要用getdibits来获得bits,同时你得colortable就被填满了,3。使用getdibits的时候,是否bits的buffer要和header+palette的bitmapinfo相连呢?我记得我以前做过实验室不需要的,今天又在问了一遍,同时试验结果也证实了,但是dc说的有道理,如果相连的画可以直接送到clipboard作交换,当然是好的了,而且写bitmap文件也一气呵成有效率。我今天费了很多时间没明白的是在于读msdn粗枝大叶,16色以下的bitmapheader的colorused如果设为零表示最大可能的颜色,所以,计算文件长度时候要小心。DC好像还专门去handle一个bitmapcoreinfo的结构,我猜想这个会不会是早期windows之类的结构?SetTimer一开始被DC认为是创建新的timer,我读msdn觉得不像,他叫我看process-manager的handle是否增加,结果不是的,所以说帮定window的timer使用id的话是单独的timer,set相当于reset-timeout。
四月十二日 今天天气很好吗?下雨了很冷。
早上去健身房,感觉在这种地方呆上两三个小时是很开心的一件事,因为心思纯粹,身心如一,然后去实验室想把那个该死的东西写完,可是我的懒惰是不可限量的,当然也是很疲惫不堪,看着看着就睡着了,熬不住了就随便吃了一点东西回家睡觉了。一睡就是一下午其实也不算睡觉,实际上是躲在被窝里看eeepc里装的《射雕英雄传》,哈哈。晚上看mr.bean's holiday梦想着将来沿着他的路线去法国,最好能够骑自行车旅行,哎穷人的梦想,不过我想这是富人们所永远体会不到的快乐。也许大多数人的一生都是一个笑话,只不过大多数人讲给自己听,少数人讲给大家听结果被大多数人羡慕得要死。我想如果我要真地想知道真相就只有自己写一个简单的文件loader替代mysql这样我就知道到底是httpapi的问题还是mysql的问题了,问题是我真的有时间吗?或者说不是时间而是一个人的热情,passion是否存在?
逃避并行编程的方式就是看<yes,minister〉知道什么叫做quango吗?字典里没有,看了wiki才知道,这是哪一类的NGO的总称,尤其是那一类的号称非政府组织实际上是政府操纵的组织,比如说“政邪”,“公贿”,“哄虱子会”等等。部长往往是最后一个了解真相的人,因为按照那些官僚的说法就是部长不应当知道得太多,比如特工被抓住以后会被拷问,如果他们知道真相就会说出来,所以干脆不告诉他们真相,所谓的need-to-know。有一集叫做<compassionate society〉中文翻译过来就是所谓的“和谐社会”。
四月十三日 今天天气很好吗? 又下雪了感觉比冬天还冷。
早上去试验室又睡着了,结果很不理想,也不知道什么原因,回头再说吧。
四月十四日 今天天气很好吗?感觉比冬天还冷。
心情非常得不好,期待中的没有发生,当然实际上我还是预测到了,只不过还是非常的郁闷。DC属于中国话里那种刚愎自用类型的,处处要显得比我强,他有不少的奇技淫巧,比如说如果你的函数里面有一大队的指针,突然一下你打算把他都变成引用如果他是参数的话,我以前非常烦去一个一个地把"->"该城".",DC说他声明一个宏,这的确是一个好办法,因为从性能上说完全没有影响,不像你声明一个变量去赋值由损失,而且编译器都明白的,code-completion照样使用。对于CString我一直没有用过,前两天临时抱佛脚用了一下才明白这个东西好象以前delphi里面的智能string一样,再pass-by-value的时候效率非常的高,因为他是一个“延迟”copy的方式,一开始仅仅是copy指针,直到有改变的动作发生的时候,检查引用计数,如果不为零就说明有额外的拷贝在被使用中,这个时候再真正做拷贝以便改变,而且普通的时候应该你不需要关心同步的问题,在引用计数增加的实现种内部使用了incrementlock的机制,当然如果有多个线程修改我觉得还是应该使用lockbuffer来的安全。我第一次使用不小心翻了一个大错,声明了一个结构包含了一个cstring然后随手使用zeromemory初始化 那个结构,就是memset之类的,结果你当然可以想象了我总是遇到cstring出错,因为我把里面的东西也给干掉了!
有些老问题我反反复复得遇到就是老犯错。1。系统地dc是不可以被你是用来做“画板”的,可实施bitblt之类的source,不可以是dest,即便是src也不能使你自己的bitmap,只能是系统的,(难道不对?)2。你如果创建了bitmap想要使用setdibits那么一定要使用createcompatiblebitmap,使用createbitmapindirect一般是不行的。所以缩放图片你需要两个dc两个bitmap,想偷懒使用系统的不行的。3。凭空创建dc可以使display的dc,比如createDC(_T("DISPLAY"), NULL, NULL, NULL);这当然是因为你没有hwnd的情况下,凑合着用吧。4。ijl里面的jpegcoreproperties的jpgcolor,dibcolor不是普通我们的colorbit,是猜出来的,据说jpeg根本不能知道colorspace,所以jpgchannel:1=IJL_G,3=IJL_YCBCR,其他=IJL_OTHER。我当初不理解。
最近闹得沸沸扬扬的西藏事件及其引发的火炬事件我只觉得很可笑,双方都很可笑,纯粹庸人自扰,不妨冷眼观瞧。首先,gcd自己混蛋为什么要搞新闻封锁落人口实?当初申办奥运的时候就应经答应要新闻采访自由,为什么不敢?造成今天这种情况纯粹是应对无方,事情搞得大了让几个官员下台未必是坏事,问题是不可能,所以不妨再高的轰轰烈烈一些。至于说那群藏民,原本就是无知无识的农奴你能拿它有什么办法?西方社会同情弱者未必是坏事,暴民暴动说明已经绝望,所以更加不用担心,但反分裂主义走向恐怖暴力就说明已经失去民意,所以更加不用担心,只要暴乱的范围限制在西藏不妨再乱一些,不妨多放一些cnn和bbc的记者进去,管杀不管埋,有什么好怕的?
感觉很冷,也许是血管里的血在变冷,曾经得令人热血沸腾的东西如今变得如同从窗外钻进来的冷风一般令人不寒而栗,年轻的时候幻想着我和我的梦想远走高飞,如今发现生活的轨迹如同一个个的同心圆,画完了一个圈还有一个圈,只不过有时候在外面画有时候又回到了圈里面画。正应了那句陈词滥调,少年不是愁滋味,如今忧愁有时比三千丈的长发还要长。
四月十五日 今天天气很好吗?感觉比冬天还冷。
ip地址变了,现在是CGX的图片在(删除了,忽然觉得那个毕竟是陈冠希本人及其当年女友的隐私,如果换坐我是什么感觉?) 感觉完全没有办法解决这个问题,只好使用下下策,用__try__except,语法有些不太明白,感觉就是要么__try__except,要么__try__finally不能够三个一齐用,而且finally是在外围得except执行完之后在执行,msdn的例子是这样的,也是很合理的。再试验一下吧。
从来没有真正的有意识地去使用unicode及其wchar_t,今天才明白了一个基本道理,再little-endian的系统下,short的高位地址先读进来,那么wchar_t定义的字母'a'就是低位'a'高位‘0’,于是按照short就仍然是'a'因为高位是0,这个的确好,因为,我需要把wchar_t转为char,因为mysql的一些参数直接受char,于是使用字符拷贝一个一个的拷贝就可以了。
感觉如果你要保证你得code不论在什么意外之夏都能保证释放资源是一件相当不容易的,DC这一点说的对,如果你相信msdn的粒子都能工作你就是太天真了,很多例子都有相当严重的问题,不要说保证资源释放了。比如今天看的那个clistctrl的一个sortitem的简单例子,我搜了一下google就发现有人说那个不可行,因为mfc的callback的参数是和资源帮定的32位整数并不是item的index,反正我试了一下发现有别的问题,就是callback的参数都是0,也许因为我市debug用得自己马马虎虎创建的item哪里有什么不对吧。感觉mfc太庞大了,至少要专心致志学习两三个月才能入门,我觉得这对我来说是最基本的,gdi总共就没有几个函数我差不多花了一个多月才有写入门道。mfc至少十好几倍,当然很多我可能根本不用,或者使api的包装,有些应该是stl的包装,使用起来还是容易的。制造工具是区别人类和类人猿的标志,马克思并没有强调说使用工具,看来能够使用工具并不能保证你已经进化了,我离一个直立行走的人还差不少呢。
四月十六日 今天天气很好吗? 阳光灿烂。
今天终于独立弄明白了listview的sortitem的解决办法,msdn上错误累累,你要全信就是白吃了,当然那是一个guide,告诉你方向。1。再insertitem的时候,listview内不会帮你额外保留一个LVDATA的东西,你可以看作是一个索引数据,这个可以用SETITEMDATA来设定。2。插入数据的时候使用INSERTITEM会返回当前的INDEX,然后你可以使用这个INDEX再来用SETITEMTEXT来设定其他的“栏目”,我在这上面吃了亏,因为拷贝MSDN的例子就犯傻了,普通都以为每次插入当前的INDEX应当递增,其实不是,每次都是插入位index=0的位置。3。再listview里面原本就有一个style时enableheadsort,意思就是允许clickheadcolumn的时候发出sortitem消息给listview,所以,developper只需要处理一个sortitem的函数,把一个用户定义的comparison的回调函数当作参数传进去,同时你还要给你的回调函数传一个自定义的参数。4。这个自定义的参数很重要,首先当前用户点击的column的index是“subindex”不是那个iItem,那个不一定会用,总是-1。其次,listview再call你得比较大小的回调函数时候有三个参数,前两个是当前要比较的两个行得item的lvdata的lparam,这个就是你在使用setitemdata设定的一个32bit的数,最简单的是把这个item的行设定为这个数,可是,你不能再insertitem的时候设定因为每次排序之后这个行好就变了,所以一定要在排序前设定。5。你单单有了行号还不足以比较大小,所以第三个参数需要把listview自己当作指针传进来,同时column也要当作参数传进来,所以,涉及一个结构存这两个是必要的,否则用全局变量非常得不好。6。这里有一个需要讨论的问题,就是我再call完listview的sortitem之后并不一定系统马上就开始排序,我的参数如果是一个临时变量有可能指针做参数会失效,设定为static又有多线程不安全的问题,当然这个问题总是会有的。总之,这个问题我觉得还是不简单的,搜了一个dude夸张之极,他说得没有错,msdn的例子不行因为默认的那个回调函数的参数不是行号,所以他的解决办法是把所有的item都取出来排序,然后再重新填回去,这实在是太夸张了,真有些愧对guru的称号,各位大概google一下都能找到他的文章。我在解决之后,再次度各种对他的回应发现了和我的一抹一样的解决办法,真是应了那句老话,什么什么的所见略同,因为这是一个最一般的办法,只不过你读msdn真要被她活活气死,根本是一大队的错。DC说globalalloc如果使用gmtr做参数分配的内存是固定的地址,不能被当作vm swap到硬盘,所以不要用,我想这是对的。此外他说device-driver都是64bit-aware的,就是说他们都是使用64位地址,对此,我不置可否。这个老家伙确实是摸爬滚打出来的,我对他说他的一个等待的方法使busy-waiting有可能是系统瓶颈,他立刻就反应过来了,只给我看她基本上不用那个,即便用也是迫不得已,比如logoff的时候当前thread不能yield,必须等待完成当前任务才能yield,因此,这个不算错,其次,他讲了一