顯示包含「computer」標籤的文章。顯示所有文章
顯示包含「computer」標籤的文章。顯示所有文章

2009-09-15

Putty SSH solve inactive

That was the problem what my colleague encountered this morning. When
his Putty initiated SSH connection from outskirt to servers at HQ over
VPN connection, with a not-so-good dial-up networking, the VPN router
consistently disconnect / drop the SSH session whenever the idle
threshold triggered.

However, some of the client software might able to overcome the
restriction. For example, the Putty (wonderful Windows SSH client)
offers keepalive option to get rid of "VPN router disconnects idle
connection"!

[ Optional, only applicable if you want to save a SSH profile for
convenient ] Click on the Session category tree menu, enter Host name
or IP address of target host, select SSH protocol and gives it a
meaningful profile name in Saved Sessions text box.

Click on the Connection category tree menu, enter a non-zero digit
(indicates number of seconds) in Seconds between keepalives (0 to turn
off) text box.

Go back to Session category tree menu and click the Save button.

From now onwards, whenever you load this SSH session profile and click
Open button, the keepalive feature will be enabled to keep the
inactive / idle SSH session from disconnected by VPN router (that
enforce such rigid security practice).

So, if you're using Putty as Windows SSH client and encounter problem
of SSH disconnected after idle / inactive for some minutes, please try
to configure the keepalive option.

SSH Tunnel 帶你遨遊

資訊安全 - SSH Tunnel 帶你遨遊


只能說是交友不慎啊,朋友有難我都不得不幫忙啊,挑戰資安的是怎麼會找上我咧,我一直自稱是守規矩的老百姓啊。

朋友困難:
1.似乎只有開放destination為80的連線
2.無法到Yahoo及Google的webmail
3.不能連上MSN

真是不知道朋友找我是找對人還是找錯人啊??但是還是幫他試試看囉,需求一台暴露在網路上的主機可以ssh登入,我是以CentOS4.0(A伺服器)來做實驗,該主機有apache服務,因此我總不能把ssh的service
port改成80吧。在此狀況之下,要求朋友在公司時利用whatismyip一站查出公司對外連線所帶的IP(為11.12.13.14~16五個IP,虛構),我來幫他做轉port的動作。

在A伺服器的設定(ssh service port 2222,私有192.168.1.80)
設定來源為11.12.13.14~16,目的為service port 80轉向到service port 2222
iptables -t nat -A PREROUTING -s 11.12.13.14 -d 192.168.1.80 -p tcp -m
tcp --dport 80 -j REDIRECT --to-ports 2222
iptables -t nat -A PREROUTING -s 11.12.13.15 -d 192.168.1.80 -p tcp -m
tcp --dport 80 -j REDIRECT --to-ports 2222
iptables -t nat -A PREROUTING -s 11.12.13.16 -d 192.168.1.80 -p tcp -m
tcp --dport 80 -j REDIRECT --to-ports 2222
開啟ip_forward
sysctl -w net.ipv4.ip_forward=1
主動對外連線都要開
iptables -P OUTPUT ACCEPT

Windows XP 下Route 指令應用簡介

Windows XP 下Route 指令應用簡介
Windows XP 裡頭內建一個相當實用的路由指令-
Route,可以用來查詢路由表及新增或移除某個路由路徑,尤其適用於安裝兩片以上網路卡的系統。封包很可能因為網路設定錯誤的問題,造成連線緩慢異常,甚而無法以您期望的方式傳送封包,這時
route 指令是很方便的除錯工具,底下就簡單說明 route 指令的語法。

Route print 用來顯示路由表
此例中實際只安裝ㄧ片網路卡,此路由表中的幾個欄位:
Network Destination: 表示路由的網路目的地,可以是 IP 網段或IP位址。
Netmask:表示子網路遮罩,用來配合 Network Destination 的運算。
Gateway:是封包欲送往的 IP 位址,如果目的 IP 位址與 Netmask 作 AND 邏輯運算,剛好與 Network
Destination 相同,封包就會送到此 Gateway 的 IP 位址。
Interface: 是此電腦送出封包的 IP 位址。
Metric: 則是傳送成本的參考數字,通常與網路連接速度有關,Windows XP 本身有自動計算 Metric
的能力,以本表中範例而言100Mbps 的網路速度 Metric 設為 20,迴路(loopback)的 Metric 設為 1,越低的
Metric 表示速度越快。

接著針對每一筆路由表作說明:
1. 第一筆(Network Destination:0.0.0.0 .... )是預設路徑(default
route),只要路由表找不到傳送路徑的封包,最後都會由會交由預設路徑傳送,因為不論是什麼 IP 位址與 0.0.0.0 的網路遮罩作
AND 運算,結果都是 0.0.0.0,因此封包會被傳送到 192.168.1.1 此一Gateway。
2. 第二筆(Network Destination:127.0.0.1 ... )是迴路路徑,因此所有要傳送到 127.x.x.x
的封包最候都會送到 127.0.0.1 IP 位址,也就是電腦自己。
3. 第三筆(Network Destination:192.168.1.0)是電腦目前所處的網段路徑,所有要送到 192.168.1.0
都封包都直接由電腦本身 192.168.1.3 的 IP 送出,不需透過其他路由器。
4. 第四筆(Network Destination:192.168.1.3)是電腦本身的 IP 位址,所以要把封包送給自己,就直接送到
127.0.0.1 這個內部IP位址。
5. 第五筆(Network Destination:192.168.1.255)是電腦目前所處網段的廣播路徑,要傳送到
192.168.1.255 的網段廣播封包,都直接由電腦本身 192.168.1.3 的 IP 送出,不需透過其他路由器。
6. 第六筆(Network Destination:224.0.0.0)是於多重傳播路徑,所有要送到 224.x.x.x 的 IP
位址都會直接交由電腦本身 192.168.1.3 的 IP 送出,不需透過其他路由器。
7. 第七筆(Network Destination:255.255.255.255)代表廣播位址,也就是 255.255.255.255
目的位址的封包都會直接交由電腦本身 192.168.1.3 的 IP 送出,不會透過其他路由器,所有在 192.168.1.x
網段的電腦都會收到此封包。

在路由表的選擇上,可能會有兩條以上符合的路徑可供選擇,這時候應該如何選擇路徑?以傳送目的地 192.168.1.100
的封包為例,在上述的路由表第一筆與 Netmask 0.0.0.0 AND 運算結果符合 Network Destination
0.0.0.0,與第三筆 Netmask 255.255.255.0 AND 的運算結果也符合 Network Destination
192.168.1.0;這時路徑會選擇以Netmask 轉換為二進制之後含1最多那一筆來傳送,因此封包最後將由第三筆路徑做處理。

上述是一張網路卡時的路由表運作,如果加入另一張網路卡時,封包將會如何傳送?我們還是先列出路由表。

由表中可以發現所有原有路徑變成兩份,因此可能有兩條路徑可以選擇,以 default route 路徑而言就有 192.168.1.1 與
192.168.216.254 兩條 Gateway 可走,因此路徑的選擇就依 Metric 大小來決定,metric
越小表示成本越低,所以路徑將選擇較低的 default route,因而表中顯示預設閘道(default gateway)會是 Metric
較低的 192.168.216.254。如果 Metric 一樣,這時就以隨機方式選擇路徑;如果原來的 default route
的網路連線斷了,那路徑將主動切換到另一條 default route。

其他常用route 指令

● route add 用來加入路由路徑
例如:route add 192.168.0.0 mask 255.255.0.0 192.168.1.1 if 0x2 metric 20

指出 Network Destination、Netmask、Gateway、Interface 和 metric。


● route -p add 用來永久加入路由路徑,使用-p 參數可以保留路徑設定,不會因為電腦重開機而消失。
例如:route -p add 192.168.0.0 mask 255.255.0.0 192.168.1.1 if 0x2 metric 20。


● route delete用來刪除路由路徑。
例如:route delete 192.168.0.0 mask 255.255.0.0。


● route change用來修改現有的路徑設定。
例如:route change 192.168.0.0 mask 255.255.0.0 192.168.1.1 if 0x2 metric 10

將原先路徑設定的 metric 20 改為 10,這種修改最直接的影響就是改變路徑的選擇,如果有兩條路徑可以選之時,metric 較低的路徑將被優先考慮。
====================================================================
以學校電腦教室為例,教師的主機有兩張網卡,
用的都是private ip,
一張是接電腦教室switch,跟學生電腦連接,走的是縣網,ip是192.168.16.200,gateway是192.168.16.254
另一張是接辦公室switch,跟辦公電腦連接,走的是中華電信ADSL,ip是192.168.1.18,gateway是192.168.1.1
假如我今天想讓教師電腦所有的上網都走adsl(比較快),但是跟學生與電腦教室硬碟、以及其他縣內教育網路的電腦聯結時則走縣網,那我需要做的設定有二:
1.route -p change 0.0.0.0 mask 0.0.0.0 192.168.1.1 if
0x10004(這邊的數值請看route print的值) matric
15(不一定要15,不過要讓這張的MATRIC比另一張的值來得低一點)
2.route -p add 163.22.0.0(縣網內的網段) mask 255.255.0.0 192.168.16.254 if
0x20002 matric 10(這裡的值一定要比default gatway低,不然就白設了)
這樣子一來,就可以達到快速上網/縣網,還有快速聯結電腦教室電腦的目的了

2009-09-10

PuTTY - SSH Tunnel 運用備忘

PuTTY - SSH Tunnel 運用備忘
PuTTY 除了能讓 Windows 平台以 ssh 通訊協定連入 Unix-Like 作業系統之外, ssh 連線後的通道還能達成許多目的, 如: 突破防火牆封鎖、防止網路封包竊聽、遠端存取防火牆內資源等等. 例如員工出差透過 ssh 安全通道連回公司存取資料, 以確保資料安全.

常見的 SSH Tunnel 運用如下:

透過 proxy 安全上網、讓 msn 突破防火牆封鎖
連入 smtp、pop3、vnc (遠端桌面)、samba (網路上的芳鄰)
ssh server 環境:

Unix-Like 作業系統 + ssh daemon
Windows 作業系統 + cygwin with sshd
內建 sshd 的 IP 分享器
client pc 環境:

下載 PuTTY, 將 putty.exe 置於 C:\Windows\System32 目錄中, "開始"→"執行" 或 "命令提示字元模式" 中輸入 putty 即可執行
實例一: 使用 proxy (代理伺服器)

目的: 避免被監聽 URL、蒐集密碼

↓啟動 PuTTY, 輸入 sshd host 網址



↓切換到 Connection -> SSH -> Tunnels 畫面, 輸入 Source port: 8080 (自訂), Destination: proxy server 的 IP 和 Port, 輸入完畢記得按 "Add"



↓如有需要, 可回到 Session 畫面儲存 (Save) 設定值, 以後執行 PuTTY 時可直接讀取 (Load) 設定值. 在任何畫面按 "Open" 即可以目前設定進行連線.



↓登入 sshd host 後, 將視窗縮到最小, 保持 ssh 連線



↓開啟瀏覽器, 設定 proxy 為: localhost:8080 以 IE 為例: 工具→網際網路選項→連線→區域網路設定



設定完畢回到瀏覽器主畫面, 開始透過 ssh 安全通道瀏覽網頁

實例二: MSN Messenger

目的: 突破公司防火牆限制、避免被側錄聊天內容

↓PuTTY 設定: Source port: 1080; Destination: 空白, Dynamic 設定完畢記得按 "Add" (其他 PuTTY 操作同上述)



↓MSN Messenger 設定: 工具→選項→連線→進階設定→只勾選 SOCKS 5 版, 伺服器: localhost, 連接埠: 1080



實例三: Outlook Express

目的: 避免被攔截信件內容、蒐集密碼

↓PuTTY 依序設定: Source: 25, Destination: smtp.host.ip:25; Source: 110, Destination: pop3.host.ip:110 (都是 Local)



