浮動 IP 架站

幾經波折,還是決定自己來架設一台 server ,用的是陪我走過大學研究所六年的電腦,七年了,七年之癢了,換了新電腦,就拿來當 server 吧~家裏用的是沒有固定 IP 的 ADSL,於是去 DynDNS 申請了個免費帳號。不過因為是免費的,domain name 的名字不是那麼自由,就像這篇教學文所說的:想要得到 *.tw 結尾的網址要付錢,而且只有 *.idv.tw 比較便宜,*.net.tw 或 *.org.tw 等都不是那麼容易,除非執念太深,不然使用推薦使用 DynDNS 這類免費的服務,有些名字還至於太糟。

申請 DynDNS

https://www.dyndns.com/ 後,按下網頁右上角的 Create Account 就可以申請帳號了。

image

有了帳號後,還需要一個小程式,讓它常駐在系統裡,當 ADSL 撥接上後就可以自動連接到 DynDNS 去更新 IP 與 domain 的對應。

Windows

在 Windows 上可以用DynDNS Updater: http://cdn.dyndns.com/windows/DynUpSetup.exe 提供的工具,相當不傷腦又好用。

Linux

稍稍麻煩了點,需要 ddclient 這程式,主流的 distribution 都可以用套件管理程式取得,或是到這邊來下載。ddclient 的設定檔放在 /etc/ddclient.conf 下,網路上有很多教學,指導怎麼寫這設定檔,但最方便莫過於使用 DynDNS 提供的 config file generator 了。登入 DynDNS 後,點選 https://www.dyndns.com/support/tools/clientconfig.html 這網址,就會看到下方的頁面,選擇你要產生的 domain 和工具類型即可。

image

下面就是產生的設定檔,比起網路上有得教學和既有設定簡潔許多。

## ddclient configuration file
daemon=600                  # check every 600 seconds
syslog=yes                  # log update msgs to syslog
mail-failure=keiko.zhou@gmail.com # Mail failed updates to user
pid=/var/run/ddclient.pid   # record PID in file.

## Detect IP with our CheckIP server
use=web, web=checkip.dyndns.com/, web-skip='IP Address'

## DynDNS username and password here
login=Keiko
password=##YOUR PASSWORD##

## Default options
protocol=dyndns2
server=members.dyndns.org

## Dynamic DNS hosts
keiko.homelinux.net

根據好心人提示,為防萬一,第一次使用 ddclient 時,建議可以用 debug mode ,確定設定檔行不行得通。

ddclient -daemon=0 -debug -verbose -noquiet

成功啟動的話,會看到類似下圖的畫面。

HostYourServer03

學長,我錯了…

星期一跟小路學長吃飯才聊到某某人好像到了某校畢業典禮講了不恰當的話,沒想到今天回家我弟興致高昂地跑來叫我去參加反奴隸銀行遊行,順便問我認不認識楊基寬,還說這人大學跟我同間…

好吧,那就仔細來看一下,哇,ptt 好多懶人包,學校還發了新聞稿

第一點,給選擇延畢學生的提醒,如果你是因為景氣風暴而決定在校園裡面多躲一年的話,但請你告訴自己,職場是你人生必經的路,你沒有任何閃躲的空間,如果你的生平第一次就當個躲起來的懦夫,那麼你還能指望有什麼擔當呢?成大的學生不應該如此。

第二點,給選擇讀研究所同學的一個提醒,如果你讀研究所的出發點,是希望你將來的薪水會比學士要高一點,碩士的名聲聽起來會比學士要好一點,那麼整個社會,對於一個心中只是想著多賺幾塊錢及虛榮心作祟的碩士生,還能期望他什麼呢,社會指望你讀研究所是希望你論文的研究主題能為社會或產業解決某一個學士生無法解決的問題,而不是指望你拿一篇長篇大論甚至是廢話連篇的論文來滿足你個人狹隘的虛榮心和薪水的要求,因此請告訴自己,職場是你人生必經的路,如果你生平第一次就只能這麼狹隘的自我期許,那麼你能夠指望這個狹隘的主人,就是你,會有什麼擔當呢?成大的學生不應該如此。

第三點,是給選擇就業的同學一個提醒,我有信心學弟妹們都能順利找到工作,但因為今年景氣比較特殊,如果不幸的在未來,你已經不眠不休努力找工作找了三個月,還沒有找到的話,那麼請試著採用學長要給各位的一個策略,叫做「勇者策略」,當我們剛畢業的時候,什麼都還不會的時候,我們需要爭取的不是薪資,我們需要爭取的不是公司的大小,我們需要爭取的不是公司離家近不近,我們需要爭取的不是公司有沒有某一項的福利,我們需要爭取的不是公司需不需要加班,我們唯一需要爭取的就是那最珍貴的磨練,還有證明自己的機會,因此所謂的勇者策略是,當你經過3個月都還不能找到工作的時候,請挑選一家你心目中的公司,仔細研究這家公司有什麼地方是你可以為他們帶來所需要的解決提案,然後西裝筆挺的走進那家公司,眼神正視老闆跟他講說:「老闆,我這裡有一個針對貴公司某產品的提案,我願意不拿薪水,為公司效勞,直到景氣恢復為止。」老闆問你為什麼,你就跟他講,因為我需要磨練,我需要向你證明我是有用的,半年後如果景氣恢復,那麼老闆肯定會先用你,因為企業看到了你的主動,因為企業看到了你的解決能力,因為企業看到了你當仁不讓的決心,屆時你的經驗超過那些空等待的同學。

ㄜ…

第一點好像太偏頗了、第二點好像太偏激、第三點…… 聽說前陣子 Google/MS 人事凍結,早知道我就 xxoo

想起星期天跟老師聚餐,老師講的話:要是我們的教育,得讓孩子這麼辛苦,我們的教育是失敗的…

ps. 打開 WLW 又寫不出東西了,五月都沒寫 blog ,忘了怎麼寫文章了,看來我也要找個作文老師了!

啟動完整的記憶體傾印 Enable Complete Memory Dump

一直困擾我的問題,沒想到今天終於得到解答,感謝不知名的強者我同事!

為了讓系統 crash 後有較多的資訊可以幫助 debug ,我們可以設定系統將 dump 資訊盡可能的保留下來,方法很簡單,進到啟動及修復後,選擇撰寫偵錯資訊(write debugging information),不過有時會發現找不到完整的記憶體傾印(Complete Memory Dump)的選項,即使是將在將虛擬記憶體調大、實際環境的硬碟空間也足夠的情況下依然會有這種情形出現。

