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)

2010年12月29日 星期三

Mozilla Add-On 要求使用者更改密碼以策安全

昨天 MAO 寄了封信, 大意是他們在 12/17 發生了被第三方使用者洩漏密碼的事件, 因此 MAO 為了安全性把所有使用者的密碼都砍掉了, 必須要用忘記密碼的方式重設才能啟用帳號.

2010年12月20日 星期一

im-switch dialog in Kubuntu 10.10

im-switch 在有 X Server 的狀況下會使用圖形介面的對話框,但是很遺憾的是它固定呼叫的是 zenity,而沒有提供 kdialog 或是 dialog 之類的支援。Kubuntu 預設也不會裝 zenity,因此你只能瞪著它吐出錯誤訊息。
等等,你有除了安裝 zenity 之外的方式,那就是假裝你沒有 X Server:
$ DISPLAY= im-switch -c
這個方法會讓 im-switch 以為目前沒有 X Server,從而使用傳統的設定方式。現在你可以享受你的文字介面了。

2010年11月25日 星期四

你永遠料不到自己有多蠢

最近某個作品在開啟檔案時會不定期當掉 ... 原本一直找不出原因, 直到我在除另一個不相關的 bug 時發現這個函式:
const char * fromURI( const QUrl & uri ) {
    QByteArray tmp( uri.toString().toUtf8() );
#ifdef Q_OS_WIN
    if( uri.scheme() == "file" ) {
        tmp.prepend( 'w' );
    }
#endif
    return tmp;
}

2010年11月11日 星期四

Qt 4.7.1 introduced -mp configuration

這一篇所針對的是 Qt 4.7.0, 在 Qt 4.7.1 發佈後, 發現多了 -mp 的選項, 顧名思義, 加上之後它就會針對 msvc 開啟 /MP 參數. 在此統整一下我用的參數:
@echo off

SET PREFIX=Z:\Qt\4.7.1

configure ^
    -opensource ^
    -debug-and-release ^
    -mp ^
    -ltcg ^
    -fast ^
    -no-qt3support ^
    -no-dsp ^
    -no-vcproj ^
    -prefix %PREFIX% ^
    -nomake examples ^
    -nomake demos ^
    -nomake translations
MKDIR %PREFIX%\mkspecs
XCOPY /E /K mkspecs\* %PREFIX%\mkspecs
nmake
nmake install
nmake clean

2010年10月11日 星期一

Build Qt with Visual C++ 2010

在開始前要特別一提的是在 configure -help 未提及的參數:
-prefix <path>
指定編譯完成後的安裝路徑,nmake install 時會安裝到這個路徑。
-nomake <libs|tools|examples|demos|docs|translations>
可以指定哪部分不需要編譯。要注意的是如果要關掉多個模組須分開指定。
為了讓編譯程序能夠加快,我對 mkspecs 做了一點手腳。找到 mkspecs\win32-msvc2010\qmake.conf,修改:
-QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t-
+QMAKE_CFLAGS            = -nologo -Zm200 -Zc:wchar_t- -MP3
-QMAKE_CFLAGS_RELEASE    = -O2 -MD
+QMAKE_CFLAGS_RELEASE    = -Ox -MD
提高最佳化參數,並啟動多重編譯。另外有點白爛的是,在編譯階段它會去安裝路徑找 mkspecs,問題是根本還沒進入安裝階段,資料夾內當然是空空如也;為此你必須手動把 mkspecs 從原本的資料夾整個複製到安裝路徑裡。

2010年10月6日 星期三

Fix the jar file association for shared-mime-info

Java 的 jar 檔案關聯在 Debian 和 Kubuntu 上一直都被視為 application/zip,基本上這不是 KDE 的問題,而是 shared-mime-info 裡面的 /usr/share/mime/packages/freedesktop.org.xml 的判定條件錯誤,它沒有判斷 jar 檔的 PKZIP 表頭。打開這個檔案,找到 <mime-type type="application/x-java-archive"> 的區段,加入:
<magic priority="85">
  <match value="PK\003\004" type="string" offset="0" />
</magic>
再刷新 MIME 資料庫:
# update-mime-database /usr/shared/mime
jar 檔就會被正確判定了。

2010年6月12日 星期六

Phonon with raw PCM

由於 Phonon 在運作上會把讀到的東西轉交給它的後端,如果你已經有了一個原始的 PCM 資料,那麼在餵給 Phonon 時要記得填上 wav 的 header,才能讓後端辨識並找到合適的方式開啟它。

