foxyproxy 自動組態指令碼的小問題

因為有在用 foxyproxy 的關係,昨天遇到一個問題,就是 foxyproxy 突然無法解析 pac 檔案了。Log 裡面有這樣的訊息:

TypeError: invalid ‘in’ operand this._sandBox

我試了好久,也找了好久,最後找到官方這篇討論串:PAC support,討論串裡面,作者很熱心想要解決,可是在他那邊複製不出這個問題,所以後面他就乾脆說,有遇到問題的,可以寫信跟他要測試版的 foxyproxy 試試看~
我實在是懶得寫信去要,所以就繼續試,結果無意中被我試出一個 workaround,於是趕緊貼上討論串給其他人參考。
今天去看的時候,發現有人說我的 workaround 有效~蠻令人高興的。
我的 workaround 就是,先把 foxyproxy 關閉,接著重新去把你的樣式設定為”使用自動組態指令碼”,然後關閉。接著再切換你剛剛設置的樣式,就行了。
如果沒有先把 foxyproxy 關閉的話,在關閉的時候會出現錯誤訊息。

以 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

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來作代碼管理。

如何在指令列改變 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。

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...
    });
    

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