2008-12-31

ThinkPad 還原

最近很多同事離職,在要把公司的 ThinkPad nb 還回去時,才發現因為自己重灌過,沒辦法按 F11 鍵來還原,在網路上找到的方式大部份是利用 IBMTool 去做開機救援磁片,不過這太麻煩了。後來找到一個比較簡單的方法,就是把那個還原磁區改為 Active 就好了,這樣開機時從那磁區開機就可以還原了。 設定這個可利用免費的 EASEUS Partition Manager 來進行。 PS. 此方法的前提是還原磁區沒有被刪掉 後記 同事利用此方式還原時,不知道為什麼會卡在一半,後來小弟就改用我安裝在 USB 上的 Ubuntu 開機,利用 Gnome Partition Editor 將非還原磁區的部份刪掉,再重新將還原磁區改為 boot ,重開機來還原就好了。只能說,Linux 是好物啊。

2008-12-28

如何取得目前運行的 Java Process

在 JDK 1.6 中,有一個 JConsole 的工具,可以用來監看目前運行中 Java Process 的狀況。其在啟動時候,會列出目前運行的 Java process 來給使用者選擇要監控哪個 process。如果我們也希望取到該 List ,要如何處理呢?今天剛好在網路上看到,就留下來做記錄。

import sun.tools.jconsole.*;
import java.util.*;
public class Main {
  public static void main(String[] args) {
    Map map = LocalVirtualMachine.getAllVirtualMachines();
    Iterator iter = map.values().iterator();
    LocalVirtualMachine vm = null;
    while (iter.hasNext()) {
        vm = (LocalVirtualMachine)iter.next();
        System.out.println(vm.displayName());
    }
  }
}

classpath 必需加上 jconsole.jar 和 tools.jar 兩個 jar

參考:

http://w3hjava.com/uncategorized/handling-java-code-from-another-java-code/

2008-12-26

好的測試應該具備哪些特質?

什麼樣的測試算是好測試?我們又該怎麼知道如何編寫好測試?

Kent Beck斷定,好的測試應該具備下列條件:

  • 互相隔離的(不受其他測試的表現形式、是否存在、執行結果的影響)
  • 自動化的
  • 編寫快
  • 運行快
  • 獨一無二(為開發人員提供自信,而不會由其他測試提供信息,與其他測試不相關)

Roy Osherove 補充:好的測試有三個基本屬性:

  • 可維護
  • 值得信賴
  • 易於理解。

Mike Hill的列表要更長:

  • 它會很短,通常只有十來行代碼。
  • 它不會測試運行程序內部的對象,但是會測試為了測試目的而構建的應用內部的對象。
  • 它只會調用很小的一部分代碼,通常是某個函數的某一分支。
  • 它是灰盒的形式編寫的。也就是說,它運作的方式像是黑盒,但是有時又會利用白盒的長處。(一般來說,這是避免組合問題的重要因素。)
  • 測試要符合生產代碼的編碼標準,比如,團隊目前對於優秀編碼的最佳看法。
  • 應用的眾多小測試構成了一個「提交關卡」。這就是說,開發人員可以在所有小測試通過的情況下提交代碼,否則(強烈建議、甚至不惜手段)阻止他們提交。
  • 測試應對接受測試的對象有完全的控制權,因此應是自包含的。也就是說,它不會依賴不屬於測試代碼及其依賴圖的任何其他對象。
  • 它的運行時間非常短。
  • 它會先於要測試的代碼變更之前編寫。
  • 通過一系列slip-and-fake技巧,它會避免使用所有「糟糕」的collaborator。

Mike和Ron Jeffries提醒我們:TDD的核心價值是要簡化設計、提升開發效率;代碼質量的提升和bug數量的減少是因此而帶來的重要好處。

Jeremy Miller補充了良好單元測試應該具備:

  • 與順序無關,並且是隔離的。運行測試的軟件可以按照以任何順序運行。
  • 意圖明確。最好的單元測試應該能夠告訴閱讀者,一個對象的API是如何準備被調用的。
  • 易於設置。

最後,Ed Burnette 寫到:要讓你的單元測試在任何方面都可以重複;測試邊界條件,並且要一直保持測試的通過率是100%。

原文:
http://www.infoq.com/news/2008/10/qualities_good_test

2008-12-25

幾個可在遠端桌面中使用的快速鍵

在公司裡每天都在不同的遠端桌面(Remote Desktop)上工作,但是很多按鍵在非全螢幕下都是不能用的,若要在非全螢幕的情況下使用的話,就必須用另一組快速鍵來操作。

本機 遠端桌面 說明
CTRL + ALT + DEL CTRL + ALT + END

顯示 [Windows 安全性] 對話方塊

-

CTRL + ALT + BREAK

在視窗和全螢幕顯示模式間切換。

