2008-12-31
ThinkPad 還原
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%。
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 裡:
選取 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
讓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); // 643After
/*@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 ,因此速度就提昇了。
參考:
在 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
2008-12-22
如何利用批次檔取得系統日期時間
之前曾經有想過要利用批次檔加上 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條限制
啟動 Ntdsutil.exe
Ntdsutil.exe 位於 Windows 2000 安裝 CD-ROM 上的 [支援工具] 資料夾中。- 請按一下 [開始],再按一下 [執行]。
- 在 [開啟] 文字方塊中,輸入 ntdsutil,然後按 ENTER 鍵。如果要隨時檢視說明,請在命令提示字元下輸入 ? 。
檢視目前的原則設定
- 在 Ntdsutil.exe 命令提示字元下,輸入 LDAP policies,然後按 ENTER 鍵。
- 在 LDAP 原則命令提示字元下,輸入 connections,然後按 ENTER 鍵。
- 在伺服器連線命令提示字元下,輸入 connect to server <伺服器的 DNS 名稱>,然後按 ENTER 鍵。如果要連線至目前您正在使用的伺服器。
- 在伺服器連線命令提示字元下,輸入 q,然後按 ENTER 鍵以返回前一個功能表。
- 在 LDAP 原則命令提示字元下,輸入 Show Values,然後按 ENTER 鍵。
- 如果它們存在的話,便會顯示原則。
修改原則設定
- 在 Ntdsutil.exe 命令提示字元下,輸入 LDAP policies,然後按 ENTER 鍵。
- 在 LDAP 原則命令提示字元下,輸入 Set <設定> to <變數%>,然後按 ENTER 鍵。例如: Set MaxPoolThreads to 8。 如果您將另一個處理器加入伺服器,則這個設定會變更。
- 您可以使用 Show Values 指令,確認變更。 如果要儲存變更,請使用 Commit Changes。
- 當您完成時,請鍵入 q,然後按 ENTER 鍵。
- 如果要結束 Ntdsutil.exe,請在命令提示字元下輸入 q,然後按 ENTER 鍵。
Web Debugger
- Live HTTP Headers
- HTTPGuideDog
- HttpFox 與 httpwatch 相當類似,還滿好用的
Debugging Deadlocks - Print All Stack Traces
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
2008-12-14
Notepad++
- Alt+shift+方向鍵
- Alt+mouse 左鍵
- Edit->Column Editor => 插入文字
2008-12-10
查詢 IP 對應的電腦
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 的實作
2008-12-05
免費的驅動程式備份工具
DriverBackup:http://sourceforge.net/projects/drvback/
DriverMax:http://www.drivermax.com/
雖然沒用過,但這對重灌系統應該很有用吧,先留記錄,以備不時之需。 參考:http://blog.soft.idv.tw/?p=4232008-12-04
文件編碼自動偵測
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
- 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
2008-10-26
如何在 Tomcat 中運用 JNDI 的方式取得 C3P0 的 connection pool
Tomcat 本來內建的 connection pool 是 dbcp,但據說有一堆 bug 沒解,因此想說要把 DBCP 換成 c3p0 以避免這些問題。剛好在網路上看到這個解法,就將它記下來嚕。
首先當然是要先把 c3p0 的 jar 檔及 jdbc driver 放到 tomcat 的 lib 目錄下。
Tomcat 5.0
在 Tomcat 的目錄下 conf/server.xml ,找到 <Context> 修改其內容:
<Resource name="jdbc/pooledDS" auth="Container" type="com.mchange.v2.c3p0.ComboPooledDataSource" /> <ResourceParams name="jdbc/pooledDS">
<parameter>
<name>factory</name>
<value>org.apache.naming.factory.BeanFactory</value>
</parameter>
<parameter>
<name>driverClass</name>
<value>org.postgresql.Driver</value>
</parameter>
<parameter>
<name>jdbcUrl</name>
<value>jdbc:postgresql://localhost/c3p0-test</value>
</parameter>
<parameter>
<name>user</name>
<value>swaldman</value>
</parameter>
<parameter>
<name>password</name>
<value>test</value>
</parameter>
<parameter>
<name>minPoolSize</name>
<value>5</value>
</parameter>
<parameter>
<name>maxPoolSize</name>
<value>15</value>
</parameter>
<parameter>
<name>acquireIncrement</name>
<value>5</value>
</parameter>
</ResourceParams>
Tomcat 5.5/6.0
在 Tomcat 的目錄下 conf/server.xml ,找到 <GlobalNamingResources> 加上其內容:
<Resource auth="Container"
description="DB Connection"
driverClass="com.mysql.jdbc.Driver"
maxPoolSize="4"
minPoolSize="2"
acquireIncrement="1"
name="jdbc/TestDB"
user="test"
password="ready2go"
factory="org.apache.naming.factory.BeanFactory"
type="com.mchange.v2.c3p0.ComboPooledDataSource"
jdbcUrl="jdbc:mysql://localhost:3306/test?autoReconnect=true" />
Web.xml
標準 J2EE 的程式中,需要在 web.xml 中做以下設定:
<resource-ref>
<res-ref-name>jdbc/pooledDS</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
如何利用程式取得 DataSource
InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup("java:comp/env/jdbc/pooledDS");
原文參考:http://www.mchange.com/projects/c3p0/index.html#tomcat-specific
2008-10-19
隨身碟病毒
EFix有下列功能:
- 修復因病毒造成隱藏檔選項無法開啟和磁碟雙擊顯示找不到程式的錯誤
- 修正工作管理員無法開啟的問題 (因登錄檔關閉造成的話) (4.68版後才有,前面沒有)
- 關閉自動撥放功能 (此功能在Ver4.56後取消)
- 簡易的病毒檔案刪除 (像KAVO KXVO JVVO TASO AMVO AVPO那一類的,還有部分病毒下載器,如auto.exe等等)
- 會產生掃瞄報告供解毒人員分析
- 可利用文字腳本方式刪除檔案及登錄值,使用方式請看此篇
EFix Lite有下列功能:
- 修復因病毒造成隱藏檔選項無法開啟和磁碟雙擊顯示找不到程式的錯誤
- 目前已知的KAVO系列病毒清除
磁碟無法開啟的意思是如下圖顯示:
2008-09-12
Tomcat 的 Datasource 問題
- 收到一個載入類的的請求
- 請求其父ClassLoader來完成該類的載入
- 如果父ClassLoader無法載入,則自己試圖完成該類的載入
2008-09-01
利用 VPC 測試 Internet explorer
- IE6-XPSP3_VPC.exe(421.7 MB):內含Windows XP SP3及IE6 VHD映像檔。
- IE7-VIS1.exe、IE7-VIS2.rar、IE7-VIS3.rar(3個檔案合計約1990.5 MB): 內含Vista及IE7 VHD映像檔(下載這3個檔案並放在相同目錄,再執行IE7-VIS1.exe即可解壓縮)。
- IE7-XPSP2_VPC.exe(456.8 MB):內含Windows XP SP2及IE7 VHD映像檔。
- IE8B2-XPSP3_VPC.exe(464.6 MB):內含Windows XP SP3及IE8 Beta 2 VHD映像檔。
2008-08-30
多版本 IE
2008-08-22
破解 windows 2000 的帳號密碼
2008-08-18
如何啟動 ACPI 來讓電腦自動關閉電源
- 在【我的電腦】上按右鍵,選擇【管理】,點選【裝置管理員】,展開【電腦】,如果顯示如下【Advanced Configuration and Power Interface (ACPI)PC】表示已經開啟此功能,否則則繼續往下做。
- 在上面按右鍵,選【內容】,點選【驅動程式】
- 點選【更新驅動程式】,按下一步,選擇【請顯示這個裝置目前的驅動程式清單,讓我從清單中指定驅動程式(D)】
- 點選下一步,點選下面的【顯示這個裝置類別的所有硬體】,然後選擇 ACPI 的 driver。
- 點選下一步,安裝 Driver,重開機後就大功告成了
請注意,如果你的電腦沒有 Acpi 的功能,千萬不能裝這個 Driver,否則可能出問題。
2008-03-08
2008-03-04
我的練習曲 - 預計行程
Day1 南港 => 基隆 => 礁溪 100 公里左右 Day2 礁溪 => 蘇澳 約 50 公里 Day3 蘇澳 => 新城 約 90km Day4 新城 => 花蓮 30 km Day5 花蓮 => 玉里 100 km Day6 玉里 => 台東知本 100 km Day7 台東知本 => 屏東楓港 88.45 km Day8 屏東楓港 => 墾丁 50 Day9 墾丁 => 屏東楓港 50 km Day10 屏東楓港 => 高雄路竹(芃朋家) 100 km Day11 高雄路竹 => 台南新營(Cedric 同學) Day12 台南新營 => 彰化溪洲(我家) Day13 彰化溪州 => 苗栗頭份(Nancy 家) 100 km Day14 苗栗頭份 => 中壢 90 km Day15 中壢 => 台北 50 km
五指山環島行前會
本週本來要去玉山重新體驗一下山上生活的,但是因為封了山,沒辦法去,嘉明湖的時間我又不能配合,只好引恨留在家裡當宅男嚕XD。好在下星期就要開始環島了, Lopo 說要行前會,Cedric 說要去五指山開,因此就成就了這次的行程。
原本的目標行程:
但是因為我們 GPS 還沒搞懂怎麼用,加上路沒有記的很清楚,結果多跑了一個【金龍禪寺】,前面坡度還滿徒的XD:
沒錯,就是旁邊那個 4 讓我們多爬了一段,雖然直接從那上去也是可以啦,但是為了怕迷路,加上原來只有準備走原路線的地圖,只好再騎回原路線往上爬嚕。
在上山的路上,遇到兩位走路的小姐,走的速度竟然可以跟我們騎腳踏車比,真是太慚愧了;在長青路跟五指山產業道路交界休息時,遇到一個老伯,已經六十多歲了,他六十三歲第一次買車就是去環島,而且帶帳蓬只花了十二天,我們這些年青人竟然安排了十五天去環島,真是太令我汗顏了。另外他也介紹了一條一天來回的台北騎車路線,就從五指山上去,下金山再從淡水回來,沿路還找朋友聊天喝酒,一天來回,這對我來說,怎麼可能嘛,相比之下,我真的遜掉了,唉。