2009年6月23日 星期二

App engine上利用eclipse使用JDO

在使用App engine時我們想要在eclipse上要建立一個供人輸入資料的網頁,因此我們需要建立一個資料庫,但我們無法使用一般的的資料庫如:phpmyadmin Navicat等資料庫,因此要在建立資料表時引用到JDO來存放資料當作一個公同的橋梁

JDO可以讓你以Java程序員的最自然的方式來存儲及擷取物件。你不需要在資料庫的資料表中使用JDBC或EJB的由容器管理的持久保存機制:JDO實現會在幕後處理持久保存,而你則使用一般的Java語法依據Java物件的字段來進行查詢。



JDO可讓你存儲平凡的一般Java物件,而且也不強迫你使用不同的資料模型及類型來處理資料存儲的操作。因此,程序變得比較容易維護、再使用以及測試。此外,你也不會被限定於特定的資料庫供貨商:JDO程序是完全與資料庫無關的。你甚至不需知道資料庫是關係資料庫、物件資料庫還是只是一組文件,因為app的SDK都幫妳包好。

我們用使用JDO連結資料時,JDO裡面使用兩個class用來當作連接橋梁
一個class是用來宣告資料的型態(POJOs and JDO Annotations)
另一個是用來當作資料間的管理者(The PersistenceManagerFactory)
有了上敘兩個class 這樣我們便可以在JSP檔中使用JDOQL語法,使結果呈現在網頁上。

用上敘的兩個class,我們可以在其一設定資料屬性,另一座連結
這樣我們就可以使用SQL敘述如
String query = "select from " + Greeting.class.getName();
等SQL語法

例如,在訊息框內打入欲儲存訊息(Holle World),接著按下PostGreeting送出

之後,便可以在網頁上看到剛剛輸入得訊息

上例就是簡單一個使用JDO儲存資料的小例子,在欄位中輸入資料,接著由PMF連接,再由(POJOs and JDO Annotations)資料表中儲存資料。

2009年6月22日 星期一

利用NetBeans連結、檢視資料庫內容

  開發JAVA不外乎使用Eclipse、NetBeans、JBulider......等。各IDE工具各有各的好處,只觀看個人喜好及使用習慣,但至從SUN公司砸下十億元重金收購收購全球最多人用的開源資料庫Mysql後,在NetBeans6.5版本中,也開始加入了JDBC的驅動程式和資料庫內容檢視,無疑的對於使用者來說,可以不用在額外安裝檢視資料庫內容的軟體,如免費的phpmyadmin、付費的(Navicat)......等!

  在安裝NetBeans6.5後,可以在X:..\NetBeans 6.5.1\ide10\modules\ext此路徑下看到mysql-connector-java-5.1.6-bin的jar檔,此為JAVA連結資料庫的驅動程式,以往需額外下載,如今一併包在其中。

  在程式的Project上按右鍵選properties,在左邊選libraries(如圖),並點選右邊Add JAR/Foloer
並進到以上路徑點選Java的connector並在程式碼當中加入連結的語法即可連結MySql資料庫!


使用NetBeans檢視資料庫內容,先點到左上方Services,即可看到下方的Database
  選擇下方drivers --> MySql 右鍵 connect using 如圖依序填入

則會多出一個連結裝置的圖案則代表新增成功,就可以在NetBeans上檢視內容及看到資料庫的內容以及可以在上方鍵入sql指令!



  所以透過以上步驟就可以連結資料庫以及使用NetBeans新增的功能來檢視內容,如此一個IDE即可整合部分所需功能,在使用上方便許多!

2009年6月21日 星期日

Search API in Google and Yahoo, using java

在Google和Yahoo~都有提供一些方法
可以用另一種方式~直接取得搜尋的結果~而不用透過搜尋頁面
以下所敘述的~是如何從 Java 向Google的「AJAX 搜尋 API」提出要求

首先
下面是Google提供的片段程式~(參考頁面)


URL url = new URL("http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=Paris%20Hilton");
URLConnection connection = url.openConnection();
connection
.addRequestProperty("Referer", "http://www.mysite.com/index.html");

String line;
StringBuilder builder = new StringBuilder();
BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while((line = reader.readLine()) != null) {
builder
.append(line);
}

