2012年10月30日 星期二

Builder Pattern

這邊的Builder Pattern 跟 GOF的design pattern 中的builder pattern 略為不同,
這是由java語言大師Josh Bloch所提出,主要用來建構immutable物件,透過一個static 的inner  class來控制Outer class的屬性,模式如下:

class SearchCriteria {
private final String firstName;
...
public String getFirstName() {
        return firstName;
    }
... 
private SearchCriteria(Builder builder){
    this.finstName = builder.firstName;
    ....
}
     
public static class Builder {
   private String firstName;
   ...
   public SearchCriteria firstName(String firstName) {
            this.firstName = firstName;
            return this;
        } 
    ...
    
   public SearchCriteria build() {
            return new ( this );
        }
} 

}

使用時就是
SearchCriteria   criteria  = new SearchCriteria.Builder().firstName("Joseph")...一直點下去再.build();

這個Pattern有啥好處?
在對於要建立一個不可變物件時很好用,因為
SearchCriteria 物件在生成後沒有人可以動到它內部的屬性,可達想要的immutable物件
的特性(如:thread safe 等等),
其次在於如果constructor 有多個參數要設定,其中又有幾個是可有可無,這種建構子會
很多,整個class會落落長(台語,很多很長的意思),
Pattern的好處就是同樣達到目地,但可以漂亮又有彈性的達成,在維護和擴充上都有幫助。
 
補充說明:Builder 的設值只會更改 Builder 的內容, SearchCriteria 這個物件直到 
Builder的build() 執行後才產生,所以它生出來的是 immutable !
 
 
這個知識本來從沒聽過,在換工作後,和高手一起工作時,經過他的提點再自己google
仔細了解才體會這個pattern !

 

2012年10月10日 星期三

Eclipse shortcut


ctrl + shift + r  => 找出想開啟的檔案
ctrl + e  =>開啟編輯區的檔案列表
ctrl + pageUp/pageDown => 切換編輯區的檔案
alt + 左/右 => 切換編輯歷程

ctrl + t => 秀出實作樹狀
ctrl + d =>刪除一行
ctrl + m =>將編輯區最大化及還原
ctrl + F11 =>再次執行上次執行的程式

ctrl + / =>單行註解
ctrl + shift + / =>將mark處多行註解
ctrl + shift + \ =>將mark處多行註解取消
ctrl + shift + p  => 對應的大括號
ctrl + shift + o  => 自動import lib
ctrl + shift + f =>code排版
ctrl + shift + g =>找出使用該method或變數的地方

shift + F2 =>看javaDoc

F3 =>秀出變數宣告處
F4 =>秀出 type 階層

alt + shift + z => 產生try catch區塊

2012年8月16日 星期四

看MLB學英文

今天牛奶小子被證實使用睪固酮就禁賽50場

MLB官網的新聞:

Giants' Cabrera receives 50-game ban

Melky banned 50 games for testosterone use

 球迷留言:Melky you idiot. 你真是笨ㄚ~或是罵法: 你是白癡喔~或不忍苛責:你真糊塗

 ban

  1. 禁止; 禁令[C][(+on/against)]
    The police lifted the ban against parking in this street. 警察取消了不准在這條街上停車的禁令。

    We have put a ban on smoking. 我們已禁止吸煙。
 idiot
  1. 白癡
  2. 傻瓜, 笨蛋, 糊塗蟲
    He was an idiot to lose his glasses. 他是個糊塗蟲把自己的眼鏡也丟了。


    PS .很諷刺的水手王牌投手-(King) Felix Hernandez,今天投出Perfect game 。牛奶為什在國內會紅,是當時王建民在NY時他也在,所以台灣有看MLB應該都認識,況且這幾年他又猛到誇張還是今年明星賽的MVP,所以才被懷疑有用禁藥 ! 最後還是被驗出~他也承認...

2012年7月5日 星期四

用EasyMock來模擬測試你要的資料

這篇是我看過寫EasyMock tutorial 最簡潔明瞭的 !

為什麼要用EasyMock呢 ? 老實說對我這種經常靠自己單打獨鬥(寫系統)的人根本很少用= =;;;

