年度读书计划-总结

去年11月份给自己定了一年的读书计划,结果可以说实现得非常糟糕。

决定当年读完的《linux内核》和《编译原理》两部书,都没有认真看完。只是概略翻了翻。

不过也不是说自己一点书都没有读。

图书馆借到的两本书,就看得津津有味。

一部是《linux设备驱动程序》,我一直都没找到合适的学习linux内核的书籍,才发现学习驱动是认识内核的一个非常好的切入点。而这一部书原理介绍的非常清晰,更容易从学习中抓到内核脉络。

另一部是《C专家编程》。年少无知的我一直认为自己对C语言了解已经足够了,接下来不再需要阅读语言相关的书籍了。看了这部书之后我的看法大大转变。可以说学无止境这句话用不能忘吧。这部书是Solaris系统程序员所写,风趣生动,包含大量系统开发过程中遇到的实际案例,同时介绍了C 语言标准、编译链接等等众多细节和trick。看这本书那两天,我几乎一直在捧腹大笑。实在是好书。尤其这本书言谈中吐露出的黑客文化,对我也是再一次的激励。

说到黑客文化,这里强烈推荐的是emacs中附带的advanture文字冒险游戏。相信喜欢tbbt的同志们应该已经看到Sheldon玩过了,“动用全球最先进的图形渲染引擎,AKA 大脑”,;)

新的一年一定要努力读书了,否则书架上书看不完也带不走,那就太浪费了!!

新年第一篇

新年要早起哈~

好久没写博客了。。也许是因为忙吧,也许是因为沉迷游戏。。也许是因为不够细心了所以不像之前那样一直有新发现。。

总归新的一年一定会有新的感想和新的成绩的~

— \ | / — 莫名其妙的分割线 — \ | / —

n年没上豆瓣的人被人加了一下好友,结果又去逛了逛,然后就火星的发现了这个

是正在看某个电影的页面的时候,出现在页面右上的。

确实是个很不错的主意啊,把fm和电影整合在了一起。

呵呵,应该说豆瓣的那一群人还是蛮有意思的吧。

关于生存还是死亡这个热门问题的讨论

今天突如其来的在推上聊了些或许旁人会认为是无趣的事情。。
其实缘起自@rainux的一些及其严肃的问题们。或许虚大大只是扔了这么块板砖进TL的池塘然后在一旁偷笑吧。总之大家都很有劲头地摆出了严肃的哲学家的脸谱认真论战了一番。值得记录,值得记录。

总之,虚黍熟在一番委婉之后,在推上抛出了他宿构已久的这个问题:

@rainux: 所以本来还打算找天晚上在 Twitter 上跟大家讨论死亡的问题,结果都不知道该不该说了。
@pipitu: 没关系吧。。。
@littlepush: 连结婚生子都还没想好要怎么做的某只表示死不死的这种问题不在考虑范围内…虽然说死掉了就死掉了,不管活着的人有什么看法、感想、感情,对于死人来说没有任何意义
@rainux: 虽然我也没想好结婚生子的问题但真是越来越觉得时光飞逝如电,死亡越来越近了,我甚至经常想象哪天自己回过神来突然发现生命之火已经快要熄灭时的状态。无论如何也不知道应该如何面对自己的死亡。

对于这个问题,当然每个人的看法都是不一样的。

@pipitu: 不会啊,会很平静的,一辈子下来什么都经历过了,有什么好痛苦的,人总归要死的
@littlepush: 活着和死了的唯一区别就是体内的C14含量… 感觉我好冷血,不过生和死,对于自身来说并没有什么差异,因为死了你自己也不会有感觉。而对于身边的人来说,是你认为他们会在乎还是他们自己认为会在乎?时间是一切的良药,而已。
@yamimasho: 所以死了之后的事情,都是还活着时候的一种期望呀。。。
@hawkwithwind: 这就我前面说的生死由自己决定的意思,你还不想放弃人生,其实就说明生命力强,(除非意外)不会离开这个世界,反之,假如对人生失去了兴趣,意志消沉,那么死亡就在眼前了。
@rainux: 大概是我太自私?虽然亲人朋友的死也难面对,但应该说自己的死才是最在乎的吧?就是很不愿意接受死亡这件事,虽然很理性地清楚这是毫无悬念不得不接受的。

接下来,@rainux着重定义了自己对生命的眷恋,其强度和其范围。

