星期二, 12月 29, 2009

WBR-G54 install Tomato Firmware

看到 D-Link DIR-300分享(DD-WRT改機篇) 獲得如此高的效能,激起我更新手邊舊型的WBR-G54念頭。
查了一下不少人說dd-wrt沒有Tomato穩,雖然說Tomato只支援Broadcom晶片的無線基地台,剛好WBR-G54在支援之列。

I saw D-Link DIR-300分享(DD-WRT改機篇)  obtained very good performance, inspired me to install third party's  firmware on my old WBR-G54.
Some people say that dd-wrt is not as stable asTomato, although Tomato only supports Broadcom chip based wireless access point, WBR-G54 is one of the supported model.

星期四, 12月 17, 2009

移除國內廣告

國內的BlogAD與BloggerAD掛了2年一毛錢都拿不到,因此決定本網誌只留下GoogleAD,在此公告之。

星期一, 12月 14, 2009

自製Chrome Extension之我也會/ AV-Tokei Chrome Extension

由於某位很低調的學弟一直鼓吹Chrome Extension,所以今天花了半小時看了一下;似乎不會很難寫,剛好又看到上官神人貼的大人的美人時計avtokei,就簡單試做成一個extension。

I followed Hello World wrote a AV-Tokei Chrome Extension as an exercise.

簡單地說,就是照著Hello World的內容,再改寫自己的popup.html。目前這個av tokei就是點下去出現目前時間的美女圖,原網站是日本當地時間,我是盜連它的圖,應該沒幾天就不能連了,哈!
To put it simply, I only rewrite popup.html. You can download the crx here.
下載網址:這裏

其實我是希望能做出一個自己用的簡繁轉換,因為還沒看完Tutorial,所以先做一個垃圾玩玩。

Update: 似乎有朋友誤會我的意思,重點在可以自製,而不是盜連圖片呀!因為再增加DigGirl extension示範。

星期四, 12月 10, 2009

Convert from vmdk/vhd to VDI format 將vmdk/vhd轉換為VDI格式

上網找到的都是舊資料,現在不再需要vditool或qemu,直接利用VirtualBox附的VBoxManage就可以轉換虛擬硬碟的格式。

把vmdk或vhd轉成vdi的指令:
VBoxManage clonehd source.vmdk target.vdi --format VDI
--format是指target的格式,source的格式似乎會自動判斷

Your are no longer needed to use vditool, the tool "VBoxManage" comes with recent revision VirtualBox.
Just type the command:
VBoxManage clonehd source.vmdk target.vdi --format VDI
- format refers to the target format, source format seems to be automatically determined.

VirtualBox Command Line Management Interface Version 3.1.0
(C) 2005-2009 Sun Microsystems, Inc.
All rights reserved.

Usage:

VBoxManage clonehd          | 
                            [--format VDI|VMDK|VHD|RAW|]
                            [--variant Standard,Fixed,Split2G,Stream,ESX]
                            [--type normal|writethrough|immutable]
                            [--remember] [--existing]

星期三, 12月 02, 2009

某醫院的掛號系統 A registration system crash picture

由於某位不要我說他很帥的學弟表示,寫英文Blog可以增加英文程度,因此開始練習雙語blog。

昨天看到某間醫院的掛號系統當機,拍張照留念。
I saw a registration system crash in a hospital yesterday, thus I take a picture souvenir.


星期二, 12月 01, 2009

木馬,你實在太強了

  今天早上覺得網路比較慢,連到 pfSense防火牆用bandwidthddarkstat看流量,發現某台電腦的上傳流量高得驚人(是的,敝公司很窮也很省,所以沒有可以monitor網路的switch),占了全公司上傳流量的90%。

  用XP的nbtstat -A [ip],找出是公司的工讀生用的電腦,此時在下敝人小弟我,連忙拿出Process ExplorerActive PortsWireShark來監控,想當然爾光靠Process Explorer是找不出東西,但是很明顯在Active Ports有不明的程式在送出網路流量。這支木馬很聰明,只要keyboard和mouse有在使用就不動作,等到停下來時才開始送出封包,所以使用者雖然覺得電腦變慢,卻不會覺得慢到無法忍受。

  此時我只能用IceSword來找出這支木馬,不過由於有千人斬實力的工讀生要先備份資料,所以抓毒的事明日請早。

星期五, 11月 20, 2009

給微軟的建議:IE6 theme

因為IE9的預告,最近很網路上很多朋友又開始談IE 6。

我覺得微軟要負最大的責任,為什麼呢?其實低階使用者若不肯換瀏覽器,大都是因為介面使用的習慣。其實只當初若把IE 7做出個 IE 6操作模式的 介面切換(theme)並設成預設值,Windows Update下去也不會知道呀!

當然這是不考慮舊的DHTML方式設計的網頁,嘿嘿。不過在下就真的遇到不少人,是因為介面而不肯升級,Vista/Windows 7亦然,微軟應該還原出XP theme給食古不化保守的使用者呀!

星期四, 11月 12, 2009

Tekram DC-390 U4W的driver:mptscsih

  又是一篇個人日誌,再用到的機會不大...

  今天浪費些時間在找Tekram DC-390 U4W的driver,原因是一台舊的Linux Server硬體有點問題,開始會不正常當機。本來想Linux不太會挑硬體,隨便找一台機器就可以裝,於是把檔案系統修一修就用TrueImage備份起來,再還原到一台DL380 G2上。

  這台DL 380 G2上的SmartArray 5i常會抓不到,因此就拿手邊一張DC-390 U4W SCSI卡接兩台舊的SCSI 73GB硬碟。因為以前自己有一張DC-390U,以為還是用sym53c8xx的driver,而且DC-390 U4W上頭有個風扇,所以也看不到晶片資訊(別叫我插到XP的PC上,我手上也沒有driver光碟,還要拆機太麻煩了),就一直誤以為是sym53c8xx,結果一直kernel panic開不了機。

  後來在噗浪上問人,強人蘇老雖然沒在玩Linux但告知DC-390 U4W已經不是53c8xx,晶片換成LSI 53C1030,於是找了一下看到這則新聞才知道要找Fusion-MPT的driver,Linux上叫做mptscsih,需要mptbase。(其實LSI 53c1030的網頁有提到,但在第一個tab的最下方,我沒注意到)

若是用FreeBSD,在GENERIC檔有寫LSI Logic MPT-Fusion就叫mpt,而我原來用的sym53c8xx是sym,若是Tekram DC395U/UW/F DC315U 則是trm (FreeBSD真是簡單多了)

由於舊Server是很早期的Linux 2.4,原來的kernel也沒有mptbase,再去抓2.4.37.7,沒想到還需要gcc 3.x版才能編譯,於是又抓了gcc 3.4.6(因為我手賤升級到4.4.2),繞了一大圈才成功把舊系統搬到DL380 G2上。
編譯核心請參考: http://linux.vbird.org/linux_basic/redhat6.1/linux_10kernel.php 和 http://www.jollen.org/blog/2006/05/kernel_26.html
因為是2.4版,所以我的步驟如下:
cd /usr/src/linux-2.4.37.7
make menuconfig
make dep
make bzImage
make modules
make modules_install
make install
最後要小抱怨一下,HP Smart Array 5xxx的driver怎麼會放在"Block Devices"的分類下?"Fusion MPT device"又是另一個分類?應該是我太遜了,實在是沒有頭緒呀~

星期二, 11月 10, 2009

找出SQLServe某個Database裏每個table的使用量

印象中在下用的某個架站機有Log功能,剛才發現DB成長到500MB,但是忘記是哪個table在Log,於是找到Script to analyze table space usage,找出此資料庫中列數最多或使用磁碟容量最多的table,就可以解決。

Update: 強者 evi1[c] 在回應中提供了他的SQL,語法精簡效率超高,我已改用他的版本,特此誌謝。

星期三, 10月 28, 2009

又遇到arp病毒

最近敝公司網路偶爾會斷,有些人連不上file server,在下當時就懷疑有人中arp病毒,但是因為剛好NOD32 4.0造成File Server死當,所以無法確定。

前兩天在下把File Server的防毒換另一家的產品,但每天到下午五點左右就有某幾台小hub會掛點,造成某幾位同仁網路中斷。今天到機房檢查一台故障的server時,機房的值班人員說昨天機有hub當掉,造成相關企業的服務中斷。在下檢查正常的Server有看到IP衝突的訊息,可見在網路上有機器中arp病毒,造成網路上大量封包,才會讓小hub當機。

目前看起來只有改變網路架構才能解決,而這已經超出在下的權限了呀呀呀呀.....

星期三, 10月 21, 2009

星期四, 10月 15, 2009

卡皇沒啥鳥用

