騎行京西古道

| Comments

13年5月,騎行京西古道。

從水峪嘴下去,進京西古道風景區,通過牛角嶺關城,到落坡馬志遠故居,然後經韭園橋沿永定河谷至擔禮大橋進入G109。

京西古道風景區收20¥,裡面有博物館、軍事酒吧、古道和牛角嶺關城。博物館其實就是個村史展館,很小,沒什麼內容,就一間屋子,一覽無餘。古道是亂石砌成的,非常不平,推車上去很累,好在只有一千米長:

牛角嶺關城,看著像個磚窯,地上的石頭溝溝坎坎:

馬志遠故居,看著像重建的,刻意營造成“小橋流水人家”的樣子,裡面就一四合院,收費10¥,沒進去。附近有一山泉,想老馬也算過了一把農婦山泉有點兒田的癮,夫復何求。

永定河谷一線的景色非常好,可惜沒有拍照。

解決ROX-Filer文件類型識別問題

| Comments

默認情況下,ROX-Filer會將“*.docx”、“*.xlsx”、“*.pptx”文檔識別為zip壓縮包。由於ROX中與文件關聯的行為實際上都是和文檔類型掛鉤的,所以對這些文檔的操作會遇到很大麻煩,而且沒有變通方法。

實際上,Linux對文件類型的識別比Windows靈活。Windows只能通過文件名的後綴判斷文件類型,隨便創建一個文本文件,然後將後綴“.txt”改成“.exe”,Win就會傻乎乎地認為這是個二進制的可執行程序。這種做法很傻,而且很不安全,試想,如果將一個病毒程序的後綴改成“.jpg”,就可以騙過大多數用戶,然後通過某種手段執行它,後果會怎樣?更傻的是,XP以上版本默認是隱藏後綴的,那攻擊者連改後綴都可以省了。顫抖吧,神一樣的Win!

Linux不但可以通過後綴識別文件類型,更重要的,還可以通過文件開頭的幾個字節實現這一點,這就比前一種方式精確、安全很多。當然,Linux還支持更多的文件類型識別方法。

前面說過,在ROX-Filer下,所有行為都綁定到文件類型上,也就是MIME Types,ROX通過這種方式實現了將可靈活自由定製的文件操作與自身解耦,從而在確保自身穩定的同時實現對高度靈活的自由定製的支持,這是一個很值得學習的實現方式。因此,既然文件的後綴沒有問題,ROX仍將它們識別為ZIP格式,原因是什麼?顯然,最大的嫌疑集中在第二種識別方式上。

一個公開的秘密是,Office文檔本身其實就是一個ZIP壓縮包,裡面包含了描述文檔的XML、多媒體文件等成分,只不過MS賤賤地把壓縮包的後綴改成了docx之類的東東,加上Windows只能通過後綴識別文件類型,所以很多人不知道這一點。瞭解了這個,問題的原因就躍然紙上了,既然都是ZIP壓縮包,那第二種文件類型識別方式也就區分不出Office文件類型與ZIP壓縮包了。

能號出病因,就有方子治病。

既然ROX使用多種文件類型識別方式,那必然有一個優先級的關係,否則就會亂套。打開ROX的MIME Editor:

找到MIME類型“application/zip”:

打開zip的屬性對話框:

可以看到“Contents matching”這一塊裡,通過檢查文件頭部的幾個字節是否為“PK\003\004”來判斷,並且此項判斷標準的優先級是40。下面所要做的,就是找到相應文件類型,添加一項條件相同的“Contents matching”,並把優先級設得大於40。

樂山大佛與十面普賢

| Comments

12年8月,去樂山、峨嵋玩兒了兩天。

樂山大佛真的很大:

據說佛爺頭上的便便越多,表示智慧越大、級別越高:

峨嵋金頂的十面普賢菩薩,美輪美奐,從沒有見過這樣一尊佛像,能讓人在看第一眼的時候就感受到震撼:

雲開日出時的十面普賢,那一瞬間,場面無以言表,極為震撼人心:

剛到樂山時看到路邊的條幅,才恍然想起這是祖師爺的老家,沒時間拜謁,罪過罪過。這次旅行最大的收穫就是看到了雲開日出時的十面普賢,是我迄今見過的最攝人心魄的景觀。

夜爬百望山

| Comments

今晚參加了綠野夜爬百望山的活動。主要為了認一下路,以前逃票都是從公路旁柵欄的缺口鑽進去的,後來封了就沒再去。

站在望京樓上俯瞰夜色中的帝都:

活動強度很低,適合下班後鍛鍊一下。百望山很矮,但是叉路很多,有的爬了。

五一徒步恆山、雲岡石窟

| Comments

綠野的活動。

頭天晚上的汽車,第二天早上三四點到恆山後山,五點出發。很冷,除了T恤,就穿了一件冲锋衣,冻得直哆嗦,不过一开始爬就好多了。上山的地方不知名,不是传说中的后山山门附近。爬上第一个山顶,转过去就是修好的登山道,放眼可见莽原与群山:

