電影流水帳(2008/03/29~2008/04/05)

一部片子不錯,另一部片子則不怎麼樣,這就是所謂的“一則以喜,一則以憂”嗎?

  • Aliens vs. Predator: Requiem(IMDB, Wikipedia),中譯:異形戰場2-適者生存。嗯嗯,老實說,我覺得這部片子特效是還可以,但是實在是不太值得進電影院去看,第一集還比較好看呢~
  • Ratatouille(IMDB, Wikipedia),中譯:料理鼠王。我覺得跟超人特攻隊一樣,都是給大人看的卡通,劇情不用多說了,網路上應該都可以找到。最後美食家所寫的那篇評論,相當感人,值得一看的卡通。

亂碼 1/2

此亂碼非彼亂馬啊~
家裏 Server 的 Mono 升級到 1.9 以後,ASP.Net 網頁裡的中文突然都變成了亂碼,可是我什麼都沒改啊~
由於個人因素 (就是懶啦),一直都沒去管,今天看開了,決定找出真兇…
首先試著直接跑 xsp2 之後,用 Browser 去看結果,正常,沒有亂碼。很好,那麼應該是 mod_mono 跟 Apache 的問題囉~
再看看有亂碼的網頁,看看送出來的網頁與 Response header 是否正確,送出來網頁的中文都變成了 ?,可是從資料庫撈出來的字卻又都沒問題,可以正常顯示,網頁的 Response header 也沒問題。很好,那真的是 mod_mono 與 Apache 的問題了。
仔細看了 mod_mono 的設定,唯一我覺得有問題的,就是 MonoSetEnv,可是我確實地已經設定了 MonoSetEnv “LANG=en_US.UTF-8″,應該不會有問題才對。
好,那麼就寫個簡單的網頁把所有環境變數列出來看看,果不其然,LANG = C,這表示LANG並沒有被設定,那麼會出現亂碼也是很正常的了。LANG 對 Linux 來說,是很重要的環境變數,沒有這個,很多應用程式將無法判斷目前所在的語系與編碼。
那麼是 mod_mono 問題囉?可是看過 source code 之後,發現沒有特別針對 MonoSetEnv 做什麼修正,再回頭看看列出來的環境變數,我發現我在設定檔裡面設定的 TEMP 環境變數有生效,那麼?!
再仔細看一次 mod_mono 的說明,原來如果你要設定多個環境變數時,要加上 ‘;’,所以在我改寫為 MonoSetEnv “LANG=en_US.UTF-8;TEMP=/var/tmp”,重新啟動之後,問題就解決了。
p.s. 那…為啥以前沒錯?! 我想可能是 Apache 的 apr 行為有改變吧~

以 public key 進行 SSH 登入

首先,謝謝你!HowToForge
環境:以下都是從電腦 A 要登入到 Server B (Linux)
步驟:

  1. 先為電腦A產生Private/Public key
  2. 把產生好的 Public key (用 ssh-keygen 的話,通常是 id_dsa.pub﹔用 puttygen.exe 的話,它就在上面的方塊裡。)附加到 Server B 登入帳號的 .ssh 目錄下的 authorized_keys2 裡面,如果沒有 authorized_keys 就自己建一個!舉例來說,如果你帳號是 xyz,那麼就是 $HOME/.ssh/authorized_keys 。
  3. 收工。

參考資料:How To Set Up SSH With Public-Key Authentication On Debian Etch | HowtoForge – Linux Howtos and Tutorials

電影流水帳(2008/03/22~2008/03/28)

這次看的兩部片子,故事講的都是見不得人的故事…一個是特務,一個是殺手…

電影流水帳(2008/03/14~2008/03/21)