CompleteMemoryDump

此時需要修改一個 registry key 來啟動,\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl\CrashDumpEnabled2 改成 1

CompleteMemoryDump06 再回到啟動及修復後,選擇撰寫偵錯資訊(write debugging information)就會出現完整的記憶體傾印(Complete Memory Dump)的選項。

CompleteMemoryDump07

騰雲駕霧程式競賽 Blog 開跑了~

image

趨勢科技 2009 騰雲駕霧程式競賽的 blog 開跑了,就在作者外出到台南取材的時候 -_-||

http://www.wretch.cc/blog/trendnop09

上面可以詢問一切有關於比賽的問題,像是比賽方式、評分標準、今年還有沒有妙齡小天使、 training course 可不可以翹課、獎金可不可以不要扣稅、決賽入闈可不可以帶幸運毛毯、頒獎典禮可不可以帶寵物等等。不過還是要 prompt 本站一下,所以要是大家在官方 blog 問不到滿意的答案,歡迎還是回(娘家?!)到這發問啊,代客詢問是我專業自婊、出一張嘴、毀人不倦之外的第四專長,我會秉持打破沙鍋問到底、一審不定讞、二審再上訴、三審就辭職的態度幫忙發問,下面開放十個回應免費匿名…

騰雲駕霧程式競賽

這當然是廣告文!

我們公司辦的比賽,有興趣的學長弟妹可以參加唷!節錄一些重點:

「騰雲駕霧程式競賽」由趨勢科技主辦,IBM生物資訊研發中心協辦,該單位將提供硬體設備贊助。競賽籌備小組自3月10日起將至台北科大、台大、清大、交大等9所大專院校進行巡迴說明…

哈,漏掉成大了,不過 3/24(二) 還是會去成大資工 4263 宣傳,可能過一陣子,海報、文宣就會出來了,我也會去唷,大家再找時間吃個飯吧!  <--- 重點!

  • 報名資格
    大學生、研究生、每隊四人(不多不少唷),可跨校!
  • 報名
    3/20-5/15:將開放網路報名,6月份將安排參賽者接受第一階段的網路遠距教學!
  • 比賽方式
    • 初賽
      7/1:網路公佈題目。
      7/8:00:00 停止收件。
      7/22:公佈入圍名單。
    • 決賽訓練課程
      7/30 ~ 7/31:到趨勢上課!
    • 決賽
      8/18 ~ 8/19:決賽入圍。今年也有可能不會在台北士林劍潭青年活動中心,會改去 IBM 生物資訊研發中心吧?機器都在那邊,或是要很炫的自己遠端 deploy 到伺服器海中,那就不必到現場了!
  • 頒獎
    8/20:頒獎。往年頒獎典禮都蠻有心的,會找飯店,以前有去過晶華酒店,典禮有簡單的點心、可邀請家人朋友、找記者來採訪(不過記者好像都不會來-_-|)
  • 獎項(這好像是最重要的)
    1st:NT$500,000
    2nd:NT$300,000
    3rd:NT$200,000
    4th:NT$150,000
    5th:NT$100,000
    6th ~ 10th:NT$50,000
    預聘書現在只給前三名了 <囧>
  • 題目
    好像沒提到,但是跟雲端運算有關就是!
  • 競賽網站
    http://www.trend.org/fd/tabid/66/Default.aspx
  • 附註
    比賽中會需要各式各樣的人,寫 UI、寫程式、寫文件、上台 presentation、找 bug、做 testing 都會,所以記得要把團隊技能平均問題,不要只點某一、兩樣技能唷!

我是工作人員,不管有什麼疑難雜症、難以啟齒需要匿名的問題,我都可以代為傳達唷!

騰雲駕霧程式競賽

沒想到真的有人來問問題,作一篇置底廣告文,歡迎大家提出問題!DM01

我們公司辦的比賽,有興趣的人,尤其是學長弟妹可以參加唷!節錄一些重點:

「騰雲駕霧程式競賽」由趨勢科技主辦,IBM生物資訊研發中心協辦,該單位將提供硬體設備贊助。競賽籌備小組自3月10日起將至台北科大、台大、清大、交大等9所大專院校進行巡迴說明…

  • 說明會時間地點
    時間 學校 地點
    3/11(二) 12:20-13:30 北科大 綜合科館第三演講廳
    3/11(三) 13:00-14:00 台大 資工系 102
    3/12(四) 12:10-13:20 台科大 IB510
    3/16(一) 12:20-13:30 中山 電資大樓 F1001
    3/17(二) 11:00-12:00 中央 工五館 207
    3/18(三) 15:00-16:00 清大 資電館 127
    3/19(四) 12:20-13:30 交大 工三 122
    3/23(一) 14:00-16:00 中正 地震館 215
    3/24(二) 12:20-13:30 成大 成大資工 4263
  • 報名資格
    大學生、研究生、每隊四人(不多不少唷),可跨校!
  • 報名
    3/20-5/15:將開放網路報名,6月份將安排參賽者接受第一階段的網路遠距教學!
  • 比賽方式
    • 初賽
      7/1:網路公佈題目。
      7/8:00:00 停止收件。
      7/22:公佈入圍名單。
    • 決賽訓練課程
      7/30 ~ 7/31:到趨勢上課!
    • 決賽
      8/18 ~ 8/19:決賽入圍。今年也有可能不會在台北士林劍潭青年活動中心,會改去 IBM 生物資訊研發中心吧?機器都在那邊,或是要很炫的自己遠端 deploy 到伺服器海中,那就不必到現場了!
  • 頒獎
    8/20:頒獎。往年頒獎典禮都蠻有心的,會找飯店,以前有去過晶華酒店,典禮有簡單的點心、可邀請家人朋友、找記者來採訪(不過記者好像都不會來-_-|)
  • 獎項(這好像是最重要的)
    1st:NT$500,000
    2nd:NT$300,000
    3rd:NT$200,000
    4th:NT$150,000
    5th:NT$100,000
    6th ~ 10th:NT$50,000
    預聘書現在只給前三名了
  • 題目
    好像沒提到,但是跟雲端運算有關就是!
  • 競賽網站
    http://www.trend.org/fd/tabid/66/Default.aspx
  • 附註
    比賽中會需要各式各樣的人,寫 UI、寫程式、寫文件、上台 presentation、找 bug、做 testing 都會,所以記得要把團隊技能平均問題,不要只點某一、兩樣技能唷!

