最近許多 blog 都裝了 Snap.com 的 Snap Preview Anywhere™。效果雖然很炫,但超大的 pop-up preview window,常常擋住我閱讀的視線,並對一些操作,如取 link url,造成影響。所以我決定自力救濟,擋掉 Snap Preview Anywhere™,讓這些不請自來,影響閱讀的大 pop-up 失去效用。
作法其實很簡單,用 AdBlock 或 AdBlock Plus 擋掉該 javascript 的 URL 即可。加一條 rule 如下:
http://spa.snap.com/snap_preview_anywhere.js?*
測了幾個有使用的網站,網站的其他功能,一切正常,只有不再 pop-up 惱人的 preview 視窗而已。
2006-12-21 補充:
Angus 的這篇《令 Snap Preview 在點擊時才出現預覽》,介紹了一個方法,讓使用 Snap Preview Anywhere™ 的 blogger,可以保留 Snap Preview Anywhere™ 的特效,又不至於太惱人。
最近在設計某 library 的 API,所以就想順便來講講怎麼設計符合 generic-text-mapping 的 library。簡單講,generic-text-mapping 是一種利用 preprocessor 的技巧,用一個 define symbol 決定 application 程式裡用的 character,是指 char 亦或是 wchar_t。若是後者,就是我們常在說的 unicode 程式。
個人覺得 generic-text-mapping 實在是 Microsoft 當年偷懶後的結果。在那個年代,這個技術確實是讓眾多既存程式快速升級成 unicode 程式的好方法,但在 unicode 支援已經普遍成熟的現在,卻反而形成了脫褲子放屁的尷尬[1]。
言歸正傳。尷尬歸尷尬,畢竟我們寫的 library,還是不免需要在 Windows 上執行,讓其他 windows developer 使用,因此入境隨俗,從「惡」如流,還是必須的。如何呼叫使用了 generic-text-mapping 技術的 library,已經有太多文章闡述了[2],因此以下簡述如何寫作 generic-text-mapping 的 library 供他人使用。
同時提供兩個版本,最後才用 macro 選擇
以下的範例程式,採用並擴充 Microsoft 的 convention,後綴字(postfix)為 W 時,表示是 wchar_t 的版本;後綴字為 A 時,表示是 ANSI[3],即 char [...]
首先先介紹一下 Subversion 是什麼 (節錄自《Subversion Book 中譯版》):
Subversion 是一個自由/開放源碼的版本控制系統,也就是說 Subversion 管理著隨時間改變的檔案。這些檔案放置在一個中央檔案庫 (repository) 中。這個檔案庫很像一個尋常的檔案伺服器,不過它會記住每一次檔案的變動。這樣你就可以把檔案回復到舊的版本,或是瀏覽檔案的變動歷程。許多人會把版本控制系統想像成某種「時光機器」。
某些版本控制系統也是 Software Configuration Management (SCM) 系統。這些系統是特別設計來管理大量程式碼的,而且具有許多功能,專門用在軟體發展之用:像是可完全了解程式語言,或是提供編譯軟體的工作。不過 Subversion 並不是這樣的系統;它是一個泛用系統,可用來管理任何類型的檔案,其中包括了程式源碼。
一般我們會簡稱 Subversion 為 SVN,簡單講,如果您用過 CVS 或 Visual SourceSafe 的話,SVN 就是那樣的一個東西,而且功能更為強大,設計更為合理,使用更為簡便。就我個人的看法是,SVN 再搭配另外幾個 open source 的軟體,其功能就可以比得上百萬等級的 SCM 軟體;當然,前提是我們有時間搞懂它。
所以,為了節省大家的時間,也為了節省我自己的時間[1],以下整理 SVN 的相關資源。
Subversion 與相關工具之官方網站
Subversion 官方網站:http://subversion.tigris.org/
官方網站 hosting 在由 CollabNet 架設的 tigris.org,CollabNet 提供了 Karl Fogel 全職的工作,專職發展 CVS 的替代程式:Subversion。
Subversion Book (英):http://svnbook.red-bean.com/
最新、最完整、最標準的 Subversion 參考文件。
Subversion Book (中):http://svn.stu.edu.tw/svnbook/
由 Plasma [...]
Eclipse 已經是個非常成功的 open source 軟體開發平台,其涵蓋的範圍,不僅包括了 Java development,亦在 embedded development[1] 開花結果,成為許多 platform 的預設開發環境。作為一個完整的開發平台,在這樣子的成功之下,隨之而來的,便是 team development 的需求,尤其是與最近鋒頭最健的 Subversion 整合,更是擁有超過 100 votes,名列 top 5 的 feature request。因此,SVN Team Provider 這個 project,便出現了,目前處於 proposal / gathering community 的階段。
在以往,我們若要在 Eclipse 裡使用 Subversion,通常需要安裝 Subclipse 這個 plug-in。Subclipse 解決了在 Eclipse 連結 Subversion native libraries 的技術問題,不過,其與 Eclipse 的整合程度,只能算是初級,人心總是不足的,總是希冀能有更強大、更徹底的整合。因此,SoftLanding Systems、CollabNet[2]、TMate[3] 以及其他重量人士如 Karl Fogel 等,並結合與 team development [...]
為了繼續寫某一篇自去年年中[1]開始寫,到現在還沒完工的文章,不得已,只好把其中一部分岔開來,另外開了這篇,以免太複雜。那篇文章之所以會拖這麼久,當然是因為斷斷續續地寫,以及其中的技術我尚未完全掌握的緣故啦。
言歸正傳,C++ 的 <functional> 的概念很好用,可是標準裡有提供的功能,實在是太少了,所以常常會發生,要兜卻兜不出來,只好退回去全部用迴圈重寫。碰到這樣的情形,又無法拋棄 C++ 的偏執的話,頗令人沮喪。所以有機會的話,最好還是自己把缺的東西刻一刻,累積下來,希望總有一天能夠快快樂樂用 C++,無憂無慮沒煩惱。
這裡介紹的 functor,正是最近為了那篇還沒寫完的文章而刻的一個 functor。設這個 functor 叫做 g,g 要做的事情很簡單,就是把要傳給另外一個 functor f 的兩個參數先對調之後,再傳給 f。也就是說,本來是 f(lhs, rhs) 這樣子呼叫,透過 g,變成 f(rhs, lhs) 的呼叫方式。
概念很簡單,所以實做起來也很簡單,其實作與 helper function 如下:
template <class Op>class param_reverser : public binary_function<typename Op::second_argument_type, [...]
敝小站的 trackback 爛很久了,趁著今天放假有空[1],追了一下程式,發現原來是啟用「Did You Pass Math?」時安裝的 Did you pass math 這個 plug-in 的問題。
簡單講,這個問題出在於,Did you pass math 乃是註冊 comment_post 這個 action,以進行驗證數學的答案的工作。但 trackback/pingback 時,也都會進行 comment_post,因此就被 Did you pass math 擋了下來,讓 trackback/pingback 失敗。
事實上,每一種 spam checking 的 plug-in,應該都會碰到這個問題。解法很簡單,就是偵測是否此次 comment_post 是否為 trackback/pingback,如果是,就直接通過,否則就進行數學答案的驗證。
但是要怎麼偵測此次 comment_post 是否為 trackback/pingback 呢?我不是 wordpress 達人,所以只好偷看一下 Captcha! 的程式碼,原來關鍵在於,也註冊 pingback_post 與 trackback_post 這兩個 actions,於處理此兩個 actions 時記錄於 $this->is_trackback,然後在處理 comment_post 時,若是 [...]
最近對 JeffHung.Blog 動了一些手術,裝了在《今日連結 (2006-09-20)》時看到的 Sandbox 的這套 theme,並予以改造,準備將外觀改回原來的樣子。Sandbox 是一個 semantic-rich 的 wordpress theme,其設計極端注重語意的保留,是一個很好的,設計自己的佈景主題的起點。
對於 blog 的佈景主題,之前換成 beeblebrox 布景時,我就已經有了基本的想法,最主要的就是要能夠讓我得以清晰的擺放程式碼在文章裡。這當然是因為,實在是文筆不好,只好多填些程式碼充數的關係。再又經過一段時間的觀察與沈澱之後,想法多了一些,以下簡單條列於下,算是再次整理:
在版面配置上,如果有邊欄 (side-bar, side-panel, ... what ever) 的話,必須要放在左邊。這是因為程式碼以及我會使用到的語言,方向都是由左至右的 (left-to-right),而程式碼有時候又有「不可換行」的特性,當有這樣子的狀況發生時,版面就會被撐大,若邊欄放在右邊,在「由左至右」以及「不可換行」兩個因素的限制之下,邊欄就會對本文的閱讀造成影響。
在版面配置上,本文區塊應當要是 fluid,也就是會隨著瀏覽器的大小而變動。理由正是由於上述程式碼有「不可換行」的特性之故。當版面被撐大時,fluid 的版面配置,就不會讓版面受到破壞。
本文字體大小必須是瀏覽器預設的大小,這是預設閱讀起來最舒適的字體大小。Gslin 在這篇《字形的問題》有聊到相關的考量。以前小時候,總喜歡在一個頁面裡,塞下越多的資訊越好。但現在老了,眼力不行了,所以字還是大一點,看起來比較舒適。
非本文的內容,在樣式上,應該盡可能地不喧賓奪主。這可以用較小的字體,或較淺的前景色來達成。尤其是在邊欄放在左邊的情形下,邊欄的內容更是容易讓使用者分心,因此適度的淡化處理,是必須的。
邊欄存在的目的,應該只是提醒使用者,「還有這些東西可以看」,而不是直接把內容呈現給使用者,內含真正內容的邊欄,只會使使用者分心。因此,放在邊欄的 recent-comments 與 recent-trackbacks 等,應該要只放連結與標題就好,毋需列出部份內容。
內頁的 HTML <title> 必須包含文章標題,考量到 tab browsing 時,tab width 通常不寬,因此文章標題應該置於 blog 名稱之前,如:「Sandbox, look.urs, and blogging frequency [JeffHung.Blog]」。
Search form 應該擺在越上面越好。我通常會擺在 header 的右方。Searching 已經超越 surfing 成為現今主流的瀏覽方式,所以應該放在最立即所得,但又不影響主體的地方,就好像 firefox 的 search [...]
我有一堆 trac sites 的 links 要列表,之前是直接 <ul> 配 <li> 就給它列下去,可是後來 projects 一多,畫面就必須要捲動,很難用。所以需要尋找 CSS 機制,讓這些 projects 的 links 能夠像 ls 一樣,分欄顯示:
Listamatic - "one list, many options"
CSS3 module: Multi-column layout
Balance your CSS Columns with JavaScript
Do You Want To Do That With CSS? - Multiple Column Lists - 目前找到的最好解法,既簡單又有效。
CSS Tutorial - 比 w3schools 的 CSS tutorial 還要清楚明暸。
最後的寫法如下:
#thelist ul{ [...]
Subversion (SVN) 是一個集中式的版本控制系統,因此,其中一個主要的限制便是,在使用的時候,必須要連上網路,以便與其 server 連結。儘管在架構設計上,SVN 已經盡可能的減少網路頻寬的使用,但在正常運作上,仍然是有許多操作,是必須連結到 server 上進行的。
然而,實際上,在開發的過程當中,並不是能夠無時無刻的連結在網路上。最近我們就遇到了這樣子的一個需求,因應業務需要,我們需要有一組人,南下到客戶的工廠 on site,當場在工廠內改程式。由於環境的因素,在該處無法連結到 Internet,因此也就不可能連回位於公司內的 SVN server。因為程式複雜度的關係,這支遠在南部的特遣隊,有可能需要北部辦公室的支援,方能解決一些程式的問題,因此我們需要一套機制,讓在南部的同事,能夠與台北辦公室,進行程式碼的同步。換言之,我們需要一套機制,能夠 offline 使用 SVN。
也正是為了 offline 開發的需求,clkao 開發了 SVK 這套建基於 SVN 的工具,使開發者可以將 SVN repository 映射 (mirror) 在自己的電腦裡,離線進行開發、commit,事後在得以 online 時,再與主 SVN repository 進行同步。SVK 是套很棒的工具,然而卻還是沒有辦法滿足我們的需求。最主要的問題在於,SVK 是設計給單人使用,而我們外派到南部的,是一整組人馬,且彼此之間,也有程式碼相互同步的需求。換句話說,實際上我們需要的,是要能夠複製一份 SVN repository,並能夠在特定的時候,與主 SVN repository 同步。這樣一來,複製出來的 SVN repository,就可以作為在南部的同事們之間,協同開發的基礎。
我們希望,透過這樣子的機制,能夠在南下前,將主 repository 予以 split 出一個複本,帶到南部去工作。白天時,南下的組員們,彼此之間就使用南部的 repository 同步工作。等到晚上回到宿舍,能夠上網時,再透過 SSH tunnel,將南部的 repository,與北部的主 repository,予以 synchronize:將北部新修改的程式,送進南部的 repository 裡;亦將南部新修改的程式,送進北部的 [...]
多年以前,Microsoft 幹了一件比 #define N 3 還要蠢的蠢事,那就是在 <windows.h> 放入了 min/max 這兩個 macros。因此,我們沒辦法好好地使用 C++ Standard 的 min/max 這兩個 algorithms,也沒有辦法好好地使用 numeric_limits<>。前者 Microsoft 用了另外兩個 macros,_MIN 與 _MAX 來補救,但考量到跨平台程式設計,這兩個 macros 有跟沒有一樣。後者就真的很傷腦筋了,很多時候,numeric_limits<> 的使用是無法避免的[1],但當直接或間接 #include 進 <windows.h> 的時候,VC6 就會出現 C4003 warning 然後後面的程式就爛掉了。
通常來說,碰到這種相容性問題,先找看看 Boost 怎麼作就對了[2]。於是我在 boost/config/suffix.hpp 裡,發現了 BOOST_PREVENT_MACRO_SUBSTITUTION 這一個 macro,被安插在可能被 VC6 搞爛的 min/max 後面,括弧前面。其用法如下:
std::max BOOST_PREVENT_MACRO_SUBSTITUTION(value1, value2);
// or
std::numeric_limits<Foo>::max BOOST_PREVENT_MACRO_SUBSTITUTION();
實際上,BOOST_PREVENT_MACRO_SUBSTITUTION 是空的,會被代換成沒有任何東西,其目的應該是為了騙過 preprocessor,使其認為 min/max 不是 VC6 [...]