2009年12月17日 星期四

解決Oracle 看到的中文(Big5)為亂碼

Modify the Window Registry

** (Must) Installed Oracle Client ***
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient10g_home1
/*for unicode*/
NLS_LANG=AMERICAN_AMERICA.WE8ISO8859P1
/*for big5*/
NLS_LANG=TRADITIONAL CHINESE_TAIWAN.ZHT16MSWIN950

2009年11月5日 星期四

[Java Script] 操作select控制項大全(新增、修改、刪除、選中、清空、判斷存在等)

1判斷select選項中 是否存在Value="paraValue"Item

2select選項中 加入一個Item

3select選項中 刪除一個Item

4刪除select中選中的項

5修改select選項中 value="paraValue"text"paraText"

6設置selecttext="paraText"的第一個Item為選中

7設置selectvalue="paraValue"Item為選中

8得到select的當前選中項的value

9得到select的當前選中項的text

10得到select的當前選中項的Index

11清空select的項

js 代碼

// 1.判斷select選項中是否存在Value="paraValue"Item

function jsSelectIsExitItem(objSelect, objItemValue) {

var isExit = false;

for (var i = 0; i <>

if (objSelect.options[i].value == objItemValue) {

isExit = true;

break;

}

}

return isExit;

}

// 2.select選項中加入一個Item

function jsAddItemToSelect(objSelect, objItemText, objItemValue) {

//判斷是否存在

if (jsSelectIsExitItem(objSelect, objItemValue)) {

alert("ItemValue值已經存在");

} else {

var varItem = new Option(objItemText, objItemValue);

objSelect.options.add(varItem);

alert("成功加入");

}

}

// 3.select選項中刪除一個Item

function jsRemoveItemFromSelect(objSelect, objItemValue) {

//判斷是否存在

if (jsSelectIsExitItem(objSelect, objItemValue)) {

for (var i = 0; i <>

if (objSelect.options[i].value == objItemValue) {

objSelect.options.remove(i);

break;

}

}

alert("成功刪除");

} else {

alert("select中 不存在該項");

}

}

// 4.刪除select中選中的項

function jsRemoveSelectedItemFromSelect(objSelect) {

var length = objSelect.options.length - 1;

for(var i = length; i >= 0; i--){

if(objSelect[i].selected == true){

objSelect.options[i] = null;

}

}

}

// 5.修改select選項中 value="paraValue"text"paraText"

function jsUpdateItemToSelect(objSelect, objItemText, objItemValue) {

//判斷是否存在

if (jsSelectIsExitItem(objSelect, objItemValue)) {

for (var i = 0; i <>

if (objSelect.options[i].value == objItemValue) {

objSelect.options[i].text = objItemText;

break;

}

}

alert("成功修改");

} else {

alert("select中 不存在該項");

}

}

// 6.設置selecttext="paraText"的第一個Item為選中

function jsSelectItemByValue(objSelect, objItemText) {

//判斷是否存在

var isExit = false;

for (var i = 0; i <>

if (objSelect.options[i].text == objItemText) {

objSelect.options[i].selected = true;

isExit = true;

break;

}

}

//Show出結果

if (isExit) {

alert("成功選中");

} else {

alert("select中 不存在該項");

}

}

// 7.設置selectvalue="paraValue"Item為選中

document.all.objSelect.value = objItemValue;

// 8.得到select的當前選中項的value

var currSelectValue = document.all.objSelect.value;

// 9.得到select的當前選中項的text

var currSelectText = document.all.objSelect.options[document.all.objSelect.selectedIndex].text;

// 10.得到select的當前選中項的Index

var currSelectIndex = document.all.objSelect.selectedIndex;

// 11.清空select的項

document.all.objSelect.options.length = 0;


source: http://goodlucky.pixnet.net/blog/

JSP Pagination

http://www.java3z.com/cwbwebhome/article/article1/1102.html?id=1275

2009年11月4日 星期三

Linux下Tomcat6.0 應用服務部署

一.所需軟件

軟件:jdk6.bin、apache-tomcat-6.0.18.tar

程序包:customer.war,customerService.war,FrontProject.war,expressBackUser.war,

expressAccount,expressPlatform.war,OrderDispose.war,OrderDisposeTest.war



二.安裝jdk

1).移動jdk到安裝目錄;

2).賦予執行權限:chmod u+x jdk6.bin

3).執行命令:./jdk6.bin

4).用mv命令把jdk1.6.0_01給它改個名字叫jdk1.6

5).開始設置環境變量:

vi /etc/profile.d/java.sh

在profile.d/java.sh文件的最後添加如下代碼

#set java environment

JAVA_HOME=/usr/local/hzcms/jdk6

export JAVA_HOME

CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

export CLASSPATH

PATH=$PATH:$JAVA_HOME/bin

export PATH

保存退出

使變量生效source ./profile.d/java.sh

6)命令java -version(顯示的版本比實際版本號低的情況可能是操作系統的原因)

如果安裝成功會出現java的版本信息

三.安裝tomcat6.0

1).解壓:tar zxvf apache-tomcat-6.0.18.tar.gz

2).將apache-tomcat-6.0.18的文件名修改為tomcat6.0

命令為:mv apache-tomcat-6.0.18tomcat6.0

3).#cd /tomcat6.0/bin

#./startup.sh //啟動tomcat

此時tomcat開始啟動,等啟動完成後,在地址欄輸入

http://ip:8080就可以看見熟悉的大貓了。

#./shutdown.sh //停止tomcat



4).tomcat6.0自啟動



修改/etc/rc.d/rc.local文件,添加以下內容:

export JDK_HOME=/usr/local/bycw/jdk1.6

export JAVA_HOME=/usr/local/bycw/jdk1.6

/usr/local/bycw/tomcat6.0/bin/startup.sh


四.修改tomcat內存

catalina.sh開頭
加這麼一行

JAVA_OPTS='-Xms1536m -Xmx1536m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m'

source: http://space.itpub.net/21070542/viewspace-606594

2009年11月2日 星期一

2、列出mysql現行環境
mysqladmin variables -u root -p <==使用指令
mysql>show variables; <==使用mysql語法
============================================================================================

3、登入資料庫
mysql -u root -p towns <==使用root帳號,登入towns資料庫
mysql -h localhost -u root -p towns <==使用root帳號登入本機端的towns資料庫, 做網路管理時,-h很重要
============================================================================================

4、建立資料庫
4.1 mysql -u root -p <==使用root登入mysql
4.2 打入root密碼
4.3 create database towns; <==使用mysql語法,新增towns這個資料庫,“;”一定要加
4.4 mysqladmin -u root create cacti -p <==也可以用指令建立資料庫
============================================================================================

5、刪除資料庫
5.1 mysql -u root -p <==使用root登入mysql
5.2 打入root密碼
5.3 drop database towns; <==使用mysql語法,刪除towns這個資料庫,“;”一定要加
============================================================================================

6、列出現有資料庫、資料表、資料欄
6.1 mysql -u root -p <==使用root登入mysql
6.2 打入root密碼
6.3 show databases;
6.4 mysql -e "show databases; " -p <==用指令顯示資料庫
6.5
------------------------------------------------------------------------------------------------------------------------------------
6.1 mysqlshow -u root -p <==使用root登入mysql,並列出所有的資料庫
6.2 mysqlshow -u root -p towns <==使用root登入mysql,並列towns資料庫中的資料表
6.3 mysqlshow -u root -p towns towns <==使用root登入mysql,指定towns資料庫,並列出towns資料表
資料來源:http://tsuozoe.pixnet.net/blog/post/21283890
============================================================================================

7、匯入資料庫
7.1 需先建立資料庫(如4),可以看一下,dump下來的語法中,是否有下CREATE DATABASE,有就不用建了
7.2 mysql -u root -p abc <'/home/towns/abc/abc.sql' <==將abc.sql匯入abc資料庫中
============================================================================================

8、匯出資料庫
8.1 資料庫需存在
8.2 mysqldump -u root -p abc >'/home/towns/abc/abc.sql' <==將abc資料庫匯出到abc.sql檔案
============================================================================================