↓Outlook Express 設定: POP3: localhost; SMTP: localhost



實例四: 網路上的芳鄰

目的: 存取遠端檔案分享資源

↓新增硬體: 網路介面卡 -> Microsoft -> Microsoft Loopback Adapter



↓取消勾選 "File and Printer Sharing for Microsoft Networks", 點選 "Internet Protocol (TCP/IP)" -> "內容" 進行下一步設定



↓設定 Loopback Adapter IP 位址為: 10.0.0.1 / 255.255.255.0, 點選 "進階" 進行下一步設定



↓點選 "停用 [NetBIOS over TCP/IP]", 按確定完成所有設定後, 重新啟動電腦.



↓PuTTY 設定: Source port: 10.0.0.1:139; Destination: samba.server.ip:139 或 其他 windows 分享電腦 : 埠號 139



↓連線網路磁碟機: 直接把 10.0.0.1 當成一般 Windows 分享電腦即可




後記:

若遭防火牆擋 22 port, 可將 ssh server 改成 80 port
若要防止公司內部人員使用 PuTTY + ssh 通道搞怪, 可於 Linux NAT + Layer 7 防火牆 擋掉 ssh 通訊協定:
iptables -A FORWARD -m layer7 --l7proto ssh -j DROP
參考資料:

PuTTY 的應用 -- proxy
Breaking Firewalls with OpenSSH and PuTTY
如何利用SSH隧道穿越你的企业级防火墙
只需HK$500就可以突破公司防火牆
命令列下的MSN - pebrot

甚麼是 SSH Tunnel?

甚麼是 SSH Tunnel?其實我在以前的文章也介紹過,網路上的資源也相當豐富,設定方法不只在之前的文章有提到,網路上的教學也是到處都是,在 Linux 中設定 SSH Tunnel 其實也不會太難,-D 和 -R 的參數網路上教學文章也不少,只是透過 http proxy 再連出去的文章就比較少了,我先前的文章 SSH Tunnel 帶你遨遊 內介紹的是利用 putty 先連過要認證的 http proxy,之後在利用特定 ip 連線後轉 port 的方式來達到可以成功 ssh,只要能 ssh 連線的話建立 SSH Tunnel 私密通道也不會是啥大問題。

前段文章提到 ssh command -D 和 -R 的參數應用,這兩個參數的應用都是在可以直接 ssh 後的進階運用,若今天一切的連線都只能透過 http proxy 出去的話,要建立通道就不是那樣的簡單,而且網路上得中文資源不足,我稍微研究之後在此跟大家分享一些心得。

這次練功所要用到的軟體是 ProxyTunnel,比較可惜的是在 Ubuntu 上無法直接安裝,若是 RedHat 系列的話還有快速的 RPM,所以今天只好自己編譯安裝囉,相信自己編譯安裝不是那麼可怕的!

(此時好死不死這篇文章就此撰寫停頓,這個編譯我搞哩好久,後來問題還是出在一些編譯的軟體身上,開發套件果然還是都裝一裝比較好,編譯就比較不會有問題。)

把簡易的資訊列出來給大家看下,讓家知道到底有哪些參數可以利用

$ proxytunnel
Proxytunnel 1.8.0 (rev 0)
Copyright 2001-2007 Proxytunnel Project
Jos Visser (Muppet) , Mark Janssen (Maniac)

Purpose:
Build generic tunnels trough HTTPS proxy's, supports HTTP authorization

Usage: Proxytunnel [OPTIONS]...
-h --help Print help and exit
-V --version Print version and exit
-i --inetd Run from inetd (default=off)
-a INT --standalone=INT Run as standalone daemon on specified port
-e --encrypt Encrypt proxy<->destination using SSL
-E --encrypt-proxy Encrypt client<->proxy (proxy talks SSL)
-x STRING --proctitle=STRING Set the process-title to STRING
-p STRING --proxy=STRING Proxy host:port combination to connect to
-d STRING --dest=STRING Destination host:port to built the tunnel to

Parameters for proxy-authentication (not needed for plain proxies):
-u STRING --user=STRING Username to send to HTTPS proxy for auth
-s STRING --pass=STRING Password to send to HTTPS proxy for auth
-U STRING --uservar=STRING Env var with Username for HTTPS proxy auth
-S STRING --passvar=STRING Env var with Password for HTTPS proxy auth
-F STRING --passfile=STRING File with credentials for proxy auth
-N --ntlm Use NTLM Based Authentication
-t STRING --domain=STRING NTLM Domain (default: autodetect)
-r STRING --remproxy=STRING Use a remote proxy to tunnel over (2 proxies)
-H STRING --header=STRING Add STRING to HTTP headers sent to proxy

If you don't provide -s or -S you will be prompted for a password.

Miscellaneous options:
-v --verbose Turn on verbosity (default=off)
-q --quiet Suppress messages (default=off)

Examples:
Proxytunnel [ -h | -V ]
Proxytunnel -i [ -u user ] -p proxy:port -d host:port [ -v | -q ]
Proxytunnel -i [ -U envvar ] -p proxy:port -d host:port [ -v | -q ]
Proxytunnel -a port -p proxy:port -d host:port [ -v | -q ]
若想仔細瞭解這些參數的話可以慢慢研究,我想可以研究的可多哩!


使用的方式大家可以到官方頁面去參考,相信裡面的資訊應該是挺豐富的,我這裡要回到主題上的 SSH Tunnel On Linux Over Http Proxy,前一篇文章有提到 Text Mode Use Http Proxy On Linux ,若設定 ssh 利用 http_proxy 來連線有前篇文章簡單就好了,可惜就是沒有 ssh_proxy 的設定可以利用,因此要自己要在做一些特殊的設定。

ssh 有幾個簡單的設定檔,/etc/ssh/sshd_config 是給 ssh server 用的設定檔,/etc/ssh/ssh_config 是給連線出用的設定檔,個人家目錄的設定檔得寫在 ~/.ssh/config,這檔案不會自動產生得自己去寫才可以,以下設定是參照這裡。


$ cat config
#自己設定一個 port 給建立 tunnel 後來 listen
DynamicForward 8080
ProxyCommand proxytunnel -v -u 帳號 -s 密碼 -p 需要帳密的代理伺服器:port -d %h:%p -H "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)\n"
ServerAliveInterval 30

要測試看看連線嘛?當然要啊~不然設定幹嘛?

$ ssh wawa@遠端ssh伺服器 -p port
Proxy basic auth is dmRjaGlhaHNpbmxpdTaaNDIxMDMwNg==
Connected to 需要帳密的代理伺服器:port (local proxy)
Tunneling to 遠端ssh伺服器:port (destination)
Connect string sent to local proxy:
-> CONNECT 遠端ssh伺服器:port HTTP/1.0
-> Proxy-authorization: Basic dmRjaGlhaHNpbmxpdTaaNDIxMDMwNg==
-> User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)\n
-> Proxy-Connection: Keep-Alive
Data received from local proxy:
<- HTTP/1.1 200 Connection established
Tunnel established

之後輸入遠端ssh伺服器帳號密碼,若登入了就是 ok 囉!
接下來當然也要驗證給大家看本機是有在 listen 自己設定的 8080 port 的

$ netstat -tnl | grep 8080
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 ::1:8080 :::* LISTEN


以上的步驟來是要提醒大家一個重點,因為是透過 http proxy 連線的,若沒有開放 80 port 以外的對外連線,而你的 ssh server 又是開預設的 22 port ,那一定是連不到的唷!所以比較方便的方式是利用 iptable 的 redirect 的功能來轉 port,這方式也在先前文章 SSH Tunnel 帶你遨遊 內有提到,有需要在回頭看囉!

基本上這跟 windows 上連線的不同就在於 windows 內有 putty 可以用,putty 可以先設定連線方式,也就是可以輕鬆搞定 http_proxy 那個環節,在 linux 上我是還沒有看到類似 putty 類似的工具可以先設定連線方式再 ssh,於是才會透過 proxytunnel 的方式來進行連線,不知道看文章你的懂哩沒有?不懂也沒有關係,因為沒用到懂哩也沒用,需要時在查找就好,不然那麼多資訊文章哪裡記的住啊?對吧!

利用 SSH over HTTP 突破 Proxy Firewall

利用 SSH over HTTP 突破 Proxy Firewall
話說上次順利用 Linux Server 連上 IEEE 802.1x Ethernet 後,
整個工作效率可說是提升許多.

不用在 Windows, Linux 兩邊 copy 來 copy 去的,
直接在我的 NB checkout CVS/SVN repositories......
心情整個都好了起來!!

不過公司大概是因為顧慮到資訊安全的關係,
所以現在的網路環境是採用 Proxy Firewall, 而非 NAT.
也就是說要上 Internet 都得透過 Proxy, 內網無法直接 Routing 出去.
基本上只會開放 80 (http), 443(https), 及 21(FTP), 這幾個 Proxy 支援的 Ports.

所以無法 SSH, IRC, checkout GIT repository(除非走http), ......等等.
一般 Linux User 常見的工作需求.

上次與 Yuren 見面時提到了這個不方便處
, 他跟我開玩笑的說找找看有沒有什麼 "SSH over HTTP" 之類的東西.
所以在 IEEE 802.1x 搞定之後, 便上 Google 打了 "SSH over HTTP" 這樣的關鍵字.
結果沒想到還真的有這種東西勒!!

詳情請參考: ProxyTunnel http://proxytunnel.sourceforge.net/

經過我犧牲一夜沒睡, 第二天照常上班的苦戰後.
整理出以下心得:

1) 如果你在 Internet 上的主機, 可以讓 SSH listen 443 port
, 那樣或許可以直接使用內網 Proxy 連上. (關鍵在於內網那台 proxy)

2) 如果你 443 已經有跑東西了(如: apache https), SSH 不方便轉過去 443 的話.
那你將會需要把 apache 的 proxy 功能打開, 並記得要載入 proxy CONNECT module.

3) 關鍵其實是在於 HTTP CONNECT method 的支援. 依照 SPEC. 的講法, 這個 method 本來
是留給 proxy 用來建立 SSL tunnel 的.
所以感覺上有別於 POST, GET 這種 connectionless 的方式. (我猜的...沒看完 SPEC.)
故可以被利用來建立 SSH Tunnel.

4) 講清楚一點就是, proxy 可以設定欲支援的 CONNECT method 的 ports.
而一般 Proxy 通常會支援 443(HTTPS), 568(NNTP) 這兩個 ports.
所以如果你內網的 proxy 支援 CONNECT method 到 443 port 的話.
那你在 Internet 上的 SSH 只要 Listen 443 port 即可.

5) 要不就是你 Internet 上的 apache 要 listen 443 port, 並開啟 proxy functionality.
另外我試過開 SSL(https), 但是 MS ISA Proxy 會一直說不 support (??!!)
所以我整夜沒睡的經驗是, Apache listen 443 port, 但要關掉 SSL (https).
也就是說, 在 443 port 跑一般 HTTP 服務.

6) 至於你自己架的 proxy, APACHE 有提供一個 AllowCONNECT 參數.
也就是該 proxy 打算 support CONNECT 的 ports. (如: ssh 是 22)
(其實你也可以連別的 ports, 只要記得設定進來就可以了)

7) 最後, Squid 也可以做到同樣功能, 不過記得 Listen 443 port.
而且 Squid 的設定會比 apache 來的靈活.
但這樣你又沒 apache https 了 (很想殺人吧?).


相關設定範例請參考, http://dag.wieers.com/howto/ssh-http-tunneling/


你可以先用下面 commands 測試, OK 後才寫進 ~/.ssh/config:

proxytunnel -v -p local_proxy:3128 -d your_ssh:443
(如果你可以將 SSH Listen 443 port 的話, 另外內網的 proxy 可以讓你 CONNECT)

proxytunnel -v -p local_proxy:3128 -r your_proxy:443 -d your_ssh:22
(如果你家主機 apache 有開 proxy 在 443, 跑 HTTP 協定)