@rainux: 其实在我看来与其说是能真的想开,不如说是到了那个时候不得不接受而已。
@rainux: 在我最痛苦,觉得生活毫无色彩的时候,我也一样贪恋生命站在18楼窗前也不敢再往前。
@rainux: 孤独痛苦我已经习惯了,但失去意识是如论如何也不能接受的。

@hawkwithwind: 都说了没有高低之分了。。||假如说秦始皇唐太宗也贪恋人生,那说明贪恋人生是伟人气质,我们都比不上你呢。。
@rainux: 不,我觉得我只是单纯地贪恋生命而已。就算是生命力强我也没什么强大的毅力成为什么强人,而且就算是强人又如何,对死亡的恐惧丝毫不能减轻。

@pipitu: 说到底还是不能接受自己的存在被时间抹杀不留痕迹:没有人记得我,没有人能证明我在这个世界上存在过,有过什么样的经历和感情,那些记得我的人记得的也只是他们脑海中的我,并不是真正的我,他们也将死亡,就更没有人记得我了,就和我从未来到过这个世上一样[之前GT你跟我说的一些话的感受]
@rainux: @pipitu 完全不对。我不能接受的仅仅是自我意识的消失,是“我”的消失,而非存在的证据之类无聊的东西。名垂青史或者遗臭万年对我来说都毫无意义,我只是想要“我”能继续存在继续感知世界感受自己的存在。

不知道阿虚之前经历什么样的大开大阖,居然走到了“站在18楼窗前也不敢再往前”的地步。这里先给大叔加把油!幸而现在的阿虚已经能淡定的坐在电脑前面跟我们畅谈这个话题了。无论能否看开生死,都绝不应该蔑视生命。其实惧怕死亡,是大自然深深刻在我们内心深处的对生命的敬畏之情也说不定吧。

接下来讨论支离破碎,变成了多个开放式的分支,当然,对每一个子问题,都没有人有答案。把追寻这些问题的答案变成我们生命的理由,也是个不错的主意吧~
病痛:

@hawkwithwind: 考虑一种极端的情况,假如身患重病,活着就是要被各种痛苦的治疗折磨,而没有享受思考和精神物质世界的心情,恐怕对生命的热情就大打折扣了吧。
@rainux: 这么说大多数人年老之后都要经历各种病痛然后死去其实是为了能更容易地接受死亡?
@hawkwithwind: 不知道。。生老病死。。这是大自然的鬼斧神工。。不敢揣测。。||根据道的观点,自然是无情无为的,“目的”是人后天附加上去的。

看破红尘:

@pipitu: 我不是说现在啊,我是说你确实到了油尽灯枯感觉到自己的生命快要消失于这个世界的时候,那时候应该就很坦然了,因为世间一切事物都有兴衰,死亡是必然的结局啊
@hawkwithwind: @rainux 我认为你的状态正符合我的命题。你可以设想一下自己活了几个世纪之后的状态。。
@rainux: @pipitu 以前也有不少朋友跟我说过你这样的观点(好像也是天蝎座 Orz),但我无法信服。我觉得就算那个时候还是一样会非常留恋人世,舍不得这里的精神的物质的一切。
@rainux: @hawkwithwind @pipitu 以前也看过一篇关于永生的痛苦的科幻小说,大意就是说因为有永恒的生命你终究会经历所有的事情对一切东西失去兴趣。不过普通人类有限的一生是不可能达到这种状态的,所以一定会留恋。
@yamimasho: @rainux @pipitu 即使不舍得也只能坦然接受自己快要死掉的事实 // 所以与其到时候带着遗憾离开,还不如趁早为所欲为啊。。。(啥
@hawkwithwind: @rainux 带着身边的人的祝福,带着一生美好的回忆,带着或许一丝眷恋一丝遗憾一丝牵挂,走完人生路,其实是件美好的事情。热爱生的人,不该惧怕死亡。不朽的,只有癌症。
@rainux: @hawkwithwind 很多文学或者艺术作品也都宣扬这种观点,但我大概是太懦弱了吧?与其说热爱生命不如说贪恋生命惧怕死亡。

此时之我非彼时之我(子非鱼焉知鱼之乐):

