Moving to ArchLinux

DSC_0004
这是用新入的Nikon 55-300mm的长焦镜头300端排的远处的塔吊,它与本文没有直接关系。如果实在要计算间接关系,它是我等待fedora无尽的启动时间里消磨时光的手段之一。

这周开始fedora彻底崩溃了,现在在默认的run-level下NetworkManager根本无法启动,次次3分钟超时。还由于不明的原因,以越来越大的概率,gdm会僵死在启动启动之前。如果切换到terminal,输入完用户名居然连password都不会prompt出来。有时甚至在runlevel3里都无法启动。本想忍下去等到下个月f16发布,但是今天晚上已经彻底无法进入系统了,算了,其实也就是挥挥刀的事情。

Ubuntu的回头路是走不得的,索性切换到了Arch,从此享受rolling release,不再在每年的4月10月里蠢蠢欲动惊慌失措。重装的经验和上次一样:看准分区,/home留着/干掉;在创建用户的时候看准原先用户的uid,直接用这个id创建新用户,这样$HOME自动就归属新用户了。Arch仓库里的东西甚至要比fedora还多,没有那么多洁癖,甚至Skype和IDEA的社区版都直接进了仓库。我现在年纪大了,能从仓库安装我是不会自己再去下载了。

其实Arch也是老朋友了,直不过以前一直把它憋在VirtualBox里,现在它从VBox里爬出来了,Ubuntu和Windows这些当年的host们被踹进去乖乖作guest了,翻身农奴这就起来把歌唱。

Beginning Emacs for Clojure

没错我开始用Emacs了!对于一个使用lisp方言的开发的人来说,Emacs无疑是正统,是professional的象征。

Screenshot--home-sun-projects-clojalk-src-clojalk-wal.clj

其实用Emacs,远不需要太多的配置,就可以创建一个高效率的开发环境。我用了两天不到时间,当然还包括过去三年甚至更长时间里多次试图学习Emacs并最终半途而废残存的精力。

一步一步来,fedora系统的用户,比如这位,还有我,都会奇怪,命名有emacs,可是为什么没有GUI呢。因为系统自带的只是一个简单的版本,用yum安装一下emacs这个包才算是真正完整。

接下来要跳关了,大家注意。Emacs-starter-kit是一个帮助初学者预先配置emacs的一套默认配置文件,有了这个配置文件,也算是爬上了巨人的肩膀,省去了很多探路的时间。安装方式,把这个git仓库的master分支打包下载到~/.emacs.d/里即可(展开到这个目录)。启动emacs后,会自动安装。(作者名字很熟悉,对了,就是leiningen的作者)

由于package.el已经配置好了,接下来就可以安装一些必要的mode,两天的时间初探,我安装了:

  • clojure-mode
  • clojurescript-mode
  • auto-complete
  • color-theme-tangotango
  • slime
  • slime-repl

安装方式:
M-x package-install
输入包名即可。

clojure-mode和clojurescript-mode是编辑clojure的mode,不多说。

配色

color-theme我本来是习惯用solarized,不过尝试了几次color-theme-solarized这个包应该是有一些问题。退而选择了tangotango。要默认选择这个颜色,在init.el里加:

(require 'color-theme-tangotango)
(color-theme-tangotango)

代码提示

auto-complete是代码提示和自动补全插件,安装完成后要简单配置一下才能使用:

(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/elpa/auto-complete-1.4.20110207/dict/")
(ac-config-default)

当然网上有更多的高级配置,可以搜一下。

REPL

clojure的IDE必须要有repl的支持,在emacs中,repl通过slime这个mode来实现。此外还要额外安装swank:
lein plugin install swank-clojure 1.3.2
在项目目录通过lein swank启动。在emacs中:
M-x slime-connect
选择swank启动的host和port即可。这是一个支持tab提示的强大REPL,并且可以引用lein项目中的代码。

Edit/20110920
其实只需要在clojure-mode中通过M-x clojure-jack-in 即可启动swank和slime。

ParEdit

ParEdit是编辑括号的利器,Emacs-Starter-Kit已经把这个包配置好了。ParEdit不仅会自动打印括号,最强大的是还能阻止用户误删或误输入括号!有了它基本上括号的问题就轻松多了。
(当然,有时候需要强制删掉括号C-u DEL,也可能要强制输入括号C-q (C-q )

TagList

很遗憾ctags不支持clojure,而且emacs似乎也没有一个比较好的TagList。我看到有人提到imenu在一定程度上倒是可以做到类似的功能:
M-x imenu

总得来说,捅破了窗户纸,用emacs编辑clojure还是最好的选择!

用coffeescript重写了首页

下午有时间看了一下coffeescript,发现非常优雅。过去对JavaScript的工作,从dojo到jquery主要是在库的层面,这次coffeescript的出现是在语言层面对javascript做了一次加强。现在对语言的加强不再需要mozilla/microsoft/google/apple几家坐下来慢慢聊了,民间的力量就可以实现。

coffeescript的几个特点也属于博采众长:

  • 类似python的,以缩进取代代码块
  • 类似ruby/perl,方法调用括号可选
  • 类似ruby,无须return
  • 正常的类声明语法

在nodejs的环境里可以通过npm安装coffer-script,利用它的命令行程序,可以把coffeescript编译成javascript。不过最给力的是可以在网页里通过引入coffee-script.js来直接执行(其实也是编译一下)coffeescript。

于是我顺手重写了一下首页的js,改写成coffeescript。因为少打很多() {},手可以控制在键盘中心的,敲字的效率大大提高。用空你也可以尝试一下。

告别Ubuntu,迁移到Fedora 15,GNOME 3

Fedora15/Gnome3

昨晚终于下了决心告别Ubuntu的紫色,迎接新的GNOME3桌面。这个想法有一段时间了,Ubuntu从09年生日的时候安装在这台电脑上,已经将近两年的时间,经历了9.04, 9.10, 10.04, 10.10, 11.04五个版本,安装了GNOME, awesome, KDE, LXDE, Openbox, wmii, GNOME3, Ubuntu Netbook等等桌面环境,可以想想那种混乱。而且通过升级获得的新版本,并不能体会到快速开机这样的特性。这次unity发布以后,用了半个月,没有什么眼前一亮的感觉,操作也不太方便,于是换发行版的想法就更加强烈了。

我的系统之前有三个分区,分别挂载/,/home以及/opt。这次更新理想的方式就是格式化/,保留/home和/opt。之前比较讲究规范,所以/下面基本上没有什么需要备份的东西,配置文件都放在/home下面。这样用fedora的livecd安装程序手动配置磁盘分区,只格式化/就可以了。安装的过程非常顺利,重启以后就进入用户配置的界面了。

要把原先的/home/sun分配给新的sun用户,这里我走了一点弯路。系统可以把/home/sun目录配置给新的sun用户作为$HOME,但是目录的owner并不会根据用户名称来匹配。Ubuntu默认第一个用户的UID是1000,而Fedora创建的新用户默认是500. 我现在不确定如果把第一个用户的ID手动指定为1000会不会就直接成功。不过这个问题不大,只要启动之后用root用户把/home/sun目录chown给新的sun用户就可以了,当然文件很多是需要消耗一些时间的。

进入GNOME3桌面之后发现无线网络连不上,而且不弹出密码输入框。因为我最近改了无线的密码,而NetworkManager还是从gnome-keyring里去读旧的密码,所以总是连接失败。这时rm -r ~/.gnome-keyring/ 删除旧密码即可。

桌面的第二个问题是桌面背景仍然是旧的配置(只有颜色没有图片,因为GNOME3默认桌面不由Nautilus管理),这时要毫不留情地删掉所有GNOME2的配置: rm -rf ~/.gnome2 ~/.gconf ~/.gconfd

第三个问题,gnome的applition菜单非常混乱,还存着Ubuntu系统时候的内容。根据freedesktop的标准,用户的菜单配置保存在~/.config/menus里,而用户菜单会从~/.local/share/applications下读取所有的.desktop文件,甚至包括wine也会在这里创建自己的菜单。对付这些内容,一删了之: rm -rf ~/.local/share/applications/*。这样菜单就只会从/usr/share/applications/下读取.desktop文件,这些都是最新安装的。

然后,然后就没有了!就可以开始享受fresh install了,甚至你打开thunderbird,所有的邮件都在那里,什么都不用再做。
Window Selector
如果要比较gnome-shell和unity的话:

  1. gs的启动器比unity要好用,unity的启动器搜索程序之后必须点击图标才能启动,gs可以直接回车启动第一个
  2. gs的dock比unity要好用,其实都与windows7的任务栏类似,但是 unity里打开了一个终端之后,再点这个图标就转到终端,如果想新开一个就无奈了,右键点击也没有新开的选项。(难道是shift+click,来不及试了。。。)
  3. unity的indicator比gs的tray强大多了,这是ubuntu的强项,从10.04开始就用自己的indicator,到了11.04已经有成熟的API,除了官方的,还有很多程序支持,还有天气、系统监控的indicator。gs抛弃了原来的panel applets,现在看天气、看系统状况都无从谈起。尤其是看不到cpu使用情况,心里总是不踏实,天知道firefox+flash又把你的系统烧了多久。

总体来说这次重装效果非常好,基本上没有留下任何瑕疵。断断续续用了四年多的Ubuntu,再见了~

Setting up soldat and gefr

本文介绍soldat服务器和gefr WSGI适配器的环境搭建,以及jip的基本使用。

安装python工具

virtualenv和pip是python开发的关键工具
sudo apt-get install python-virtualenv
sudo apt-get install python-pip

jython需要您手动下载安装。推荐安装到/usr/local/下,并建立软连接到/usr/local/bin/中,下文将假设您是这么做的。

创建虚拟jython环境

virtualenv -p /usr/local/bin/jython gefr-test
cd gefr-test
source bin/activate

安装jip

pip install jip

配置jip

在$HOME下创建文件.jip,内容为:

[repos:oss]
uri=http://oss.sonatype.org/content/repositories/snapshots/
type=remote

[repos:central]
uri=http://repo1.maven.org/maven2/
type=remote

[repos:local]
uri=/home/sun/.m2/repository/
type=local

安装soldat

配置完jip后,可以使用jip来安装soldat
jip install info.sunng.soldat:soldat:1.0-SNAPSHOT

文件将被下载到 javalib 目录中,您可以检查安装的正确性:
$ ls javalib/
log4j-1.2.16.jar slf4j-log4j12-1.6.1.jar
slf4j-api-1.6.1.jar soldat-1.0-SNAPSHOT.jar

安装gefr

pip install gefr==0.1dev2

创建一个简单的Python WSGI程序

创建test.py

from gefr import Gefr

def wsgiapp(environ, start_response):
    status = '200 OK'
    res_body = "<html><head><title>Welcome</title></head><body><h1>It works!</h1></body></html>"
    res_headers = [('Content-Type', 'text/html'),
            ('Content-Length', str(len(res_body)))]
    start_response(status, res_headers)
    return [res_body]

Gefr(wsgiapp, host='0.0.0.0', port=8000).start()

启动服务

使用jip附带的jython-all
jython-all test.py

打开浏览器,访问 http://localhost:8000/

用ab测试服务性能

$ ab -n 10000 -c 100 http://localhost:8000/

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Completed 10000 requests
Finished 10000 requests

Server Software:        gefr/0.1dev
Server Hostname:        localhost
Server Port:            8000

Document Path:          /
Document Length:        79 bytes

Concurrency Level:      100
Time taken for tests:   2.539 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      1640000 bytes
HTML transferred:       790000 bytes
Requests per second:    3938.11 [#/sec] (mean)
Time per request:       25.393 [ms] (mean)
Time per request:       0.254 [ms] (mean, across all concurrent requests)
Transfer rate:          630.71 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.6      0       8
Processing:     9   25  22.4     21     239
Waiting:        9   25  22.4     21     239
Total:         13   25  22.3     21     239

Percentage of the requests served within a certain time (ms)
  50%     21
  66%     22
  75%     22
  80%     23
  90%     26
  95%     40
  98%     65
  99%    233
 100%    239 (longest request)

Good Luck!