Bill's profile这里是我博客的备份PhotosBlogLists Tools Help
    November 10

    美剧,我认真看过的美剧

    美剧,我认真看过的美剧

    我做大多数事情都没有耐性,包括玩游戏。我玩通的游戏好像也不多,倒是看过不少美剧,算是我一个主要的爱好。我觉得美剧即便情节再科幻,看起来也要比国产的电视剧来的真实。我曾经听说《董存瑞》那个电影的编剧承认手举炸药包说的“为了”云云是“艺术再加工”。“再加工”我懂,“艺术”我实在是看不出来。美剧里面的人,即便英雄也可能死的很平静,所以比较真实。我很想写几句,说一下我认真看过的剧:
    1、六人行
    看六人行的原因其实很俗,为了学英语。但是看了一季以后就开始关注剧情了。六人行是一个很平实的剧。甚至到现在我已经想不起来很多故事的细节了,只记得故事的主线,但是仍然能想起当时看的时候很愉快。六人行虽然是个喜剧,但是最让我记忆深刻的情节不是搞笑的画面:第二季的时候讲六人楼下住了一个老头,那个老头特事儿,经常要找六个人的麻烦,嫌他们很吵。但是突然有一天老头挂了,而且还把他的公寓留给这六个人。他们去收拾完遗物的时候,钱德勒对着空屋子说,we try to keep it down。这个剧情看完了老有一种说不出来的感觉,至今还都记得。六人行是那种看完了能空虚的剧,让人一时间不知道该干什么了。
    2、CSI
    我一直对法医这个行业特别有兴趣,我不止一次说如果被迫要去学医,我一定当个法医。普通的医生用刀分析瘤子,法医用刀剖析的则是故事。最开始听说CSI讲法医的故事,我就非常有兴趣,并且听说它在讲故事的过程中演示很多法医的原理。CSI虽然讲的是罪案,但不是那种很紧张的剧。我觉得看了这么多季,它里面实际上在讲犯罪,讲人性,讲法医这个职业。我觉得法医是个挺不容易的职业,需要有很强的敬业精神,法医同时也不被人理解的人群,感觉他们生活的圈子挺小的,就是同事几个人。CSI系列实际上分为3个剧,我只看拉斯维加斯版的。
    3、越狱
    越狱是个比较火的剧,但是很可惜在第二季的时候走了下坡路。我总感觉好像那些编剧没有料到越狱能拍到第二季似的,因为明显第一局的情节很有章法,有一根主线,那就是逃跑,每当主人公遇到危险,情节脱离了这个线的时候,观众就能感到紧张。密集的情节让观众忽视了很多的bug,即便最后发现了,也都原谅了编剧。但是第二季有点不温不火,而且剧情发展没有一个很好的目标,感觉众人像在遛弯一样。不过这个状况好像在变。
    4、24小时
    讲的是一个莽撞的不死小伙儿的不死故事。这个剧纯粹是因为情节比较紧张,容易上瘾我才看了2季。看的时候停不住,但是事后觉得也就是那么回事。主人公和他的几个同事强的已经近乎科幻了。在24小时里面,中国人的形象并不光彩。这让我想起了前段时间谍中谍被禁放的事。我其实一开始也不太舒服,但是后来看到一个论坛的帖子才把这个事情看明白,24从头到尾实际上讽刺的都是美国人自己,在第5季的时候,他们连自己的总统形象都给颠覆了。我觉得能这么做挺了不起的,没有什么绝对的权威,即便是总统也可能龌龊做坏事。拍拍电视嘛,何必较真。能拍出这样电视剧的社会一定是个宽容的社会,中国拍同样的剧情肯定不让放的。
    5、Cold Case
    cold case应该不是很热门的剧,但是我喜欢。它讲的是一些侦探专门破获那些陈年旧案,昭雪沉冤的故事。应该说在罪案剧当中算是比较温馨的一部,尤其是看到受害者的影子在对着这些侦探们笑的时候。这个剧的音乐是比较考究的。
    6、Heroes
    我好像看到一个地方把这个剧翻译成“逞能英雄”,挺有意思的。讲的是一群有特异功能的人阻止一个至今还没有看出名堂的大阴谋,据说是电视剧版本的x战警。不过主角们都是些草根人物,穿着也不算怪异。这个剧是才出来的,据说已经被电视台预订了一整季。是比较有潜力火的一部。特技也还不错,死尸做的很恐怖,很能满足视觉刺激的要求。
    7、futurama
    这个是动画片,以前专门写过一个帖子介绍了一下,这里就不重复了。简直是太棒了。

    just another way to grab blogger to wordpress 把blogger备份到wordpress

    just another way to grab blogger to wordpress 把blogger备份到wordpress

    after i did the blogger backup, i decided to actually make a backup at wordpress.com. the wordpress.com is banned in china, so i used tor. however, the official importer for blogger seems to be complex to use, it will change some blogger settings. you have to backup your template and settings to restore your blog in case of trouble. i just cannot take the risk on ruining this site, and since i just did a blogger backup app, i had the idea of modifying the blogger backup to generate wordpress files. AND IT WORKS! just import all my blogger entries to http://billconan.wordpress.com/ .
    刚刚写完blogger backup之后,我想在wordpress.com上面真备份一个博客,用tor代理上的。但是官方的导入工具好像要更改blogger的设置,所以用户必须先备份模版和设置。并且我试了一下,登陆不成功。我不敢冒险毁了我这个站,所以想到干脆改一下刚才的blogger backup,让它能生成wordpress的导入文件。现在我已经将这个站点的所有文章备份在了http: //billconan.wordpress.com/ 。

    blogger backup 备份blogger全站的工具

    blogger backup 备份blogger全站的工具

    it seems that the censorship on wikipedia.org, which used to be strict, is kinda relax recently. i can log on to that site now without any extra effort, no proxy, no tor. and today there are lots of people talk about this, they are afraid this is only temporary. so i thought of blogspot.com, how, if they banned blogspot.com again? i need a tool to download all the entries of my blog and save to a file as a backup. you know, sometimes, it is hard to be chinese.
    i actually did this by modifying the sample code enclosed in the google api pack. for some reason, probably the poor network, the app doesn't work sometimes, so, just try more times.

    How-to-use:
    1.specify the login name and password.
    2.click "GO" button and wait.
    3.all the blogs under this name will be available in the choose control, just choose the one you want.
    4.wait for a while, and all the entries show up in the tree view. click "save" button to export to a html file.

    最近好像wikipedia.org要解禁了,我已经可以不用代理访问到英文的维基百科。网上最近关于这个事情的讨论挺多的,有人担心是临时现象,空欢喜一场。我于是想到万一哪天blogspot.com再次冷不丁被封该怎么办。于是我觉得应该有个能备份整个站点的程序。我这个程序实际上就是从google api里面附带的例子改的,但是有些时候运行不成功,要多试几次。现在只能抓html的代码,看看哪天有时间做一个能把图片也都抓下来的。
    这个的用法是这样的:
    1.填写好你的用户名和密码。
    2.点击GO按钮等一下。
    3.然后所有在这个用户名下的博客都出现在下拉选择中,选择要备份的那个。
    4.再等,然后所有的网志就出现在树形列表中了,按存储按钮,可以生成一个html的文件。

    this is how a buckup file looks in firefox:
    备份的文件在firefox里面的效果:

    click here to download
    点击此处下载

    one more thing is, blogger backup is writen with c#, so .net framework 2.0 is necessary to run the app.
    c#写的,要.net 2.0才能运行

    学究一下,编了一个radiosity辐射度渲染程序

    学究一下,编了一个radiosity辐射度渲染程序


    今天我编了一个radiosity的偷懒算法程序。
    很早以前,我在 azure的博客上看到他做了一个辐射度的渲染程序。当时我没有仔细看,但是有一点印象特别深,就是他把摄影机摆在patch上来模拟能量的入射。我不知道这个想法是不是他原创,但是真的是太聪明的一个偷懒办法了。传统的辐射度需要做很多射线,然后再和多边形求交,现在可以用现成的摄影机来替代,简直太省事了。
    这样一来,辐射度程序实际上变成了这样的一个过程:
    首先组织好一个场景,这一步我是在3D Max里随便做了一个房间,房间上开了一个窗户,用来透进点亮光,作为初始的光源。房间的中间放了一个柱子,主要我想看看这个柱子能形成什么样的影子。在 3D Max中导出成obj格式的文件,然后把里面的数据直接粘帖到代码里,改了改,存放在数组中。
    然后为每个面开辟光照贴图的空间,并且计算法线,切线。
    将贴图分解成小patch,计算每个小patch中心点在3D场景中的位置,在这个位置上放置摄影机,拍摄当前的场景。将patch中心映射到3D场景中的公式是这样的(四边形v1、v2、v3、v4):
    v1+(v2-v1)*u+(v4-v1)v 其中uv是贴图坐标,v1、v2、v3、v4是四边形的端点。
    渲染的场景存放到一个空间中,我的程序里是一个64见方的数组。然后对这个数据进行分析,得到一个当前patch的颜色。分析的过程是,首先计算这个64见方的图像上每个象素距离中心点的距离,根据这个距离得到一个权重。为什么需要权重呢?因为在传统的辐射度算法中用的是射线来模拟光照,光照对于颜色的影响取决于入射的角度。因为我这里没有用射线,所以无法得到角度,但是摄影机得到的图像中,点的位置离中心越远,说明生成它的入射光线的入射角就越大,所以在最后决定颜色的时候越不重要,这样将所有点的权重计算出来作一个加权平均,得到一个颜色值。但是这还没完,还需要乘以一个数值,这个数值是一个近似的能量衰减。光在传播的过程中能量是衰减的。实际上这个衰减和光的传播距离应该是相关的。在传统的辐射度计算中,射线和多边形相交的同时可以得到这个距离,这样就比较容易计算精确的衰减。但是因为这个是偷懒版的程序,不能得到光源距离当前面长度。所以就简化假设任意距离的光源产生的光照都要衰减一个固定的比例。我的程序里用的0.2。当然也可以这样来假设,光源距离当前物体非常远,而当前物体中(我的这个房子)的所有面之间的距离相对于这个光源与这个房子之间的距离可以忽略不计,这样的话房子中各物体的衰减差别不大,就近似成一样的。
    以上就是我的懒汉版光照模型。
    一开始我在这个程序中用的贴图是 128*128的,感觉稍微有些粗糙,后来改用256*256的,速度明显变慢了。不过最后出来的结果我总觉得别扭,但是又看不出来问题。不知道是不是我的懒汉光照模型有问题,还是我的程序什么地方疵了。有时间再看看。左边这个图显示的是如何从最开始的初始场景逐步照亮的过程,就第一次辐射变化比较明显,后面的变化及其细微。

    维基百科周年祭

    维基百科周年祭

    转眼已经到了10月份,昨天突然一下就冷了。算起来维基百科挂了也有一年了吧,有多少人还记得他呢,我觉得有识之士都应该来写一写。每本被烧的书都照亮了世界。这是爱默生的名句,说的多好啊。当然我也承认,这句话套用到网络上,说每一个被封掉的网络都曾经照亮了世界,确实有些过了,因为的确有比较龌龊的站点。但是维基百科,确实是照亮了世界。
    好像封杀网络的原则是这样的,已知有一个新站,则首先把它放在被封杀之列,然后如果比较老实再酌情解禁。比如说wordpress.com吧,因为是一个任何人都可以发表的网站,所以保不准哪天出点什么言论,所以不管三七二十一先给它封了。这分明是典型的人性恶论。共产主义者不是首先应该是人性善论者么?马克思,你说是吧。
    明哲保身吧,我才不要当什么夏明翰。引用一些名人名言,可都不是我说的啊:
    每本被烧的书都照亮了世界。—— 拉尔夫·沃尔多·爱默生
    “未来是那么的不可知”。Technorati的死掉、Google的“连接被重置”,都让我看到了作为一个中国IT工作者的信心。—— 老白
    也许哪一天,我们用的都是国货。
    我们与中国政府全面合作是因为开始相信“中国改变互联网”,而非“互联网改变中国”。—— 辩护律师
    Google、Yahoo、微软及思科在美国国会为有关帮助中国政府进行网络审查的辩护辞。
    (这里我补充一句,从长远的角度来看,应该是科技左右政治,比如说工业革命催生资本主义,但是貌似现在这里是政治在左右科技,看看什么是违背历史规律吧)
    每一个人,只要是正常人,都有着各种各样千奇百怪的思想。甚至可以说,思想天然就是“异端”。—— 魏武挥,《书籍的版权》
    不多久,蜘蛛也要备案才准上网了。——网友
    重庆要求个人在家上网也要备案。
    现实中用真名说假话,网络中用假名说真话。—— 西山晴雪
    ……不光是挡住了你们不舒服的信息,也挡住了中国人同世界对话的路。唉,能将就看点就将就看点吧。其实在这个问题上,是不屈服全部不能看好呢?还是屈服一点然后也能将就看一点好呢?我是倾向于后者的。—— Wales
    Tor 这个工具不是用于绕过什么的,而只是用于防止私人信息泄露的。任何人都可以安装Tor的服务器,安装后就可以方便地得到全部在线服务器的IP,并且,你用 Tor连接时很可能会经过这个假的服务器,然后就无所遁形了。所以也不要对它太有信心。—— Boingboing在说明德国人Tor事件的贴子中指出
    只要我还能有所选择,我就只想生活在这样的国家里,这个国家中所实行的是:公民自由、宽容,以及在法律面前公民一律平等。公民自由意味着人们有用言语和文字表示其政治信念的自由;宽容意味着尊重别人的无论哪种可能有的信念。—— 阿尔伯特·爱因斯坦
    一部分儿童有思考的习惯,而教育的目的在于铲除他们的这种习惯。—— 伯特兰·罗素
    从每天上学的时间看,中国儿童最有思想。(目前互联网也在做同样的事)
    有些同志有信心封掉一切可能的风险,是因为有些同志对中国的网民没信心。我们总是以最没有信心的方式,来表现我们的信心。或许有一天,当中国网民对所有国外的服务都不再有信心,一定会有人因此自信心爆棚。这几乎是一定的。—— keso
    把有限的技术,集中到封锁网站上。
    网民人数多;言论渠道不畅。—— 网友
    论坛在中国特别火的原因。
    谈恋爱是以自欺始,欺人终;搞政治是以欺人始,以自欺终。—— 李敖
    “和”的右边是口,就是说人人都有饭吃;“谐”的左边是“言”,就是人人都可以说话。—— 张贤亮
    全国政协委员、作家张贤亮所理解的“和谐社会”的基本精神。
    不 矢口 亻十 幺 日寸 候,亻奄 口斤 言兑 言仑 土云 有 辶寸 氵虑 白勺 言兑 氵去,于 是,亻奄 学 会 了 扌斥 字。后 来 , 亻奄 米青 礻申 分 裂 了。—— 网友
    请以恰当的格式阅读……
    我不同意你的观点,但我誓死捍卫你说话的权利。—— 伏尔泰
    在人类文明史上,哪个国家是靠政府管制做起来的?几乎没有。政府管制和不受制约的行政权力,是贫富差距恶化的根本原因。—— 陈志武,《陈志武专访:正视我们的不幸福》

    Pillow简介

    Pillow简介


    一直缺少一篇关于Pillow的介绍,现在补上。Pillow是一个我编的轻量级多边形3D建模程序,目前的目标是在模仿silo(www.nevercenter.com) 的功能。这个程序还处于初级阶段,实现了一些基本的多边形建模操作,比如对点、边、面、体的挪动旋转以及缩放操作、删除、焊接、切割等等,另外还有 catmull-clark细分,出于速度的考虑,目前人为地限定在最大5次细分,实际上细分的次数可以不限。因为这个程序还在起步的阶段,还存在很多需要解决的问题,但是不管怎么说是个不错的开始。据我所知很多小规模的建模工具都要开发很多年,而我这个才2个多月,何况我这个项目只有我一个人在搞。急不得。
    下面介绍一下历史:
    大概是在2004年10月的时候我开始有自己编一个建模工具的想法。当时是要学DirectX,我觉得学编程必须要动手才行,所以想到写个像silo的程序。之所以要模仿silo是因为我当时觉得silo是一个面向使用的程序,它能够合理的把操作分配到左右手,感觉工作的效率提高了。另外一个原因就是 silo是所有3D建模工具里规模比较小的。有了这个想法之后很长时间都没有什么进展,光磨了嘴皮子。不过在这段时间里我思考了很多东西。直到今年7月分毕业,我才重新开始写这个程序。我给这个程序起过好多的名字,最开始叫cedar,然后叫polygon studio,再然后叫clayshop,直到现在的pillow。这些都可以在我旧的博客上看到。
    下面介绍一下程序:
    因为最开始是为了练习DirectX,所以最早是想用c#和managed directx来写。当时还用过一个truevision3d的引擎。原因很明显,引擎里屏幕拾取等操作已经都给你做好了。但是因为引擎的数据结构特别大,效率很低,所以后来我就直接用directx来编了。而我现在的这个程序则是重新用c++和opengl写的。最开始有人问我为什么不选择 opengl,我的回答是每一个图形库都很有学问,一个尚且学不好,怎么能顾得上学另一个。不过自从接触过opengl之后,我觉得opengl没有 directx封装的利害,感觉用起来很直接。我真的很喜欢opengl。用c++的目的首先是因为要用opengl,当然tao framework我也试过,不爽。第二个原因是因为效率,交互性强的程序太需要效率了。第三个原因是因为我一直对c++不太开窍,有点不甘心。c++应该是编图形程序的首选语言。至于程序的界面,我选择了wxWidgets。我编程的时候特别会做表面文章,非常在意界面。我认为外观设计不是什么无足轻重的东西,如果苹果公司没有它的工业设计,这样一个不兼容的怪胎早就被淘汰了。不过很遗憾,我找不到满足我要求的c++界面库。我希望能够有一个跨平台,最好开源,可以换肤,控件比较丰富的界面库,但是没有。编这个程序的时候我先后用了cegui,wxWidget,qt4,但是哪个都不满意。最后选择wxWidget也是因为silo也用的是它。
    关于程序的结构:
    我的程序大体分成了三个层次,界面层负责和使用者交互,并且把操作的结果显示出来。中间的控制层负责管理整个场景,负责将图形的操作转换成对于数据的操作。这部分实际上是整个程序的核心。最里面的是数据层,存储的是场景的图形数据。场景管理器和数据层之间的交互被严格定义为一组命令,并且每一个命令都会被一个叫做历史管理器的东西记录下来,便于随时将操作进行回退。在图中,蓝颜色的箭头表示的是命令的走向,紫颜色表示的是记录命令,红颜色是显示数据的走向。
    目前我的程序还不具备undo和redo的功能,但是实际上我在程序中已经实现了。但是和界面结合的时候我没有把这个添上。因为在和界面结合的时候,程序写的有点乱。之前对于如何实现程序的核心部分,我考虑了很长时间,但是和界面结合的东西我考虑的不多。另外也是因为没有找到一个我觉得很得心应手的界面包,而我又尝试了很多的界面方案,几乎每一种界面都有自己的一套编程风格。因为历史记录这个部分是比较容易出问题的部分,尤其是容易内存泄露,我就暂时没有把它包含进来。
    当初要实现undo和redo的时候我想到要用命令的方式,每个命令都有个逆命令,操作的时候记录每条命令,需要回退的时候再调用相应的逆命令。但是很多操作,比如说求平均,是没有逆命令的。把求平均之前的情况都记录下来显然也是个比较笨的办法。后来我想到把操作分层,因为不管一个图形操作的过程有多么复杂,归根结底都是要改变数据,改变数据的方式无非就是添加、删除和改动这几种,所以我只要记录这些简单的操作,就可以应对复杂的图形操作了。实际上在我的程序中定义的简单操作要有几十种,并不只是添加、删除和修改这几种。
    什么是历史管理器呢,实际上是一个队列和栈的结构,命令被压入一个叫undo的队列头部,如果超过了队列的长度,则从队列的尾部直接抛弃。如果用户想要回退一步操作,就直接弹出在队列头部的一个命令进行回退,同时把这个命令翻译成逆命令放到redo中去,这个redo是一个栈的结构,如果要重做这步操作就弹出redo栈,执行,然后把命令翻译成逆命令再次放到undo队列中。
    要如何防止内存泄露呢,我的设计是这样的:把所有在堆中的数据的指针进行统一的管理,这个结构我叫做data pool,实际上是个动态数组。任何其它的操作只能够引用这些数据,引用是通过数组的下标,而不是指针。释放指针由这个data pool统一进行,有两种方式,一种是直接释放,另一种是当需要记录删除操作的时候,把这个指针交给历史管理器,然后当历史管理器也不需要这个指针的时候,再释放掉它的空间。这样就可以防止指针已经丢失但是空间没有释放的情况,因为任何时候被分配的空间都至少在data pool中保留了一个指向它的指针。然后通过data pool释放这个指针,就可以释放掉这个空间。基本上就是这样。
    总结:
    最开始我把我编这个程序的想法告诉别人,有人就问我,这个程序到底有什么创新的地方,既然天下多边形建模工具已经那么多了。应该说目前还没有,但是以后会有的。现在这个程序虽然很普通,但是这是今后创新的一个平台,未来有可能在这个基础上做一些真正自己的东西。通过编这个程序我学到了不少东西,也多了不少认识。我感觉c++是一个陷阱,确切地说指针是陷阱,用的时候觉得很方便,肆无忌惮。但是当程序大到一定程度,就会突然发现已经是千疮百孔了。处处都有可能造成泄露。但是一个图形的程序又怎么能不用指针呢。我也想过把它都换成smart pointer,但是不知道效率上会打多大的折扣。
    我在我的网盘里面放了一个pillow的程序,但是有些bug还没有修复,我已经编不动了,要换换脑子。我很想自己写个界面,sdl和opengl的界面,但是无疑又是个巨大的工程,不知道能不能实现。
    一些资源:
    之前写的一个pillow的教程:
    http://billconan.blogspot.com/2006/10/pillow-01a.html
    以及一小段演示动画:
    http://billconan.blogspot.com/2006/10/wink.html

    仙剑奇侠传3模型文件格式分析(2)

    仙剑奇侠传3模型文件格式分析(2)

    这个上接我这个博客的第一篇日志:仙剑奇侠传3模型文件格式分析(1)。实际上我真正看这个模型的时候好像是六月份。而写上一篇文章的时候在8月份。而这一篇拖了很久。我最开始想至少写3篇,因为虽然模型的扩展名是一样的,都是pol文件,但是实际上里面的数据有差别。比如说场景模型有个光照贴图的坐标,而在物体模型里面就没有。而现在主要分析的是物体的模型。我最初想写这个东西是因为我想要记录一下我当时思考的过程,结果倒是次要的。因为把仙剑奇侠转3的模型拆出来一看其实也就那么回事。但是现在隔的时间有点太长了,很多东西只能记得结论,当时怎么想的现在已经想不起来了。
    上回说到发现一个模型文件可能会包含很多组模型,并且在头部0x08的位置有个数值记录了这个数目。这样通过分析拥有多个模型的文件和只有单个模型的文件可以得到模型的头部长。计算的方法是这样的:
    假设整个文件有个公共的头部长度x,而每个模型有个自己的头长度为y,文件中包含的模型数目为c,假设一个只有1个模型的文件数据开始位置是a,一个有3个模型的文件数据开始是b,那么这样列个方程,就可以求出每个模型的头部长度。

    x+y=a;
    x+3y=b;

    经过比较几个模型文件,我发现很多模型的数据开始的位置(0x58)都是1500 0000。这个是一个比较奇怪的现象,因为按照我先前的分析,这个应该是贴图坐标,但是这么多的模型的贴图坐标怎么可能这么一致呢?再发现,如果按照先前假设的,FFFF FFFF 是顶点信息的结束标志,那么为什么最后一个顶点(box.pol文件)的FFFF FFFF 后面紧跟着一个295C 7F3F 295C 7F3F ,而这个数据和前面一个顶点的295C 7F3F 00D7 233B 数据这么相像。所以我开始意识到,FFFF FFFF 应该不是顶点的结束标志。因为一开始我先入为主地认为顶点有结束标志,所以我认为在头部没有顶点的总数信息,但是现在看来应该是有的。由于已知这个文件中有16个顶点,所以一眼就能看到在顶点数据区前面,0x5c的位置上有个1000 0000 数值,这不正是顶点的数目么。这下也就说明顶点的数据开始于0x60,且0x5c是顶点的数目,FFFF FFFF 不是顶点数据的结束标志,顶点的结构应该是这样的:
    struct vertex
    {
    float x;
    float y;
    float z;
    int FFFFFFFF;
    float u;
    float v;
    }

    通过和其他的文件比较可以发现,每个模型的头部有24字节长。每个顶点数据区域最开始有个头,其中最后4个字节是顶点的数目。整个文件的头有56字节长,第5个字节开始是文件包含的模型数目。
    按照这个理论把程序改了一下,发现贴图坐标也正常了。
    所以现在的结论是这样的:
    文件头
    -文件标识
    -不知道的内容
    -文件所包含的模型数目
    -不知道的内容
    每个模型的头
    每个模型的数据
    -顶点的数据
    --顶点数据区的头
    --每个顶点的数据
    ---顶点位置坐标
    ---FFFF FFFF
    ---顶点贴图坐标
    -贴图数据(固定长度)
    -面数据
    --面数据头(包含了面的数目)
    --面的数据

    按照这个理论实现的程序:
    xj3Model.c
    这个程序运行以后可以把仙剑3的模型转换成obj的格式。经过测试,可以转换90%的模型,还有很多2K左右的文件处理不了,估计是索引文件,我没有仔细研究了。导入到3D Max里面基本上就是这个样子:



    总结:愣看文件格式需要耐心和运气,像我看这个模型格式的运气就在于有一个box.pol的文件,这个文件名给了我暗示。另外就是文件中存在的FFFF FFFF ,虽然我最开始的假设是错误的,但是些字节还是整个文件的一个突破口。不过真把模型拆出来觉得意思也不大,感觉这些模型做的挺普通的。有时间我会把拆场景模型的文章也补上。

    Pillow 0.1a的操作教程

    Pillow 0.1a的操作教程


    这是我先前说要写的那个Pillow的教程,主要是要演示一下我这个建模程序的使用方法(程序我在我的网络硬盘里面放了一个,点击导航条的download可以下载,但是还有bug没有修复)。模型做的比较粗糙。这个是完成之后的效果,在3D Max里面简单渲染的:
    在开始之前,我先介绍一下Pillow的基本操作。Pillow是一个模仿silo的程序,因而在操作方法上高度一致。silo把建模的操作合理分配到左右手,我觉得能很好地提高工作的效率。简单的来说是这样的:

    alt健加鼠标左键拖动用来旋转视角
    alt键加鼠标中建拖动用来平移视角
    alt键加鼠标滚轮用来缩放视角
    鼠标左键拖动用来单面选择
    鼠标中键拖动用来双面选择
    c为增加细分
    v为减少细分
    ctrl为沿视平面进行平移,前提是选择了物体
    shift为增加选择内容
    z为突出面或者边
    w为移动模式
    e为旋转模式
    r为缩放模式
    1-7为切换不同的视角
    delete为移除点或边,其中点只能是有两个邻接边的点,这个操作目前有bug

    Pillow的界面大概就是这样:
    所有的操作都集中在菜单里面,而编辑窗口有几个我用opengl做的工具栏,这里面都是最常用的一些操作。把界面设计成这样是因为我曾经用过的一个silo 的界面,记得当时我在cgercn发过(现在好像叫cgfinal了)。silo可以自定义部分界面以及快捷键,但是我这个还不行。左侧的按钮选择编辑物体的编辑层次。右面的是选择窗口的层次。上面一条是文件操作,建立新物体和编辑新物体,还有截图快捷键和帮助。下面是选择显示的形式和选择照相机的形式。
    下面讲建模的过程:
    我做模型的时候比较喜欢box modelling的方式,总是从一个盒子的形状开始,这样比较容易从大局上把握形状,但是也容易让人忽视掉细节。我做模型的时候比较喜欢用参考图。关于参考图,我的经验是从电影电视剧或者mv中去找,因为这样比较容易找到不同角度的参考,而如果直接去找照片的话,正面照好找,侧面照就比较少了。有了参考图之后,要对正面和侧面的图进行一定的缩放和旋转,使得它们的比例一致。在这个过程中我比较喜欢用photoshop的标尺,在photoshop中让两个参考图的下巴和头顶处于水平,鼻尖和眼睛的高度一样,还有嘴角和耳根也要一样。我的这个侧面参考图不完整,所以我用鼠标补了一些脑袋。对齐之后剪裁成两个高度一致的图。

    然后开始建模了,首先就是要在Pillow中指定参考图(option->set viewport image),silo中可以直接用鼠标来调节参考图位置,但是我这个还不行,需要手动输入位置。然后新建一个box(create-> cube)。然后对这个方盒子分别在前视图和侧视图中进行调节,使得在前视图近似为头的一半大小,在侧视图中刚好覆盖头部。调整好之后在透视图中删除中间的面,也就是说我们要镜像复制一个当前的模型,因为脸是对称的。点击菜单上的(create->mirror instance)复制出镜像,对称平面为默认。

    然后按图进行切割,这个切割线分别对应了头的眼睛位置和耳朵的位置。目前Pillow只支持在一个边的中间进行切割,其实核心的程序允许在任意位置切割,但是和界面整合的时候我偷了点懒。然后将显示模式切换到线框模式,分别在前视图和侧视图中调节点的位置,使得这个造型和参考图近似。
    可以随时对模型细分进行观察,目前Pillow在编辑模型的时候还不能实时地更新法线,主要是我还没有想好有什么快的局部更新法线的算法。所以如果想观察光照效果需要从菜单执行更新法线的命令(modify->updata normal)。然后新增加一条竖线,这条线要对应人的瞳孔和嘴角。

    然后要不断的调节点的位置,使得模型接近参考图。现在继续切割出两条线,一条是在额头,另一条在嘴的位置。同样要在各个视图中调节位置。让线条过渡自然一点。

    然后横向切割出鼻子,并且调节。随时可以细分进行观察。在调节好点的位置之后要切割出眼睛和嘴的大致形状。

    然后在视图中调节,同时增加眼睛的细节。继续增加细节和调节点。调节点,可以用线框模式来显示,这样比较便于观察。

    仍然是增加细节和调节点的工作。继续增加细节,但是这个时候要清楚线条的走向。建模有个原则--线条要符合肌肉的走向,就是图中我用红线画出来的线条。眼睛和嘴的线条要形成一个圈。


    在增加线条的同时要不断切割出新的边,但是同时还要删除旧的边。因为我们是盒子建模,一开始的边都是横平竖直的,这个会对我们的最终模型产生一定影响。所谓盒子建模不容易把握细节,很大程度上就是这个原因。其实我觉得懂得如何删要比懂得如何添要重要的多。


    如果你最后的成品依然有很多横平竖直的线条,那一定是很失败的作品。继续添加鼻翼附近的线条,这样也是为了增加嘴部的细节。


    当嘴的细节到达一定的程度就可以进一步刻画了。要做出黑人厚嘴唇的效果。在眼睛的位置切割出更多的边。

    在鼻子上切割更多的边,这个是为了增加细节好开出鼻孔。现在可以依据参考图开出鼻孔了。首先切割出一个矩形的区域。


    在这个区域上使用突出(modify->extrude)几次,做出洞来,然后要调节点。时不时细分一下来观看效果。继续增加鼻子的细节,一方面要做出鼻翼凸起的效果,另一方面是修改三角面,尽量把三角面改成四边形。


    继续制作鼻翼。现在增加眼睛周围的圈数,增加细节准备做眼睛。

    不断调整眼睛周围点的位置,然后选中眼睛上的面删除。删除之后就形成了眼眶。

    如果把握不好眼睛的造型,可以生成一个球体作为眼球,放在眼睛的后面作为依据。细致刻画眼睑的效果。


    选中眼睛镂空的一圈边,然后将视角转动到头的里侧,按住z键,拖拽出眼睛没入脑袋的部分。继续调节点的位置,让模型有厚度,不是像面具一样只是一个面片。

    这是目前侧视图的效果。将嘴上的一组面删除,将嘴裂开,同时增加更多的边,做出嘴唇鼓起的效果。


    要在侧视图中进行调节,细分观察效果。做出镜像的效果观察。

    调节脸型鼻子和嘴上的点。和做眼睛类似,选择嘴镂空的一圈边之后将视图转动到脑袋里侧,按住z键突出处一些面。

    然后调节这些面。现在要做出下巴骨,不知道应该怎么说。让这个地方的线条更加明显,这个线条要成直角。


    如图红色的地方,让点往里缩,这样可以显现出下巴骨的线条。然后要制作脖子了,选择脖子位置的面删除。然后再脖子镂空的地方,选择一圈边进行突出。


    突出以后在前侧视图调节点的位置,使得它们契合参考图。不要忘了在透视图中进行调节。注意途中红线的位置,这个地方要做出一个凸起。

    如图增加细节,做出凸起的效果。调节,细分。

    换个角度。复制出镜像来观察。

    下面做耳朵,在侧视图中删除耳朵位置上的面。在侧视图中调整出一个耳朵的轮廓。选择一个边突出一小部分,然后以这个突出的部分为基础按照图中的顺序继续突出记下,形成一个耳朵的轮廓。

    还要到头视图里面调整这个轮廓的位置。然后细分进行观察。

    这个地方我做的比较糙。实际上应该做出耳朵里面的褶皱,但是我偷懒了。我这里简单的把耳朵的轮廓进行了延展,然后焊接,也就是把上面的框框给封起来了。不要忘了调整耳根后面的点,这个地方的点要往里收缩。

    这个时候要把脑袋后面一些刚才忽略的细节给补上。基本就算完成了,然后细分一下,使一个重新定义控制点(subdivision->redefine control mesh),把模型定格在细分的状态,如图:

    用google的code search偷窥别人密码

    用google的code search偷窥别人密码


    前几天google推出代码搜索的时候我觉得没什么用处,今天看到个消息说可以用来查看wordpress的密码。好主意!我搜了一下,出来不少,全都是 zip文件或者tar.gz文件里的代码。有的人给自己的博客作了个备份还上传到网上,结果被google偷看到了。不过这些站点都比较敏感,已经删除了备份,更改了密码。看来以后又有的玩了,不知道还能用这个找到什么东西。rar比较安全啊,以后要少用zip文件。

    一段美国校园枪击事件的视频

    一段美国校园枪击事件的视频

    今天看到一段视频很恐怖。已经很久没有被这样吓到过了。这个视频讲述了美国一次校园枪击事件。后来了解到这段视频是一部电影的一部分,心里能稍微舒服些。这个电影讲述的是99年哥伦比亚高中的一次枪击事件。据说真实的录影要比这个更加恐怖和混乱。这个电影的官方网站在这里:http://www.zerodaythemovie.com/。导演能想到用监视录像的视角来讲述事情的经过,的确很有想象力。直到现在还有不少人在讨论这个视频是真是假。这是关于这个真实事件的介绍:1999年4月 20日两个哥伦比亚高中学生冲进校园,用半自动武器、鸟枪和一批爆炸物杀死了1位老师,12名学生,然后自杀。另有26人受伤。当日11时19分,两名学生来到校外。其中一名大叫“出来!出来!”并当即向5名学生射击,造成两人死亡。随后,持枪者向门窗射击并将自制的炸弹扔上房顶。持枪者随之进入图书馆进行屠杀。最后两名凶手自杀身亡。哥伦比亚高中惨案美国历史上最严重的枪击事件。据说关于这个事件有个纪录片,叫做《Bowling for Columbine》。里面有真的录像,场面比这个乱,两人在食堂扔手榴弹也被拍下来了,食堂一角都着火了。叫这个名字是因为这两个杀手在开枪行凶以前还去打了场保龄球。真是挺变态的。
    最近很关注类似youtube的网站,浪费了不少时间。

    关于做饭乐趣的一点浅见

    关于做饭乐趣的一点浅见

    昨天不幸错过了一个饭局,回来的时候很饿,思考了些东西。以前我从来不做饭的时候不明白为什么有人会声称自己喜欢做饭。因为那个时候我总是站在一个食客的角度在看。我当时的理论是,吃饭要有视觉味觉冲击,比方说饿了很久的人突然暴露在饭前,这一顿一定吃的很爽。我当时举例说爬山。自己爬山,这个过渡太缓慢了,没有那种突然居高临下的刺激,我说我更爱坐飞机,从上面突然往下看。而自己做饭也是一样,从没饭到有饭的过程过于缓慢,没有了刺激,吃的时候怎么会爽呢。于是当年我猜想,好吃的不好做,好做的不好吃。现在要自己做饭了,突然明白做饭的乐趣绝对不在于最后的一吃。当然也不是做的过程,因为要满足自己的动手欲望的方式有很多,完全可以做点别的东西,比如编程序,拼积木模型什么的,为什么要单单做饭呢?我觉得做饭的乐趣在于做好了之后叫别的人来吃,然后听到好的评价。做饭和吃饭的乐趣我觉得只有两种,第一是做别人吃的饭,第二是吃别人做的饭。“吃白食”三个字可是很好的调味剂,即便天上掉的馅饼没有自己做的好,吃起来总有一种不劳而获的优越感。所以说,最不幸的就是做饭给自己吃的人,像我,既没有别人的夸赞,又没有吃白食的喜悦感。所以现在给自己做饭越来越对付了。
    不过我这些想法都是站在一个懒人的角度来考虑的。其实当年我那个爬山的比喻还有一层意思:自己挪步登高太累了,最后看到的风景也未必有画上的好。而坐飞机是4个引擎驼你上去,惰性得到了充分的愉悦。什么时候要是我把懒也戒了,这些东西自然会有另一套说法。不过这怎么可能呢!
    做饭的人和吃饭的人会有什么共同的痛苦么?有的--饭后都有可能被叫去刷碗。

    今天真是很有成果啊

    今天真是很有成果啊

    最近想贴出来我的3D建模程序的下载,但不是说我要正式地放出这个程序。这个程序还有很多很多问题,离真正实用还有很大的距离。为了演示我这个程序的操作,我打算做个建模教程。另外也是我想看看到底我这个程序能做出什么东西来,于是今天就做了这个:不过不幸的是在整个做的过程中程序疵了两次,一次是remove vertex后数据不正确的问题,另一个是焊接顶点的时候。幸亏我一路保存了。反正现在问题还是很多的,不过高兴得是我的程序可以做一些复杂的模了,不是纸上谈兵的东西,有点实用价值。好久都没做了,感觉手生。这个原形是warrick brown,电视剧csi lv中的一个人物,我挺喜欢的。
    这个导入到3D Max进行了简单渲染:
    程序有bug的时候总是让人心惊,我看恐怖片的时候可从来没这么慌过。
    教程今天写不了了,已经2点半多了,再不睡觉明天十一肯定起不来。估计要等到今天晚些时候。我打算把我的这个程序叫Pillow,至于为什么我也不知道,完全是我的意识流命名大法。

    耳聪目明的我

    耳聪目明的我

    很早就听说年岁越轻的人对高频的声音越敏感,有些人利用这个原理设计出高频的手机铃音用在课堂上。前天在diglog翻出来一个测试站点,列举了很多频率的声音,看测试的人能听到多高的频率。上面说17.7khz以上的只能被20岁以下的人听到。摆明了就是个年龄测试嘛。测试了一下,以我22岁的高龄,居然可以听到21.1khz,只有最后一个听不到,过度很明显。看来我还年轻啊。后来看一个论坛讨论这个,有人抱怨17.7khz以上就听不见了,我心里更是窃喜。真是精神鸦片啊,太舒服了。有时候在公交车上给小屁孩让座,最怕听他管我叫叔叔。我靠,简直像在我耳边放枪一样!这个是网址:http://www.ultrasonic-ringtones.com/
    难道,是我的音箱暴音了?

    fstream和中文路径

    fstream和中文路径

    前几天用了一个开源的工具来设计界面(www.wxformbuilder.org)。结果发现有个bug,只要存储路径有中文字符,存储就会失败,而且没有任何提示。一下午的工作就白白丢失了。今天自己写程序也遇到这个情况,是fstream的问题。默认的情况下不支持中文路径。fopen就可以。
    查到一篇文章讲这个,一定程度上能解决问题:
    问题:
    有时候用ifstream或ofstream打开带有中文路径的文件会失败。
    解决办法:
    1、使用C语言的函数设置为中文运行环境
    setlocale(LC_ALL,"Chinese-simplified");
    2、使用STL函数设置为系统语言环境
    std::locale::global(std::locale(""));
    当然选2啦!
    但是据说这样之后cout又不能输出中文了。

    用Torpark来避开封锁

    用Torpark来避开封锁

    前天在diglog上面看到新推出了一款改版的firefox,据说可以匿名访问,更加安全。我当时没有留意。后来链接到出处的网站上,发现官方网站的链接根本打不开,我就觉得有诈。再加上这个软件的名字前面有tor三个字母,我预感这是个可以用来绕过封锁的工具。挂代理,老牛拉慢车一样地连上官方网站,下载之后,果然!这个工具把tor和firefox整合在了一起。通过tor代理,路经是随机的,走的是哪个国家,你可以通过访问google.com来观察,因为它会自动跳转到相应国家的google去,我第一次走的是加拿大,然后是荷兰还有德国。
    tor本来是一个网络安全工具,可是到了咱们这里纯粹用来避开封锁,也是很无奈的事情。下面把我收集到的关于torpark的介绍集中一下。
    首先是来自http://www.firefox.hk/的消息:
    安全专家打造出了匿名浏览版Firefox
    一些关注隐私的编程人员已经推出了一个修改版的Firefox,使得用户能够匿名浏览网页,它名叫Torpark。其创始人是一帮称为Hactivismo的计算机安全高手和隐私专家。[http://torpark.nfshost.com/]这个官方网站被封杀了,需要代理才能上。
    每隔几分钟,Torpark浏览器就会作用于电脑的IP地址,使得它好像会改变一样。IP地址是一个分配给联网电脑的数字标识符。IP地址和其它数据可以用来跟踪某个用户,并且不少网站都会跟踪IP地址。
    这个浏览器免费提供下载,它是移动版Firefox的一个修改版,而移动版的Firefox是一个优化版的浏览器,它能运行在USB闪存上面。
    Torpark浏览器使用加密方法通过Onion路由器来发送数据,而Onion路由器是一个世界范围的网络服务,昵称是“TOR”,它以随机,模糊的方式互相转发数据。
    当然,安全是有代价的。用Torpark冲浪的一个小小缺点是,与其它浏览器相比,浏览同一个网站的速度会稍微慢一点。
    Torpark警告,从最后一个TOR服务器发送到网站的数据才会被加密。由于只有用户的连接才是匿名的,所以Torpark建议如用户名和密码等敏感数据在浏览有金色锁标志的网站时才使用,而金色锁标志表示这个网站使用了加密。
    Torpark的用户界面与Firefox很接近,只有少数的改变。它在右下角显示了网站所见到的IP地址,此外还有一个“Flush TOR”按钮来重置一个新的随即服务器连接。

    然后是官方的简介:
    Torpark
    torpark 欢迎来到Torpark官方网站。下载Torpark,把它放在USB闪存里,然后把USB闪存插在家庭,学校或公共场所的任何internet终端上,运行Torpark.exe,它就能自动连接到Tor网络,从而创建一条间接连接你的电脑和Tor网络中存在的电脑的秘密通道,这样你就可以匿名在网上冲浪了。Torpark价格怎样?它是免费的。
    你可能听说过那些带有很多广告的次等软件,比如Anonymouzer,SafeSharing, InvisibleIP,SecretSurfer等等。他们不仅要求你付费或赞助,还需要你进行安装。那还怎么做到匿名呢?试试Torpark吧,它体积小,便携,干净,不含任何间谍软件和广告,最吸引人的一点是它是免费的。
    注意
    Torpark 默认是英文版的,但他包含语言文件,你可以选择你想要的语言。要想更改语言,请按照languages.txt文件中的步骤进行设置。在下一个版本里,我打算在其中加入一个工具,来帮你完成这项设置。
    本来还要贴一个tor的中文手册的,但是官方网站上的中文翻译实在太差了。先算了吧。
    torpark 有个移动浏览的概念,我觉得挺好的。torpark应该是个绿色的程序,能安装到u盘上面。然后你可以随时随地地在异地打开它来浏览。而且它自己带有一个数据存储的空间,也就是说,你在别人电脑上运行tor你可以看到所有你收集的书签,你在别人电脑上新建的书签也可以保存在自己的有盘上,而不会对别人电脑上的数据有影响。但是这个东西是否需要电脑上安装了firefox才能运行呢?我就不知道了,不过考虑到这个软件的大小,我想答案应该是不需要。
    官方网站上不去的,我来做个电驴的下载链接吧,方便找不到代理的兄弟们。

    测定网站的DNA序列

    测定网站的DNA序列

    这里有个网站可以通过你网站的代码来生成一个DNA序列图。挺有意思的。地址:http://www.baekdal.com/web2dna/
    不知道是不是哪天网站数据丢失了可以用这个图谱来恢复,呵呵。

    拗口古文三则

    拗口古文三则

    施氏食狮史
    作者:赵元任
    石室诗士施氏 嗜狮 誓食十狮 氏时时适市视狮 十时 适十狮适市 是时 适施氏适市 氏视是十狮 恃矢势 使是十狮逝世 氏拾是十狮尸 适石室 石室湿 氏使侍拭石室 石室拭 氏始试食是十狮 食时 始识是十狮 实十石狮尸 试释是事
    注音:
    原文拼音化后如下(汉语拼音正词法建议数字以阿拉伯数字代表,故「十 shí」作「10」):
    << Shī Shì shí shī shǐ >>
    Shíshì shīshì Shī Shì, shì shī, shì shí 10 shī.
    Shì shíshí shì shì shì shī.
    10 shí, shì 10 shī shì shì.
    Shì shí, shì Shī Shì shì shì.
    Shì shì shì 10 shī, shì shì shì, shī shì 10 shī shìshì.
    Shì shí shì 10 shī shī, shì shíshì.
    Shíshì shī, Shì shǐ shì shì shíshì.
    Shíshì shì, Shì shí shì shí shì 10 shī.
    Shí shí, shǐ shì shì 10 shī, shí 10 shī shī.
    Shì shì shì shì.
    解释:
    有一位住在石室里的诗人叫施氏,爱吃狮子,决心要吃十隻狮子。他常常去市场看狮子。十点鐘,刚好有十隻狮子到了市场。那时候,刚好施氏也到了市场。他看见那十隻狮子,便放箭,把那十隻狮子杀死了。他拾起那十隻狮子的尸体,带到石室。石室湿了水,施氏叫侍从把石室擦乾。石室擦乾了,他才试试吃那十隻狮子。吃的时候,才发现那十隻狮子,原来是十隻石头的狮子尸体。试试解释这件事吧。
    备注:
    施氏食狮史是一篇由赵元任所写的设限文章。全文共九十二字,每字的普通话发音都是shi。这篇文言作品在阅读时并没有问题,但当用普通话朗读或者拉丁化作品时,问题便出现了。这是古文同音字多的缘故。
    很多人认為赵元任是希望通过本篇,引证中文拉丁化所带来的荒谬。但是支持拉丁化的人却指出赵元任乃是国语罗马字的主要设计者,他只是举例说明拉丁化只适合於白话文,不适合於文言文。
    赵元任什么人?查了一下维基:
    赵元任(1892~1982)
      中国语言学家。江苏常州人。1892 年11月3日生于天津,1982年2月25日卒于美国。
      赵元任长期致力于推行国语(普通话)的工作。1922年出版《 国语留声片课本 》,1935 年出版《新国语留声片课本》,在推行国语的工作中起了示范的作用 。这两套唱片分别代表中华人民共和国建立以前推行国语的两个阶段 。他从1927 年起从事方言研究工作 ,调查过吴语( 江苏南部和浙江)、粤语、徽州话和江西、湖南、湖北3省的方言,发表过很多调查报告和专题论文,如《现代吴语的研究》、《湖北方言调查报告》、《中山方言》、《台山语料》、《汉语称呼用词》等。其中《现代吴语的研究》是中国第一部用现代语言学方法研究方言的著作。这部书包括30处的调查材料,他与 4 个同事合著的《湖北方言调查报告》包括64处的调查材料。
      赵元任在记音方法和记音工具上也有重要的贡献。他关于记音方法的论述主要见于《音位标音法的多能性》和《语言问题》第二讲《音位论》。《音位论》说明音位观念所以存在的理由以及归纳音位应该考虑的一些原则。《音位标音法的多能性》一文阐明从语音材料归纳音位系统时可以有多种选择,答案不是唯一的。这篇论文现在已成为音位理论的经典著作之一。他设计的一套五度制标调字母,为记录和研究汉语(以及其他有字调的语言)的声调提供了准确、方便的工具。在语法方面,赵元任最重要的著作是《中国话的文法》。这部著作以直接成分分析法作为研究语法的主要方法,显然受了结构主义语言学的影响;可是作者持论通达,从来不拿事实迁就理论。总之,无论从立论的深度说,还是从影响的广泛说,《中国话的文法》都是最重要的汉语语法著作之一。
    季姬击鸡记
    季姬寂 集鸡 鸡即棘鸡 棘鸡饥叽 季姬及箕稷济鸡 鸡既济 跻姬笈 季姬忌 急咭鸡 鸡急 继圾几 季姬急 即籍箕击鸡 箕疾击几伎 伎即齑 鸡叽集几基 季姬急极屐击鸡 鸡既殛 季姬激 即记《季姬击鸡记》(78字)
    白话译文:
    季姬感到寂寞,罗集了一些鸡来养,是那种出自荆棘丛中的野鸡。野鸡饿了叫叽叽,季姬就拿竹箕中的小米喂它们。鸡吃饱了,跳到季姬的书箱上,季姬怕脏,忙叱赶鸡,鸡吓急了,就接着跳到几桌上,季姬更着急了,就借竹箕为赶鸡的工具,投击野鸡,竹箕的投速很快,却打中了几桌上的陶伎俑,那陶伎俑掉到地下,竟粉碎了。季姬争眼一瞧,鸡躲在几桌下乱叫,季姬一怒之下,脱下木屐鞋来打鸡,把鸡打死了。想着养鸡的经过,季姬激动起来,就写了这篇《季姬击鸡记》。
    羿裔熠邑彝
    羿裔熠①,邑②彝,义医,艺诣。熠姨遗一裔伊③,伊仪迤,衣旖,异奕矣。熠意④伊矣,易衣以贻伊,伊遗衣,衣异衣以意异熠,熠抑矣。伊驿邑,弋一翳⑤,弈毅 ⑥。毅仪奕,诣弈,衣异,意逸。毅诣伊,益伊,伊怡,已臆⑦毅矣,毅亦怡伊。翌,伊亦弈毅。毅以蜴贻伊,伊亦贻衣以毅。
    伊疫,呓毅,癔异矣,倚椅咿咿,毅亦咿咿。毅诣熠,意以熠,议熠医伊,熠懿⑧毅,意役毅逸。毅以熠宜伊,翼逸。熠驿邑以医伊,疑伊胰痍⑨,以蚁医伊,伊遗异,溢,伊咦。熠移伊,刈薏⑩以医,伊益矣。伊忆毅,亦呓毅矣,熠意伊毅已逸,熠意役伊。伊异,噫,缢。熠癔,亦缢。
    注解:
    ①熠:医生,据说为后羿的后裔.
    ②邑:以彝为邑,指居住在一个彝族聚居的地方.
    ③伊:绝世佳丽,仪态万方,神采奕奕.
    ④意:对伊有意思,指熠爱上了伊.
    ⑤翳:有遮蔽的地方,指伊游弋到了一个阴凉的地方.
    ⑥毅:逍遥不羁的浪人,善于下棋,神情坚毅,目光飘逸.
    ⑦臆:主观的感觉,通“意”,指对毅有好感.
    ⑧懿:原意为“懿旨”,此处引申为要挟,命令.
    ⑨胰痍:胰脏出现了疮痍.
    ⑩刈:割下草或者谷物一类.薏:薏米,白色,可供食用,也可入药.

    自制的电脑

    自制的电脑

    今天泡网看到的,国外一个牛人在家里自己做的一个电脑。
    http://www.homebrewcpu.com/
    通过上面这个网站就可以看到这个对这个强人和这件事情的介绍。
    http://www.magic-1.org
    而通过上面这个网址你就可以登陆到架设在这个使用自制CPU运行的机器上的网站。

    你也可以通过
    telnet www.magic-1.org
    来访问这个机器,你可以留言甚至玩玩简单的游戏,不过速度比较慢。
    人要是有兴趣是很可怕的一件事。我就是兴趣太多了,和没兴趣一样,至今还一事无成。

    堆疵及其成因

    堆疵及其成因

    Heap Corruption应该翻译成什么好呢,翻了一下百度,没有答案,所以这里自作主张地翻译成“堆疵”。
    前段时间编程的时候遇到过一次堆疵的情况,崩溃的地方是调用“new”的时候。当时觉得很奇怪,因为似乎只有内存消耗殆尽的时候new才会疵,但是我的程序没有用多少内存,怎么会疵能。后来知道是堆疵造成的。堆疵最麻烦的就是出现错误之后并不马上导致程序崩溃,而是埋下个隐患,等到再次使用出现问题的内存的时候才出现错误。这样经常会让人感到莫名其妙,因为出错的位置怎么看都是对的。好在vs2005里面可以报告出疵内存的地址,然后单步执行观察那片内存区域,这样就可以把疵点找到了。
    当时在ogre3d的wiki上找到的文章讲堆疵,挺好的,翻译如下:
    啥是堆?
    堆是一些内存区域,这些内存区域是操作系统(比如windows)为一个应用程序保留的。堆是存放你程序所使用的数据的地方。
    例如:

    int main()
    {
    //下面这一行会分配到 2 * 4 bytes 的内存 (int 占用 4 bytes)
    int a, b;
    }

    啥是堆疵?
    出现堆疵就意味着你程序中的某个语句覆盖了堆中的一些数据。如果程序中其他的语句想接触这个数据,会造成坏的数据。
    这会造成很多奇怪的错误,甚至无法解释。如果出现了堆疵,它在默认情况下会使得new操作返回NULL。
    所以说,如果你出现了一些很奇怪的问题,很可能就是出现了堆疵。这个主要发生在release模式下,虽然在debug模式下程序很可能很正常。出现问题的几个可能的原因如下。
    堆疵的常见原因:
    悬挂指针
    悬挂指针指的是这个指针所指向的实体已经被释放了。如果这时候你要使用这个指针,会产生错误。例如:
    class A
    {
    String mName;
    void A(String name) : mName(name)
    {
    }
    void speak()
    {
    printf("My name is: %s\n", mName.c_str());
    }
    }
    A *pointer1, *pointer2;
    pointer1 = new A("Michael");
    pointer2 = pointer1;
    //现在两个指针同时指向一个object (class A)
    pointer1->speak(); // this will work
    pointer2->speak(); // this too
    delete pointer1;
    //现在删除了object, 但是两个指针仍然指向它们原先指向的内存地址
    pointer1->speak(); // 这会产生错误
    pointer2->speak(); // 这个也会出现错误

    重复地释放
    如果你释放一个指针所指向区域两次(=如果你释放一个悬挂指针),你同样会遇到奇怪的错误。这里我想引用wumpus的话:"在这种情况下,有趣的事情会更多"。例如:
    A* pointer = new A("Dave");
    pointer->speak();
    delete pointer;
    B* pointerB = new B(20);
    pointerB->add(50);
    pointerB->printResult();
    delete pointer; //这个可能只是个笔误
    //现在就要发生错误了... 找错误一定很有意思...

    数组越界
    如果你设定一个数组元素的下标超过了数组的大小,你就会改写在堆中数组之后区域的内存。比如:
    int numbers[3];
    A* pointer = new A("Hansi");
    B* pointerB = new B(4);
    numbers[0] = 23;
    numbers[1] = 42;
    numbers[2] = 5;
    numbers[3] = 666; //数组越界
    //现在你应经把两个指针所指向的位置给覆盖了
    //在32位机上,一个指针变量的大小是 4 bytes (unsigned int) 在64位机上是 8 bytes (unsigned long)
    //所以覆盖第一个指针(如果是32位系统)。会产生错误:
    pointerB->add(16);
    pointerB->printResult(); //这个会显示"20"
    delete pointerB; //到这里还没有问题
    // 这里会有数以亿计的代码... 都没什么问题,除非你要这样做:
    A->speak(); //这个会疵掉,除非下面这个成立:
    //第三行(int)pointer == 666;

    其它在release模式下出现奇怪错误的解释
    没有初始化的指针
    在release模式下,变量不会自动地初始化,所以如果你没有主动地指定一个指针变量是空的话,它可能是一个随机数。如果你使用这个指针,就会产生错误:
    A* pointer;
    if (pointer == NULL)
    pointer = new A("John");
    pointer->speak(); //这个在release模式下可能不行,但是在debug下没问题
    delete pointer;
    int x;
    printf("%i", ++x); //输出一个随机的数目

    为啥写这个文章?
    我在网上找了3天。我想知道我的小地图在release模式下出现"assertion failed"的原因。问题出现在一个颜色数组(ColourValue mColors[5]),我只需要5个颜色,但是我往里面放了11个进去...
    希望这个能帮你加速找错的过程。好运!
    我为啥翻译这个文章?
    我的程序堆疵之后我摸不到头脑,索性甩手不干了。后来还是放不下心,玩不进去游戏,看不进去电视。在网上搜索了很多堆疵的资料,大多罗列了上面几种原因,当时我看的时候觉得这些原因都太傻了,我的程序已经反复看了很多遍,不可能因为这么几个弱错误疵掉。后来看了半天内存,发现问题,我在释放了一个指针所指的内存之后又去使用它。

    飞出个未来--just can't get enough futurama

    飞出个未来--just can't get enough futurama


    最近非常着迷的一部动画片。讲了一个20世纪的倒霉蛋偶然来到未来经历的一些故事。Futurama这名称来自1939年纽约世界博览会中,通用汽车用作展示未来科技的展馆名称。在这个展馆内,以真空管制成的电视亦首次亮相。这台电视机由Philo Farnsworth发明,而他的姓也成为了这套电视剧的角色名称。
    这个剧flyine.net翻译的字幕非常的地道。值得一看。
    一些简介:
    这部动画剧集荣获了多次艾美奖等殊荣,IMDB评分高达9.1分,该剧的制作班底是《辛普森一家/阿森一族》(The Simpsons)的原班人马。香港曾播出过,港译名为"乃出个未来"。由于播映的电视台不同,所以该剧有4季和5季两个版本,但两个版本内容相同均为 72集,只是分季划分和部分集的排列顺序不同而已。

    该剧讲述了 Fry,一位20世纪的年轻人在30世纪的冒险经历。
    Phillip Fry是一个纽约市的25岁的比萨饼快递员,他的生活就是每天四处奔波,1999年12月21日他偶然的被冰冻了起来, 当他醒过来时已是1000年以后,他也有了一个开始新生活的机会. 他到行星际递公司找了一份工作, 那个公司主要业务就是为宇宙的各个角落提供现代化的快递包裹服务. 他的同事包括快递运输船船长 Leela, 一个粗暴但可爱的单眼女外星人,还有一个有着很多人类的缺点的机器人Bender。Fry, Leela, Bender, 有时再加上Amy 和Zoidberg 他们冒着生命危险为宇宙的各个地方快递包裹,有时也为了减税从事一些慈善行动. 每一集都是笑料百出,一部非常不错的搞笑科幻动画。