看到這則新聞原本嚇一大跳,以為有什麼驚人的技術,後來再看到NOWnews才知道只能破WEP,最近幾年的無線基地台都是WPA以上的加密方式,再加上大部份的人都知道要鎖網卡MAC Address,真正拿在路上也很難找到可用的訊號呀...
另外一點,要一般使用者用Linux光碟開機,實在是辛苦了點...


參考資料:黃金版卡皇終結版 (找到"原廠"資料了)
[技術] 什麼是卡皇? 為什麼它可以破解無線網路密碼? 我要怎麼預防被入侵?

星期五, 10月 02, 2009

JCIFS NTLM HTTP 認證設定範例

今天試了Railo,接下來要設定NTLM認證,Google JCIFS NTLM 範例,第一筆居然是小弟的Blog... 看來沒有別人貼出來。

開源免費的ColdFusion伺服器 Railo/Open BlueDragon/Smith

敝公司有一套舊版的ColdFusion,現在準備換掉這台伺服器,但是找不到原來的安裝片。

若我沒記錯,ColdFusion是Java寫的,找了一下發現兩套開源的ColdFusion Clone。

星期二, 9月 29, 2009

外行人升級Linux核心 2.4->2.6

因為在下希望把某台"很舊"的Linux伺服器換到新的硬體,所以也很貪心的希望能把2.4版的kernel更新到2.6版。

外行人編譯GCC

因為手上有某台很舊的伺服器,想要在上面編譯某個程式執行,無奈GCC版本是2.96編不過,於是興起自己編譯gcc的念頭。原本還想更新GLIBC,看了一下Glibc 2 HOWTO 中文版使用源代码将 Glibc 升级到 2.6就暫時打消念頭。

星期一, 9月 28, 2009

Putty的successor:KiTTY

話說在Windows下最佳的SSH Client一般公認是PuTTY,但是PuTTY已經兩年沒更新,而且最近的更新也都只是安全性修正,沒有功能性的更新。PuTTY缺少懶人最需要的記憶密碼;雖然說以資訊安全的角度而言,記憶密碼是非常危險的事,但對於多數連線軟體這是不可或缺的功能。

星期六, 9月 26, 2009

在Mac OS X 10.6 開啟原生NTFS讀寫支援

看到10.6限定 - 開啟原生NTFS讀寫支援,馬上就來測試。
因為前幾天再裝了Paragon NTFS for Mac測試版,連忙再去下載dmg檔,利用裏頭的Uninstaller反安裝,執行完會要求重開機,幸好有成功移除。

先去下載NTFS Mounter安裝,但不知為何執行時沒有問我的密碼,因此也並沒有幫我新增或修改 /etc/fstab。

後來關掉NTFS Mounter自己手動 sudo vi /etc/fstab,幸好試一次就成功,寫入和中文等都沒什麼問題。再切換到64 bit kernel開機,一切仍然正常。

不知道是有穩定性問題還是版權問題才沒有預設NTFS write支援?真希望Apple說明一下。

註:原文有點小錯誤,只要umount再重新mount就會生效,不需要重新開機,這可是Mac呢^_^

星期四, 9月 03, 2009

星期一, 8月 31, 2009

Panasonic 42吋Full HD液晶顯示器 TH-L42B12W 開箱文

家裏十年高齡的舊電視忽然無法開機,有時候拔掉插頭放個一天又可以看,為了眼睛健康(謎之音:藉口)決定不送修換一台LCD TV。 很可惜燦坤的特賣會剛過,沒辦法像VB超人一樣抱一台超便宜的Sony LCD,只好退而求其次選了這台 Panasonic 42吋Full HD液晶顯示器 TH-L42B12W。


舊的Sony 26吋特麗霓虹,掰掰!


42吋LCD也不輕,放在我小小的客廳看起來大小剛好

Mini DisplayPort to HDMI 開箱文

因為某種黑暗原因,在下忍不住去買了Mini DisplayPort to HDMI



以上是我在家裏用的轉接線,由左而右是HDMI to DVI、Mini DisplayPort to HDMI、Mini DisplayPort to DVI

星期三, 8月 19, 2009

暮光之城(Twilight)電影閱後感

因為種種理由,將近一年的時間錯過不少好電影,因此有空就去借一些DVD回來看。

首先,照慣例一定要說滴,以下有大量劇情,未看過電影/小說者會影響看影片時的快感;且由於本部落格是宅男寫的,當然就是以宅男觀點出發,女性讀者請斟酌。

鳥毅很愛看科幻片與鬼片,所以有名的吸血鬼電影大概都看過了。我看過覺得最沉悶的一部吸血鬼片就是Bram Stoker's Dracula(台灣譯名:真愛不死--Dracula),那部是以Bram Stoker的原著為基礎使用唯美手法拍攝,讓我想到香港的楊姓三級片導演,不過似乎女姓觀眾反應還不差。

(圖來自官網)
暮光之城運鏡手法仍然是唯美,但是劇情起伏大,又是高中校園愛情片,最後再來段精彩的追殺,算是以男性角度來看也不差的影片。型男加上不是美女的組合,總是讓女性觀眾為之瘋狂(別忘了偉大的票房冠軍鐵達尼號),這是很成功的商業片。

純以電影中陳述的故事來說,算是相當地老套,個性怪怪的女主角喜歡上酷酷的型男帥哥,結果帥哥是吸血鬼,而且帥哥無可自拔地被女主角吸引住。看了十幾分鐘我就確定這是女性影片,當時還不知道作者是誰,但我心裏就在想一定是女性寫的小說;如果是以男性主導的影片,一定大量加入色情與暴力,至少也要在校園裏多加幾個性感暴露的辣妹:P,若我是導演可能會找個像Lindsay Lohan的豐滿女主角(逃~)。

總而言之,這部片還滿好看,很適合用來把妹,年底第二集上映時,別忘了帶女友(或想追的女生)去看。

參考:暮光之城台灣電影網站 暮光之城官方網站

星期二, 8月 11, 2009

750GB硬碟掛點

今天回家就發現一顆13個月大的750GB硬碟掛點了,怎麼接BIOS都無法找到,明天到公司再看能不能再活過來,我可憐的火影和秘片呀....

看型號是ST3750330AS,Firmware是SD15,似乎是傳說中韌體有問題的硬碟,我慘了
(To be continued ...)

星期五, 7月 31, 2009

在Server 2003 x64上安裝GPMC

最近因為Domain Controller太老舊,就找台新PC重裝Server 2003 x64 R2,沒想到GPMC(Group Policy Management Console) 裝不起來。

原因是GPMC需要.net framework 1.1,鳥毅勉強在Server 2003 x64上裝起.net framework 1.1,也把GPMC安裝進去,但是在執行時仍然有錯誤訊息。

經過一番google後(對,現在google是動詞,表示search),找到Using GPMC (Group Policy Management Console) on Windows 2003 x64,原來還要把rsop.msc 複製到 %systemroot%SysWOW64 ,而且只要用Orca改gpmc.msi就可以不用安裝.net framework 1.1。此外,我並沒有 gepedit.msc ,不知是不是作者對gpmc.msc的typo呢?

星期三, 7月 29, 2009

程式設計師提升生產力之秘笈讀後感

昨天抽空到信義誠品逛,無意中看到程式設計師提升生產力之秘笈,雖然我的工作沒有寫程式,還是好奇拿來看一下。

作者Neal Ford是ThoughtWorks的員工,一位專業顧問。基本上,這本書花了很多的篇幅在介紹各種作業系統(Windows、Mac與Linux)上的快速啟動程式與快捷鍵設定。當然也少不了編輯器/IDE的介紹。這本書在快速鍵的部份對我的幫助並不大,大部份的觀念和技巧都和我用的差不多,但我比較好奇快銀(QuickSilver)的神奇功能,得抽空仔細的玩玩。

Neal提到質疑權威是我覺得最猛的一章,他還提到Java上很多過度工程化的例子,對於許多愛寫framework的人的確是當頭棒。我覺得和沒有銀子彈(No Silver Bullet)同樣是程序員必讀的文章。

還有最重要的一點,降低干擾,所以快關掉你的Plurk和MSN吧 XD

星期二, 7月 28, 2009

數位恆溫瓦斯熱水器開箱

咳,最近都在花錢。

家裏的熱水器用了快十年,最近天氣熱,洗澡的熱水也變得熱到不像話;我自己是直接洗冷水,但家中其他人就受不了。於是向網購專家VB超人詢問,電熱水器可能會獲得高額的電費帳單,而且還必需要拉220V的電線,最好的解決之道就是換一台恆溫瓦斯熱水器。

其實也沒有太多的選擇,因為頂多兩間浴室一起洗,不用太大容量。依照VB超人的建議,選擇日本國花牌12公升的強制排氣數位恆溫熱水器,於是找了網路上唯一有現金折價的店家買,隔天就安裝,所以今天就請假在家等。

