2008/04/27

[Linux] Command-no-found is a bad idea.

話說 Ubuntu Linux 有一個動作是,當你打到一個命令是不在路徑裡面的動作,就會自動去尋找這個 command 「可能」是某個套件未安裝,並提示你該安裝哪個套件來追加這個指令。然而... apt-file search 是需要時間的。所以如果有一個笨蛋常常打錯,例如我常常 exit 打成 exiz 的話,它就會在我打錯之後再花上幾秒鐘來確認我做了什麼事…告訴我, exiz 是不存在的指令。

這真的... 不是一個好主意。會用 command line 的人,應該就有 command line 的基本常識了,根本用不著這樣玩。如果真的找不到,我也會用 apt-file search filename 去找,所以,我直接 vi /usr/lib/command-not-found ,讓第一行就 exit。

這個故事告訴我們,在這件事情上面還是自由軟體好~ 起碼我可以自已去追,自已去改。

2008/04/25

[軟體] Windows 底下的 VIM

話說,最近換了工作,所以工作平台從 Linux 換成了 Windows XP ,工作環境的轉換對我來說其實有蠻多地方不方便的,雖然說是 Windows 笨笨的 GUI 用起來沒有什麼「問題」,不過「習慣」對我來說是已經很深的 Linux 作業習慣依賴,現在換到 Windows 上面,還真的有很多不「爽」的地方。

最明顯的例子是在 Linux 底下 Command Line 的回應速度是比較快的,但是在 Windows 底下,要用 Command line ,要嘛就是 cygwin 這個終究不是 GNU Software 的傢伙,用起來都是舊版的 gnu ap ,很多地方都跟現行版本不一樣 (ex: screen的中文) ,一整個不能接受,中文問題也是一堆。用 putty/pietty 連到 vm/remote 都是會慢上好幾步。

這不是重點,重點是今天要來記錄 vim 在 windows 底下的字體設定。

話說, Windows 底下也有 gvim 可以使用,可以連到 vim 的官網下載,下載時可以選擇 "Self-installing executable gvim##.exe gvim71.exe" 的版本來安裝,這個版本會裝上 GVIM ,裝好之後你會發現你很討厭它的 default 底色 (我習慣黑底白字),很討厭它的字體設定 (我近視 450~500 ,但是最近體檢竟然說我視力矯正後是 1.5 建議我重配眼鏡...這不是重點)

配色的部份可以在你的 vimrc 裡面下:
colorscheme darkblue
就可以更換配色,字體大小的部份要下
set guifont=MingLiu:h22:cCHINESEBIG5

"細明體" 不能用,還不知道不知道原因。 h22 就是 22pixel , c 後面是編碼。
要試的時候可以先換成 cANSI。

然後一樣有 global vimrc/gvimrc 的問題。

2008/04/13

[軟體] SSH 密技

本文參照這裡
SSH 是很好用的工具,要調整它,你可以先嘗試修改「一兩」個設定檔:
大家一起改,請修改: /etc/ssh/ssh_config
只改自已的,請修改: $HOME/.ssh/config

1. 平常的連線


平常我們的 ssh 連線大概是這樣下:
$ ssh user1@server1.example.com
不過現在你可以修改你的 config 變成:
Host server1
Hostname server1.example.com
User user1

然後你之後連 server1 時,就只需要下 $ ssh server1 就可以了。

如果有 dsa/rsa key 的認證授權的連法呢?


平常的連法大概是這樣:
$ ssh -i ~/.ssh/id_rsa_server2 user2@server2.example.com

不過同樣的,現在只需要修改你的 config :
Host server2
Hostname server2.example.com
User user2
IdentityFile ~/.ssh/id_rsa_server2


你就可以只要 $ ssh server2 就可以了。

那如果是 port forwarding 那種呢?