9、新增使用者(需先登入mysql server)
9.1 使用grant新增
9.1.1 grant all on abc.* to towns identified by 'abc123' with grant option;
建立towns使用者具有abc完整的管理權,密碼為abc123
9.1.2 grant all on abc.* to towns@localhost identified by 'abc123' with grant option;
建立本機端towns使用者具有abc完整的管理權,密碼為abc123
9.1.3 grant all on *.* to towns@localhost identified by 'abc123' with grant option;
建立本機端towns使用者具有所有資料庫完整的管理權,密碼為abc123
9.1.3.1 grant all on *.* to towns@localhost identified by 'abc123';
與上面的方法相同,獨缺“允許特權”
9.2 使用INSERT
9.3 CREATE USER
--------------------------------------------------------------------------------------------
9.4 變更密碼
9.4.1 grant all on *.* to towns@localhost identified by '123abc' with grant option;
將towns使用者的密碼,由abc123變成123abc
9.4.2 SET PASSWORD FOR 'root'@'localhost.localdomain' = PASSWORD( '*******' )
SET PASSWORD FOR 'root'@'localhost' = PASSWORD( '*******' )
============================================================================================

10、刪除使用者
10.1 DELETE FROM mysql.user WHERE User='towns' ;
刪除使用者towns
10.2 DROP USER test@localhost;
============================================================================================

11、登入資料庫帳號、密碼常見檔案位置
============================================================================================

12、更新資料庫資料(在做任何更動後,建議要使用這指令)
12.1 flush privileges;
============================================================================================

13、在作業系統中,檢查權限之命令
13.1 mysqlaccess localhost user mysql -U root -P abc123 <==檢查user帳號的權限
13.2 mysqlaccess localhost towns abc123 -U root -P abc123 <==檢查towns帳號的權限
============================================================================================

14、權限管理
14.1 grant SELECT,INSERT,UPDATE on abc.* to towns@localhost identified by 'abc123';
開放三種權限(SELECT,INSERT,UPDAT)給towns(本機端),管理o2secure所有的表格
14.2 開放多個資料庫(o2secure、test、abc)給一個帳號(towns)管理,需一條一條加
grant all on abc.* to towns@localhost identified by 'abc123';
grant all on test.* to towns@localhost identified by 'abc123';
grant all on abc.* to towns@localhost identified by 'abc123';
--------------------------------------------------------------------------------------------
14.3 權限
資料庫(DateBase),十五種權限:
ALL PRIVILEGES、ALTER、CREATE、DELETE、DROP、FILE、INDEX、INSERT、PROCESS、REFERENCES、RELOAD、SELECT、SHUTDOWN、UPDATE、USAGE

資料表(Table),八種權限:
SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、INDEX、ALTER

資料欄(column),三種權限:
SELECT INSERT UPDATE

修改權限
14.4 REVOKE 權限 ON 資料庫(或資料表TABLE) TO user@host IDENTIFIED BY '密碼';
============================================================================================

GRANT ALL PRIVILEGES ON `abc` . * TO abc@% WITH GRANT OPTION ;
DROP USER towns@';
DROP USER test@localhost';
---------------------------------------------------------------------------------------------
CREATE USER test@localhost IDENTIFIED BY '********';

GRANT USAGE ON * . * TO test@localhost IDENTIFIED BY '********' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

SET PASSWORD FOR root@localhost = PASSWORD( '*********' ) <==在資料庫中修改密碼方式

===============================================================================================
16.忘記root密碼處理方式
Linux:
1.使用root登入
2.停止mysql服務(for redhad base)
service mysqld stop
3.使用mysqld_safe指令
mysqld_safe --skip-grant-tables &
此時,會開啟一個安全模式,並停住

4.開新的ssh,用root登入系統
5.使用mysql帳號登入mysql中
6.變更mysql中root密碼
update user set password = password('abc123') where user = 'root';
7.離開mysql
8.重新啟動mysql
9.使用root新密碼登入mysql
-----------------------------------------------------------------------------------------------

Windows:
1.用系統管理員登陸系統。
2.停止MySQL的服務。
3.進入命令視窗,然後進入MySQL的安裝目錄,比如我的安裝目錄是c:\mysql,進入C:\mysql\bin
4.跳過許可權檢查啟動MySQL,
c:\mysql\bin>mysqld-nt --skip-grant-tables 軟體發展網
5.重新打開一個視窗,進入c:\mysql\bin目錄,設置root的新密碼
c:\mysql\bin>mysqladmin -u root flush-privileges password "198651"
c:\mysql\bin>mysqladmin -u root -p shutdown
將newpassword替換為你要用的root的密碼,第二個命令會提示你輸入新密碼,重複第一個命令輸入的
密碼。
6.停止MySQL Server,用正常模式啟動Mysql
軟體發展網
7.你可以用新的密碼連結到Mysql了。
命令:
軟體發展網
net mysql start 啟動MYSQL
net stop mysql 停止MYSQL
軟體發展網
下面以在Windows系統上為例,linux上將步驟2的mysqld-nt換為safe_mysqld即可
1 、停止mysql5服務:
net stop mysql5
2、開一個DOS視窗執行:
http://www.mscto.com
c:\mysql\bin>mysqld-nt --skip-grant-tables &
3、再開一個DOS視窗執行:
c:\mysql\bin>mysql mysql
> update user set password = password('123456') where user = 'root';
root密碼即為設置為123456!
4、啟動mysql5服務:
net start mysql5

相關資料:http://www.mscto.com/MySQL/20080731665.html

===============================================================================================
17.顯示目前mysql連線的threads狀態
mysql>show processlist; <==使用mysql語法
mysqladmin processlist -u root -p <==使用指令

===============================================================================================
18.列出MySQL目前的狀態
mysql> show status; <==使用mysql語法
mysqladmin status -u root -p <==使用指令(結果不同)

===============================================================================================
19.列出mysql的使用者
SELECT User FROM mysql.user Order by User;

帳號管理
mysql中,帳號可設為僅本機使用、僅網路使用、兩者皆可,與mysql安全性有關
mysql>grant all on *.* to towns@localhost identified by 'abc123' with grant option;
利用語法建立towns可以管理所有資料庫、只能本機連線,擁有最大權限
mysql>grant all on *.* to towns01@localhost identified by 'abc123';
利用語法建立towns可以管理所有資料庫、只能本機連線,少了grant權限,其他都有
mysql>grant all on *.* to towns02@ identified by 'abc123' with grant option;
利用語法建立towns可以管理所有資料庫、能外部及本機連線,擁有最大權限

towns@locahost <==只能本機連線
towns@192.168.8.176 <==只能192.168.8.176連線,用於限制帳號連線IP
towns@127.0.0.1 <==只能本機連線
towns@locahost.localdomain <==只能本機連線
towns@ <==不限制連線來源,危險的設定,不過local不能連

19.mysql -e "GRANT ALL PRIVILEGES ON cacti.* TO cactiuser@localhost IDENTIFIED BY 'cactiuser' ; "
利用指令來新增帳號

===============================================================================================
20.更換資料庫
登入mysql後,選用某個資料庫
mysql> use cacti; <==連入cacti資料庫

21.顯示資料庫的資料表(需先選好資料庫,才能show tables)
mysql> show tables;

