Sunday, February 17, 2008

the end of winter recess

這個寒假比預期的廢了很多,預定的事項,想讀的書,沒一件做完的,再來,三月一日就是研究所考試了,看著別人即將踏入考場,自己摸著鼻子甸甸自己剩下不到一年的時間儲備,真是難以說話。雖然沒有完成預定的事項,不過練習 perl/ruby 之餘還是寫了些 bot,cwbbot 是個簡單的 ruby 天氣預報機器人,提供他 twitter 的帳號和密碼,丟進 crontab,就可以每天自動取得明日溫度。

Saturday, February 16, 2008

perl 和 ruby 的 twitter shell

twitter 最近紅透半邊天,perl 和 ruby 都有了 twitter api,現在還有 twitter shell,perl 的 twitter shell 利用 cpan 下 install Twitter::Shell 就可以得到 /usr/local/bin/twittershell, 使用方式為新增一個 yaml,如: touch ~/.twittershell.yml , 裡面填入
username: yourtwitteraccount
password: yourtwitterpassword
在 shell 下 twittershell -c ~/.twittershell.yml 就進入該 shell, help 可以得到幫助。

ruby 版本內建在 twitter 這個 gem 內, sudo gem install twitter 就可以得到 /usr/bin/twitter,直接在 shell 下 twitter 就可以得到幫助。不過 ruby 版本對 unicode 沒有支援,無法顯示中文,嘗試在 twitter gem 內的 twitter.rb 加入
require 'jcode'
$KCODE = 'u'
,不過沒有效果,作者也表示暫時不會加入 unicode 支援。

Friday, February 15, 2008

land mine in file name extension of ruby

和 perl 不同, ruby 的 third party module package, 也就是 gems, 副檔名和一般 script 都一樣是 ".rb", ruby 搜尋 module 的 path 似乎又包含了 ".", 所以如果使用的 script 檔名和 script 引用的 gems 內的檔名相同的話, 就會衝突 :/

Sunday, February 10, 2008

vim tab 功能

今天逛 Cornelius 時偶然發現 Vim tab 的功能,是 7.0 開始加入的新功能,使用感覺相當方便,基本用法如下:
:tabe filename 在新標籤頁打開一個檔案
:tabc 關閉標籤頁
:tabo 關閉其他標籤頁
:tabn 下一個標籤頁 或是 gt, C-PageDown
:tabp 上一個標籤頁 或是 gT, C-PageUp
:tabr 第一個標籤頁
:tabl 最後一個標籤頁
:tabs 顯示所有標籤頁
:tabm [N] 移動到第N順位
還可以 :set tabline 來定義 tab 顯示方式

Thursday, February 7, 2008

dos2unix

因為有個 js 檔是從 windows 上來的,要更換換行字尾,遍尋不到 dos2unix,這裡寫到和我一樣的遭遇,google 排名還滿前面,看來許多人都有同樣需求?需要的套件是 sysutils。

Sunday, January 6, 2008

aptitude tutorial

aptitude 是 sarge 之後建議的套件管理器, etch 之後應該是預設的,同時支援指令介面和文字 cursor 介面,是基於 apt-get 的模式發展的,我想他是想解決 apt 相關指令太過繁瑣的問題吧,另外也加上了自動解除不被相依套件的功能,以及 mutt-like 正規式搜尋的支援,後者還頗為重要,我想這是使 .deb 系統領先 .rpm 系統的關鍵(註:yum 管理器可以支援 shell 的 pattern 查詢,apt-cache 不支援任何 pattern),他也相容 dselect,可以說把 debian 之前的所有套件管理方式都包含進來,使用 aptitude 也一段時間了,不過最近才弄清楚他的特性。

Review

首先,回顧一下 apt 套件管理器運作的方法,這在 aptitude 中也是一樣的,利用 /etc/apt/source.list 內指定的套件庫來源,aptitude 可以取得這些伺服器上準備好的套件列表,當然是有註記相依性在裡面,使用者只要指定要安裝的套件,aptitude 便會下載所有相依套件,交給 dpkg 解壓縮,配置到正確位置,和 apt 不同的是 aptitude 會將未被指定安裝,但相依性上需要而安裝的套件標記一個 A (Append),表示是個附加套件,當使用者移除當初指定安裝的套件時,如果附加套件沒有被其他套件相依,aptitude 便會移除他。

Interactive Interface

接下來來實際使用一下,先看比較簡單的互動式介面,在 shell 下直接輸入 aptitude 就可以得到文字 cursor 的介面。

