Deadlock!

private boolean insertRecordOnMultipleTables() {
      Connection conn = getConnection();
      conn.setAutoCommit(false);
      PreparedStatement ps = conn.prepareStatement("insert into person values ('Ada', 36)");
      ps.executeUpdate();
      int totalRecords = selectRecord();
      conn.commit();
      conn.setAutoCommit(true);
      ps.close();
      conn.close();
      return totalRecords > 0;
}

private int selectRecord() {
      int result = 0;
      Connection conn = getConnection();
      PreparedStatement ps = conn.prepareStatement("select count(1) from person");
      ResultSet rs = ps.executeQuery();
      if (rs.next()) {
            result = rs.getInt(1);
      }
      rs.close();
      ps.close();
      conn.close();
      return result;
}

See where the problem is?

浮點運算(IEEE 754)

今天又碰到這個問題(是人家的錯),寫下來跟大家分享一下。

double d1 = 0.6L;
String s1 = “0.6”;
BigDecimal bd1 = new BigDecimal(d1);
BigDecimal bd2 = new BigDecimal(s1);
System.out.println(bd1);
System.out.println(bd2);

其實基本上不只 Java,使用浮點運算的平台都會有這個問題。主因是二進位數字系統並不能完全表示十進位數字(大約值等於 0.5999…. 吧),要精準度高就不能用 double 而使用其他特別類別或函式庫,如 BigDecimal(如以上程式碼所示)或 GMP (C/C++)。

但以上的程式碼一早就轉成了 double,所以結果一樣會未如預期。

聖誕快樂

先祝各位聖誕快樂!

應節應該唱聖誕歌,我也來登一首家傳戶曉的好了。
本來打算貼一篇 shell script 版,想不起來唯有即席另寫 Java 版本吧。

/*
*Santa Claus is Coming to Town
*/
import org.santaclaus.*;

class SantaClausIsComingToTown {

public static void main(String args[]) {
this.watch(System.out);
this.setCry(false);
this.setPout(false);
System.out.println(why);
SantaClaus.go(town);

List list = new ArrayList();
for (int i=0; i<2; i++) SantaClaus.check(list);
SantaClaus.setNaughtyList(Collections.binarySearch(list, “naughty”));
SantaClaus.setNiceList(Collections.binarySearch(list, “nice”));
SantaClaus.go(town);

while(this.sleep()) SantaClaus.see(this);
while(this.awake()) SantaClaus.know(this);
if (this.isBad() || this.isGood()) SantaClaus.know(this);
for ( ; goodnessSake(); ) this.setGood(true);

this.watch(System.out);
this.setCry(false);
this.setPout(false);
System.out.println(why);
SantaClaus.go(town);
}
}

終於做好了

終於在今天早上把臭蟲除掉,把 FYP弄得有個樣子。我是個愛臨抱佛腳的人,總喜歡把工作堆到最後關頭才做,這兩晚也沒有好好睡過(今天整個人便垮在案頭前)。自作孽啊!

其實真的要多謝 Spring Framework,要不然給我多幾個晚上也趕不上 。Spring IoC 構思真的很奇妙,只要把 XML 設定好便不用理會啟動時不同元件初始化的先後次序,跟 Hibernate 合起來用非常方便。Spring 對諸多 J2EE 的功能也充份支援,諸如一個完整的 MVC 框架,JNDI 設定甚至電子郵件也有相應的類別提供。相比以前接觸過的 Framework,Spring 算是上手速度最快(是 SimpleFormController 初期有點困難,慶幸互聯網相關資料很豐富),出錯最少兼除錯比較簡易的框架啦。可惜啦,因為時間關係,沒有好好學過 AoP,不然寫起的程式碼可能會更少。

今天晚上要好好的睡個覺!

PHP 7 決定全面使用 Java 語法

據一份內部流出的會議紀錄顯示,開發群決定多次借用 Java 語法的 PHP 腳本語言將在版本 7 完全放棄繼承自 C 以及 Perl 的語法,完全擁抱 Java。而 J2EE 的 Servlet/JSP 架構將會完全引入 PHP 裏。

也因為如此,PHP 再不會以 $ 來識別變數,而物件存取運算子亦會以 . 代替。傳言指出在 PHP 6 引入的 namespace 名稱亦會改變成 package,而不同 package 的 PHP 腳本也必須放到不同目錄以資識別。

可是,由於改寫整個 PHP 核心是一件繁複的工程,他們預料 PHP 7 將會延期推出。但是這樣應該也是值得,因為重寫整個核心和使用新的語法將會有助解決困擾 PHP 開發者的安全問題。

此外,據該流出文件指出,某部份核心可能將會以 Java 語言編寫,不過他們得先解決 Java 執行效能的問題。

Update: 所以說,愚人節快樂!

期待名單

PC Game:

  1. Half-Life 2 Episode 2 (01/2007)
    其實最重要還是附帶的 Team Fortress 2 吧… 我一直一直在等…在試影片看見遺忘已久的 2fort5 版圖啊(有沒有人玩過 QW?).. 現在成了 2farm =_=
  2. Battlefield 2142 (10/2006)
    漂亮死人的畫面!一向喜歡這個「多人線上作戰」系列,一直覺得操控及遊戲性不錯,新一版不能不捧場吧?
  3. Supreme Commander(TBA 2007)
    RTS 咯。畫面細緻,而且武器種類多樣化(核彈頭真的把整個畫面轟掉,絕不如 C&C 系列那種小兒科),所以也是期待名單呢。
  4. 星塵回憶錄 3.0 Mod 以及 SEED mod for Homeworld 2
    3.0 裏有 GP-03操控,自護加送 AMX-002!SEED 看見 Freedom 四砲齊射就很吸引了(可惜光線顏色不能改)。內地朋友真的厲害哩…

Technology/Programming:

  1. Java 6 (12/2006)
    有可以讀入其他 scripting language 例如PHP,JavaScript,以及Python 等等的模組,還可以在程式碼直接叫編譯器!想必是反擊 .NET 平台吧!
  2. PHP 6 (TBA)
    Namespace!Type Hinting!這兩個就夠了…

Anime:

  1. 涼宮春日的憂鬱 – 第二季 (TBA)
    連會不會有也不知道喔… 不過很大機會吧。
  2. SEED 3 (TBA),SEED Stargazer(09/2006)
    SEED 3 嘛… 為看而看而已(我也不知道那究竟是劇場版還是甚麼的)… Stargazer 挺好看的,原來沒福田會有這種可能性!

話說回來,怎麼這篇那麼多感歎號呢?果然是秋天到了…

SSL Tunnel implementation on Java(3)

最後的步驟其實簡單得很。我們客戶端有了 ServerSocket 和一個對外的SSL Socket 連線,伺服器端當然要一個 SSL 的 ServerSocket 和 普通對內 Socket 連線。SSL 的 Socket 我們可以以自行撰寫的 SocketFactory 產生(第一章的 MySocketFactory class),那麼 ServerSocket 呢?
程式碼:(摘自 JavaWorld) Continue reading