More servicesWindows Live
HomeHotmailSpacesOneCare
 
MSN
Sign in
 
 
Spaces home  w3ishi's blogPhotosProfileFriendsMore Tools Explore the Spaces community

w3ishi

View spaceSend a message
Occupation:
Location:
email:w3ishi@gmail.com
msn:williamshi@hotmail.com
skype:w3ishi@gmail.com
Updated 3/7/2007
Updated 8/9/2006
Updated 3/7/2007

w3ishi's blog

5/12/2008

PS3上成功安装Linux

前些日子买了台40g版的ps3,将硬盘升级为120g后又安装了linux,使用的是ydl6.0发行版。安装过程并没有什么特别,关于安装前对主机的设置,ydl的安装手册上也有说明。

PS3使用的是IBM Cell BE处理器,由一个PPE和8(ps3上禁用了一个,所以只剩下7个可用的。)个SPE组成。PPE其实就是一颗双核3.2GHz的 PowerPC处理器。每个SPE包括:一个SPU,一个私有内存空间(256K),128个寄存器,每个寄存器128位,一个MFC(memory flow controller)。

尝试着写了一些程序,初步印象感觉和在linux上使用affinity是差不多的,通过spe_create_thread()派生出指定绑定在某个spe上的线程。

编译步骤需要注意的有:

1.spe的入口程序使用spu-gcc来编译。

2.spu-gcc编译好的.o文件需要用ppu-embedspu这个脚本来处理,之后才能与PPE的程序链接。

3.ppe的程序直接可以用gcc来编译可以使用-lspe标志。

4.需要指定程序是-m64还是-m32的,否则会出错。

另外,如果安装的是ydl6.0,有可能会丢失ppu-embedspu.sh这个脚本,解决办法是配置好主机的Internet连接后,运行yum install *spu* *ppu*,会自动通过网络安装的相关的开发程序。

如果只使用gcc并且不调用与cell be sdk相关的函数,生成的程序只是一个运行在Power PC处理上普通的程序。

稍后我会尝试移植一些程序到这个平台。

5/6/2008

有些人活着,但他已经死了,有些人死了,但他还活着。

最近研究地形方面的问题,了解到一个人:Seumas McNally。这里http://www.gamedev.net/community/memorial/seumas/有关于他更多的信息。很惭愧,直到现在我还没能把握好生命里的每一分钟甚至每一天。如果把这些时间给Seumas,他一定会做出更多另人兴奋的事情。
有机会活在这个星球上,我感到很幸运,珍惜!
3/7/2007

lq2v1基本完成!

lq2v1基本完成!这将近一年的时间,经历了很多事情,甚至走了一些偏路,比如去了不该去的地方。不过,一切都过去了,就当是经验吧:)
从技术角度讲,真的不知道John Carmack从Doom以来都经历了哪些“磨难”。当你真正的深入进去,你才发现有很多问题需要解决,有些甚至是你从来都没有想过的,经常会另你束手无策。过几天lq2v1完善并完成它的使命后,我会尝试新的技术,毕竟在相关文档比较稀缺的情况下,quake2的很多技术细节还是需要看代码才能理解,有这时间不如去思考新的技术以及架构。非常感谢John  Carmack 以及id software能非常无私的公开他们的代码,他们能提供的信息已经非常多了!
10/25/2006

关于gnu rx-1.5的bug问题。