Win Key 或 CTRL + ESC

ALT + HOME

顯示 [開始] 功能表。

ALT + TAB

ALT + PAGE UP

從左到右切換視窗
PrintScreen

CTRL + ALT + 數字鍵上的加號(+)

將遠端的整個螢幕畫面複製回本機。
ALT + PrintScreen

CTRL + ALT + 數字鍵上的減號(-)

將遠端的作用中的螢幕畫面複製回本機。

參考:
在遠端桌面連線中可以使用哪些快速鍵?

使用 Fiddler2 無法截取到封包的問題

之前在公司使用 Fiddler2 的時候,監控封包都沒什麼問題,在家裡的 eee-pc 上剛裝好時,好像也可以用,只是後來不知道為什麼,就是截取不到封包,今天上網查資料,才發現原來是因為 Fiddler 預設只會監控區域連線,而我使用撥接 ADSL 上網,它就沒有監控到,要解決這個問題透過以下方式解決:

在 Fiddler2 的 Options 中的 Connections 裡:
Noname
 
選取 Monitor all connections 讓 Fiddler 監控所有的連線。

另外網路上還有看到修改 HKCU\Software\Microsoft\Fiddler2 機碼的方式來處理,不過我沒試過,有興趣的可以試試。

http://blog.miniasp.com/post/2008/10/Fiddler2-can-not-capture-packets-when-using-3G-networking.aspx

http://www.fiddler2.com/Fiddler/help/hookup.asp#Q-VPN

讓IE執行Javascript更快速

只要加上一行,就可以讓IE更快的執行Javascript。

/*@cc_on _d=document;eval('var document=_d')@*/

測式範例

Before

var date = new Date();
for (var i = 0; i < 100000; i++) document; 
alert(new Date() - date); // 643
After
/*@cc_on _d=document;eval('var document=_d')@*/
var date = new Date();
for (var i = 0; i < 100000; i++) document; 
alert(new Date() - date); // 145
解說

對 Internet Explorer 來說,要使用 document ,必須經過 window 。而上面那一行是讓 document 成為一個獨立的物件,不必透過 window ,因此速度就提昇了。

參考:

http://d.hatena.ne.jp/amachang/20071010/1192012056

http://gis.iwant-in.net/blog/?p=90

在 IE 中把 Browser 強制關閉的方法

Browser 都因為安全性的問題不允許強制關閉主視窗,但自己透過 window.open() 開啟的視窗可以控制強制關閉。

不過還是找的到方法處理:

IE 6

window.opener=null;    
window.close();  

IE 7

window.open('','_parent','');
window.close(); 

參考:http://blog.miniasp.com/post/2008/01/How-to-force-close-the-browser-window-in-IE.aspx

Top 100 Network Security Tools

http://sectools.org/ 裡面有很多網路安全的工具,有需要可以參考。

2008-12-22

對程式設計師收入的有趣觀點

http://thevault13.blogspot.com/2008/11/blog-post.html?showComment=1229485860000#c1738109330569040837

如何利用批次檔取得系統日期時間

之前曾經有想過要利用批次檔加上 windows 的排程來定時為測試用的資料庫進行備份,只是不知道怎麼取得目前系統日期時間來使用,最近剛好看到這幾篇文章,留下來做參考:

取得今天日期的年、月、日:

for /f "tokens=1-4 delims=-/ " %%i IN ("%date%") DO (
    set year=%%i
    set month=%%j
    set day=%%k
)
取得當下時間的時、分、秒、百分之一秒
for /f "tokens=1-4 delims=:." %%i IN ("%time%") DO (
    set hour=%%i
    set minute=%%j
    set second=%%k
    set centisecond=%%l
)
組合含有日期、時間的字串:
SET OutputDir=%year%%month%%day%_%hour%_%minute%_%second%_%centisecond%
指令取得上個月的月份(使用 SET /A,/A 可以做數值運算(arithmetic)):
@echo off
rem 把日期裡的斜線拿掉;2008/10/21→20081021
set Today=%DATE:/=%
 
set ThisYear=%Today:~0,4%
 
rem 取回今天的年度月份;200810
set ThisMonth=%Today:~4,2%
 
rem 本月份減1取得上個月份
set /A LastMonth=%ThisMonth%-1
 
rem 如果是1月份的話,要把年度減1
if "%LastMonth%"=="0" set /A ThisYear=%ThisYear%-1
 
if "%LastMonth%"=="0" set LastMonth=12
 
rem 如果是1月到9月時,左補零成為01~09
if "%LastMonth:~1,1%"=="" set
LastMonth=0%LastMonth%
 
echo Year=%ThisYear%
echo Month=%LastMonth%

參考:

2008-12-16

突破AD查詢1000條限制

