顯示具有 程式設計 標籤的文章。 顯示所有文章
顯示具有 程式設計 標籤的文章。 顯示所有文章

在JPA中,將createNativeQuery的結果轉換成其他物件

在JPA中,當你使用createNativeQuery去下SQL語法時,你可能會用getResultList來取得查詢出來的結果:

但是當你執行時,會出現無法轉換的錯誤:ClassCastException occured : [Ljava.lang.Object; cannot be cast to models.Post

Spring Bean Scope 學習

在Spring中定義一個Bean時,可以針對其scope加以設定。在新版的Spring中,共有五種不同的scope可以設定,分別為:

Spring Bean Definition

在Spring中,Bean是一個物件,藉由Spring IoC Container來初始化(instantiated)、管理組裝(assembled)。

Bean會由定義的設定檔(configuration metadata)來建立。例如,藉由在XML檔案中,<bean>的設定來建立。

設定檔(configuration metadata)需要瞭解下列事項:

  • 如何建立Bean
  • Bean的生命週期
  • Bean的相依關係(dependencies)

在一個Bean的設定檔中,透過下列的properties來進行設定:

  • class:必定存在。定義用來建立此顆bean的class
  • name:用來建立Bean的識別(identifier)
  • scope:定義Bean的Scope,包含:singleton、protopype、request、session和global-session
  • constructor-arg:用來注入dependencies
  • properties:用來注入dependencies
  • autowiring mode:用來注入dependencies
  • lazy-initialization mode:用來告知IoC Container在第一次request這個bean的時候再建立instance,而不是在startup時
  • initialization method:一個callback。在所有必要的properties被呼叫後執行
  • destructor method:一個callback。在bean被destroyed時後被呼叫

一個典型的Bean設定檔大致如下所示:

在該設定檔中,有一個HelloWorld的Bean,分別在初始和結束時,會去呼叫init和destroy方法。同時把message這個參數注入Hello World!的值。

設計良好的Web API

最近由於工作的關係,需要設計API提供給User使用,我們採用的是HTTP + RESTful + JSON Response的方式,剛好和近期讀到的一篇文章所建議的方法相同,在這邊稍微記錄一下。

這篇文章是:Designing robust web API

根據作者過去的經驗,提供幾個在設計API的Best Practice或個人經驗。分別為:

  • Use a RESTful Model:使用HTTP + RESTful + JSON作為API的開發架構
  • Stabilize your API:Expose the API as minimal as possible. 保持API的穩健,不應該有大量變動。已經釋出的功能很難被刪減。
  • Version your API:在API的Request URL中加入版本資訊方便使用者做區別。
  • Asynchronous Invocation:如果你的response需要很長的時間,採用asyn的方法。實作上有兩種模式可以參考:(1) Client在request之後,server response是一個receipt,用來向server詢問response是否已經處理完畢。(2) Client提供callback address,當server處理完response之後,會丟回callback的位置讓client接收。

【相關閱讀】

數個JSON Library效能比較

今天看到一篇比較各種不同JSON library performance的文章:Json Java parsers / generators microbenchmark

文章中比較了八種常見的JSON Library用來 parse/generate JSON的效能,分別是:

  • FlexJson (2.1) 
  • GSon (2.1) 
  • Jackson (1.9.4) 
  • JsonLib (2.4) 
  • JsonMarshaller (0.21) 
  • JsonSmart (2.0-beta2) 
  • Protostuff JSON (1.0.4) 
  • XStream (1.4.2)

RESTful URL Design 準則

要設計RESTful URL,有一些準則可以參考,以下列出一些我覺得比較重要的部分,剩下的可以參考相關閱讀的兩篇文章,寫的都不錯。
  • Short
  • Lowercase, without mix-cases
  • Use plural path for collections, ex : /cars for all cars
  • Put individual resource under plural path. ex: /cars/car-1 or /cars/1
  • Use URL parameters ONLY with form-driven queries. ex: /cars/car/1, NOT /cars/car?id=1
  • Readable, Hierarchical, Simple.
  • Meaningful, ex: /cars/toyota/cr-z, NOT /cars/brand1/1
  • Hackable URL, ex: /cars/toyota/cr-z should have /cars/toyota/ and /cars
【相關閱讀】
Common REST Design Pattern
REST-ful URI design | RedRata

J2EE Solutions 比較表

這個網站收錄了J2EE Open Source各種solutions的比較表,從Presentation、IDE、Web ... 等分門別類整理,還不錯,可以當作一個參考。



http://swik.net/CompareJ2EESolutions

使用Java自動化執行工作 - Timer 和 ScheduledExecutorService

在Java中,如果想要在給定的時間區隔或固定時間執行某些任務,有幾種方法,在這裡稍微做個筆記。

Maven 之 POM(Project Object Model) 設定檔

在Maven中,最重要也是最基本的就是POM(Project Object Model)了。POM是一個XML的設定檔,它包含了Maven在建置專案時的所有資訊。

在執行Maven時,它會去檢查專案目錄下是某具有pom.xml檔案,如果沒有時,任何操作都會出現build error。

Maven 介紹

Maven是一套用來管理Java專案的工具,使用Maven,你可以讓專案在建置、測試、管理、部屬等工作上更為輕鬆。同時在管理dependency上,更是會讓你用起來愛不釋手。

我們先透過一個小範例讓大家對Maven的運作有一個初步的了解,在使用它之前,你必須要先安裝好適當的jdk。
首先,請先下載Maven,在這一篇的操作中,我們已Maven 2.2.1版本為主。
下載頁面:http://maven.apache.org/download.html

解決jdom輸出時產生無意義(空白)Namespace之問題

在新版的jdom(我用的時候是1.1)中,使用XMLOutputter來輸出整個XML Document時,在Element上會產生空白內容的Namespace,像是這樣:

<bean xmlns=""></bean>
不管是呼叫Element的removeNamespaceDeclaration()或是設定NO_NAMESPACE都沒有用,甚至在create element之後呼叫remove attribute()去remove xmlns屬性也不行,這案情不單純阿...。

後來Google到一篇,裡面說到jdom新版有bug,要去source code裡面解決,不過也沒說是什麼問題,只好自己來啦!好險並不是很困難,原因在於XMLOutputter這支code裡面出了問題,在XMLOutputter中,有一個方法叫printNamespace,裡面原本的code有一段是長這樣:



很明顯有了錯,改成下面這樣就可以了:

[設計模式] Strategy Pattern(策略模式) Part 2

Strategy Pattern(策略模式) Part 1裡面我們提到,如果我們裡用繼承父類別的方法,就會造成子類別被強迫實作他不需要的方法,有沒有更好的方式呢?

我們觀察到,每個角色共同擁有的功能是【攻擊】,只是攻擊的武器不同,因此,我們可以把攻擊這個方法獨立抽出來。先建立一個叫做Attack的Interface:


public interface Attack
{
    void useWeapon();
}


接著我們針對三個武器建立三個Class,分別是KnifeBehavior、SwordBehavior和AxeBehavior,同時這三個類別要去實作Attack這個介面:


public class KnifeBehavior implements Attack
{
     public void useWeapon()
     {
          System.out.println("Attack by Knife");
     }
}



public class SwordBehavior implements Attack
{
     public void useWeapon()
     {
          System.out.println("Attack by Sword");
     }
}



public class AxeBehavior implements Attack
{
     public void useWeapon()
     {
          System.out.println("Attack by Axe");
     }
}


接著,我們可以在原來角色的類別(Character)中,增加一個 setFightAction(Attack attack);的方法,這個方法可以讓實作他的角色類別依照需要來動態的產生不同的攻擊方法,因此,我們原本的角色類別變成:

public abstract class Character {
    public abstract void fight();
    public abstract void action();
    public abstract void char();
    public abstract void setFightAction(Attack attack);
}

如此一來,實作角色類別的個別角色(King、Queen和Knight)的程式就會變成:

public class King extends Character {

     Attack attack;

     @Override
     public void action() {}

     @Override
     public void chat() {}

     @Override
     public void fight() {
          f.useWeapon();
     }

     @Override
     public void setFightAction(Attack attack) {
          this.attack = attack;
     }
}


最後,我們要使用每個角色時,只需要這樣寫:

public class PlayGame {
    public static void main(String [] a) {
        King kevingo = new King();
        kevingo.setFightAction(new KnifeBehavior());
        kevingo.fight();

        Queen mary = new Queen();
        mary.setFightAction(new SwordBehavior());
        mary.fight();

        Knight tom = new Knight();
        tom.setFightAction(new KnifeBehavior());
        tom.fight();
    }
}


往後,當我們需要有新的攻擊方式時,只需要重新建立一個新的攻擊類別,而如果皇后要改拿其他的武器時,也只要在setFightAction中指定新的攻擊類別,真是太好了!

再回顧一下Strategy Pattern的定義:

  • 策略模式在於觀察程式中變動的部分,並且將他們抽離出來封裝成可互相抽換的演算法家族。這個模式讓你即使任意更換實作的演算法,也不會變動到去使用者他們的客戶端程式。

在這個範例中,我們把不同型態的攻擊方法抽出來變成一組家族,建立一個Interface叫做Attack,同時根據不同的攻擊方法來建立不同的類別,往後我們只要利用set方法就可以輕鬆的替換攻擊的方式,這就是策略模式的用途所在。

當然這個模式不是沒有缺點,最顯而易見缺點就是他必須要維護比較多的類別,當實作的策略變多的時候,維護起來就會比較吃力囉。

在Visual Studio找不到DLL Reference?先確定Target Framework吧!

最近在練習C#程式開發時,偶而會碰到要reference某個dll的時候,找不到相對應的namespace,後來上網尋找了一下,發現不是這顆DLL消失了,而是Project裡面的Target Framework被設定為Client Profile的形式。


至於Client Profile和一般的.NET Framework有什麼不同,可以參考msdn上面的這篇文章:

.NET Framework Client Profile

另外這一篇文章也寫得不錯:

What’s new in .NET Framework 4 Client Profile RTM

簡而言之,Client Profile算是一個Compact Version,如果你要開發Web Service,也許可以用,但如果是桌面端AP的話,建議還是用原本的.NET Framework,比較可以省掉一些麻煩囉。

SVN Checksum Error

前陣子在寫程式的時候,發現了這個錯誤,當我想要commit一個檔案到SVN Server上時,他會告訴我【SVN Checksum Error】的訊息,結果就無法commit檔案上去了。

網路上找到的方法:
但是我是了還是不行,囧。我自己的解決方法很簡單,順序是這樣:

(1) 除了有checksum error的檔案之外,先commit所有其他的檔案
(2) 把無法commit上去的檔案先複製一份到別的資料夾
(3) 刪除有問題的檔案
(4) 重新把剛剛複製到別的資料夾的檔案copy過來,重新commit,這樣就解決了

打完收工!

Go - Google推出新的程式語言!



Google在昨天居然宣布推出新的程式語言:Go。根據Google官方表示,這是一個結合C++和Python優點於一身的程式語言,他有C/C++的運作速度和Python的簡潔,雖然目前Google認為Go還不是一個成熟且適合拿來佈署的程式語言,但其實Google內部已經有一些專案是採用Go來做測試開發了。

至於為什麼Google要重新打造一個程式語言呢?主要的原因根據官方說法有以下五點:

  • Computers are enormously quicker but software development is not faster.

  • Dependency management is a big part of software development today but the “header files” of languages in the C tradition are antithetical to clean dependency analysis—and fast compilation.

  • There is a growing rebellion against cumbersome type systems like those of Java and C++, pushing people towards dynamically typed languages such as Python and JavaScript.

  • Some fundamental concepts such as garbage collection and parallel computation are not well supported by popular systems languages.

  • The emergence of multicore computers has generated worry and confusion.
簡單來說就是Google認為在過去接近十年內,都沒有新的程式語言產生,而電腦的發展在這段時間內有了驚人的成長,是時候該有新的程式語言被提出,運作在目前的電腦上。

如果想要進一步了解的朋友,可以參考官方的介紹影片:



或是到Go的專案網站上,有tutorial可以參考:


不管Go這個程式語言會不會發光發熱,Google的野心還真是大啊!包山包海,搜尋引擎、文書工具、電子郵件、電子書、手機、作業系統...現在又跨到程式語言了,哪天要是有了Google電視台,我想大家也不意外吧?

【相關閱讀】
GO: Google Launches Its Own Programming Language
Let’s … GO ? Google推出新的程式語言

funcoupon - 今晚要用哪一張折價券?


這學期修了交大Web2.0的課程,和朋友在funp平台上開發了一個「funcoupon」的服務,這個服務有什麼特別之處?讓我們來看看!

首先,大家可以先連到funcoupon的服務首頁。一進去可以看到我們是用「視覺化的模式」來呈現我們的服務-coupon,我們認為目前市面上的coupon提供網站的資訊負擔過大,常常一個頁面會呈現太多的資訊,使用者無法一眼就看到他想要的coupon,我們認為用「圖片牆」的方式來呈現是有別於文字排列的另一種選擇。



為了讓使用者能夠快速的找到他想要的coupon,我們根據不同的條件設計了不同的存取coupon的方式,首先,你可以在每一頁的上方看到不同種類、地區的按鈕,根據你的需要,你可以點選不同的牆來存取coupon:



或者,你也可以利用map的方式,搜尋某個地區的coupon:



在「我的主頁」中,你可以看到自己所收藏的coupon,同時,如果你有朋友推薦coupon給你時,也是在這邊作接受或拒絕的動作:

除了自己所收藏的coupon之外,你還可以看到朋友收藏的情況:

未來,我們希望與店家進一步的合作,能夠輔導店家自動上傳他們的coupon,透過使用者、店家和管理者三方面的維護這個服務內的coupon,讓coupon的數量能夠有爆炸性的成長:


如果你覺得這個服務還不錯,也可以推薦給其他同樣在funp的朋友:


有鑑於現在blog如此的流行,如果你想要將coupon嵌入到自己的blog,我們也提供了直接產生程式碼的功能,如此一來只要在blog中貼上即可:


如果你對本服務有什麼建議或覺得需要改進的地方,也歡迎到我們的討論區留言給我們,我們會儘快的回覆:


funcoupon嘗試把資訊用不同的呈現方式呈現出來,同時提供「coupon種類選擇」、「地圖」等不同的方式來存取coupon,並且加強美工設計的部分,希望讓使用者在找尋coupon的時候都能夠快速且開心的找到自己想要的資訊。在互動性上,透過coupon分享、推薦的機制,讓朋友之間可以快速的share自己喜歡的coupon。

在經過這學期的「磨練」之後,我們深深覺得技術和創意是一體兩面、缺一不可。有了好的創意、沒有技術的支持,就只能等著這樣的創新點子被別人搶先開發出來,或是技術能力不足,再好的點子都變得綁手綁腳,不能完完整整的把自己想要實作出來的功能呈現給使用者;但是如果空有技術、卻沒有好的點子,也是不行,因為你世界上技術能力強的人實在太多了,能夠出頭天的只有老大,因此技術、創意兩兩相輔相成,才能在殺很大的網路世界中有亮眼的表現。


Java 產生不重覆亂數

Lab的人要我給他一個產生不重覆亂數的方法,下面是兩種方式,第一種很慢,速度是O(n^2)被幹詰到死XDD

Java要產生亂數很簡單,只要呼叫Random類別就可以了,不過如果想要不重覆的亂數,有一些小方法可以用,這裡提供兩種方法:

(1) 暴力比對法
這個getRan方法會接收一個整數,表示你要取得亂數的範圍,丟進去100表示你要取0~99之間的亂數



這個方法接收一個整數,表示你要取得亂數的最大範圍,呼叫 generateDuplicateRan(100) 則會回傳一個長度100的整數陣列,裡面就是0~99不重覆的整數。寫的方式很直覺,第一個for loop跑100次,每塞一個值就會去比對之前在陣列中的數字,如果相同就移除。缺點就是要產生大量亂數的時候很慢,因為有兩層for loop,速度是n^2,如果只是要少量亂數的人可以參考。

(2) Collection移出法
第二種方法就快多了,尤其在產生大量亂數的時候更為明顯。分成三個部分來解釋:
  • 產生一個ArrayList,並且利用for loop塞值進去,你想要產生0~99的亂數,就丟100進去,他就會依序把0~99塞到ArrayList裡面。
  • 這個部份就是trick所在,裡用Collection的remove method,隨機的取index,並且移出,直到ArrayList的size = 0。因為本來在ArrayList裡面的數字就沒有重複(用for loop塞的),所以隨機取出的值也不會重複。

  • 最後一個部份就是去呼叫上面的方法並且宣告一個array來接收上面產生的亂數。


[UPDATE 2009/04/07]
強者我同學bluesway寫了一個比我快的版本(我也沒有覺得我的很快啦...),用的資料結構是Hash,大家可以參考XD


Java 設定Classpath方法一覽!

Classpath在java的意義是「在執行階段JVM會去尋找classes或其他資源的路徑」。如果你的java程式有到外部的jar或其他人寫的class,在執行你的程式的時候就要告訴JVM要去哪裡找這些資源,也就是要設定classpath。

在Java中設定classpath的方法有很多,以下作個簡單的介紹:

(1) 將用到的jar檔案放到 {jre安裝目錄}\lib\ext 中
JVM在執行的時候會去這裡目錄下尋找需要的classes來load,如果你有需要import的jar檔案就可以丟進去。
(不過這並不是最好的方法,因為如果每個人都丟自己寫好得jar檔案進去,只會造成混亂。)

(2) 在執行的時候指定classpath
這應該是最常使用的方法,就是你在command line下指令的時候順便指定classpath。比如說:
java -classpath classpath1;classpath2 className

這裡的classpath有一些竅門,分成三部份來說:

前提:你現在想要執行的class是 pro1.class
  • 如果是要指定資料夾指定到該目錄下 (如果有設定package,則指定到該package最上層之上的目錄)。比如說你想要使用的class或jar都放在C:\source\classes\ 資料目錄下面,你可以下這樣的指令:java -classpath C:\source\classes pro1

  • 如果是要指定jar或zip:要把檔案名稱都寫出來。比如說你有一個myJAR.jar放在C:\source\classes\outerJAR\ 下面,在下指令的時候要打:java -classpath C:\source\classes\outerJAR\myJAR.jar pro1

  • 使用set classpath指令:在command line下輸入:set classpath=classpath1;classpath2; 接著再輸入java className 即可!注意這裡所設定的classpath只能在這一次的執行環境下使用,你把command line關掉之後就會消失了喔。
[UPDATE 2009/04/07]
感謝william的說明,在unix的系統中如果要設定多個classpath,中間要用 : 隔開,可以參考下面這篇文章說的很清楚 : )
Managing the Java classpath (UNIX and Mac OS X)