結語:
1) 如果你的 local proxy 是 MS ISA proxy, 並需要認證的話, 這 tool 有支援.
不然你可以再多架一個 ntlmaps.

2) 其實 proxytunnel 本身有支援 SSL(https), 但我的 local MS ISA proxy 會有問題.
不然你可以用 -X 要求 local_proxy 跟 your_proxy 間使用 SSL.
或是 -E 可以要求 "你的電腦" 與 local_proxy 間使用 SSL.

3) your_proxy 請用 IP 擋掉全部, 只開你工作地方的 IP.
並請不要開 Http Auth, 因為這 tool 還沒支援第二台 proxy http 認證.

2009-09-01

java jsp

JSP動作包括:
jsp:include:在頁面被請求的時候引入一個檔。
jsp:useBean:尋找或者實例化一個JavaBean。
jsp:setProperty:設置JavaBean的屬性。
jsp:getProperty:輸出某個JavaBean的屬性。
jsp:forward:把請求轉到一個新的頁面。
jsp:plugin:根據流覽器類型為Java插件生成OBJECT或EMBED標記。
JSP動作利用XML語法格式的標記來控制Servlet引擎的行為。利用JSP動作可以動態地插入檔、重用JavaBean元件、把用戶重定向到另外的頁面、為Java插件生成HTML代碼。

13.1 jsp:include動作
   該動作把指定檔插入正在生成的頁面。其語法如下:
<jsp:include page="relative URL" flush="true" />

  前面已經介紹過include指令,它是在JSP檔被轉換成Servlet的時候引入檔,而這�的jsp:include動作不同,插入檔的時間是在頁面被請求的時候。jsp:include動作的檔引入時間決定了它的效率要稍微差一點,而且被引用檔不能包含某些JSP代碼(例如不能設置
HTTP頭),但它的靈活性卻要好得多。
   例如,下面的JSP頁面把4則新聞摘要插入一個"What's New ?"頁面。改變新聞摘要時只需改變這四個檔,而主JSP頁面卻可以不作修改:

WhatsNew.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>What's New</TITLE>
</HEAD>
<BODY BGCOLOR="#FDF5E6" TEXT="#000000" LINK="#0000EE"
VLINK="#551A8B" ALINK="#FF0000">
<CENTER>
<TABLE BORDER=5 BGCOLOR="#EF8429">
<TR><TH CLASS="TITLE">
What's New at JspNews.com</TABLE>
</CENTER>
<P>
Here is a summary of our four most recent news stories:
<OL>
<LI><jsp:include page="news/Item1.html" flush="true"/>
<LI><jsp:include page="news/Item2.html" flush="true"/>
<LI><jsp:include page="news/Item3.html" flush="true"/>
<LI><jsp:include page="news/Item4.html" flush="true"/>
</OL>
</BODY>
</HTML>
   13.2 jsp:useBean動作

   jsp:useBean動作用來裝載一個將在JSP頁面中使用的JavaBean。這個功能非常有用,因為它使得我們既可以發揮Java元件重用的優勢,同時也避免了損失JSP區別於Servlet的方便性。jsp:useBean動作最簡單的語法為:
<jsp:useBean id="name" class="package.class" />

  這行代碼的含義是:"創建一個由class屬性指定的類的實例,然後把它綁定到其名字由id屬性給出的變數上"。不過,就象我們接下來會看到的,定義一個
scope屬性可以讓Bean關聯到更多的頁面。此時,jsp:useBean動作只有在不存在同樣id和scope的Bean時才創建新的物件實例,同時,獲得現有Bean的引用就變得很有必要。
  獲得Bean實例之後,要修改Bean的屬性既可以通過jsp:setProperty動作進行,也可以在Scriptlet中利用id屬性所命名的物件變數,通過調用該物件的方法顯式地修改其屬性。這使我們想起,當我們說"某個Bean有一個類型為X的屬性foo"時,就意味著"這個類有一個返回值類型為X的getFoo方法,還有一個setFoo方法以X類型的值為參數"。
  有關jsp:setProperty動作的詳細情況在後面討論。但現在必須瞭解的是,我們既可以通過jsp:setProperty動作的value屬性直接提供一個值,也可以通過param屬性聲明Bean的屬性值來自指定的請求參數,還可以列出Bean屬性表明它的值應該來自請求參數中的同名變數。
  在JSP運算式或Scriptlet中讀取Bean屬性通過調用相應的getXXX方法實現,或者更一般地,使用jsp:getProperty動作。
    注意包含Bean的類檔應該放到伺服器正式存放Java類的目錄下,而不是保留給修改後能夠自動裝載的類的目錄。例如,對於Java Web
Server來說,Bean和所有Bean用到的類都應該放入classes目錄,或者封裝進jar檔後放入lib目錄,但不應該放到servlets
下。
   下面是一個很簡單的例子,它的功能是裝載一個Bean,然後設置/讀取它的message屬性。

BeanTest.jsp

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE>Reusing JavaBeans in JSP</TITLE>
</HEAD>
<BODY>
<CENTER>
<TABLE BORDER=5>
<TR><TH CLASS="TITLE">
Reusing JavaBeans in JSP</TABLE>
</CENTER>
<P>
<jsp:useBean id="test" class="hall.SimpleBean" />
<jsp:setProperty name="test"
property="message"
value="Hello WWW" />
<H1>Message: <I>
<jsp:getProperty name="test" property="message" />
</I></H1>
</BODY>
</HTML>
   SimpleBean.java
   BeanTest頁面用到了一個SimpleBean。SimpleBean的代碼如下:
package hall;
public class SimpleBean {
private String message = "No message specified";
public String getMessage() {
return(message);
}
public void setMessage(String message) {
this.message = message;
}
}
   13.3 關於jsp:useBean的進一步說明
   使用Bean最簡單的方法是先用下面的代碼裝載Bean:
<jsp:useBean id="name" class="package.class" />
  然後通過jsp:setProperty和jsp:getProperty修改和提取Bean的屬性。不過有兩點必須注意。第一,我們還可以用下面這種格式實例化Bean:
<jsp:useBean ...>
Body
</jsp:useBean>

  它的意思是,只有當第一次實例化Bean時才執行Body部分,如果是利用現有的Bean實例則不執行Body部分。正如下面將要介紹的,jsp:useBean並非總是意味著創建一個新的Bean實例。
  第二,除了id和class外,jsp:useBean還有其他三個屬性,即:scope,type,beanName。下表簡要說明這些屬性的用法。屬性用法
id 命名引用該Bean的變數。如果能夠找到id和scope相同的Bean實例,jsp:useBean動作將使用已有的Bean實例而不是創建新的實例。
scope 指定Bean在哪種上下文內可用,可以取下面的四個值之一:page,request,session和application。
預設值是page,表示該Bean只在當前頁面內可用(保存在當前頁面的PageContext內)。

request表示該Bean在當前的客戶請求內有效(保存在ServletRequest物件內)。
session表示該Bean對當前HttpSession內的所有頁面都有效。

最後,如果取值application,則表示該Bean對所有具有相同ServletContext的頁面都有效。

scope之所以很重要,是因為jsp:useBean只有在不存在具有相同id和scope的物件時才會實例化新的物件;如果已有id和scope都相同的物件則直接使用已有的物件,此時jsp:useBean開始標記和結束標記之間的任何內容都將被忽略。
type 指定引用該物件的變數的類型,它必須是Bean類的名字、超類名字、該類所實現的介面名字之一。請記住變數的名字是由id屬性指定的。

beanName 指定Bean的名字。如果提供了type屬性和beanName屬性,允許省略class屬性

2009-08-30

Installing AppLocale in Windows 7

Installing AppLocale in Windows 7
May 2nd, 2009
Goto comments
Leave a comment It's been several weeks since I installed a
pre-release version of Windows 7 in my home computer. Almost every
program I am using frequently runs very smooth in the computer.

Microsoft AppLocale was an exception, until today…

AppLocale is a program that helps you run a non-unicode program in a
different locale to what user's windows system is currently running.
For example, if you are using a version of Japanese version of Windows
system, but you are trying to run a Chinese Version of particular
software, AppLocale can helps you on this regard. I have a large
quantity of mp3 collections have been tagged in Korean, but I am
running windows in Chinese Version, it made most of mp3 tags in iTunes
become ill-displayed. So, AppLocale become my favorite!

But under Windows 7, AppLocale could not be installed properly in some
reason. I tried to look up some information around the web. I scrapped
following tip from
http://qna.live.com/ShowQuestion.aspx?qid=A012C78EF7304B50BD7972B5F11F69B9

Here's how to install AppLocale on Windows 7:
1. Place the AppLocale installer (apploc.msi) in your C: drive.
2. Go to your start menu, type cmd in the search box.
3. Hold down crtl+shift and click on cmd.exe.
4. Select Yes when a dialog asks if you want the program to make
chances to your computer.
5. The command prompt should show C:\Windows\System32.
6. Type cd\ and press enter to navigate to the C: drive.
7. Type apploc.msi and press enter, the installer will appear.
8. Install the application.

Update:

As I updated my Windows 7 to latest Release Candidate (Build 7100), I
found that it removed my AppLocale. All the AppLocale generated
shortcuts are gone, and as I click the AppLocale, it required me to
input the original package.

I tried to repeat the same way to install again, but Windows 7 did not
allow me the copy the package into C drive. Here is what I did.

1. Click Start, type "cmd" in search box.
2. Right click the "cmd" icon, and select "run as administrator"
3. Copy the apploc.msi into c:\ in DOS command. (e.g. Copy
f:\program\apploc.msi c:\)
4. Run "appLoc.msi" by type it in DOS command.

You have to make sure that you opened the DOS command mode in
administrator, otherwise it won't let you copy the file into C drive.

2009-08-26

java Struts Validator驗證器使用指南

Struts Validator驗證器使用指南
Struts Validator驗證器使用指南
(根據Struts Validator Guide)
作者:
David Winterfeldt大衛
James Turner詹姆斯
Rob Leland羅伯特
翻譯:
侯思超
驗證器:
從0.5版,驗證器在一些form中就已經實現了,他最初包含在開發人員包中,後來核心代碼挪到Jakarta
Commons包中和Struts特別擴展中作為 Struts
1.1的一部分。許多開發者為方便一直使用struts驗證器,這篇文檔首先概述驗證器的核心功能性,然後大概介紹在
struts1.1中的變化和新增功能。
如果你配置好驗證器插件,你應該擴展ValidatorForm而不是ActionForm,以便它能載入你的Validator資源。他根據struts-config.xml檔中的action的name屬性為當前form的調用相應的驗證器,因此在validator-rules.xml中的form元素的名稱屬性應該與action的name屬性值相匹配。
另外一種選擇是擴展ValidatorActionForm
而不是ValidatorForm,ValidatorActionForm使用struts-config.xml中action的path屬性,所以path屬性的值相應的應該與validator-rules.xml中的Form的name屬性匹配。
一個分離的action可以定義給多頁form的每個頁面,而且驗證規則可以與action關聯而不是與頁碼,就像驗證範例中的多頁form範例那樣。
國際化
在validator-rules.xml 檔中form的驗證規則可以組織為FormSet。FormSet
有與java.util.Locale 類相應的屬性:如語言, 國家以及變數型屬性,如果他們未定義,FormSet
將把它設置為預設值。一個FormSet 也可以有關聯的常量。另外還可以定義與FormSet
同一級別的全局global元素,他與FormSet同樣也有常量。
注意:你必須在國際化的FormSet前聲明一個沒有國際化的默認FormSet。這樣如果Validator沒有找到locale時可以有一個默認版本。
可插入驗證器的默認錯誤資訊值可以被msg元素覆蓋。所以為mask驗證器生成錯誤資訊的替代方法就是使用msg屬性,如果欄位的name屬性與驗證器的name屬性匹配,那末將使用欄位的msg屬性。
error messages的可以設置arg0-arg3 等參數元素。如果沒有設置arg0-arg3的name屬性,
error messages將使用他們作為默認的構建參數值。如果設置了name屬性,你就可以把參數指定給一特定的可插入驗證器,然後這些參數將在構造錯誤資訊時被使用。
<field
property="lastName"
depends="required,mask">
<msg
name="mask"
key="registrationForm.lastname.maskmsg"/>
<arg0 key="registrationForm.lastname.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>^[a-zA-Z]*$</var-value>
</var>
</field>
默認的arg0-arg3元素將在消息資源中查找相應的key,如果資源屬性設為false,她將把值直接傳進去,而不從消息資源中查找。注意1.1版本中,你必須為每個模組中明確地定義在驗證中用到的消息資源,否則將使用top-level資源。
<field
property="integer"
depends="required,integer,intRange">
<arg0 key="typeForm.integer.displayname"/>
<arg1
name="range"
key="${var:min}"
resource="false"/>
<arg2
name="range"
key="${var:max}"
resource="false"/>
<var>
<var-name>min</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>20</var-value>
</var>
</field>
常量/變數
全局的常量可以在全局標籤中定義,FormSet/本地常量能在formset
標籤中創建。常量當前僅僅是代替欄位的property屬性,欄位的var 元素的 value屬性,欄位的msg 元素的
key屬性,欄位的arg0-arg3 元素的 key屬性。欄位的變數也可以在arg0-arg3
元素中被代替(例如:${var:min}))。替換的順序是FormSet/Locale常量第一,全局的常量第二,
arg elements 變數最後。
<global>
<constant>
<constant-name>zip</constant-name>
<constant-value>^\d{5}(-\d{4})?$</constant-value>
</constant>
</global>