@pipitu: @rainux 我觉得你还是把现在的自己代入到那个时候了,我可以肯定的告诉你那个时候的心态是不会和你现在一样的,人老了很多事情都会看开的,包括生死
@rainux: @pipitu 你老过吗?你怎么能准确地知道年老后的心态?
@yamimasho: @rainux @pipitu 正是因为无法预测,所以你现在想的跟你几十年之后想的也可能完全不一样。到那个时候回过头来想想现在自己的态度,会觉得很可笑呢。。。
@hawkwithwind: @rainux @pipitu 跟老人聊天,尝试理解他们的心境的时候,自己猜的一些。。||其实跟你搭讪猜测女生心思可能差不多吧。。

尘归尘,土归土:

@littlepush: 你能接受别的生物吃掉你的body么? RT @pipitu: @rainux 吾已经看开了【远目
@pipitu: @littlepush @rainux 能啊,在我死后
@hawkwithwind: 其实死后被别的生物吃掉才是最自然的。烧成灰,还不是被植物吸取。生于自然,归于沃土,这是定理。
@hawkwithwind: 做成木乃伊,放在水晶棺材里,那是恶鬼。。那才是无法接受的。。

之后我们一致赞成的一点是,虚叔才不是贪生怕死呢,看开看不开,没什么好没什么不好:

@hawkwithwind: 真的,我觉得“看不开”也是好事啊~说明你活跃嘛~你看历史上的真正强人都是贪图长生不老的。这是生命力强的表现嘛
@rainux: @hawkwithwind 不,我觉得我只是单纯地贪恋生命而已。就算是生命力强我也没什么强大的毅力成为什么强人,而且就算是强人又如何,对死亡的恐惧丝毫不能减轻。
@rainux: @pipitu @hawkwithwind =_= 说来说去还是说我不如你嘛。
@pipitu: @rainux @hawkwithwind 这种事情哪有什么比较的说法。。。际遇不一样看法自然不同而已。。。
@hawkwithwind: @rainux 都说了没有高低之分了。。||假如说秦始皇唐太宗也贪恋人生,那说明贪恋人生是伟人气质,我们都比不上你呢。。
@pipitu: @rainux 阿虚你才不是这样呢, 我觉得阿虚的人生观比我强多了= =
@rainux: @littlepush 的确你的经历冷酷得多。这么说来我的经历质量还不够
@pipitu: @rainux @littlepush 不要比较这种事情啊笨蛋_,=

最后来迟的@Charseer不鸣则已一鸣惊人,拿到了本次论战最多的RT:

@CharSeer: 不就是生死嘛。。。我老了,早看开了。“我来到这个世上,就没准备活着回去”

除此之外,我和@littlepush单开线程,纠结起了生命定义这个更加无聊的问题。。虽然看似无关,但确实如果无法定义生的话,则也无法定义死。然后如何看待死亡这个问题本身也就站不住脚了。所以作为脚注这段讨论也是值得列下来的。