以前專案曾經連 AD 遇過這個問題,記錄一下。 http://support.microsoft.com/kb/315071

啟動 Ntdsutil.exe

Ntdsutil.exe 位於 Windows 2000 安裝 CD-ROM 上的 [支援工具] 資料夾中。
  1. 請按一下 [開始],再按一下 [執行]
  2. [開啟] 文字方塊中,輸入 ntdsutil,然後按 ENTER 鍵。如果要隨時檢視說明,請在命令提示字元下輸入 ?

檢視目前的原則設定

  1. 在 Ntdsutil.exe 命令提示字元下,輸入 LDAP policies,然後按 ENTER 鍵。
  2. 在 LDAP 原則命令提示字元下,輸入 connections,然後按 ENTER 鍵。
  3. 在伺服器連線命令提示字元下,輸入 connect to server <伺服器的 DNS 名稱>,然後按 ENTER 鍵。如果要連線至目前您正在使用的伺服器。
  4. 在伺服器連線命令提示字元下,輸入 q,然後按 ENTER 鍵以返回前一個功能表。
  5. 在 LDAP 原則命令提示字元下,輸入 Show Values,然後按 ENTER 鍵。
  6. 如果它們存在的話,便會顯示原則。

修改原則設定

  1. 在 Ntdsutil.exe 命令提示字元下,輸入 LDAP policies,然後按 ENTER 鍵。
  2. 在 LDAP 原則命令提示字元下,輸入 Set <設定> to <變數%>,然後按 ENTER 鍵。例如: Set MaxPoolThreads to 8。 如果您將另一個處理器加入伺服器,則這個設定會變更。
  3. 您可以使用 Show Values 指令,確認變更。 如果要儲存變更,請使用 Commit Changes
  4. 當您完成時,請鍵入 q,然後按 ENTER 鍵。
  5. 如果要結束 Ntdsutil.exe,請在命令提示字元下輸入 q,然後按 ENTER 鍵。

Web Debugger

因為開發 Web application 的原故,常需要去監控 Http 連線內容, request 與 reponse,最早之前是使用海盜版的 HttpWatch,後來發現微軟有提供了一個地方產品:fiddler,也可以用來分析 http 封包。 這程式其實算是一個 http proxy ,當我們啟動後,他會監聽 8888 port 當 proxy ,並且自動把 windows 的 http 及 https 的 proxy 指到本機的 8888 port,因此它就可以監聽所有的 http request 及 response。有這這程式,我們就可以容易的為 ajax 的程式除錯,或是查看 http head 、request parameter、reponse content 的內容是不是正確。如果 Firefox 要透過它來進行除錯,就要手動設定 proxy 指到本機端的 8888 port 了。 另外,因為預設 localhost 是不透過 proxy 來進行連線的,因此再本機測試的時候,可以加個點來讓瀏灠器透過 proxy 連線,如: http://localhost.:8080/ 目前這類相關 http debug 的產品看到的有: IE base:
  1. IEInspector
  2. HttpWatch
Firefox base:
  1. Live HTTP Headers
  2. HTTPGuideDog
  3. HttpFox 與 httpwatch 相當類似,還滿好用的

Debugging Deadlocks - Print All Stack Traces

http://www.symphonious.net/2008/11/24/debugging-deadlocks-print-all-stack-traces/ 如何處理 Deadlock ,雖然最近沒在寫 thread 的程式,不過留著記錄,說不定哪天會用到。
private static void printAllStackTraces() {
    Map liveThreads = Thread.getAllStackTraces();
    for (Iterator i = liveThreads.keySet().iterator(); i.hasNext(); ) {
      Thread key = (Thread)i.next();
      System.err.println("Thread " + key.getName());
        StackTraceElement[] trace = (StackTraceElement[])liveThreads.get(key);
        for (int j = 0; j < trace.length; j++) {
            System.err.println("\tat " + trace[j]);
        }
    }
}

其內容是寫說用上面這 method 去印出 thread 中的相關資訊,以便發現是哪個 thread 造成的 lock。

利用Microsoft Office Document Image Writer的ActiveX元件做OCR

http://www.javaworld.com.tw/roller/qing/entry/%E5%88%A9%E7%94%A8microsoft_office_document_image_writer%E7%9A%84activex%E5%85%83%E4%BB%B6%E5%81%9Aocr 網路上看到,留作記錄,改天再來試試

2008-12-14

Notepad++

Notepad++ 是個好用又免費而且 Opensource 的文字編輯軟體,他的 plugin 功能也不少,只是始終覺的有些功能不足,像是沒有像 Ultraedit 的區塊模式(Column Mode),列近發現原來 Notepad++ 也是有區塊模式的,使用方式如下:
  1. Alt+shift+方向鍵
  2. Alt+mouse 左鍵
  3. Edit->Column Editor => 插入文字