原本是訂上圖這台,但是後來看到

星期一, 7月 13, 2009

賣Notebook用DDR3 1GB兩條(已賣出)

賣兩條Notebook用DDR3 1GB,從Macbook Pro 13吋上拔下來的原廠RAM,只有開機使用10分鐘。廠牌是SAMSUNG。



隨便出價吧,不要太誇張我就隨便賣了。

Update:刊到Yahoo拍賣了。
再Update:在歪拍賣掉了。

星期日, 7月 05, 2009

不專業之重構心得分享

最近有位同事和我聊到他做的幾個案子,都略有差異,但因為這些差異讓原來的程式一改再改,很難共用。
這正是重構存在的真正意義呀!

最簡單的重構是從Rename Varibale和Rename Method開始,接著熟練後便開始Extract Method,進一步則是Pull Up、Push Down,再來則是Generalize Type。

我自己做時只有兩個原則:異中求同、同中求異。

異中求同是指在不同的method裏找出相同的區塊,萃出成一個method或是公用class(例如有關數值運算、轉型、中文數字等等);或是不同的class中找出相同的行為,extract為有相關的class pattern(例如Factory、Abstract Factory等pattern)。

同中求異是指在複製貼上的動作後,找出相同的區塊做Extract Method,若有許多子類別則可以Pull Up,諸如此類的應用。

所有的書都寫得類似,重構就像開車,一點一點地修正方向盤,慢慢地就安全抵達目的。個人的經驗是每天都寫code,經過幾年後就會不知不覺地學到重構的方法。

這只是在下不專業的看法,正統的重構技巧請看重構:改善既有程式的設計 (二版)

P.S. 我不擅長Web重構,高手jaceju有篇非常優秀的簡報

星期三, 7月 01, 2009

今天早上做的怪夢

從小就夢想成為專職的程序員,結果昨天夢到進入一間名為Roogle的公司,辦公室在地下室。
在Roogle必須從實習生幹起,非常辛苦,每個同事都是天才。夢中唯一出現認識的人是一位前公司的朋友,他原本就是天才型的人。其他的同事都是邋遢到不行的超級宅男,帶我介紹公司的是一位身高180cm,約40歲出頭的鮪魚肚男。

在Roogle的第一個任務是學Android程式,從source看起,接下來要靠自己的想像力,寫出一支Android應用。
再看這個應用的好壞,決定去留,所以每天都工作16小時 (其實我在前公司的頭三個月也是每天工作16小時呀),但似乎體力不濟,覺得很辛苦。

後來被鬧鐘吵醒,因為夢太真實了,特此誌之。

星期四, 6月 18, 2009

Subversion merge後在commit時發生File not found錯誤

最近遇到好幾次Subversion merge後在commit時發生File not found錯誤,和這裏一樣。

可是在subversion Issue 1673裏早就寫Status: Resolved, Resolution: Fixed,令我非常不滿。

原本svn之外的版本控管軟體沒有Visual Studio整合,剛才再查了一下發現Mercurial已經有VisualHG這樣的好東西可用。還有TortoiseHG的加持,決定再花時間測試一下,如果沒什麼大問題,應該就會報告優秀長官,以Mercurial取代Subversion

Update:經過兩天的努力....我放棄了。Mercurial在Windows仍舊有中文問題,這不算是成熟的solution,只好繼續當隨call隨到的服務專員。

星期五, 6月 12, 2009

Chrome設定最小字體(最小字型)大小

最近發現某些網站字體設定得很小,最近又裝了防窺片,完全看不清楚,所以找了一下Chrome設定最小字體(最小字型)的方法,在一個設定檔中。

Vista/Win7在
"C:\Users\使用者帳號\AppData\Local\Google\Chrome\User Data\Default\Preferences"
也就是
"%LOCALAPPDATA%\Google\Chrome\User Data\Default\Preferences"

XP在
"C:\Documents and Settings\使用者帳號\Local Settings\Application Data\Google\Chrome\User Data\Default\Preferences"
也就是
"%USERPROFILE%\Local Settings\Application Data\Google\Chrome\User Data\Default\Preferences"

Linux在 "~/.config/google-chrome/Default/Preferences"