都是趁中午吃飯的時候看的~

  • Rambo(IMDB, Wikipedia),中譯:第一滴血4-出生入死。很簡單的故事,沒有做什麼特別的說明,導演盡可能地把真實呈現,讓觀眾自己去省思。戰爭永遠殘酷,對弱勢的人殘酷…
  • Sweeney Todd: The Demon Barber of Fleet Street(IMDB, Wikipedia),中譯:瘋狂理髮師。基本上這種音樂劇都很對我胃口啦~看過一些介紹,這部片子的確也是由音樂劇改編成電影的。整部片子都很陰暗、血腥,理髮師雖然最後報了仇,卻也因為Mrs. Lovett的私心,意外殺害了他以為已經不在人世的愛妻,之後被Toby殺害,以悲劇告終。裡面出現的角色都是不二人選,很難想到有哪些可以被替代。
  • The Truman Show(Wikipedia),中譯:楚門的世界。昨天在HBO看到的,其實之前也或多或少看了一些,昨天正好把前面給補上,整個算起來也有七七八八。對這個故事印象深刻的原因,是因為我在小學的時候,真的曾經就有這種想法,認為我活著的周遭是被捏造出來的,所以我曾有一段時間很認真地在想,如果道路是有限的,該怎麼去創造出無限延長的感覺,場景該要怎麼迅速地搭出來。後來長大了,走的地方多了,才發現並不是這樣子,不過換個方向來想,其實也是這樣子,只是這個世界是由造物主(或是叫上帝、神、佛祖,隨便)所創造出來的場景,之後的劇情是由自己決定,而不是由導演決定。

Banshee hack

從 src/Core/Banshee/Services/Banshee.Database/BansheeDbFormatMigrator.cs 的InitializeFreshDatabase()裡面可以看到 Banshee 建立了這些 table:

  • CoreConfiguration
  • CoreTracks
  • CoreArtists
  • CoreAlbums
  • CorePlaylists
  • CorePlaylistEntries
  • CoreSmartPlaylists
  • CoreSmartPlaylistEntries
  • CoreRemovedTracks
  • CoreTracksCache
  • CoreCache

並且針對各個 Table 建立了必要的 Index (好吧,我的疑慮解除了,其實 Banshee 有幫建檔的音樂作索引,那還要繼續看下去嗎?)
BansheeDbFormatMigrator.cs 裡面還可以看到以 Migrate_ 開頭的函式前面有 [DatabaseVersion] 這個 Attribute,這些函式是用來作 Migrate(升級)的函式,Banshee 會先檢查 CoreConfiguration table 的 DatabaseVersion 欄位,看目前 Database 是什麼版本,然後再決定要怎麼去作升級(這部份可以參考 Migrate(), InnerMigrate())。
存取資料庫的部份被包在 src/Core/Banshee.Services/Banshee.Collection.Database下的各個以 AlbumInfo 結尾的檔案裡面,裡面都大同小異,provider 成員為主要的提供者,這裡會傳入 ServiceManager.DbConnection 讓 BansheeModelProvider 的 instance 能根據此 connection 去存取資料庫。
所有的 connection 都是由 ServiceManager.DbConnection (src/Core/Banshee.Services/Banshee.ServiceStack/ServiceManager.cs) 而來,而 DbConnection 其實只是一個服務 (src/Core/Banshee.Services/Banshee.Database/BansheeDbConnection.cs),在 ServiceManager 被初始化(static ServiceManager())的時候被註冊進去。
BansheeDbConnection 繼承自 HyenaSqliteConnection (src/Libraries/Hyena/Hyena.Data.Sqlite/HyenaSqliteConnection.cs),從 HyenaSqliteConnection.cs 看起來似乎是為了要把存取資料庫這整個部份獨立為 Thread 以提昇 UI 效率,所以才另外作 Hyena.Data.Sqlite。
不過最終底層還是 Sqlite 3
Banshee 的 Main() 在 Client 類別 (src/Client/Nereid/Nereid/Client.cs),Client 繼承自 GtkBaseClient (src/Core/Banshee.ThickClient/Banshee.Gui/GtkBaseClient.cs),扣掉註解不到 30 行…
補充1:HACKING Guide
補充2:我看的 code 是目前最新的版本,後來看過 0.13 的資料庫,發現的確沒有建 Index。