有問題歡迎提出討論 :)

【相關閱讀】
PATH與CLASSPATH
Setting the Classpath
Classpath(Java) - Wiki



RegExr : Online Regular Expression Testing Tool (線上測試Regular Expression工具)


Regular Expression是每個寫程式的人必備的武器,雖然我這個武器的攻擊力很低....orz

RegExr是一個可以即時顯示你下的Regular Expression效果的測試網站,畫面很簡潔有力,主要就是在下面的綠色區塊輸入你的Regular Expression,然後黃色區塊放你要測試的文字,


他會即時顯示Regular Expression的效果:


除了Matching之外還可以測試Replace:


想當然耳我們沒有辦法記住所有Regular Expression的語法,RegExr提供了常用到的Expression在畫面右手邊,點選到該項目下方還會有對應的說明:


不能上網怎麼辦?沒關係,RegExr還提供了Offline使用的方式!只要下載Adobe AIR就可以使用囉:




是不是很方便呢!趕緊試試看喔!


不同語法import的方法(CSS, Javascript, PHP)

隨手紀錄一下囉,要不然每次要用還要想xD

CSS
<style type='text/css' media='all'> @import 'directory/file.css'; </style>


Javascipt
<script type='text/javascript' src='directory/file.js'> </script>


PHP
<?php require_once ('directory/file.html'); ?>


JSP
<%@ include file='jspfile.jspi' %>