Category: Programming

  • Use Backbone.Paginator to create pagination for table layout HTML

    我們教會人手非常不夠,也不見得有工程背景的人,所以很多東西都是簡單就好。 像是主日的錄音檔好了,我們的標準流程是用 Dreamweaver 修改表格,一個禮拜就會多上三個錄音檔,簡單算起來,一年就會有 156 個 entry 會放到頁面中。 例如說 長久下來之下,這個頁面就包含了 300 個 tr 標籤去顯示每個禮拜的影音檔。 剛好在 JSDC 結束之後,就決定想用 Backbone.js 來在前端用 JavaScript 動手腳,把 table 的每一個 tag 處理好當做 model,最後把 collection 做出來丟給 controller 跟 view。 中間也用了 Backbone.Paginator 幫忙做分頁,簡單的使用方式可以看一下他的範例 最後做出來就會像是 source code 放在 https://bitbucket.org/yhchan/ctfhc-media-pagination,其實東西並不難,只是一開始跟 JavaScript 不熟多花了很多時間而已。而且目前是用 JSONP 在後端把東西用 JSON 丟出來,其實應該可以在前端直接做掉的,但是我現在懶惰了… 比起這種方式,我可能還是希望有一天,我們能自己好好使用好的 CMS 去設計網站吧,2010 年想改用 Drupal,也因為人力的關係胎死腹中…

  • Using tox and jenkins to have python continuous integration environment

    在看幾個 github 上的專案,像是 celery 都會發現他們的 repo 有一個 tox.ini,剛好手邊有個小小的 python 專案,就順便看一下 tox 是什麼。 節錄 tox 官網的介紹。 Tox as is a generic virtualenv management and test command line tool you can use for: checking your package installs correctly with different Python versions and interpreters running your tests in each of the environments, configuring your test tool of […]

  • Behat – A BDD framework for PHP

    看到今年的 PHPConf 2012 in Taiwan 有 Behat,想到去年做的投影片

  • Filter is good

    Java PHP Python JavaScript 憑著直覺寫的,如果不能動的話再說 XD 這種寫法通常好讀又簡單,不過有些語言要寫的囉嗦一點…

  • 用 Microsoft Translator API 翻譯 properties 檔案

    因為另外一套要錢,所以來用 Microsoft Translator API 隨手寫寫,一年沒寫文章,也許有點刻意,差不多該是改變的時候了。

  • 以 boost type traits 在 compile time 檢查 function 的 prototype

    在使用 Google C++ Mocking Framework 的時候很可能遇到一個情況,當原本的 virtual function 的 prototype 改變的時候,你所 mocking 的 prototype 很可能不是預期會被呼叫的那個。

  • Use VERSIONER_PYTHON_PREFER_32_BIT=yes in Snow Leopard

    In python, you can use ctype (dl is deprecated now) to load dynamic link library. In 10.4 and 10.5 it may work fine, but it may occur errors in 10.6, such as /Library/Frameworks/dummy.framework/dummy: no matching architecture in universal wrapper Since the python in Snow Leopard is 64-bit in default, for those libraries which does not […]

  • Using minimock for Python unit testing

    我也忘了什麼時候開始習慣作 unit testing 了,可能是前一個專案在 Xcode 上就開始學著寫一點測試了。 這次在閱讀 Writing Testable Code 對於 6. Static methods: (or living in a procedural world),格外有感覺。 尤其是修改別人的程式碼的時候,如果他總是直接呼叫 static method,不讓你用 mock object 把 implementation 換掉的話,這樣在測試起來就顯得麻煩的多。舉例來說,有一個 class method 會呼叫 SSHHelper.execute_ssh 這個指令去遠端執行一些東西,但這對 unit testing 而言就是一種外部的 dependency,你絕對不希望他真的在測試的時候跑出個 ssh 真的連過去執行些什麼吧。 剛好這次用 MiniMock 作我們的 mock library,因為他的因素,你就可以這樣作 如此一來,execute_ssh 這個 method 的結果就可以簡單的換成你預期的 ssh_output。 如果是本來就有比較好的設計的話,你也可以用 minimock.Mock (注意大小寫),去產生一個 mock object 出來。 […]

  • 一個 boost::exception 的例子

    因為覺得 dprintf 出現的次數實在太多了,我會希望在 exception 就可以包好 __FILE__ 跟 __LINE__,又可以把 std::wstring 包在 exception 一起丟出去,在 catch 的時候再印出來就好。 所以試著寫了這樣一個例子,結果寫的四不像,跟原本想的東西完全部不同了,而且我對於那個 BUFSIZ 相當不滿啊。其實原本希望可以用 ##__VA_ARGS__ 這種 macro 直接吃進來變成一個 boost::any[],然後再想辦法轉成 boost::format 可以用的格式,中間還可以透過 BOOST_FOREACH 來玩的,不過我徹底失敗了,所以最後的成果大家笑笑就好了。

  • 從 inet_ntoa 看 thread safe 的 API

    這周 refactor 一段 code 之後,被同事說:「為什麼 log 的來源 IP 跟目的地 IP 總是一樣呢?」 後來仔細想了一下 inet_ntoa 的 prototype,我就明白了!如果這個 function 不必特意去 free 回傳的 pointer,那可能在內部有一個 static buffer 去保存這個值。果不期然,FreeBSD 的原始碼是這樣實作的 到這邊我們大概就知道,inet_ntoa 並不是一個 thread safe 的 function,你可以用下面這段程式測一下會發生什麼事情。 輸出大概會像 127.0.0.2 => 127.0.0.1 127.0.0.1 => 127.0.0.2 127.0.0.1 => [inet_ntoa error] 127.0.0.2 => 127.0.0.2 所以,直接使用 inet_ntoa 在 reentrant 上可能會發生問題,如果你必須面對這些問題,最好的方式就是使用 inet_ntoa_r 這個 reentrant 的版本,或者直接使用 inet_ntop。 而這難道非得要踩到地雷,或者從 […]