我的第一個 Greasemonkey user script – ClickNextPage

為了看線上漫畫方便而寫的,本來是要滑鼠按上一頁、下一頁,現在只要按下’x’或’c’就可以到上一頁或下一頁,目前只能使用於九啦啦動漫
原理不難,就只是請 Greasemonkey 在頁面載入時,幫忙掛上寫好的 userscript,而這個 userscript 也只是去處理 keyup 事件而已。
從看Dive Into Greasemonkey入門到完成,大概花了一個小時多一點的時間,應該算慢的吧~
我估計如果對 Javascript DOM 熟的人,應該可以比我更快寫好,我對 Javascript DOM 並不是那麼熟悉,而且,我已經被 jQuery 給馴化了…唉~沒辦法,jQuery 實在是好用又好查啊~
完成的作品在這裡,如果你有裝Greasemonkey的話,點選連結以後,就會有對話框問你是否要安裝了~

VisualSVN Server

想到可以來介紹一下這個:VisualSVN Server
讓我想想~記得應該是去年年底的時候,不知在哪兒逛到的~
原本以為會不會跟VisualSVN一樣,是個商業化的產品,後來看過以後,才知道並不是。
言歸正傳,VisualSVN Server骨子裡其實就是Apache HTTP Server+Subversion,另外再加上VisualSVN製作的一個簡單管理介面。
如果你覺得自己手動安裝 Apache HTTP Server+Subversion很麻煩而你剛好又不想用 Linux 的話,不妨試試看這個,我自己試過了,如果你沒有要綁什麼特別的認證機制(如 SSPI)的話,這個軟體可說是相當地方便。
p.s. VisualSVN是一個給 Visual Studio 用的 plugin,讓 Visual Studio 也能直接以Subversion來作代碼管理。

gnome-settings-daemon 無法啟動

由於很勇敢地衝了Ubuntu Hardy 的緣故,常常會有很多驚喜~
這幾天是遇到 gnome-settings-daemon 無法啟動的問題,開啟終端機試著以手動方式啟動會出現如下訊息:

The program 'gnome-settings-daemon' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadRequest (invalid request code or no such operation)'.
(Details: serial 107 error_code 1 request_code 151 minor_code 6)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)

爬文以後,發現已經有人回報,從 2.21.9 以後就是如此,但是都還沒有解。
依照訊息的建議,改以如下指令再試試:

gnome-settings-daemon --debug --no-daemon --sync

這樣會丟出比較多的錯誤訊息,這邊只列出關鍵部份:

** (gnome-settings-daemon:20265): DEBUG: Registering GsdXrandrPlugin
** (gnome-settings-daemon:20265): DEBUG: Creating object of type GsdXrandrPlugin
** (gnome-settings-daemon:20265): DEBUG: GsdXrandrPlugin initializing
** (gnome-settings-daemon:20265): DEBUG: Activating xrandr plugin
** (gnome-settings-daemon:20265): DEBUG: Starting xrandr manager
The program 'gnome-settings-daemon' received an X Window System error.
This probably reflects a bug in the program.
The error was 'BadRequest (invalid request code or no such operation)'.
(Details: serial 107 error_code 1 request_code 151 minor_code 6)
(Note to programmers: normally, X errors are reported asynchronously;
that is, you will receive the error a while after causing it.
To debug your program, run it with the --sync command line
option to change this behavior. You can then get a meaningful
backtrace from your debugger if you break on the gdk_x_error() function.)

喔~這樣看來應該是是 xrandr 的關係~
xrandr 是用來動態切換螢幕用的,舉例來說,接投影機或是額外螢幕時,就會用到~
不過,我現在用不到,那麼,要怎麼停用這個 plugin 呢?
這就得用 gconf-editor 了,使用 gconf-editor 去把 /apps/gnome_settings_daemon/plugins/xrandr/active 機碼改為 0,然後重新啟動 XServer 即可。