JSONObject json = new JSONObject(builder.toString());
// now have some fun with the results...



這段程式中~關鍵的地方有兩個

一個是第一行的url
這段url可以決定取回的資料為何
方法就是在最後面加上"&參數名稱=參數的值"
有哪些參數可加~可以參考這裡
比較關鍵的~除了q以外(q是用來指定要搜尋的keyword)
另外rsz可以決定一次取回的筆數~最多8筆~最少4筆
start可以決定從第幾筆開始取

這邊必須提一下~Google的API似乎不允許一次取回超過八筆的資料(但Yahoo可以)
但最多其實可以拿到64筆的搜尋結果~也就是分八次取得
所以關鍵在控制start和rsz這兩個參數~來取得不同的結果

另外一個關鍵的地方~在最後一行指令
取回的資料~是一個json格式的字串
JSONObject json = new JSONObject(builder.toString());
這行指令~可以將取回的字串轉換成對應的json結構
好處是~可以直接使用java內所提供的json的函式~直接取得我們需要的部分資料(如url, title, content...)


這邊另外要介紹一個很重要的東西~就是json
json是一個輕量資料交換的格式
主要是由兩個結構所組成~object和array

object是由{}所包住的name/value配對之集合~
如下圖:

object中的成員~以,分開
每個成員的name和value以:分開

array是由[]所包住~value的集合
如下圖:


以上所謂的value可以是很多東西
如下圖:


在了解了json之後
當要取得所需要的部份資料時
就要從最外層~針對不同的結構~使用不同的函式來取得底下的資料



以上圖為例~在java中
若要取得第一個url的內容
要先用getJSONArray("results")~來取得result這個name對應的value
再以getJSONObject(1)~取回array中的第一個value
最後再以get("url")~就可以得到得到url所對應的值了
重點是要看~將要取回的部分資料是object,array還是其他
來交替使用getJSONObject,getJSONArray,和get


至於Yahoo的部份
其實只差在第一行的url
這個url要怎麼拼湊~可以參考這邊

2009年6月20日 星期六

User Rating 推薦機制簡介

現今網路資料量大,同個網站可展現的資料非常多,初來網站的瀏覽者不易快速了解網站中何者為熱門、有用的資訊;為幫助新來訪客快速上手網頁資訊,我們可將網頁資料建立推薦機制,其中一種常見的方法便是user rating。
所謂user rating,即以使用者角度來對使用者推薦。使用者上傳評分之後,透過公式求出綜合所有使用者的評分結果。不同網站使用的公式不同,有的直接加總取平均,有的用特殊公式,運用統計學取得評分。甚至有些網站針對不同使用者採取不同的評分公式,或個別分開列出評分結果,分為一般大眾普通使用者、或特殊領域專家、或較具客觀公信力之使用者...等等。
不同的網站user rating機制也不盡相同。較常見的種類如下:單一的user rating,單純對所有使用者都用同一種評分方式;列出不同類型使用者不同評分結果,例如分為一般使用者,專家類型使用者,像是網站上所列出關於一本書的資訊,同時列出一般使用者的評分,以及editor的評分,及同樣職業作家使用者的評分,甚至附上文字評論;另一種為同樣列出其他網站的使用者評分,例如購物網站,除了列出自己網站的使用者評分外,也列出其他購物網站對該商品的使用者評分,讓顧客在選購時能參考更多元的意見。
現在許多網站都有user rating機制。例如Skins.be,每張桌布圖片都有目前評分結果,有1~5分讓使用者上評分並上傳;熱門的短片網站Youtube也有使用者評分機制,並且可以有文字評論;其他像拍賣網站有著顧客和商家互相推薦的評分機制,例如Yahoo、露天拍賣...等等;其餘的類似物品review的網站,為使用該物品過後到網路上分享自己的使用心得,相較於一般群眾,該reviewer為該類型物品較於精通者,其使用心得會較客觀、較值得讓人參考,除了對該使用心得可做評分之外,亦可對各個心得分享者做評分。
以下介紹一個常見好用的網站,IMDb。該網站儲存的電影資訊相當多,對電影、對演員都有使用者評分系統,其評分結果算較為大眾接受,但也有東西方觀感、文化差異、觀影族群不同使得評分結果不被部分人接受的情況。在此要介紹為該網站有個評分結果前250名電影清單,該網站有列出以下公式:
weighted rating (WR) = (v / (v+m)) * R + (m / (v+m)) * C
where
R = average for the movie (mean) = (Rating)
v = number of votes for the movie = (votes)
m = minimum votes required to be listed in the Top 250 (currently 1300)
C = the mean vote across the whold report (currently 6.7)
參考過網頁所列出的電影清單與這公式比較會發現,若有兩部電影A、B,A為低票數但每票都高分數,而B為低分數但有相當多的票數,套用這公式有可能會有相同的結果,因此要得到該清單的rank所參考的必不止這公式的結果,必須還要有其他資訊。
user rating已經成為一個普遍使用的推薦機制,以使用者的角度來對使用者推薦,因此要防範灌水廢票之外,使用者對使用者的信賴度也同樣重要。

