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

Blog


    November 10

    blogger再次被封之后的一些变通的办法

    blogger再次被封之后的一些变通的办法

    用代理,用tor,用pkblogs.com的老方式就不说了。最近发现beta.blogger的后台上不了了,这个是真正最要命的东西。后来看到好像封的是dns,在host文件中添加ip: 72.14.219.190 beta.blogger.com 就行了。
    最近beta.blogger进行了更新,支持原来的ftp发布,这样就可以注册免费的ftp空间,将blogger的内容发布到ftp上去。有个免费的空间sitesled.com,好像有250兆大小,注册立即开通。可惜的是选择了发布到ftp之后,功能上受一定限制,只能用经典模版。
    搞不懂为什么封杀blogspot.com,最近wordpress.com反而解禁了,geocity也解禁了,不知道是为什么。

    关于中医的一点想法

    关于中医的一点想法

    一般有吐故纳新的机会,我都是个先锋人物,但是对于中医我还是很宽容的。
    很早我就知道有人反对中医,说中医是伪科学。后来还听罗永浩讲,说同仁堂有一种药里面含有导致尿毒症之类的物质,卖了很多年,直到有人吃出了毛病。最近还有什么万人签名抵制中医。前些天更在论坛上读到,韩国要把中医改成了韩医申报世界遗产,虽然事后说明这是个炒作,但是我仍然觉得这是个搞笑的事情。我们自己对自己的文化遗产都不珍惜,反而要被别人抢了去。
    反对中医的原因大概就在于“没有理论,基于经验”这几个字上。其实我觉得这也没什么,经验本身就是一种科学理论。世界上的事有多少能讲清楚为什么?试验本身就是一种科学的研究方法,爱迪生为了找到灯丝试验了多少材料?这和李时珍遍尝百草又有什么分别?牛顿力学定律算得上是有理论支撑吗?其实还不是牛顿一厢情愿的经验总结,苹果砸头得到的结论。到头来,还不是被别人证明在某些环境下并不适用。目前使用的理论就是解释万物的真理吗?自然也不是。
    既然在科学上,人们并不苛求理论的完整,对于试验方式的探索也很宽容,那为什么对中医这么耿耿于怀呢?到底有没有人统计过死于中药的和死于吸烟的人数,到底应该先禁烟还是先禁中医?到底中医杀的人多还是救活的人多呢?中医让人稀里糊涂地活,西医让人明明白白地死,这话没错。
    即便说中药可能有副作用,在盒子上面注明一下也就行了,决定权在于吃药的人。做什么事情没有风险?出门上街还可能被车撞死,难道就不出门了?让大家知道中药潜在的副作用就行了,吃与不吃是每个人的自由。
    其实我倒是觉得,如果古代的中国能多一点中医的精神,近代艺术和科技上绝不至于落后西方国家。看看那些学究,一天到晚就知道死看书,一点动手的意识都没有。太缺乏中医的精神了。我实在不欣赏国画,也列不出什么近代发明创造,算起来混事的名号如何也轮不到中医啊。

    鲁迅,立论

    鲁迅,立论

    网上找来鲁迅一篇小文,很有意思。
    鲁迅:立论
      我梦见自己正在小学校的讲堂上预备作文,向老师请教立论的方法。
      “难!”老师从眼镜圈外斜射出眼光来,看着我,说:“我告诉你一件事——
      一家人家生了一个男孩,合家高兴透顶了。满月的时候,抱出来给客人看,——大概自然是想得一点好兆头。”
      “一个说:‘这孩子将来要发财的。’他于是得到一番感谢。
      “一个说:‘这孩子将来是要死的。’他于是得到一顿大家合力的痛打。
      “说要死的必然,说富贵的许谎。但说谎的得好报,说必然的遭打。你……”
      “我愿意既不说谎,也不遭打。那么,老师,我得怎么说呢?”
      “那么,你得说:‘啊呀!这孩子呵!您瞧!那么……。阿唷!哈哈!Hehe!he,he he he he!’”
                             一九二五年七月八日。

    Displacement mapping简介

    Displacement mapping简介


    我很想把pillow做成像zbrush和mudbox那样的笔刷建模工具,因为这样的工具可以做出很逼真的细节。实现这个想法就要用到 displacement mapping。我习惯叫这个东西置换贴图,但是今天看到有人翻译成位移映射,似乎更准确。翻译一篇介绍,原文来自维基百科。
    位移映射是同凹凸贴图,法线贴图,切线贴图相区别的另一种制造凹凸细节的技术,它使用一个高度贴图制造出几何物体表面上点的位置被替换到另一位置的效果。这种效果通常是让点的位置沿面法线移动一个贴图中定义的距离。它使得贴图具备了表现细节和深度的能力,且可以同时允许自我遮盖,自我投影和呈现边缘轮廓。而另一方面,这种技术是同类技术中消耗性能最大的,因为它需要额外的增加大量几何信息。
    很多年来,位移映射是高端渲染器独有的功能,比如说 RenderMan,而那些实时的程序接口,比如说OpenGL和DirectX,则缺少对这个技术的支持。一个原因是,最初的实现方法需要对物体表面进行自适应细分来得到许多微小的面,这些面的尺寸投影到屏幕上刚好是一个像素的大小。
    现在图形硬件已经支持Shader Model 3.0了,位移映射可以通过一种向量贴图的方式来实现,这个向量贴图并不像普通贴图那样改变物体表面的颜色,而是改变物体表面点的位置。它不像凹凸贴图,法线和切线贴图,因为这些技术都是在制造凹凸效果的假象,而位移应设是真正通过贴图的方式制造出凹凸的表面。它必须要配合细分算法,增加渲染的多边形数目来制造出细节的效果。

    Brief of pillow in English

    Brief of pillow in English

    Pillow is a light weight application on which I' m working lately, the current aim is to make a simple modeller along the lines of commercial modeller silo. The project is at a very early stage implementing some basic modelling operations, such as "move", "rotate", "scale", "weld", "split" on objects and sub-objects like vertices, edges and faces, and also catmull-clark subdivision. Because pillow is under developing, there are problems, but it is still a good start point for me, 'cause as far as I know, lots of teams of identical applications take a long time to develop, normally in years, and pillow is only a 2-month job that I' m doing alone.
    On history:
    I got the idea of doing a modeller of myself in Oct 2004, at that time I was learning directx by myself, and I thought of actually making something to get familiar with the skills, so I decided to write this application. I set the silo modeller as my goal, for one thing, silo adapts a reasonable set of shortcut keys which I believe can speed up the progress of modelling, and also, silo is small in size. However, after I had the idea, I didn't have the time to concrete it until this summer, I got myself graduated. I have bunch of names for this application, first "cedar" and then "polygon studio" and "clayshop", and now I' m calling it "pillow".
    On code:
    Since I decided to practice directx with pillow, the first version is written with c# and managed directx. I also used a game engine called truevision3d, because functions like object-picking are out there already. But due to the huge data structures of game engine, the code's performance was very poor. So, then, I tried to code directly with directx. The current version is rewritten with c++ and opengl. The GUI library I use is wxwidget. I always care a lot about the user interface of my program. I don't think the appearance of products is of trifle. If the gorgeous design of apple computer was taken away, the company that never compatible with others would not survive in the market. However, I cannot find a good GUI library for my job, I need a cross platform, open source, skinable library with plenty of controls. While doing this application, I tried cegui, wxwidget, qt4, and picked up wxwidget finally.
    The code is divided into 3 main layers, the ui layer undertakes the job of interacting with users, and displays the result of operations. The scene layer is in the middle, managing the 3d scene, converting the graphics operations to primitive operations on data structures. This part is actually the core of the whole program. The data structure is in the deepest layer which contains the data of the scene. The communication between the scene layer and the data layer is strictly defined as a set of commands; every command is tracked by a thing called history manager to enable users to restore at any time. As in the image, blue arrow is the flows of commands, the purple one is commands recording and the red ones are the data flows.
    Currently, pillow doesn't support undo and redo. Although I already implement these operations, I didn't combine them with the ui. Because this part is easy to leak memory, I need to make sure other parts works fine before I add these functions.
    when I was coding undo and redo part, I first thought of making commands, and every command has its inversion, and when I need to undo an operation, I simply call the inverse command. Yet, some operations, say calculating the average number, don't have commands in inversion. I could keep a record of the situation before the average happens, but this is a silly way. and then I thought up dividing the operations into layers, because no matter how complex a graphics command might be, it finally modifies the primitive data structures and the primitive operations on data structures can be simply defined as "new", "modify", "remove", so I only need to keep a record of these basic operations to hold the history of all the graphics operations. Actually, there are dozens of primitive operations defined in my code, more than just "new", "remove" and "modify".
    So what is history manager? It is an undo queue and a redo stack, commands are pushed into the head of the queue, if they reach the end of the queue, and they are discarded. When the user wants to undo a step, a command will be popped and executed, at the same time, an inverse command be pushed into the redo stack. And if redo happens, just do everything in the backward.
    How to prevent memory leak? My design is centralizing the management of all pointers; this is what I call data pool. It is actually a dynamic array to store pointers. Every function can use the data, but cannot new it or release it. There are two ways to release the data, first, if the remove operation needs to be recorded by the history manager, pass the pointer to the history manager, and as the record log is discarded by the history manager, the pointer is released. Second, if the operation does not need to be recorded, release it directly through the data pool. By adopting this, I can guarantee that, at any time, every data in the heap has at least one pointer stored in the data pool.
    One more thing:
    When I first showed people my idea of doing pillow, somebody asked what the unique feature of my polygon modeller is, since there are so many of them. I do want to do something special, but just before going creative, I need a base. And this is why I make pillow. I dreamed of making an application that combines the traditional sculpture progress with the cg making operations enabling people to create the shape more directly. I have already found some directions like the commercial software zbrush, mudbox and the teddy demo. So this is what I really wanna do in the future. Hope I can insist on doing this.
    Some resources:
    A tutorial on box modelling in pillow:
    http://billconan.blogspot.com/2006/10/pillow-01a.html
    A piece of flash showing how pillow works in action:
    http://billconan.blogspot.com/2006/10/wink.html

    美剧,我认真看过的美剧

    美剧,我认真看过的美剧

    我做大多数事情都没有耐性,包括玩游戏。我玩通的游戏好像也不多,倒是看过不少美剧,算是我一个主要的爱好。我觉得美剧即便情节再科幻,看起来也要比国产的电视剧来的真实。我曾经听说《董存瑞》那个电影的编剧承认手举炸药包说的“为了”云云是“艺术再加工”。“再加工”我懂,“艺术”我实在是看不出来。美剧里面的人,即便英雄也可能死的很平静,所以比较真实。我很想写几句,说一下我认真看过的剧:
    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才能运行呢?我就不知道了,不过考虑到这个软件的大小,我想答案应该是不需要。
    官方网站上不去的,我来做个电驴的下载链接吧,方便找不到代理的兄弟们。