所以我認為這種開發方式(方法論)看起來可以被用在快速開發或pototype呈現,或用在團隊分工時。

怎麼說呢?舉個那篇文章例子 :
寫client端(Android 、iOS )的 RD,要去取得某個web service的資料回來運算,實作的人可能用httpclinet的套件或其他方法去連某個web service然後回傳股價,這時可能這個實作交給其他RD或新人開發,或說這個class根本還沒被生出來,所以寫UI或例子中portfolio(投資組合)商業邏輯的人就可以先訂出interface然後用EasyMock來模擬,就不用等到實作的人真正開發完成,才能確定自己開發的部份是否有bug。


2012年7月4日 星期三

Using Jmeter for Stress Testing

Env. restriction : request and response are both JSON format .
Version of Jmeter is  higher and equal to 2.6

1. Add new test plan
 2. Add Content-Type at Header for JSON


3. Add HTTP request and put your JSON data into request body

5. (Option)View result


 6. (Option) Add Summary report

 7. Run ! You can see something result in step 5 or 6 .

2012年6月28日 星期四

你也有一張悠遊卡嗎?分享一個悠遊卡的常識,並了解電子發票

之前有個新聞,一個人的悠遊卡掉了被別人撿去購物,最後撿到的人被抓到且被告侵佔。
我就在想這個失主怎麼追到他自己的卡?
一般的卡(非combo卡)不是都不具名嗎?
昨天我就驗證了我想到的方法,首先去登錄你的卡,怎麼做呢?
到小七(7-11)的ibon,找到該功能拿出你的卡給它"嗶"一下,讓它把你的"悠遊卡號碼"寄到你的e-mail信箱,
這樣你就可以"了解"你的卡了,用你拿到的卡號到電子發票整合服務平台(e-mail內也會有網址)
去看存在裡面的發票號碼和時間就可以知道你的消費記錄,當然你就會開始享有電子發票的好處-自動對獎和線上捐發票喔!

將Java的ArrayList(串列)寫到Mysql資料庫的blob欄位

案例: 收到的request資料中一個JSON格式的資料要保存,但為何不存JSON的字串就好?因為這個資料會不斷變動的,所以收到變動只要取出這個已將JSON轉成list的添加或刪除東西就好,不用再將JSON轉成list再轉回JSON存到DB去。 在Hibernate中是設定該欄位為type="java.sql.Blob",會自動在Mysql中建成DataType為LONGBLOB
下面是把JSON轉成list後,轉成blob型態存入DB
 
ObjectMapper mapper = new ObjectMapper();//用Jackson處理JSON
  Blob blob = null;
  try {
   SongResp dto = mapper.readValue(json, SongResp.class);
   List list = dto.getSongs();
   ByteArrayOutputStream bout = new ByteArrayOutputStream();
   ObjectOutputStream oos = new ObjectOutputStream(bout);
   oos.writeObject(list);
   bout.close();
   oos.close();
   byte[] asBytes = bout.toByteArray();
   blob = Hibernate.createBlob(asBytes);
   
  } catch (JsonParseException e) {
   e.printStackTrace();
  } catch (JsonMappingException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }

以下是把DB中的該欄位取出成當時寫入的list
          

List list;
  Blob b = userDao.getUserData(id, dataType);
  try {
   if (b != null) {
    InputStream in = b.getBinaryStream();

    ObjectInputStream ooi = new ObjectInputStream(in);

    in.close();
    ooi.close();

    list = (List)ooi.readObject();
    return list;
   }
    
  } catch (SQLException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  } catch (ClassNotFoundException e) {
   e.printStackTrace();
  }

2012年6月15日 星期五

在Spring使用JSON遇到null的處理

當物件的屬性是null時預設是會顯示null,如下
{"status":"1","singers":["Jolin","Jolinnnnn"],"songs":null}
但如果想要連songs屬性都不要顯示,希望如下
{"status":"1","singers":["Jolin","Jolinnnnn"]}
就必須在該物件多個Annotation去定義這個行為產生的做法