這裡使用了樹狀的分類,主分類分成七個,只要用方向鍵移動就可以瀏覽套件庫:
1.資安更新 security update:這裡列出已經安裝且有更新的套件
2.新套件 new package:列出這次套件庫中的新套件,也就是之前不曾出現過的套件,按下 f 會將這些套件歸類為已知而不再出現在這裡,直到下次有新增套件才會羅列在此
3.已安裝套件 installed package:列出已經安裝的套件,而且都已經是最新版的
4.未安裝套件 not installed package:列出還未安裝的套件
5.過期的和自行建立的套件 obsolete and locally created packages:已安裝的套件但沒有出現在套件庫的
6.虛擬套件 virtual package:虛擬套件指的是一個邏輯上的套件名稱,這些套件實際上會由其他套件提供,例如 mail-transport-agent 由 postfix, sendmail, exim 來提供
7.作業 task:有點類似 deselect,利用預定義的方式安裝特定任務套件,還可以利用 .aptitude 檔案對任務進行瀏覽和安裝

文字 cursor 介面使用方式非常直覺,進入後第一件是就是按下 u 來更新套件庫資訊,利用 Ctrl-t 來選擇上方選單標定套件要進行的動作,最後按下 g 就可以得到想要的效果,如果嫌太麻煩,選單旁邊還有標示快速鍵,其中有許多快速鍵是支援 vi 模式的,例如按下 / 就可查詢,查詢完按 n 可以跳到下一個符合項目,上下方向鍵也是,其中最重要的當然是標定哪些套件要安裝/移除的快速鍵,分別是 + 和 - ,標定好狀態後按下 g,就會執行更動。常用的快速鍵列表有:

F10:和 Ctrl-t 一樣顯示 menu
Enter 觀看套件內容
q 離開這個頁面,在主頁面按下會離開 aptitude
?:幫助頁面
f:清除新套件標記,也就是將新套件這個分類內的套件都標示為已知的套件
u:更新套件庫資訊

/ 搜尋
\ 反向搜尋 (這項在 debian reference 內寫錯)

g 執行所有套件異動
+ 將套件標記為新安裝或更新
- 將套件標記為要移除,此選項會保留組態檔
_ 將套件標記為清除,包含組態檔也刪除
= 將套件標記為固定
: 在此次執行期間鎖定該套件

U 將所有可升級套件標記為升級
C 觀看套件變更紀錄
L 將套件標示為重新安裝
R 將套件標示為重新配置


Command Line Interface

不過對於習慣在文字介面下過活的人,上述方法未免太痛苦了:D,aptitude 提供的強大 command line,可以讓你更快速達到目的,而且和 apt 系列指令基本上相容,具官方說法,aptitude 和 apt-get 管理不同資料庫來維護相依性,實際上使用,apt-get 和 aptitude 可以看到彼此安裝的套件。

aptitude 的命令形式為 aptitude action [argument],如 aptitude update,使用 update 這個 action 指示更新最近套件列表,可用的 action 為:

update 從來源處更新套件列表
upgrade 更新所有資安更新
dist-upgrade 更新所有版本更新

search pattern1 [pattern2...] 搜尋滿足樣式的套件
show package1 [package2...] 顯示套件資訊
changelog 顯示套件更改紀錄

install package1 [package2...] 安裝套件
reinstall package1 [package2...] 再次安裝套件
remove package1 [package2...] 移除套件
purge package1 [package2...] 清除套件

download 下載套件的 .deb 檔案
clean 刪除已下載的套件檔案
autoclean 刪除舊的已下載的套件檔案

hold 將套件標示為保持狀態
unhold 取消對一套件的保持命令

markauto 將套件標記為自動安裝
unmarkauto 將套件標記為手動安裝

forbid-version 禁止升級特定的套件版本
forget-new 將新套件辨識為已知套件

可用的 argument 請自行參閱 aptitude -h 所顯示的內容,可最為命令時的輔助用。

另外在搜尋中有些判斷語句可以作為輔助
~ahold 代表標示為保持現狀的套件
~b 為損壞套件
~g 無用的套件
~c 未清除的套件
~n{text}名稱中含有{text}的套件
~d{text} 描述中含有{text}的套件
~m{maintainer} 由指定維護者維護的套件
~V{version} 版本號{version}的套件

這在清潔系統時非常有用,例如,可以下

# aptitude purge ~g

這樣的命令,就會清除系統內所有無用的套件,這個功能在 deborphan 套件內也有提供且更為強大,但 aptitude 這樣的整合提供了很高的便利性。

文字介面的彈性不只於此,在互動式介面中可以用的標記這裡全都可以用,例如,可以下這樣的命令

# aptitude install A+ B- C_ D=

這樣便代表了安裝A,移除B,清除C,保持D,僅用一行便可以完成。

Tag Definition

無論利用 aptitude 瀏覽套件庫或是使用文字介面查詢,可以看到每個套件前面標示有一些 tag,標示套件目前的狀況或種類:
p 已清除或未安裝的
v 虛擬套件
B 損壞
u 已由 dpkg 解開
C 配置到一半的的
H 安裝到一半的的
c 移除 (remove) 但尚未清除 (purge) 組態的
i 已經安裝的
E 內部錯誤的