我的工作,常超時在加班,有時公司為了安全因素沒給 vpn 的帳號密碼,自已也懶得申請還要什麼安全切結之類的很煩,所以都直接自已拉 ssh port forwarding 出去,再從家裡連回來就好了,這種情況,會不會很難搞?
平常大概是這樣下:
$ ssh -L 8888:127.0.0.1:7777 -i .ssh/id_rsa_server3 user3@server3.example.com

現在一樣,在你的設定檔底下填寫:
Host server3
Hostname server3.example.com
User user3
IdentityFile ~/.ssh/id_rsa_server3
Localforward 8888 127.0.0.1:7777


回應 jserv 的"對自己好一些:談技術手冊閱讀",這篇的末尾也提醒你一下,如果有別的需求,可以去 man ssh_config 喔~~~

2008/04/12

[Programming] pidgin 的回應好奇怪...

這幾天在 gtalk 上的同學一直抱怨我的帳號常常「不小心」就離線了,今天心血來潮跑去追了一下,結果看到 pidgin 底下的回應是:
(20:11:58) jabber: Sending (ssl): <iq type='get' id='purple51e6de60'><ping xmlns='urn:xmpp:ping'/></iq>
(20:11:58) jabber: Recv (ssl)(218): <iq type="error" id="purple51e6de60" to="anton.tw@gmail.com/HomeD65FEDFF"><ping xmlns="urn:xmpp:ping"/><error code="501" type="cancel"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

所以是 gtalk server 那邊回應不接受 ping 的關係嗎?那它要怎麼做 timeout 的功能?回頭看 presence 標籤裡面的 properties ,結果看到了:
<presence from="□□□101@gmail.com/Talk.v931FF9ED3B" to="anton.tw@gmail.com"><show>away</show><priority>0</priority><c node="http://www.google.com/xmpp/client/caps" ver="1.0.0.93" ext="voice-v1" xmlns="http://jabber.org/protocol/caps"/><x stamp="20080412T12:15:13" xmlns="jabber:x:delay"/><status/><x xmlns="vcard-temp:x:update"><photo>5850433266035408e7a5eb19dc39da27db689592</photo></x></presence>

所以是用 presence 裡面的 stamp (UTC time)來做 timeout 的功能嗎?
// 等下用機器人再確認一下。

--
補書籤: Pidgin開發指南

2008/04/11

[Linux] Canon iP1200 印表機在 Linux 上面怎麼用?

這邊是出處
翻譯翻簡單點,就是: 請用 iP2200 代替 iP1200 ,因為 Canon 不給 1200 的 driver。

另外要再調整一下:
$ echo "deb http://mambo.kuhp.kyoto-u.ac.jp/~takushi/ubuntu ./" >> /etc/apt/sources.list
$ sudo apt-get update
$ sudo apt-get install libcnbj-2.6 bjfilter-2.6 pstocanonbj

這樣才真的印得出來。

// 買印表機,不建議買 Canon 的,要買,請先查一下型號... 還有墨水匣還有沒有在賣,一顆多少銀兩。

[軟體] OXIM 一鍵安裝

在 Linux 連線板上看到的,作文的作者跟內容如下:
作者 Maxsolar.bbs@OfO.twbbs.org (Astro v.s. Geo),
#!/bin/bash
#this is an automatic oxim installation script for debian/ubuntu users,
#please visit http://opendesktop.org.tw/demopage/oxim/
#for more detail.
#special thank for firefly.
apt-get install im-switch autoconf automake libtool build-essential debhelper libgtk2.0-dev libqt3-mt-dev libchewing3-dev libxpm-dev libxtst-dev libxft-dev fakeroot cvs -y --force-yes &&
cvs -z6 -d :pserver:anonymous@opendesktop.org.tw:/misc/cvs co oxim &&
cd oxim &&
sh autogen.sh && ln -s doc/debian &&
chmod 755 debian/rules && dpkg-buildpackage -b -rfakeroot && echo
echo "Compiling Done! Now installing OXIM on your system !"
echo ""
dpkg -i ../oxim*.deb && im-switch -s oxim -c all_ALL
echo ""
echo "Now enjoy OXIM as you wish!"