@littlepush: 死亡也是一种生命的表现形式,生命还在延续,只是作为载体的本身不会有任何感觉而已。
@hawkwithwind: 这条我不赞同,那我问你,在出生之前,生命是否也是存在的?
@littlepush: 如果你从纯粹的科学角度出发,把你自身分解成无数的原子/夸克和能量,你会自然的去用最基本的能量守恒定律来解释你的生命的连续性。
@hawkwithwind: 物理学解释不了生命。他能解释生命现象,却解释不了为什么我们能感知体验这一生。他能定义感情的化学反应,却定义不了什么是“我”
@littlepush: 你可以很自然的看待猪、牛、羊…因为从心底里你觉得人类比其他动物高级,那如果你从比人类高级的生物的角度来看待人类,个体的生命没有什么特殊的意义,而种族的延续性才是生命的含义。
@hawkwithwind: 那不是因为感觉“高级”,而是因为无法“同情”。人更能同情跟自己地位经历类似的人。人能同情拟人的猪,却可以随意吃猪肉。归根结底人只能了解自己,也就是“我”,除此之外只是用“设身处地”的方式同情别人而已。跟自己越近似,就越容易同情。所以人能理解人,能养宠物,却难以接受毒蛇蜥蜴之类的冷血动物。更体会不了岩石大海的感受。
@littlepush: @hawkwithwind “同情”其实是最没必要的一种情感(对我来说…我讨厌看到别人“同情”我),每种生物都有自己的感觉,可以通过其他途径来了解、实验别的物种,却无法了解“自己”,所谓“超然于世外”也仅仅只是一种逃避的借口。
@hawkwithwind: 晕。。我说的“同情”可不是替你流几滴眼泪那种“同情”,而是“以自己的经验去理解别人的处境”。相比起毒品走私贩,你更容易理解一个程序员的辛酸,因为你自己也是程序员。相比起一块岩石,你觉得猫才算是生物,因为你自己也是哺乳动物。假如你是一块岩石,说不定你觉得人类都是些无聊的跳蚤,不过我肯定错了,因为我不是岩石,也无法“同情”岩石
@littlepush: @hawkwithwind 这是毫无意义的吖…“自己的经验”就是自己的,不是“别人的”,更不会是“我的”,这是很没意义也很让人气愤的一件事情吖
@littlepush: 你不会觉得岩石是生物因为生命的定义里不包含岩石,这个比喻是不是有点问题? RT @hawkwithwind: @littlepush 相比起一块岩石,你觉得猫才算是生物,因为你自己也是哺乳动物。
@hawkwithwind: 为什么你觉得岩石不算是生命?生命的定义其实归根结底是根据“人”的状态,扩大范围决定的不是吗?假如你是一块岩石,或者说外星某种智能岩石生命吧,他们肯定觉得人类算不上生命。
@littlepush: 那你告诉我生命的定义是啥?!
@CharSeer: 我理解的生命就是能主动维持自己的状态的东西
@littlepush: @hawkwithwind 都说是“智能岩石生命”了…如果把“智能”两字去掉,那作为“岩石生命”,它的起点和终点又是如何的呢?如何定义这种生命形式的“生”和“死”?
@hawkwithwind: 在我看来,生命就是“我”,当然,这是唯心论的观点。我不想强加给别人。但是认为生命就是DNA+蛋白质则未免肤浅了一点
@hawkwithwind: @rainux @littlepush 你看,啊虚说,它可以接受肉体的毁灭,却无法接受精神的消失。这个精神,正是指的啊虚的“我”。同样用这个“我”,可以定义岩石、海洋、星河宇宙的生命。其实生命就是宇宙的律动吧。周而复始。
@rainux: @pipitu @littlepush […] 我不能接受的仅仅是自我意识的消失,是“我”的消失,而非存在的证据之类无聊的东西。名垂青史或者遗臭万年对我来说都毫无意义,我只是想要“我”能继续存在继续感知世界感受自己的存在。

最后的最后,当我想要开启一个新的篇章的时候,鲸鱼出现了。大家只好无聊地退散。。

@hawkwithwind: 何妨把这宇宙看成是一部书呢?只要在这宇宙中生活过,就永远写在这部杰作当中了,在其中某个篇章中,不朽

最后的最后的最后,套用最近沉迷的wow的一句台词。。

@hawkwithwind: 敞开心胸,接受圣光吧!

其实人类只是寂寞了

把在buzz上说的话贴过来了。。

认为外星生物非得是要水要温暖要氧气才能生存实在是太幼稚了。
为什么生物一定要是碳基或者磷基的?
为什么生物一定要是高分子的?
为什么生物一定要是化学的?
为什么生物一定要是在行星上的?

其实人类只是希望在外星找到自己罢了。
其实人类只是孤独罢了。

在linux上使用fbterm和ucimf启用中文命令行

昨天说了希望找到一个好用的linux下的中文命令行, 最好还是用framebuffer的, 今天果然就找到了, 其实就是名气响当当的fbterm. 顾明思意, 他是使用framebuffer的, 完全满足了咱那小小的需求.
装这个东西费了我不少时间. 主要也是因为ubuntu没有提供安装包支持的关系. 好在这个东西名气比较响, 网上的讨论比较多, 很快找到了资源.
首先安装fbterm本身. 这个东西ubuntu有安装支持. 接下来是fbterm_ucimf. 这个东西是给fbterm用的中文输入法. 要先装libucimf再装fbterm_ucimf. 这些ubuntu源上都没有, 幸而google code上有他们的项目, 很容易找到. 可惜装完之后他用不了. 网上查了很久也不知道怎么解决. 想想看只好继续往下安装. 就又安装了Openvanilla-modules, ucimf-Openvanilla. 这两个东西google code上的fbterm_ucimf项目那里也有. 全安装完毕之后再打开fbterm, 敲击Ctrl-Space之后, 按F9, 终于看到输入法了!不过那输入法很扯淡, 用不了. 按照网上说的, 到Openvanilla安装目录下面去找那堆输入法.cin文件, 除了pinyin之外全删掉(我是把后缀改成.bak). 世界清静了.
至于前面为何输入法没弄对, 我一直不清楚. 也许是Openvanilla才是真正对输入法的支持吧. 进fbterm之前要设置正确locale: LANG=zh_CN.UTF-8 使用这个命令之后再 fbterm -i fbterm_ucimf 就能正确启动fbterm啦~
顺便说一下fbterm两个小问题的解决: 如果他进入之后说快捷键无法启用, 那是因为权限问题. 根据google code上wiki的提示, 使用chmod u+s /.../fbterm 就好了. 路径请自己whereis查看. 如果无法启动, 说是fb device权限问题, 那请修改/dev/fb0的权限. 我偷懒了, 直接写的chmod  777 /dev/fb0 以后会采用规整的chown的方式来弄好他.