<field
property="zip"
depends="required,mask">
<arg0 key="registrationForm.zippostal.displayname"/>
<var>
<var-name>mask</var-name>
<var-value>${zip}</var-value>
</var>
</field>
驗證器可以使用欄位下面的變數部分來存儲變數,這些變數通過欄位的getVar((String key)方法取得。
<field
property="integer"
depends="required,integer,intRange">
<arg0 key="typeForm.integer.displayname"/>
<arg1
name="range"
key="${var:min}" resource="false"/>
<arg2
name="range"
key="${var:max}" resource="false"/>
<var>
<var-name>min</var-name>
<var-value>10</var-value>
</var>
<var>
<var-name>max</var-name>
<var-value>20</var-value>
</var>
</field>
使用validwhen設計複雜的驗證
使用validwhen來設計複雜驗證的一個經常的要求就是根據一個欄位驗證另外一個欄位(比如,
如果你要用戶兩次輸入口令來確認值口令一致),另外一個就是表單中的一個欄位只有另外一個欄位有確定值的時候才是必須輸入的。新的validwhen驗證規則將很快被包含在1.1後的STRUTS版本中,她就是用來處理這種情況的。
validwhen 規則處理單個的變數欄位,叫測試。這變數的值是一個布林的運算式,如果驗證有效則它必須為真。可以包含這種變數的運算式有:
u 單引號或雙引號字串literals,
u 十進位、十六進位、八進制的Integer literals,
u null與null和空字串匹配,
u 其他可以用屬性名引用的form欄位,例如customerAge,
u 可以在外部因用得索引欄位, 例如childLastName[2],
u 可以默認implicit因用得索引欄位, 例如childLastName[], 她將作為被索引的欄位使用同樣的索引到陣列中,
The literal *這�指它包含當前測試欄位的值,
作為例子,考慮一個包含通訊位址和郵箱欄位的form。如果通訊位址不為空則郵箱欄位是必須的required。你能這樣定義validwhen 規則:
<field property="emailAddress" depends="validwhen">
<arg0 key="userinfo.emailAddress.label"/>
<var>
<var-name>test</var-name>
<var-value>((sendNewsletter == null) or (*this* != null))</var-value>
</var>
</field>
上面定義的意思是:如果通訊位址是空或不空時這個欄位時有效的。
這�有個稍微複雜的例子,它使用了索引欄位。假定有一個表單,允許用戶輸入他們希望定購的部件號和數量。類orderLine
的bean的一陣列被用來在稱為orderLines 的一屬性保持輸入項。
If you wished to verify that every line with part number also had a
quantity entered, you could do it with:
如果你希望校驗訂單中有數量輸入得每一行,你可以這樣:
<field
property="quantity"
indexedListProperty="orderLines"
depends="validwhen">
<arg0 key="orderform.quantity.label"/>
<var>
<var-name>test</var-name>
<var-value>((orderLines[].partNumber == null) or (*this* != null))</var-value>
</var>
</field>
這�的意思是:如果相應的partNumber 欄位是空, 或這欄位是不空的,則這欄位是有效的。
最後一個例子,想像一表單,用戶必須輸入他們的以英寸為單位的高度,如果他們在高度在60英寸以下,則出一錯誤。(it is an error
to have checked off nbaPointGuard as a career.)
<field property="nbaPointGuard" depends="validwhen">
<arg0 key="careers.nbaPointGuard.label"/>
<var>
<var-name>test</var-name>
<var-value>((heightInInches >= 60) or (*this* == null))</var-value>
</var>
</field>

給程式師的簡單說明:
所有的比較關係必須在parens 封裝。All comparisons must be enclosed in parens.
只有兩個itme時可以and或or鏈結。
如果比較的兩item都可以轉為整數,則使用numeric比較,否則使用字串比較。
可插入驗證器
驗證是從validation.xml 檔中載入的,默認的驗證規則定義在validation.xml 檔中,默認定義了required,
mask ,byte, short, int, long, float, double, date (沒有本地支持), and a
numeric range。
" mask "方式依賴於預設值安裝要求,那意味著"required "可以完成,在"'mask "將運行以前"required "和"
mask "方式被默認包含進框架中了。任何欄位如果不是"required "而且是空或有零長度將跳過其他驗證。
如果使用了Javascript 標籤,用戶端javascript在validator's javascript
屬性中查找值而且產生一個有驗證form方法的物件,要得到更多的關於Javascript Validator
標籤工作細節的詳細的解釋,參閱html標籤API參考。
"'mask' "方式讓你用一正則運算式遮罩驗證欄位,它使用jakarta的正規運算式包,所有的有效性規則存儲在validator-rules.xml
檔,使用的主類是org.apache.regexp.RE
validation.xml檔中的驗證器配置範例:
<validator name="required"
classname="org.apache.struts.validator.FieldChecks"
method="validateRequired"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.required">
<validator name="mask"
classname="org.apache.struts.validator.FieldChecks"
method="validateMask"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
msg="errors.invalid">

定義可插入驗證器
方法的參數是用逗號分隔的一些類名稱列表,方法屬性需要有一個符合上面的列表的簽名。列表由以下組合而成:
java.lang.Object - 要驗證的Bean。
org.apache.commons.validator.ValidatorAction - 當前ValidatorAction。
org.apache.commons.validator.Field - 要驗證的欄位
org.apache.struts.action.ActionErrors -
如果驗證錯誤將加入ActionError的錯誤物件javax.servlet.http.HttpServletRequest
-當前request 物件。
javax.servlet.ServletContext - 應用的ServletContext。
org.apache.commons.validator.Validator-當前的org.apache.commons.validator.Validator實例。
java.util.Locale - 當前用戶的Locale。
多頁面form
欄位部分有一可選的頁面屬性,它可以被設為整數,頁上欄位的所有驗證小於或等於伺服器端驗證的當前頁,頁上欄位的所有驗證小於或等於用戶端頁上所有欄位的驗證小於或等於伺服器端驗證的當前頁驗證的當前頁。一個mutli-part表單需要定義頁面屬性:
<html:hidden property="page" value="1"/>。
比較兩個欄位
這是一個展示你怎樣才能比較兩個欄位是否有一樣的值的例子。比如"用戶改變他們的口令"一般會有口令欄位和一確認欄位。
<validator name="twofields"
classname="com.mysite.StrutsValidator"
method="validateTwoFields"
msg="errors.twofields"/>
<field property="password" depends="required,twofields">
<arg0 key="typeForm.password.displayname"/>
<var>
<var-name>secondProperty</var-name>
<var-value>password2</var-value>
</var>
</field>

public static boolean validateTwoFields(
Object bean, ValidatorAction va,
Field field, ActionErrors errors, HttpServletRequest request,
ServletContext application) {
String value = ValidatorUtils.getValueAsString( bean, field.getProperty());
String sProperty2 = field.getVarValue("secondProperty");
String value2 = ValidatorUtils.getValueAsString( bean, sProperty2);

if (!GenericValidator.isBlankOrNull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getKey(),
Resources.getActionError( application, request, va, field));
return false;
}
} catch (Exception e) {
errors.add(field.getKey(), Resources.getActionError( application,
request, va, field));
return false;
}
}
}
已知的bug
Struts Validator依賴于Commons Validator包,所以問題報告和增強需求可能在兩個產品中列出。
* Struts Validator Bugzilla Reports
* Commons Validator Bugzilla Reports
變更和deprecations
新建的標記屬性。
<html:javascript>標記有新的屬性定義.
使用commons-validator.jar中的DTD驗證。
當前使用的驗證XML檔是根據commons-validator.jar中的DTD。Struts不在為validator-rules.xml
and validator.xml.單獨維護一個分離的DTD,另外,commons-validator
現在維護一個統一的validator.dtd。修改所有validator.xml文件的DTD引用為
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules
Configuration 1.0//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_0.dtd">
空欄位。
當前默認在所有得基礎驗證類型中忽略空白的欄位,如果你要求一個欄位必須輸入,那末在你的應用的validator.xml
檔相應的欄位定義的depends屬性中添加 " required "。
新建的範圍RANGE方法.
JavaScript 和JAVA中都添加了intRange & floatRange 方法。
有條件地REQUIRED欄位.
最大的修改是添加了基於其她欄位的值的有條件地require驗證的能力。它允許你定義邏輯如:"只有X欄位非空的時候Y欄位為'male'才有效",這是實現上述邏輯的推薦方法,這種方法在1.1版後的第一版將實現。在1.1版中添加的Requiredif驗證規則,將在新版中去掉。不過,如果你正準備使用requiredif,這�有一個簡短的教程。
讓我們假定你有一個有3個欄位的醫藥的資訊表單,性別sex,懷孕測試pregnancyTest,測試結果testResult,如果性別為'f'
or 'F',則懷孕測試pregnancyTest是required,如果pregnancyTest不是空,測試結果testResult是required。
你的validation.xml 檔的輸入項應該是這樣的:
<form name="medicalStatusForm">
<field property="pregnancyTest" depends="requiredif">
<arg0 key="medicalStatusForm.pregnancyTest.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>sex</var-value>
</var>
<var>
<var-name>fieldTest[0]</var-name>
<var-value>EQUAL</var-value>
</var>
<var>
<var-name>fieldValue[0]</var-name>
<var-value>F</var-value>
</var>
<var>
<var-name>field[1]</var-name>
<var-value>sex</var-value>
</var>
<var>
<var-name>fieldTest[1]</var-name>
<var-value>EQUAL</var-value>
</var>
<var>
<var-name>fieldValue[1]</var-name>
<var-value>f</var-value>
</var>
<var>
<var-name>fieldJoin</var-name>
<var-value>OR</var-value>
</var>
</field>
<field property="testResult" depends="requiredif">
<arg0 key="medicalStatusForm.testResult.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>pregnancyTest</var-value>
</var>
<var>
<var-name>fieldTest[0]</var-name>
<var-value>NOTNULL</var-value>
</var>
</field>
</form>

