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 即可。

電影流水帳(2008/03/01~2008/03/13)

進度緩慢啊~快半個月才看 2.5 部電影…今年真的能突破 100 部嗎?

  • Beowulf(IMDB, Wikipedia),中譯:貝武夫-北海的詛咒。終於看到這部擬真人的電影,純就擬真效果來說,這部電影真的很棒。故事跟 2005 年真人演的那部又不一樣了,這也是必然的,所謂的偉大史詩故事,如果沒有文字相輔的話,通常流傳到後世時,肯定都會出現很多版本。這個版本是 Beowulf 其實沒殺掉女妖,而是與她結合,結果之後出來造反的惡龍,其實就是他的兒子~
  • 功夫灌籃(IMDB, Wikipedia),功夫灌籃。周董演的,故事很唬爛,也有小熱血,我個人覺得打發時間還可以,進電影院?別了吧~我倒是覺得”不能說的秘密”比較好看。
  • Behind Enemy Lines(Wikipedia),中譯:衝出封鎖線。我是在衛視西片台看到這部片子的,中間有一大段託我兒子的福,都沒看到…這片子還蠻好看的,最後Gene Hackman飾演的角色最後不幹了,酷!從Wikipedia上,知道還有Behind Enemy Lines II,不過台灣好像沒上片?

如何在指令列改變 Registry key 的權限

首先要謝謝你,Wikipedia 上的 Windows Registry 條目
裡面提到了微軟其實有釋出一個工具:SubInACL.exe
用這個,就可以改變某個 Key 的權限。
這一行就是讓自己可以得到 HKEY_LOCAL_MACHINE\software 這個 key的完全控制權:

subinacl /keyreg HKEY_LOCAL_MACHINE\software /grant=%USERNAME%=F

但是這邊要注意, /key 只針對該 key,在之下的 subkey,你仍然沒有完全控制權,如果你要得到 subkey 的完整控制權,你應該改用:

subinacl /subkeyreg HKEY_LOCAL_MACHINE\software /grant=%USERNAME%=F

p.s. 如果你需要刪除某個指定 key,可以參考這篇文章:Delete OE Identity from HKCU\Identities using WSH Script

空白

慢慢適應刺眼的強光之後,天花板是一片白,很白,以前就不是很喜歡白色了,此時更令人不能適應。
我試著想轉頭看看周圍,找一點其他的顏色,可是看來我的頭並不是很聽我的話啊~想轉也不能轉…
身體也好像不是自己的似的,一點也不聽話。
“只能困在這裡了?” 我的心裡突然冒出這句話來。
“怎麼來的呢?這句話。”我的心裡又冒出這個念頭…
我試著甩甩不能動的頭,想把這些念頭甩掉,畢竟找到為什麼自己被困在這裡的原因以及離開這裡才是當務之急。
於是我開始努力地回想,到底是什麼時候呢?
“是啊~到底是什麼時候呢?”我”聽到”一個溫柔的聲音這麼說著。
“聽到”?
真是可喜可賀,居然還能聽到,總算是還有另外一個可以運作的器官~
不過這都是不隨意肌的作用啊~
不隨意肌就是像心臟、腸胃之類,不受人主觀意識控制的肌肉,這些地方會自行運作,這也是上帝的好意,他怕人會忘記呼吸、心跳…
眼前並沒有任何”人”,那麼聲音是從哪兒來的呢?
“是啊~到底哪兒來的呢?”那個溫柔的聲音又說道…
X X X
“啊!!!!!”男人的怒吼劃破了夜的平靜~
“吵死了”
“搞什麼東西啊~三更半夜的”
鄰居的抱怨聲此起彼落地響起…
LCD 螢幕因為機器特性的關係,在完全黑暗的房間看起來閃閃動人。
剛剛鬼叫的男人就趴在螢幕前的鍵盤上,仔細聽,男人好像在說些什麼。
“那溫柔的聲音會是誰呢?又該是誰呢?”
“在床上不能動的男人該怎麼接話呢?”
“他之後又該如何呢?”
男人一直自顧自地說著,不理會鄰居的抱怨與抗議。
突然就像電燈啪答關掉一樣,鄰居的聲音突然就消失了~
窗外車水馬龍的聲音隨著時間的過去越來越小,夜也越來越深,彷彿要把這個男人淹沒似的~
“阿明,你還不睡啊~都已經半夜兩三點了~”,小惠睡眼惺忪地走進房間裡跟阿明說道。
阿明不說話,小惠只覺得奇怪,平常會回應她的男人怎麼不回應呢?
於是她走過去拍拍他,沒反應,於是小惠再推了一推,只見阿明動也不動地從椅子上跌了下來…
睡眼不再惺忪的小惠,慌了~
趕緊拿起桌上阿明的手機打 119 求救…
X X X
醫生走出急救室告訴小惠和阿明的父母:“他還活著,只是對外界反應沒有任何回應~可能以後都是這樣了~”
小惠和阿明的父母心裡倏地充滿無力感~

