利用 FUSE/SSHFS 真是可以作些好棒的壞事。
Windows network (SMB/CIFS) 再怎麼效率不彰,對區域網路中的 Windows 工作站來說還是很方便的系統,可惜 Linux 與其它 Unix-like 系統過去都沒有可與之抗衡的網路磁碟分享機制。NFS 的認證與權限設定太僵化、SMBFS 得用明碼儲存網路分享帳號與密碼。而且最重要的是,無論是 NFS 或 SMBFS,都很難由低權限的一般使用者進行管理操作;如果沒有 root 或 sudo 權限,幾乎沒辦法進行掛載,那便不必談網路磁碟使用了。
FUSE/SSH 可以解決 Linux 所遇到的這個困境。FUSE 是一組 kernel module 與程式庫的集合,把它看成是允許一般使用者直接進行檔案系統掛載操作的機制就可以了。SSHFS 是建基於 FUSE 之上,利用 SSH 協定作為傳輸手段的網路檔案系統。因為 SSHFS 是基於 FUSE 設計的,所以不需特別的權限,便可以直接呼叫使用!
要使用 FUSE/SSH,kernel 的版本要夠新。目前 Debian etch 的 kernel 已經到了 2.6.18,用這個版本最方便。
寫了這麼多,本篇的重點在於使用 FUSE/SSHFS 是常常會遇到問題的。剛剛在 SSHFS 掛載的遠端系統上 svn up 便出現了 svn: Can't move ... : Operation not permitted 的錯誤。解決方法是加上 workaround=rename 的選項 (以 -o 指定)。
以後再遇到這種或其它錯誤時,可以先查詢一下 FAQ。
另外,通常我們利用 SSHFS 連線後使用的遠端目錄,UID 不太可能和本機一樣。此時請使用 idmap=user 選項 (以 -o 指定)。
配合上面的 workaround,我現在連到某台電腦上的 sshfs 指令變成:
$ sshfs username@host: mount/point -o idmap=user,workaround=rename
sshfs(1) 對這些選項都有很詳細的說明。
VI Improved (vim) 有個很方便很好用的功能叫作 modeline。在檔案裡面,可以用該檔案標準的註解形式向 vim 下指令。譬如一個 reStructuredText 格式的文字檔,你可以加上以下的 modeline,讓 vim 在讀它的時候自動把檔案解釋為 rst (以取得正確的語法高亮):
某些文字。
.. vim: set ft=rst:
modeline 裡可以放的指令不限一個,所以我大部分的 .py 檔案在檔尾都有這麼一行的 modeline:
# vim: set ai et nu sw=4 ts=4 tw=79:
我喜歡這樣格式化過的 .py 檔案。
只有自己會看的檔案這麼作當然沒什麼問題,但如果有別人會看的話,這位別人用的又也是 vim,我們設的 modeline 或許會有點擾人。不過,vim 這麼強大的軟體,難道不能設定為根據檔案型態決定統一的設定嗎?當然可以,只是我一直懶得把這個功能找出來...
vim 可以針對指定的條件,在軟體發生指定事件的時候執行指令。這個功能叫作 autocmd。假設我希望在開啟每一個 .py 檔的時候都執行上面 modeline 的那些指令,可以設定一個以下的 autocmd (寫在你的 .vimrc 或 Windows 下的 _vimrc 裡):
au BufRead *.py set ai et nu sw=4 ts=4 tw=79
如果我們寫的程式要給別人看,希望留給別人的 vim 一點設定的空間,可以使用 autocmd 取代 modeline。
Posted by yungyuc
at
15:39,
0 comment,
0 trackback.
寫網頁程式時,要輸出到網頁上的資料常常會帶有 HTML 標籤,譬如 <html>blahblah</html>,或者資料內容「像」HTML 標籤,例如 <亂講>一通</亂講>。在 Django template 中,提供了一個 filter 來把字串裡的 HTML 標籤相關字碼轉成 HTML entity。這個 filter 就是 escape。相關說明見 Django 文件。
用法很簡單:
<span class="message">{{ message.message|escape }}</span>
如果我們沒有在 message.message 後面加上 escape filter,那麼萬一 message.message 這個字串裡放了 < 或 > 一類的字元,就會弄亂 HTML 排版。更有甚者,會造成 XSS vulnerability。
escape 是 Django template 處理字串資料輸出到網頁上簡單、好用而必要的 filter。我們會常常用到它。
Posted by yungyuc
at
22:48,
0 comment,
0 trackback.
美味的金平糖。
這是去年從京都帶回來的戰利品。最近可以碰網路的時間多了點,終於開始把以前照的照片上傳到網路相簿上了。金平糖火力展示便是在整理旅行照片時,順便找回來的附加物。
再去吃一點吧 :)
Posted by yungyuc
at
22:05,
0 comment,
0 trackback.
昨天又去了一次貓薄荷。
然後,看到了貓薄荷的「外面貓」小花和橘子。這橘子竟然也是三腳貓,和我們的大橘一樣!大橘是橘子喵兄弟 (相簿) 的大哥,生性沉穩親人,不過在對付非人的動物時相當狠毒。雖然缺了一隻左前腳、左耳和右前腳趾,但只加強了他老大的豪氣。不管是爬樹還是打架,大橘老大仍然是一把好手!
» continue reading
Thinker 在從 Dynamic 、 script 到 Python 中的
「 KISS; Keep It Simple and Stupid 」,何必將事情搞的很複雜,簡單點不是很好嗎?Template 只需要很簡單的資料置入的功能,何必弄來「能上天下海」的神力。
一言,深獲我心。Django template 強迫移除複雜程式邏輯的作法招致了許多反對的意見,但直到現在,Django 也沒有要改變的意思。ASP, PHP, CFM, PSP 這麼多種 server page,無論一開始多容易撰寫,後續的維護實在是令人頭痛;如果 template language 允許了多一點的可程式化邏輯語法,未來很容易就走進可怕的表現/邏輯混雜的混亂地獄。
那種程式碼很難看,要叫人看那種程式碼得付不少錢才成。
Python 字典是強大無比的概念。撰寫 Python 程式本質上就是建立字典、在字典裡查表的循環。呼叫函式用到字典、存取變數用到字典,最後,整理資料也是字典最好用。初學 Python 的時候只懂得把字典當作字串資料庫來使用,及至經驗累積多了,便慢慢把許多東西都放進字典裡去。一開始是變數,接下來是物件,後來連類別和模組都塞進了字典。偉哉。
合適地組合各種簡單的概念,便能構築強大的系統。
2007 年開始啦!雖然今天沒有發生特別的事,不過去年很特別:2006 年的第一天是主日,最後一天也是主日。這不是我發現的,昨天上教會的時候牧師說的;沒有仔細注意還真不會發現,而且,在我印象所及,也只有去年發生這個情形。
雖然今年到目前為止不怎麼特別,不過今年才開始幾個小時,誰會要求這時候就發生大事呢?新年開始,人都會有期許與計畫,如果本小站沒篇文章略表期待之情,將來回頭一看,哈,好像無情得很。
新年快樂!
Posted by yungyuc
at
10:20,
0 comment,
0 trackback.
Vim 7.0 on win32 的 reStructuredText syntax 檔,在 highlight inline markup 的時候不能接受 inline markup 裡只有單獨的字元,然後讓 highlight syntax 爛掉。
沒找到別人的解法,所以我拿 2004 年放出來的初版 rst.vim 裡的 syntax command 暫時對付一下,在 rst.vim 的 s:DefineInlineMarkup 函式最後面加上:
execute 'syn region rstInlineLiteral start="' . \
a:start . '" end="' . a:end . '"'
(大概是在第 118 行的地方,要加在 endfunction 之前)。如此一來,Vim 會用最 aggresive 的方式 matching syntax,inline markup 裡的單獨字元便不再弄壞 highlighting 了。
Posted by yungyuc
at
07:51,
0 comment,
0 trackback.
aNobii 是個新的線上書藏網站,外觀不錯,對中文親切。
不過,比豆瓣慢太多了,即使屏東大地震震斷了那麼多海底電纜,豆瓣還是快。aNobii 摸了兩下,還真讓人受不了,我回去用豆瓣吧。
補記一下,豆瓣的 ajax 效果愈作愈多,操作性又提昇了。
整理一下目前台灣關於 Python 的線上資源。比較偏重互動式的線上資源;因為 Python 可以涵蓋的範圍太廣了,所以散置的技術文件等並不在此文整理之列。必有疏漏之處,尚請各方大德不吝補遺。
希望線上的 Python 互動式資源愈來愈多。