2009年8月17日 星期一

在JBuilder 2008下設定args[]內之值的步驟

第一次用JBuilder 2008設定args[]內的數值,呼~花了好一段時間 囧,感謝Mark的指導阿!廢話不多說~以下為其步驟:

Step 1.
點選"Run" --> "Run Configurations..." (不同版本的JBuilder可能會不同的選項,像Mark的就是"Run" --> "Run Dialog")

Step 2.
在Run Configurations視窗下,選擇左半邊"Java Application樹狀圖"中欲執行的主程式。

Step 3.
選定好主程式後,選擇右半邊的"Arguments頁籤",就可以在"Program arguments"中輸入欲設定的值!(每個元素以空白做為間格~)

End~

2009年7月4日 星期六

Google Blogger Counter

若想在Google Blogger中加入Counter,可以參考此位網友的網誌,裡面有詳細的講解喔! 網誌連結:
http://www.wretch.cc/blog/joshua7532/8428219 ,另外申請Counter的網站在此: http://www.histats.com/

p.s. Google Blogger是有支援Jave srcipt的喔^^,呼呼~好久沒有寫網誌嚕(在報效國家咩!剩一個月就退伍嚕~YA)

2008年8月21日 星期四

JAVA --- Statement與PreparedStatement的差別

首先先分別展示Statement與PrepareStatement兩者用法上的差異.
Statement:
...
String strsql = "insert into mytable(Name, Birthday) values("SHAGIN45","1984/06/07")";
Statement mysta = new Statement();
mysta.executeUpdate(strsql);
...

PreparedStatement:
...
String strsql = "insert into mytable(Name, Birthday) values(?,?)";
PreparedStatement mysta = new PrepareStatement();
mysta.setString(1,"SHAGIN45");
mysta.setString(2,"1984/06/07");
mysta.executeUpdate();

從上面兩個例子,可以很明顯的看出兩者使用上的不同,當你所執行sql不需要設定參數時,你就可以使用Statement.反之,若是你需要自行在適當的時機,設定相對應的參數時,則可以使用PrepareStatement (而且PrepareStatement的sql語法使用上閱讀性比較好).

在網路上有許多人在討論PrepareStatement跟Statement兩者間的效能差異,PreparedStatement在Oracle上的表現比Statement來的好(在MySQL上似乎就看不出兩者的性能優劣),並且當要重複執行同一sql多次時,PreparedStatement也會表現的比Statement來的好.但是,由於PreparedStatement的sql是可以自行設定參數型態,因此當sql要被傳至DB執行時,其還需進行編碼轉換,而Statement只需對已經寫死的sql進行字串轉換,所以以單純的查詢動作來說,Statement的表現可能還會比PreparedStatement表現來的好. 總歸一句,除了看你使用PreparedStatement或是Statement會影響DB的存取效能外,你所使用的JDBC Deiver與SQL語法也都會影響,因此遇到需要重複執行sql或是要自訂參數時,我建議使用PreparedStatement;只需要對DB進行簡單的查詢時,我則建議使用Statement!

reference:
http://ivanl.javaeye.com/blog/49129
http://www.javaeye.com/topic/5631

End~

2008年8月12日 星期二

JAVA --- 連接DataBase

我這次使用MySQL來建立我的DB,在設定好DB的table以及其內容後,接下來就是要讓自己的程式與其相連接嚕~.在JDBC連結DB的時候有幾個動作要做:

註冊驅動程式--->建立連線--->產生Statement--->利用Statement執行sql要求--->得到結果.

Step1. 首先就是註冊MySQL的Driver. 你必須先去MySQL的官網下載其驅動程式 http://dev.mysql.com/downloads/connector/j/5.0.html ,下載下來後解壓縮,並且把解壓縮後的資料夾內,一個名為 "mysql-connector-java-[version]-bin.jar" 的檔案複製到C:\Program Files\Java\jre[version]\lib\ext 內 (要注意一下自己的jre版本,java下可能會有不同版本的jre,要把mysql-connector-java-[version]-bin.jar複製到正確的jre內),接著再重新啟動eclipse,其會自動將MySQL的驅動載入.

Step2. 接著就是要在程式上動手腳了.首先要利用Class.forName()來對DriverManager註冊Driver,例如:
String JD = "com.mysql.jdbc.Driver";
Class.forName(JD);
其主要的作用是讓JVM查找指定的class,並且執行class內某段static程式碼,例如:
static {
DriverManager.registerDriver(Driver driver) ;
}
若是找不到指定的資料庫驅動程式類別,則會丟出java.lang.ClassNotFoundException !!