moo


OK,寫程式總是要來點樂趣,可是寫這種套件管理程式哪有什麼樂趣可言,又是正規式又是相依性的,那...作者到底在哪裡找樂趣呢?如果你仔細瞧瞧 aptitude -h 所顯示的幫助頁面,會發現在最後一行有個 "這個 aptitude 沒有超級牛力 (This aptitude does not have Super Cow Powers.)",如果你有用過 apt-get,那還會發現 apt-get -h 所顯示的幫助頁面最後一行有個 "這個 apt 有著超級牛力 (This APT has Super Cow Powers.)",什麼是超級牛力呢?嘿嘿,超級牛力是 debian 系統中一股神秘的力量喔~。請試著鍵入

# aptitude moo

有東西嗎?那...再多加個 -v 進去看看。
哈哈,你肚子痛了嗎?那...再多加幾個 v 看看XD。

Reference Document


[1] aptitude 簡明手冊
[2] debian reference
[3] aptitude user manual
第[2],[3]項在 debian 上分別為 debian-reference-zh-tw, aptitude-doc-en 這兩個套件

後記


寫這篇大概寫了我五六個小時不只,剛開始寫真的沒想到會寫這麼久阿。我可以了解 Rails 聖經作者 Dave Thomas 說 "我每寫一本書,就發誓這是最後一本了" 的心情:D

Saturday, January 5, 2008

debian 上的 apache2 manual

適才偶然發現了 debian 上的一個 apache 小秘密,還頗有趣的。

事實上,debian 上的軟體很多都有提供 xxx-doc 這樣的文件套件,安裝位置都在 /usr/share/doc/ 底下,apache2 也不例外,預設上 /etc/apache2/site-available/default 這個 site configure file 是有 alias /doc /usr/share/doc 這樣的配置,所以雖然我有裝了apache2-doc,一直以來我也都是連到 http://mymachine/doc/ 來看的。不過 apache2-doc 提供的 html doc 就是特別奇怪,連結都連結不好,所以我都會重新配置檔案,copy 一份 en 的到特定資料夾,這樣才會比較正常。

但沒想到這份文件其實提供了一個 configure 在 /etc/apache/conf.d/apache2-doc,cat 一下這個檔案,會發現裡面寫好了 /manual 這個 alias 並且做了一些 redirection 來符合文件內的超連結。所以其實連到 http://mymachine/manual/ 就可以正常觀看。

我只能說......真是服了XD。

Saturday, December 29, 2007

gem update on debian

日前升級了 debian 上的 gem,隨即發生無法使用的狀況,檢查之後發現,debian 內建的 rubygems 套件安裝位置在 /var/lib/gems/,而gem 原生的安裝位置在 /usr/lib/ruby/gems/,因此升級後會發生找不到正確 gems 的狀況。

因為 gems 的目錄配置方式不符合 FHS,debian 在 3.x 就一直遲遲不發佈 rubygems 套件,即使目前 4.x 發佈了,在目錄的相容性上問題也很多。

目前看來要安裝 gems 又不用通過官方安裝包條件的最好方法就是,先安裝內建的 rubygems,執行 gem update --system 之後,會得到一個 /usr/bin/gem1.8,然後移除 rubygems 和 libgems-ruby1.8,最後將 /usr/bin/gem1.8 重新命名成 /usr/bin/gem,就可以得到原生的 gem。

Sunday, December 23, 2007

jifty screencast

今天發現一個還不錯的 jifty 教學影片,位在
http://www.crium.univ-metz.fr/docs/devel/jifty/screencast.html

感覺上和 rails demo movie 差不多,晚點再來看看,不然 CPAN 上的 tutorial 實在不是我小小弱者看得懂的阿XD。

OS: CPAN 上的 tutorial 連基本的 MVC 架構都沒解釋清楚,實在也太把大家都當作強者了 Orz...

Thursday, December 6, 2007

CGI::UploadEasy

今天研究了一下 CGI::UploadEasy 模組,這是 CGI 上傳模組中最簡單的一個,只要在網頁內設定好上傳檔案用的 input 欄位,然後最後加上一行

my $upload = CGI::UploadEasy->new(-uploaddir=>"上傳資料夾",-maxsize=>"負數視為不設限,單位為KB",-tempdir=>"暫存資料夾");

這樣會自動判斷有多少個檔案要上傳,還有上傳檔案的 mime-type,最後可以用 $upload 物件內的方法來取得上傳檔案的參數。

不過這個模組不是很適合我目前希望的方式,他能夠指定的參數只有目錄,中文也有問題,另外兩個 CGI::Upload 和 CGI::Uploader 模組則是功能太複雜了,過兩天有時間的話自己動手作一個上傳模組好了。