星期三, 六月 06, 2007

用了一下PLY(Python Lex Yacc)

这次是做一个Pascal的词法分析的实验作业,题目要求比较简单,自己做的时候也比较偷懒,保留字都没写全,这个东西写多了其实挺费体力的。

PLY(python-lex-yacc)框架还是很好用的。

一开始打算用ruby写,好不容易弄懂了ruby-lex的使用,可是却由于生成的ruby代码不完全,不能解释通过。
由于ruby-lex的机制是调用了本地lex操作命令,生成中间c代码,所以或许问题出我的本地
flex上,或许也是项目本身的问题吧。
介于ruby-lex项目已经多年没有人维护了,所以就没一直折腾下去了。

然后想到x8x的Aurum,Aurum is a LALR(n) parser generator written in Ruby.
作为parser当然也包括lexical的分析过程。但下午写的时候x8x不在线,又没有文档,对比example,遇到问题还是甚多,故放弃了。
不过用DSL写出的正规和EBNF着实漂亮。
例如:

_terminals (string(';') | string("\n")).one_or_more
argument argument, '+', argument {argument.s_exp = [:call, argument1.s_exp, :+,
[:array, argument2.s_exp]]}


接着想到linux chen以前的建议,说lisp做lexical analyzer挺方便。决定用lisp写,找到cl-lexer框架,可怜没有文档,例子都通过不。

就如此折腾了很久。

最后觉得还是用python的lexical analyzer写了,python在complier领域的支持比ruby要丰富很
多,很快找到了全面的文档和例子,于是一小会而就搞定了。

经过此次后感觉ruby社区里大都是web,DSL的项目,而python的社区覆盖领域相对更丰富些


附源码
pascal_ply.py


测试数据data

VAR x , y : INT ;
BEGIN
PROCEDURE main ( );
BEGIN
a := 10 ;
b := a + 20 ;
END
END

星期五, 四月 27, 2007

Emacs下安装elisp包的常用方法


比较小型的elisp文件,一般可以直接下载到.el文件,放到你的elisp文件目录。
然后修改.emacs文件