底下就是我们当晚要宿营的恒山湖:

朕與江山:

再往上没多远就是山顶,恒山海拔虽高,实际爬起来难度很低。

都说前山景色一般、精华在后山,没感觉,也许跟我们走的路线有关,倒觉得前山附崖而建的寺庙耐看:

逢山必看摩崖石刻:

前山處處隱沒在山林中的寺廟,很有意境:

邊下邊逛,中午就下了山,不明白這麼一座平平無奇的山怎麼稱得上北岳恆宗:

然後坐車去懸空寺,寺小、人多、票貴,沒上去,遠遠地拍上幾張交作業:

不宿營的人坐車去渾源縣城住宿,我們徒步走回恆山湖扎營。湖並不好看,水也不怎麼乾淨,有人釣魚,空手而歸,好在湖邊有小飯館,好吃就別想了,聊勝於無。扎營地是山腳一個凹口,是片干了的湖底,沒草,所以帳蓬容易進灰而且硌得慌,遠不像想像中青山綠水草地上伴著明月篝火清風入睡那樣享受。

雖然沒有魚,篝火還是要有的:

除了被凍醒一次,一夜無話。第二天早上坐車去渾源縣城吃傳說中的小媳婦涼粉,這個地方的涼粉配料有特色,主要有三樣東西:不辣的辣椒油、豆干和炸蠶豆,而作為主料的涼粉本身卻並不比其它地方的特別,我想像中好的涼粉應該是入口即化的。不管怎樣,有這樣的經歷也是好的:

然後坐車去雲岡石窟,首先進去是靈嚴寺:

靈嚴寺的塔和佛像都很有特色,不著重彩,呈乳白色或米黃色,觀感素雅:

雙層建築在我到過的寺廟裡是第一次見到:

大雄寶殿門口的黃金樹很耀眼:

寺後就是雲岡石窟,風化的石壁很有滄桑感,與前面金碧輝煌的靈嚴寺對比鮮明。最近越來越不喜歡破敗的事物,所以在前面寺廟的興致至此稍挫:

大窟中的巨佛,依稀可見鮮卑帝國時代的盛況:

石窟的外部原本都是有附崖建築的:

下午四點,坐車返京,晚上九點左右抵西直門散夥。

活動貼在這裡:http://bbs.lvye.cn/thread-780144-1-1.html

最後是恆頂合影:

讀過Hello Android

| Comments

春節前花了一周時間讀完了這本書。

是本不錯的Android入門教材,能讓人快速地搭出開發環境,瞭解Android應用的運作機制,對於移動應用開發的初學者尤其有用。當然,這種書一般不會講得很全面,更深的東西還是要看官方文檔,只是Android的官方指南寫得比較散,並且過於簡單,不適合初學者。

DualHead Watchdog v1.0 Released

| Comments

DualHead Watchdog is a Linux desktop app which runs commands or scripts after display settings are changed.

It is especially usefull for users who prefer window managers to those huge desktop environments. For these people, wallpapers often cannot be ajusted automatically when the screen size is changed or dual-head display is started. With this app, people can run custom commands to reset the background image when the display settings are changed.

For example, I use i3wm in my daily life and I use dual-head display, my laptop has a screen resolution as 1366x768 and my outer display is 1920x1080. So when I start the dual-head display, the background image in the outer display is tiled with 1366x768 images. So I put the following commandline into this app:

feh --bg-scale ~/.wallpaper

”~/.wallpaper” is a soft link to my wallpaper. So when dual-head display is started, this command will be called and my wallpaper will be reset to fit the new screen size.

More than that, users can make this app do everything when display settings are changed. At the moment, there will be a ‘monitors-changed’ and a ‘size-changed’ event, users can specify which event to listen to for each command.

Features

  • A KISSy app which does custom jobs on display changes.
  • Event-driven, which is resource-saving.
  • Can support as many commands as you can set.
  • Each command can be enabled or disabled alone.
  • Each command can listen to either the monitors-changed event or the size-changed event, or both.

Links

  • Project: https://github.com/xbot/DualHead-Watchdog

FAQ

  • How to modify settings ?
    • Right click the tray icon and select ‘Settings’.
  • How to add an entry to the command list ?
    • Right click the command list and select ‘Add new entry’.
  • How to delete an entry in the command list ?
    • Right click the entry and select ‘Delete’.
  • Why doesn’t the command take effect ?
    • Make sure that you have selected the right event to listen and the command is enabled.

Change Log

version 1.0.0 (2013-02-06 Wednesday 15:14:24)

  • Initial release.

遷移到octopress

| Comments

關於遷移

前段時間,用了五年的虛擬主機突然限制了PHP內存上限,導致Wordpress只能啟用有限的幾個插件,根本不能滿足需要。