mysql -e "use cacti; show table; " -p <==直接使用指令下SQL語法,並使用root登入(沒設user預設為root

===============================================================================================
22.免密碼登入mysql資料庫(用於資料庫定期備份等……)
1.vim ~/.my.cnf
[client]
password=YOUR_MYSQL_PASSWORD
2.chmod 600 ~/.my.cnf
設定完成後,直接使用mysql -u [user],就可以登入了

JSP+MYSQL UTF8中文亂碼

JSP透過JDBC連結MySQL,而JDBC中文編碼是BIG5,用utf8來看...會變成亂碼


方法1
通通用big5

方法2
MySQL字元集設成UTF-8 Unicode

欄位的整理設成utf8_general_ci

JDBC的URL
String url = "jdbc:mysql://localhost/database?useUnicode=true&characterEncoding=utf-8";
網頁上有讓使用輸入中文的地方(JSP)鍵入request.setCharacterEncoding("UTF-8");

方法3
更改my.ini(Mysql的組態設定)
[mysql]
default-character-set=utf8
[mysqld]
default-character-set=utf8

不過通常第二個方法用下去就OK了

或者用hibernate 的話,

2009年10月26日 星期一

MySQL使用rand函數實現隨機數

有朋友問到如何在mysql中使用隨機數
如何寫一個語句能一下更新幾百條MYSQL數據!

需要測試MYSQL數據庫,裡面有一個上萬條數據的數據庫,如何寫一個PHP文件一下每次更新幾百條信息,我都是寫一個循環一次更新一條信息,這樣我知道用WHILE寫就可以了,要是一次更新好比100條數據改如何寫呢!

謝謝
正確答案是:UPDATE cdb_posts SET views = rand();

順便給你找了點關於mysql rand函數的實例,如下:
那就在insert 命令中,value()裡面用rand(),注意字段寬度是否夠一直以為mysql隨機查詢幾條數據,就用

SELECT * FROM `table` ORDER BY RAND() LIMIT 5

就可以了。
但是真正測試一下才發現這樣效率非常低。一個15萬餘條的庫,查詢5條數據,居然要8秒以上
查看官方手冊,也說rand()放在ORDER BY 子句中會被執行多次,自然效率及很低。

You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.

搜索Google,網上基本上都是查詢max(id) * rand()來隨機獲取數據。

SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id ASC LIMIT 5;

但是這樣會產生連續的5條記錄。解決辦法只能是每次查詢一條,查詢5次。即便如此也值得,因為15萬條的表,查詢只需要0.01秒不到。
上面的語句採用的是JOIN,mysql的論壇上有人使用

SELECT *
FROM `table`
WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
ORDER BY id LIMIT 1;

我測試了一下,需要0.5秒,速度也不錯,但是跟上面的語句還是有很大差距。總覺有什麼地方不正常。
於是我把語句改寫了一下。

SELECT * FROM `table`
WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
ORDER BY id LIMIT 1;

這下,效率又提高了,查詢時間只有0.01秒
最後,再把語句完善一下,加上MIN(id)的判斷。我在最開始測試的時候,就是因為沒有加上MIN(id)的判斷,結果有一半的時間總是查詢到表中的前面幾行。
完整查詢語句是:

SELECT * FROM `table`
WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
ORDER BY id LIMIT 1;
SELECT *
FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
WHERE t1.id >= t2.id
ORDER BY t1.id LIMIT 1;

最後在php中對這兩個語句進行分別查詢10次,
前者花費時間 0.147433 秒
後者花費時間 0.015130 秒
看來採用JOIN的語法比直接在WHERE中使用函數效率還要高很多。


source:http://blog.24reader.com/vincentlam

2009年9月18日 星期五

Sun和Java Swing 2.0的故事

這是一個很長的話題,自從“Sun:放棄Swing,主推JavaFX”,“Sun凍結Swing”的傳言出來,整個Swing社區對Sun放棄 Swing的可能表示了強烈的反對,由於作為一個成熟Java UI技術,Swing擁有相當數量的開發者,在關於Swing的爭論中,要求Sun繼續支持Swing的聲音不斷,一些開發者也澄清了大眾對Swing的 錯覺,詳見“關於Swing的六個謊言”。

在09年1月26日,Jonathan Giles發表了他的博客:“Java Swing 2.0”,要求Sun對Swing進行合理的改進。

Jonathan Giles寫道

我相信不基於JavaFX的Swing 2.0的改進非常必要,基於Java框架,專注於桌面開發。我和很多開發者交換了意見,我們認為Swing 2.0應該有以下改進:

Generics- based基於範型:我們不再需要將我們的對象放入不同的Swing數據模型和組件中,只是為了接受返回對象。它應該能夠通過指定數據類型創建swing 模型和組件。現在已經有了一個Swing-generics project項目,雖然發展的有點慢,但是Swing2.0應該包含這個項目,不需要重複工作。

Support for enumerations支持枚舉:這個需要是非常明顯的,很多public static final int數據應該由枚舉替換。這可以讓API乾淨很多。

改進對collection frameworks的支持:這就是說我們不需要一直使用Vector lists,除非絕對需要同步。

對事件分發線程event dispatch thread (EDT)規則的嚴格強制:Swing一直速度很慢,這並不是事實,但是讓人們這樣感覺,這個感覺存在,因為開發者不理解如何控制處理EDT .現存代碼缺乏關於EDT規則相關的強制,於是不能在EDT上運行的任務執行時間很長。所以,缺省的,Swing 2.0必須進行EDT驗證,拋出所有異常。這會讓開發者不爽,但是結果會讓程序運行更快,讓用戶滿意。這很值得。

改進bean綁定和驗證:我不會說到我們需要properties那麼遠,是因為還沒有足夠的信息給出確認的意見,我知道 JGoodies beans binding and validation非常有用,讓創建數據驅動用戶界面容易並且迅速。 Swing 2.0也應該吸取這些優點。

這篇博客得到了大量的回復和轉載,在Swing社區引起了強烈反饋。 Sun也隨後在官方博客“Swing and JDK 7”上做了回應:

sun寫道

Swing對於Sun非常重要,我們擁有大量的開發者在Swing上開發,Swing在Sun的未來開發藍圖中,在富客戶端應用RIA方面,以及其他所有方面都擁有重要位置。

JavaFX也使用了很多Swing的組件和桌面工具,Sun很欣喜的看到基於Swing出現了很多優秀的項目,比如: Griffon, Thinlet, Pivot和LWUIT等等。

所以,我們提升了Swing的重要性,甚至比JavaFX的下一個版本,甚至比Java SE 6更重要,將花大力氣彌補Swing作為UI工具的一些不足,比如讓Swing開發更加簡單,比如更好的運行時runtime部署和性能優化。這些方面的 進展讓Swing開發者獲益,並且也讓其他依賴Swing的技術也獲得優勢。

對於Sun來說,在JDK 6向JDK 7轉移的期間,首先最重要的是讓運行時runtime更加輕量化,更快下載,更快啟動,對瀏覽器兼容更好,提升runtime性能。在Java SE 6u10中,已經得到體現。第二個就是Swing了,讓臃腫的Swing減少模板代碼和概念上的複雜性,開發典型的Swing應用將使用JDK 7中的Swing Application Framework.

Sun將通過OpenJDK讓Sun以外的開發者更加容易為Swing貢獻代碼,我們已經和XRender pipline team團隊合作為Java在Unix平台上提供更好的圖形加速性能。在JDK 7中,我們將加入組件類似JXLayer, DatePicker,和CSS styling等等。

我們也熱切希望能夠在JavaFX中使用Swing的功能,尤其對聽到什麼類型Swing應用能夠需要嵌入JavaFX組件有興趣。

綜上,就是Sun保證對Swing繼續開發,並且在JDK 7中加入Swing Application Framework.

現在Sun也遵守了諾言,Swing Application Framework (SAF)開始向社區徵詢意見。

Alexander Potochkin發表了博客“Swing Application Framework is back again”。他提出了SAF面臨的問題,比如在同一個JVM中運行兩個SingleFrameApplication衝突的問題;在Mac操作系統 上,Swing很難提供原生的用戶界面等。希望SAF能夠成為一個理想的框架,解決Swing遇到的問題,過渡到Swing 2.0.

2009年9月1日 星期二

Linux Find Command example

find命令用於查找文件和目錄,任何位於參數之前的字符串都將被視為欲查找的目錄。

find可以指定查找條件如名稱,類型,時間,文件大小,權限和所有者查找,針對多個條件進行與或非的邏輯運算。我們可以控制find的查找的行為,還可以和其他命令組合使用。

find
find .
find . -print
三者等效,查找當前目錄下所有的文件和目錄(遞歸子目錄),以每行一個文件或者目錄的形式列舉出,不包含隱藏文件

find lib opt bin
同上,查找指定的多個目錄(lib/opt/bin)

(1)指定查找條件

1)按名稱查找

find . -name readme.txt
查找當前目錄下(遞歸子目錄)的所有名為readme.txt的文件

find . -name \*.txt
find . -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名稱以.txt結尾的文件,注意*號的寫法,需要前面加\或者放到雙引號中

find . -iname \*.txt
默認find是區分大小寫的,如果不想區分大小寫,請使用-iname替代-name,如上則"abc.TXT"將被查找到

2)按類型查找

find . -type d
查找當前目錄下(遞歸子目錄)的所有目錄

find . -type f
查找當前目錄下(遞歸子目錄)的所有文件

find . -type l
查找當前目錄下(遞歸子目錄)的所有符號鏈接

3)按時間查找

1.以小時為單位的時間
find命令三個選項用於按照時間查找,單位都是小時:

mtime —文件內容上次修改時間
atime —文件被讀取或訪問的時間
ctime —文件狀態變化時間

這三個選項都需要配置一個n值使用,可以是-n / n / +n:
-n小於n
n正好與n相等
+n大於n