上面的動作簡單的說是:
0. apt-get install 打包的相依 (build essential 不知道有沒有相依在裡面了?)
1. cvs checkout source
2. 安裝 + im-switch

cvs 裡面的 oxim 最讓我高興的是, oxim_1.1.3 沒有辦法固定 xcin default style,到這個版本就有了。感謝上述作者,也感謝 oxim 作者 firefly 辛苦的工作。

2008/04/07

[閱讀] 人月神話書評

這篇首先要說的是「人月神話」這本好書:


做為一個程作寫作人員,總是常常在抱怨公司上面一群人在胡搞瞎搞根本沒搞清楚軟體專案的本質是什麼,總是還用二三十年前設計製作機器的概念套用在軟體設計上面。一個工程師不夠用,那就多派兩個唄。不知道,原來人月的概念在軟體專案上面不僅僅是一種不可思議的想法,簡直到了神話一般的境界。

如果您是同我一樣在程式寫作上面有興趣的朋友,推薦您來看看這本書,它會讓您更明白自已在軟體專案管理上面的缺點。如果您不是程式寫作人員,但希望加強軟體專案管理上的概念,也推薦您來讀讀這本書,簡單而清楚的文筆,讓人一看就可以發出會心的一笑,頓時就明白了,原來軟體專案是這麼一回事。

Google 圖書搜尋裡面可以很輕鬆的找到這本書,並且使用裡面的預覽方式加以閱讀好幾個章節,不會因為只有書皮,而不知道裡面到底是在說什麼。

另外旁邊的側邊欄也可以找到有在販賣這本書的書商,對於書商來說是一個蠻不錯的服務。然後會不會就此就說是圖利書商了呢?下面這張圖應該可以解決一部份我們的疑惑:

答案是:並不會。

Google 圖書搜尋和全球多間大型圖書館合作,透過 isbn 編碼的關係,可以一致的圖書編碼底下在各圖書館底下進行搜尋,就算我是一個窮小孩,我也可以很輕鬆的在圖書館裡頭找到我想要看的這本書。(沒有這本書的話,當然就是每季的建議書單囉~)

:) 小猴子回國也建議多使用這項便利又不市膾的服務。

2008/04/06

[資訊安全] 小心防毒軟體變病毒傳播軟體

上篇 flickr 的抱怨剛發表完,馬上就有人回意見到我的 blog 上面了,我查看了一下它的留言,結果看到:
呃!! 我不讓人家點,所以只留下疑似病毒/廣告軟體的網址。
SECURITY CENTER: See Please Here

總之,點擊下去之後,它就說我中了病毒 (還是 Win32 / windows 特有的病毒 的呢)




結論是,這年頭,詐騙集團還真多,千萬不要信以為真啊。

--
註: 作者用的是 Ubuntu Linux + Firefox ,Win32/Windows 病毒在上面很難發作。成功的機率趨近於 0 ,成功的人大概可以因此拿到 google summer code 大賽的獎金好幾次吧。

[Programming][Kernel] 核心中支援同步的方法

前面我們提到過競爭情形(race condition)的原因和它的解決方式。底下我們要來討論另外一種可行的方案: atomics operation (獨立完整運算)。它所提供的是一氣呵成的指令執行環境,在執行的時候不會因為其它的事務干擾而導致中斷的發生。它的情形會如同原子(atom)一般被視作為一個不可切割的整體。

整數運算


