發表文章

目前顯示的是 七月, 2014的文章

wmic: Windows Management Instrumentation Command-line

Windows 方面的技能毫無長進, 這就是典型的同樣的事做個十年, 沒有學習的話也不會有所長進...。最近重灌電腦才發覺 wmic 這個好東西, 可以取得硬體資訊 (如主機版型號), 管理 process 等。搜尋 "wmic tips" 會看到很多介紹它的好處和用法。寫這篇廢文只是想降低我忘掉 wmic 的機率...。Wikipedia 有相關介紹, 其中有幾個關鍵字等要用的時候再深入研究一下, 像是 CIM, DMI, SNMP, 概念是對硬體裝置定好統一的 API, 方便本機或網路查詢、更新設定。

找出 dangle pointer 的方法

有時候 C++ 程式會莫明地 crash 在呼叫 method 的時候, 像是 obj->method()。檢查 obj 的值有幾種情況: NULL: 一看就知道有問題某種規律的數字, 像是 0x23232323, 0xCDCDCDCD: 99% 有問題, 還沒猜錯過特定的位置, 如 0xDEADBEEF: 看了也知道有問題, 這是 debugger 特意覆寫的值看起來像個正常的指標, 可能是 dangle pointer需要注意的是, 透過 dangle pointer 呼叫 method, 不一定會 crash。不過呼叫 virtual method 時一定會 crash, 因為 destructor 會重置 virtual method table 內的值 (相關文章見《C++ 執行後掛在 __cxa_pure_virtual》)。以下是一個測試例子: $ cat a.cpp #include class Rect { public: Rect(int x, int y, int w, int h) : x(x), y(y), w(w), h(h) {} int area() const { return w * h; }; virtual int area2() const { return w * h; }; private: int x, y, w, h; }; int main(void) { int w, h; scanf("%d%d", &w, &h); Rect *r = new Rect(10, 20, w, h); printf("area: %d\n", r->area()); printf("area2: %d\n", r->area2()); delete r; printf("area: %d\n", r->area()); printf("area2: %d\n", r->area2()); return 0; } $ ./a 30 40 area: 1200…

用 regexp 的 lookahead 尋找符合 pattern A 但不符合 pattern B 的字串

偶而會需要找內含字串 A 但不含字串 B 的字串, 若剛好得用 regexp 表示的話, 會有點麻煩 (像是用 Android logcat filter 的時候)。查了一下, 發現 regular expression 有個強大的語法叫作 lookaround, 用它可相對容易地達到此需求, 還可以應付各種情況。詳見 Regex Lookarounds: Lookahead and Lookbehind 的介紹。關鍵在於 lookaround 的語法只是從「目前的位置」往前或往後「看看是否符合目標 pattern」,不會實際占去符合的字串。看文件的例子會比較好理解。 以下是用 Python RE 比對「內含 abc 但 abc 之後不含 def 的字串」:In [70]: re.search('(?!.*def)abc', 'abcdef') (?!.*def)abc 的意思是每一個位置都做以下的事: 先往後找看看有沒有符合 .*def, 找不到才算成立。(?!...) 的意思是 negative lookahead negative lookahead 成立後, 看看目前位置是否能找到 abc 反之, 下面這個寫法是錯的, 比對 abcdef 仍會有結果:In [69]: re.search('(?!def)abc', 'abcdef') Out[69]: <_sre.SRE_Match at 0x2f2fd98> 因為它的意思是在目前位置看看是否不符合 def, 於是一開始比對 abc 時就成立了, 然後再比對成功 abc, 於是回傳比對成功的結果。 (?!.*def)abc 看起來很美好, 但它無法避開 defabc, 也就是 abc 之前有 def 的情況。雖然有 lookbehind 的語法, 但它只能比對固定長度的 pattern, 無法應付 xxxdefxxxabc, 所以得換個方式表示。 regex - Regular expression to match string not containing a word? 說明如何用 regexp 表示不含目標字串的字串, 並有圖解說明運作的過程。了解之後, 可運用同樣的技巧表示「內含 abc 但 abc 之前不含 d…