find . -mtime -1
查找當前目錄下(遞歸子目錄)的所有1小時內修改的文件和目錄
find . -mtime +1
查找當前目錄下(遞歸子目錄)的所有修改時間超過1小時的文件和目錄
find . -mtime 1
查找當前目錄下(遞歸子目錄)的所有恰好在1小時前修改的文件和目錄

2.以分鐘為單位的時間
用法和*time類似,mmin、amin和cmin的不同在於單位時間是分鐘,用於查找在不到1小時的時間內變化了的文件和目錄

find . -mmin -10
查找當前目錄下(遞歸子目錄)的所有10分鐘內修改的文件和目錄

find . -mmin +20
查找當前目錄下(遞歸子目錄)的所有20分鐘外1小時內修改的文件和目錄

3.與特定的文件比較
-newer,-anewer和-cnewer選項用於查找與特定的文件比較的已修改或訪問過的文件,類似mtime,atime和ctime
-newer指內容最近被修改的文件
-anewer指最近被讀取過的文件
-cnewer指狀態最近發生變化的文件

find . -newer a.txt
查找當前目錄下(遞歸子目錄)的所有修改時間在a.txt之後(所以文件更新)的文件和目錄


4)按文件大小查找

1. -size選項用於查找滿足指定的大小條件的文件(注意不查找目錄), +表示大於, -表示小於,沒有+1表示正好等於。文件大小的單位可以是字節(用c表示), kb(用k表示)。

find . -size -100c
查找當前目錄下(遞歸子目錄)的所有文件大小小於100字節的文件

find . -size +100k
查找當前目錄下(遞歸子目錄)的所有文件大小大於100k的文件

find . -size 0
查找當前目錄下(遞歸子目錄)的所有文件大小為0的文件

2. -empty查找空文件和空文件夾,和-size 0不同的在於-size 0只查找空文件,或者說-empty -type f等同於-size 0 :

find . -empty
查找當前目錄下(遞歸子目錄)的所有文件大小為0的文件和空文件夾

find . -empty -type f
查找當前目錄下(遞歸子目錄)的所有文件大小為0的文件

find . -empty -type d
查找當前目錄下(遞歸子目錄)的所有空目錄


5)按權限和所有者查找

find . -perm 777
查找當前目錄下(遞歸子目錄)的所有權限為777的文件和目錄

find . -perm -u=rwx
查找當前目錄下(遞歸子目錄)的所有user權限為rwx的文件和目錄

find . -perm -ug=x
查找當前目錄下(遞歸子目錄)的所有user和group權限為x的文件和目錄

find . -user sky
查找當前目錄下(遞歸子目錄)的所有user為sky的文件和目錄

find . -group users
查找當前目錄下(遞歸子目錄)的所有group為users的文件和目錄

(2)查找條件的邏輯運算

1.邏輯與
find . -name "*.java" -size -mmin -10
find . -name "*.java" -a -size -mmin -10
查找當前目錄下(遞歸子目錄)的所有名為*.java並且修改時間在10分鐘之內的文件,-a是默認選項

2.邏輯或
find . -name "*.class" -o -name "*.jar"
查找當前目錄下(遞歸子目錄)的所有名為*.class或者*.jar的文件和目錄

3.邏輯非

find . ! -user sky
查找當前目錄下(遞歸子目錄)的所有user不是sky的文件和目錄

(3)控制查找的行為

find . -maxdepth 3 -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名為*.txt的文件,目錄深度不超過3層

find . -maxdepth 1 -name "*.txt"
查找當前目錄下(不遞歸子目錄,因為maxdepth為1)的所有名為*.txt的文件

find . -mindepth 3 -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名為*.txt的文件,目錄深度不低於3層

find . -mindepth 1 -name "*.txt"
查找當前目錄下的子目錄中(遞歸子目錄)的所有名為*.txt的文件,不包含當前目錄

find . -depth -name "*.txt"
查找當前目錄下(遞歸子目錄)的所有名為*.txt的文件,每個目錄都是先在目錄中進行查找,然後才繼續查找其子目錄

(4) find和其他命令的組合

find . -name "*.jar" -exec ls -l {} \;
find . -name "*.jar" -ls
查找當前目錄下(遞歸子目錄)的所有*.jar文件並使用ls -l列出詳細信息

find . -name "*.java" -exec grep HashMap {} \;
查找當前目錄下(遞歸子目錄)的所有的含有"HashMap"字樣的*.java文件

find . -name "*.sh" -exec mv {} backup \;
查找當前目錄下(遞歸子目錄)的所有的*.sh文件並移動到backup目錄中

source: http://www.blogjava.net/aoxj

2009年8月26日 星期三

HTML input中button和submit的區別

type=button 就單純是按鈕功能

type=submit 是發送表單

但是對於從事WEB UI的人應該要注意到,使用submit來提高頁面易用性:

使用submit後,頁面支持鍵盤enter鍵操作,而很多WEB軟件設計師,可能沒有註意到submit統一.

用button後往往頁面不支持enter鍵了。所以需要支持enter鍵,必須要設置個submit,默認enter鍵對頁面第一個submit進行操作。

<input type="submit" name="b1" value="提交" onClick="bt_submit_onclick()">

執行完onClick,轉到action。可以自動提交不需要onClick。所以說onclick這裡可以不要。

<input type="button" name="b1" value="提交" onClick="bt_submit_onclick()">

執行完onClick,跳轉文件在js文件裡控制。提交需要onClick。

比如:

1,onclick="form1.action='a.jsp';form1.submit();" & nbsp; 這樣就實現了submit的功能了。

2,<form name="form1" method="post" action="http:/ /www.sina.com.cn">

<input type="button" name="Button" value="Button" onClick="submit()"> </form>

3,<input type="button" name="Button" value="Button" ; onClick="javascript:windows.location.href="你的url"">


type=button 就單純是按鈕功能

type=submit 是發送表單


但是對於從事WEB UI的人應該要注意到,使用submit來提高頁面易用性:


使用submit後,頁面支持鍵盤enter鍵操作,而很多WEB軟件設計師,可能沒有註意到submit統一.


用button後往往頁面不支持enter鍵了。所以需要支持enter鍵,必須要設置個submit,默認enter鍵對頁面第一個submit進行操作。


<input type="submit" name="b1" value="提交" onClick="bt_submit_onclick()">



執行完onClick,轉到action。可以自動提交不需要onClick。所以說onclick這裡可以不要。



<input type="button" name="b1" value="提交" onClick="bt_submit_onclick()">


執行完onClick,跳轉文件在js文件裡控制。提交需要onClick。


比如:


1,onclick="form1.action='a.jsp';form1.submit();" & nbsp; 這樣就實現了submit的功能了。



2,<form name="form1" method="post" action="http:/ /www.sina.com.cn">



<input type="button" name="Button" value="Button" onClick="submit()"> </form>



3,<input type="button" name="Button" value="Button" ; onClick="javascript:windows.location.href="你的url"">

2009年8月17日 星期一

tomcat內存溢出總結



在生產環境中tomcat內存設置不好很容易出現內存溢出。造成內存原因是不一樣的,當然處理方式也不一樣。
這裡根據平時遇到的情況和相關資料進行一個總結。常見的一般會有下面三種情況:
1.OutOfMemoryError: Java heap space
2.OutOfMemoryError: PermGen space
3.OutOfMemoryError: unable to create new native thread.
對於前兩種情況,在應用本身沒有內存洩露的情況下可以用設置tomcat jvm參數來解決。 (-Xms -Xmx -XX:PermSize -XX:MaxPermSize)
最後一種可能需要調整操作系統和tomcat jvm參數同時調整才能達到目的。

第一種:是堆溢出。
在JVM中如果98%的時間是用於GC且可用的Heap size不足2%的時候將拋出此異常信息。
沒有內存洩露的情況下,調整-Xms -Xmx參數可以解決。
-Xms:初始堆大小
-Xmx:最大堆大小
但堆的大小受下面三方面影響:
1.相關操作系統的數據模型(32-bt還是64-bit)限制;(32位系統下,一般限制在1.5G~2G;我在2003 server系統下(物理內存:4G和6G,jdk:1.6 )測試1612M,64為操作系統對內存無限制。)
2.系統的可用虛擬內存限制;
3.系統的可用物理內存限制。
堆的大小可以使用java -Xmx***M version命令來測試。支持的話會出現jdk的版本號,不支持會報錯。
-Xms -Xmx一般配置成一樣比較好比如set JAVA_OPTS= -Xms1024m -Xmx1024m