記得先關掉Chrome,再以文字編輯器打開Preferences,尋找webkit的關鍵字,重點是以下紅字這兩行
"webkit": {
"webprefs": {
"default_fixed_font_size": 16,
"default_font_size": 16,
"fixed_font_family": "\u7D30\u660E\u9AD4",
"minimum_font_size": 14,
"minimum_logical_font_size": 14,
"sansserif_font_family": "\u65B0\u7D30\u660E\u9AD4",
"serif_font_family": "\u65B0\u7D30\u660E\u9AD4"
}
存檔就完工收兵。

P.S. 在pfSense或Yahoo!奇摩首頁設成14點可能會造成版面有些問題,設成最小12點相容性比較不容易發生困擾。

星期四, 6月 11, 2009

我看ASP.NET MVC

本篇有很多錯誤觀念,非請勿入。

最近要幫忙做一個小東西,為了和現有企業架構整合,採用ASP.NET開發。
因為很久沒有寫程式,看了一下ASP.NET MVC,嗯,很好,以前學的WebForm控制項完全派不上用場。

(以下誤)
個人覺得SilverLight一定推不起來,所以ASP.NET 4.0開始讓程度比較好的程序員用MVC,程度差的用WebForm。MVC搭配template和jQuery,不但能夠提昇網頁反應速度,也避免因為使用UpdatePanel帶來的奇怪錯誤。

(以下大誤)
可以預見,未來的趨勢是使用ASP.Net MVC開發Web AP,大量依賴AJAX互動(也就是向Google看齊啦...),所以我要趕緊K jQuery了。

星期五, 6月 05, 2009

鳥毅是畜生的代名詞

今兒個因為雨聲太大04:00醒來,看到以下留言通知:
鳥毅是畜生的代名詞 已針對您的文章「另一顆奇異果」留下新意見:

呸!!你個x大xx系畢業的就多了不起??
這兒的內容一點技術水平都沒有,可見作者的水準有多麼低下!!
怎不關了乾脆?
還留著污染網民的眼睛.
垃圾.
這位老兄文筆不錯呀,是對岸來的吧?老兄都沒看清楚,我在Blog標題就有寫"BLOG就是自已寫爽的",是自爽用的,不是介紹技術呀!而且我也不是T大+MIT,真是一整個無厘頭呀...

補充:其實早上我寫到一半就吃包子去了,還有一半沒寫完。
我看到他寫的一點都沒生氣,反而想到禽獸不如的笑話,憑印象大致上如:
一對男女朋友去pub玩,晚上結束後又喝了酒很累,就去Hotel休息。
隔天早上女生醒來就啜泣:「嗚~你這個禽獸,對我做了什麼...」
男生回說:「昨天太累,我什麼都沒做呀!」
女生大怒,生氣地說:「你這個禽獸不如的傢伙!」
所以我寧可當禽獸/畜生也不要禽獸不如呀XD

星期四, 6月 04, 2009

在有TPM的機器啟用VT

一直覺得很奇怪,桌機的CPU明明支援VT,但是xpmode一直說未啟用VT。看了List of Intel Processors that support XPMode,也用SecurAble顯示

,仔細看才發現有個"Click for more"。
因此下載了vt.zip,才發現雖然BIOS有啟動VT,但是卻沒生效!

星期一, 5月 25, 2009

Windows 2003 x64無法安裝之處理

又一篇個人筆記,最近實在沒有生產力呀...

今天用一台桌上型商用PC灌Windows 2003 Server x64,一直灌不起來,調整BIOS裏各種參數均無效。Windows 2003 Server x64安裝程式無法進入安裝畫面,load driver後就BSoD
,連死在哪個.sys都沒有。這已經是我用nLite做出的整合光碟,沒有更新的driver了。

原本用兩顆HD做Raid 1,但似乎有嚴重的問題,不但開機光碟進不去,連TrueImage都只能進Safe Mode,調整回AHCI模式才能使用TrueImage的Full Mode。但是Windows 2003 Server x64安裝程式仍舊是無法進入安裝畫面,幸好有以前同機型的tib備份檔,就使用TrueImage還原到AHCI模式的硬碟。

這件事告訴我們:以後要灌Windows Server,還是買台真正Server吧。(除非灌Linux/FreeBSD)

星期五, 5月 22, 2009

寫.Net程式時慎選專案名稱

小時候我們寫程式時,老師有說過不要亂取變數名稱(誤,我小時候沒上過電腦課),有許多保留字像class等不要用。

今天遇到的非常鳥的錯誤,試著寫一個行事曆,於是把專案名字叫Calendar,變數名稱與Class名稱我都很小心地避開Calendar這種有內建Class的字,但是事情就這麼發生了...

會用Visual Studio寫Asp.net的朋友都知道,Visual Studio會用專案名稱當做namespace,所以編譯時都過了,在有一個叫Site1.master的MasterPage情況下,執行時出現下面的錯誤訊息。
編譯器錯誤訊息: CS0426: 型別 'System.Web.UI.WebControls.Calendar' 中沒有型別名稱 'Site1'
這就是在下喜歡Java的命名方式,namespace都會叫com.foo.xxx。唉,我果然不適合寫code呀...

星期二, 5月 19, 2009

Visual Studio連線到 SQL Server Express 2008問題

故事背景:

某個無聊網管在公司把自己工作用PC灌了Ubuntu玩到膩之後,今年開始裝Windows 7 beta 64 bit,前陣子更新到Windows 7 RC build 7100時發現 SQL Express 2008是32bit,於是移掉改裝為SQL Exress 2008 64bit,結果遇到
連線到 SQL Server 檔案 (mdf) 都需要 SQL Server Express 2005,才能正確運作。 請確認從 URL 下載的元件的安裝:
http://go.microsoft.com/fwlink/?LinkId=49251

過程:

這裏有官方解說,用白話解說如下:老子不讓你用64bit啦,這是進階功能,要用的話拿小朋友來換。是的,有patch但不能下載。

鳥毅不像VB超人的偶像璉璉有免費點數可用,只好摸摸鼻子換回32bit,結果遇到另一個問題:由於無法啟動使用者執行個體的處理而無法產生SQL Server 的使用者執行個體。此連接將會關閉,幸好有解,在XP把
%USERPROFILE%\Local Settings\Application Data\Microsoft\Microsoft SQL Server Data\SQLEXPRESS
目錄刪除就可用,Vista/2008/Win7是在
%USERPROFILE%\AppData\Local\Microsoft\Microsoft SQL Server Data\SQLEXPRESS


正當終於用32 bit SQL Express 2008時,又看到SQL Express 2008 x64 Integration with Visual Studio 2008 SP1,原來國外的高手找到方法(hotfixr)可以直接下載patch。可別忘了啟動Named Pipes呀!

結論:

64bit Windows之路真是辛苦,此時我真的希望微軟能夠學Mac把程式包成一個package直接用呀!

星期三, 5月 06, 2009

64bit SQLServer無法匯入Excel問題

同事遇到在64bit SQLServer無法在SQLServer直接匯入Excel檔的問題,原因是Jet Engine並沒有64bit版本。
事實上,MS Office並沒有64bit版本,所以Jet Engine也沒有64bit版本呀!
類似 http://www.eggheadcafe.com/software/aspnet/32766378/excel-import.aspx 的情形。

不過,如果選完整安裝的朋友,會在工具列看到「匯出和匯入資料(32位元)」,這個就是32bit版的DTS精靈,產生出來的SSIS封裝可以存在64bit SQLServer上,也可以直接執行。

所以會用Visual Studio寫SSIS封裝的朋友,就可以放心寫了。

什麼?要在Stored Procedure匯入Excel?請參考How to call SSIS package from the stored procedure

參考資料:
64-bit Considerations for Integration Services
how to call a stored procedure in SSIS

星期五, 4月 24, 2009

解開intel晶片組driver infinst_autol.exe的方法

又一篇個人筆記。

為了替優秀長官在VAIO Z上安裝Windows Server 2003,之前用nLite做的Windows Server 2003 整合 ich9 driver開機光碟已經不能用,所以只好再找driver來整合。

但是Intel現在已經更新 infinst_autol.exe 的做法,解開安裝後馬上又刪除原始檔,所以我只好輸入infinst_autol.exe /?看有什麼參數可用,最後用infinst_autol.exe -a -f2 C:\temp ,這樣會在C:\temp產生log檔,再從log找到安裝的暫存目錄,這時候就會發現暫存目錄並未刪除。若未加參數時,Log檔會在 C:\Intel\Logs\IntelChipSet.Log,裏面寫的暫存目錄是立即刪除,連安裝過程切換視窗都找不到。

星期一, 4月 20, 2009

列舉目錄下所有檔案的C# class

剛在噗浪上看到有人花了不少時間寫列舉目錄下所有檔案的class,記得當初鳥毅也在CodeProject上找了一會兒,以下是鳥毅改寫的Code(原始出處忘了留:P ),授權以原始出處為準(逃~)
Update:我改寫的class似乎太像(十年前的)Java,請看回應laneser寫的版本,這才是.Net風格呀。
using System;
using System.Collections;
using System.IO;

namespace tenyi.io
{
public class FileExplorer
{
public ArrayList FileList = new ArrayList();
public ArrayList extensionLists = null;
private string myPath = null;
private bool recursive = true;
private DateTime lastDateTime = new DateTime(1, 1, 1);

public DateTime LastDateTime
{
get { return lastDateTime; }
}

public FileExplorer(string path)
{
myPath = path;
recursive = false;
FileList = GetFiles(myPath);
}

public FileExplorer(string path, string filter)
{
myPath = path;
recursive = false;
FileList = GetFiles(myPath, filter);
}

public FileExplorer(string path, ArrayList extensions)
{
myPath = path;
extensionLists = extensions;
recursive = false;
FileList = GetFiles(myPath);
}
public FileExplorer(string path, ArrayList extensions, string filter)
{
myPath = path;
extensionLists = extensions;
recursive = false;
FileList = GetFiles(myPath, filter);
}


public FileExplorer(string path, bool recursive)
{
myPath = path;
recursive = recursive;
FileList = GetFiles(myPath);
}

public FileExplorer(string path, string filter, bool recursive)
{
myPath = path;
recursive = recursive;
FileList = GetFiles(myPath, filter);
}

public FileExplorer(string path, ArrayList extensions, bool recursive)
{
myPath = path;
extensionLists = extensions;
recursive = recursive;
FileList = GetFiles(myPath);
}

public FileExplorer(string path, ArrayList extensions, bool recursive, DateTime theTime)
{
myPath = path;
extensionLists = extensions;
recursive = recursive;
FileList = GetFiles(theTime, FileDateCompare.GreatThan);
}

public ArrayList GetFiles(string strPath)
{
return GetFiles(strPath, null);
}

public ArrayList GetFiles(string strPath, string filter)
{
DirectoryInfo dir = new DirectoryInfo(strPath);
FileInfo[] files;
DirectoryInfo[] dirs;
ArrayList List = new ArrayList();

//if the source dir doesn't exist, throw
if (! dir.Exists)
{
throw new Exception("Source directory doesn't exist: " + strPath);
}

if(filter == null)
{
//get all files in the current dir
files = dir.GetFiles();
}
else
{
files = dir.GetFiles(filter);
}

foreach (FileInfo file in files)
{
if (extensionLists == null)
{
List.Add(new FileData(file.FullName, file.Name, file.Extension, file.Length, file.LastWriteTime));
}
else
{
if (checkFile(file.Extension))
{
List.Add(new FileData(file.FullName, file.Name, file.Extension, file.Length, file.LastWriteTime));
}
}
}

files = null;

//if not recursive, all work is done
if (! recursive)
{
return List;
}

//otherwise, get dirs
dirs = dir.GetDirectories();

//loop through each sub directory in the current dir
string tempDir;
foreach (DirectoryInfo subdir in dirs)
{
tempDir = subdir.FullName;
ArrayList temp = new ArrayList();
temp = GetFiles(tempDir);
for (int i = 0; i < temp.Count; i++)
{
FileData TempData = (FileData) temp[i];
List.Add(new FileData(TempData.FullName, TempData.Name, TempData.Extension, TempData.Length, TempData.LastWriteTime));
}
}
dirs = null;
dir = null;
return List;
}

public ArrayList GetFiles()
{
return GetFiles(myPath);
}

public ArrayList GetFiles(DateTime dt, FileDateCompare state)
{
DirectoryInfo dir = new DirectoryInfo(myPath);
FileInfo[] files;
DirectoryInfo[] dirs;
ArrayList aList = new ArrayList();

//if the source dir doesn't exist, throw
if (! dir.Exists)
{
throw new Exception("Source directory doesn't exist: " + myPath);
}

//get all files in the current dir
files = dir.GetFiles();

//loop through each file
foreach (FileInfo file in files)
{
if (extensionLists == null)
{
if (file.LastWriteTime.CompareTo(dt) > 0)
{
aList.Add(new FileData(file.FullName, file.Name, file.Extension, file.Length, file.LastWriteTime));
if (file.LastWriteTime.CompareTo(lastDateTime) > 0)
{
lastDateTime = file.LastWriteTime;
}
}
}
else
{
if (checkFile(file.Extension))
{
if (file.LastWriteTime.CompareTo(dt) > 0)
{
aList.Add(new FileData(file.FullName, file.Name, file.Extension, file.Length, file.LastWriteTime));
}
if (file.LastWriteTime.CompareTo(lastDateTime) > 0)
{
lastDateTime = file.LastWriteTime;
}
}
}
}

//cleanup
files = null;

//if not recursive, all work is done
if (! recursive)
{
return aList;
}

//otherwise, get dirs
dirs = dir.GetDirectories();

//loop through each sub directory in the current dir
string tempDir;
foreach (DirectoryInfo subdir in dirs)
{
tempDir = subdir.FullName;
ArrayList temp = new ArrayList();
temp = GetFiles(tempDir);
for (int i = 0; i < temp.Count; i++)
{
FileData TempData = (FileData) temp[i];
aList.Add(new FileData(TempData.FullName, TempData.Name, TempData.Extension, TempData.Length, TempData.LastWriteTime));
}
}

//cleanup
dirs = null;
dir = null;
return aList;
}

public ArrayList GetDirectories()
{
return GetDirectories(myPath, null, recursive);
}

public static ArrayList GetDirectories(string path, ArrayList filter, bool isRecursive)
{
DirectoryInfo thisDirectoryInfo = new DirectoryInfo(path);
ArrayList arrayList = new ArrayList();

DirectoryInfo[] subDirectoryInfos;

//if the source dir doesn't exist, throw
if (! thisDirectoryInfo.Exists)
{
throw new Exception("Source directory doesn't exist: " + path);
}

//get dirs
subDirectoryInfos = thisDirectoryInfo.GetDirectories();

//loop through each sub directory in the current dir
string tempDir;
if (subDirectoryInfos.Length == 0)
{
if (filter == null)
{
arrayList.Add(thisDirectoryInfo);
}
else
{
if (filter.Contains(thisDirectoryInfo.Name))
{
arrayList.Add(thisDirectoryInfo);
}
}
}

foreach (DirectoryInfo subdir in subDirectoryInfos)
{
tempDir = subdir.FullName;
ArrayList temp = new ArrayList();
//if not recursive, all work is done
if (isRecursive)
{
temp = GetDirectories(tempDir, filter, isRecursive);
for (int i = 0; i < temp.Count; i++)
{
arrayList.Add(temp[i]);
}
}
else
{
if (filter == null)
{
arrayList.Add(subdir);
}
else
{
if (filter.Contains(subdir.Name))
{
arrayList.Add(subdir);
}
}
}

}

subDirectoryInfos = null;
thisDirectoryInfo = null;
return arrayList;
}

private bool checkFile(string strExtension)
{
bool throwaway = true;
for (int j = 0; j < extensionLists.Count; j++)
{
if (extensionLists[j].ToString().ToLower() == strExtension.ToLower())
{
throwaway = false;
}
}

if (throwaway)
{
return false;
}
else
{
return true;
}
}
}
}

Subversion不能merge時的處理

又是一篇個人筆記。

優秀主管帶領的優秀團隊在MCSD.Net Joseph兄的努力之下,目前已經進到coding階段,Joseph兄指導其他同仁把自己開發的模組放到branch避免干擾,但開始發現SVN令人詬病的merge問題。

由於處於開發初期,某些核心程式還不斷地更新,因此Joseph必須常更新trunk上的程式,而其他成員把trunk合併到自己的branch時常遇到問題。

以下為merge的標準步驟:
  1. 先commit自己的branch
  2. 再update自己的branch(這是因為TortoiseSVN的要求,不做不能merge)
  3. 把trunk合併到自己的branch
  4. 解決衝突
  5. 最後commit解決衝突的branch
  6. 必要時再把branch合併到trunk,方法如1~5。
講起來容易做起來難,尤其是遇到奇怪現象時需要靠經驗解決,有時候設定了svn:ignore的性質變動,會造成每次merge都有衝突,此時砍掉重練branch似乎比較快呀Orz

今天有兩位同事把TortoiseSVN從1.6.0升級到1.6.1後,合併時出現infinite depth的錯誤,個人猜測是.svn裏不知出什麼錯,也是砍掉重練才正常。

結論:終於知道為什麼gslin要把全公司的repository換成Git了。

星期四, 4月 16, 2009

試用多個Subversion GUI Client

為了協助優秀長官的計畫,先協助導入Subversion,我用Apache+SSPI/NTLM整合認證。接著要讓組員們能夠上手svn。要瞭解trunk/branches/tags的用法真是花了不少口水,雖然在公用磁碟有放jserv老大的優秀投影片,但同事們都趕著做案子沒看。我只能個別指導,公司找我這個時薪200元的打雜網管,有些不划算(加班就乘以1.33了呀) =_=

首先建議同事們用TortoiseSVN,在Windows下是首選(我自己用command line),再配合AnkhSVN在Visual Studio整合使用。TortoiseSVN現在有版本圖,與我4年前使用時大不同,穩定性也高。相對之下,RapidSVN就遜多了,在Linux下也會常crash,因此不予考慮。

但是問題來了,有修改目錄性質後,trunk與branch的merge常會發生衝突,TortoiseSVN在這方面雖然有進步,但仍然不強,所以我就試一下其他的Subversion GUI Client。

首先用的是SmartSVN,雖然說功能比較強,但Java的速度就比不上native的client,當然可能與SVNKit實作方式有關,不過時間就是金錢,等到有衝突時再來測,這方面可以參考 http://selainsoft.blogspot.com/2008/01/smartsvn-and-svnkit-javasvn.html 。
接著測eSVN,看來是打算和RapidSVN拼,但從2007年後就沒有新版看來,又是一個無疾而終的專案。再測SubCommander,介面有點類似SmartSVN,但是功能遜多了。

最後一定要提:Subversion的working copy會自動升級,因此若使用最新版的TortoiseSVN後,就無法再使用RapidSVNSubCommander等GUI,只能與SmartSVN beta合併使用,其實會造成困擾,所以若想同時用多種client,只能用舊版的TortoiseSVNAnkhSVN

結論:對大部份的使用者而言,在Windows用TortoiseSVN是最好的選擇;若是idea的瘋狂愛用者,可以選擇SmartSVN。遇到衝突時,就call團隊裏的高手支援吧!

星期三, 4月 15, 2009

用CSS達成BorderColorLight及BorderColorDark的效果

今天在改一個asp的舊網頁,用CSS怎麼都設不出原來用html的BorderColorLight及BorderColorDark畫面好看,後來google找到 http://www.zeali.net/entry/412
原來要放棄CSS的簡單設定法
table
{
border: 3px outlet #ade1ff;
}

要設成類似
table
{
border-top: 3px solid #ade1ff;
border-left: 3px solid #ade1ff;
border-right: 3px solid #4284e4;
border-bottom: 3px solid #4284e4;
padding: 0px;
margin: 0px;
border-spacing: 0px;
border-collapse: collapse;
}

星期三, 4月 01, 2009

機瘟

今天真不是個開玩笑的好日子。

星期一早上,正準備開始寫要交給優秀長官的報告時,有人反映網路磁碟不太穩,到了九點多,整台機器完全連不上去。跑到機房去看,根本整台hang住,連ping都沒反應。只好hard reset,經過2小時漫長的check disk後,幸好沒有嚴重的錯誤,等到13:00也重開成功。沒想到才半小時,機器又當掉了,這次不敢再讓機器慢慢的check disk,重開後先停用NOD32。記得在NOD32 3.0剛發布時也有類似的情況,這次有可能是NOD32 4.0惹得禍,不由得懷念起表現得中規中矩的OfficeScan。

昨天下午公司忽然網路出現異狀,查看之下發現有電腦亂發arp資訊,相信是中了arp病毒。
本部落格的忠實讀者應該記得,敝公司和相關企業是class B broadcast的網段,總公司與分公司也透過VPN連線,約有1000台PC在一個Lan...

因此,整個企業的網路就這樣被一台中毒的PC癱瘓。記得十幾年前,中央大學全校走一個gateway,因為某一台電腦把自己的IP設成gateway而造成全校網路不通。

由於Core Switch是相關企業負責,等了2小時後,相關企業資訊部查出來是敝公司的分部殺的人,小弟只好先拔VPN,今天再去擦屁股找出元兇。

早上八點就趕往分部,沒想到遇到白爛司機,說話比史特龍還不清楚,假設史特龍含了一顆蛋,他大概含了兩顆蛋。雖然敝公司分部位於市郊,但好歹也算是台北市,居然有司機路搞不清楚,叫他走平面就硬給我走高架橋,多繞了兩公里;又在單行道開過頭,害我平時150元能到的地方硬是跑到220元。

由於借了部門經理的高檔Notebook出門,當然到了分部就把Notebook接上switch hub,用二分法找出元兇,這部份花不到半小時就搞定。但因為分部的網路線拉得很怪異,本來想用埠號找出元兇實行上很困難,只好在SZ上偷偷地裝了WinPcapWireShark,其實這個狀況用SmartSniff就夠了,因為我是把連到元兇的網路線直接插上SZ,只要能看到IP或Windows機器名稱即可。找到機器後用Trendmicro提供的好工具iClean去掃毒,可惜沒掃完iClean就hang住,試了幾次無效只好帶回公司重灌。

回到公司已經中午,下午處理些雜事後幫優秀長官的team開了一個Subversion Repository,再把對應網域權限設好(請參考:Subversion+Apache的NTLM/SSPI認證)。正當MCSD.Net同事把他的Rainbow Portal Project丟上去到一半時,就爆炸了當機了。

雖然快下班了但我也只好跑到機房去看發生什麼事情,當KVM切換到那台Subversion Server時出現美麗的藍天白雲....是藍屏死機。重開機兩次都無法啟動,安全模式也進不去。不知道該說幸還是不幸,由於是一般的爛PC,所以就整台抱到我的座位上開始分屍拆機。把硬碟拆下用自費買的usb線接上我的Win7掃描磁碟,掃描在Stage2不到一半就卡住了,Win7確實優秀,若是XP可能會整台hang住,Win7只要把CMD視窗關掉就沒事。

慶幸的是只有系統碟掛點,Subversion Repository依然健在,利用去年備份的tib檔,拿了另一顆80GB IDE硬碟,快速地重建回來。當然得退出網域重新加入,再更新ApacheSubversion和一堆阿里不達的東西,以及最重要的Windows Update。所以整台修好又過了一個多鐘頭,原本預訂今天要交給優秀長官的報告依然一字未動... 答應美麗的MIS小姐要幫她更新的次要SQL Server 也還沒動,又得回家用VPN免費加班。

Today is not my day.
今天真不是個開玩笑的好日子。

星期二, 3月 31, 2009

Subversion+Apache的NTLM/SSPI認證

簡單地說明原因,公司的Subversion Repository要用NTLM認證,我在Windows上用Apache架SVN Server。
當然先下載Apache 2.2和對應Apache 2.2的Subversion,接著下載mod_auth_sspi
,modules和bin都放好應該有的檔案後,在 httpd.conf 裏加上
LoadModule sspi_auth_module modules/mod_auth_sspi.so
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
接下來要設定權限,找到的範例要用 AuthzSVNAccessFile ,但我怎麼設定都不對,所以把Require user改成Require group,在 httpd.conf 設定如下
<Location /projectrepository>
DAV svn
SVNPath E:/projectrepository
AuthType SSPI
AuthName "Project Repository"
# Require valid-user
Require group "網域名\群組名" "網域名\群組2"
SSPIAuth On
SSPIAuthoritative On
SSPIDomain 網域名
SSPIOfferBasic On
# AuthzSVNAccessFile E:/projectrepository/svnaccess.txt
</Location>
若有先進願提供正確的SSPI AuthzSVNAccessFile範例,不勝感激。
參考資料: http://www.wretch.cc/blog/mogula/22956644

星期四, 3月 12, 2009

從龍櫻看考試

耶~久違的閒聊文回來了。
最近工作壓力過大,今天出差就看了舊連續劇龍櫻(台灣譯名:東大特訓班),我對這部戲特別有感覺呀!不是因為長澤雅美或是新垣結衣,因為我是社會上的輸家。

如果這部漫畫能夠早個十幾年出現,大概會改變我的人生吧?小時候我老媽每天只會叫我看書,只看書能考上台大嗎?保證不會!

為什麼呢?因為人都有盲點,除了愛聽好話外,人也會不自覺地看自己想知道的知識,對於不喜歡或沒興趣的東西會不自覺地忽略。所以除了看書,要多做題目才會完整地瞭解。和東大特訓班的方法一致,對吧?

我到考完研究所才體會到考試和研究不同,櫻木建二說得沒錯,考試最大的優點就是公平。但是考試有時間限制,必須把自己變成解答機器,才能快速地寫出答案。以前大學時鳥毅的成績不好,因為鳥毅不喜歡做試題,更不看考古題。這種堅持都是屁!不過就是個考試,不代表你的實力好壞,但別人卻用分數衡量你,所以要讓自己機械化。至於如何自我訓練在龍櫻裏都有,我就不多說了。

前幾年考SCJP時,由於教材頗多,我先花一個星期看超級速讀自學教材。平常我看書就不算慢,但是Java相關的細節頗多,所以把看書速度提升,之後再花一個星期看書,並把書後面的題目做兩遍。但是結果並不如我預期,才70幾分,約一年後我考SCWCD時,其實我對那些Pattern並不熟悉,但是直接用超級速讀的方式死背,加上做兩遍考古題,居然考了85分。所以我才說:考試的分數並不代表實力。

在台灣考大學要進台大實在很難,所以鳥毅班主任要告訴各位一個捷徑:考研究所碩士班。就算只有五專畢業,工作滿3年後就可以直接考碩士班,所以鳥毅實在很後悔沒讀五專呀!。但要先聲明不是百分之百有用,這個社會不是努力就會成功。如果不在乎什麼科系,找個冷門報名人數少的,找個十年的考古題做熟,基本觀念都不錯,其實就有很大的希望。但是盡量找不要口試的系所,不然像鳥毅一樣筆試高分卻被某大老以口試30分刷下來。(我當年口試若有60就穩上,他才出此下策,台大口試一般都會打60分,對於想讓他進來的學生都有80分以上。)
若是博士班,聽說要先找好指導教授才去報名,我也沒唸過博士班,所以請另找高明。哦,忘了提,某些工學院的系所缺正妹,除非妳像呂X妮被老師們排擠,否則正妹的口試分數一定高。(這兩天才知道,T大正妹大學也不是讀台大...)

後記:
這篇並不是純唬爛,鳥毅一位朋友就是大器晚成的考試達人。
這位朋友H君,大學重考一年,不但大學四年都補考過關,而且也沒有交到女友,可以說大學時期一事無成。

他當完兵後改名,當年就考上國立中興大學研究所,接著隔年考上高考就跑去當公務員。就這麼結束了嗎?只考兩關怎麼算達人呢?

後來就更猛了,他一年考上一個技師執照,連續三年考完。各位看倌可能有所不知,H君讀的土木系可以考三種技師:土木技師、結構技師、大地技師。技師執照是執業的必要條件,和律師執照、醫師執照、建築師執照等是同等級,難考程度也接近;就算是台大土木系的碩士,也鮮少人同時有三張執照;事實上許多大學土木系的教授連一張執照也沒有。

故事還沒完,隔兩年他又考上檢察官特助,接下來如何呢?我也很期待呀...
我只知道H君靠著考試改變他的人生,開創一條光明大道。

星期二, 3月 10, 2009

Beyond RTFM

最近協助前單位做的專案,由於舊系統過多,經過一個月仍然停留在瞭解舊系統的階段。這幾天想起十幾年前學到的一個術語:RTFM

事實上,一個系統經過幾次的修改後,已經多少與原始設計不同,RTFM還不如RTFS。這個專案是敝公司第一次與該公司合作,其他的舊系統均為其他廠商所開發,因此取得源碼亦有困難,多半只拿到簡單的系統手冊與不一定能執行的二進位碼,某些系統連資料庫都不肯給,只給DB Schema的文件。

這幾天優秀長官要鳥毅看一個重要系統的asp,由於只有asp而缺乏可用的DB與VB 6 dll 源碼,讀起來非常痛苦。事實上,如果是可執行的系統,慢慢地trace或許可以找出脈絡。以這個重要系統為例,手上的文件只有操作手冊與DB schema,對於系統分析與設計除了介面外幾乎沒有幫助。但是仔細深入源碼後,卻發現asp內部與許多其他系統連結,而且源碼經過幾個人的修改,以風格及命名方式看來,應該是一間以上外包公司的傑作。

最近又得知為符合法規修正,此系統又要修改。這種時候若得不到客戶的幫助,我只能說:砍掉重練比較快。

當然大部分的長官不會同意全部重寫,因此在這種情況下需要3rd party的協助,我找到Source Insight這個工具,可以試用30天,所以... 小華SlickEdit也不錯,不過時間有限,所以只試用Source Insight。結果當然不出所料,對於這種近乎純網頁的asp,又大量利用script轉址,Source InsightSlickEdit根本找不到連結,所以畫不出call graph,其他的API之類就更別提了。

可預見的未來,這個系統一定會砍掉重練,只是遲早的問題。

星期日, 3月 08, 2009

遠來的和尚會唸經

根據線人指出,若找獨孤求敗當顧問,時薪是$3,000NTD/HR;所以敝公司找一個時薪$1,500NTD/HR的有名高手。(當然這是和他簽長期約才有的優惠)說實在話,鳥毅對高手顧問並沒有很高的期待,因為高手的主要專長在於資料庫,但這次的的需求是系統整合,雖然高手的經驗豐富,但多半也是開發新系統,對於這種舊系統整合,又充滿不確定性的專案應該還是首次吧?

由於高手的時薪很貴,和他meeting時鳥毅不在與會之列(意見太多不受歡迎?),據同事所言,高手說test只有在預算很高的大公司才有實行。這點鳥毅實在很詫異,微軟推TDD(Test-driven development)也幾年了;看一下王克明介紹Test Driven Development By Examples吧,鳥毅雖然不才,但經過國際大嘴巴顧問朋友的介紹,也深知Test First的好處。我很難想像,一個具有十幾年軟體開發經驗的人,怎麼會不懂測試的重要?當然,我承認懂得迎合長官的喜好與人際關係是在技術之上,但是從一位高手口中說出,還是令我難以置信。

在鳥毅短暫的程序員生涯裏,多人開發大型專案時,必須有固定的測試人員以確保系統行為與設計文件相同;因此若能有Test Case可以執行,將可大幅度減少人工測試的時間。一個顧問在輔導開發團隊時,首要之務不是應該建立Code Conventions與導入Repository和Test概念嗎?

你管別人怎麼想中,費曼指出他在調查挑戰者號太空梭失事原因時,其實不是他自己找出原因;而是一位沒沒無名的工程師,藉由費曼這位物理學大師之口說出橡膠在低溫下未如預期般有彈性的事實。

在一個有迫切時程壓力的系統開發時,找個非常有名的顧問,並不一定會比你手下的無名小卒做得好,唯一的差別在於:時薪很貴的顧問說的話主管聽得進去。

星期二, 3月 03, 2009

將YouTube上的影片存成avi或mp3

帥學弟奉女友之命要抓一首歌,因為他女友在YouTube上看到這首歌很喜歡,打算放在手機裏。因為很難找,所以鳥毅就和帥學弟說直接轉檔的方法。

在Firefox上安裝Flash Video Resources Downloader,存成flv檔後,再利用Extra.FLV轉成mp3/avi即可。

如果無法用Extra.FLV開啟,有可能是因為解碼器未安裝,加裝K-Lite Codec Pack之類即可。(建議到軟體王下載,載點皆是台灣大專院校,網路上其他載點可能附贈木馬)

若是Mac/FreeBSD/Linux,在命令列輸入 ffmpeg -i xxx.flv xxx.mp3 即可。

星期四, 2月 26, 2009

好樣的Microsoft Word 2003

今天有位使用者反映,他某個Microsoft Word檔案編輯3~5個小時後,電腦會當掉。我本來以為是什麼幾百頁的大報告,他說只不過是一頁公文簽呈,只是習慣開檔就放著,有時候因為開會或出差不在,回來就掛了。

因為在下敝人小弟我從來就不擅長寫報告,就算是寫論文也是虎頭蛇尾,從未打開word不關超過1小時,所以只好放著測試。原本用Word 2003打開約18MB,經過一小時之後,確實成長到29MB,但其實並不算很大。我向長官報告Word可能有memory leak時,維修電腦的同事說,這是拼字檢查的原因。

於是在下連續按了十次F7(拼字及文法檢查的快速鍵),有建議跳出時就按取消,神奇的事發生了。Word使用的記憶體以每秒200k的速度成長,雖然我的桌機有4GB,但是一個32 bit Process應該也只能用到2GB,於是我在Word使用到150MB時趕緊關掉Word,以免系統crash。

註:並不是每個Word檔都會有這麼神奇的效果,可能是某個巨集或某種版面造成的;但是可以確定Word 2003的拼字檢查有嚴重的Bug,在Word 97測試相同檔案則無此問題。以往的經驗是幾十MB的大檔比較容易發生,在這種僅一頁的簽呈發生倒是頭一次遇到。

以下摘錄自 如何最佳化 Word 2003、Word 2002 和 Word 2000 這篇官方文件

關閉自動拼字與文法檢查

根據預設值,Word 會自動在您輸入時檢查拼字和文法。拼字錯誤是使用紅色的波浪狀底線來標示,而文法錯誤則使用綠色的波浪狀底線來標示。在某些電腦上,這些選項可能對效能產生負面影響。

如果要關閉自動拼字與文法檢查,請依照下列步驟執行:
  1. 啟動 Word。
  2. [工具] 功能表上,按一下 [選項],然後按一下 [拼字與文法檢查] 索引標籤。
  3. 按一下以清除 [自動拼字檢查][自動文法檢查] 核取方塊,然後按一下 [確定]

使用幕後儲存選項

根據預設,會開啟 [允許幕後儲存檔案] 選項。透過這個選項,您可以一邊儲存文件,一邊繼續使用 Word。

這個選項會使用額外的系統記憶體。如果要節省系統資源,您最好關閉這個選項。如果要開啟或關閉 [允許幕後儲存檔案] 選項,請依照下列步驟執行:
  1. 啟動 Word。
  2. [工具] 功能表上,按一下 [選項],然後按一下 [儲存] 索引標籤。
  3. 按一下以選取,或按一下以清除 [允許幕後儲存檔案] 核取方塊,然後按一下 [確定]
注意當 Word 在幕後儲存文件時,狀態列會出現閃動的磁碟圖示。如果 Word 無法在幕後儲存文件,就會在幕前儲存文件。例如,如果沒有足夠的可用磁碟空間,或是將文件儲存到磁片,便可能發生這種情況。

星期三, 2月 25, 2009

近況報告

每隔一陣子沒什麼好寫時,我都會來個近況報告,表示這個Blog還沒死....
忠實讀者一定有發現,我今年的產量非常少。原因無他,嘴炮打多了,口渴去喝水....

在王土之下、浩瀚的 宇宙裏,嘴炮王已經很多了,我今年要幫忙前部門做案子,但原來的工作仍照舊。因此原來的打混摸魚充實自己的時間都在做事,手邊一堆片子都沒看,哦,是借來的米國連續劇,不是妖精打架啦(雖然也沒時間看,不過都是舊片)。平常上班的時間都沒空看新聞,下班看個網路新聞再開個Google Reader看幾篇就準備睡覺。

這麼忙當然也不會完全沒進步,首先花時間看HTML/CSS終於有些明白,至少知道 「標準遵循模式」和「Quirks 模式」的分別,也知道IE在UTF-8和Big5編碼字體會大小不同的特色(是feature不是bug)。以後用Visual Studio拉網頁後手工修版面的技術會好一些。

咳,總之,今後會盡量減少打嘴炮,致力於累積宅的能量充實IT技術。至於好用軟體的介紹,還是留給專業的不來恩,我這個不專業白爛網管就專心打雜吧。

星期日, 2月 22, 2009

OpenWebMail的HTML Editor在Chrome無法使用

我很少寫email用HTML格式,今天想用表格才發現OpenWebMail的HTML Editor不准Chrome使用,但其實是相容的,因此小小修改一下。只要在openwebmail-send.pl 第2631列加上
 if( $u=~m!Chrome!) # Chrome patch 
{
return 1;
}


patch file 如下:
--- openwebmail-send.pl     2009-01-06 16:48:24.000000000 +0800 
+++ /usr/local/www/cgi-bin/openwebmail/openwebmail-send.pl 2009-02-22 22:33:41.000000000 +0800
@@ -2631,6 +2631,11 @@
########## HTMLAREA_COMPATIBLE ###################################
sub htmlarea_compatible {
my $u=$ENV{'HTTP_USER_AGENT'};
+
+ if( $u=~m!Chrome!) # Chrome patch
+ {
+ return 1;
+ }
if ( $u=~m!Mozilla/4.0! &&
$u=~m!compatible;!) {
return 0 if ($u=~m!Opera!); # not Opera

星期二, 2月 17, 2009

DocProject安裝

又是另一篇個人筆記。以前寫過.Net的HTML文件產生器,不知道DocProject是什麼可以先看,簡單地說就是SandCastle的Visual Studio Add-on,而現在的 1.11.0 RC Jun 8 2008比我當初試用的版本穩定,新版的SandCastle也比較快。

下載安裝後有精靈可以設定,所以不用花太多腦筋,其實產生chm就夠了,HxS我也打不開:P
這次安裝又遇到.Net的HTML文件產生器提到的bug,我猜是因為裝了Visual Studio SDK,把裝好最新版的SandCastle複製到有問題的目錄,重新產生DocProject專案就正常。

參考資料:http://www.cnblogs.com/hwade/articles/885020.html

星期五, 2月 06, 2009

Xuite改html結構

Xuite的Blog改了html結構,目前不知道變動多大,造成Blog Backup無法備份,等我有空去看看,但最近很忙,可能會拖很久(主要是我自己沒用Xuite呀!)。

歡迎加入本計畫共同修改。

(本篇同步發表於Blog Backup

星期四, 2月 05, 2009

在Linux驅動Buffalo WLI-CB-G54A

這篇是自己的備忘錄

Buffalo WLI-CB-G54A沒有Linux上的驅動程式,所以只好靠ndiswrapper,和Project Evil相同的東西 。
前幾年借同事的usb無線網卡用,就懶得管它,今天剛好看到 https://moto.debian.org.tw/viewtopic.php?t=8203&view=previous&sid=31fa522fb41ca0c037e550477edd6446 ,就把這張搞了幾年都沒成功驅動的卡拿出來。

安裝步驟:
  1. sudo apt-get install ndisgtk ndiswrapper-common ndiswrapper-utils-1.9
  2. 照高手的做法,下載 ftp://ftp.dell.com/network/R74092us.EXE 解開,高手實在強,能找到正確的driver,當年我用Buffalo的driver不能用就放棄了。
  3. 再用ndisgtk安裝driver,小綠燈應該亮了,若沒亮可能得重開機
  4. sudo iwconfig wlan0 essid [你的SSID]
  5. sudo ifconfig wlan0 up
  6. sudo dhclient wlan0

星期三, 1月 21, 2009

關於Agile Software Development

最近鳥毅的twitter多了一位訂閱者,原來是高手ihower,看到他寫採用敏捷方法的軟體開發合約該怎麼簽?,就想到最近遇到的狀況。

由於前兩年換部門,因此coding的機會少很多,已經不太需要寫code,大部份都在做網管工作。最近前部門接到一個公家機關的案子,主要是整合現有系統,因為是專業領域,所以敝公司從打敗現有的資訊公司得標。

但其實此單位在招標書就寫著不合理的期程,把不甚明確的規格和很短的deadline寫在裏面。前部門的優秀長官也在苦思如何應對,找了一間號稱使用XP的優秀資訊公司商討合作可能性。
鳥毅與該資訊公司代表稍微聊了一下,大致上知道他們都是有不短的coding經驗,再找幾個年輕人訓練來做專案。

本來想建議優秀長官也使用Agile Software Development,但他表示由於時程太趕,光是訪談->需求分析->coding,就沒多少時間,不太可能像XP一個phase一個phase地做,必須採用Waterfall方式。其實優秀長官有點誤會XP的意思,快速開發並快速地將需求變化回饋到code裏,才是XP所追求的目標。

鳥毅對其他敏捷開發方法論並不瞭解,只知道XP的開發方式。不過XP所提倡的Test First等等觀念,幾乎都已被廣為使用,唯一被視為難做到的就是Pair Programming。連優秀資訊公司都錯誤地表示人的成本太高,所以做不到Pair Programming。事實上,根據ingramchen的親身見證,Pair Programming會產生1+1>2的效果,只是對coding的人很累,因為完全不能打混呀...

ihower有寫一系列「實戰敏捷開發 Practices of an Agile Developer 」,裏頭有不少新的Agile觀念與做法,讓在下獲益良多呀!

P.S. 在下從國中學寫Apple Basic開始,過了十幾年看到XP才赫然有種相見恨晚的感覺,應該是每天埋首coding的人才比較容易喜歡Agile Software Development吧?

星期二, 1月 20, 2009

OpenSolaris吃的RAM

原本早就要玩OpenSolaris 0811版,拖到今天才有時間裝,果然是有RAM盡量用的最好典範,比Vista/Windows 7還猛。



Update:可能我沒說清楚,這是剛開完機,什麼都還沒跑的狀況... 請玩過OpenSolaris和FreeBSD/Linux/OSX/Windows 7/Vista再來刮我的鬍子,謝謝。

最後Update:這篇只是貼個紀念,沒想到一直有人留言,我又沒評論好壞呀!
OpenSolaris用很多RAM並不是沒裝好,而是用在Cache,在Cache什麼呢?檔案呀!因為ZFS會在背景偷偷地搬檔案,確保檔案沒有損壞,這是Sun的工程師說的,不是我個人的看法。

星期三, 1月 14, 2009

Java的bzip2函式庫

前幾年以Java寫Mail Server上log檔的判斷程式,原本是gzip格式,後來FreeBSD改成bzip2,因此必須找個bzip2的library。

找到bzip2 library from Apache Ant,去修改原本的程式卻不work,一直說檔案應該是'h'開頭卻得到'B',bzip2檔案格式明明是BZ開頭呀?再深入去找到才知道Ant的這個library只寫了一半,必須自己處理前兩個byte。所以讀的時候要處理成:
try {
InputStream is = new FileInputStream(infile);
is.read();
is.read();
BufferedReader br = new BufferedReader(new InputStreamReader(new CBZip2InputStream(is)));
真是太鳥了呀...

Lazybuntu已支援AMD64版

Lazybuntu的開發者之一雨蒼昨天留言給我,才知道Lazybuntu已經支援AMD64版了,是很想試試,但我該裝的全都裝了呀....等我下次再裝Ubuntu amd64時一定會試試,感謝雨蒼提供的訊息與他的努力。

升級FreeBSD 7.1

FreeBSD 7.1在上星期推出,最重大的改變是把ULE改為預設值,理論上SMP效能會提高。今天把Server升級到FreeBSD 7.1,希望效能會改善。

星期二, 1月 06, 2009

OpenWebMail中文檔名附件問題

最近鳥事很多,加上放假都去看車,所以沒有更新Blog。(對,我懶:P)

OpenWebMail自從2.53版後UTF-8做得相當好,但是在IE卻會發生中文檔名附件無法下載;用Big5介面則無此問題,但這樣實在太鳥了,尤其是敝公司有幾位員工名字有unicode字元,這樣就不能正常顯示,決定動手去硬改完全不懂的Openwebmail Perl程式碼。

把openwebmail-viewatt.pl改掉,在269列前,加上
} elsif ( $ENV{'HTTP_USER_AGENT'}=~/MSIE/ or $ENV{'HTTP_USER_AGENT'}=~/Chrome/ ) {
my $filename_encoded = uri_escape($filename);
$attheader.=qq|Content-Disposition: attachment; filename="$filename_encoded"\n|;
最前面也要加上
use URI::Escape;


由於小弟手賤,把所有員工的openwebmailrc都改成utf-8,就不管以上hack在big5是否正常了:P (會變亂碼,但仍然可以下載...)

Update :做成patch file,如下:

--- openwebmail-viewatt.pl 2009-01-06 16:48:24.000000000 +0800
+++ /usr/local/www/cgi-bin/openwebmail/openwebmail-viewatt.pl 2009-01-06 16:14:24.000000000 +0800
@@ -4,6 +4,8 @@
#

use vars qw($SCRIPT_DIR);
+use URI::Escape;
+
if ( $0 =~ m!^(\S*)/[\w\d\-\.]+\.pl! ) { local $1; $SCRIPT_DIR=$1 }
if ($SCRIPT_DIR eq '' && open(F, '/etc/openwebmail_path.conf')) {
$_=; close(F); if ( $_=~/^(\S*)/) { local $1; $SCRIPT_DIR=$1 }
@@ -161,9 +163,13 @@
if ( $ENV{'HTTP_USER_AGENT'}=~/MSIE 5.5/ ) { # ie5.5 is broken with content-disposition: attachment
$attheader.=qq|Content-Disposition: filename="$subject.msg"\n|;
} else {
+# } elsif ( $ENV{'HTTP_USER_AGENT'}=~/MSIE 7.0/ ) { # ie7.0 is broken with content-disposition: attachment
+# $attheader.=qq|Content-Disposition: filename="aaa.msg"\n|;
+# } else {
$attheader.=qq|Content-Disposition: attachment; filename="$subject.msg"\n|;
}

+
# allow cache for msg in folder other than saved-drafts
if ($folder ne 'saved-drafts') {
$attheader.=qq|Expires: |.CGI::expires('+900s').qq|\n|.
@@ -266,6 +272,10 @@
# disposition:attachment default to save
if ( $ENV{'HTTP_USER_AGENT'}=~/MSIE 5.5/ ) { # ie5.5 is broken with content-disposition: attachment
$attheader.=qq|Content-Disposition: filename="$filename"\n|;
+# } else {
+ } elsif ( $ENV{'HTTP_USER_AGENT'}=~/MSIE/ or $ENV{'HTTP_USER_AGENT'}=~/Chrome/ ) { # ie7.0 is broken with utf-8
+ my $filename_encoded = uri_escape($filename);
+ $attheader.=qq|Content-Disposition: attachment; filename="$filename_encoded"\n|;
} else {
$attheader.=qq|Content-Disposition: attachment; filename="$filename"\n|;
}