TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2011年11月15日 星期二

Setting host-only adapter on Linux host

在虛擬機器上我一直是 VirtualBox 的支持者, 儘管我並不賞識 Sun 或是 Oracle.
要讓 host OS 和 guest OS 可以透過網路互相溝通, 比較簡單的方式是使用 bridged adapter, 而用這種方式拿到的 guest IP 會跟 host IP 處在同一個網域. 也就是說和 host 處在同一個區網的其他機器都看得到這個 guest, 如果本來的用途就是要分享給區網使用, 那這就是最直接的方法.
但如果你只希望 guest OS 只被 host 看到, 那就得用點迂迴的方式, 那就是在 guest 使用兩個網路卡介面, 一個使用 NAT, 另一個使用 Host-only adapter.

2011年11月8日 星期二

QNetworkAccessManager can not determine file size from Pure-FTPd

If you are using QNetworkAccessManager to download files from a Pure-FTPd server, the file sizes are always -1. This is cause by Qt, Pure-FTPd, and the FTP RFC spec.

2011年10月1日 星期六

Threads in Qt

寫出好用的泛型程式碼需要天份, 寫出具有異常安全性的程式碼需要細心, 而要寫出完全多緒安全的程式碼, 你需要的是新鮮的肝.

2011年7月24日 星期日

Reuse existing KSnapshot on press PrintScreen

在 Debian 或 Kubuntu 的預設設定, 按下 PrintScreen 鍵會啟動 KSnapshot, 若再按下一次 PrintScreen, 則會再喚起一個 KSnapshot. 但這不是我想要的行為, 當我按下 PrintScreen 時就代表我想抓圖了, 不停地開啟新的 KSnapshot 有點蠢. 幸好 KSnapshot 有提供足夠的 D-Bus 介面, 這讓我們可以寫一個 script 操作已存在的 KSnapshot.

2011年6月23日 星期四

Download attachment file with JavaScript

AJAX 回應回來的內容會被 JavaScript 拿到, 而不是直接顯示在網頁上. 當你希望瀏覽器跳出下載對話框, 可以這麼做:
window.location.href = 'download.cgi';
是的, 根本不需要 AJAX.

Configure Django with Lighttpd on Debian/Ubuntu

網路上找到的資料都有點不完全, 最近在逃避現實的過程中找到了一個比較簡單的方式, 供有需要的人參考.

2011年5月27日 星期五

Khopper 0.4.2 is out!

v0.4.2:
  • 修正 Windows 平台開檔時會直接清空檔案的問題
  • 新增 Windows Installer 方便安裝
v0.4.1:
  • 修正 YouTube 抓取失敗的問題
  • 增加 Ubuntu Natty 的套件
v0.4.0:
  • 加入 FreeDB 支援
  • 加入 YouTube 支援
  • 加入多緒轉檔功能支援
  • 儘可能消除 Phonon 對不同格式的影響
  • Ubuntu 安裝使用 PPA 來源

2011年5月23日 星期一

JavaScript function binding: arguments only

既然 JavaScript 1.8.5 已經有 bind 可以用, 為什麼不用它呢? 因為它有一個小問題, 就是它非得 bind 一個 instance 給 this, 但很多時候你是不想動到原本 this 所指向的 instance, 比方說某些 library 會要求 event handler 的 this 必須要指向某個 DOM Element. 於是當你只想 bind arguments 時, 這個無法忽略的第一個參數實在很惱人, 我自己試過丟 undefined 或 null 進去, 但結果 this 都被 bind 到 window 上. 幸好這個要求在 JavaScript 並不難實作, 我就自己刻了一個.

2011年5月8日 星期日

2011年4月23日 星期六

Single Instance of Qt

某些時候你會希望你的程式在同一時間內只會被執行一次,這需要使用 IPC 的技巧實作:第一個被執行的實體先留下某個溝通的管道,第二個以後被執行的實體就去連結這個管道,並自行決定要留下哪個實體。

2011年4月9日 星期六

Lambda expression issue in VC10

class A {
public:
    A() {
        ( [&](){
            A::dummy; // VC10 compile error
        } )();
    }
private:
    static const int dummy = 0;
};
我也不知道怎麼解釋, 看起來是它搞混了實體存取和全域存取, 也就是說它不知道該不該自動補完成 this->A::dummy. 但如果使用 namespace 強制修飾成 ::A::dummy, 或是不使用 wildcard capture 就不會有問題.

2011年4月1日 星期五

Another Observer Pattern implementation in Java

由於實在不喜歡 Swing 的 listener 方式,因此我嘗試使用 Java 內建的 ObserverObservable 來套用 Observer Pattern,但它比我想像中地還不靈活,原因有三:
  1. 必須要呼叫 Observable.setChanged 才會讓 Observable.notifyObservers 生效,而 Observable.setChanged 是 protected,這意味著你至少必須繼承 Observable 類別,這對於不允許多重繼承的 Java 來說很要命,因為 host class 很有可能來自另一繼承體系。
  2. 你沒辦法透過 composition 繞過這個限制,因為 Observer.update 帶有一個型態為 Observable 的參數,語義上這個參數必須要是發出事件的物件,但若是使用 composition 持有 Observable 物件,Observer 收到的參數就會跟真正發出事件的物件無關,這會破壞這組範式的假設。
  3. 你有可能需要在同一個類別裡發送不同的事件,但使用繼承的做法你只能使用一種通知。如果要達到分派不同事件的目的,就必須要在那唯一的一個 Object 參數上作手腳。

2011年3月25日 星期五

Khopper 0.4 Release Candidate is out

重要改變:
  • 加入 FreeDB 支援
  • 加入 YouTube 支援
  • 加入多緒轉檔功能支援
  • 儘可能消除 Phonon 對不同格式的影響
  • Ubuntu 安裝使用 PPA 來源

2011年2月24日 星期四

Nested capturing in lambda expression

其實這是早已踩過的 bug, 單純留著當紀錄.
int i = 0;
( [&i]() {
    // capture once
    ++i;
    ( [&i]() {
        // capture twice
        ++i;
    } )();
} )();
std::cout << i << std::endl; // 2
來猜猜看上述程式用哪個 compiler 會出錯?

2011年2月2日 星期三

Lambda binding issue in VC10

VC10 的 lambda expression 的 bug 還真多 ... 這應該是我第三次踩到相關的 bug 了吧。
auto f( std::bind( []( int a, int b )->int {
    return a + b;
}, std::placeholders::_1, 2 ) );

f( 1 ); // returns 3

2011年1月23日 星期日

Use pyside-uic to compile ui files automatically

PySide 可以用 pyside-uic 來轉換 *.ui 到 python code,但每次都要手動弄這個真的很煩。所以我把所有的 ui 檔案集中放到一個資料夾內作為 package,並在 __init__.py 上動點手腳:

2011年1月9日 星期日

Embed external viewers into Firefox

# aptitude install mozplugger
Then Firefox will open your default external viewers with tabs, instead of external windows.