这篇文章就是为了庆祝这个重大胜利在linux console下面写的(在实验室写了一半, 后半篇回寝室在win上写的orz|||). 其实这个fbterm还是有点bug,  屏幕显示有时会刷出些混乱的东西.  不过已经是我能找到的最好的中文命令行了.
借用网上的评价, zhcon和cce都已经停止开发了, 只有fbterm还有人在支持. 从这个角度来说, fbterm已经是最佳选择了. 希望他能越做越好~

ubuntu禁用gdm

通常禁用gdm的方式是修改/etc/inittab文件,将默认起入init 5的设置改成默认起入init 3就好了。
但是这个方式在ubuntu下似乎走不通。因为ubuntu下面根本就没有/etc/inittab文件,并且据网上说ubuntu默认对init [2345]都加上了gdm支持,所以你自己加了一个/etc/inittab文件确实能覆盖ubuntu原始设置但是也没啥用。

网上有介绍,在服务设置中关闭gdm对2345运行级的默认启动设置就行了。但是我自己这台机器它本来就是deactive的,不知为何还能进入x。这点我没有求其所以然。

不过根据网上的另外一些介绍,找到了/etc/init文件夹,下面是一堆各种init脚本。ls | grep gdm,只有一个gdm.conf。他有一句stop on runlevel如何如何,方括号应该是正则的或的关系吧,写成[012346],就只有init 5能进x了,默认进的应该是2,网上有交代,在rc_sysinit.conf里面也能找到。有人说要改成3,其实不是5就行了(当然也不能是0和6)。

起进去我楞了好久。一开始我的grub还是带splash的,它闪啊闪最后不动了,cpu和硬盘都不动了。我就只好重启。后来进safe mode关了splash看他的输出信息,我还以为是他卡死在配置电池什么什么的一个环节出不来了。网上查也查不到怎么回事。只好孜孜不倦地反复重启。其实再怎么重启效果也是一样嘛,但是可能人就不一样了。某次又重启的时候莫名其妙按了ctrl-alt-f1,然后就进命令行了。才知道原来他CPU也不转了硬盘也不叫了其实就是启动完毕了。我傻乎乎反复引导了十多次才搞明白这么回事。

最后说一下进了命令行上不了网怎么办吧,其实很简单。我也是在网上查的,就是sudo dhclient,他就会自动获取IP了。当然如果你的网络是需要手动配ip的那你还是自己ifconfig eth0吧。或者改脚本也行。命令行下怎么用无线网络我还没试过,以后回去试试看。

最后说下,这个Ubuntu Skills的网站相当给力啊。常用工具都指出了。强烈推荐。

linux发烧

最近玩linux比较hi,虽然没有什么正式的成果,但还是很开心~

先说说最近的吧,终于下定狠心把ubuntu上的gdm关掉了。以后进linux就全面进入黑屏时代。但说实话不能上网搜索材料的话,光有命令行也没什么用处。。因此找了几个重要的工具~

  • w3m 命令行下的网页浏览器 可嵌入emacs
  • freetalk 支持jabber的聊天工具~可以gtalk啦~
  • dfbsee DirectFB See 使用framebuffer的图片浏览程序,貌似还能播放视频~

基本上我对日常学习工作的需要也就是这些了。本来在emacs上配Gnus, 虽然配好了,但是很难用,尤其是似乎不是很适应gmail的标签风格,经常是显示不出来新邮件。我尝试在gmail里面设置规则,给所有邮件都加上一个inbox标签,才丑陋地解决了这个问题,但是还是很难用的一个东西。尤其是附件下载的方式也很糟糕。