所以毅然決定遷移到JeckyII+GitHub,在摸索的過程中發現octopress比JeckyII易用,於是導出所有文章,開始遷移。因為我這幾年博客寫得比較亂,無論是內容上,還是發表方式上,結果用了幾個導出腳本,效果都不甚理想,還是有很多地方需要手工修改。六百篇文章,正好趁這個機會挑揀一下,較早的文章質量低的比較多。斷斷續續地遷移了一些,剩下的工作量還是很大的,留著以後慢慢來吧。另外這次把URL也改成永久格式了,這一來真的傷筋動骨了,連永久重定向都沒的做。

至於Feed輸出,以前訂閱Feedburner燒錄的兩個地址的讀者不受影響,直接訂閱Wordpress輸出的地址的就丟了,這裡再公佈一下:

  • 本博客聚合輸出:http://feeds.feedburner.com/sinolog
  • 我的全部資訊聚合:http://feeds.feedburner.com/leninlee

遷移那點事

Python版本的問題

Archlinux很激進,早已把Python的缺省版本進化到了3.x,octopress會用到2.x,結果在生成全站的時候,會報如下錯誤:

1
2
3
4
File "<string>", line 1
    import sys; print sys.executable
                        ^
SyntaxError: invalid syntax

這裡找到解決方法。在octopress的plugins目錄裡創建文件:

1
2
3
4
5
require 'pygments'

if !!RUBY_PLATFORM['linux']
    RubyPython.configure :python_exe => '/usr/bin/python2'
end

不足

用了這段時間octopress,感覺缺點也不小,每次修改後都要重新生成全站,佔用系統資源不小,而且理論上以後會越來越慢。

讀過”ZK: AJAX Without the JavaScript Framework”

| Comments

前段時間,某天凌晨無故醒來,讀完了這本書。

雖然是ZK框架的開發者寫的書,不過實在不敢恭維。開發環境搭建的一章已經過時,其餘內容也顯得蜻蜓點水,加上全書結構顯得不是很合理,總之看完對ZK的感覺仍是朦朦朧朧的,更別說上手做東西了。

ZK: AJAX without the JavaScript Framework

怎樣為紅帽系Linux發行版寫系統服務腳本

| Comments

閱讀說明

閱讀本文要求有基本的Linux系統使用經驗和Bash腳本編程能力。

本文所述的內容適用於RHEL、CentOS等紅帽系Linux發行版。

系統服務簡介

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 啟動MySQL
service mysqld start

# 關閉MySQL
service mysqld stop

# 重啟MySQL
service mysqld restart

# 查看MySQL服務運行狀態
service mysqld status

# 查看MySQL服務是否開機自動運行
chkconfig --list mysqld

# 設置MySQL服務開機自動運行
chkconfig --level 345 mysqld on

# 取消MySQL服務開機自動運行
chkconfig --level 345 mysqld off

運行級別

泛UNIX派系操作系統使用運行級別標識使用何種模式初始化。理論上,不同的發行版各級別代表的意義不同。紅帽系發行版使用以下七個運行級別:

  • 0:關機
  • 1:單用戶模式
  • 2:多用戶模式,無網絡服務
  • 3:多用戶模式,有網絡服務
  • 4:未使用/用戶自定義
  • 5:帶圖形界面的多用戶模式
  • 6:重啟

最常用的是0、3、5、6四種模式。其中,0和6表示關閉和重啟操作系統,所以,執行命令init 0shutdown是一個效果,同樣,執行命令init 6reboot是一個效果。模式3即普通的命令行用戶界面,模式5即普通的圖形界面用戶界面。

模式1在個別情景下會用到,例如忘記root用戶的密碼時,需要進入模式1修改密碼。

系統服務腳本格式

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

# chkconfig: 345 99 12
# description: This is a sample service script

case "$1" in
    start)
        # Start something.
        touch /var/lock/subsys/sample
        ;;
    stop)
        # Stop something.
        /bin/rm -f /var/lock/subsys/sample
        ;;
    restart|reload)
        # Restart something.
        ;;
    status)
        # Report the running status of something.
        ;;
    *)
        # Invalid command, complain an error.
        ;;
esac

exit 0

解釋

假設本服務腳本文件的文件名為sample

整個服務腳本是一個普通的Bash腳本。主體是一個case語句,定義了四個命令start、stop、restart或reload、status,顧名思義,四個命令分別用來啟動、停止、重啟該服務,以及獲取服務的運行狀態。

紅帽系發行版使用chkconfig命令設置服務自動在哪個運行級別被自動執行。要使服務腳本支持chkconfig命令,需要加入註釋行:

1
# chkconfig: 345 99 12

其中,345表示缺省的運行級別,使用如下命令添加服務時:

1
chkconfig --add sample

將和使用如下命令一個效果:

1
chkconfig --level 345 sample on

99表示啟動序號,例如若希望服務B在服務A啟動後啟動,且服務A的啟動序號是98,則服務B的啟動序號應設為大於98的一個整數。

12表示停止序號,作用與啟動序號相同。

此外,若希望在操作系統關閉前先自動執行服務的關閉命令,需要在/var/lock/subsys/目錄中存在與服務名同名的空文件,因此,應在start命令中創建一個這樣的文件,並在stop命令中刪除之。