第二種:永久保存區域溢出
PermGen space的全稱是Permanent Generation space,是指內存的永久保存區域。這一部分用於存放Class和Meta的信息,Class在被Load的時候被放入PermGen space區域,它和和存放Instance的Heap區域不同,GC(Garbage Collection)不會在主程序運行期對PermGen space進行清理,所以如果你的APP會LOAD很多CLASS的話,就很可能出現PermGen space錯誤。這種錯誤常見在web服務器對JSP進行pre compile的時候。但目前的hibernate和spring項目中也很容易出現這樣的問題。 http://www.javaeye.com/topic/80620?page=1的帖子有討論的這個問題。可能是由於這些框架會動態class,而 且jvm的gc是不會清理PemGen space的,導致內存溢出。
這一個一般是加大-XX:PermSize -XX:MaxPermSize來解決問題。
-XX:PermSize永久保存區域初始大小
-XX:PermSize永久保存區域初始最大值
這一般結合第一條使用,比如set JAVA_OPTS= -Xms1024m -Xmx1024m -XX:PermSize=128M -XX:PermSize=256M
有一點需要注意:java -Xmx***M version命令來測試的最大堆內存是-Xmx與-XX:PermSize的和比如係統支持最大的jvm堆大小事1.5G,那-Xmx1024m -XX:PermSize= 768M是無法運行的。

第三種:無法創建新的線程。
這種現像比較少見,也比較奇怪,主要是和jvm與系統內存的比例有關。
這種怪事是因為JVM已經被系統分配了大量的內存(比如1.5G),並且它至少要佔用可用內存的一半。有人發現,在線程個數很多的情況下,你分配給JVM的內存越多,那麼,上述錯誤發生的可能性就越大。

產生這種現象的原因如下(從這個blog中了解到原因:http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html):

每一個32位的進程最多可以使用2G的可用內存,因為另外2G被操作系統保留。這裡假設使用1.5G給JVM,那麼還餘下 500M可用內存。這500M內存中的一部分必須用於系統dll的加載,那麼真正剩下的也許只有400M,現在關鍵的地方出現了:當你使用Java創建一 個線程,在JVM的內存裡也會創建一個Thread對象,但是同時也會在操作系統裡創建一個真正的物理線程(參考JVM規範),操作系統會在餘下的400 兆內存裡創建這個物理線程,而不是在JVM的1500M的內存堆裡創建。在jdk1.4裡頭,默認的棧大小是256KB,但是在jdk1.5裡頭,默認的 棧大小為1M每線程,因此,在餘下400M的可用內存裡邊我們最多也只能創建400個可用線程。

這樣結論就出來了,要想創建更多的線程,你必須減少分配給JVM的最大內存。還有一種做法是讓JVM宿主在你的JNI代碼裡邊。

給出一個有關能夠創建線程的最大個數的估算公式:

(MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads

對於jdk1.5而言,假設操作系統保留120M內存:
1.5GB JVM: (2GB-1.5Gb-120MB)/(1MB) = ~380 threads
1.0GB JVM: (2GB-1.0Gb-120MB)/(1MB) = ~880 threads
在2000/XP/2003的boot.ini裡頭有一個啟動選項,好像是:/PAE /3G ,可以讓用戶進程最大內存擴充至3G,這時操作系統只能佔用最多1G的虛存。那樣應該可以讓JVM創建更多的線程。
因此這種情況需要結合操作系統進行相關調整。

因此:我們需要結合不同情況對tomcat內存分配進行不同的診斷才能從根本上解決問題。

source:
http://www.blogjava.net/george/

reference:
http://www.javaeye.com/topic/80620?page=1
http://ggmm.blog.sohu.com/117545379.html
http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html
http://www.wujianrong.com/archives/2006/12/javalangoutofmemoryerror_permg.html

2009年8月13日 星期四

Java讀取Properties文件

使用J2SE API讀取Properties文件的六種方法

1.使用java.util.Properties類的load()方法
示例: InputStream in = lnew BufferedInputStream(new FileInputStream(name));
Properties p = new Properties();
p.load(in);

2.使用java.util.ResourceBundle類的getBundle()方法
示例: ResourceBundle rb = ResourceBundle.getBundle(name, Locale.getDefault());

3.使用java.util.PropertyResourceBundle類的構造函數
示例: InputStream in = new BufferedInputStream(new FileInputStream(name));
ResourceBundle rb = new PropertyResourceBundle(in);

4.使用class變量的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getResourceAsStream(name);
Properties p = new Properties();
p.load(in);

5.使用class.getClassLoader()所得到的java.lang.ClassLoader的getResourceAsStream()方法
示例: InputStream in = JProperties.class.getClassLoader().getResourceAsStream(name);
Properties p = new Properties();
p.load(in);

6.使用java.lang.ClassLoader類的getSystemResourceAsStream()靜態方法
示例: InputStream in = ClassLoader.getSystemResourceAsStream(name);
Properties p = new Properties();
p.load(in);

補充
Servlet中可以使用javax.servlet.ServletContext的getResourceAsStream()方法
示例:InputStream in = context.getResourceAsStream(path);
Properties p = new Properties();
p.load(in);

2009年7月19日 星期日

JTable Sorter

jdk 6.x required.

http://www.diybl.com/course/3_program/java/javashl/2008510/115089.html

2009年7月16日 星期四

JTable, RowSorter, SelectionModel

JTable 行排序以及排序后如何把视图(view)上的选中行对应到模型(Model)上的行

前提条件: Sun JDK 1.6 及以上版本

排序的简单实现
--------------
最简单的实现办法如下代码示意:
jtable.setRowSorter( new TableRowSorter(model) )

参数 model 代表 TableModel 的实现类.

以上代码仅示意,你可以扩展抽象类 javax.swing.RowSorter 来实现定制.



选中的行 index 和模型上的 index
--------------------------------
自 jdk 1.6 , JTable 新增了方法 public int convertRowIndexToModel(int viewRowIndex)
至此,就获得了行索引在视图与模型间的对应关系.以下列出关键代码

jtable.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
int i= jtable.getSelectedRow();

if (i >= 0) {
int R = jtable.convertRowIndexToModel(i);
StudentTableModel model = (StudentTableModel)jtable.getModel();
Student s= model.getRowAt(R);
textArea.setText(String.format("index to model = %d\tindex to view = %d\tobject = %s", R, i, s==null?"?" : s.toString()));
}
}
});

后文贴出完整源代码.源代码总共3个文件: Student.java; StudentTableModel.java; SortableTable.java
SortableTable.java 是启动类

Student.java
----------------
import java.util.*;
/**
* @author Hardneedl
*/
class Student {
private String name;
private String id;
private java.util.Date birthday;

Student(String id, String name, Date d) {
this.setId(id);
this.setName(name);
this.setBirthday(d);
}
Student() {}
public String getName() {return name;}
public void setName(String name) {this.name = name;}

public String getId() {return id;}
public void setId(String id) {this.id = id;}

public java.util.Date getBirthday() {return birthday;}
public void setBirthday(java.util.Date birthday) {this.birthday = birthday;}

public boolean equals(Object obj) {
if (obj instanceof Student) {
Student st = (Student)obj;
String i = st.getId();
return i!=null && i.equals(getId());
}
return false;
}

public String toString() {return getName();}
}


StudentTableModel.java


import javax.swing.table.*;
import java.util.*;
/**
* @author Hardneedl
*/
class StudentTableModel extends AbstractTableModel {
private java.util.List studentList = new java.util.ArrayList(0);

StudentTableModel() {}
StudentTableModel(List studentList) {
this();
this.studentList.clear();
if (studentList != null) this.studentList.addAll(studentList);
}

void setDatas(java.util.Liststudents){
studentList.clear();
if (students!=null) studentList.addAll(students);
}

void addStudent(Student s){
if(s!=null) {
studentList.add(s);
fireTableDataChanged();
}
}
void removeStudent(Student s){
if (s!=null) {
studentList.remove(s);
fireTableDataChanged();
}
}

public int getRowCount() {return studentList.size();}
public int getColumnCount() {return 3;}
public Object getValueAt(int r, int c) {
Student st = studentList.get(r);
switch(c){
case 0:return st.getId();
case 1:return st.getName();
case 2:return st.getBirthday();
default:return null;
}
}

public String getColumnName(int column) {
switch(column){
case 0:return "ID";
case 1:return "Name";
case 2:return "Birthday";
default:return "???";
}
}

public void setValueAt(Object value, int rowIndex, int columnIndex) {
Student st = studentList.get(rowIndex);
if (st == null) return;
switch(columnIndex) {
case 0:
st.setId(value.toString());
break;

case 1:
st.setName(value.toString());
break;

case 2:
if (value instanceof Date)
st.setBirthday((Date)value);
break;

}
}
public boolean isCellEditable(int rowIndex, int columnIndex) {return true;}
Student getRowAt(int r){return studentList.get(r);}
}


