其實上次的錯誤有兩個原因, 那天躺到床上時, 忽然就想到了 XD
1. 權限問題, 要用 sudo java -Djava.library.path=. JavaDHT 來執行
2. 程式碼問題, 我忘記要先呼叫 bcm2835_init()
其他不多說, 看Code就行了....
2014年4月8日 星期二
2014年4月4日 星期五
JNI 呼叫C, 由C控制 DHT11讀取溫濕度 (未完成版)
今天嘗試使用JNI 呼叫C, 由C控制 DHT11讀取溫濕度的值.
不過遇到一個奇怪的錯誤.
pi@raspberrypi ~/jni $ sudo java -Djava.library.path=. JavaDHT
DEBUG theStr--> Java_JavaDHT_readDHTfromC
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xa8cb239c, pid=2663, tid=3057022064
#
# JRE version: 7.0_21-b11
# Java VM: Java HotSpot(TM) Client VM (23.21-b01 mixed mode linux-arm )
# Problematic frame:
# C [libJavaDHT.so+0x239c] bcm2835_peri_read+0x18
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/pi/jni/hs_err_pid2663.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
這裡有個日本人也有類似問題, 不過夜深了, 明天再來研究好了
http://broadbeans.blog.so-net.ne.jp/2013-08-27
不過遇到一個奇怪的錯誤.
pi@raspberrypi ~/jni $ sudo java -Djava.library.path=. JavaDHT
DEBUG theStr--> Java_JavaDHT_readDHTfromC
#
# A fatal error has been detected by the Java Runtime Environment:
#
# SIGSEGV (0xb) at pc=0xa8cb239c, pid=2663, tid=3057022064
#
# JRE version: 7.0_21-b11
# Java VM: Java HotSpot(TM) Client VM (23.21-b01 mixed mode linux-arm )
# Problematic frame:
# C [libJavaDHT.so+0x239c] bcm2835_peri_read+0x18
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/pi/jni/hs_err_pid2663.log
#
# If you would like to submit a bug report, please visit:
# http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
這裡有個日本人也有類似問題, 不過夜深了, 明天再來研究好了
http://broadbeans.blog.so-net.ne.jp/2013-08-27
2014年4月3日 星期四
JNI Example
由於許多控制電子元件適合用Native Code來做, 於是關注了JNI 的一些功能. 不可免俗的也做了JNI 版本的 HelloWorld.
1. 首先建立要使用JNI的 JavaCallC.java 檔 以及 要被JNI呼叫的 JavaCallC.c 檔
2. 利用建立好的 JavaCallC.java 產生 JavaCallC.h
javac JavaCallC.java
javah -jni JavaCallC
3. 產生 libJavaCallC.so
gcc -shared -I /opt/java/jdk1.7.0_21/include/ -I /opt/java/jdk1.7.0_21/include/linux/ JavaCallC.c -o libJavaCallC.so
4. 執行
java -Djava.library.path=. JavaCallC
5.結果輸出
Hello world from C Language JavaCallC.c csayhello!
1. 首先建立要使用JNI的 JavaCallC.java 檔 以及 要被JNI呼叫的 JavaCallC.c 檔
2. 利用建立好的 JavaCallC.java 產生 JavaCallC.h
javac JavaCallC.java
javah -jni JavaCallC
3. 產生 libJavaCallC.so
gcc -shared -I /opt/java/jdk1.7.0_21/include/ -I /opt/java/jdk1.7.0_21/include/linux/ JavaCallC.c -o libJavaCallC.so
4. 執行
java -Djava.library.path=. JavaCallC
5.結果輸出
Hello world from C Language JavaCallC.c csayhello!
參考資料
2013年11月12日 星期二
JavaSim
前一陣子使用JavaSim做一些Simulation時候發現, 當一次要重複Simulation時, 基於SimulationProcess 的 thread 會無法釋放,進而導致Server資源的浪費.解決方法是在 finalize 函式中對 mutex 做 notify(). 其實用OpenSource 的Project 要有Debug的能力, 因為通常沒有足夠的文件或是註解可以說明, 不過爬code也是很有趣的...
org.javasim.SimulationProcess.finalize ()
另外每次Simulation調用Scheduler之後要呼叫 Scheduler.reset();才能做第二次的Simulation
2013年4月9日 星期二
Good WEB UI Framework - Vaadin
好久沒有看到讓人興奮的新技術了,趁睡不著的時候,趕快紀錄一下~
今天同事分享了 Vaadin 這個Framework,真的讓我有驚為天人的感覺。其實他的概念和之前接觸到的JSF很像,不過看了原廠和同事的Demo後覺得這個真的是不錯的Framework,開發上使用了之前Java上慣用的Swing開發方式,前台網頁和JavaScript 和 AJAX 的互動全部由後台程式產生, 對開發人員而言真的是很方便。想到之前和CSS還有JQuery 奮戰的過程,不禁讓人覺得相見恨晚阿。不過看起來這樣的架構會不會有讓美工人員不易和程式設計師分工的問題還要深入研究一下, 當然對於中小型專案影響不大。
然後重要的來了~他是採Apache V2 授權的開放原始碼專案,可以有效降低期初的投入成本,商業應用上也比較ok。
其他的部份要看完文件和實做才能深入體驗,看起來文件也蠻豐富的,又有新東西可以研究了,也是美事一樁阿~
https://vaadin.com/comparison 這個比較表很適合快速瀏覽一下他和其他framework的不同。
今天同事分享了 Vaadin 這個Framework,真的讓我有驚為天人的感覺。其實他的概念和之前接觸到的JSF很像,不過看了原廠和同事的Demo後覺得這個真的是不錯的Framework,開發上使用了之前Java上慣用的Swing開發方式,前台網頁和JavaScript 和 AJAX 的互動全部由後台程式產生, 對開發人員而言真的是很方便。想到之前和CSS還有JQuery 奮戰的過程,不禁讓人覺得相見恨晚阿。不過看起來這樣的架構會不會有讓美工人員不易和程式設計師分工的問題還要深入研究一下, 當然對於中小型專案影響不大。
然後重要的來了~他是採Apache V2 授權的開放原始碼專案,可以有效降低期初的投入成本,商業應用上也比較ok。
其他的部份要看完文件和實做才能深入體驗,看起來文件也蠻豐富的,又有新東西可以研究了,也是美事一樁阿~
https://vaadin.com/comparison 這個比較表很適合快速瀏覽一下他和其他framework的不同。
2013年1月25日 星期五
自動化模擬軟體
最近的工作內容接觸到一些生產線的分析,不過目前看起來用靜態分析方式會有蠻大的落差. 使用自動化模擬軟體可能是比較完整的解決方案。
目前業界比較有名的自動化模擬軟體如下:
Enterprise Dynamics,Flexsim,AutoMod,Arena,WITNESS
不過依照本人愛好自由軟體的精神,也找了一套Open Source的相關軟體,目前是德國漢堡大學在維護的.
DESMO-J is an object-oriented framework targeted at programmers developing simulation models. The acronym "DESMO-J" stands for "Discrete-Event Simulation and Modelling in Java". This longer name highlights DESMO-J's two significant properties:
DESMO-J supports the discrete-event simulation paradigm. In models of this type, all system state changes are supposed to happen at discrete points in time. Between such events the system state is assumed to remain constant. Discrete-event simulation is therefore particularly suitable for systems in which relevant changes of state occur suddenly and irregularly, like queueing networks for example.
DESMO-J is implemented in Java. Using this framework to build simulation models ultimately results in writing a Java program.
還有另一套用GPL 授權的 JSL(Java Simulation Library) https://bitbucket.org/rossetti/jsl/overview
真的要玩再來研究一下....
不過簡單的分析可以透過用程式語言的分散式架構配合多執行緒直接Coding, 目前在想有必要作到這個程度嗎...
https://bitbucket.org/rossetti/jsl/overview
目前業界比較有名的自動化模擬軟體如下:
Enterprise Dynamics,Flexsim,AutoMod,Arena,WITNESS
不過依照本人愛好自由軟體的精神,也找了一套Open Source的相關軟體,目前是德國漢堡大學在維護的.
DESMO-J is an object-oriented framework targeted at programmers developing simulation models. The acronym "DESMO-J" stands for "Discrete-Event Simulation and Modelling in Java". This longer name highlights DESMO-J's two significant properties:
DESMO-J supports the discrete-event simulation paradigm. In models of this type, all system state changes are supposed to happen at discrete points in time. Between such events the system state is assumed to remain constant. Discrete-event simulation is therefore particularly suitable for systems in which relevant changes of state occur suddenly and irregularly, like queueing networks for example.
DESMO-J is implemented in Java. Using this framework to build simulation models ultimately results in writing a Java program.
還有另一套用GPL 授權的 JSL(Java Simulation Library) https://bitbucket.org/rossetti/jsl/overview
真的要玩再來研究一下....
不過簡單的分析可以透過用程式語言的分散式架構配合多執行緒直接Coding, 目前在想有必要作到這個程度嗎...
https://bitbucket.org/rossetti/jsl/overview
2012年7月5日 星期四
安裝Hadoop 1.0.2 在Ubuntu 11
安裝Hadoop的部份還蠻簡單的,照著網路上的文章就可以成功了
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
http://changyy.pixnet.net/blog/post/25245658-%5Blinux%5D-%E5%AE%89%E8%A3%9D%E5%96%AE%E6%A9%9F%E7%89%88-hadoop-0.20.1-single-node-cluster-(p
這部份沒有特別要注意的,接下來要測試Hadoop的功能以及實做多節點的Cluster
http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/
http://changyy.pixnet.net/blog/post/25245658-%5Blinux%5D-%E5%AE%89%E8%A3%9D%E5%96%AE%E6%A9%9F%E7%89%88-hadoop-0.20.1-single-node-cluster-(p
這部份沒有特別要注意的,接下來要測試Hadoop的功能以及實做多節點的Cluster
2011年11月25日 星期五
Siena 全文檢索的問題
最近使用Play! + Siena + GAE 時發現,作類似SQL Like 的Search 時,會傳回所有的資料...
在Stackoverflow 中的討論發現,Siena 由於GAE的限制,在這方面的實做有限...
http://stackoverflow.com/questions/6307841/how-does-siena-query-search-work
也就是支援文字完全相同的和結尾字串相同的比對...真的很雞肋...
就算使用JDBC也必須先手動建立Full text index...
所以看來還是JPA比較有彈性...
在Stackoverflow 中的討論發現,Siena 由於GAE的限制,在這方面的實做有限...
http://stackoverflow.com/questions/6307841/how-does-siena-query-search-work
也就是支援文字完全相同的和結尾字串相同的比對...真的很雞肋...
就算使用JDBC也必須先手動建立Full text index...
所以看來還是JPA比較有彈性...
2011年6月26日 星期日
Play Framework 實驗筆記 3- Basic Data Operation
這篇文章將實做第一個資料庫互動的範例。
主要是針對Member 作所謂的 Add, Delete, Inquiry, Update. 並將所有動作整合到同一個頁面。
1. Controller
新增BasicMemberOperation.java 在對應的目錄下,這個是要當Controller用的,網頁的每一個動作都對應到Controller裡面的某個method。 最後透過Index呼叫PlayFramework作render。
N:\PlayFramework\play-1.1\members\app\controllers\BasicMemberOperation.java
N:\PlayFramework\play-1.1\members\app\views\BasicMemberOperation\index.html
Model 的部份請參照第一篇,將資料物件相關的檔案放到N:\PlayFramework\play-1.1\members\app\models下
4. 執行專案
執行以下命令 N:\PlayFramework\play-1.1>play run members 之後直接用瀏覽器開啟 http://127.0.0.1:9000/basicmemberoperation/index 便可以進行操作
主要是針對Member 作所謂的 Add, Delete, Inquiry, Update. 並將所有動作整合到同一個頁面。
1. Controller
新增BasicMemberOperation.java 在對應的目錄下,這個是要當Controller用的,網頁的每一個動作都對應到Controller裡面的某個method。 最後透過Index呼叫PlayFramework作render。
N:\PlayFramework\play-1.1\members\app\controllers\BasicMemberOperation.java
package controllers; import java.util.List; import models.Member; import models.MemberCard; import play.data.validation.Required; import play.mvc.Controller; public class BasicMemberOperation extends Controller { public static void index() { List2.Viewmembers = Member.getall(); // get all member data render(members); } //將選取的資料傳回表單 public static void getDataForEdit(Long id) { Member member = Member.findById(id); notFoundIfNull(member); flash.put("id", member.id); flash.put("firstName", member.firstName); flash.put("lastName", member.lastName); flash.put("email", member.email); index(); } //delete member public static void delete(Long id) { Member member = Member.findById(id); notFoundIfNull(member); member.delete(); flash.success("The member %s has been deleted", member.firstName ); index(); } //add or edit member public static void addOrEdit(long id,@Required String firstName,@Required String lastName , @Required String email) { if(validation.hasErrors()) { params.flash(); // add http parameters to the flash scope validation.keep(); // keep the errors for the next request index(); } if (id == 0){ //no id, add member new Member(firstName,lastName,0,email).insert(); }else{ // have id, edit member Member member = Member.findById(id); member.firstName = firstName; member.lastName = lastName; member.email = email; member.update(); } index(); } //產生測試資料 public static void genData() { int count = 10; for (int i=1;i<=count;i++){ Member theMember = new Member("FirstName"+i,"lastName"+i,0,"email"+i); theMember.insert(); for (int j=1;j<=20;j++){ MemberCard theCard = new MemberCard("NO:"+i+j,theMember); theCard.startDate = new java.util.Date(); theCard.insert(); System.out.println("NO:"+i+j); } } flash.success("The member has been deleted, row=%s", count); index(); } //清空測試資料 public static void removeAllData() { int count = Member.all().delete(); for (Member m: Member.all().fetch()) m.delete(); flash.success("The member has been deleted, row=%s", count); index(); } }
N:\PlayFramework\play-1.1\members\app\views\BasicMemberOperation\index.html
#{extends 'main.html' /} #{set title:'Home' /} <h2> #{a @BasicMemberOperation.genData()}<b>Create Test Data</b>#{/a} <BR> #{a @BasicMemberOperation.removeAllData()}<b>Remove all Data</b>#{/a} </h2> <hr> #{form @BasicMemberOperation.addOrEdit()} <p> <input type="hidden" name="id" id="id" size="60" value="${flash.id}"/> Member First Name <input type="text" name="firstName" id="firstName" size="20" value="${flash.firstName}"/> <span class="error">#{error 'firstName' /}</span> <BR> Member Last Name <input type="text" name="lastName" id="lastName" size="20" value="${flash.lastName}"/> <span class="error">#{error 'lastName' /}</span> <BR> Member Email <input type="text" name="email" id="email" size="40" value="${flash.email}"/> <span class="error">#{error 'email' /}</span> </p> <p> #{if flash.id == null} <input type="submit" value="ADD Data"> #{/if} #{else} <input type="submit" value="SAVE"> #{/else} </p> #{/form} <hr> <h2>All Member List</h2> #{if members.size() > 0} <table BORDER=1> <tr > <td><b>Member First Name</b></td> <td><b>Member Last Name</b></td> <td><b>Member Email</b></td> <td><b>Action</b></td> </tr> #{list items:members, as:'members'} <tr> <td>${members.firstName} </td> <td>${members.lastName}</td> <td>${members.email}</td> <td> #{a @BasicMemberOperation.getDataForEdit(members.id)}Edit#{/a} #{a @BasicMemberOperation.delete(members.id)}Delete#{/a} </td> </tr> #{/list} </table> #{/if} #{else} <div class="empty"> There is currently nothing to show here. </div> #{/else}3. Model
Model 的部份請參照第一篇,將資料物件相關的檔案放到N:\PlayFramework\play-1.1\members\app\models下
4. 執行專案
執行以下命令 N:\PlayFramework\play-1.1>play run members 之後直接用瀏覽器開啟 http://127.0.0.1:9000/basicmemberoperation/index 便可以進行操作
2011年6月24日 星期五
Play Framework 實驗筆記 2- Play! Framework 環境設定
1. 安裝
這個部份比較簡單,大部分資訊網路上都有。Google 一下就有了~~
Source由官網 http://www.playframework.org/download 下載 play-1.1.zip 直接解壓後就可以使用
2. 建立專案
3. 安裝Plugin for PlayFramework
3.1. SIENA
3.2. GAE
記得加入這兩行,到 N:\PlayFramework\play-1.1\member1\conf\application.conf
module.gae=${play.path}/modules/gae-1.4
module.siena=${play.path}/modules/siena-1.5
4. 將專案匯出到eclipse
這個三不五時可以作一次,例如你新增module 到你的application.conf 後,記得重新匯出到eclipse,這樣相關的lib才會載入到eclipse project
5. 啟動專案
看到以下的圖片,代表專案已經正常執行
這個部份比較簡單,大部分資訊網路上都有。Google 一下就有了~~
Source由官網 http://www.playframework.org/download 下載 play-1.1.zip 直接解壓後就可以使用
2. 建立專案
N:\PlayFramework\play-1.1>play new members N:\PlayFramework\play-1.1>"N:\PlayFramework\play-1.1\python\python.exe" "N:\Play Framework\play-1.1\play" new members ~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.1, http://www.playframework.org ~ ~ The new application will be created in N:\PlayFramework\play-1.1\members ~ What is the application name? [members] ~ ~ OK, the application is created. ~ Start it with : play run members ~ Have fun! ~ N:\PlayFramework\play-1.1>
3. 安裝Plugin for PlayFramework
3.1. SIENA
package models; N:\PlayFramework\play-1.1>play install siena N:\PlayFramework\play-1.1>"N:\PlayFramework\play-1.1\python\python.exe" "N:\Play Framework\play-1.1\play" install siena ~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.1, http://www.playframework.org ~ ~ Will install siena-1.5 ~ This module is compatible with: 1.1 ~ Do you want to install this version (y/n)? y ~ Installing module siena-1.5... ~ ~ Fetching http://www.playframework.org/modules/siena-1.5.zip ~ [--------------------------100%-------------------------] 32.9 KiB/s ~ Unzipping... ~ ~ Module siena-1.5 is installed! ~ You can now use it by add adding this line to application.conf file: ~ ~ module.siena=${play.path}/modules/siena-1.5 ~
3.2. GAE
package models; N:\PlayFramework\play-1.1>play install gae N:\PlayFramework\play-1.1>"N:\PlayFramework\play-1.1\python\python.exe" "N:\Play Framework\play-1.1\play" install gae ~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.1, http://www.playframework.org ~ ~ Will install gae-1.4 ~ This module is compatible with: 1.1, and GAE 1.4.0 ~ Do you want to install this version (y/n)? y ~ Installing module gae-1.4... ~ ~ Fetching http://www.playframework.org/modules/gae-1.4.zip ~ [--------------------------100%-------------------------] 32.9 KiB/s ~ Unzipping... ~ ~ Module gae-1.4 is installed! ~ You can now use it by add adding this line to application.conf file: ~ ~ module.siena=${play.path}/modules/gae-1.4 ~
記得加入這兩行,到 N:\PlayFramework\play-1.1\member1\conf\application.conf
module.gae=${play.path}/modules/gae-1.4
module.siena=${play.path}/modules/siena-1.5
4. 將專案匯出到eclipse
這個三不五時可以作一次,例如你新增module 到你的application.conf 後,記得重新匯出到eclipse,這樣相關的lib才會載入到eclipse project
package models; N:\PlayFramework\play-1.1>play eclipsify members N:\PlayFramework\play-1.1>"N:\PlayFramework\play-1.1\python\python.exe" "N:\Play Framework\play-1.1\play" eclipsify members ~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.1, http://www.playframework.org ~ ~ OK, the application is ready for eclipse ~ Use File/Import/General/Existing project to import N:\PlayFramework\play-1.1\m embers into eclipse ~ ~ Use eclipsify again when you want to update eclipse configuration files. ~ However, it's often better to delete and re-import the project into your works pace since eclipse keeps dirty caches... ~然後開啟Eclipse 之後,用File下面的 Import,選擇 General/Existing project 後到指定路徑就可以Import 專案。
5. 啟動專案
package models; N:\PlayFramework\play-1.1>play run members N:\PlayFramework\play-1.1>"N:\PlayFramework\play-1.1\python\python.exe" "N:\Play Framework\play-1.1\play" run members ~ _ _ ~ _ __ | | __ _ _ _| | ~ | '_ \| |/ _' | || |_| ~ | __/|_|\____|\__ (_) ~ |_| |__/ ~ ~ play! 1.1, http://www.playframework.org ~ ~ Ctrl+C to stop ~ Listening for transport dt_socket at address: 8000 23:09:07,000 INFO ~ Starting N:\PlayFramework\play-1.1\members 23:09:08,515 WARN ~ You're running Play! in DEV mode 23:09:09,468 INFO ~ Listening for HTTP on port 9000 (Waiting a first request to start) ...6. 開啟瀏覽器,並連線到 http://127.0.0.1:9000/
看到以下的圖片,代表專案已經正常執行
2011年6月14日 星期二
Play Framework 實驗筆記 1- Data persitence API
首先先從資料物件開始介紹~
關於 Data persitence API,由於考慮到使用雲端服務(ex.GAE)所以找了一下支援的API,發現Siena還不錯,所以先拿來試試看。
目前觀察到Siena 有以下特性:
1. 容易上手,設計也很直覺
2. 同時支援兩大雲端服務
3. 支援目前所有熱門的關聯式資料庫 (採用Apache DdlUtils)
以下是關於Siena Project 的說明
Siena is a single API with many implementations. You can use siena with relational databases, with the Google App Engine's datastore or with Amazon's SimpleDB. There is also an implementation called siena-remote very useful if you want to use the Google App Engine's datastore remotely. Other implmenetations are planned such as: HBase, DBSLayer,...
Siena is Open Source and is released under the Apache License 2.0.
這個範例中會用到兩個資料物件,分別是Member 和 MemberCard,兩者的關係是一個Member會有多張MemberCard(也就是一對多的關係)。下面貼出範例的程式碼供參考:
Member.java
MemberCard.java
關於 Data persitence API,由於考慮到使用雲端服務(ex.GAE)所以找了一下支援的API,發現Siena還不錯,所以先拿來試試看。
目前觀察到Siena 有以下特性:
1. 容易上手,設計也很直覺
2. 同時支援兩大雲端服務
3. 支援目前所有熱門的關聯式資料庫 (採用Apache DdlUtils)
以下是關於Siena Project 的說明
Siena is a single API with many implementations. You can use siena with relational databases, with the Google App Engine's datastore or with Amazon's SimpleDB. There is also an implementation called siena-remote very useful if you want to use the Google App Engine's datastore remotely. Other implmenetations are planned such as: HBase, DBSLayer,...
Siena is Open Source and is released under the Apache License 2.0.
這個範例中會用到兩個資料物件,分別是Member 和 MemberCard,兩者的關係是一個Member會有多張MemberCard(也就是一對多的關係)。下面貼出範例的程式碼供參考:
Member.java
package models; import java.util.*; import siena.*; public class Member extends Model{ @Id(Generator.AUTO_INCREMENT) public Long id; @Column("first_name") public String firstName; @Column("last_name") public String lastName; @Column("gender") public Integer gender; @Column("email") public String email; public Member(String firstName, String lastName, int gender, String email) { this.firstName = firstName; this.lastName = lastName; this.gender = gender; this.email = email; } public static Query<Member> all() { return Model.all(Member.class); } public static List<Member> getall() { return all().fetch(); } public static Member findById(Long id) { return all().filter("id", id).get(); } public static Query<MemberCard> findByMember(Long id) { Member theMember= all().filter("id", id).get(); Query<MemberCard> cards = MemberCard.all().filter("member", theMember); return cards; } }
MemberCard.java
package models; import java.util.Date; import java.util.List; import javax.persistence.CascadeType; import javax.persistence.OneToMany; import siena.Column; import siena.Generator; import siena.Id; import siena.Model; import siena.Query; public class MemberCard extends Model { @Id @Column("cardID") public String cardID; @Column("StartDate") public Date startDate; @Column("endDate") public Date endDate; @Column("member") public Member member; public MemberCard(String cardID) { this.cardID = cardID; } public MemberCard(String cardID, Member member) { this.cardID = cardID; this.member = member; } public static Query<MemberCard> all() { return Model.all(MemberCard.class); } public static List<MemberCard> getall() { return all().fetch(); } public static MemberCard findById(String cardID) { return all().filter("cardID", cardID).get(); } }
2010年12月21日 星期二
Web presentation technology
剛剛找了一下關於 Web presentation technology 的資料,果然還是Ajax 為主。
有一些不錯的先記錄一下,有空再深入研究...
datatables http://www.datatables.net/
qooxdoo http://qooxdoo.org/
JqGrid http://www.trirand.com/blog/
SmartGWT http://code.google.com/p/smartgwt/
2010年8月21日 星期六
Web application frameworks

記得剛到園區工作時,就有在開發Java Framework. 不過當時還是以Application 為主流。雖然小弟當時有提出要往Web Application 的方向開發,也實做了一個可以由Template 產生JSP 的Framework 不過當時Web的應用和互動性都是很大的問題,光要相容IE and 非IE 的瀏覽器就搞倒吐血了。
時過境遷,現在回頭來看 Web application 倒是已經成為主流,互動性和實用性都大大的超越以前的Application。剛好同事介紹一個 Play! Framework 按照他的範例做了一下,發現真的不錯~對有經驗的開發者而言,可以節省不少程式碼上的Dirty work.
看來有空的話,要來進一步瞭解這個Framework 的特性...
附上 Web application frameworks 的比較表,可以大概瞭解一下
2010年5月25日 星期二
Tomcat 6 DBCP 斷線的問題
這個困擾了我好久,主要的問題是DBCP中的連線閒置一段時間後,程式呼叫會出現錯誤。
解決方案是...加 validationQuery 在 context.xml。看一下下面的範例...
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource"
maxActive="50" maxIdle="30" maxWait="10000"
username="root" password="12345" driverClassName="com.mysql.jdbc.Driver"
validationQuery="SELECT * from student"
url="jdbc:mysql://127.0.0.1:3306/student?autoReconnect=true"/>
</Context>
細節這裡有講到
2010年3月27日 星期六
SSH Tunneling with Java
For my project, I need a SSH Tunneling for database connection.
After google a bit. I found JSch. Maybe I can try to use this.
But I don't know why I can't connect to http://www.jcraft.com/jsch/ now.
By the way, we can just use plink in windows.
JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license.
After google a bit. I found JSch. Maybe I can try to use this.
But I don't know why I can't connect to http://www.jcraft.com/jsch/ now.
By the way, we can just use plink in windows.
JSch is a pure Java implementation of SSH2.
JSch allows you to connect to an sshd server and use port forwarding, X11 forwarding, file transfer, etc., and you can integrate its functionality into your own Java programs. JSch is licensed under BSD style license.
2009年3月4日 星期三
由外部讀取 properties 檔案的範例
這是之前朋友問我的問題,給自己備忘一下
package com.acs.test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class readProperties {
  public static void main(String[] args) {
    // 由程式的class path 讀取properties 檔案 (ex.art.properties)
    ClassLoader classLoader = ClassLoader.getSystemClassLoader();
    InputStream is = classLoader.getResourceAsStream("art.properties");
    Properties theProperties = new Properties();
    try {
      theProperties.load(is);
      System.out.println(theProperties.getProperty("foo"));
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
  }
}
2008年12月8日 星期一
Java Web Start 無法在桌面建立捷徑的問題

最近遇到這個超怪的問題,在某些電腦環境就是無法在桌面建立捷徑。
老是怪電腦卡到陰也不是辦法,所以手動做了一些修改,竟然也Work了...
Problem:
Run Application之後無法在桌面建立捷徑。
由於Application指定要Run在1.6.0_06版本的JRE上,應該是系統原先裝的是1.6.0_03版本的JRE有問題?
C:\Documents and Settings\Administrator>java -version
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Client VM (build 1.6.0_03-b05, mixed mode, sharing)
Solution:
1.先由網頁正常執行Application,讓相關的檔案先Cache到local pc上。
2.當然不知道為啥,捷徑建不起來。
3.開個CMD視窗,執行Java cache viewer
javaws -viewer
4.在Application 上按右鍵,選"安裝捷徑"
5.在桌面上出現的捷徑上按右鍵,選內容
6.強迫桌面捷徑使用Application定義的Java 版本
原本是這樣
C:\WINDOWS\system32\javaws.exe "C:\Documents and Settings\Administrator\Application Data\Sun\Java\Deployment\cache\6.0\46\4ec93a6e-3328441a"
改成
C:\jre\jre1.6.0_06\bin\javaws.exe "C:\Documents and Settings\Administrator\Application Data\Sun\Java\Deployment\cache\6.0\46\4ec93a6e-3328441a"
7.然後記得改桌面捷徑的名字,以免又被JAVA 刪掉
20081209 Update
其實終極的解決方案是完全移除系統原先裝的JRE,然後只裝Application指定的JRE就好了。或是重裝OS~哈哈。(感謝好友Michael提供)
另外要是Application指定的JRE在Program Files 下面,記得加引號 ex. "C:\Program Files\Java\j2re1.4.2_11\bin\javaws"。(感謝好友Silver提供)
2008年10月2日 星期四
手動指定IE執行Java Web Start的版本
之前遇到一些問題,就是有的電腦安裝了新版的JRE之後,沒辦法用IE 執行需要特定Java版本的Jnlp。簡單的說就是Java Web Start出包了... 一般還是建議User自己把新版的JRE移除,不過這個改法有時比較方便。
一般我會先試著修改IE的設定,強迫關聯Jnlp到特定Java版本看看,以下是修改方式 :
1.選擇資料夾選項

2.找到JNLP這個檔案類型,然後按進階。

3.點選編輯

4.然後手動修改應用程式的路徑 (那個雙引號要留著阿!)
原先是執行jre1.6.0_05
"C:\Program Files\Java\jre1.6.0_05\bin\javaws.exe" "%1"
手動改為執行j2re1.4.2_11
"C:\Program Files\Java\j2re1.4.2_11\javaws\javaws.exe" "%1"
一般我會先試著修改IE的設定,強迫關聯Jnlp到特定Java版本看看,以下是修改方式 :
1.選擇資料夾選項

2.找到JNLP這個檔案類型,然後按進階。

3.點選編輯

4.然後手動修改應用程式的路徑 (那個雙引號要留著阿!)
原先是執行jre1.6.0_05
"C:\Program Files\Java\jre1.6.0_05\bin\javaws.exe" "%1"
手動改為執行j2re1.4.2_11
"C:\Program Files\Java\j2re1.4.2_11\javaws\javaws.exe" "%1"

2007年2月15日 星期四
在Oracle中處理 用Java System.currentTimeMillis() 儲存的資料
為了系統的需求,資料需紀錄到毫秒(Millisecond),所以我們會將System.currentTimeMillis() 取得的值寫入db的systemdate欄位,但是如果要用SQL 做時間範圍的搜尋,有以下做法
( systemdate欄位存放System.currentTimeMillis() 取得的值)
( systemdate欄位存放System.currentTimeMillis() 取得的值)
--找出myTable資料表中 systemdate欄位 在 2006/11/28 14:00:00 ~ 14:10:00 的資料 select * from myTable where systemdate >= (to_date('20061128 14:00:00','YYYYMMDD hh24:mi:ss') - to_date('19700101 8:00:00','YYYYMMDD hh24:mi:ss'))*1000*60*60*24 and systemdate <= (to_date('20061128 14:10:00','YYYYMMDD hh24:mi:ss') - to_date('19700101 8:00:00','YYYYMMDD hh24:mi:ss'))*1000*60*60*24
--找出myTable資料表中日期最小的時間 select to_date('19700101 8:00:00','YYYYMMDD hh24:mi:ss') + ((select min(SYSTEMDATE) from myTable )/1000/60/60/24) from dual
訂閱:
文章 (Atom)