;;把引号内的替换成你的.el文件所在目录就可以了,所有目录下的.el和.elc文件都在require范围之内。
(add-to-list 'load-path "~/.elisp/enable-lisp/")

接着
;;把'后的替换成你的.el文件
(require 'php-mode)

这样就基本设置好了,大部分功能都会加载了。


对于大型的elisp包,你下载到的一般是一个压缩包,比如.tar.gz或者.zip。
1.先解压
2.编译
前几天配过一个tramp。最近装多了以后,发现方法都大同小异。
$./configure --with-contrib --with-emacs
$make
$make DESTDIR=/tmp install


然后把目标被编译到了/tmp,一般有两个文件夹,一个是site-lisp,另一个是texi或者叫info。
3.加载
site-lisp的加载方法还是采用上面提到的
;;把引号内的替换成你的.el文件所在目录就可以了,所有目录下的.el和.elc文件都在require范围之内。
(add-to-list 'load-path "~/.elisp/tramp/lisp")


texi的加载方法(其实texi的加载不是必要的,他主要是一些帮助文件)
(add-to-list 'Info-default-directory-list "~/.elisp/tramp/texi/")


然后require就好了。
最后推荐
$make clean

星期四, 四月 26, 2007

Emacs23下安装Tramp2.1.9的注意

TRAMP 代表"Transparent Remote (file) Access, Multiple Protocol",他是 Emacs 的一个用于远程文件编辑的扩展包。
网上很多安装使用方法都比较旧了,弄的我折腾了好久。(又是折腾,我这些天都被折腾死了)
1.下载
一定要去GNU的FTP下载,sourceforge上也有一个,但是连版本号都没有。

2.编译
首先设置选项
./configure --with-contrib --with-emacs
如果是编译到/usr/share/emacs/site-lisp目录下就用这句
./configure --prefix=/usr
如果是想放到自己的目就要用其他的参数了,贴我的例子
./configure --with-lispdir=$HOME/.elisp/tramp/lisp --infodir=$HOME/.elisp/tramp/texi
设置好了,编译吧
make install
(其实也可以用make DESTDIR=/tmp install来安装到临时目录,然后把lisp和info的文件拷贝到自己常用的相应目录)
3.配置
直接贴我的配置文件吧,大家看着改吧。
;;Tramp
;;tramp elisp文件的所在目录
(add-to-list 'load-path "~/.elisp/tramp/lisp/")
;;tramp info文件的所在目录
(add-to-list 'Info-default-directory-list "~/.elisp/tramp/texi/")
;;指定默认方法,很多人喜欢用scp,我比较偏爱ssh。
(setq tramp-default-method "ssh")
;;指定默认用户
;;指定默认主机
(setq tramp-default-user "gabriel" tramp-default-host "202.117.7.222")
(setq tramp-auto-save-directory "~/tmp/emacs/tramp/")
(setq auto-save-file-name-transforms
'(("\\`/[^/]*:\\(.+/\\)*\\(.*\\)" "~/tmp/emacs/tramp/\\2")))
;;注意最好设置到500以下
(setq tramp-chunksize 328)
;;这里特别写一条ange-ftp的原因是ange-ftp和tramp会有点冲突,但如果使用require先ange-ftp再tramp的方式就可以避免.
(require 'ange-ftp)
(require 'tramp)
4.使用
使用的方法就是
C-x C-f
然后

/username@hostname:/fileaddress
第一次访问的时候会自动提示你输入密码的。
tramp支持Tab键自动补全,真美。

Goolge新搜索界面的小毛病

Google新搜索页面公开测试了,整体界面的感觉比以前更舒服了,另外工具条确实方便了。

试用了不到半天,感觉有一个小毛病很影响我的使用。
以前点击搜索结果,会打开一个新的页面显示选定的结果项,一般的搜索网站都是这个习惯。
而现在点击搜索结果,是在显示搜索结果的页面里打开结果项,于是搜索结果的页面就被重定向到选定的结果项了。
个人觉得这个改变还是相当影响使用的。
看了一下页面的代码,发现果然是a标签里面少了一个target="_blank"参数。

不会google是故意如此的吧。。。。
似乎找不到什么理由。
应该是个bug。

星期日, 四月 15, 2007

话说gnome下workspace切换的小缺陷以及gnome的发音

众所周知,邪恶的windows桌面系统(请允许我这样称呼)是没有workspace的概念的,而xwindows中是有的。我们可以看到gnome,kde,xfce,icewm,sawfish等等等等,都是有workspace的,而默认的在相邻workspace间切换的快捷键是Ctrl+Alt+Left/Right(方向键),当然Ctrl+Alt+1,2,3,4可以用来直接定位,但是我们这里先撇开直接叮问这个情况。我个人而言是习惯用相邻关系来定位的(比如editor位于console和debuger间),而不是1永远放某一类窗口。

假如现在你有4个workspace,那么我们可以通过hotkey从1=>2,2=>3,3=>4,问题出现了,我想从4=>1(或者1=>4)怎么办呢,在gnome下路径是这样的,你需要先从4=>3,然后3=>2,最后2=>1,多麻烦阿~~~
我们试着把他做成一个环(1=>2=>3=>4=>1),那么只需要在4 workspace按下Ctrl+Alt+Right就回到1 worksapce了,怎么样,生产率提高了吧?
其实这是个很小的细节,但是个人感觉workspace切换操作的执行频率很高,所以还是挺重要的。
workspace不应只是一个平铺的画卷,而是一个立体的环。
当你在使用gnome下使用华丽的beryl时,就不会有这个问题了,因为桌面3D了。但是若仅仅为了这一个点而使用beryl那么性能损失太大了(至少我以前一直是由于这个原因使用beryl)。
其实这个问题只是一个3D的思想而已,在2D桌面下同样可以十分方便的实现的。
后来我试用了icewmsawfish,发现他们都是支持4=>1的切换的,3D思想与性能无关

p.s.
以前一直将gnome念为ge no mu,可许多又这样念ge nu mu,今天查了一下字典,发现这个词并不发g的音,正确的发音:

<--- XDICT英汉辞典 --->
gnome
[noum]
n. 格言,箴言,侏儒,土地神
<--- 朗道英汉字典5.0 --->
gnome
*[nәum]
n. 格言, 箴言, 侏儒, 土地神


恩,要改习惯了

debian/ubuntu下管理你的启动项

update-rc.d install and remove System-V style init script links



每当使用aptitude install命令安装了mysql server,apache等服务器后,apt总是会执行默认的配置部署,而一般情况下,这些服务器的默认配置都是随开机自动启动的,于是久而久之,你的启动项将会越来越多,启动速度也会随之越来越慢。

还没有感觉到缓慢的开机速度,冗长的初始化脚本吗?现在你可以通过ls /etc/init.d/以及ls /etc/rc?.d来查看当前的初始化服务。这些便是System V风格的初始化脚本的组织形式(个人感觉比~/.bashrc或者/etc/rc.local的形式更易于维护管理)

无需ln,cp,你只用通过update-rc.d命令便可以管理init.d,包括link的remove,start,stop等等。(更多请参考man update-rc.d



实例:

我通过aptitude isntall命令安装了mysql5.0 server,而每次开机时它都会自动启动,而实际用到的并不多,这样以来既影响启动速度,也增加了日常运行时的任务负荷。

于是saga建议我通过sudo update-rc.d -f mysqld remove命令将mysqld从启动项里删去了。

以后每次使用时只要通过sudo /etc/init.d/mysql start来将mysql服务启动即可。

星期六, 四月 14, 2007

推荐一些和linux相关的工具和玩具

最近一直在折腾一些各式各样的小工具,开始的时候告诉自己这是“磨刀”,花点时间也是值得。

可慢慢的,我发现这把刀似乎磨了太久太久了,而且这种过于完备的准备方式似乎也是有悖敏捷的?工具这种东西应该是采取on-demand原则,而非一股脑儿全装上。

但再想想许多工具引入的是全新的生活/工作的方式/方法,也许你不接触,就永远都不会有demand的。所以还是有些矛盾的。

暂且不想那么多,至少不能白折腾了,所以就此总结一下。



提高生产力的工具/软件:

  1. convmv

    基于命令行的文件名编码转换工具,使用方法具体看man,常用的参数是

    -f 源文件名编码

    -t 目标文件名编码

    --notest 真正的进行了重命名操作,不加此参数的默认情况只显示了将会如何重命名,而不会实际执行




    我个人的主要用途是对从windows的ftp下载gbk编码文件进行重命名,因为gnome的默认编码是utf-8,这里需要执行从cp936到utf8的转码操作。



  2. TiddlyWiki

    TiddlyWiki是一個由「 javascript + CSS 樣式 + HTML 語法」所組成的 html 檔。它可以讓你在本機編輯使用 wiki 語法編輯網頁內容,除了不像一般的 wiki 程式可以在網路上供多人共同編輯之外,其它的功能一概不缺。


    繁体中文版 http://web.nlhs.tyc.edu.tw/~lss/wiki/TiddlyWikiTutorialTW.html

    简体中文版 http://jiangzhanyong.com/tiddlywiki.html

    这个东西折腾起来挺耗时间的,但是能够将我的生活管理的井井有条。



  3. ScribeFire[Firefox add-ons]

    Blog发布工具,是firefox的插件,很方便,支持tag,tackback等很多功能,编辑器也很好用。



  4. Tilda

    一个很有意思的终端程序。与其他大多数终端不同的是,Tilda 支持使用热键激活,在需要时让其呈现在你面前,不需要时可以隐藏它。另外,Tilda 能够嵌入桌面,支持背景透明,仿佛就是桌面的一部分。


    很华丽并能很好的提高生产力,但有些环境使用透明效果回带来显示上的bug(闪的厉害)。


实用工具/软件:


  1. XAMPP

    Apache+MySQL+PHP+Perl集成一体,免去了烦人的无穷无尽的配置问题。



  2. Htop

    查看并管理系统进程



  3. Thoggen

    DVD备份工具,可以将iso/文件夹形式DVD Movie转化成Ogg格式。



  4. HardInfo

    显示系统,设备,内核模块的信息,并带有一些CPU测试评分功能。



  5. CHM Reader[Firefox add-ons]

    以前一直用xchm,但是编码支持不太好。chm reader作为firefox的插件,在编码问题上是利用firefox本身的编码选择功能来实现的。



  6. VirtualBox

    速度快成妖怪了(原因之一:VMWare采用的是逐步分配内存,VirtualBox采用的是一次分配内存),传言稳定性比vmware差,但经过我一周的使用还没发现不稳定的迹象。



  7. miniie

    迷你IE,主要是方便了web developer在Linux下进行IE的调试,估计不会有谁会去用它做browser吧。。。



  8. MultiGet

    非常易用的多线程下载工具,下载速度十分暴力,核心算法较同类产品出于领先地位,稳定性也不错,使用习惯和FlashGet相似。

玩具:

  1. supertux

    SuperTux 是一款跨平台横版过关游戏,以GNU/Linux 的吉祥物企鹅Tux 为主角,游戏仿照超级马里奥(Super Mario) 的风格,画面相当精美,是一款不可多得的优秀游戏。