jquery.ingrid

最近使用了jquery.ingrid這個jQuery的插件,這裡分享幾點心得:

  • 官方文件提供的資訊極有限,所以原始碼沒事最好要看一下。
  • Client 端的 html 只要在 <table> 裡面放 <thead>, <thead>, <th> 即可,不需要放別的。另外最好用一個 <div> 包起來,這樣可以比較方便於作 requery,因為在呼叫 ingrid() 之後,DOM 會作必要的改變,因此原來你使用 selector 指定到的 element,可能就再也找不到了。使用 <div> 包起來的好處是,可以藉由 html() 重新指定 <div> 的內容。這樣就能再次使用 selector 找到要改變的 table。
  • Server 端需要處理 page, sort, dir 三個參數,這是由 Client 端的 ingrid() javascript 送出的,此外,如果 dataType 是 HTML (預設也是) 的話,只要輸出 <table>、<tbody>與<td>即可。如果你還需要指定其他的參數,可以藉由複寫 extraParams 來達到你的目的:
    var options={
    url: 'remote.html',
    extraParams: {param1: 'param1', param2: 'param2' }
    };
    $("#grid").ingrid( options );
    
  • 記得要指定 colWidths,有幾個 column,就要指定幾個,這是官方文件沒提及的部份。如果不指定,會很殘忍的給你錯誤。
    $("#grid").ingrid( {
    // other stuff...
    colWidths: [ 225,225,225,225 ],
    // other stuff...
    });
    

此外它還有排序、調整欄寬…等等的功能,整體來說,是個相當不錯的插件。

電影流水帳(2008/2/26~2008/2/29)

因為借了在某大公司作特助的同學XX元,他送我一套惡靈古堡1+2+3的DVD,共六片~這算是所謂的利息嗎?這筆錢預計4/5會回到我身邊。

  • Resident Evil: Extinction(IMDB, Wikipedia),中譯:惡靈古堡3-大滅絕。其實也不算是滅絕啦,只是描述T病毒蔓延全世界以後的事情,同時也交代第二集最後的伏筆。整個片子氣氛相當不錯,算是有維持到前作的一貫水準,但片長有點短,只有約 8x 分鐘左右。
  • 30 Days Of Night(IMDB,Wikipedia),中譯:惡夜30。這是描述吸血鬼趁著永夜襲擊某小鎮的故事,很血腥暴力的一部片子。導演並沒有很刻意去強調時間,我覺得可以利用這一點來營造更多的氣氛,而不是創造過多的血腥殺戮場面,這樣應該會使片子加更多分。故事裡面有些地方交代的不是很清楚,例如接近片尾時的小女孩以及其他吸血殭屍因頭頭掛掉而閃人的部份~看來如果要搞清楚,可能要去找漫畫來看了,是的,這是一部由漫畫改編的電影。