雖然沒有像 Ultraedit 那麼方便,但也是夠用了,看樣子對我來說, 使用 Ultraedit 的優勢可能只有它對大檔案處理的速度而己。

2008-12-10

查詢 IP 對應的電腦

前陣子在公司常被別的電腦攻擊,而防毒軟體或防火牆只知道攻擊者的 IP 而不知道實際的電腦名稱,因而不好找到攻擊者的電腦請他修復。最近剛好找到 xp 的指令可以查,留個記錄: nbtstat:

nbtstat -a 電腦名稱:查該電腦所提供的網路共享資源名稱,與網路卡硬體位址

nbtstat -A IP:查該電腦所提供的網路共享資源名稱,與網路卡硬體位址

nbtstat -n :查本機電腦所提供的網路共享資源名稱

nbstat -s :列出目前與本機電腦建立網站連線的遠端電腦名稱與資料量大小。

nbstat -S :列出目前與本機電腦建立網站連線的遠端電腦IP名稱與資料量大小。

參考:http://www1.cpshs.hcc.edu.tw/leson/netadm/nbtstat.htm

2008-12-07

JTA 的實作

最近為了加速開發,整合 JPA seam 進到公司既有的產品中,為了讓 jdbc 與 jpa 共用同一個 Transaction,便再將 JTA 整合進來,因為我們開發實作是使用 tomcat 與 jetty ,因此只能找一些 open source 的 JTA 實作,目前在網路上看到的有:
  1. JOTM 目前已經停止開發了,在跟 tomcat 整合時,使用 xapool 似乎有問題,常會取不
  2. Atomikos 近幾個版本改為 open source,目前正在使用,感覺還滿不錯的
  3. JBossTS 沒使用過,最近剛好看到。
改天有空再來分享它們相對的設定方式

2008-12-05

免費的驅動程式備份工具

DriverBackup:http://sourceforge.net/projects/drvback/

DriverMax:http://www.drivermax.com/

雖然沒用過,但這對重灌系統應該很有用吧,先留記錄,以備不時之需。 參考:http://blog.soft.idv.tw/?p=423

2008-12-04

文件編碼自動偵測

當我們拿到一個文字檔的時候,如果不知道他的編碼,就有可能顯示錯誤或是轉碼錯誤。之前看到的 solution 都不是 java 開發的,今天剛好看到,就記錄下來,以備以後不時之需:
  • jchardet :http://jchardet.sourceforge.net/ 看起來是乎是把 Mozilla Charset Detector 的演算法改用 java 撰寫。
  • cpdetector:http://cpdetector.sourceforge.net/ 據說比 jchardet 可靠,不過有時會出現奇怪的 exception
  • ROME 的 XML Charset Encoding detection 功能:http://wiki.java.net/bin/view/Javawsxml/Rome05CharsetEncoding
以上是 java 相關的 implement ,如需其它語言可看後面的參考聯結。 參考: http://blog.linux.org.tw/~jserv/archives/001672.html http://www.arachna.com/roller/spidaman/entry/character_set_encoding_detection_in http://william.cswiz.org/blog/archives/2008-10-28/charset-patch-part2/ http://fredeaker.blogspot.com/2007/01/character-encoding-detection.html

Eclipse 常用 plugin

  • M2Eclipse:Maven 的 plugin ,讓我們可以在 eclipse 整合 maven 開發。
  • subclipse:整個 svn 來進行程式碼管控
  • Implementors:方更 trace 程式,當我們程式有多種 implement 時,可以利用這個 plug in 來追踨進 method 的實作者。
  • FindBug:程式碼靜態分析,找出可能的錯誤或是不好的寫法。
  • CheckStyle:同上。
  • JInto:多國語言訊息編輯。
  • SQL Explorer:查詢資料庫。
  • Regex Util:正規表達式。
  • visualswing4eclipse:好用的 swing design 工具,跟 netbeans 的 matisse 有的拼。
  • Jigloo:GUI builder。
  • AnyEdit:為 eclipse 中的右鍵增加了不少實用的功能,如:跟外部檔案比較、space 跟tab 的轉換之類的。
  • QuickRex:正規表達式的工具。

Java decompiler

目前市面上找的到且 freee 的 Decompiler 有以下幾個:
  • Jad:http://www.kpdus.com/jad.html C++ 開發,目前好像已經沒有在發展了,最後更新日是 2006,使用它為核心的工具還不少。
  • JODE:http://jode.sourceforge.net/ java 開發,目前發展也停滯中,支援到JDK1.3。
  • jd-gui:http://java.decompiler.free.fr/ C++ 開發,持續有在發展,支援到 JDK1.5
個人覺的因為 jd-gui 有持續在開發,且支援到 jdk 1.5 ,應該會是目前最合用的 decompiler。