Step3. 產生Connection object. 利用DriverManager.getConnection()來決定你要連結的資料庫,以及要以什麼身分登入,例如:
try{
String DU = "jdbc:mysql://localhost/brick"; //使用jdbc協定,子協定為mysql,資料庫名稱為//localhost/brick
Connection connection = DriverManager.getConnection(DU,"root", "123");
} catch (ClassNotFoundException e){
System.out.println ("系統找不到connection class!");
}catch(SQLException sqlException){
sqlException.printStackTrace();
System.exit(1);
}
若是DriverManager無法連接到資料庫,getConnection()則會丟出java.sql.SQLException!!

Step4. 利用Statement執行SQL語法. 可以用connection.createStatement()來產生statement object,例如:
Statement statement = connection.createStatement();
產生出來後使用statement使用executeUpdate(),executeQuery()等方法來執行sql語法,並且它們會回傳ResultSet object,例如:
String sql = "select * from tbCusinfo";
ResultSet rs = atement.executeQuery(sql);
另外,executeUpdate()主要是用來執行CREATE TABLE、INSERT、DROP TABLE、ALTER TABLE等會改變資料庫內容的sql語法.

Step5. 利用ResultSetMetaData取得ResultSet object中關於欄位 (Field) 的資訊.例如:
ResultSetMetaData metaData = resultSet.getMetaData();
int noofcolumns = metaData.getColumnCount(); //取得欄位個數

上述主要幾個步驟就是JDBC連接DB時幾個主要的步驟,若是後續還有需要對DB取出的data進行使用的話,則可利用metaData.getXXX()的方式做處理.

reference
http://caterpillar.onlyfun.net/Gossip/JavaGossip-V2/StatementResultSet.htm
http://dslab.ee.ncku.edu.tw/~lok/notes/java/jdbc/jdbc.htm

End~

2008年8月10日 星期日

My SQL---Error message 1366

今天試用MySQL來建立資料庫.安裝好後建立了一個測試資料庫,但是要新增資料的時候卻失敗了,顯示Error message-1366,我上網找了一下有沒有解決的辦法,發現原來是default-character-set設定的問題,在安裝好MySQL後,系統會預設使用default-character-set=latin1,所以當你的資料有中文,日文,韓文...等等語言時,它會無法encode~因此以下為解決此錯誤的方法:

Step1. 先停止MySQL的service. (可以去官網下載其所提供的tools,這些tools可以提供GUI對DB進行管理或監測).

Step2. 找出MySQL安裝目錄下的一個檔案,名為"my.ini".

Step3. 開啟此檔,並且在[mysqld]下加入default-character-set=GBK,並把本來的efault-character-set=latin1註解掉.

Step4. 重新啟動MySQL的service,並且把原先的DB刪掉,重新再建立一個DB~這樣就OK拉!!

Referce
MySQL官網下載:
http://dev.mysql.com/downloads/
MySQL GUI Tools 下載:
http://dev.mysql.com/downloads/gui-tools/5.0.html

End~

2008年7月30日 星期三

JAVA Swing---讓Frame顯示於螢幕中央

要讓Frame顯示於螢幕中央有兩種方式:
Case1.
import java.awt.*;

JFrame f = new JFrame();
Dimension dim = Toolkit().getDefaultToolkit().getScreenSize();
f.setLocation(dim.width/2-f.getWidth()/2, dim.height/2-f.getHeight()/2);

Case2.
import java.awt.*;

JFrame f = new JFrame();
f.setLocationRelativeTo(null);

reference: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/Window.html#setLocationRelativeTo%28java.awt.Component%29

2008年6月23日 星期一

NS2---Segment fault

呼...好一陣子沒寫Blog了,這陣子都在忙著跑模擬.之前在跑模擬,會不時的發生Segment fault這種錯誤,後來利用gdb或是valgrind來debug,會發現程式都停在我們沒有動到的地方,例如: getcid, getBasic...等等地方.這時不要慌張!!(但是我們被這種問題困擾了好久 囧),若是利用gdb來debug的人,當程式遇到錯誤停下後,可以下"bt"的指令,來找出是誰呼叫到這個function,使其產生錯誤~~;在從發生錯誤的地方往回追朔後,會發現原來是tcl的timer沒設好!!
多次的segment fault中發現,要是你拓普點多的時候,使用NIST預設的timer對於node來說是不夠用的,我們推測由於timer會倒數,當點變多的時候,某個node的timer倒數結束前BS沒能即時去抓相對應的資料,後來node的timer倒數結束後,BS才去抓資料,可是此時node已經因timer倒數結束exprice,這樣BS當然就抓不到東西產生segment fault嚕!!因此當你的拓普node數量很多的時候,在run NS2時又產生segment fault,且錯誤是發生在你沒修到程式的地方,那就可以考慮在tcl 裡面增加某些timer的數值!!!這樣應該可以解決你segment fault的問題 ^^ (至少我是這樣解決了不少segment fault~我有把t6,t17,t44這幾個數值加大!)

End~