tag:blogger.com,1999:blog-104307550830505822024-02-19T15:24:26.861+08:00「 」へんじがない、ただのしかばねのようだAnonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.comBlogger356125tag:blogger.com,1999:blog-10430755083050582.post-38362362911997023072012-08-03T04:08:00.000+08:002012-08-03T04:08:42.074+08:00Garbage Collection (2)
上一篇提到了 reference counting 以及 weak reference,這篇我將以 C++11 的 smart pointer 為骨幹做介紹,但核心概念都是差不多的。
C++11 引入了一系列的 smart pointer,使用 RAII (Resource Acquisition Is Initialization) 手法來確保資源在生命週期結束後的回收行為。想法非常簡單:配置在 stack 上的變數,在離開 scope 後一定會呼叫 destructor,因此只要設計一系列的容器,讓它們在 destructor 裡做回收行為,就可以讓編譯器為我們回收資源。C++11 的 smart pointer 實際上不只是自動化的 new/delete 容器,因為其 allocator/deleter 可自訂,programmer 實際上可用它來管理任何種類的資源。
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-71828974776968581352012-08-02T09:17:00.000+08:002012-08-02T09:18:14.242+08:00CMake: grouping sources by directory
function(group_sources root)
function(__group_sources__ root prefix)
file(GLOB entries RELATIVE "${root}" "${root}/*")
foreach(entry ${entries})
set(abspath "${root}/${entry}")
if(IS_DIRECTORY "${abspath}")
__group_sources__("${abspath}" "${prefix}/${entry}")
else()
list(APPEND group "${abspath}")
endif()
endforeach()
string(REPLACE "/"Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-53386748627295556672012-07-15T21:41:00.000+08:002012-07-15T21:43:32.779+08:00Garbage Collection (1)
這篇只是介紹比較知名的方法,預計之後還會再發一兩篇討論 C++/Qt 的回收手法。
Reference Counting
C/C++ 裡最常被使用的方式,也有部分 GC 演算法會混合 reference counting。其原理是每個物件都有一個計數器,記錄目前有多少其他物件指向它。第一次建立時計數器是 1,每次複製時計數器加 1,每少一個物件指向它就減 1,如果計數器降到 0 就代表此物件不需要存在,這時它會被刪除。圖解如下:
但 reference counting 有一個重大的缺點,就是在有 cyclic reference 的狀況下,它無法回收物件。圖例:
變數 c 若因為某些原因而需要持有 b(比方說要保存 parent-child 關係),就形成了 cyclic reference,此時就算變數 a 不再指向它們,但因為計數器不會歸零,它們永遠無法被回收Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-43406237371687067972012-07-15T01:11:00.001+08:002012-07-15T01:11:18.195+08:00電話 (2)
我發現我真的有溝通障礙 ...
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-55902118815641129072012-07-13T01:24:00.000+08:002012-07-13T01:24:36.721+08:00電話 (1)
精確的說法是:「在接起電話前你在做什麼」。好啦我自已也知道這很蠢,但還是會不自覺地要求字面上的精確。
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-91100509540540001612012-05-14T18:14:00.000+08:002012-05-14T21:22:30.279+08:00QSnapshot 0.1.1 released
GitHub page
其實我一直覺得這頁面很醜 ... 不過我真的不知道怎麼改.
本次修正包含了數項 bug 及 UI 改善.
Debian 有套件包可用, Ubuntu 提供 PPA.
在抓圖時立即隱藏主視窗, 避免留下殘像
存檔時使用系統的圖片資料夾, 而非 QSnapshot 所在的資料夾
存檔時自動命名檔名
Windows 下擷取區域模式的熱鍵現在可以正常使用
在 X11 下可以正常使用 shape extension
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-17754140182092679072012-05-12T18:17:00.000+08:002012-05-14T18:16:01.598+08:00How to debug a program which grabs X11 input events
最近在做的抓圖程式, 因為要在非 focus 狀態也能接收到抓圖要求, 必須取得所有的輸入事件控制權.
但如果必須要在這種地方下中斷點, 因為 X11 所有的輸入都被搶走了, 你無法操作 gdb.
因此我只好用比較麻煩的方法. 假設有 X11 的電腦叫 A, 那我用另一台 B 電腦以 ssh 的方式連進去; A 先執行想 debug 的程式, B 查詢該程式的 pid, 再用 gdb attach 上去:
gdb -p <pid>
或是進入 gdb 之後
attach <pid>
attach 完成後, gdb 先幫你中斷所有的 event loop, 所以你可以先設定好中斷點, 再讓它 continue 下去.
有些程式會在 stderr 印出 debug 或 error 訊息, 但是 attach 並不會幫你把 fd 導到 gdb 所在的 Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-33232295628174447692012-04-27T17:07:00.000+08:002012-04-27T17:07:14.185+08:00add-apt-repository fails with gnutls_handshake error
Bug #926548
在 Ubuntu 12.04 還是存在的問題. LTS 最高! (棒読み)
簡單地說, add-apt-repository 會用到 pycurl, 而 Ubuntu 上的 pycurl 的 SSL 支援是使用 GnuTLS, 而很不幸的是 GnuTLS 在處理某些網站的 SSL 時會出現錯誤.[?]
workaround 是把 pycurl 重編, 讓它使用 OpenSSL 去處理 SSL 協定.
如何在 Ubuntu 上重編 python-pycurl 在 PyCurlSSLBug - wfuzz 有詳細說明.
雖然我自己也有在用 pycurl, 但因為我是用 pip 自編, 又剛好都是用 OpenSSL, 才沒遇到這個問題.
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-4261746075385757132012-04-18T16:26:00.000+08:002012-07-16T15:34:58.696+08:00About the rvalue reference
之前拜讀過 yoco315 所翻譯的 Rvalue References 文章, 把原本相當複雜的概念寫得非常淺顯易懂, 讓我當時忍不住手癢實驗了一下.
由於這是一個全新的特性, 當時還沒有很完整的 coding standard 可參考, 因此越寫疑惑就越深, 最後就先把注意力轉移到其他特性, 如 lambda expression.
今天的 OSDC.tw 很幸運地遇到 fr3@K 給了一場 C++11 的 talk, 讓我又再次燃起熱血, 便藉著指導新生的機會也來順便練習 class design.
首先要說的是, 使用 pimpl idiom 的 classes 較容易從 rvalue reference 和 swap 受益. 原因無它, handle classes 的成員變數只有一個指標, 無論是 move 或是 swap 都只要改變指標的值即可, 無須額外Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com5tag:blogger.com,1999:blog-10430755083050582.post-84722952794154903792012-03-20T23:57:00.000+08:002012-03-20T23:57:32.068+08:00為什麼我要唸資工系
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com1tag:blogger.com,1999:blog-10430755083050582.post-90193587647724314732012-03-09T21:12:00.001+08:002012-05-14T18:15:41.822+08:00QSnapshot
QSnspshot
買了 Mac,卻發現 Mac 上的抓圖程式沒辦法抓視窗的子元件,於是我偷了 KSnapshot 的程式碼,偷了 Apple 上的範例程式,做出這個適用於 Mac OS,Windows 與 Linux 的抓圖程式。
有任何建議與問題,歡迎聯絡我。
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-49751777568053722752011-11-15T16:43:00.001+08:002011-11-15T17:20:30.789+08:00Setting 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.
NAT 的概念就不多說了, 總之對外連線時會經由 host 的介面轉換為 host adapter 的封包, 對外來說就只看得到 host, 裡面連得Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-20650642944248268672011-11-08T15:06:00.000+08:002011-11-08T15:06:20.768+08:00QNetworkAccessManager 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.
Let's start from FTP RFC documentation. The very first FTP spec. is describe in RFC-959, and it doesn't describe how to retrieve size of files. The SIZE and MLSD command are describe in RFC-3659. Some FTP server may not support Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-83924172297331636162011-10-01T16:51:00.000+08:002011-10-08T23:44:32.739+08:00Threads in Qt
Threads, Events and QObjects | Qt Wiki
寫出好用的泛型程式碼需要天份, 寫出具有異常安全性的程式碼需要細心, 而要寫出完全多緒安全的程式碼, 你需要的是新鮮的肝.
基本上這篇文章最大的重點就是, 如無必要不需繼承 QThread, 因為如果你這麼做, 事情通常不會像你想的那樣運作.
QThread 的設計意圖是作為一個管理 thread 的物件, 它並不代表 thread 本身, 所以你應該做的是建立一個 QThread 物件, 然後使用 QObject::moveToThread 把你需要在該 thread 上執行的 QObject 移到 QThread. QThread 一旦執行完畢就無法再次啟動, 如果還要使用 thread 必須要建立另一個 QThread.
我整理一下 QObject 和 thread 之間的關係:
每個Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-14335875068102430352011-07-24T00:43:00.003+08:002011-07-30T23:28:08.665+08:00Reuse existing KSnapshot on press PrintScreen在 Debian 或 Kubuntu 的預設設定, 按下 PrintScreen 鍵會啟動 KSnapshot, 若再按下一次 PrintScreen, 則會再喚起一個 KSnapshot. 但這不是我想要的行為, 當我按下 PrintScreen 時就代表我想抓圖了, 不停地開啟新的 KSnapshot 有點蠢. 幸好 KSnapshot 有提供足夠的 D-Bus 介面, 這讓我們可以寫一個 script 操作已存在的 KSnapshot.
#! /bin/sh
PID=`pidof -s ksnapshot`
if [ -z ${PID} ] ; then
`which ksnapshot` -caption KSnapshot &
exit 0
fi
DBUS_SERVICENAME="org.kde.ksnapshot-${PID}"
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com1tag:blogger.com,1999:blog-10430755083050582.post-15054176288654540412011-07-12T22:13:00.001+08:002011-07-12T22:14:09.883+08:00Configure gitweb with lighttpd on Debian很久之前從 gitosis 的範例改寫的, 筆記於此:
server.modules += (
"mod_setenv",
)
url.redirect += (
"^/gitweb$" => "/gitweb/",
)
alias.url += (
"/gitweb/" => "/usr/share/gitweb/",
)
$HTTP["url"] =~ "^/gitweb/" {
setenv.add-environment = (
"GITWEB_CONFIG" => "/srv/gitosis/gitweb/gitweb.conf",
)
cgi.assign = ( ".cgi" => "" )
server.indexfiles = ( "gitweb.cgi" )
}
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-26378264869033027322011-06-23T15:00:00.000+08:002011-06-23T15:00:11.678+08:00Download attachment file with JavaScript
AJAX 回應回來的內容會被 JavaScript 拿到, 而不是直接顯示在網頁上. 當你希望瀏覽器跳出下載對話框, 可以這麼做:
window.location.href = 'download.cgi';
是的, 根本不需要 AJAX.
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-31183506804194627862011-06-23T00:19:00.000+08:002011-06-23T00:19:33.575+08:00Configure Django with Lighttpd on Debian/Ubuntu
網路上找到的資料都有點不完全, 最近在逃避現實的過程中找到了一個比較簡單的方式, 供有需要的人參考.
首先當然要安裝 Django 和 Lighttpd:
# aptitude install python-django python-flup lighttpd
不裝 python-flup 就不能啟動 Django.
在 /usr/share/doc/python-django/examples 裡有兩個檔案: initscript 和 default:
# cp initscript /etc/init.d/django
# chmod a+x /etc/init.d/django
# cp default /etc/default/django
initscript 幫助你讓 Django 成為系統服務, default 的內容則是一些變數設定. 要特別修改Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-42221248869121315112011-05-27T19:23:00.001+08:002011-05-27T19:24:24.408+08:00Khopper 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 來源
為什麼會跳過 v0.4.0 從 v0.4.2 發佈呢 ... 不要問, 很恐怖 = =
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-43380132609298988362011-05-23T03:53:00.000+08:002011-05-23T03:53:49.356+08:00JavaScript function binding: arguments only
Function.bind -- MDC Docs
既然 JavaScript 1.8.5 已經有 bind 可以用, 為什麼不用它呢? 因為它有一個小問題, 就是它非得 bind 一個 instance 給 this, 但很多時候你是不想動到原本 this 所指向的 instance, 比方說某些 library 會要求 event handler 的 this 必須要指向某個 DOM Element. 於是當你只想 bind arguments 時, 這個無法忽略的第一個參數實在很惱人, 我自己試過丟 undefined 或 null 進去, 但結果 this 都被 bind 到 window 上. 幸好這個要求在 JavaScript 並不難實作, 我就自己刻了一個.
function bind( fn ) {
var args = Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-12841060685690899042011-05-08T21:34:00.000+08:002011-05-08T21:34:03.827+08:00Use Qt Jambi community with Eclipse
Qt Jambi 原本的 Eclipse plugin 己經不能用在新版的 Qt Jambi 上了,所以我們需要自己做點苦工。
設置 Qt Jambi 的 classpath
這是比較簡單的部分,在 Preference -> Java -> Build Path -> User Libraries 裡新增一個新的 library,把 qtjambi-4.x.x.jar 和 qtjambi-(platform spec).jar 加入,然後在專案的頁面加入這個自訂的 library 就好。
Qt Designer
這有點麻煩,因為就我的經驗,社羣版給的 designer 啟動器都是不能用的,但還好 Qt Jambi 用的 jui 檔案和原本的 ui 檔案格式差不多,所以用原本 C++ 的 QtDeigner 就可以了,只要手動做些小修改:
副檔名改成 jui
<qt>Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-37679171445491826622011-04-23T17:23:00.001+08:002011-04-29T15:40:54.548+08:00Single Instance of Qt
某些時候你會希望你的程式在同一時間內只會被執行一次,這需要使用 IPC 的技巧實作:第一個被執行的實體先留下某個溝通的管道,第二個以後被執行的實體就去連結這個管道,並自行決定要留下哪個實體。
最方便的方法就是用 Qt Solutions 內的元件:QtSingleApplication。但 Qt 己經不再繼續更新 Qt Solutions 了,且最近我使用它時碰到了一些詭異問題。另外要一提的是,去年我寫的 Export the symbols of QtSingleApplication 一文,現在其取得方式及編譯方式都有變動。由於其細節與本文無關,請自行參照該文。
QtSingleApplication 的使用方式如下:
#include <QtSingleApplication>
int main( int argc, char * argv[] ) {
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com2tag:blogger.com,1999:blog-10430755083050582.post-65272261597387546542011-04-09T23:28:00.000+08:002011-04-09T23:28:27.635+08:00Lambda 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 就不會有問題.
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-42716907739506190602011-04-01T22:51:00.002+08:002011-04-03T01:24:52.269+08:00Another Observer Pattern implementation in Java
由於實在不喜歡 Swing 的 listener 方式,因此我嘗試使用 Java 內建的 Observer 和 Observable 來套用 Observer Pattern,但它比我想像中地還不靈活,原因有三:
必須要呼叫 Observable.setChanged 才會讓 Observable.notifyObservers 生效,而 Observable.setChanged 是 protected,這意味著你至少必須繼承 Observable 類別,這對於不允許多重繼承的 Java 來說很要命,因為 host class 很有可能來自另一繼承體系。
你沒辦法透過 composition 繞過這個限制,因為 Observer.update 帶有一個型態為 Observable 的參數,語義上這個參數必須要是發出事件的物件,但若是使用 composition 持有 Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0tag:blogger.com,1999:blog-10430755083050582.post-34941341797283514902011-03-25T15:09:00.000+08:002011-03-25T15:09:19.616+08:00Khopper 0.4 Release Candidate is out
安裝方式
使用手冊
重要改變:
加入 FreeDB 支援
加入 YouTube 支援
加入多緒轉檔功能支援
儘可能消除 Phonon 對不同格式的影響
Ubuntu 安裝使用 PPA 來源
如果沒什麼問題就會是最後釋出版。
Anonymoushttp://www.blogger.com/profile/03432164862993744945noreply@blogger.com0