這�有一個使用索引的屬性更複雜的例子,如果你的struts-config.xml 有這下麵:
<form-bean name="dependentlistForm"
type="org.apache.struts.webapp.validator.forms.ValidatorForm">
<form-property
name="dependents"
type="org.apache.struts.webapp.validator.Dependent[]" size="10"/>
<form-property name="insureDependents" type="java.lang.Boolean"
initial="false"/>
</form-bean>
這�dependentlistForm bean有lastName,firstName,dob,coverageType四個屬性,你可以這樣定義一驗證規則:
<form name="dependentlistForm">
<field
property="firstName" indexedListProperty="dependents" depends="requiredif">
<arg0 key="dependentlistForm.firstName.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastName</var-value>
</var>
<var>
<var-name>fieldIndexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldTest[0]</var-name>
<var-value>NOTNULL</var-value>
</var>
</field>

<field
property="dob" indexedListProperty="dependents" depends="requiredif,date">
<arg0 key="dependentlistForm.dob.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastName</var-value>
</var>
<var>
<var-name>fieldIndexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldTest[0]</var-name>
<var-value>NOTNULL</var-value>
</var>
</field>

<field
property="coverageType" indexedListProperty="dependents" depends="requiredif">
<arg0 key="dependentlistForm.coverageType.label"/>
<var>
<var-name>field[0]</var-name>
<var-value>lastName</var-value>
</var>
<var>
<var-name>fieldIndexed[0]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldTest[0]</var-name>
<var-value>NOTNULL</var-value>
</var>
<var>
<var-name>field[1]</var-name>
<var-value>insureDependents</var-value>
</var>
<var>
<var-name>fieldTest[1]</var-name>
<var-value>EQUAL</var-value>
</var>
<var>
<var-name>fieldValue[1]</var-name>
<var-value>true</var-value>
</var>
<var>
<var-name>fieldJoin</var-name>
<var-value>AND</var-value>
</var>
</field>
</form>
這�的意思是:
如果lastName 欄位是非空的,firstName 欄位required。因為欄位Indexed
為真,這它意味著lastName的indexed 必須與firstName 的索引的一樣,dob同理,除非date不為空。
如果lastName 用樣索引時的值不空, 而且非索引欄位insureDependents為真,則coverageType 是only require。
你可以對欄位在[n]中使用任意數位,唯一的限制是他們必須都是AND或OR,你無法混合使用。
Deprecation:
u JavaScript 和Java的range方法.
u StrutsValidator &StrutsValidatorUtil 類中的Deprecation方法
驗證器api指南
一個簡明的Struts驗證器API指南 可以幫助你開始。
驗證器資源
Struts Validator: Validating Two Fields Match 作者Matt
Raible。(兩個欄位匹配驗證)關於使用方法的文章。(範例部分為翻譯此文內容)
DynaForms and the Validator 作者James Turner and Kevin Bedell。Struts
Kickstart的其中一章(動態form和驗證器),可以自由下載PDF).
Validating user input 作者 David Winterfeldt and Ted Husted。Struts in
Action的其中一章,可以自由下載(PDF)。

使用方法
作者:
醜陋 && Snowtears:經過2周的不懈努力,閱讀了大量的資料,終於對Validator有了個初步的認識,整理了一下,淺淺的談了談寫法,希望能有一定的幫助,其中肯定有許多說的不對不準確的地方,還請多指教
real_herozx@163.net
王藝:
根據以上兩位元的文章正理而成
配置ruts-config.xml:
1、 添加ApplicationResources配置檔。
如:
<!-- ========== Message Resources Definitions =========================== -->
<message-resources parameter="com.dc.sibss.om.struts.ApplicationResources" />
其中com.sibss.om.struts.ApplicationResources"的部分是資源檔案的路徑,此檔的作用是提供錯誤資訊的非編程定制化和多語言支援。如果我們使用中文平臺作業系統,則默認情況下將首先查找ApplicationResource_zh_CN.properties文件,然後是ApplicationResources_zh.properties,如果前兩個檔沒有被找到則將查找ApplicationResources.properties文件。
為了能夠在頁面上顯示錯誤提示資訊,我們還需要將以下內容添加到ApplicationResources.properties文件的末尾:
errors.required={0} is required.
errors.minlength={0} cannot be less than {1} characters.
errors.maxlength={0} cannot be greater than {2} characters.
errors.invalid={0} is invalid.
errors.byte={0} must be an byte.
errors.short={0} must be an short.
errors.integer={0} must be an integer.
errors.long={0} must be an long.
errors.float={0} must be an float.
errors.double={0} must be an double.
errors.date={0} is not a date.
errors.range={0} is not in the range {1} through {2}.
errors.creditcard={0} is not a valid credit card number.
errors.email={0} is an invalid e-mail address.
以上僅是struts現在支援的錯誤類型的錯誤提示資訊,如果你自定義了新類型的錯誤驗證,則還需要在此加上你自己的內容。
以上內容中的{0}指的是錯誤提交的參數。比如:當你需要頁面上的"用戶名"不能為空時(也就是上面的errors.required),這個{0}就代表"用戶名",所以如果你沒有填寫用戶名將拋出如下錯誤:
用戶名 is required.(你可以根據需要修改稱中文)
我們可能已經注意到了,既然錯誤提示資訊需要配置,那麼上例中"用戶名"系統是如何得到的呢?沒錯!也是通過修改此配置檔,內容如下:
visitCust.error.name.required=<br>用戶名
這樣當"用戶名"為空時,struts後臺程式將聯合以上兩處定義顯示錯誤資訊。
另外,上面的"visitCust.error.name.required"是在Validation.xml配置驗證內容時指定的。具體見以下介紹。
注意:一般情況下,你的系統只需要一個ApplicationResources檔,所以開發組的成員不要添加自己的resource檔。只有在你的專案分組開發時才需要使用多個ApplicationResources檔,但是,同時你的struts-config.xml檔也會有相同的數量對應。
2、 在struts-config.xml文件中加入validator插件:
加入這個插件後你的應用就具備使用Validator的環境,如:
<!-- ========== Plug Ins Configuration ================================== -->
<plug-in className="org.apache.struts.validator.ValidatorPlugIn">
<set-property value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml"
property="pathnames" />
</plug-in>
這�如果是想使用多個***.xml檔的話,value部分寫法如下value="/WEB-INF/validator-rules.xml,/WEB-INF/validation.xml,
/WEB-INF/validation1.xml , /WEB-INF/validation2.xml "
在<action-mappings>�,定義需要驗證的畫面對應的Action的時候要加上validate="true"
四種使用方法
1、 用Javascript在用戶端進行驗證
配置:在需要驗證的JSP檔中寫入
<html:form action="/XXX" onsubmit="return validateXXXX(this);">
這�的XXX 是與要進行驗證的 forward name,validateXXXX (this);�面的XXXX是需要進行驗證的ActionForm名。
<html:javascript formName="mytestForm"/>
在validation.xml檔中寫入驗證代碼就可以進行基本的驗證了。這種方法是在用戶端進行驗證,用戶端可以看到JAVASCRIPT部分的全代碼。安全性不高
2、 ValidatorForm的validate方法
1、validate()方法:使自己的ActionForm繼承ValidatorForm類,在�面編寫自己的方法:
public ActionErrors validate (ActionMapping mapping,HttpServletRequest
request) {
ActionErrors errors = new ActionErrors();
。。。。。。
if ( mytext.equals("aaa") ) {
//my exampleerrors.add("mytext",new ActionError("mytext.error"));
}
。。。。。。
return errors;
}
此時,如果寫了這個方法,就會遮罩掉在Validation.xml中定義的驗證部分,換句話說就是系統運行時,Validation.xml�對應此ActionForm的定義的錯誤驗證部分不實行,如果不寫這個方法的話,系統運行時會進行Validation.xml�對應此ActionForm的定義的錯誤驗證部分的操作。此類方法是在伺服器端進行驗證,驗證部分代碼用戶端不可見。
2、創建你的ActionForm並讓它繼承org.apache.struts.validator.ValidatorForm類。創建你的Action實現,並和上面定義的ActionForm關聯。這�需要注意的是,在定義此Action時一定將validate屬性設置為true,並且在你定義的ActionForm中不要實現它的validate方法----這就意味著你將使用ValidatorForm的validate方法,這樣才能保證你的錯誤驗證正常進行。配置validation.xml文件。基本內容如下:
<form-validation>
<!-- ========== Default Language Form Definitions ===================== -->
<formset>
<form name="custGNewForm">需要驗證頁面上form的名字
<field property="certifiCode"需要校驗的屬性
depends="required,maxlength">校驗內容
<arg0
key="prompt.certifiCode"/>ApplicationResource檔中對應
<arg1 key="${var:maxlength}"
name="maxlength" resouce="false"/>
<var>確定最長限制的長度
<var-name>maxlength</var-name>
<var-value>20</var-value>
</var>
</field>
注意:此處的arg0和arg1就代表了ApplicationResources檔中使用"{}"括起來的參數。比如:
errors.range={0} is not in the range {1} through {2}.
定義了三個參數,所以你這�也要定義<arg0>、<arg1>、<arg2>三個參數才能完整的顯示錯誤資訊。
errors.maxlength={0} cannot be greater than {2} characters.
定義了0、2兩個參數,所以你就需要定義<arg0>和<arg2>兩個參數。
<field property="userName"
depends="required,maxlength">
<arg0 key="prompt.userName"/>
<arg2 key="${var:maxlength}"
name="maxlength" resouce="false"/>
<var>
<var-name>maxlength</var-name>
<var-value>80</var-value>
</var>
</field>
<field property="email"
depends="email">
<arg0 key="prompt.email"/>
</field>
</form>
<form name="custGNewCheckForm">
<field property="certifiCode"
depends="required">
<arg0 key="prompt.certifiCode"/>
</field>
</form>
</formset>
</form-validation>
在校驗頁面的<body>前添加如下內容:<html:errors/>
3、 DynaValidatorForm
不需要再寫對應的ActionForm,只需在struts-config.xml�把自己的ActionForm進行配置:
<form-bean name="testForm" type="org.apache.struts.validator.
DynaValidatorForm">
<form-property name="mytext" type="java.lang.String"/>
<form-property name="mytextarea" type="java.lang.String"/>
<form-property name="mydatetext" type="java.lang.String"/>
</form-bean>
在form-property�設置相應的專案,比如說mytext,mytextarea什麼的,執行的時候會動態生成ActionForm,再在validation.xml�寫入所希望的驗證代碼,就可以了。JSP檔�不需要寫入任何東西,驗證也是在伺服器端進行,驗證部分代碼在JSP中不可見。
4、 組合驗證
如果使用動態驗證DynaValidatorForm的話,不許編寫自己的對應的ActionForm,相應的特殊驗證會受到相當程度的限制。這個時候,需要將特殊驗證部分寫入對應的Action,
if(mytext.equals("aaa")){//My Example
ActionErrors errors = new ActionErrors();
errors.add("***",new ActionError("***.error"));
saveErrors(request,errors);
return (mapping.findForward("false"));
}
就可以實現特殊驗證了。

實際上你的FORM還可以繼承ValidatorActionForm和DynaValidatorActionForm,這兩種與他們對應的ValidatorForm和DynaValidatorForm的唯一區別正如開篇就講到的:在struts-config.xml中查找對應的FORM類時,前者根據ACTION的PATH值,而後者使用NAME值。
範例:
Struts 驗證器:驗證兩個欄位匹配
在使用指南中,有一節講述怎樣創建驗證器來驗證兩個欄位匹配,我用這個伺服器端驗證器(象例子中顯示的那樣)做口令,確定口令驗證。這個已經可以正常工作了;但我還想用用戶端的javascript驗證器來試一試。我寫了自己的程式來比較兩個欄位,但他們和推薦給你的那個不同(from
validator-rules.xml)。所以昨天,我補充了怎樣添加JavaScript方法到validator-rules.xml。
這�就是怎樣配置的的整個過程(大部分在使用指南中已經包含了,保存JavaScript)。
怎樣添加兩個欄位的驗證器
Step 1: 生成一個包含validateTwoFields方法的類。在我的代碼重,我的類定義為ValidationUtil,他有下列方法:

public static boolean validateTwoFields(
Object bean,
ValidatorAction va,
Field field,
ActionErrors errors,
HttpServletRequest request) {

String value = ValidatorUtil.getValueAsString(bean, field.getProperty());
String sProperty2 = field.getVarValue("secondProperty");
String value2 = ValidatorUtil.getValueAsString(bean, sProperty2);

if (!GenericValidator.isBlankOrNull(value)) {
try {
if (!value.equals(value2)) {
errors.add(field.getKey(),
Resources.getActionError(request, va, field));

return false;
}
} catch (Exception e) {
errors.add(field.getKey(),
Resources.getActionError(request, va, field));

return false;
}
}

return true;
}
Step 2: 編輯 validator-rules.xml ,加入"twofields" 規則。
<validator name="twofields" classname="org.appfuse.webapp.util.ValidationUtil"
method="validateTwoFields"
methodParams="java.lang.Object,
org.apache.commons.validator.ValidatorAction,
org.apache.commons.validator.Field,
org.apache.struts.action.ActionErrors,
javax.servlet.http.HttpServletRequest"
depends="required" msg="errors.twofields">
<javascript><![CDATA[
function validateTwoFields(form) {
var bValid = true;
var focusField = null;
var i = 0;
var fields = new Array();
oTwoFields = new twofields();
for (x in oTwoFields) {
var field = form[oTwoFields[x][0]];
var secondField = form[oTwoFields[x][2]("secondProperty")];

if (field.type == 'text' ||
field.type == 'textarea' ||
field.type == 'select-one' ||
field.type == 'radio' ||
field.type == 'password') {

var value;
var secondValue;
// get field's value
if (field.type == "select-one") {
var si = field.selectedIndex;
value = field.options[si].value;
secondValue = secondField.options[si].value;
} else {
value = field.value;
secondValue = secondField.value;
}

if (value != secondValue) {

if (i == 0) {
focusField = field;
}
fields[i++] = oTwoFields[x][1];
bValid = false;
}
}
}

if (fields.length > 0) {
focusField.focus();
alert(fields.join('\n'));
}

return bValid;
}]]></javascript>
</validator>
Step 3: 在validation.xml中為你的表單配置驗證:
<field property="password" depends="required,twofields">
<msg name="required" key="errors.required"/>
<msg name="twofields" key="errors.twofields"/>
<arg0 key="userForm.password"/>
<arg1 key="userForm.confirmPassword"/>
<var>
<var-name>secondProperty</var-name>
<var-value>confirmPassword</var-value>
</var>
</field>
這�errors.twofields的欄位 '{0}'必須與欄位'{1}' 的值相同。第三步的一個可選的工作就時使用 XDoclet
來生成validation.xml。requires (1) 配置XDoclet (當然)和(2) 在你的表單中添加添加一些@struts
標籤setPassword方法。
/**
* Returns the password.
* @return String
*
* @struts.validator type="required" msgkey="errors.required"
* @struts.validator type="twofields" msgkey="errors.twofields"
* @struts.validator-args arg1resource="userForm.password"
* @struts.validator-args arg1resource="userForm.confirmPassword"
* @struts.validator-var name="secondProperty" value="confirmPassword"
*/
public String setPassword() {
return password;
}

2009-08-20

香港電腦節2009 MSI

香港電腦節2009優惠產品一覽

香港電腦節2009優惠產品一覽

一年一度既電腦界盛事----香港電腦通訊節2009將於8月21~24日(今個星期五至下個星期一)在香港會議展覽中心隆重舉行,今年適逢會展部份擴展工程完成峻工,所以展場面積將會比去年大幅增加三成,展覽種類除了原有的電腦及周邊產品區外,還因應會場面積擴大而拉闊產品的種類,包括手機及通訊區、高清視聽區、數碼攝影區、軟件及商業區和外貿區,展覽時間如下:
開放時間及收費:
8月21日(星期五)
上午(10:00-13:00) 業內人士免費進場;公眾人士入場費HK$20
下午(13:00-22:30) 所有參觀人士一律收費HK$20

8月22日(星期六)
上午(10:00-13:00) 業內人士免費進場;公眾人士入場費HK$20
下午(13:00-22:30) 所有參觀人士一律收費HK$20

8月23日(星期日)
上午(10:00-13:00) 業內人士免費進場;公眾人士入場費HK$20
下午(13:00-22:30) 所有參觀人士一律收費HK$20