现在有了w3m,可以直接访问gmail了,就没有这个问题了。w3m对下载的支持也很棒~唯一的问题就是不支持css吧。不过在命令行下面主要看的是文本,就算有css支持又怎样…反正命令行下面也没有字体字号什么的设置。

我其实最原始的在命令行下面看网页的想法是直接用wget把网页下载下来,再用脚本解析之后取出内容放纯文本里面看。可是wget只能下载,没法填写表单发送请求之类。我本以为可以直接在路径后面加?=什么的让他支持,但似乎失败了。例如尝试


wget google.com/search?q=hello

就失败了。收到403 forbidden 但是直接


wget google.com

是成功的。不知道是为什么……是google主动封锁了这样的读取方式吗?不知有没有解。。

freetalk没什么说的啦,纯粹好东西,还支持文件传输(未测试),比某些版本的gtalk客户端都好用。(不过不支持语音就是了。。)测试过聊天之后,进gmail一查,果然聊天记录也存在邮箱里了。可谓完美。加上使用@rainux同学的twitter gtalk机器人twimeido,还能发推。当然,用w3m连dabr也行。用不了web推,因为js太复杂的关系。。在命令行模式下直接ssh连上墙外的主机就可以建立tunnel,之后就在墙外了很方便。

dfbsee是我折腾了最久的一个东西。一直没找到好的命令行下看图工具。后来查到zgv,没来得及尝试,又发现了这个dfbsee。网上对dfbsee的评论是,因为使用splash的关系,很可能你的机器已经启用了framebuffer,那么为了看图去装另外一个图形驱动来运行zgv就不划算了。因为顾名思义,dfbsee是建立在fb上的看图工具。

ubuntu上没找到dfbsee的支持包,直接去官网下了源码。然后编译。要先编译安装DirectFB的代码库,很简单configure – make – make install就行了。然后就遇到问题了。官网下载的最新版的dfbsee源码和最新的dfb库居然是不兼容的,某个叫做DFBCardCapbilities的结构(后来发现貌似是个enum)找不到。网上搜了搜找到某个邮件列表里的讨论,原来开发人员把这个接口改名叫做DFBGraphicsDeviceDescription了,而dfbsee似乎还没来得及更新。按照他说的搞了个全文替换,要改这个结构还有一个get函数名。继续编译还有问题,有个叫做rotate.c的代码里面有很多形如


void * d;
(__u8*)d = ...;

的代码。首先那啥__u8,__u16,__u32之类的缺少定义,搞个typedef就行了,当然是对应的uchar,ushort和uint。接着那个类型强转在gcc眼里不算是lvalue,不能赋值。只好弄了个临时变量,中间倒腾了一下就行了。


void *d, __u8 *ptemp;
ptemp = (__u8*)d;
ptemp = ...;
d = (void*)ptemp;

其实也许改改编译选项也就过去了,但是实在懒得改就这么乱动代码蒙混过关了。编完了居然还不能跑,原来是某些so库它默认的路径和安装的路径不一样。用whereis找到那些库,然后ln -s 直接在对应地址下面建立符号链接,总算能跑了。其实本应该在configure的时候设置正确的路径的,但是实在懒得折腾了,就这样再次蒙混过关了。

这么折腾了半天之后这劳什字终于跑起来了。运行起来看看果然没白花时间。我的framebuffer设的1024*768*16bit,显示那些下载下来的墙纸什么的都很完美。还能一定程度地缩放。惟一缺点就是键盘处理有点问题,似乎是把按下一个键和抬起一个键当作两个事件处理了,结果按一次pagedown它要往后跳两幅图片。我一开始还以为文件夹里面有一半的图片他现实不了呢!后来用了他的slide-show功能,看到全部图片了~

不知道能不能把dfbsee设置成w3m的图片显示器,那样就太完美啦~不过这个以后再考虑吧。。