@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class YourJSONobj {...
    private String status;
    private List songs;
    private List singers;

...

2012年5月28日 星期一

Git與Dropbox結合

主要目的當然就是把本地端的東西(Code)透過安裝好Dropbox的客戶端軟體,自動上傳備份到雲端!

環境:
  1. 上傳的東西, Java code在 D:\java\workspace\test
  2. Dropbox安裝目錄, D:\My Dropbox\WorkCode 。WorkCode是自己建的目錄。

開始 :

1.執行git 切換到WorkCode目錄下(注意Dropbox前有一個空白,所以My後面加上backslash及一空白)
$ cd /d/MyDropbox/WorkCode/

2.建立一個遠端repository,習慣命名在專案名稱後面加上.git
$ git init --bare test.git
Initialized empty Git repository in d:/My Dropbox/WorkCode/test.git/

3.切換到要上傳專案的前一目錄
$ cd /d/java/workspace/

4. 在原本已存在的test目錄變成git用途
$ git init test
Initialized empty Git repository in d:/java/workspace/test/.git/

5. 進到test目錄且把其內的東西放到(新增)遠端repository
$cd /d/java/workspace/test
$ git remote add origin /d/My\ Dropbox/WorkCode/test
$git add .
$git commit -m 'first version'
$git push origin master

6. 步驟5事實上是傳到本地端的Dropbox目錄,要同步到"雲端"不要忘了開啟Dropbox Client。

7.測試從本地端的repository(Dropbox目錄)取出專案內容到D:/myrep1
$ cd /d/myrep1/

$ git clone /d/My\ Dropbox/WorkCode/test.git/
Cloning into test...
done.


ps.如果要忽略原本test內的一些檔案或目錄,須步驟5的git add. 之前加上一個.gitignore檔內容類似如下:
CVS/
work/
target/
src/CVS
.settings/
.classpath
.cvsignore
.project
*.avi

2012年5月25日 星期五

用JAXB讀寫XML

Java Architecture for XML Binding (JAXB)

這個 lib已經在jdk 1.6內所以不用額外下載了。

用法很簡單,看官方的文件就很清楚了,由XML轉成(parse、unmarshal)物件,或由物件產生(marsha)XML都可以輕鬆完成。

這邊只是做個記事,在這次的專案用到產生XML的tag是會需要有順序性的,比如說

Content內嵌有Epg,Media,Content(就是Content又包有Content tag) 三個sub tag

Java在定義物件會是

@XmlAccessorType(XmlAccessType.FIELD)

public class Content{

 @XmlElement(name = "Content")
    protected List contents;

@XmlElement(name = "Epg")
    protected List epgs;

@XmlElement(name = "Media")
    protected List media;

...

}

如果需要考慮到出現順序,就要加上

@XmlAccessorType(XmlAccessType.FIELD)

@XmlType(propOrder={"epgs", "media","contents"})

...

如此就能控制tag順序為Epg,Media,Content。

注意propOrder要填入的是物件的屬性而非tag名稱

2012年5月6日 星期日

Bugzilla

最近幫公司弄了一套 Issue tracking system , Bugzilla .

發現報個Issue要assign給某個人居然要自己填email , 後來google後發現已有功能可以
讓user選系統上已註冊的人(會出現下拉選單),這個功能預設是關閉的,所以要由管理者去開啟,
PARAMETERS - > USER MATCHING
這邊就是設定的地方 !
 

2012年4月27日 星期五

心情雜記

高中同學還持續有在聯絡的人,都是我認為都是好朋友的人,包括 : 豬仔,睡王,阿臭,阿毛、阿達,大屁,每個人現在都自己職場領域中發揮。
今天得知睡王將在五月主動請調到越南工作,讓我非常驚訝,原因在於才剛擁有第二個女兒的他會在這時跑到國外工作,當然他也是跟家人討論過才做出重大的決定,再詢問他一些細節原因時,給了我許多想法。其中就是當為了達成自己的目標,部份的犧牲是無可避免的。他的目標我是沒細問,而犧牲的部份就是家庭。
雖然到公司的國外分公司工作一定會多賺很多,薪資上一定有補貼(一個月有多個三四萬)、升遷速度也快、分紅績效當然也會比國內多,但家庭的照顧卻會損失,幸好她老婆有支持他的想法,她娘家也在附近,所以照料應該不是問題,說不定未來還會舉家搬到國外。無論是否值得,我都祝福他 !
這個情況對我來說,可能就不會這樣做,因為我實在放不下我的家人,自己跑到外地工作,
或許這就是每個人選擇的人生,每個人對自己目標下的一個賭注以及如何看待自己的未來,
我呢?我的目標在哪?我想要有一個怎樣的未來 ?是該有所行動了?!   2012/04/27 18:00

2012年3月30日 星期五

列出Path中package內的所有class name

可以參考這邊
或更進階的取更多想要的資料(Reflections scans your classpath, indexes the metadata, allows you to query it on runtime and may save and collect that information for many modules within your project. )

2012年3月14日 星期三

更新Gonav s900內SD卡的主程式(韌體)和地圖

在官網下載papago for Gonav S900 VR-ONE Plus導航機專用主程式及R17_12Q101V1.0版的圖資後,依說明放到指定的位置後,居然開機後畫面漸漸消失,等於更新失敗,在經過Google有人提供取代主程式的NK.bin檔,就成功了!
所以更新任何東西前要先備份好原始的東西,不要以為應該下載官網的就一定會成功!

PS.這台還是當時辦"光世代"送的東西,真不賴^^

2012年2月15日 星期三

Eclipse issue I met

今天遇到一個妙的亂碼問題:
一個有中文的檔案放在workspace\myProject\src\main\resources下,
讓Eclipse自動將該檔compile到workspace\myProject\target\myProject\WEB-INF\classes時,
居然內容中文會變成亂碼。
奇妙之處在於如果改放在workspace\myProject\src\main\java下面任一處就不會。掃遍所有eclipse跟編碼有關的設定都沒用=.=


如果有人google到這個問題,你最後有解的話,請留言告知大家!

謝謝

ps. 我猜想應該跟Maven plugin或Maven設定有關吧?! who knows !

20120721 今天有時間又剛好遇到這個問題,居然一gooole 就找到問題了,
答案終究還是設定問題,加個Plugin就好了
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>

2012年1月9日 星期一

我的IT書櫃









有紅綠圈的是他人贈書 !
其中有一本SilverlightXXXX是最不值的,因為當時還菜以為會很紅= =,結果...
如果有人想要可以免費送他!

20120109入櫃!
這本"24 小時不打烊的雲端服務-專家教你用 CentOS 架設萬年不掛的伺服器"
是作者贈書! 由書的內容可以看見作者的用心,是一本真的照著書實作就能體驗所有書中敘述的機制,對寫Code的工程師來說,你想用到兩台Mysql資料庫同步、備份又要達成fail-over的機制,這本書是你不可或缺的!


Os20132

















2012 / 04 /07入櫃
App 程式設計入門-iPhone、iPad, 2/e

打造安全無虞的 Web Applications-從策略制定、程式開發,到防止惡意攻擊之必備對策白皮書

Div + CSS 網頁版面設計-輕鬆做網頁排版,隨手做 SEO

 

 

[20120610購入] 想學好設計模式?從物件導向開始 
書評: 這本是對岸人士所撰寫,書頁不多 但內容整理的不錯。

7208774004fbf93e5dde9b
[20120810購入]

Java 效能優化指南 (Java Performance)

笑談軟體工程-敏捷開發法的逆襲

 

  Axp014800 Skna00001


[20120930] 購入

HTML 5 完美風暴


Bo2701


(2012年十月更新)







COVID-19 確診經歷紀實

原本以為真的是天選之人,就算先前家裡兩個小孩都確診都逃過了(可能有中獎但無症狀吧),不過就在2023年六月18日破解自認為天選之人的"心態",為什麼可以確認就是這天中獎的呢?因為在前都是居家上班,到人多的室內場所都會戴口罩,就剛好這天傍晚原本只想說要去附近的國...