2010年5月22日 星期六

Templates needs no "__dllspec"

之前提到的, Visual C++ 要做 export/import symbol 的動作才能連結 dll, 但是 template classes 和 functions 是不需要的 ... 原因很單純, 就是 template 在 Visual C++ 是原地展開的, 不需要再額外做 symbol 的定義[?].

2010年4月2日 星期五

Converting literal

為了避免荒廢,來貼個廢文充數好了。
上一篇有提到 string literal 的問題,這是把文字轉成 hex 的 C 程式,不過要用 C99 去編譯才行。
#include <stdio.h>

int main() {
  for( char tmp[1024]; fgets( tmp, sizeof( tmp ), stdin ) != NULL; ) {
    for( unsigned char * c = tmp; *c; ++c ) {
      if( *c == '\n' ) {
        printf( "\n" );
      } else {
        printf( "\\x%02X", *c );
      }
    }
  }
  return 0;
}

2010年3月14日 星期日

Using UTF-8 literals in source code

直接在 code 裡打 UTF-8 字元在有的 IDE 會無法辨識,像是 Visual C++ 2005 和 2008 堅持使用 locale 的編碼來解讀 source,導致換 locale 就會編譯失敗。
這種時候沒什麼有效的解決方法,就是用 hex escape 字元啦 ...
/* 正體中文 in UTF-8 */
const char * utf8 = "\xE6\xAD\xA3\xE9\xAB\x94\xE4\xB8\xAD\xE6\x96\x87";
很煩,很難讀,不過至少所有的字元都保證在 C / C++ 的標準字元集裡;只是最好在旁加上註解說明那應該是什麼字,否則很難維護。

2010年3月12日 星期五

Forward declaration with template parameters

在避免編譯時間拉長的時候,forward declaration 是個很好的選擇。但是有一些時候你無法使用 forward declaration,一個是該型別其實是個 typedef 的時候,另一個是當這個型別用在 template parameter 的時候。
由於 template class 經常是 inline 的,所以它可能在 header 就必須要知道 template parameter 的大小或成員這些細節。這導致你必須要 include definition 或是改用 pointer。
你說 smart pointer? 不會吧?(笑)

2010年3月10日 星期三

Export the symbols of QtSingleApplication

現在 Qt Solution 只能在 git 上取得了。
若想要編成 library,在 configure 參數加上 -library 即可:
configure -library
qmake
make # or nmake for MSVC
真正需要的 header 只有 QtSingleApplication, qtsingleapplication.h, qtcoresingleapplication.h。
The following content is obsolete. Latest update: 2011/04/23
Qt Solutions 的慣例似乎是把它內附的 pri include 到 qmake 的專案檔內,直接把原始檔包進去編譯,而不會做出封裝檔[?]。但是這種做法只適用於用 qmake 管理的專案檔內,且編譯時間可能會拉長。如果想弄出封裝檔,就要自己對它作一點手腳。
QtSingleApplication 為例,可以對 buildlib/buildlib.pro 動手腳。這個設定主要是給 dynamic loading 使用的,只要在 CONFIG 加上 shared 就可以了。
-CONFIG += qt dll qtsingleapplication-buildlib
+CONFIG += qt dll qtsingleapplication-buildlib shared

2010年2月15日 星期一

Create source groups in Visual C++ solutions with CMake

使用 qmake 時,Visual C++ 的方案會自動把產生的檔案(e.g.: ui_*.h, moc_*.cpp ... etc.)歸類到 Generated Files,讓原始碼樹看起來比較清爽。但是 CMake 不會幫你做這件事,專案一大就會讓這些不必修改的檔案佔滿整個專案。
但是 CMake 其實是可以做到的,使用 SOURCE_GROUP 巨集就可以建造一個群組,把原始碼組織起來。過濾的方式有二:使用 regular expression,或是直接指明檔案路徑。以下是範例。
# 明指 moc, rcc, uic, qm 檔案為 Generated Files
source_group("Generated Files" FILES ${MOC_SOURCES} ${RCC_RESOURCES} ${UIC_HEADERS} ${QM_FILES})
# 使用 RE 把資源檔找出來
source_group("Resource Files" REGULAR_EXPRESSION .*\\.rc)
# 使用 RE 把 Designer forms 歸類在 Form Files
source_group("Form Files" REGULAR_EXPRESSION .*\\.ui)
注意 regular expression 要跳出 \。