现在终极问题就是纯命令行模式下打不了中文。。这个实在不爽。看google就用英文当然也就算了,但是给人回信总不能总卖弄外国语吧囧。。。别跟我提zhcon,那东西太难用了。当然显示中文终于勉强能显示了。但是打字打不进去。打进去也是乱码。。况且现在我起zhcon只能sudo zhcon –utf8,结果是在zhcon里面搞的东西权限全是root的。这个很不爽。还要去弄那些中文字体的权限才能让zhcon不必跑在root下面,又要花时间折腾啊。。我准备再找找看有没有别的中文命令行,再试试看。最好是也是支持framebuffer的。“自己写一个”。。偶尔也会跳出这种想法。。但是最近这么忙不可能有时间折腾了。自己编译的内核还没跑成功过,正在试着写的linux驱动模块也有不少问题要调试。。所以其他想法先往后排吧。。

所以假如最近一段时间我给大家回邮件或者gt聊天总是跳英文,请不要生气。。我不是在卖弄英文。。。是懒得startx。。或者是正在备考12月底的英语机考。。妈的那玩意考不过就得明年重修。。抱歉爆粗口了囧|||

说到编译linux内核和学写linux驱动这回事,还有几句话想说。以前一直没想过要先写驱动。总觉得要先好好学会linux内核之后,在去学写驱动。结果买了些讲内核甚至讲源代码的书。不是说看不懂,而是说不知看来干嘛,有种无从下手的感觉。结果就晾在那里了。现在学写驱动,发现其实写驱动是学习内核的最佳手段,严重向大家推荐。这是一个很好的切入点,让你有事做,有一个目标,能去实践一些事情,然后你会遇到问题,就会想要做调试(当然就是内核调试),然后就会熟悉很多很多东西。现在我学的还浅,只知道些Oops啦panic啦什么的,strace也是刚刚学会用。接下来要试着弄user mode linux(这个也叫UML哈哈), 试着弄xen,还要试着弄很多好玩的东西。相信能学会更多吧。目前只能用用virtualbox,在x下是个好东西~不过既然决定要争取不进x,那还是要试着弄点更高级的!

于是自己加嘞个油吧。。(这么非主流。。。@ @)

Geek讲故事

筹划了一阵子,最近开始写小说了。
放在一个新的地址 http://story.hawkwithwind.net欢迎戳我~~

其实一直有写小说的想法,可惜都没坚持下来。
这次的世界设定和预先设计好的故事线比较长,提前设计好的人物也不少,估计能比较持久一点。
内容来说当然是我本人比较喜欢的科幻+战争+政治+宗教+哲学,口味比较奇特。。所以。。唉。。既然贴出来还是希望能多少有一两个读者。。我会在我能力所及范围内尽可能追求科幻的合理性。不过为了剧情刺激,超光速旅行还是不得不设计。我会尽可能拒绝时间旅行。

在幻想方面我想我的想象力还是相当充沛的,可能会看到很多老科幻电影的影子,但绝对有新东西。

我的短处就是人物设定啦。。毕竟作为一个宅男认识的人不多,很难把各种不同性格的人写好。。所以可能会发现很多人物其实都是我个人的某个侧面的投影。。这也是没有办法的事情。。

作为一部引人入胜的小说,假如全角色都是男生没有女生那恐怕不行,更糟糕的是如果没有罗曼蒂克情节那一方面实在不够吸引人,另一方面也太不真实。。总不能说未来人都变得特冷特逻辑,都没有什么爱恨情仇了吧。。呜不过这方面是咱的大大弱项。。所以。。随便写着玩玩吧。。

以上。

php网页代理实现原理笔记

去年冬天我说过要改一改phproxy让他能够正常浏览twitter和facebook。到现在马上要一年过去了我还没动静。。作出承诺而不执行实在糟糕。这里先做个笔记希望接下来能继续做下去。假如有同学愿意帮助我的话则极其欢迎!!

