在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请求的时候去劫持他到另外一个服务器呢?那当然难度就简化多了,但那就不是一个网页代理可以做的事情了。需要我们自己写一个浏览器才行。。但,只是再多想一步,是不是做一个浏览器插件可以解决问题呢?说不定真可以!可惜我没有做浏览器插件的经验,目前还不好说。假如哪位同学有兴趣欢迎讨论~~

以上

终于看了盗梦空间

这么迟还要写影评是不是太无聊了。
不过这片子的译名有问题吧。extraction才是盗梦。Inception翻译成“蚀梦”是不是好得多?

不过我确实没觉得这个片子有什么难懂啊。。可能网上有牛人的神奇解释吧。。不过干嘛要那么多累赘的注释呢(很多故意把事情弄复杂的注释说不定是为了商业造势也说不定。。)?用奥坎姆剃刀全剃掉,这本来是一部其实线索很清晰的电影来着。并且也没有讨论什么太艰深的问题。其实说的就是cobb内心深处的矛盾吧。

最后感觉这个片子其实说的不是梦。
因为梦这个东西吧。第一,在梦里是不能逻辑思维的,并且梦里没有感觉。这点电影实在太假了。在梦里感到痛。。那几乎瞬间就会醒来。更不要说在梦里动用逻辑思维。在梦里计算1+2=3根本不可能,如果尝试的话估计也就会瞬间醒来了。
第二,梦跟镇静剂关系不大。强力镇静剂会让人昏迷,而不是入梦。做梦是浅睡状态,其实大脑是醒着的,只是身体运动机能的多数机关是关闭的。假如吃多了安眠药,或者使用强力镇静剂,那人是不可能做梦的。
第三,梦是跟欲望有着强烈关系的事情。因此梦也是无法“分享”的。我前面一篇博客正好提到了欲望。。欲望其实是一个人独有的东西,是决定一个人属性的东西。就算同样是“我要活下去”这个欲望,对不同的人而言这个欲望表达的也是完全不同的含义。(所谓“不是你死就是我活”。。)而梦,其实正是欲望的表达。不是梦见得到了想要的东西,就是相反,梦见发生了不想发生的事情。一定跟“想要什么”,“希望什么发生”有着深刻的关系。而那是绝不可能与他人共享的。至少不可能跟陌生人共享,假如说跟知心伙伴或者宿怨仇敌分享梦境,那还多少说得过去。。。电影中的梦居然是可以被设计师随意布局随意安排的,而且除了cobb的妻子孩子之外很少出现“欲望”,“怨念”之类的元素。这些梦境的最基本元素的缺失应该说是这部电影的最大硬伤。(当然多数观众是不会在乎的。。)

拿这部电影同黑客帝国相比的话。。

当然啦,因为我是黑客死忠嘛,所以这么比可能不公平来着。而且三部曲的长度让黑客帝国足以讨论他想要讨论的所有问题。其实黑客1里面讨论的问题也不是很多嘛。真正把问题展开和讨论清楚的是第二部。第三部则提供了结局和展望。
(我对黑客帝国的理解也是基于奥坎姆剃刀的,虚幻就是虚幻,真实就是真实,这是我一贯的态度嘻嘻)

呜。。不管怎么说,这确实是值得写几行文字的作品~

P.S. 今天还看了另一部片子 Cube(立方体) 非常好看。应该说也是讨论了非常多问题的一部电影。当然制作方面则是非常简省的。