2009年10月18日 星期日

Continuous Integration with Continuum, SVN & Maven2

2009年9月20日 星期日

2009年8月21日 星期五

2009年4月11日 星期六

java.util.logging.Logger 的使用方式

關於 Java 核心與相關 API 的使用, 各位可以參考以下網址
http://java.sun.com/j2se/1.5.0/docs/

另外, 關於 Logger 的部分, 請參考以下
連結,
http://java.sun.com/j2se/1.5.0/docs/guide/logging/overview.html

Logger Sample01: 
public class SimpleLogger01 {
    public static void main(String[] args) {
        // 因為使用了Logger類,所以需要匯入java.util.logging.Logger
        Logger logger = Logger.getLogger(SimpleLogger01.class.getName());"
        // 因為使用了Level類,所以需要匯入java.util.logging.Level
        logger.log(Level.INFO, "this is a info");
    }
}

Logger Sample02: 
public class SimpleLogger02 {
    public static void main(String[] args) {
        Logger parentLog = Logger.getLogger(SimpleLogger02.class.getName());
        parentLog.log(Level.INFO, "this is a info");
        // 設定 parentLog 的 Level 為 WARNING,
        parentLog.setLevel(Level.WARNING);
        // 以 parentLog 為範本 建立新的 childLog, childLog 將會繼承  parentLog 所有特性
        Logger childLog = Logger.getLogger(SimpleLogger02.class.getName());
        // 因為繼承的關係, childLog 的 Level 為 WARNING, 所以INFO記錄不會被發布
        childLog.log(Level.INFO, "this is a child.info");
        childLog.log(Level.WARNING, "this is a child.warning");
    }
}

Logger Sample03: 
public class SimpleLogger03 {
    public static void main(String[] args) {
        Logger logger = Logger.getLogger(SimpleLogger03.class.getName());
        logger.log(Level.INFO, "this is a info");
        logger.setLevel(Level.WARNING);
        try {
            // 因為使用了FileHandler類, 所以需要匯入java.util.logging.FileHandler
            // %t = System.getProperty("java.io.tmpdir") 路徑
            FileHandler fileHandler = new FileHandler("%t/"+SimpleLogger03.class.getSimpleName()+".log");
            logger.addHandler(fileHandler);
            // 因為在<>\jre\lib\logging.properties 預設了ConsoleHandler, 一般情況下可在控制台看到日誌
            // 這裡用 FileHandler 替換 ConsoleHandler
        } catch (IOException e) {}
        
        // 請注意看輸出的日誌, 日誌檔案中看到的輸出格式為XML格式
        Logger childLog = Logger.getLogger(SimpleLogger03.class.getName());
        childLog.log(Level.INFO, "this is a child.info");
        childLog.log(Level.WARNING, "this is a child.warning");
    }
}

2009年3月5日 星期四

相處之道

朋友寄給我的一封信,簡單的幾句話,是點點滴滴積累而成的生命智慧

1. 沒有一百分的另一半,只有五十分的兩個人。
2. 付出真心,才會得到真心,卻也可能傷得徹底。保持距離,就能保護自己,卻也註定永遠寂寞。
3. 通常願意留下來跟你爭吵的人,才是真正愛你的人。
4. 有時候,不是對方不在乎你,而是你把對方看得太重。
5. 冷漠有時候並不是無情,只是一種避免被傷害的工具。
6. 如果我們之間有1000步的距離,你只要跨出第1步 我就會朝你的方向走其餘的999步
7. 為你的難過而快樂的是敵人,為你的快樂而快樂的是朋友,為你的難過而難過的,就是那些該放進心裡的人
8. 就算是 believe 中間也藏了一個 lie
9. 真正的好朋友 並不是在一起,就有聊不完的話題,而是在一起,就算不說話,也不會感到尷尬。
10.朋友就是被你看透了,還能喜歡你的人

2009年2月26日 星期四

20090221 課程回饋

2009/02/21 JPA(Java Presistence API)課程後,節錄以下回饋資訊

學習心得:
1. JPA 技術 免去過去繁瑣的 hbm.xml 的設定 所造成 手誤,快速增加開發速度。
2. ORM 的實踐 必須 完全放棄 ERM 的設計思維 還有使用的設計技巧 這些會造成ORM 設計上得錯誤。
3. Persistance 建立的 EntiyManagerFactory instance object 有 thread safe 的設計,但是它所建立的 instance object 本身並沒有 thread Safe 的設計,這容易遭成應用上的疏忽。
4. Unit test 提高軟體的品質。不是靠最後辛苦的亡羊補牢,而是 開發過程中 經過設計且綿延的測試才可產出有品質的軟體。
5. 這次上課有發現 JPA 的一些功能,如:getReference 提升效能的方法,另外對於JPA 的 Annotation 感覺有滿有用的,如果有自訂錯誤訊息的功能就更好了
6. 在這次的課程中 我有提出 客戶端老是喜歡變動資料庫的動作,比如說倒資料進DB,這部分在有id的Table且有關聯的狀況下 會死得很慘,如果客戶的資料庫不得不變動的情況下或許所上的課程會不敷使用

改善建議:
1. 多點討論!類似像 head first 系列的書列出的問題 相當有意思
2. 這次課程比較接近給用過hibernate並且要轉JPA的人來上 若是沒有用過 hibernate的人來上課 可能會不易聽懂
3. 這次的課程 雖然很清楚的講了JPA的實作, 但是對於開發大型專案的時候較容易遇到效能的問題 如果能夠有多一些多層次資料的提升效能的寫法,將會是有很大的幫助(PS 這點僅供參考)

學習方向:(近來發現的學習方向,如果學會了,對我們這個團隊應該有幫助)
1. JPA 和 Annotation 的應用 AOP 的開發概念。
2. Unit test 專案中使用的測試案例 與實際UI建立後 所作的測試 其 前期測試與後期測試 誤差太高。
3. 因為我本身會 hibernate 的技術,學完JPA後 覺得JPA是對於hibernate的upgrade,又加深對於資料庫存取的了解,也多了一點對Annotation的應用方面更多的思考,若是再有新專案開發,希望能夠將 JPA 搭配使用Annotation來檢核Business Object,如果再利用Annotation把多國語言也做出來,一定會讓開發更是快速且簡單

2009年1月18日 星期日

不景氣, 但心靈富足