Month: January 2009

  • Discogs: 一個社群性的唱片資料庫

    不知道你有沒有這種經驗,買了一張 CD 回家,興高采烈的想要轉成 MP3 或是 FLAC,結果 freedb 壓根子找不到,最後還得到官方網站去把曲目資訊一個一個的重新 key 進來。其實這也不能責怪任何人,畢竟把唱片的曲目資訊整理進 freedb 本來就不是什麼理所當然的事情,這大概只得靠社群性中唱片擁有者的熱情才能做到。 我曾經跟幾個朋友說,為什麼 CD 市場中比較少像是 aNobii 般的社群網站呢?你可以給予評分、可以交換、也可以在資料庫中新增最新發行的 CD 資訊,在這個社群中每個人都可以是審核者(Moderator),能審核一張專輯資訊的正確性,也同時是貢獻者(Contributor),提供專輯的所有資訊,可能包括類別、製作人、發行日期、甚至每首歌曲的詞曲創作等。而這些資訊可以被應用在各種地方,像是數位音樂的標籤(Tag)上,以及專輯資料的數位化上。 而 Discogs 就是這樣的一個網站。最早留意到這個網站是在 Mp3tag 的使用上,他能夠從 Amazon.com 以及 Discogs 取得曲目資訊,並幫你 Tag 到音樂檔中。 以前來說,我總覺得 freedb 就已經夠好用了,但總有一些意外,例如 Sarah McLachlan 最新的專輯 Closer: The Best of Sarah McLachlan 似乎就會因為某些曲目的刪減(因為發行的地域性,日本專輯格外容易出現這種事情),造成 freedb 找不到專輯資訊。這點 Discogs 就顯得人性化許多,你可以搜尋一張專輯,然後視情況改變其對應關係。像是 就可以把最後三個 DVD 的資訊給移除掉,讓 Discogs 把前 13 首歌的資訊寫到對應的檔案上。 我覺得…

  • YousableTubeFix 給你高畫質的 youtube

    YousableTubeFix 是一個 Greasemonkey 的 script,他做的事情還蠻多的,除了能幫你下載 youtube 的影片之外,最好用的莫過於以下拉式選單讓你選擇 standard Low Quality FLV, MP4, High Quality FLV or High Quality MP4 這幾種格式,讓這個 HD 的世代能有比較好的影音體驗。 雖然你還是可以用老方法,手動去改 fmt 成 18 或者 22 看看,不過我還是喜歡用這個 script。而且你可以比較一下畫質上的差異,第一張是一般品質,第二張則是 High Quality MP4,我想應該高下立判吧! 不過 fmt=22 的狀況下,你的電腦也需要強力一點的 CPU 才放得動,以我現在這台 Pentium-M 1.3G + 512MB 的機器,實在很沒辦法阿….

  • 罰寫:我離開辦公室的時候,會記得登出 MSN

    今天下午才發現,有八個 msn 視窗…… 我下次會記得登出的(淚)

  • 圍巾與手套

    有同事說我寫的東西都太繞口了,那就寫一些不繞口的吧! 高中的時候,因為念的是男校,我們那群男生間總有一些奇怪的文化。其中一個就是,那些冬天圍圍巾的同學總是會被冠上 gay 的名號,像是 gay 熊、gay 猩……。所以在那段期間,我從來沒有想過要買圍巾,也沒有想過要買手套。 上了大學之後,我總覺得新竹的冬天尤其冷,但大部分的時候,我也只是狂喝熱水試著讓自己溫暖一點。 畢業回到台北之後,也許是視網膜效應吧,我總覺得圍巾在搭配上能加分不少。 而第一次圍上圍巾是上週六陳綺貞演唱會那天,我才覺得,第一次覺得原來把脖子圍起來是多麼幸福的事情。看著「嫌疑犯 X 的獻身」中的石神圍著圍巾,緊緊地將口鼻給包覆住,原來在這樣的冬夜裡,圍巾是能給予我們緊密而溫暖的重要物品。也許就因為外在是那樣的寒冷,那簡單的幸福就更顯得可貴了。再仔細想想,我那高中時代的堅持就顯得可笑而無關緊要了。

  • 初探 TR1 function object

    最近的專案常常需要更新 INI 設定檔,而最麻煩的事情莫過於太多零散的設定,你必須要記住 INI 檔設定的 key,再把在某個 object 的 member function 把值抓出來,最後再丟給 WritePrivateProfileString 之類的 function 把值更新進檔案。 所以常常就會寫出一堆噁心的 code 像是。 obj.iniKey = “INI_SERVER”; obj.iniValue = info.GetServer(); UpdateByObj(obj); 這樣的話,有幾個設定就要寫幾次,所有的 Key 跟 Value 的相關性都顯得零散,未來要加上新的設定,也非得要再加上類似的 code 才行……。 忽然我就靈機一動,也許可以用 tr1::function 跟 tr1::bind 來做這樣的事情。 struct proxyConfig { std::string iniKey; std::tr1::function<std::string()> func; }; const proxyConfig configArray [] = { { “INI_SERVER”, std::tr1::bind(&proxyInfo::GetServer, &info)…

  • C++ Format String using boost::format

    如果你只想寫純粹的 C,那你可以忽略這篇的資訊了,因為 sprintf 之類的 function 大概就可以滿足你了。那為什麼還要提到 C++?我想 C++ 的 string 對於程式設計者是美好的,因為我們不用擔心 buffer 到底需要多長,我們可能是無腦的利用 operator += 去操作這個字串,並利用提供的 substring 等 function 快速的開發軟體。 但在我甚少的 C++ 開發經驗中,我總覺得透過 operator += 以及 stringstream 等東西,並沒有辦法像 sprintf 那樣直覺而優雅的將變數置換至字串當中。 就以 Windows 常見的 INI 格式來說,我們如果要輸出一個 AppName,像是 [MyApp],可能的作法是 這似乎比傳統的 sprintf 要顯得複雜的多,也顯得不好閱讀…… 現在你可以考慮 boost::format 讓你寫的 C++ 能有 sprintf 的優雅性,又不必太過於擔心 buffer 的操作。 至於一些 manipulators,與詳細的 formatting 的用法,就請你自己去看一下官方的說明吧。此外,我覺得 python 的…