这里用访问网页的流程作为引子说明一下php网页代理的简单原理。
首先用户提交一个url给服务端。这里有个trick就是这个url以name为q的一个GET方法传入服务端。后面这个trick有很有效的应用。
服务端接到请求后读取这个url,需要做url的parse。这个在php里有现成的函数parse_url。需要解析的东西是很多的。比如要知道他是http还是https。要拆分出主机名和后面的路径。假如有端口号要记录下来,否则http赋以80端口,https赋以443端口。等等。
分析完成之后需要建立连接,然后发送请求。建立连接使用的是fsockopen。之后需要根据http协议建立请求。http协议其实是用\r\n分隔的一系列文本行。要说明的东西很多,比如GET还是POST方法,访问域名和路径是什么,cookie和session定义等等涉及到方方面面非常细节的东西。我还没有完全看完,不过如果只是想要读取一个简单的页面的话只需最基本的几个项目定义好就可以了。将这些内容做成一个字符串,然后使用fwrite写入到前面打开的socket中去。
发送请求之后就使用fread读取socket等待响应。需要用一个while循环不断读取,因为他可能一次发送不完。前面发送的东西是一个http头,跟上面提到的内容一样也是一系列\r\n分隔的文本项。需要根据协议依次处理这些内容。我在实验中完全忽略了这些内容只是将后面的网页显示出来。但phproxy的代码里面已经将处理http头的工作做得非常细致了。
理论上来说读取到的网页信息(也就是<html>标签包含的那一堆东西)只需直接echo出来就可以在页面上显示了。做到这里最原始的一个网页代理就做完了。但事实上这是远远不够的。首先发现的就是很多链接无法打开,css和js文件没能加载,很多图片也显示不了。为什么呢,因为他们使用了相对路径,而现在的主机域名已经变成phproxy架设的域名了。即使他们使用了完整路径,但是由于不经过代理的缘故客户端很可能还是无法加载。
因此必须将那些资源依次下载到服务器上,并将路径改成服务器上的路径,才能使用户正确的读取。
这里就用到了最开始的那个trick了。最佩服作者的地方就在这里。直接遍历下载下来的html脚本代码,找出所有可能出现网络路径的位置,例如src=啦,url(啦,background-image啦等等。并直接在这些路径前面加上phproxy路径加?q=就可以了。也就是本来

http://twitter.com/api/

这个路径就变成

http://phproxy.host.net/index.php?q=http://twitter.com/api/

这个形式。从而递归的调用了自己,将网站需要的资源全部下载下来。

当然这个简述简化了太多细节,尤其是http头的处理部分。但那些并不是我关心的。我关心的东西主要有两个。一个是为什么他不能访问facebook,一个是他为什么打开twitter之后无法发推(新版twitter只能显示标题栏)。

不能访问facebook原因很简单,问题出在用户通过form发送请求时使用的是明码传输。即使使用了base64编码也无济于事,因为那并不是一个加密算法。必须在用户输入url地址后通过javascript在客户端加密之后发送到服务端才能解决问题。这很简单,我昨晚尝试了一下,仅仅使用了每个字符的ascii码减1这种方式,就轻松穿过了防火墙。而服务端发回的数据$_response_body也使用某种简单算法加密,然后urlencoding之后放到一段javascript代码里面。

<script language="javascript">
function my_decode(body){...}
document.write(my_decode(decodeURIComponent("$_response_body")));
</script>

上面这个是拼接完的效果省略了很多单引号和字符串连接。当是伪代码来看吧。
这样客户端接收到数据后就会先解密然后显示出来。加密算法本身没有必要很复杂,只用最弱智的加密就可以。至少目前是这样。需要注意的是$_response_body里面的东西必须urlencoding,否则它里面有双引号啥的的话就会把整个javascript毁掉了。

但后续的工作并不轻松。因为前文提到整个网页中的全部资源都必须重新下载,因此必须修改代码中每一处可能用到url的地方,调试工作还需要一些时间。这两天正好是秋学期期末考试,考完试的空闲时间应该可以搞定。

另外一个问题是他为什么能上推但是不能发推。原因很简单那就是他还不支持ajax。要让他支持ajax稍微有点难度。当然说起来很容易那就是去parse 全部javascript代码,发现ajax的code就给他加上一前述proxy前缀就好了。但问题没那么简单。javascript实在太灵活了,任何地方都可能出现url。换句话说,要想完成这个功能要做javascript的语义分析。我想说那个工作的复杂度已经远远超出做网页代理的范围了。当然什么时候有空可以搜搜看有没有开源的js分析工具。但我不清楚有没有php版本的。假如有js版本的也可以,嵌一段js code到网页里在客户端解析。但无论如何是个大工程。至少对目前的我来说是。(假如有人愿意帮忙的话非常欢迎~~~)

如果totally放弃这个思路换一个想法呢?能不能在客户端发起ajax请求的时候去劫持他到另外一个服务器呢?那当然难度就简化多了,但那就不是一个网页代理可以做的事情了。需要我们自己写一个浏览器才行。。但,只是再多想一步,是不是做一个浏览器插件可以解决问题呢?说不定真可以!可惜我没有做浏览器插件的经验,目前还不好说。假如哪位同学有兴趣欢迎讨论~~

以上