我是工作人員,不管有什麼疑難雜症、難以啟齒需要匿名的問題,我都可以代為傳達唷!

How to Deploy my Visual C++ Applications, Part 1

前言

寫程式的人常常會寫了一些應用程式或小工具後,想把它拿到另外一台電腦上測試或是分享給親朋好友,此時若是對方的電腦沒有安裝 Visual Studio,往往會遇到一個問題:對方無法執行我們的程式!

中文版錯誤訊息:ScreenHunter_02 Apr. 25 20.41

無法啟動這個應用程式,因為應用程式的設定不正確。重新安裝應用程式應該可以修復這個問題。

英文版錯誤訊息:(我沒有英文版 Windows ,只好上網偷

ScreenHunter_01 Apr. 25 22.11

This application has failed to start because the application configuration is incorrect. Reinstalling the application may fix this problem.

每當我遇到這種情況的時候,我都會想起研究所的學弟 DNA !當然不是想他這個人,是想起他說的話:

What The Fuck! (WTF)

這當然有一些解決方式:

  1. static link、
  2. 找出所有的 dependency ,然後包一包丟過去、
  3. 做個 release build ,然後找 MS 出的轉散發套件(redistributable package)請對方安裝、
  4. 做個安裝程式,把所有東西包一包!

解決方式

這裡就介紹最簡單的解決方式:copy!Visual C++ 的散佈套件放在:

安裝目錄\VC\redist

若是散佈 release 版本,就在這資料夾下根據平台選擇,若是 debug 版本,就選擇 Debug_NonRedist 這個子目錄,進去後一樣根據平台選擇下一個目錄。

image

不論是 release 版或是 debug 版,目錄都會根據函式庫類型分類好,不過 debug 似乎比 release 少了些東西:

  • Microsoft.VC80.ATL
  • Microsoft.VC80.MFCLOC

不確定是不是因為 debug 版沒有上面兩者或是包含在 DebugMFC 裡頭了

ScreenHunter_03 Apr. 25 22.27 Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86 的 layout,給 debug build 用

ScreenHunter_04 Apr. 25 22.27Microsoft Visual Studio 8\VC\redist\x86 的 layout,給 release build 用

剩下要做的就是把跟你程式相關的函式庫一同 copy 給對方就可以了,不過這只解決了與 Visual C++ 相關的相依性,其他的程式用到的函式庫,就得靠自己尋找一下。

基於好奇,再往 CRT 的資料夾裡頭看一下,那麼你會發現裡頭有四個檔案:(節錄自C Run-Time Library (CRT)

  1. Microsoft.VC80.DebugCRT.manifest
    Side-by-side assembly 不可或缺的一環,是微軟在 .Net 提出的架構,用來管理程式、元件的相依性。竟然說是不可或缺了,記得一定要 copy 這個檔案過去。
  2. msvcr80d.dll
    Multithreaded, dynamic link (import library for MSVCR80.DLL). Be aware that if you use the Standard C++ Library, your program will need MSVCP80.DLL to run.
  3. msvcp80d.dll
    Standard C++ Library
  4. msvcm80d.dll
    C Runtime import library. Used for mixed managed/native code. 如果程式沒用到 managed code,這個就不需要!

image

 

Reference

  1. MSDN: How to: Deploy using XCopy
  2. This application has failed to start because the application configuration is incorrect
  3. MSDN: C Run-Time Library (CRT)

又是廣告,公司徵才!

中午接到以前打工認識的朋友的電話,他現在在一間新公司上班,想在台灣成立軟體團隊,產品是 DVR 相關的監控產品,工作地點在台北中和或是大陸廣州中山,工作會用到 ARM, Linux, C/C++,職缺是軟韌體工程師,有熟悉下面的有加分:

  1. 對 Video Codec (H.264)熟悉
  2. Video streaming
  3. TCP/UDP/RTP/RTSP protocol
  4. Linux kernel, driver
  5. Windows 遠端監控
  6. Mobile 遠端瀏覽程式

有興趣的朋友,可以跟我說唷!

Qt 4.5 Released

自從 Trolltech 被 Nokia 買了之後,網頁風格就變了,感覺好像比以前好了!不過最重要的是, Qt 4.5 改成以 LGPL 作為 Free 版本的授權,Yes!不過這次的編譯好像變麻煩了,試了好幾天 : ( 原來前陣子,這麼 down ,Qt 也要負責啦!)下面是嘗試過後,可用的編譯選項:

  1. configure –platform win32-msvc –debug-and-release –no-qt3support –no-webkit
    • -platfrom win32-msvc: 這似乎是這個版本一定要加的選項,我有試過用 %QMAKESPEC% 這個環境變數,但似乎沒用,一定得加這個選項。
    • -debug-and-release: 嗚嗚,是人總要 debug 吧,預設的編譯是不產生 debug 的,記得加上!
    • -no-qt3support: opensource 最常被訐詨的就是不向下相容, Qt 佛心來的!
    • -no-webkit: 論壇上很多人說他 build webkit 就會 build failed ,如果沒有要用到這個功能,可以略掉!不過我自己測試的結果是 OK!
  2. nmake

編譯環境:

  • Windows XP
  • Visual Studio 2005 SP1

Enjoy it!

PreCode Snippet 4.0.2 Released

在之前的文章提到的 PreCode 出新版了,已經支援 SyntaxHighlighter 2.0 的語法。不必像之前文章那樣進到原始碼模式修改 tag 。

喜形於色

小學的時候大家都寫過國語習題的照樣造句,沒寫過的表示我們是不同年代的人了…

今天我也要來照樣造句,

第一題:喜形於色。
例句:小明的論文上了,所以喜形於色。
Keiko:Royce 今天喜形於色地丟著 msn 訊息!早上老闆看了都大叫:Royce 你在笑唷!晚上 Aawen 同事見了也大叫:Royce 你怎麼了,怎麼一直笑!

第二題是成語造句,要先查成語字典,知道成語的意思後,再造句!
題目:春風得意。
解釋:舊時稱登進士第後的志得意滿為「春風得意」。後用以形容人做事順利,志得意滿的神情。唐˙孟郊˙登科後詩:「春風得意馬蹄疾,一日看盡長安花。」元˙喬吉˙金錢記˙第四折:「他見我春風得意長安道,因此上迎頭兒將女婿招。」
Keiko:今天台北冷冷的,飄著小雨,可是身邊暖暖地,原來旁邊站著是 Royce ,看他春風得意的,啊,原來台北沒有黃鶯,有的是路大師!原來人間四月天,春都到了小路身旁,怪不得外頭冷颼颼的,惟有這處暖!哇,春風滿面樂醄醄,一聲長笑海山高 : )

第三題是自由發揮
題目:百年好合、永結同心
Keiko:老師,這題我要留到 5/17 ,口以嗎?
老師:可以啊,科科!

當兵

今天比平常早了一點到公司,就跟 Arther 老大閒聊了一下,聊到了成功嶺大專兵可能要又恢復了!夭壽啊,當兵耶,一個可以讓平常剛毅木訥、口才遲鈍的男人瞬間長舌的話題,就像瑪莉兄弟吃到無敵星星,講話、回憶技能都滿了!果不其然,坐我後頭的兩位 J 先生馬上就打開話夾子了,耶,Architect 的穩重怎麼都不見了!一個是步校、一個是帶預官的,還好不用一梯退三步,不然我就要站去 101 了!

不過話題的結束台詞跟我想的一模一樣:
Jason 1:現在想想,當兵那段時間還蠻值得回憶的!
Jason 2:當兵是件可以回憶卻不想在經歷的事!
Keiko:Yes, bingo! (心理話)

忘了自己哪時候退伍…

啊,還有 866 天,這就是版面新工具的由來!

出差出差!

wang0zc5

生平第一次出差,目的地是台南成大,南國的母校啊,真是令人懷念!雖然科技新貴已經是上個世紀的事了,但很多還是會把資訊系跟有錢畫上等號,殊不知成大資工系其實是個年輕到了不行的科系,沒有畢業校友的金錢挹注,換來的是古色古香的系館,儘管對這棟系館發出讚嘆的永遠外系的人多過在裡頭唸過的人…

有種圍城的感覺:裡頭的人拼了命想外跑,外頭的人擠破頭想進來!好像選公司也是一樣的,永遠是還沒去過的公司最好!想起了跟 D.N.A 學弟講的話。

Keiko:人家都學歷顯赫,個個都留美學歷!
D.N.A:可是你留台啊!開口粥,留台多年,菁英份子!

哈哈,或許人就是這樣,對未知的東西不是充滿恐懼就是抱有美好幻想!忘了是哪位實驗室學長說過的話,還是我說得呢?

外國人絕對不會比較厲害,狗屁倒灶的事絕對比我們多又扯,只是我們只看到好的一面!

現在想想,我真應該在「工商服務時間」把這點提出來講一下!這就是所謂:門的另一端,真實的世界。突然想起上個禮拜請假到台南玩,星期一去了七股鹽田,在鹽山之前看到一對情侶朝我走來,男生是背對著我,手裡拿著相機,鏡頭當然對著心愛的女友,天空藍藍的,海風不強,輕輕拂過女孩的長髮,三千髮絲搖曳著,雖然只看到男生的背影,不過已經可以想像他是多麼小心翼翼想會這針對的一刻留下永恆的紀念,他一定小心翼翼地想捕捉女生最美的瞬間,傳說中甜蜜的青春也不過如此吧!

可是呢?這當然是我的幻想啊,從來沒有女生讓我這樣拍過,我也沒有有錢到請 model 來讓我幻想一下,更何況我手中只有 Sony W7 這種傻到不行的相機!那現實可能是怎樣呢?

  1. 可能是男孩倒退著走,然後一個重心不穩,跌個狗吃屎。
  2. 也可能男生其實跟我一樣,得了一種「相機帕金森式症」,這是一種拿到相機才會發作,症狀是手晃不止的病。結果就是把女朋友拍得很醜,晚上回到飯店可能遭到一頓痛毆。

image

天啊,我話好多,讓我想起這幾天看的獵人漫畫 280 話的拿酷戮,短短擦身而過,原來我也想了這麼多字!

its_Cold

出差很累,比上班還累,早上六點半就起床,因為家住台北知名的塞車之地,天空下著小雨,冷到我都想偷我弟的羽戎衣來穿!為什麼公司發的宣傳衣是短袖,為什麼我明明是興高采烈的想去說明會,卻是這樣的天氣歡迎我,知道嗎?這就回到剛剛講的:門的另一端,真實的世界…

儘管如此,這世間還是有不變的美好!要我舉例來說嗎?

  1. 嗯嗯,那就像我印象中的台南永遠都是有陽光的,高鐵只要一過曾文溪就會看到太陽。
  2. 李強老師永遠不記得我的名字,卻永遠記得我這個學生,記得我修過他什麼課、幹過什麼壞事,這次到是不忘跟我要名片!
  3. 黃宗立老師跟我打招呼的速度一定比我跟他打招呼快!
  4. 黃崇明老師一直記得我在蘇小鈺手下打雜!
  5. 每次要找朱治平老師,他永遠不在辦公室!!
  6. 永遠以為楊中平老師跟我一樣菜 -_-||
  7. 老師的女兒德恩不管看過我們幾次,每次的印象卻都像是要砍掉重練,從零開始、再出發!
  8. 老師辦公室的唱片還是很多,不時還會有陣陣木頭香!
  9. showmin, 文森, D.N.A 永遠很捧場,buffett 一定要坐在角落,aaa 一定要遲到。
  10. 冠廷一定要提早會消失(哪怕我們有革命情感),bbb 一定要耍龜毛!
  11. 老師一定會問我:我的 P2P player 呢?我的黑膠呢?
  12. 最後,在回台北的高鐵上,計畫著下次什麼時候再來?(這樣會不會被發現我是敗家子,都坐高鐵來回 -_-)

回到正題,出差是為了宣傳騰雲駕霧程式競賽,雖然來的人不多,不過也讓我體驗到什麼是一字之差的 mindset:

Royce:會來的就是會來!
Keiko:該來的就是會來!

不過還是有感動的事,遇到三個電通所的學弟,雖然不知道他們是從哪看來的網宣,可能是系學會幫的忙,不過從他們堅定的眼神看得出來他們會參加!

最後,也是最重要的一點,說明會前遇到了系主任,在他大力支持下, 4/17 (五)下午 2:00 開始的 seminar 我們又可以再去一次了!天啊,意義非凡,因為星期五下去,表示可以星期 X 才回台北!

Domain-Specific Language (DSL)

前言

過去幾年蠻熱門的話題(?),原本還想來學院派式的追本溯源一下,不過凡事起頭難,手邊資料不多,很多論文又不能下載,就作罷了,當閒聊了,又不是要寫論文 XD

我想是因為自己很晚才接觸資訊這個領域,加上上個世紀,網路、社群並非如此盛行,總有種錯覺:這幾年許多新語言的出現不再宣稱自己能解決所有的問題、可以被應用在所有領域,而是將焦點專注於特定問題、領域(domain)的,當然,這不是個新概念,但 Domain-specific language 卻是這幾年才流行起來的。

Generative Programming

Generative Programming 一書是這麼描述 DSL 的:

A domain-specific language (DSL) is a specialized, problem-oriented language. …(略) ... Domain-specific languages can be textural (e.g. SQL) or graphical (e.g. the graphical specification of a GUI in a GUI builder).

哈,基本上這是個很寬鬆的描述,會被 reviewer 打槍的那種,不過不難想像到 DSL 概念的成品已經充斥著我們生活周遭,像是:

  1. lex & yacc:大學 compiler 課用會到!
  2. SQL
  3. 曾經 SLIM 想用的 XUL ,到後來自己設計的 component script
  4. SMP 的 SREAM script
  5. ChucK (那有沒有 SCREAM 呢!)
  6. 微軟 .Net 新一代的 GUI 平台用到的 XAML(很多 open source GUI framework 也有類似的概念)
  7. UML 中的 OCL

這幾年 VM 這種結合 compiler, interpreter 特性的平台語言很是盛行,透過重複利用 VM 的中間碼可以讓原本設計一個 programming langauge 需要的繁雜後端工作得到部份減輕。所以許多研究、實驗性質的 DSL 會考慮建構在 VM 之上。舉例來說,就有許多語言建構在 JVM 之上,參考這邊

優點

那到底 DSL 的好處是什麼呢?wikiDomain-Specific Language: An Annotated Bibliography 做了很好的條列和解釋,不過我還是想再說一遍:( -_-||唉,我想我個性不太好)

  1. Expressive:我想這是最重要一點,人類的思考會受到語言、符號、圖像的限制。因此 DSL 在描述問題、解決問題時都會比 general purpose language (暫用 GPL 代表)更能貼近核心。最顯而易見的例子就是 GUI 的設計,用 WYSIWYG 的方式刻繪介面會比純文字好、BNF  form 比一堆 if, else, loop 湊出來的 FSM 更能表達語言結構、SQL 語法比用 procedural 清晰。此外,好的表達力可以讓維護程式碼時,一目了然,不需太多註解、文件相輔,一行 DSL 程式碼表達的運算可能需要數行 GPL 才能完成,這種精簡效果是很可觀的!
  2. 語法支持:這個部份我最想挑出來說的是 domain-specific error report/checking 和 constraint enforcement。好的語言不僅給予程式設計師自由的空間去發會,還要能適時給予程式設計師提醒與限制。 enforcement 是我進公司後才體驗到的一個 term ,這裡或許反映出一個個人喜好,我不喜歡把錯誤推遲到執行時期發現。不同的應用中常會帶來不同的限制或者說是規範,最糟糕的情況是無法透過 GPL 既有元素去表達的,或是僅能在執行時期偵測、或是以間接、隱晦的方式去表現。
  3. 其他,如可以做到更好的最佳化、程式碼內嵌 domain knowledge、易於測試等。(哈,我用其他來帶過,其實就代表我個人認為前兩項是最重要的好處)

為了避免空口說白話,這邊以 C++ 實做一個矩陣為例子來說明 GPL 可能做不好的地方:

class MyMatrix {
public:
    MyMatrix();
    MyMatrix( int row, int col );

    int operator ()( int row, int col );
    vector<int>& operator []( int row );
    template <typename T>
    MyMatrix& operator =( const T& );

private:
    int     row_;
    int     col_;
    vector< vector<int> >   data_;
};

使用時很簡單,就像下面一樣,精練、不失矩陣的意含(我想是這樣沒錯):

    MyMatrix m1( 10, 10 );

第一步看起來不錯,但是很明顯的當我們想初始化矩陣時,無論我們怎麼努力,卻很難只靠 C++ 本身(先不討論 Preprocessor)做到像下面的效果:

    MyMatrix m2 = { { 0, 0 }, { 0, 0 } };

最多我們只能靠著 operator overloading 做到:

    for ( int i = 0; i < 10; ++i ) {
        for ( int j = 0; j < 10; ++j ) {
            m1[ i ][ j ] = i + j;
        }
    }

或是提供 MyMatrixRow, MyMatrixCol 之類的 Proxy class 去一次設定多個元素;但無論如何,當元素間沒有規則時,一個一個指定矩陣元素的步驟就跑不了,此時若是有個 Matrix 相關的 DSL 輔助,我們可以寫出更精練、具可讀性的程式。下一個我們會面臨的問題可能發生在矩陣運算上,以加法為例,兩個相加的矩陣必須具有同樣的維度,但這個限制(或說規範)在 MyMatrix 是無法直接表達的(請先不要考慮到 C++ template,首先是因為這不是每個語言都有的 feature,其次是之後會有個段論詳細解釋這部份),所以我們可能得在

MyMatrix operator +( const MyMatrix& lhs, const MyMatrix& rhs );

的實做時,去檢查矩陣的維度,當兩者不符合時丟出一個 excption。當然不是說 exception 不好,而是若是能越早發現錯誤會更好,尤其是這種維度的指定與推導是可以靜態完成的,實在沒有必要留待動態時期去偵測。此時若是有個 Matrix 相關的 DSL 可以在撰寫時給予這方面的限制,可以省去不少麻煩、也能提高程式效能。

缺點

說完 DSL 的優點,聽起來是如此好用,讓我也一度著迷,想做些 DSL 出來用,不過現實世界當然不會如此美好!DSL 最大的問題在於:

  1. 草創期
    實做一個 DSL 需要許多人力投入在設計、實做上,先期的 domain/problem 分析、研究更是花費人工。這階段最惱人的應該是穩定度吧?!
  2. 初期
    當語言實做完成後,下一個面臨的問題就是配套與使用者心理。即使語言再簡單,都還是有自己的中心哲學,對於使用者來說:他們是不是快速的學習、語言的 Learning curve 是不是適當呢?甚至使用者可能排斥再學一個新語言?接著實際開發時,是不是相關的 tool chain 都能搭配上,是不是能有好用的 editor、IDE 來輔助開發、吸引開發者目光。而其中最為麻煩的,我想是錯誤資訊(像是 compiler error、failed to code gen …)與 debug 的環境,該如何讓使用者快速 trouble shooting 是很重要的。即使今天我們提供的 DSL 只是做 transformation,把 MyMatrix DSL 轉成 C++ 而已,錯誤資訊的轉換是恨重要的,有用過 lex/yacc 的人可以回憶一下,在寫錯 lex/yacc 的程式時,lex/yacc 的 codegen 程式有時不會知道,它們只能根據預先的條件去轉換成 C 語言,當送給 C compiler 時才會 compile errors,此時使用者該如何從這樣的錯誤對應回 lex/yacc 的錯誤呢?當然最好的方式是,使用者不必以 codegen 後的角度去找尋錯誤,而是直接面對他們寫的 DSL 程式去找錯(像是 lex, yacc 程式碼、MyMatrix),同樣地,debug 也是面臨同樣問題,lex/yacc 雖然在code generation 時會把對應的行號、檔名寫到產生出來的 .c 檔中,但用 C debugger 回頭看到的卻是 FSM 和 LALR 的程式,個人認為使用者是很容易迷路的!
  3. 中期
    維護,像是文件、社群資源等都是需要長時間投入的。
  4. 長期
    想必該是面對改版相容性問題時候了!

DSL 的形式

從 DSL 的實做方式以及它怎麼跟其他語言合作,我們可以大致上分成下面幾種,並且從設計、實做與使用上來討論一下:

  1. Fixed, separate DSLs
    這是最常見的一種形式,DSL 擁有自行一套的 tool chain 甚至執行環境,例如 SQL 。這種形式的 DSL 最大的問題是很難跟其他語言進行良好的整合,可能是語言特性(static vs. dynamic)、執行方式(compiler vs. interpreter)、執行環境的差異、tool chain 等因素造成。即使是可以透過一定的手法把 separate DSLs 轉為 embedded DSLs,但仍不是很方便。而 DSL 實做上呢?從頭到尾打造一個 DSL 是很曠日費時,而且成本極高的一件事,更不要談說相關的開發環境。簡單的說, DSL 和他要合作的語言間太鬆綁了(loose coupling),loose coupling 有時不是件好事。
  2. Embedded DSLs
    另一種方式是我們可以在 GPL 中定義相關的類別、函式去包裝 DSL ,讓開發過程中,DSL 與 GPL 是緊緊地包在一起的,這聽起來比 separate DSLs 好,但是根據實做出的合作方式,卻可能比 separate DSLs 好不到哪裡去,舉個例子來說,很多 database 都會有不同語言的 interface library 供開發者使用,PostgreSQL 有一個 C++ 介面的函式,叫做 libpgxx ,它與 PostgreSQL 連接的方式是:
    int playWithDb() {
        connection Conn( "dbname=test" );
        {
            work Xaction( Conn, "DemoTransaction" );
            result r = Xaction.exec( "DELETE FROM " + Table + " WHERE ID=" + ID );
    
            for ( result::size_type i = 0; i != R.size(); ++i ) {
                Process(R[i]["lastname"]);
            }
        }
    }
    或是看個 C++ 與 TCL 的整合:
    void hello()
    {
         cout << "Hello C++/Tcl!" << endl;
    }
    
    int main()
    {
         interpreter i;
         i.def("hello", hello);
    
         string script = "for {set i 0} {$i != 4} {incr i} { hello }";
    
         i.eval(script);
    }
    不難發現這種倚賴參數、字串來執行 DSL 的方式讓我們失去了機會去做一些事情:
    1. express domain-specific optimization
    2. domain-specific error report:  syntax error 和 debug 是我認為尤其重要的,像是 compile time 的 error/constraint enforcement !
    3. domain-specific syntax
    不過幸運的是,有另外一種方式可以讓我們從 GPL 中衍生 DSL ,那就是 metaprogramming ,雖然不是每種語言都有這種特性,也不是擁有這種特性後就能一切完美。以 C++ 來說,我們可以透過 template metaprogramming 做到 code generation 和 code optimization ,甚至透過 C++ 型別去做部份的 error report/checking。但大部分時候仍是補強而已,很多 domain-specific 的事還是得推延到 run time。這邊想示範一個簡單的 C++ metaprogramming 利用型別實做 constraint enforcement 的概念,那就再次請出 Matrix 來當例子,這次我想針對維度做出 constraint enforcement ,那我們可以把原本的實做改成像下面這樣:
    template <int RowT, int ColT>
    class MyMatrix {
    public:
        friend MyMatrix operator +( const MyMatrix& lhs, const MyMatrix& rhs );
    
        MyMatrix();
    
        int operator ()( int row, int col );
        vector<int>& operator []( int row );
        template <typename T>
        MyMatrix& operator =( const T& );
    
        static const int RowDimension = RowT;
        static const int ColDimension = ColT;
    
    private:
        vector< vector<int> >   data_;
    };
    注意到沒有,我們把維度的概念帶入型別之中,那麼下面的程式碼, 
     
        MyMatrix<10, 10> m1;
        MyMatrix<2, 2>   m2;
    
        cout << m1 + m2 << endl;
    便可以在 compile time 丟出錯誤,下面是 VC 2005 的錯誤訊息:

    error C2679: binary '+' : no operator found which takes a right-hand operand of type 'MyMatrix' (or there is no acceptable conversion)

    但是細心的你注意到了嗎?即使我們把錯誤拉前了,但這樣的錯誤訊息並不是跟矩陣有太大關係,如果能丟出

    incompatible dimensions

    是不是更好呢?在 GPL 中,我們有時是很難做到完整的 domain-specific error report/checking 的 。再者,並不是每種 constraint 都適合以型別的方式表達,一來可能造成 template parameter 數量爆增,這可能增加 compile 時間,二來也暴露太多細節在 client code 中,這會讓程式碼難以擴充維護。
    雖然用了 C++ template 當例子,不過值得提一下, template haskell 似乎也很有趣,許多 functional language 都可以一些語言擴充!
  3. Modularly composable DSLs
    腦子很小的我,只想出前面兩種,這第三種形式是 Generative Programming 一書提出的,它強調的是在語言的基礎建設(infrastructure)完善皆備的情況下,去開發語言的 plug-in ,說來神奇,其實不會, C/C++ 的 preprocessor 或是更古老的 Smalltalk 和 CLOS 都是這種概念的雛型。只是它們未能在 domain-specific 的需求上達到更好的精細度。或許看到這裡,你會有跟我一樣的一個疑問:那 Modularly composable DSLs 與 Embedded DSLs 有什麼不同呢?聽起來都是建構在既有語言之上,其實這中間有個隱微的差異,可以細細體驗一下:

    Embedded DSLs 的根基是現有語言的 syntax,而 Modularly composable DSLs 則是做 syntax extensions。

    這句話代表的是,Embedded DSLs 的使用是類似於使用 GPL 的 library 或是 framework 的,其 syntax/semantic 跟原本 GPL 是一樣的。但 Modularly composable DSLs 是構造在 GPL infrastructure 之上,除了既有的 syntax/semantic 外,我們還可以增加 domain-specific 的 syntax/semantic ,甚至是刪去、捨棄既有的。若是想更細部條列兩者的差異,或許可以參考 Generative Programming 所條列的,Modularly composable DSLs 可以比 Embedded DSLs 做到:
    1. Syntax extensions
    2. Semantic extensions or modifications of language constructs
    3. Domain-specific optimizations
    4. Domain-specific type systems
    5. Domain-specific error checking and reporting
    再回到 language infrastructure 上, 我們有什麼辦法可以操作 language infrastructure 呢?有幾種可能性:
    1. Preprocessor
    2. Metaprogramming
    3. Modularly Extendible Compilers and Modularly Extendible Programming Environments
    前兩者在許多語言上已經可以做到,正如前面提到的 C/C++, Smalltalk, Haskell 和 CLOS 都行,只是做的不夠好。因為這不只是語言本身支援的問題,還牽扯到 tool chain 與環境。至於第三種,則可以參考 Charles Simonyi (是的,就是微軟的那位大師,匈牙利命名法、WYSIWYG document 發明者、 Word 之父)的研究 – Intentional Programming 。大師在 Microsoft Research 以及後來開設的 Intentional Software 公司都可以找到這方面的發表與研究成果,研究開始得很早,約莫在上個世紀的 90 年代初,未來有時間,希望能玩玩看再來跟大家分享一下!

結語

這篇文章真是超長,內容又很空洞,可是我打了兩天,大概是我在低潮吧…不過還是想跟大家分享一下幾點:

  1. Compiler is your friend!
  2. Constraint enforcement is your friend!
  3. Compile-time error report/checking is your friend!
  4. The last but most important point, C++ is your friend!

歐萊禮書籍特價,三本以上 75 折

image

學弟的版看到了,趕快來廣告一下,雖然都是中文書,不過掛著 O’Reilly 至少不會太差唷,是不是要開團了!

http://www.books.com.tw/exep/activity/activity.php?id=0000017976&sid=0000017976&page=291

目前看上了:

  1. 深入淺出物件導向分析與設計
  2. Linux 核心詳解
  3. Linux 驅動程式(這有電子版

聽說還不錯的:

  1. 讓事情發生--專案管理之美學,第二版
  2. 軟體預先架構之美學
  3. 程式設計師提升生產力秘笈
  4. 操作介面設計模式

推薦的:

  1. UML 2.0學習手冊
    不知道有沒有特別有名,沒有特別針對哪種軟體工程方法論做介紹,單純講 UML diagrams ,感覺很清爽易讀!
  2. 深入淺出-設計模式
    很經典的書,不過看久了覺得很囉唆,唉,我真是難伺候!
  3. 深入資料庫之美學
    有點深,害我都放在書架上!

入門的、可當工具書的:

  1. 建構嵌入式Linux系統
  2. Python 學習手冊
  3. 精通CVS
  4. 防駭超級工具
  5. 防駭戰士
  6. GNU Make 專案開發工具

觀望中:

  1. 美麗程式:頂尖程式設計師的思考方式
    在成大圖書部翻過,覺得都是淺嘗則止的帶過一些東西。
  2. Linux 系統程式設計
    看了目錄,感覺有更好的選擇!
  3. 輕快的好 Java
    在成大圖書部翻過,不過內容已經忘了,沒有什麼印象,但好像有提過一些觀念 -_-||
  4. Java I/O 技術
    有點舊!
  5. 超越Java:探討程式語言的未來
    蠻有趣的書,不過論點似乎有點 ooxx ,是本可以戰起來的書!

考慮去書店翻翻的或是有人要借我翻閱嗎?

  1. Java 效能調校技巧
  2. Java Data Object 深度探討
  3. Java 虛擬機器
  4. Java Threads

在 blog 上貼 YouTube

網友 Alvin 最近詢問怎麼在 blog 上嵌入 YouTube 一類的元件,所以就來跟大家介紹一下,順便騙騙文章數,掩飾一下自己江郎才盡了…

步驟一

YouTube 之類的服務都有提供物件語法給大家複製到自己的網頁上,參考下圖可以看到網頁有一區標示著嵌入

ScreenHunter_01 Mar. 18 21.28

步驟二

滑鼠移過去,還會發現有自訂的功能。使用者可以根據自己的需求調整,調整後,就是把 <object> …開頭的語法複製起來。image

步驟三

開啟自己 blog 文章編輯的 html 模式,以 WLW 為例,就是切換到程式碼模式。 接著就勇敢的貼上吧!

ScreenHunter_04 Mar. 18 21.55

成果

最後,就可以看到成果了!

其他

其他像是 mp3, quicktime 等格式的多媒體資料,基本上只要 host 有提供 object 來嵌入,都可以在網頁上產生美美的元件。

結語

ㄜ,感覺教學最後就要來個結語,那就: Yes, We Can!

長尾效應(The Long Tail)

為了為裝成統計達人,上上一篇文章用了長尾效應,不過馬上就被 Royce 大戳破,解釋得零零落落,還好 Wesley 馬上挺身救愛徒6TRYWO4km 12DJLfVSRV2OcUpK4=

不過還是來解釋一下什麼是長尾效應,我想最常聽到的例子就是 Amazon 吧?!有人研究了 Amazon 賣的書和銷售排名關係後,發現銷售排名低的書即使不熱門但為數眾多,累積起來的銷售額還大於熱門書籍!

或是更簡單、更流行的說法就是:

BeatTen

舉個例子來說:

Keiko 只有 Royce 萬分之一的戰鬥力!可是我有千千萬萬個 Keiko ,然後 Keikos 就打贏了 Royce…

不是小兵立大功,是小兵們立大功!所以注意到沒,Keiko 要用複數型!

接著就開始很多人用這個詞了,像我這種常上網的阿宅,每天在一堆的 Web 2.0 應用或是趨勢研究中都會看到它,有時候看到的次數比我當天寫出來的 bug 還多…


唉,不過我是那種很難相處又反社會的人,這種詞看多了就會有股莫名的火燒上心頭!然後我就開始幻想一種對話:

猩仙人:前輩,為什麼你都這麼早開始對程式最佳化?
偽前輩 Keiko:你不知道嗎?80-20 落伍了,長尾正夯!在 80% 的 code 做最佳化搞不好會比你在 20% 的程式做最佳化來的有用唷!
猩仙人:又學到一招了,前輩,我好崇拜你唷!(筆記、筆記)
Royce:<囧>
mobo:Keiko 毀人不倦!

心存歹念,會有報應!

今天幫友 team 的客戶跑 beta 程式,馬上就遇到一個問題,我不是那種很會找 bug 的人,事實上也還在等對方驗證是不是 bug ,可我腦海中就想到一句話:

當你看到一隻蟑螂,表示還有一百隻;
當你看到一隻bug,表示…

然後,回家報應就來了…

DSC05499


有 dump 耶,我應該看嗎?

螢幕解析度統計

最近換了新版型,發現文章區的版面大小竟然跟油價一樣是浮動的,讓我在小黑的 1024 x 768 螢幕上看到很多圖都被截掉了,這就表示很多看我 blog 的人(其實沒有很多人看,科科…)都會有同樣的狀況,原本還想發個文問問大家的意見,沒想到 google analytics 竟然幫我統計好了!

ScreenHunter_02 Mar. 03 23.26

然後又很無聊的看了一下,原來我的 blog :

  • “CreateProcess” 最熱門啊!那李組長眉頭一皺,揪竟,地球一天會產生多少 process 呢?
  • “我要變胖”用 google 去 search 排名還是 8,看來 google 不太準唷 –_-||
  • “黑暗之路”,這真是什麼鬼,我的文章好像沒出現過這段字,難道是黑暗騎士被斷詞找到了?

image

科科,接下來就是拜 ubuntu 和 mysql 兩套 open source 之賜了,對了,還要感謝 Alvin 老師讓我管實驗室主機、mobo 決定用 ubuntu + mysql!果然痛過就是要留下痕跡,這樣人家才不會再痛一次 >_<

image 

最後感謝各位的流量貢獻,我的 blog 流量四分之一來自你們的網站!(從我退伍開始 10/13 ~)

image

天啊,小路學長後勢看漲唷!(最近一個月)

image


Kane 哥,加油,好嗎?

Windows Debugging – Kernel Debugging with WinDbg and VMWare

看到 Royce 大師開始把 Nt Insider 的精華實用文章分享給大家,讓向來只有三分鐘熱度的我,也想硬著頭皮寫點東西,不過我是初學者,就從最最入門的、簡單的開始寫起吧,啊啊,希望不要變成富奸

前言

mini_wininternals

Windows Internals 這本書是許多人進入 Windows 的第一本完整教科書,目前出到第四版,不過我一直懷疑大師 Mark E. Russinovich & David A. Solomon 被富奸上身,因為第五版已經推延了好幾次,目前看來會在 2009/05/20 上市,這次希望是真的。

Windows Internals 第一章介紹了許多工具包來幫助我們瞭解 Windows Kernel ,其中 Debugging Tools for Windows 中的 WinDbg 尤其重要。透過它,我們可以去逐行執行、trace 、反組譯 Windows Kernel。

Debug Windows Kernel 可以是 live (debug 自己)或是 remote (需要兩台 Windows),不過還是 remote debugging 提供了比較多的功能和彈性,傳統上,remote debugging 需要兩台電腦透過

  1. null-modem cable: 也就是 serial port ,一般電腦的 COM port。
  2. 1394
  3. USB 2.0

啊,不管怎麼看兩台電腦總是很麻煩,不過幸好現在有 VMware 可以用了。把 VMware 上跑的 guest OS 當作 debugging target,在上面開啟它的 debugging port ,而提供 VMware 的 host os 則執行 WinDbg 。

VMware 設定

  1. 安裝完後,開啟 guest OS 的設定。 
    ScreenHunter_02 Mar. 01 12.24
  2. 新增一個 Serial Port 的硬體裝置。 
    ScreenHunter_03 Mar. 01 12.26  ScreenHunter_04 Mar. 01 12.27
  3. 使用 Named Pipe 去模擬 Serial Port 裝置。
     ScreenHunter_05 Mar. 01 12.29
  4. 替這個 Pipe 命名,這個名字稍後會被 WinDbg 用來作為連線的名稱。
     ScreenHunter_06 Mar. 01 12.31

  5. 最後別忘了把 Yield CPU on Poll 選項勾起。
     ScreenHunter_07 Mar. 01 12.33

Windows Boot 設定

設定完 VMware 後,接著要設定 debugging target 也就是 guest OS 的開機選項。也就是 boot.ini 檔。修改前請先備份一下!boot.ini 是系統的隱藏檔,要看到它,要到資料夾選項中把下面兩個選項關掉:

  1. 隱藏保護的作業系統檔案
  2. 顯示所有檔案和資料夾

路大師補充:boot.ini 有可能是唯讀檔,若遇到不能修改的情況,請記得把唯讀的屬性拿掉!

ScreenHunter_08 Mar. 01 12.39

看到 boot.ini 後,在 operating systems 的選項多加一個:

multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - Debug" /fastdetect /debugport=com1 /baudrate=115200

要注意的是:

  1. debugport 的名字要跟你在設定 VMware Serial Port 時給的名字一樣才行。
  2. baudrate 可以任意調整成你想要的速度。

ScreenHunter_10 Mar. 01 12.45

重開機讓 boot.ini 生效。這時會發現開機多了一個選項(如下圖),這就表示成功了。

image 

使用

最後,在使用 WinDbg 時,可以在 cmd 下這個指令:

windbg -b -k com:pipe,port=\\.\pipe\com_1,resets=0

這樣 WinDbg 就會嘗試連透過 com_1 這個 debugport 去連上 debugging target 。成功的話,應該會看到像下面的圖:

image

 

參考資料

  1. Debugging Tools for Windows
  2. Driver Debugging with WinDbg and VMWare

更新

  1. 2009/03/01 13:02 原文
  2. 2009/03/01 22:28 加上小路學長補充的 boot.ini 檔唯讀的設定。

Keep hacking, and enjoy it!

MiniFilter InstanceSetupCallback is not called?

一般來說,MiniFilter 的 InstanceSetupCallback 會在 filter manager 把 minifilter attache 到 volume 後呼叫。如果沒有的話,可以檢查一下 minifilter 的 INF 是否把 instance fla...