8月24日(星期一)
上午(10:00-13:00) 業內人士免費進場;公眾人士入場費HK$20
下午(13:00-18:00 所有參觀人士一律收費HK$20
註:入場券可於會場即場購買及即日起於港鐵沿線7-11購買

優惠情報:
品牌:Buffalo
攤位:T12,T14-T20,U14,U16,U18,U20
1.11n 路由器Draft-N 2.0 高速無線路由器 套裝減$•超薄機身,厚度只有25mm
•Draft 802.11n Wi-Fi CERTIFIEDR
•支援AOSS 一按式無線連接
•支援WPA2,WPA(TKIP,AES)&WEP
•可混合利用WEP,TKIP,AES 多重加密•可分隔WEP 和AES/TKIP 連線裝置

2.Router:WHR-G300N 電腦節優惠價:$290 (原價:$340)

3.Adapter:WLI-UC-G300N 電腦節優惠價:$540 (原價:$639)

4.DVD 燒錄機 91 折發售
•USB 2.0 介面'•輕巧:
.重量只有36g
•纖薄:厚度只有23mm
•8x DVD±R、6x DVD±R (DL)
•6x DVD-RW、8x DVD+RW
•5x DVD-RAM
•黑、白兩色
DVSM-PN58U2V-BK Black 電腦節優惠價:$399 (原價:$440)
DVSM-PN58U2V-WH White 電腦節優惠價:$399 (原價:$440)

5.7x24 無間斷BT 下載
1-Bay 網絡儲存伺服器 勁減$70
•內建1 顆1TB 3.5"SATA 硬碟
•支援BitTorrent 下載
•支援Web Access &BuffaloNAS.com
•支援iPhone 3G,激增手機容量
•內建檔案、FTP、備份和列印伺服器
•內建DLNA 認證和iTunes 伺服器
•備1 x Gigabit LAN
•附送Memeo Backup PC 備份軟件
•3 年保用
LS-CH1.0TL 1.0TB (原價:$1400) 電腦節優惠價:$1330

6.2.5"USB 2.0 流動儲存硬碟 83 折起發售
•纖薄:厚度只有15.5mm
•輕巧:重量只有190g
•內建1 顆2.5"SATA 硬碟
•USB 取電,毋需使用火牛
•TurboUSB 提升檔案傳輸速度
•附送128bit AES 加密軟件for PC
•3 年保用
HD-PE250U2-BK 250GB 電腦節優惠價:$445 (原價:$520)
HD-PE320U2-BK 320GB 電腦節優惠價:$498 (原價:$580)
HD-PE500U2-BK 500GB 電腦節優惠價:$679 (原價:$820)

7. HD-PE250U2-WH 250GB 電腦節優惠價:$445 (原價:$520)
HD-PE320U2-WH 320GB 電腦節優惠價:$498 (原價:$580)
HD-PE500U2-WH 500GB 電腦節優惠價:$679 (原價:$820)

8. HD-PE250U2-RD 250GB 電腦節優惠價:$445 (原價:$520)
HD-PE320U2-RD 320GB 電腦節優惠價:$498 (原價:$580)
HD-PE500U2-RD 500GB 電腦節優惠價:$679 (原價:$820)

9.高清錄影專用 3.5"USB 2.0 外置儲存硬碟 84 折起發售
•內建1 顆3.5"SATA 硬碟
•支援自動開關
•TurboUSB 提升檔案傳輸速度
•支援Eco 慳電功能
•附送128bit AES 加密軟件for PC
•附送Memeo Backup PC 備份軟件
•3 年保用
HD-CE500U2 500GB 電腦節優惠價:$490 (原價:$570)
HD-CE1.0TU2 1.0TB 電腦節優惠價:$690 (原價:$820)
HD-CE1.5TU2 1.5TB 電腦節優惠價:$990 (原價:$1180)
HD-CE2.0TU2 2.0TB 電腦節優惠價:$2050 (原價:$2325)

品牌:LG
(1)所有型號顯示屏均以超優惠價發售
(2)凡購買任何型號顯示屏,均可免費獲得Kaspersky Anti-Virus 2010防毒軟件(半年授權版)*
(3)購買LG BH08LS20藍光碟機,即送USB高清數碼手指*
(4)購買LG W2486L,即可獲320GB硬碟一部*
*送完即止

LG電子一直深明用家對高科技電子產品的殷切需求,於香港電腦通訊節上隆重展出全線16:9全高清顯示屏,包括流線外型+紅光水滴設計的W2261VP、智能光度調控的W2353V及可垂直伸縮的24"型號W2442PA。此外更會於會場推出兩款全新旗艦級的24吋16:9
LED全高清顯示屏W2486L及擁有多種顏色選擇的神秘型號。W2486L支援1920 x
1080全高清影像、2,000,000:1超高動態對比度及2 組HDMI端子輸出,完備功能和纖巧的工藝設計為您打造非凡的感官享受。

此外,為了回饋用戶對LG電子的鼎力支持,一連四天(8月21日至8月24日)於香港會議展覽中心一號廳舉辦的香港電腦通訊節,LG電子將會讓顧客以優惠價購買各種型號的顯示屏,用戶又豈容錯過!同時,LG更提供多重優惠!

W2486L全高清LED顯示屏精緻酒杯型設計 提升生活格調
W2486L LED背光顯示屏獨具匠心獨運的精緻酒杯型設計,呈現出奢華夢幻的感覺,全面提升家居格調。W2486L支援1920 x
1080全高清影像,以及2,000,000:1超高動態對比度,營造出更強烈對比的光暗度及層次分明的畫像,使用家能夠輕易地享受美倫美奐的視覺體驗。其16:9全高清闊屏幕,讓用家不論欣賞電影還是打機,都能沈醉於一流的視覺感官體驗中。同時,W2486L亦支援2
組HDMI端子,可直接接駁高清器材以及家庭遊戲機等,貼心為您打造一站式全能個人影院兼娛樂平台,實現一機多用的理想。24吋的W2486L
LED顯示屏機身極為纖薄,機身最薄處只有20mm,完全融入家居的任何角落。

品牌:Hyundai
攤位編號:Z11 -Z20
Hyundai DVD錄影機TBH - 7326
內置160GB硬碟,支援DVD+R,DVD-R,DVD+RW,DVD-RW,DVD Video,SVCD,VCD,Audio
CD,CDR,CDRW,JPEG CD,MP3 CD,DivX CD 等完整多媒體格式,支援DVD+R,DVD-R,DVD+RW
及DVD-RW等多媒體錄影,可同時錄影NICAM 麗音雙語,配合多種完善錄影模式,可即時或定時錄影。備有IEEE-1394 端子供連接DV
輸入,支援逐行掃描輸出及5.1 聲道類比輸出
原價:HK$1,380 電腦節優惠價:$300

HYUNDAI 高清攝錄機D24H
採用500萬像素CMOS感光元件,備有8X數碼變焦功能,提供自動、日光、鎢絲燈及螢光燈等白平衡模式,更備有彩色、黑白、懷舊及負片等拍攝效果。支援
HD 720P (1280x720/30
fps)、H.264(.AVI)、QVGA,VGA及D1等影片拍攝格式。內置64MB記憶體,支援SD及SDHC 卡。備有HDMI 輸出功能。
原價:HK$1,280 電腦節優惠價:$300

品牌:Rubik's Express
攤位編號:G17 - G20
- 凡購買A-DATA SSD / PL HDD 等產品滿HK$888,即可獲得Disney 4GB 手指一個.
- 只要購買主題T 系列產品滿HK$168,可兌換Disney 可愛文件夾1 個
- 購買指定XPG DDR3 系列產品,便有機會抽中SSD

品牌:冠�集團
攤位編號:D35e
Creative ZEN 8GB PMP
規格
體積:55(H)x 83(W)x 11.3(D)mm
重量:65g
顯示屏:2.5"16.7 million color TFT LCD 320 x 240 pixels
歌曲播放:8GB 版本:
達4,000WMA/ 266小時(每首曲目大約4mins 以64kbps WMA 格式)
達2,000MP3/ 133小時(每首曲目大約4mins 以128kbps MP3 格式)

播放時間:最高25小時音樂播放
最高25小時音樂播放,最高5小時影片播放
影片播放格式:MJPEG、WMV9、MPEG4-SP3、DivX3 4/5 和XviD3
音樂播放格式:MP3、WMA、AAC4(.m4A)、WAV(ADPCM)和Audible 2,3,4
圖像支援格式:JPEG(BMP/ GIF / PNG / TIFF)5
電池:內置鋰電池
電腦節會場優惠價:$680

品牌:Wacom
攤位編號:Z20
1.送圖像處理軟件Corel(R)PhotoImpact(R)X3
凡於會場購買Bamboo One Medium、Bamboo Fun Medium、Intuos4
全線系列、CintinQ12WX即可即時獲得Corel(R)PhotoImpact(R)X3 一套

2.購買Bamboo One Small 或Bamboo Fun Small,即獲九折優惠
Wacom BAMBOO One Small (4''X5'')
原價:$430 會場價:$380

Wacom BAMBOO Fun Small(4''X6'')
原價:$750 會場價:$670

品牌:MyGica
攤位編號:F21-30
1.MyGica X8506
Windows 7認證•雙制式DMB-TH+Analog+FM+色差輸入
原價:$428 電腦節特價:$368

2.MyGica U6885A
雙制式DMB-TH+Analog+FM+影音輸入
原價:$368 電腦節特價:$288 (每日限量5件)

RMVB影片播放器系列
3.MyGica MP506
迅雷下載+RMVB影片播放器w/HDMI
原價:$638 電腦節特價:$598

4.MyGica MP322
RMVB影片播放器w/HDMI
原價:$428 電腦節特價:$358

5.MyGica MP102
輕巧型RMVB影片播放器
原價:$238 電腦節特價:$198 (每日限量10件)

品牌:HYUNDAI
攤位編號:Z11 -20及D31 -D35
1.HYH-628 (120GB)
原價:HK$380 會場價:HK$270

2.HYH-628 (160GB)
原價:HK$420 會場價:HK$310

3.HYH-628 (250GB)
原價:HK$460 會場價:HK$350

4.HYH-628 (320GB)
原價:HK$540 會場價:HK$430

品牌:衛訊
攤位編號:V17-20
1.凡於電腦節會場中購買HTC Touch HD,即可獨家免費升級至16GBmicroSD記憶卡,兼享衛訊基本會籍、多重會員優惠及豐富的迎新禮品;

2.Samsung WEP-300 (原價$328)及WEP-350 (原價$398)藍牙耳機
優惠價$168及$198於會場發售,低至半價。

3.凡於電腦節會場購買Samsung Jet S8000H手機,即可以七折消費額成為衛訊基本會員(優惠包括:生日特賞、預訂優惠及與家人一起儲分等)

品牌:Olevia
攤位編號:W01
1.Olevia X10A (3 cell Linux version)
特價$1999 (每日限售:50台)

2.Olevia X10A (6 cell XP 3G verison)
特價$2999 (每日限售:30台)

Olevia X11A (XP verison)
特價$2999 (每日限售:30台)

3.Olevia X12V (XP 3G verison)
特價$3999 (每日限售:20台)

4.Olevia X13D (Vista Home Premium Edition)
特價$3799 (免費升級至Windows 7)

5.Olevia M320 優惠價$4990
Olevia M32S 優惠價$4490
Olevia M260 優惠價$3990
Olevia M220 優惠價$3380

6.Olevia X01高清數碼接收器優惠價$1290

品牌:Alris technology
攤位編號:K21 -K26
優惠一: 購買任何無線Router,或指定型號IP Cam
即可獲贈最新電影戲飛2張。(價值$140)

優惠二: DIR-615 N系皇牌16,000 session
每日下午3時正特價$380
(原價$598)只限10部

優惠三: 凡購物滿$1000元正,即可獲贈原裝D-Link X Alris全球地區限量版頸繩乙條(價值$199)

優惠四:凡購買任何產品,即可加$10換購原裝D-Link X Alris限量版環保袋一套,或購物滿$500,即可免費獲贈乙套(價值$49)

DIR-605 N系Router 300M傳輸率
有火紅色,白色,黑色任君選擇
配置2條高接收天線,最高傳輸率高達300M。
售價$598 特價:$279 (每日只限10部)

DIR-600 最經濟實惠N Router
原價$299 減價$269 終極價$249 再送戲飛!!!!!

DIR-451 專業級3G USB ROUTER
原價$1,499 特價$1,199 再送戲飛!!!!!!

品牌:aMagic
攤位編號:K21 -K267
優惠一: 凡購物滿$500元正,即可獲贈原裝aMagic X Alris螢光極罕全球限量2000條頸繩乙條(價值$188)

優惠二: 凡購買任何產品,即可加$10換購原裝aMagic X Alris螢光限量版環保袋一套,或購物滿$400,即可免費獲贈乙套(價值$49)

優惠三 aMagic TT-5000 ($799)
每日下午6時 特價$499 *限量5部

優惠四 凡一次過購買TT-5000 兩部,即可獲戲飛2張

優惠五aMagic TT-5000 極速BT下載器
不用開電腦也能做BT下載.更支援遠端
原價$799 特價$599

優惠六aMagic AMP-1002HD/1003HD
原價$499/$599(HDMI) 會場價$299/$399(HDMI)

優惠七aMagic AMP-1000T Net media 手指
原價$399 會場價$299

品牌:Verbatim (三菱化工),a.k.a
1.4x speed BD-R 單片裝
電腦節特價:$37

2.2x speed BD-RE 單片裝
電腦節特價:$44

3.2x speed BD-R DL 單片裝
電腦節特價:$78

品牌:ASUS
攤位編號:M01
1.ASUS Eee PC Touch T91筆記型電腦
原價HK$3988,電腦節優惠價發售
全系列Eee PC 再送NOD32 防毒軟件,Capdase 螢幕保護貼,無線滑鼠及六合一清潔組合(總值:HK$560)

2.2.ASUS Eee PC Disney MK90H 產品發佈及首賣會
首180 名買家除了以上總值$560 的贈品外,更可獲贈Eee Stick 一份,價值$300 (禮品總值:HK$860)

3.ASUS Eee PC Seashell 1008HA 星彩紅幻影藍限定版
ASUS 特別於電腦節推出星彩紅及幻影藍特別版,每款限定100 台,賣完即止。

4.ASUS U 系列輕薄型電腦
顧客凡於會場內購買任何系列之ASUS 筆記型電腦,除了優惠價外,更可獲贈多項禮品,包括:Kingsoft Office,六合一清潔組合,NOD32 及
額外2GB RAM (只限指定型號),總值$950

2009-07-21

Tunnel Remote Desktop via SSH

How to Tunnel Remote Desktop

Through SSH on a Windows Computer


Why me and why now?

CAE has been charged to implement the College of Engineering Network Security Policy .  As part of the security measures, the College has set up a firewall, which blocks access to the College's network on certain ports.

Those wishing to access their office (or lab) computer can do so via "Windows Remote Desktop", although not directly.  The method described below provides a secure (encrypted via SSH) method to gain access to a remote desktop (computer) behind the College's firewall.  This procedure is called tunneling. For details on how to remotely connect to a CAE Desktop, see the CAE Remote Desktop page on the CAE web site.

What you need

Setting up PuTTY

  1. Start PuTTY (double-click on putty.exe). You will see a window similar to this one:


  2. Next, enable compression. Select SSH protocol level 2 as the default in the SSH subcategory for better security:


  3. To configure the "tunneling". In the example below, we are tunneling the remote desktop port on the local machine, through the gateway to the Remote Desktop port on the fictitious remote server "remotedesktop.engr.wisc.edu" (enter the name or IP address of your computer in place of this name). The name is resolved from the remote gateway machine, so it can be a hostname not visible to the user machine. Depending on your operating system, what you enter into "Source Port" may be different from the example shown: For more information on why this is necessary, see this page


    • The source port is the port on the user machine to which you will address connections that you intend to have tunneled.
    • The destination defines a host and a port to which the remote gateway's sshd will connect incoming traffic from the user machine. When you click on
    • Add, the results are displayed like this:


  4. Go back to the Session subcategory, identify the gateway host's IP address or name (in the example below we used sun-10.cae.wisc.edu as the gateway, although it could be any computer with ssh allowed through the firewall), make sure that the SSH button is filled, name your session (in this case "Tunnel to my Remote Desktop") and save it:


    Whenever you need the tunnel to appear, you can start PuTTY and double-click that session.

Starting Remote Desktop

  1. Start PuTTY and then click on the session that you saved earlier;  this will start the SSH connection.

  2. Login to the gateway computer when prompted (in this case, the gateway computer is 'sun-10.cae.wisc.edu') and when the login process is done, you can minimze the active PuTTY session (you don't need to type anything more, but you need to keep the program running).

  3. Start your Remote Desktop program as usual.  Instead of entering the name of the computer that you want to connect to, you must type in the address and port that Putty is forwarding to. Depending on your operating system, this may be different from what is shown in the example:
    • Windows XP: 127.0.0.2
    • Other Windows Platforms: 127.0.0.1
    This will connect you to the computer that was specified in PuTTY (in this case, the fictional computer remotedesktop.engr.wisc.edu).

  4. Voila! You are now connected to your Remote Desktop computer through an SSH tunnel!

  5. After you are done using Remote Desktop, exit from the program as normal and then you may close the PuTTY program.

2009-07-07

Intel Core i5定於9月第二週發佈

Intel Core i5定於9月第二週發佈
Clarksfield處理器提早第四季初上市

據台灣 PC 業者表示, Intel 上週向 PC 業者透露有關全新桌面平台處理器 Lynnfield 及晶片組 P55 、行動平台處理器 Clarksfield 及晶片組 PM55 的發佈時間,以及最新命名法則,其中 Lynnfield 處理器並不會完全被命名為 Core i5 ,部份型號會被劃入 Core i7 ,而 Clarksfield 處理器則會被命名為 Core i7 及 Core i7 Extreme 。

 

根據 Intel 最新規劃,採用 Intel 新一代 Lynnfield 處理器將會於 2009 年 9 月 8 日~ 11 日與全新 Intel P55 晶片組同時發佈,這款採用 LGA 1156 接口的全新處理器,將同時採用 Core i7 及 Core i5 命名,分別在於 Core i7 版本支援 Hyper-Threading 技術,最高同時執行 8 個 Threads ,但 Intel Core i5 型號則不支援 Hyper-Threading 技術。

 

有主機板廠商批評 Intel 把部份 LGA 1156 接口的 Lynnfield 處理器命名為 Core i7 ,將容易導致消費者與現有 LGA 1366 平台產品混淆,應把全線 LGA 1156 處理器命名為 Core i5 做法將較為合理。

 

此外,原定於 2009 年第四季未上市的新一代 Nehalem 微架構行動平台處理器 Clarsfield ,將會提早於 2009 年 9 月 28 日至 10 月 23 日之間配合 Intel PM55 晶片組同時發佈,將會採用 Core i7 及 Core i7 Extreme 品牌命名。

 

根據 Intel 最新技術白皮書, Clarsfield 處理器採用 Socket G1 接口,四核心並支援 Hyper-Threading 技術,最高同時執行 8 個 Threads , Core i7 Extreme 版本分別在於核心時脈及 TDP 較高,其他規格則完全相同。

 

Intel Lynnfield Processors Reference Table Update

  Core i7-XXX Core i7-XXX Core i5-XXX
Codename Lynnfield Lynnfield Lynnfield
IGP No No No
Core/Threads 4c/8t 4c/8t 4c/ct
Clock 2.93GHz 2.8GHz 2.66Hz
Turbo Boost 3.6GHz 3.46GHz 3.2GHz
Memory Support DDR3-1333 DDR3-1333 DDR3-1333
L3 Cache 8MB 8MB 8MB
TDP 95W 95W 95W
VT Yes Yes Yes
TXT Yes Yes No
Socket LGA1156 LGA1156 LGA1156

Source : PC Maunfacturers , Compiled by HKEPC Hardware, July 2009

 

Intel Clarksfield Processors Reference Table Update

  Core i7 XE-XXX Core i7-XXX Core i7-XXX
Codename Clarksfield Clarksfield Clarksfield
IGP No No No
Core/Threads 4c/8t 4c/8t 4c/8t
Clock 2.0GHz 1.73GHz 1.6GHz
Turbo Boost 3.2GHz 3.06GHz 2.8GHz
Memory Support DDR3-1333 DDR3-1333 DDR3-1333
L3 Cache 8MB 8MB 6MB
TDP 55W 45W 45W
VT Yes Yes Yes
TXT Yes Yes Yes
Socket PGA G1 PGA G1 PGA G1

Source : PC Maunfacturers , Compiled by HKEPC Hardware, July 2009

 

P55
Intel LGA 1156 Socket

AMD X2 240,245 vs intel E5300,E5400

AMD 速龍II 245/240 挑戰 E74/E63/E54/E53

2009-07-02

SCEA

SCEA第二階段---我的步驟
上回提到了文件中應該要包含Assumption、Design Decision、Diagram等要素讓它更具可讀性,這回我要講講設計的主軸應該要如何開始撰寫。
試題中提到了第二階段必須交附的四大項目:
1. Class Diagram --> 1張
2. Sequence Diagram --> 每個Use Case 1張
3. Component Diagram --> 1張
4. 輔助說明文件(需要包含Assumption和Design Decision)
由於我個人畫圖及寫文件的技巧不佳,因此花了些功夫才做出來,以下分享我的產出步驟:
1. 惡補GoF Design Pattern及J2EE Core Design Pattern,不是叫你照抄,但了解別人怎麼做,自己也才能做的更好,不是嗎!(如果你已經很熟就跳過吧)。
2. 決定整體架構的大方向,例如前端介面使用Web MVC,商業邏輯放在SLSB,Persistence使用EJB配合…
3. 惡補UML圖的繪製規格,練習使用UML Case Tool (如果你已經很熟就跳過吧)。
4. 把需求從頭到尾看過至少二次以上,將有疑問的地方寫成Assumption。
5. 從Domain Model長出Class Diagram,並寫下各個在設計類別時所牽涉到的Design Decision,注意符合需求是第一原則。
6. 決定各層有那些元件,一樣寫下Design Decision,注意要和其它圖保持設計的一致性。
7. 根據元件畫出各Use Case 的Sequence Diagram,此時你會再發現一些需要Assumption的地方,或設計不合理的地方,寫下來,並且回頭修正設計。
8. 畫出Component Diagram,寫下Design Decision,注意要和其它圖保持設計的一致性。
9. 寫說明文件,記得此文件要包含之前所整理的Assumption、Design Decision和各個UML圖,如果有不容易了解的地方,盡量用圖形輔助。
10. Review再Review,切記符合需求及一致性(不要有自相茅盾的地方)。
11. 送件。
張貼者:我是一隻Coding Monkey 位於 下午 9:56 2 意見
標籤: Java Architect
2007年1月28日 星期日
SCEA第二階段---如何開始

還記得拿到第二階段的考題後,便迫不及待的把他印出來,並且很認真的畫線、註解。
然後很快的看完了一遍,當時覺得應該不難,但反覆看過幾次後,卻還是不知如何開始…
在考SCEA之前,我也負責過幾個J2EE的案子,在客戶面前也都能自傲的吹噓我們的OOAD技術,UML的各種圖也都畫了出來,在"結案"前也準時的交付,但仔細想想…那些文件的用途是什麼?
老實說,是為了結案。
如果客戶需要顧用一位新員工來維護該系統,新員工能在沒有我出面說明的情形下,只憑文件就了解系統嗎? 系統中的各項設計訣擇,是在什麼情形下產生的?
一個個問題在我回想中一一浮現…是的,我的確沒有認真想過,以致只能看著試題發呆…
當你拿到一份需求時,首先要做的是徹底了解,接著思考可行的架構,一個好的架構必然是符合需求且具全面性考量的,以下我要來介紹一些名詞,都是在設計時必須好好思考的名詞:

1. Assumption:
我在SI公司待了很久,就是那種專門接案件開發的單位,東奔西跑下來,看過的需求還真不少,使用者提出需求一定有他的想法需要你幫他滿足,但可惜的是他們永遠說不清楚,他們需要一位有經驗的IT從業人員來導引出真正清楚可行的需求。
不論是那裡來的需求書,看完後必然有一堆問號(如果你有認真看的話),把這些問號都寫下來,去找實際的使用者,一一問清楚,然後做成正式的會議記錄,要求大家簽名同意,並更新文件,這個階段的每個遺漏,都是你這開發者將來會吃悶虧的地方。
SCEA第二部份的考題也是一份需求書,同樣的也是不清不楚,但這次沒有使用者可以幫你犛清所有問號,但沒關係,想像你自己是使用者,自問自答,把答案寫下來成為一條一條的Assumption。

2. Design Decision:
去年12月,我帶著身懷六甲的老婆出遊,行程是這樣設計的:
第一天:
08:00 出發,從茹冬交流道上北二高,往南至南投草屯接新中橫,目的地是合歡山
12:00 清境附近找一間不錯的民宿用餐
14:00 合歡山莊 Check in
15:00 武嶺賞雲海
16:00 合歡主峰登山步道
17:30 合歡主峰頂看日落


行程的設計訣擇:
1. 08:00出發-->因為當天是非假日,所以預期不會塞車,這時間出發到清境剛好約午餐時間。
2. 從茹冬交流道上北二高,往南至南投草屯-->因為從新竹經北二高到南投路徑短,車流速度快。
3. 12:00 清境附近找一間不錯的民宿用餐-->清境附近的用餐選擇很多,不致於找不到餐館,所以決定到時再找。
4. 從新中橫上山會先經過合歡主峰、武嶺再到合歡山莊,但我們決定先到合歡山莊Check in再回頭觀光 --> 因為合歡主峰日落景致很美,為了配合黃昏的時間,所以決定先Check in再繞回頭路。


我並不想寫一篇遊記,但思考一下行程與其設計訣擇之間的關係,其實是很有趣的。
如果只有行程表,而十年後的我看到這行程表時,能夠了解行程為何要這樣安排嗎?
如果只有行程表,而十年後的我想再安排一次合歡山之旅時,這行程有用嗎?(也許到時的交通環境和景點設施都已改變)
生活中的許多事物都存在著「Design<-->Design Decision」之間的關係,例如大樓的設計圖、食譜、引擎……數不盡。
軟體設計也一樣,好的設計文件,應該要將「重要的」「Design Decision」,以簡單明暸的方式寫下來,這會使你的文件更具可讀性及參考價值。

3. Good Diagram:
簡單的文字搭配良好的圖解,可以讓你的文件可讀性事半功倍,這裡的Diagram並不限定要符合UML規格,只要是可以幫助說明的,都可以放在文件中,記住一點:沒有人員輔助說明就看不懂的文件,不能叫好。
張貼者:我是一隻Coding Monkey 位於 下午 11:19 0 意見
標籤: Java Architect
2007年1月11日 星期四
SCEA Part 2考試心得(二)
在完成SCEA第二階段的報名手續後, 你會收到考試中心通知,要求受試者至Sun CertManager下載考題,網址如下:
https://www.certmanager.net/sun_assignment/
你必須使用在Prometric報考第一階段時的考試ID (Candidate ID)做為帳號登入,然後下載作業題目(Assignment)
開啟後原則上每個人的題目都一樣,是一個航空系統專案,內容方面,礙於保密協定的關系,我就不透露了,但其實在網路上應該很容易可以找到這份題目。
第二階段的作業要求你產出一份文件,內容包含Class Diagram, Component Diagram, Sequence Diagram for each Use Case,以及對系統的說明和假設。
這些文件都必須使用英文撰寫成網頁格式,並在最後打包成一個.jar上傳回Sun CertManager。
在你上傳之後,便可以至Prometric報名第三階段的考試,考試類型是四題問答題,問的就是你系統的設計方式,及為什麼要這樣設計,目的是確認作業真的是你本人寫的。
完成第三階段後,在家等待四到六週,你會收到一封EMail通知你的考試成績。如果大於70分,那恭喜你過關了,如果小於70分,那你還有一次機會補考310-300R,修改好你的作業後再度上傳。
補考時唯一可以參考的資訊是考試成績,Sun不會把為什麼不及格的原因告訴你,你只會得到一份成績單,裡頭寫著Class Diagram的分數、Component Diagram的分數、Sequence Diagram的分數。
根據這些分數,你可以補強作業中失分較多的地方,重新寫完後再上傳到Sun CertManager。
補考的流程我沒有實際體驗過,不過根據我在Java Ranch看來的資料,如果補考後還是失敗的話,必須再回到第一階段重新考起。
在此提供大家一個網站:http://www.javaranch.com
該網站有一個SCEA考試版,提供很多SCEA考試方面的相關討論,幾乎是所有準備報考SCEA同好的必到之處。
張貼者:我是一隻Coding Monkey 位於 上午 12:14 0 意見
標籤: Java Architect
2006年12月28日 星期四
SCEA Part 2考試心得(一)

SCEA -- Sun Certified Enterprise Architect
是昇陽電腦在Java領域最高階的考試,分成三階段。就在上個月,我終於把第二、三階段考完了。

前天(1/9),我收到了一封來自Prometric的信,我通過了。
在此和所有有興趣報考的同好們分享我的考試心得:
第一階段是310-051,和一般Java的認證考試沒什麼兩樣,就是一堆選擇題,出題方向就是EJB、Design Pattern…還有一些企業系統的架構概念,雖然題目很雜,但是上網找找考古題用力K個幾天應該都能過關。
第二階段就是今天我要介紹的部份了,考試編號是310-300A,也是整個SCEA考試中最煩人的地方。
在你通過第一階段後,可以再向昇陽繳錢登記,然後便可以下載第二階段的考題,原則上所有人的題目都一樣,就是機票訂購系統。(以後會不會改我可不保證喔!)
下載考題後,打開來,你會發現那只是一份寫的"非常不完整"的需求規格書,你的任務是使用UML,根據規格設計出一套系統,但不用實做,只需要文件就好了。
我相信第二階段對於在OOAD已經很熟練的架構師而言是很簡單的,但可惜我好像不夠資格說簡單,有幾大瓶頸是我必須克服的:
1. 對J2EE系統的架構不夠了解
2. 對Design Pattern (GoF和Core pattern)不夠熟練
3. 對UML不熟 (用看的很簡單,但要從自己手中畫出來,一開始真的有點累)
4. 以往都是先實作再說,文件後補,應付了事,但現在卻必須扎扎實實的寫一份讓人能清楚了解的"英文"文件。
認證只是一紙文憑,但準備的過程的確讓我在軟體工程方面增長不少,所以如果你和我一樣不是大內高手,但對J2EE的OO設計議題有興趣,建議你也可以報考SCEA,應該有不少收獲。
(如果你已經是高手高高手…那,SCEA就真的是一張紙而已,就看你想不想花時間金錢來拿囉!)


隨身的 Windows Live Messenger 和 Hotmail,不限時地掌握資訊盡在指間— Windows Live for Mobile