2009-01-11

查看 port 被哪個程式占住了

一直以來,我都懶的去記 windows 的指令,而是使用 CurrPorts 這方便的工具來查,今天剛好在網路上看到記令,就把它記下來嚕,雖然比較麻煩,但是在沒有工具的情況下還是不錯用的:

netstat –ano a:表示列出所有連線中或 listening的連線。 n:表示使用數字形態列出,即 http 會以 80 顯示,ftp 會以 21 顯示。 o:則為列出該程式的 PID。

Noname

知道 PID 之後,接著就可以使用【工作管理員或是【tasklist】查看該 PID 是由哪一支程式所執行。

在 Linux 底下則是要用下面的指令:

netstat -tulnp

t:顯示 TCP u:顯示 UDP l:只顯示 listening 的 processes n:不要解析 IP address names 或 port numbers p:顯示 listening ports 的 process 名稱

也可以使用:

lsof -i

2009-01-09

Improve your jQuery - 25 excellent tips

最近開發網頁,都儘量使用 jQuery 來減少程式碼的撰寫,今天剛好看到網路上這篇文章,值得推薦:Improve your jQuery - 25 excellent tips,裡面有一些小技巧讓你的程式跑的更快。

依條件決定呼叫的函數

jQuery 提供了很多好用的涵數讓我們可以少寫很多 Javascript 程式碼,像 show() 及 hide() 用來顯示或隱藏元素,及 toggle() 可以在顯示與隱藏間來回切換,但當我們要依條件決定顯示或隱藏元素時,寫法還是有點囉嗦:

今天看到有人建議:suggestion to reduce show/hide code,不知道 jQuery 會不會加,不過裡面給我發現了 Javascript 的一個奇特的程式寫法,也可以少掉一些 code :

只能說,javascript 真是個神奇的語言。

2009-01-07

Tomcat Resource 使用的 lib 擺放位置

在網路上看到在 Tomcat 中設置 Datasource,都需要將 jdbc driver 放到 Tomcat 的 lib 目錄下,之前在研究使用 JTA 時,才發現原來並不一定要將 jdbc driver 放在 Tomcat 的 lib 目錄下。之前說過 Tomcat 載入 class 的順序,當我們在 context.xml 中宣告了 Resource ,如果該 Resource 的 factory 是使用到 Tomcat lib 下的 class ,此時 classloader 就只會找 Tomcat lib 目錄下的 class 來載入。

上面的寫法,使用的是 Tomcat 預設的 Factory 來啟始 Resource,如果 jdbc driver 沒有放在 Tomcat 的 Lib 下,就會無法使用。

此寫法,當我使用 factory 是 com.atomikos.tomcat.BeanFactory,我是將其 jar 檔都打包在我的 war 檔裡,因此 Tomcat 在載入此 Resource 時,會使用的是 WEB APP 的 classloader ,因此 jdbc driver 也只要放在 web app 下即可被載入。

如何利用 Java 5 Concurrency 來加速程式

好文共享:Accelerating Applications with Java 5 Concurrency

如何動態取得 Windows 系統特殊資料夾

怎麼利用 Java 去取得 windows 系統上的特殊資料夾呢? 在 dot net 平台上,微軟有準備好Environment.SpecialFolder 列舉型別 來給開發者用,而 java 平台上,目前有看到 winfoldersjava 可以使用,目前似乎不支援中文,用法如下:

import java.io.File;

import com.catnapgames.winfolders.WinFoldersJava;


public class Test {
 public static void main(String[] args) {
  System.load(new File("").getAbsolutePath() + "\\WinFoldersJava-1.0.dll");
  System.out.println("CSIDL_PERSONAL\t\t" + WinFoldersJava.getSpecialFolderPath(WinFoldersJava.CSIDL_PERSONAL));
  System.out.println("CSIDL_LOCAL_APPDATA\t" + WinFoldersJava.getSpecialFolderPath(WinFoldersJava.CSIDL_PERSONAL));
  System.out.println("CSIDL_MYPICTURES\t" + WinFoldersJava.getSpecialFolderPath(WinFoldersJava.CSIDL_MYPICTURES));
  System.out.println("CSIDL_COMMON_APPDATA\t" + WinFoldersJava.getSpecialFolderPath(WinFoldersJava.CSIDL_COMMON_APPDATA));
  System.out.println("CSIDL_COMMON_DOCUMENTS\t" + WinFoldersJava.getSpecialFolderPath(WinFoldersJava.CSIDL_COMMON_DOCUMENTS));
  
 }
}

這程式目前對中文似乎不支援。如果只是要取得【我的文件夾】目錄的話,可以直接使用 Swing 的功能取得,中文沒問題:

javax.swing.filechooser.FileSystemView.getFileSystemView().getDefaultDirectory()

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。