在執行 atomic 整數運算時,只能用使特殊的 atomic_t 資料型別上面。相對於直接使用 C 語言的整數型別而言,會這麼做是有理由的。首先,為了讓 atomic 函式只接受 atomic_t 型別,可以確保這類函式只能用於特定資料。同樣的,也可以避免這種資料傳給其它不是 atomic 函式來使用。其論點在,如果資料的使用過程中不能一致進行 atomic 操作的話,採用的資料又有什麼意義呢?再者,使用 atomic_t 型別資料可以確保編譯器不會自作聰明的進行最佳化的存取方式,對 atomic 運算而言,取得資料的正確位址,而不是使用位於暫存器中的分身的這一點,是相當重要的一件事情。最後,使用這個型別的資料,則可以隱藏在實作上面與平台相依的問題。

雖然在底層實作上面還是採用整數來運算,且在所有 Linux 支援的平台上面都有 32bit 的寬度限制,不過 Linux 曾為了 sparc 平台一度限定 atomic 的資料存取不能超過 24 bit。(容後再補)

atomic_t 的變數定義方式和一般沒什麼兩樣,我們也可以先為它作點初始化:

atomic_t v;
atomic_t u = ATOMIC_INIT(0);


運算的方式也很算單:
atomic_set(&v, 4); /* v = 4 */
atomic_add(2, &v); /* v=v+2 */
atomic_inc(&v); /* v=v+1 */

如果想將 atomic_t 型別轉換成為 int ,可以使用 atomic_read() 的函式。
printf("%d\n", atomic_read(&v));

Atomic 整數常用於計數器 (counter) 設計上面。用複雜的鎖定機制保護計數器過於無聊,所以核心成員採用了 atomic_inc () 與 atomic_dec() 等輕量級的函式,系統負荷也得以減低一些。
完整的函式列表可以參考: asm/atomic.h 這個檔案。

作用在位元上的 atomic


除了整數運算之外,Linux 核心也提供了一組運作在位元層次上的 atomic 運算函式。當然,這些函式都跟硬體架構無關,可以在 asm/bitops.h 底下找到相關的資訊。值得註記的是,這些函式的操作對象都是一般的記憶體位址,所使用的參數有兩個,一個是指標,另外一個則是以位元為單位的偏移量。以下是一個簡單的範例:
unsigned long word = 0;
set_bit (0, &word);
set_bit (1, &word);
printk ("%ul\n", word);
clear_bit (1, &word);
change_bit (0, &word);


註:當然,上面這些操作也有 non-atomic 的版本。可視個別需要來使用。

Spin Locks


要是每個關鍵區域的運算都是遞增運算的話,我們的工作可能就會輕鬆很多,可惜,現實往往不是這麼簡單;也因為這樣,所以我們需要一個同步運算的機制: locks。而在 Linux 核心當中,最常出現的同步鎖,就是 spin lock。這種鎖一次只能被一個執行緒所持有,如果某個執行緒嘗試爭奪 (content) 一個已經被其它執行緒所取走的 lock,它就會開始進行忙碌迴圈(kbusy loop)的情況,意同名稱中所提到的 spin 。這種空轉的機制可以確保在同一時間內只有一個執行緒可以拿得到這個鎖。了解到這點,我們必須先明白,在同步鎖的爭奪上面也同樣會導致執行緒的空轉,進而導致了系統資源上的浪費,這就是 spin lock 的本質,它只是一個輕量級的方案,長時間的執有動作,也是我們應該避免的行為。

spinlock_t mr_lock = SPIN_LOCK_UNLOCKED;
if (spin_is_locked())
{
// 等待 sleep;
} else {
spin_lock(&mr_lock);
// do sth
spin_unlock(&mr_lock);
}


這一章還有許多有趣的小節沒有在本文裡面提到,我們稍後再回過頭來檢驗。

[Windows] git-bash 底下的工具

因為工作轉到 Windows 平台上的關係,所以很多工具改到 Windows 上面運作,跟著在 TortoiseGit 底下使用 git-bash 來維護自己的專案原始碼。結果就是裝了前面提過的 auto-hotkey 使用熱鍵來提昇自己的平台操作速度; 但除了 hotkey...