去年12月份完成regexplib,主要实现思想与gnu rx-1.5一致,但比gnu rx-1.5的实现要简单(以搞清原理为主要目的,没有考虑其他因素),主要是在nfa模拟那部分。在这过程中,发现了一些bug,给Tom Lord写信,可能是因为地址错误的原因,没有得到答复。前几天发现了Tom Lord的邮件地址,询问了这个问题,并得到答复。原来gnu rx-1.5已经不是最新版本了,最新的rx包含在gnu arch(http://www.gnuarch.org/)这个项目中,新版本已经修正了很多bug,并且提高了性能。Tom也不知道为什么gnu.org上为什么还要发布rx-1.5这个版本。以下是与Tom交流的部分内容,我的英语不是很好,好在他看懂了我的意思:
 
收件人: shi wei <w3ishi@gmail.com>
日期: 2006-10-21 上午3:16
主题: Re: hi, Mr lord, A bug about gnu rx1.5?
I'm not sure why the GNU project still distributes rx-1.5.   It is very old and, yes, I know it has bugs.   The most recent versions of Rx are much better: fast and much more accurate.   They are not distributed as a separate project but you can find a copy in GNU Arch.

I'm sorry your time got sucked into rx-1.5 -- the FSF should not be distributing it.

I am curious about your implementation.

If you want to join the GNU Arch project, the best thing to do is probably to join the mailing list and introduce yourself.

shi wei wrote:
Hello, Mr load:
In this year earlier, I was learn about regular expression and your source code "gnu rx-1.5". Through your idea I wrote my own regular expression lib. But when I learn your source code, I found a bug in it. I sent you a email( lord@gnu.org) about this bug, but no write back, I think you have change your email adress. Today I found your email adress"lord@emf.net", and try whether you can receive my email. The bug detail is for example use this kind of string and pattern:

/////////////////////////////////////////////////////////////////////////////////////
char *string = "@john-doe.i.am.com";
char *pattern = "@([A-Za-z0-9]*)(([\\.\\-]*[a-zA-Z0-9]*)*)\\.([A-Za-z]{2,3})";

// or

char *string = "aaa";
char *pattern = "((a*)*)(\\1)";

The programe may fall in a dead loop. The logical is:
/////////////////////////////////////////////////////////////////////////////////////

case r_concat:
       {
  switch (solns->step)
    {
      enum rx_answers concat_stat;
    case 1:
      solns->split_guess = solns->end;
#if 0
      solns->split_guess = ((solns->end - solns->start) > RX_MANY_CASES
       ? rx_best_end_guess (solns,
              solns->exp->params.pair.left, solns->end)
       : solns->end);
#endif

    concat_split_guess_loop:
      solns->left = rx_make_solutions (solns->regs,
           solns->verse,
           solns->exp->params.pair.left,
           solns->subexps,
           solns->cset_size,
           solns->start,
           solns->split_guess,
           solns->vmfn,
           solns->contextfn,
           solns->closure);
      if (!solns->left)
        {
   solns->step = -1;
   return rx_bogus;
        }
      solns->step = 2;

    case 2:
    concat_try_next_left_match:

      concat_stat = rx_next_solution (solns->left);

      if (concat_stat != rx_yes)
        {
new_tag_i_add:
   rx_free_solutions (solns->left);
   rx_free_solutions (solns->right);
   solns->left = solns->right = 0;
   solns->split_guess = solns->split_guess - 1;
#if 0
   solns->split_guess = ((solns->split_guess - solns->start) > RX_MANY_CASES
           ? rx_best_end_guess (solns,
           solns->exp->params.pair.left,
           solns->split_guess - 1)
           : solns->split_guess - 1);
#endif
   if (solns->split_guess >= solns->start)
     goto concat_split_guess_loop;
   else
     {
       solns->step = -1;
       return concat_stat;
     }
        }
      else
        {
   solns->step = 3;
   /* fall through */
        }

    case 3:
      solns->right = rx_make_solutions (solns->regs,
            solns->verse,
            solns->exp->params.pair.right,
            solns->subexps,
            solns->cset_size,
            solns->split_guess,
            solns->end,
            solns->vmfn,
            solns->contextfn,
            solns->closure);
      if (!solns->right)
        {
   rx_free_solutions (solns->left);
   solns->left = 0;
   solns->step = -1;
   return rx_bogus;
        }

      solns->step = 4;
      /* fall through */

    case 4:
    /* concat_try_next_right_match: */

      concat_stat = rx_next_solution (solns->right);
      if (concat_stat == rx_yes)
        {
   solns->final_tag = solns->right->final_tag;
   return concat_stat;
        }
      else if (concat_stat == rx_no)
        {
   rx_free_solutions (solns->right);
   solns->right = 0;
   solns->step = 2;
   goto concat_try_next_left_match;
        }
      else /*  concat_stat == rx_bogus */
        {
   rx_free_solutions (solns->left);
   solns->left = 0;
   rx_free_solutions (solns->right);
   solns->right = 0;
   solns->step = -1;
   return concat_stat;
        }
    }


 In case 4, if soln->right->start == soln->right->end, and soln->right is not match null, it will go to concat_try_next_left_match,
but if concat_try_next_left_match can match a again the string, it will not solns->split_guess--, so it will come to  concat_stat = rx_next_solution (solns->right); again...
 In my opinion, if case 4 rx_next_solution return rx_no, it have to estimate solns->right->regexp, if it can't nullable and solns->right->start == solns->right->end  goto new_tag_i_add.
 I am a newer in regular expression program, so I don't know if it is a bug? And my English is not good, can you understand me?
 
 A syntax tree may lead error, like this:


              r_concat
              /  \
         r_parens    r_cset
              /
             r_star
             /
            r_parens
            /
           r_concat
           / \
      r_star r_star
          /   \
    r_cset   r_cset

I want join some gnu project, such as http://www.gnuarch.org/revc/index.html, can you give me some idea about how can I start?
Expect your write back, and thank you very much!
 
ShiWei
2006-10-20
7/23/2006

lq2v1的几张截图。

lq2(like quake2),呵呵,名不副实,比quake2差远了,quake2的技术就是在10年后的今天来看也并不过时,至少这是我的愚见。贴几张用我的“引擎“跑quake2中base1.map(第一关)的截图。没有光照,只是稍微调制了一下色彩,所以看起来很难受,最好把亮度和对比度开到最大,否则看见的只是一片漆黑。另外,纹理的坐标也不对,先不调了,能看出个模样就行了,毕竟我不是要做quake2,而是...
6/22/2006

已经与quake2的.map兼容了!

    已经与quake2的.map, .wal...兼容了!这意味着我已经可以完全使用quake2的地图在我自己的引擎上运行了!也意味着没有任何外界因素可以阻拦我了,除非是我自己放弃!一直以来都有一个问题困扰着我,那就是我身边没有美工,没有人可以为我做大场景的地图和贴图。所以,从一开始我的目标就是尽量的与quake2的文件兼容,包括地图编辑器的操作也都尽量与Worldcraft相同,现在看来,当初定的路线是完全正确的。稍后,我就可以说出我早就想说,但一直没有底气说的那句话了:"quake2,我来了!" 接下来的工作重点会放在引擎上面:碰撞检测,bsp+portal+pvs,光照,阴影...(用软件实现还是opengl呢?如果是炫耀,还是软件实现厉害,如果为了效果好,速度快,还是乖乖的用opengl吧,cpu干这个比不过gpu的^_^) 至于地图编辑器,还是先放放吧,既然已经和worldcraft兼容了,还是先用它吧,不过,早晚也要完善的。
4/8/2006

regexplib v0.11

regexplib v0.11
主要修正了interval{m,n}的一个bug。
我没有可以上传文件的空间,所以放到了www.linuxforum.net上。
4/3/2006

Steve Jobs

    你们的生命都有限,所以不要把时间浪费在他人的意愿上。不要被条条框框束缚,否则你就生活在他人思考的结果里。不要让他人的叽叽歪歪淹没了你内在的声音。最重要的是,要有遵从你的内心和直觉的勇气,他们常常最知道你想做什么。其他都是次要的。Steve Jobs

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

   毕业典礼上的演讲大都轻松愉快,而且容易被遗忘。然而,史蒂夫·乔布斯(Steve Jobs)2005年6 月在斯坦福大学的演讲在经过了一个夏天之后依然为人所提及。这位苹果电脑公司(Apple Computer)和皮克斯动画公司(Pixar Animation Studios)首席执行官在演讲中谈到了他生活中的三次体验,这三次体验不仅在斯坦福大学的毕业生、也在硅谷乃至其他地方的技术同行中引起了巨大反响。他们将他的演讲登在互联网上,在博客上展开讨论,通过电子邮件互相发送,在全球传阅。    

    很荣幸和大家一道参加这所世界上最好的一座大学的毕业典礼。我大学没毕业,说实话,这是我第一次离大学毕业典礼这么近。今天我想给大家讲三个我自己的故事,不讲别的,也不讲大道理,就讲三个故事。
    第一个故事讲的是点与点之间的关系。我在里德学院(Reed  College)只读了六个月就退学了,此后便在学校里旁听,又过了大约一年半,我彻底离开。那么,我为什么退学呢?
    这得从我出生前讲起。我的生母是一名年轻的未婚在校研究生,她决定将我送给别人收养。她非常希望收养我的是有大学学历的人,所以把一切都安排好了,我一出生就交给一对律师夫妇收养。没想到我落地的霎那间,那对夫妇却决定收养一名女孩。就这样,我的养父母─当时他们还在登记册上排队等著呢─半夜三更接到一个电话: 
    “我们这儿有一个没人要的男婴,你们要么?”“当然要”他们回答。但是,我的生母后来发现我的养母不是大学毕业生,我的养父甚至连中学都没有毕业,所以她拒绝在最后的收养文件上签字。不过,没过几个月她就心软了,因为我的养父母许诺日后一定送我上大学。
    17 年后,我真的进了大学。当时我很天真,选了一所学费几乎和斯坦福大学一样昂贵的学校,当工人的养父母倾其所有的积蓄为我支付了大学学费。读了六个月后,我却看不出上学有什么意义。我既不知道自己这一生想干什么,也不知道大学是否能够帮我弄明白自己想干什么。这时,我就要花光父母一辈子节省下来的钱了。所以,我决定退学,并且坚信日后会证明我这样做是对的。当年做出这个决定时心里直打鼓,但现在回想起来,这还真是我有生以来做出的最好的决定之一。从退学那一刻起,我就可以不再选那些我毫无兴趣的必修课,开始旁听一些看上去有意思的课。 
    那些日子一点儿都不浪漫。我没有宿舍,只能睡在朋友房间的地板上。我去退还可乐瓶,用那五分钱的押金来买吃的。每个星期天晚上我都要走七英里,到城那头的黑尔-科里施纳礼拜堂去,吃每周才能享用一次的美餐。我喜欢这样。我凭著好奇心和直觉所干的这些事情,有许多后来都证明是无价之宝。我给大家举个例子:

    当时,里德学院的书法课大概是全国最好的。校园里所有的公告栏和每个抽屉标签上的字都写得非常漂亮。当时我已经退学,不用正常上课,所以我决定选一门书法课,学学怎么写好字。我学习写带短截线和不带短截线的印刷字体,根据不同字母组合调整其间距,以及怎样把版式调整得好上加好。这门课太棒了,既有历史价值,又有艺术造诣,这一点科学就做不到,而我觉得它妙不可言。
    当时我并不指望书法在以后的生活中能有什么实用价值。但是,十年之后,我们在设计第一台Macintosh计算机时,它一下子浮现在我眼前。于是,我们把这些东西全都设计进了计算机中。这是第一台有这么漂亮的文字版式的计算机。要不是我当初在大学里偶然选了这么一门课,Macintosh 计算机绝不会有那么多种印刷字体或间距安排合理的字号。要不是 Windows 照搬了Macintosh,个人电脑可能不会有这些字体和字号。要不是退了学,我决不会碰巧选了这门书法课,个人电脑也可能不会有现在这些漂亮的版式了。当然,我在大学里不可能从这一点上看到它与将来的关系。十年之后再回头看,两者之间的关系就非常、非常清楚了。 
    你们同样不可能从现在这个点上看到将来;只有回头看时,才会发现它们之间的关系。所以,要相信这些点迟早会连接到一起。你们必须信赖某些东西─直觉、归宿、生命,还有业力,等等。这样做从来没有让我的希望落空过,而且还彻底改变了我的生活。
    我的第二个故事是关于好恶与得失。幸运的是,我在很小的时候就发现自己喜欢做什么。我在 20 岁时和沃兹(Woz,苹果公司创始人之一 Wozon  的昵称─译注)在我父母的车库里办起了苹果公司。我们干得很卖力,十年后,苹果公司就从车库里我们两个人发展成为一个拥有20 亿元资产、4,000 名员工的大企业。那时,我们刚刚推出了我们最好的产品─
Macintosh 电脑─那是在第 9 年,我刚满 30 岁。可后来,我被解雇了。你怎么会被自己办的公司解雇呢?是这样,随著苹果公司越做越大,我们聘了一位我认为非常有才华的人与我一道管理公司。在开始的一年多里,一切都很顺利。可是,随后我俩对公司前景的看法开始出现分歧,最后我俩反目了。这时,董事会站在了他那一边,所以在30岁那年,我离开了公司,而且这件事闹得满城风雨。我成年后的整个生活重心都没有了,这使我心力交瘁。
     一连几个月,我真的不知道应该怎么办。我感到自己给老一代的创业者丢了脸─因为我扔掉了交到自己手里的接力棒。我去见了戴维•帕卡德(David Packard,惠普公司创始人之一─译注)和鲍勃•诺伊斯(BobNoyce,英特尔公司创建者之一─译注),想为把事情搞得这么糟糕说声道歉。这次失败弄得沸沸扬扬的,我甚至想过逃离硅谷。但是,渐渐地,我开始有了一个想法─我仍然热爱我过去做的一切。在苹果公司发生的这些风波丝毫没有改变这一点。我虽然被拒之门外,但我仍然深爱我的事业。于是,我决定从头开始。
    虽然当时我并没有意识到,但事实证明,被苹果公司炒鱿鱼是我一生中碰到的最好的事情。尽管前景未卜,但从头开始的轻松感取代了保持成功的沉重感。这使我进入了一生中最富有创造力的时期之一。 
    在此后的五年里,我开了一家名叫 NeXT的公司和一家叫皮克斯的公司,我还爱上一位了不起的女人,后来娶了她。皮克斯公司推出了世界上第一部用电脑制作的动画片《玩具总动员》(Toy Story),它现在是全球最成功的动画制作室。世道轮回,苹果公司买下 NeXT 后,我又回到了苹果公司,我们在 NeXT 公司开发的技术成了苹果公司这次重新崛起的核心。我和劳伦娜(Laurene)也建立了美满的家庭。
    我确信,如果不是被苹果公司解雇,这一切决不可能发生。这是一剂苦药,可我认为苦药利于病。有时生活会当头给你一棒,但不要灰心。我坚信让我一往无前的唯一力量就是我热爱我所做的一切。所以,一定得知道自己喜欢什么,选择爱人时如此,选择工作时同样如此。工作将是生活中的一大部分,让自己真正满意的唯一办法,是做自己认为是有意义的工作;做有意义的工作的唯一办法,是热爱自己的工作。你们如果还没有发现自己喜欢什么,那就不断地去寻找,不要急于做出决定。就像一切要凭著感觉去做的事情一样,一旦找到了自己喜欢的事,感觉就会告诉你。就像任何一种美妙的东西,历久弥新。所以说,要不断地寻找,直到找到自己喜欢的东西。不要半途而废。 
    我的第三个故事与死亡有关。17岁那年,我读到过这样一段话,大意是:“如果把每一天都当作生命的最后一天,总有一天你会如愿以偿。”我记住了这句话,从那时起,33年过去了,我每天早晨都对著镜子自问:“假如今天是生命的最后一天,我还会去做今天要做的事吗?”如果一连许多天我的回答都是“不”,我知道自己应该有所改变了。
    让我能够做出人生重大抉择的最主要办法是,记住生命随时都有可能结束。因为几乎所有的东西─所有对自身之外的希求、所有的尊严、所有对困窘和失败的恐惧─在死亡来临时都将不复存在,只剩下真正重要的东西。记住自己随时都会死去,这是我所知道的防止患得患失的最好方法。你已经一无所有了,还有什么理由不跟著自己的感觉走呢。
    大约一年前,我被诊断患了癌症。那天早上七点半,我做了一次扫描检查,结果清楚地表明我的胰腺上长了一个瘤子,可那时我连胰腺是什么还不知道呢!医生告诉我说,几乎可以确诊这是一种无法治愈的恶性肿瘤,我最多还能活3 到 6 个月。医生建议我回去把一切都安排好,其实这是在暗示“准备后事”。也就是说,把今后十年要跟孩子们说的事情在这几个月内嘱咐完;也就是说,把一切都安排妥当,尽可能不给家人留麻烦;也就是说,去跟大家诀别。
    那一整天里,我的脑子一直没离开这个诊断。到了晚上,我做了一次组织切片检查,他们把一个内窥镜通过喉咙穿过我的胃进入肠子,用针头在胰腺的瘤子上取了一些细胞组织。当时我用了麻醉剂,陪在一旁的妻子后来告诉我,医生在显微镜里看了细胞之后叫了起来,原来这是一种少见的可以通过外科手术治愈的恶性肿瘤。我做了手术,现在好了。
    这是我和死神离得最近的一次,我希望也是今后几十年里最近的一次。有了这次经历之后,现在我可以更加实在地和你们谈论死亡,而不是纯粹纸上谈兵,那就是:谁都不愿意死。就是那些想进天堂的人也不愿意死后再进。然而,死亡是我们共同的归宿,没人能摆脱。我们注定会死,因为死亡很可能是生命最好的一项发明。它推进生命的变迁,旧的不去,新的不来。现在,你们就是新的,但在不久的将来,你们也会逐渐成为旧的,也会被淘汰。对不起,话说得太过分了,不过这是千真万确的。
    你们的时间都有限,所以不要按照别人的意愿去活,这是浪费时间。不要囿于成见,那是在按照别人设想的结果而活。不要让别人观点的聒噪声淹没自己的心声。最主要的是,要有跟著自己感觉和直觉走的勇气。无论如何,感觉和直觉早就知道你到底想成为什么样的人,其他都是次要的。
    我年轻时有一本非常好的刊物,叫《全球概览》(The Whole Earth Catalog),这是我那代人的宝书之一,创办人名叫斯图尔特•布兰德(Stewart Brand),就住在离这儿不远的门洛帕克市。他用诗一般的语言把刊物办得生动活泼。那是 20 世纪60年代末,还没有个人电脑和桌面印刷系统,全靠打字机、剪刀和宝丽莱照相机(Polaroid)。它就像一种纸质的Google,却比 Google 早问世了 35 年。这份刊物太完美了,查阅手段齐备、构思不凡。
    斯图尔特和他的同事们出了好几期《全球概览》,到最后办不下去时,他们出了最后一期。那是 20 世纪70年代中期,我也就是你们现在的年纪。最后一期的封底上是一张清晨乡间小路的照片,就是那种爱冒险的人等在那儿搭便车的那种小路。照片下面写道: 
    好学若饥、谦卑若愚。那是他们停刊前的告别辞。求知若渴,大智若愚。这也是我一直想做到的。眼下正值诸位大学毕业、开始新生活之际,我同样愿大家:   好学若饥、谦卑若愚。
    谢谢大家。

World Builder0.1

World Builder项目,3D地图编辑器。界面,操作,文件格式,大部分和Worldcraft兼容,图中显示的是quake2中的一张地图。
这个项目将来主要为md引擎服务。个人认为,如果做完整的引擎,就必须要有一个好用的地图编辑器,否则没有任何意义,地图编辑器使用他人的并不是长久之计,所以开发了这个项目。

正则表达式库

前几天写的一个正则表达式库,与gnu rx, regexp 的regcomp(&reg, regstr, REG_EXTENDED)兼容。
代码下载地址:
具体信息可以在readme.txt中找到。