SortableTable.java

import javax.swing.*;
import javax.swing.event.*;
import javax.swing.table.*;
import java.awt.*;
import java.util.*;
import java.text.*;
/**
* @author Hardneedl
*/
class SortableTable extends JFrame {
private static final Dimension minSize = new Dimension(300, 200);
private static final Dimension maxSize = new Dimension(1024, 768);
private static final Dimension preferredSize = new Dimension(600, 400);

private JTable jtable;
private JTextArea textArea;
public Dimension getMaximumSize() {return maxSize;}
public Dimension getMinimumSize() {return minSize;}
public Dimension getPreferredSize() {return preferredSize;}
public String getTitle() {return "JTable Sort Demo";}

SortableTable() throws HeadlessException {init();doLay();attachListeners();}

private void init() {
StudentTableModel model=new StudentTableModel();
model.addStudent(new Student("1", "Martin", new Date(Calendar.getInstance().getTimeInMillis())));
model.addStudent(new Student("2", "Rose", new Date(Calendar.getInstance().getTimeInMillis())));
model.addStudent(new Student("3", "Daisy", new Date(Calendar.getInstance().getTimeInMillis())));
model.addStudent(new Student("4", "Tom", new Date(Calendar.getInstance().getTimeInMillis())));
model.addStudent(new Student("5", "Needl", new Date(Calendar.getInstance().getTimeInMillis())));

jtable = new JTable(model);
jtable.setRowSorter( new TableRowSorter(model) );
jtable.getColumnModel().getColumn(2).setCellRenderer(new DefaultTableCellRenderer(){
private SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
Component cmp = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
setText(dateFormat.format(value));
setHorizontalAlignment(SwingConstants.RIGHT);
return cmp;
}
});


jtable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

textArea = new JTextArea(){
public Color getBackground() {return Color.ORANGE;}
public Color getForeground() {return Color.BLUE;}
public boolean isEditable() {return false;}
};
}

private void doLay() {
Container container = getContentPane();
container.add(new JScrollPane(jtable), BorderLayout.CENTER);
container.add(textArea, BorderLayout.SOUTH);
pack();
}

private void attachListeners() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jtable.getSelectionModel().addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e) {
int i= jtable.getSelectedRow();

if (i >= 0) {
int R = jtable.convertRowIndexToModel(i);
StudentTableModel model = (StudentTableModel)jtable.getModel();
Student s= model.getRowAt(R);
textArea.setText(String.format("index to model = %d\tindex to view = %d\tobject = %s", R, i, s==null?"?" : s.toString()));
}
}
});
}

public static void main(String[] args) {new SortableTable().setVisible(true);}
}



source: http://hi.baidu.com/hardneedl/blog/

2009年7月15日 星期三

Apache + Tomcat整合

實踐apache和tomcat的整合,原來這麼簡單.

1:安裝tomcat,jdk,這些就不說了,這個大家應該都會

2:下載apache_2.2.11-win32-x86-no_ssl.msi,這在apache網站上就有,

3:下載mod_jk-1.2.28-httpd-2.2.3.so,這個是apache和tomcat整合必須的,在apache網站上也有,

4:安裝好apache http server後,進入到apache的安裝目錄下, Apache2.2\conf ,在此新建一個workers.properties文件,將以下內容copy到workers.properties文件中
# Defining a worker named worker1 and of type ajp13
worker.list=ajp13w
worker.ajp13w.type=ajp13
worker.ajp13w.host=127.0.0.1
worker.ajp13w.port=8009
worker.ajp13w.lbfactor=1

5: copy mod_jk-1.2.28-httpd-2.2.3.so文件到Apache2.2\modules目錄下,並且改名為mod_jk.so(為了方便)