2009年6月19日 星期五

Google Web Toolkit on Eclipse 3.4

這篇文章是教學如何用Eclipse3.4開發Google Web Toolkit 1.6.4(以下簡稱GWT)
從安裝、下載,到新增第一個GWT程式

首先JDK要安裝好之外,再來就是Eclipse主程式
Eclipse是免費免安裝的Java IDE,請到這裡下載
我們要的是網頁上如下圖所示這版本,即開發java之standard版

點選進去之後,點即可開始下載

下載好之後,建議解壓縮後將資料夾放置固定位置
因為雖為免安裝之IDE,但若隨意移動資料夾會影響到library的指向路徑是否正確

下載好解壓縮到固定位置後,接下來要將Eclipse安裝GWT plugin
開啟Eclipse主視窗後,點取最上排右方之Help,點選Software Updates...,如下圖:


在跳出的視窗上方頁面標籤點選到Available Software頁面,之後點擊視窗右方

在跳出的視窗之textbox貼上網址:http://dl.google.com/eclipse/plugin/3.4
點選OK

隨即在Software Update視窗便會多出如下可選擇新增之plugin:

接下來點擊視窗右方
並在之後出現視窗點擊OK,等整個下載安裝結束即安裝好GWT plugin

安裝好後會在上方toolbar多出
欲新增GWT project,則點擊左方藍色圓形圖示按鈕
會跳出如下視窗:

此時用以下命名當作範例程式名稱:
project name: NewProject
package name:com.example.newproject
關於下方的library勾選,由於我們是要新增GWT程式,因此上方的Use Google Web Toolkit一定要勾選之外,下方的Use Google App Engine可勾選可不勾選,在兩個Library都有勾選情況下,新增的Project仍會以GWT為主,在這邊我們選擇不勾選下方之library

ps.若您是要新增App Engine程式,則勾選下方App Engine library之外,上方的GWT library一定不能勾選

點選Finish之後,在左方package explorer會出現新增之NewProject,點開樹狀如下:

在NewProject.java點兩下開啟程式碼,除了編輯網頁Style部分可在XML、CSS、HTML檔編輯之外,要撰寫修改網頁主要內容均從這程式碼開始編輯

直接執行剛新增好的.java程式碼的原始網頁內容如下:

點擊跳出網頁上Send按紐,則會跳出一個小文字視窗,列出正在運作的App Engine版本,您在textbox輸入的字,以及您系統預設的瀏覽器名稱及版本

到此,即完成新增第一支Hello word程式

2009年6月18日 星期四

Ubuntu底下執行java的小問題


改寫了metasearch取資料部分的程式
這次了解了幾個問題

首先
改版後的程式~把一些主要的變數和程序~用static的方式宣告
這樣在執行過程中~這些變數和程序會一直在記憶體中
一方面使用上較方便~另一方面變數可以達到共用的效果

第一件了解到的事是...
之前的程式
在ubuntu server上compile時~都會因為package的關係~而產生錯誤
但這次為了達到變數共享的效果(不同類別中的程式存取同樣的變數)
package似乎不能拿掉
了解到package的功能跟C#的namespace的功能是一樣的之後
我想到~之前或許是因為我們使用的package~卻沒把程式放在同樣名稱的資料夾下
所以才會出錯..

另外
之前有研究過~在用php執行java程式時
是否能把java的程式放在同一資料夾~而正常執行
這次在無意間改寫classpath~意外的發現~是可以的