6:配置Apache2.2\conf目錄下httpd.conf文件,增加以下內容:
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties
JkLogFile logs/mod_jk.log
JkMount /*.jsp ajp13w
JkMount /*.jspx ajp13w
JkMount /servlet/* ajp13w
JkMount /*.servlet ajp13w
JkMount /* ajp13w
上面都配置好之後,啟動tomcat ,啟動apache,輸入http://localhost ,看到tomcat的首頁就ok了

source: 夢源著http://www.blogjava.net/mengyuan760

2009年7月7日 星期二

iReport 3.5.2 org.xml.sax.SAXParseException

the report jrxml file edit using iReport 3.5.2

try to run my report unit from there I get an error:

com.jaspersoft.jasperserver.api.JSExceptionWrapper: org.xml.sax.SAXParseException: cvc-complex-type.3.2.2: Attribute 'splitType' is not allowed to appear in element 'band'.



Just configure compatibility with JasperReports 3.5.0 like this:

Tools/Options/General/Compatibility Select the JR version you use on your JS...

2009年6月30日 星期二

2009 新書介紹: Network Infrastructure Security


Springer, 1 edition (May 20, 2009)

Research on Internet security over the past few decades has focused mainly on information assurance, issues of data confidentiality and integrity as explored through cryptograph algorithms, digital signature, authentication code, etc. Unlike other books on network information security, Network Infrastructure Security by Angus Wong and Alan Yeung addresses the emerging concern with better detecting and preventing routers and other network devices from being attacked or compromised.

Attacks to network infrastructure affect large portions of the Internet at a time and create large amounts of service disruption, due to breaches such as IP spoofing, routing table poisoning and routing loops. Daily operations around the world highly depend on the availability and reliability of the Internet, which makes the security of this infrastructure a top priority issue in the field.

Network Infrastructure Security is a book that bridges the gap between the study of the traffic flow of networks and the study of the actual network configuration. This book makes effective use of examples and figures to illustrate network infrastructure attacks from a theoretical point of view. The book includes conceptual examples that show how network attacks can be run, along with appropriate countermeasures and solutions.

2009年6月29日 星期一

JS instanceof判斷類型問題

判斷變量類型:一般情況下,可以先用typeof運算符,如果結果是"object",再用instanceof來判斷;
特別的地方是:
instanceof不認為原始類型值的變量是對象,

1. var temp="a string for test";
2. //下面這句返回"string"
3. alert( typeof temp);
4. //下面這句返回"false"
5. alert(temp instanceof String);
6.
7. //看看Ext內部實現,判斷String類型
8. if( typeof temp== "string"){
9. }

其他附加問題:

* null:表示尚未存在的對象,注意,儘管尚未存在,也是個對像啊,所以用typeof檢測一個null值變量的結果是Object;不過,為了便於寫 if語句,在js中,"undefined==false ", "null=false",因此,"undefined==null"。
*整數:最容易犯的錯誤就是,忘了070其實是個八進制數,相當於十進制的56;
*浮點數:“在進行運算之前,真正存儲的是字符串”——這應該是解釋執行的本質決定的吧——直接後果是,alert(0.8)這樣的語句可以正確輸出,而alert(2 *0.8)的輸出就成了"2.40000000000000003"
*數字邊界:數字有幾個邊界值,分別是Number.MAX_VALUE(最大值), Number.MIN_VALUE(最小值), Number.POSITIVE_INFINITY(正無窮), Number.NEGATIVE_INFINITY(負無窮), Infinity(無窮大,- Infinity,這個有點莫名其妙,不知道為啥又搞出一套);特別地,還有一個isFinit(iNumber)函數來判斷數字是否為無窮大。
* NaN:一些需要數字作為參數的函數,當傳入的實參無法轉換為數字時,往往會返回這個值;關於NaN,最重要的就是要記住NaN!=NaN,因此判斷一個變量是否為NaN,一定要使用isNaN(var)函數。
*將字符串轉換為數字:sVar.parseInt()是最常用的函數,也最容易出錯,為了保險起見,最好每次調用的時候,都加上“進制”的參數,比 如:a .parseInt(10),就制定了按十進制轉換字符串a;Number(sVar)也是一種轉換方式,不同的是,它要求整個字符串都得是有效數字,因 此Number("4.5.5")將返回NaN;

source: http://www.blogjava.net/oathleo

2009年6月28日 星期日

Oracle - 如何在 SELECT statement 中,實作 IF-THEN-ELSE 邏輯 ?

How does one implement IF-THEN-ELSE logic in a SELECT statement?

Submitted by admin on Sat, 2005-11-12 06:38

Oracle SQL supports several methods of coding conditional IF-THEN-ELSE logic in SQL statements. Here are some:
CASE Expressions

From Oracle 8i one can use CASE statements in SQL. Look at this example:

SELECT ename, CASE WHEN sal = 1000 THEN 'Minimum wage'
WHEN sal > 1000 THEN 'Over paid'
ELSE 'Under paid'
END AS "Salary Status"
FROM emp;
DECODE() Function

The Oracle decode function acts like a procedural statement inside an
SQL statement to return different values or columns based on the values of
other columns in the select statement. Examples:

select decode(sex, 'M', 'Male', 'F', 'Female', 'Unknown')
from employees;

select a, b, decode( abs(a-b), a-b, 'a > b',
0, 'a = b',
'a < b') from tableX;

Note: The decode function is not ANSI SQL and is rarely implemented
in other RDBMS offerings. It is one of the good things about Oracle,
but use it sparingly if portability is required.


GREATEST() and LEAST() Functions

select decode( GREATEST(A,B), A, 'A is greater OR EQUAL than B',
'B is greater than A')...



select decode( GREATEST(A,B),
A, decode(A, B, 'A NOT GREATER THAN B', 'A GREATER THAN B'),
'A NOT GREATER THAN B')...

NVL() and NVL2() Functions

NVL and NVL2 can be used to test for NULL values.

NVL(a,b) == if 'a' is null then return 'b'.

SELECT nvl(ename, 'No Name')
FROM emp;

NVL2(a,b,c) == if 'a' is not null then return 'b' else return 'c'.

SELECT nvl2(ename, 'Do have a name', 'No Name')
FROM emp;

COALESCE() Function

COALESCE() returns the first expression that is not null. Example:

SELECT 'Dear '||COALESCE(preferred_name, first_name, 'Sir or Madam')
FROM emp2;

NULLIF() Function

NULLIF() returns a NULL value if both parameters are equal in value. The following query would return NULL:

SELECT NULLIF(ename, ename)
FROM emp;

source: http://robertvmp.pixnet.net/blog/post/24147936

2009年6月23日 星期二

Startup Oracle listener

[root@localhost ~]# su - oracle
[oracle@localhost ~]$ cd
[oracle@localhost ~]$ source .bash_profile
\[oracle@localhost ~]$ lsnrctl start

LSNRCTL for Linux: Version 10.2.0.1.0 - Production on 24-JUN-2009 10:58:29

Copyright (c) 1991, 2005, Oracle. All rights reserved.

Starting /u01/app/oracle/product/10.2.0/db_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 10.2.0.1.0 - Production
System parameter file is /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Log messages written to /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 10.2.0.1.0 - Production
Start Date 24-JUN-2009 10:58:31
Uptime 0 days 0 hr. 0 min. 0 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/product/10.2.0/db_1/network/log/listener.log
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost.localdomain)(PORT=1521)))
Services Summary...
Service "PLSExtProc" has 1 instance(s).
Instance "PLSExtProc", status UNKNOWN, has 1 handler(s) for this service...
The command completed successfully
[oracle@localhost ~]$ sqlplus sys/oracle as sysdba

SQL*Plus: Release 10.2.0.1.0 - Production on Wed Jun 24 10:58:45 2009

Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to an idle instance.

SQL> startup
ORACLE instance started.

Total System Global Area 285212672 bytes
Fixed Size 1218992 bytes
Variable Size 100664912 bytes
Database Buffers 180355072 bytes
Redo Buffers 2973696 bytes

2009年6月17日 星期三

簡單獲取google天氣報告

簡單獲取google天氣報告

http://www.google.com/ig/api?hl=zh_tw&weather=hk



























































1 package com.pmjava.util;
2
3 import java.io.BufferedReader;
4 import java.io.BufferedWriter;
5 import java.io.FileWriter;
6 import java.io.IOException;
7 import java.io.InputStream;
8 import java.io.InputStreamReader;
9 import java.net.MalformedURLException;
10 import java.net.URL;
11
12
13 import java.io.*;
14 import org.w3c.dom.*;
15 import javax.xml.parsers.*;
16
17 public class GetWeather {
18
19
20 public String getweather(String city)
21 {
22 try {
23 URL ur = new URL("http://www.google.com/ig/api?hl=zh_cn&weather="+city);
24 InputStream instr = ur.openStream();
25 String s, str;
26 BufferedReader in = new BufferedReader(new InputStreamReader(instr));
27 StringBuffer sb = new StringBuffer();
28
29 Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("weather.txt"), "utf-8"));
30 while ((s = in.readLine()) != null) {
31 sb.append(s);
32 }
33 str = new String(sb);
34 out.write(str);
35 out.close();
36 in.close();
37
38
39 } catch (MalformedURLException e) {
40 e.printStackTrace();
41 } catch (IOException e) {
42 e.printStackTrace();
43 }
44 File f=new File("cityweather.txt");
45 DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
46 String str=null;
47 try{
48 DocumentBuilder builder=factory.newDocumentBuilder();
49 Document doc = builder.parse(f);
50 NodeList nl = (NodeList) doc.getElementsByTagName("forecast_conditions");
51 NodeList n2=nl.item(0).getChildNodes();
52
53 str=n2.item(4).getAttributes().item(0).getNodeValue()+","+n2.item(1).getAttributes().item(0).getNodeValue()+"℃-"+n2.item(2).getAttributes().item(0).getNodeValue()+"";
54 }catch(Exception e)
55 {
56
57 }
58
59 return str;
60 }
61
62
63
64 }

2009年5月23日 星期六

JQuery 年度調查

在眾多 AJAX Framework 中,jQuery 只能算是後起之秀,但近來卻一路竄紅,成為許多網站開發人員注目的焦點。

jQuery 的發展
jQuery 的簡潔吸引了許多開發者,這可以從 Ajaxian.com 的年度調查中看出來。

2006 年 jQuery 問市首年的排名是第六名.


2007 年已升到第三名

2007 年已升到第三名



在 2008 年 3 月的一份問卷調查中,jQuery 已躍升到首位。
在 2008 年 3 月的一份問卷調查中,jQuery 已躍升到首位。

2009年5月20日 星期三

Screen Capture in Java

通過java.awt.Robot的createScreenCapture截屏.

public static void captureScreen(String fileName) throws Exception {

Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
Rectangle screenRectangle = new Rectangle(screenSize);
Robot robot = new Robot();
BufferedImage image = robot.createScreenCapture(screenRectangle);
ImageIO.write(image, "png", new File(fileName));
}

2009年5月18日 星期一

java/oracle日期處理

public class Test{
public static void main (String args []){
java.util.Date a = new java.util.Date();
System.out.println(a);
java.sql.Date b = new java.sql.Date(a.getTime());
System.out.println(b);
java.sql.Time c = new java.sql.Time(a.getTime());
System.out.println(c);
java.sql.Timestamp d=new java.sql.Timestamp(a.getTime());
System.out.println(d);
}
}

Mon Apr 03 18:00:34 CST 2006
2006-04-03
18:00:34
2006-04-03 18:00:34.388

1. oracle默認的系統時間就是sysdate函數,儲存的數據形如25-3-200510:55:33
2. java中取時間的對像是java.util.Date。
3. oracle中對應的時間對像是java.util.Date,java.sql.Time,java.sql.Timestamp、它們都是是java.util.Date的子類。
4. oracle中與date操作關係最大的就是兩個轉換函數:to_date(),to_char()。 to_date()一般用於寫入日期到數據庫時用到的函數。 to_char()一般用於從數據庫讀入日期時用到的函數。

DATE、TIME和TIMESTAMP:
SQL定義了三種與時間有關的數據類型:DATE由日、月和年組成。 TIME由小時、分鐘和秒組成。 TIMESTAMP將DATE和TIME結合起來,並添加了納秒域。
標準Java類java.util.Date可提供日期和時間信息。但由於該類包含DATE和TIME信息而沒有TIMESTAMP所需的納秒,因此並不與上述三種SQL類型完全相配。
因此我們定義了java.util.Date的三種子類。它們是:
1.有關SQL DATE信息的java.sql.Date
2.有關SQL TIME信息的java.sql.Time
3.有關SQL TIMESTAMP信息的java.sql.Timestamp
對於java.sql.Time,java.util.Time基本類的小時、分鐘、秒和毫秒域被設置為零。對於 java.sql.Date,java.util.Date基本類的年、月和日域被分別設置為1970年1月1日。這是在Java新紀元中的“零”日期。 java.sql.date中的日期可以和標準的SQL語句中含有日期的字段進行比較.java.sql.Timestamp類通過添加納秒域來擴展 java.util.Date。

oracle中兩個轉換函數:
1. to_date()作用將字符類型按一定格式轉化為日期類型:
具體用法:to_date(''2004-11-27'',''yyyy-mm-dd''),前者為字符串,後者為轉換日期格式,注意,前後兩者 要以一對應。如;to_date(''2004-11-27 13:34:43'', ''yyyy-mm-dd hh24:mi:ss'')將得到具體的時間。
2. to_char():將日期轉按一定格式換成字符類型:
具體用法:to_char(sysdate,''yyyy-mm-dd hh24:mi:ss'')

to_date()與24小時製表示法及mm分鐘的顯示:
在使用Oracle的to_date函數來做日期轉換時,很多Java程序員也許會直接的採用“yyyy-MM-dd HH:mm:ss”的格式作為格式進行轉換,但是在Oracle中會引起錯誤:“ORA 01810格式代碼出現兩次”。
如:select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mm:ss') from dual;
原因是SQL中不區分大小寫,MM和mm被認為是相同的格式代碼,所以Oracle的SQL採用了mi代替分鐘。 oracle默認的系統時間就是sysdate函數,儲存的數據形如2005-3-2510:55:33,java中取時間的對像是 java.util.Date。
select to_date('2005-01-01 13:14:20','yyyy-MM-dd HH24:mi:ss') from dual

在java對oracle的操作中,對日期字段操作的例子:
表book中有name varchar2(20)//書籍名稱,buydate Date //購買日期兩個字段。
已經創建了數據庫連接Connection conn;

方法一、使用java.sql.Date實現比較簡單的yyyy-mm-dd格式日期。 java.sql.Date不支持時間格式。切記不要使用new java.sql.Date(int year,int month,int date),因為還要處理時間差問題。
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
java.sql.Date buydate=java.sql.Date.valueOf("2005-06-08");
pstmt.setString(1, "Java編程思想");
pstmt.setDate(2,buydate );
pstmt.execute();
方法二、使用java.sql.Timestamp,同上不使用new Timestamp(....)
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,?)");
java.sql.Timestamp buydate=java.sql.Timestamp.valueOf("2004-06-08 05:33:99");
pstmt.setString(1, "Java編程思想");
pstmt.setTimestamp(2,buydate );
pstmt.execute();
方法三、使用oracle的to_date內置函數
PreparedStatement pstmt = conn.prepareStatement("insert into book (name,buydate) values (?,to_date(?, 'yyyy-mm-dd hh24:mi:ss')");
String buydate="2004-06-08 05:33:99";
pstmt.setString(1, "Java編程思想");
pstmt.setString(2,buydate );
pstmt.execute();
附:oracle日期格式參數含義說明
d:一周中的星期幾
day:天的名字,使用空格填充到9個字符
dd:月中的第幾天
ddd:年中的第幾天
dy:天的簡寫名
iw: ISO標準的年中的第幾週
iyyy:ISO標準的四位年份
yyyy:四位年份
yyy,yy,y:年份的最後三位,兩位,一位
hh:小時,按12小時計
hh24:小時,按24小時計
mi:分
ss:秒
mm:月
mon:月份的簡寫
month:月份的全名
w:該月的第幾個星期
ww:年中的第幾個星期

source: http://blog.csdn.net/senmon2004/archive/2006/04/07/653936.aspx

2009年4月27日 星期一

解決Eclipse中Java工程間循環引用而報錯的問題

如果我們的項目包含多個工程(project),而它們之間又是循環引用的關係,那麼Eclipse在編譯時會拋出如下一個錯誤信息:
A cycle was detected in the build path of project: XXX

解決方法非常簡單:

Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Building -> Building path problems -> Circular dependencies ->將Error改成Warning

The Solution of the Problem That the Java Proejcts Have the Cycle References in Eclipse
If our project contains multiple proejcts, and the cycle references among them, Eclipse will throw out following error message while compiling:
"A cycle was detected in the build path of project: XXX"
The solution is quite simple:
Eclipse Menu -> Window -> Preferences... -> Java -> Compiler -> Building -> Building path problems -> Circular dependencies -> Change it from "Error" to "Warning".

source: http://yichen914.spaces.live.com/blog/cns!723590D920FAF62B!534.entry

2009年4月17日 星期五

一個經典的hibernate錯誤:a different object with the same identifier...

hibernate3.x上使用merge()來合併兩個session中的同一對象
a different object with the same identifier value was already associated with the session

一個經典的hibernate錯誤:a different object with the same identifier value was already associated with the session xxxx

hibernate3.x上使用merge()來合併兩個session中的同一對象,具體的Code就是

public Object getDomain(Object obj) {
getHibernateTemplate().refresh(obj);
return obj;
}
public void deleteDomain(Object obj) {
obj = getHibernateTemplate().merge(obj);
getHibernateTemplate().delete(obj);
}

或是
record = HibernateUtil.getCurrentSession().merge(record);
session.beginTransaction();
session.saveOrUpdate(record);
session.getTransaction().commit();



==========================

今天出现一点小问题,使用内存中的游离状态实体,因为它没有和 当前的session 相关,所以在进行维护该实体操作的时候,出现了

a different object with the same identifier value was already associated with the session 异常,

原因 用到数据库中持久的实体A时候,用它的标识直接在内存中生成,没有从session中取得,这样当维护这个实体相关信息的时候,session会发现,游离的实体和与session保存是查找到的相关的实体虽然标识一样,但是状态 不一样的冲突,从而不能完成事务,

而有同事介绍使用merge,后来查阅文档发现,使用merge的 时候,会发生一些隐形的问题:如果merge从新把游离的实体和session建立关联的时候,当这个游离的实体真的不存在,merge会创建一个非法的 实体,所以最好的办法应该是先从 当前的session中查询出实体,然后对这个相关的实体进行维护,就ok了。

Hibernate的用户曾要求一个既可自动分配新持久化标识(identifier)保存瞬时(transient)对象,又可更新/重新关联脱管(detached)实例的通用方法。 saveOrUpdate()方法实现了这个功能。

// in the first session
Cat cat = (Cat) firstSession.load(Cat.class, catID);
// in a higher tier of the application
Cat mate = new Cat();
cat.setMate(mate);
// later, in a new session
secondSession.saveOrUpdate(cat); // update existing state (cat has a non-null id)
secondSession.saveOrUpdate(mate); // save the new instance (mate has a null id)

saveOrUpdate()用途和语义可能会使新用户感到迷惑。 首先,只要你没有尝试在某个session中使用来自另一session的实例,你应该就不需要使用update()saveOrUpdate(),或merge()。有些程序从来不用这些方法。

通常下面的场景会使用update()saveOrUpdate()

  • 程序在第一个session中加载对象

  • 该对象被传递到表现层

  • 对象发生了一些改动

  • 该对象被返回到业务逻辑层

  • 程序调用第二个session的update()方法持久这些改动

saveOrUpdate()做下面的事:

  • 如果对象已经在本session中持久化了,不做任何事

  • 如果另一个与本session关联的对象拥有相同的持久化标识(identifier),抛出一个异常

  • 如果对象没有持久化标识(identifier)属性,对其调用save()

  • 如果对象的持久标识(identifier)表明其是一个新实例化的对象,对其调用save()

  • 如果对象是附带版本信息的(通过) 并且版本属性的值表明其是一个新实例化的对象,save()它。

  • 否则update() 这个对象

merge()可非常不同:

  • 如果session中存在相同持久化标识(identifier)的实例,用用户给出的对象的状态覆盖旧有的持久实例

  • 如果session没有相应的持久实例,则尝试从数据库中加载,或创建新的持久化实例 (可能创建垃圾数据)

  • 最后返回该持久实例

  • 用户给出的这个对象没有被关联到session上,它依旧是脱管的



ref: http://ideas.javaeye.com/blog/371103