如:
java -cp .:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/mysql.jar:/home/canlab/metasearch/wjm/websource_api Main
最後一段路徑
/home/canlab/metasearch/wjm/websource_api只要指向放java程式的資料夾~似乎就可以了
但~前提似乎是在沒有使用package的情況下

最後
這次~困擾我最久的~就是以下的錯誤訊息

Exception in thread "main" java.lang.NoClassDefFoundError: Main (wrong name: testtest/Main)
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:620)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:124)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:260)
at java.net.URLClassLoader.access$000(URLClassLoader.java:56)
at java.net.URLClassLoader$1.run(URLClassLoader.java:195)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:276)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)


類似的訊息出現了不下n次
從一開始什麼都不懂~
靠著學長的教導~
才有以下使用長長的classpath的程式碼產生
java -cp .:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/mysql.jar:/home/canlab/metasearch/wjm/websource_api Main

但這次使用
package名稱websource_api的程式
無論我再怎樣改classpath~都無法讓錯誤訊息消失
看了錯誤訊息~明知道一定是classpath的問題~就是改不出來

最後
突發奇想的...改成這樣...
java -cp .:/usr/lib/jvm/java-6-sun/lib:/usr/share/java/mysql.jar:/home/canlab/metasearch/wjm/ websource_api.Main
終於可以了
雖然不是完全懂為什麼




2009年5月15日 星期五

eclipse Using JSPs

在eclipse中執行jsp
在eclipse中jsp的檔案存放在/war的資料夾下,在eclipse J2EE的版本中,eclipse在程式碼的編譯部分是使用jre,但是jre並不是用來編譯用的,因此我們要改成jdk
在Windows->Preferences->Installed JREs 再加入Jdk 1.6.0的SDK








2009年5月10日 星期日

Google PageRank





  • Google PageRank 是判斷一個網頁的價值、重要性,算是一項蠻客觀的網頁評比




  • PageRank 基於「從許多優質的網頁鏈接過來的網頁,必定還是優質網頁」的回歸關係,來判定所有網頁的重要性。



  • Google PageRank 依照網站的重要性,總共分成10級,從0~10




  • PageRank 概念



  • PageRank演算法(簡易)



o假設一個由4個頁面組成的小團體:ABC D。如果所有頁面都連向A,那麼APRPageRank)值將是BC D的和。
o
nPR(A) = PR(B) + PR(C) + PR(D)






Google的類似網頁

當在Google搜尋資料時
每筆的搜尋結果下方,會有一個"類似網頁"的連結
點下去後,他可以針對指定的網頁
找出一些跟此網頁內容相似的網頁


你可能會發現,類似網頁出來的結果沒有一定的規律。

大部分可能會認為,類似網頁所列出的結果,會是從此網頁連結出去的網頁,或是連結到此網頁的網頁。

但有時候在類似網頁中列出的網頁,既沒有連結到你的網頁,也沒從你的網頁連過去,在極端一點的情況下,兩個網站可能一點都不類似。

進一步的觀察後會發現,所謂的類似網頁,往往是和此網頁共同被第三方網頁所引用的那些網頁。

舉例來說:

指定的網頁為A,有個第三方網頁為B,在B網頁上引用了A網頁,而同時也引用了另一個C網頁,那麼對於Google來說,AC就構成了相關性,即使AC沒有直接的連結。

所以在類似網頁中的結果,也就是一個C的網頁集合,C裡的網頁構成了在A網頁周圍的一個社區,這些社區會形成一個共同的主題,而A網頁也就屬於這個共同主題。

2009年5月7日 星期四

[Ubuntu, GWT] Unable to load Mozilla for hosted mode

在Ubuntu上安裝Eclipse 及 Google Plugin for Eclipse 後,執行GWT程式會發生以下問題

** Unable to load Mozilla for hosted mode **
java.lang.UnsatisfiedLinkError: /plugins/com.google.gwt.eclipse.sdkbundle.linux_1.6.4.v200904062334/gwt-linux-1.6.4/mozilla-1.7.12/libxpcom.so: libstdc++.so.5: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1778)
以下省略

主要原因就在沒有安裝 libstdc++5(Ubuntu預設只安裝libstdc++6),
所以只要利用Synaptic套件管理程式安裝libstdc++5即可解決此問題。