你會不會常常覺得自己是…
生錯時代,
生錯國家,
亦或生錯星球,XD
Amazon Ads
2014年12月24日 星期三
【筆記】解決在VirtualBox中安裝Ubuntu14.04後,無法調整螢幕解析度的問題
今天在Windows 8.1上,使用VirtualBox安裝Ubuntu 14.04後,發現要調整螢幕解析度時,只有640 X 480這一個選項:
後來找到這一篇討論,好像是在Ubuntu 14.04後的版本,要再安裝幾個客戶端的套件:
所以先打関終端機後,輸下列指令:
輸入完成後重新啟動,應該就可以看到VirtualBox中的作業系統視窗不再是小小一塊,而且進入系統設定後,也可以看到解析度有其他選項可以選擇:
參考資料
後來找到這一篇討論,好像是在Ubuntu 14.04後的版本,要再安裝幾個客戶端的套件:
- virtualbox-guest-dkms
- virtualbox-guest-utils
- virtualbox-guest-x11
所以先打関終端機後,輸下列指令:
sudo apt-get install virtualbox-guest-dkms \ virtualbox-guest-utils \ virtualbox-guest-x11其中,
\
是表示換行的意思,實際上可以在一行中輸入所以指令。
輸入完成後重新啟動,應該就可以看到VirtualBox中的作業系統視窗不再是小小一塊,而且進入系統設定後,也可以看到解析度有其他選項可以選擇:
參考資料
Labels:
Ubuntu,
VirtualBox
2014年12月14日 星期日
【分享】在Java List中,使用元素(物件)的屬性來排序
你一定在某個時候,曾經把一堆物件放到
如下面的
回到我的例子,若要讓
依不一樣的需求,可以依所需要的邏輯去實作,詳細的說明可以參考compareTo。
再來我就可以寫個程式來驗證我的實作:
List
後,還需要依物件的某個屬性來做排序。如下面的
theStudents
變數裡面放了一堆Student
類別的物件,還要依每個學生的分數來做降冪排列:
Student student1 = new Student(1, "Mark", 90); Student student2 = new Student(2, "Tom", 58); Student student3 = new Student(3, "Shine", 70); Student student4 = new Student(4, "Kelly", 88); Student student5 = new Student(5, "Mark", 60); List<Student> theStudents = Arrays.asList(student1, student2, student3, student4, student5);要達到上列的要求,我可以用
java.util.Collections
類別中的sort(java.util.List)
這個方法來實現,但在Java Doc中有提到,傳入該方法的List
物件,其中包含的元件需要支援排序,在實作上要讓其中的元素實作Comparable介面。回到我的例子,若要讓
Student
類別可以依分收排序,就要讓Student
類別實作Comparable介面,並在compareTo中去實作分數比較的邏輯:
package idv.jk.model; public class Student implements Comparable<Student> { public Student(int id, String name, int score) { super(); this.id = id; this.name = name; this.score = score; } private int id; private String name; private int score; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getScore() { return score; } public void setScore(int score) { this.score = score; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", score=" + score + "]"; } @Override public int compareTo(Student student) { return this.getScore() <= student.getScore() ? 1 : -1; } }在
public int compareTo(Student student)
回傳「1」可以想成此物件和其他Student
物件比較時,若分數比較小,會往後排;若是回傳「-1」,即分數比較大,則會往前排,達到我要依分數做降冪排列的需求。
依不一樣的需求,可以依所需要的邏輯去實作,詳細的說明可以參考compareTo。
再來我就可以寫個程式來驗證我的實作:
package idv.jk.test; import java.util.Arrays; import java.util.Collections; import java.util.List; import idv.jk.model.Student; public class SortStudentMain { public static void main(String args[]) { Student student1 = new Student(1, "Mark", 90); Student student2 = new Student(2, "Tom", 58); Student student3 = new Student(3, "Shine", 70); Student student4 = new Student(4, "Kelly", 88); Student student5 = new Student(5, "Mark", 60); List<Student> theStudents = Arrays.asList(student1, student2, student3, student4, student5); System.out.println("排序前:"); for(Student s : theStudents) { System.out.println(s); } Collections.sort(theStudents); System.out.println("排序後:"); for(Student s : theStudents) { System.out.println(s); } } }執行列出排序前和排序後的結果為:
排序前: Student [id=1, name=Mark, score=90] Student [id=2, name=Tom, score=58] Student [id=3, name=Shine, score=70] Student [id=4, name=Kelly, score=88] Student [id=5, name=Mark, score=60] 排序後: Student [id=1, name=Mark, score=90] Student [id=4, name=Kelly, score=88] Student [id=3, name=Shine, score=70] Student [id=5, name=Mark, score=60] Student [id=2, name=Tom, score=58]
Labels:
Java
2014年12月11日 星期四
【筆記】在vim中做多行編輯、刪除、插入
我一直認為多行編輯,是一個強大的編輯器會有的功能,於是我猜像Vim這麼強大的編輯器也一定會有,用Google搜尋了一下,果真被我找到了這篇。
首先開啟一個要編輯的檔案,內容如下:
現在我要把月份「12」改成「01」,第一步就是要把其中月份的「2」給刪掉。
Ctrl+v做區塊選取,按下後,在最下方會顯示「區塊選擇」或「VISUAL BLOCK」,這時可以方向鍵上、下、左、右來反白要編輯的區塊:
再來就是按下d做刪除:
以上,是在Vim中刪除多行的作法,若是要一次複製多行,在區塊反白後再按y就可以複製多行。
再來,我要在月份「1」之前補上一個「0」,先用Ctrl+v做區塊選取把「1」那一行選取起來後,按Shift+i,再輸入要新增的字串,這裡輸入「0」:
重要的來了,在輸入新增的部份後,立刻再按一下Esc鍵,等約一秒後,新增的部份,就會出現在剛有反白的資料行中:
這樣下來好像比其他編輯器麻煩!?但不這樣子使用,那會顯出使用Vim的強呢,XD
參考資料
首先開啟一個要編輯的檔案,內容如下:
現在我要把月份「12」改成「01」,第一步就是要把其中月份的「2」給刪掉。
Ctrl+v做區塊選取,按下後,在最下方會顯示「區塊選擇」或「VISUAL BLOCK」,這時可以方向鍵上、下、左、右來反白要編輯的區塊:
再來就是按下d做刪除:
以上,是在Vim中刪除多行的作法,若是要一次複製多行,在區塊反白後再按y就可以複製多行。
再來,我要在月份「1」之前補上一個「0」,先用Ctrl+v做區塊選取把「1」那一行選取起來後,按Shift+i,再輸入要新增的字串,這裡輸入「0」:
重要的來了,在輸入新增的部份後,立刻再按一下Esc鍵,等約一秒後,新增的部份,就會出現在剛有反白的資料行中:
這樣下來好像比其他編輯器麻煩!?但不這樣子使用,那會顯出使用Vim的強呢,XD
參考資料
Labels:
vim
2014年12月7日 星期日
【筆記】在Linux中使用wget下載jdk
若去過Oracle下載過Java Development Kit等的人應該都知道,大部份的下載,在可以下載前,都被要求要點【Accept License Agreement】這個選項後才能進行:
這個要求在使用瀏覽器的情況下,相信不會造成困擾,但若是在終端機中操作時,直接使用
看起來應該是沒有點【Accept License Agreement】的關係,但沒有介面如何選呢?XD
還好找到了這篇,說明只要搭配
上列的
下載回來的檔案即可以正常地解壓縮後使用了。
這個要求在使用瀏覽器的情況下,相信不會造成困擾,但若是在終端機中操作時,直接使用
wget
直接加上下載連結下載時,結果的確讓人一時不知所措,下載回來的檔案竟然這麼小:看起來應該是沒有點【Accept License Agreement】的關係,但沒有介面如何選呢?XD
還好找到了這篇,說明只要搭配
wget
指令的一些參數,帶著header
送出請求,也可輕鬆把Java Development Kit下載回來,以下我以Java SE Development Kit 7u71這一版為範例進行下載。wget --no-cookies \ --no-check-certificate \ --header "Cookie: oraclelicense=accept-securebackup-cookie" \ "http://download.oracle.com/otn-pub/java/jdk/7u71-b14/jdk-7u71-linux-x64.tar.gz" \ -O jdk-7u71-linux-x64.tar.gz
上列的
--no-cookies
表示「不要使用cookie」,--no-check-certificate
表示「不使用伺服器的憑證」,以及-O
表示「要儲存的檔案路徑」,這些參數可以在終端機中下wget --help
來檢視意義和用法。
下載回來的檔案即可以正常地解壓縮後使用了。
2014年12月3日 星期三
【分享】解決VirtualBox執行時發生This kernel requires an x86-64 cpu but only detected an i686 cpu的問題
先說我的電腦是Sony VAIO,型號為SVS13AB1GP的筆電,所以有些人遇到的情況會和我不一樣。
在開啟VirtualBox啟動虛擬機器後,竟然出現下面的錯誤訊息:
想想應該是BIOS中設定沒開的緣故,但要進Sony VAIO的BIOS就花了我很多時間,後來終於發現,要在關機的狀態下,按下F12上面的Assist鍵,就會進入救援模式,在這模式下會有選項(或按下F2)進入BIOS。
進入BIOS後,切換到【Advanced】頁籤,找到【Intel(R) Virtualization Technology】後,把【Disabled】改成【Enabled】,儲存後離閞即可,如下:
另外,本來在我的筆電安裝VMWare Player後,每每在啟動虛擬機器後,VMWare Player就會自己關閉,後來發現也是【Intel(R) Virtualization Technology】沒有打開的綠故。
在開啟VirtualBox啟動虛擬機器後,竟然出現下面的錯誤訊息:
想想應該是BIOS中設定沒開的緣故,但要進Sony VAIO的BIOS就花了我很多時間,後來終於發現,要在關機的狀態下,按下F12上面的Assist鍵,就會進入救援模式,在這模式下會有選項(或按下F2)進入BIOS。
進入BIOS後,切換到【Advanced】頁籤,找到【Intel(R) Virtualization Technology】後,把【Disabled】改成【Enabled】,儲存後離閞即可,如下:
另外,本來在我的筆電安裝VMWare Player後,每每在啟動虛擬機器後,VMWare Player就會自己關閉,後來發現也是【Intel(R) Virtualization Technology】沒有打開的綠故。
【筆記】使用Freemake Video Converter來合併影片
有時候我會想把好幾個影片檔合成一個檔案播放,這時,使用Freemake Video Converter只要幾個步驟即可做到。
開啟Freemake Video Converter後,先點按【視訊】來加入要合併的影片檔:
你可以在選擇檔案時,一次選擇多個影片檔一起加入:
若加入的影片在拍攝時的方向是倒的,可點按紅框內所示的按鈕來調整方向:
再來選取右上方的【結合檔案】為【ON】,這時,畫面就會變成下面有階層的樣子:
如上面的下拉選單,這時候可以選擇要不要有轉場效果,若選擇【淡化轉場】,則當要進入下一個影片時,會有一小段前面影片的淡化效果。
最後,再點按下面的轉檔鈕轉成要的格式就完成了。
開啟Freemake Video Converter後,先點按【視訊】來加入要合併的影片檔:
你可以在選擇檔案時,一次選擇多個影片檔一起加入:
若加入的影片在拍攝時的方向是倒的,可點按紅框內所示的按鈕來調整方向:
再來選取右上方的【結合檔案】為【ON】,這時,畫面就會變成下面有階層的樣子:
如上面的下拉選單,這時候可以選擇要不要有轉場效果,若選擇【淡化轉場】,則當要進入下一個影片時,會有一小段前面影片的淡化效果。
最後,再點按下面的轉檔鈕轉成要的格式就完成了。
Labels:
小工具,
影片處理,
Free Video Converter
2014年12月2日 星期二
2014年12月1日 星期一
【筆記】使用MySQL指令來匯入本機檔案到資料庫
現在我們有一個純文字檔,裡面有三筆使用者的資料,我們要匯入到USER資料表中,資料如下:
你可以對這篇文章有興趣:【筆記】使用MySQL指令來匯出資料。
3,Tom,30000 4,Peggy,25000 5,Hurry,35500在Terminal中,先使用下列指令登入mysql:
$ mysql --host=localhost -u root --local-infile=1 -p jpa其中要注意的是
--local-infile
這個參數,在指令說明中描述如下:--local-infile Enable/disable LOAD DATA LOCAL INFILE.將他設為
1
可以讓我們匯入本機的檔案。
mysql> LOAD DATA LOCAL INFILE '/home/bio/temp/user_import.txt' INTO TABLE user FIELDS TERMINATED BY ',';若匯入成功,會顯示下列訊息:
Query OK, 3 rows affected (0.02 sec) Records: 3 Deleted: 0 Skipped: 0 Warnings: 0檢視匯入的資料:
你可以對這篇文章有興趣:【筆記】使用MySQL指令來匯出資料。
Labels:
MySQL
【筆記】使用MySQL指令來匯出資料
最近我發現若使用指示來匯出MySQL中的資料非常方便,尤其是在某些情境下,沒有UI工具可以使用時。
在這裡,來看一下,如何在Ubuntu環境中,使用指示來匯出資料,這些參數在Windows環境中一樣適用。
這裡我使用一個名為「USER」的資料表來做說明,其內容為:
開啟Terminal後,輸入下列指令:
指示輸入後,依要求輸入密碼後,即會把結果匯出到/home/bio/temp/user_export.txt中。
在上列的指令中:
更多說明可以在Terminal執行
檢視匯出的檔案,結果如下:
在這裡,來看一下,如何在Ubuntu環境中,使用指示來匯出資料,這些參數在Windows環境中一樣適用。
這裡我使用一個名為「USER」的資料表來做說明,其內容為:
開啟Terminal後,輸入下列指令:
$ mysql --host=localhost --port=3306 --user=root -D jpa \ --password -e "select * from user" \ > /home/bio/temp/user_export.txt你也可以在select子句中加入where條件來篩選要匯出的資料。
指示輸入後,依要求輸入密碼後,即會把結果匯出到/home/bio/temp/user_export.txt中。
在上列的指令中:
- 使用
-D
來指定要連線的資料庫。 - 使用
-e
來指定要執行的命令。
更多說明可以在Terminal執行
$ mysql --help或
$ mysql -?來了解詳細說明。
檢視匯出的檔案,結果如下:
id name salary 1 Mary 10000 2 John 50000你可能對這篇【筆記】使用MySQL指令來匯入本機檔案到資料庫有興趣。
Labels:
MySQL
【筆記】一個簡單的JAX-RS應用程式範例
這裡使用GlassFish 4來當伺服器,使用它的好處在於在GlassFish的函式庫( <glassfish安裝目錄>/glassfish/modules)中,已經內含支援JAX-RS的函式庫(如:jersey-container-servlet-core.jar等),我不用再另外下載,而且日後可以和其他Java EE元件搭配應用。
這裡使用Eclipse來進行開發。
先在Eclipse新建一個名為「jaxrs-example」的【Dynamic Web Project】專案。
再來在
而在
再來在
一個簡單的JAX-RS應用程式只要上列兩個檔案的設定即可,再來啟動GlassFish並部署程式,成功之後,開啟瀏覽器,並在網址列輸入:http://localhost:8080/jaxrs-example/service/user/bio,網頁應為回應下列訊息:
參考來源:
這裡使用Eclipse來進行開發。
先在Eclipse新建一個名為「jaxrs-example」的【Dynamic Web Project】專案。
再來在
idv.jk.jaxrs
套件下,新增一個名為「UserService.java」的類別:
package idv.jk.jaxrs; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Response; @Path("/user") public class UserService { @GET @Path("/{name}") public Response sayHello(@PathParam("name") String name) { String message = "Hello, " + name; return Response.status(200).entity(message).build(); } }其中,宣告在
UserService
類別上的這個@Path("/user")
是跟容器講,若是/user
的URL,就交給我負責。
而在
sayHello
上面的@Path("/{param}")
是說在/user
後面接的URL可視為一個參數,在@PathParam("name")
可以將此參數補捉下來,傳入方法使用,如客戶端使用/user/bio
來做請求,則在sayHello
傳入的name
參數值就會是bio
。
再來在
web.xml
中加入下面程式片段,來設定servlet-mapping
:
這段設定用白話文來講,就是jaxrs-servlet org.glassfish.jersey.servlet.ServletContainer jersey.config.server.provider.packages idv.jk.jaxrs 1 jaxrs-servlet /service/*
/service
開頭的請求,都是用org.glassfish.jersey.servlet.ServletContainer
這個類別來負責,而它會去idv.jk.jaxrs
這個套件下去找,有沒有可以負責特定URL的類別,如上列的UserService
類別就會是被設定為負責處理/service/user
的請求,如:http://localhost:8080/jaxrs-example/service/user/bio,而前列URL中的bio
,就會被捉出來當做傳入sayHello
的參數。
一個簡單的JAX-RS應用程式只要上列兩個檔案的設定即可,再來啟動GlassFish並部署程式,成功之後,開啟瀏覽器,並在網址列輸入:http://localhost:8080/jaxrs-example/service/user/bio,網頁應為回應下列訊息:
參考來源:
2014年11月27日 星期四
【分享】Oralce認證:Oracle Certified Expert, Java EE 6 Java Persistence API Developer(1Z0-898)的考取心得
今天以98%的分數,考過了1Z0-898,取得Oracle Certified Expert, Java EE 6 Java Persistence API Developer的證照。
一開始在準備的時候,看它過的分數比較低,以為比較難,但這次過的分數是歷次來最高的,感到非常幸運。
其實,想想,要取得這張證照,除了對Java Persistence API要有一定程度的認識外,對EJB在交易(Transaction)的控制與例外(ex. EJBException)的處,以資料表間的設計,也要有一定認識,應該是這個關係,分數門檻才設在61%。
這次考試準備的參考書是先看下列這本:
這本是國外在準備認證的網友必推的一本,我一共看了兩遍,看第一次時,真的似懂非懂,看第二遍就會比較有感覺,現在回想,如果在閱讀時,搭配作者提供的範例程式碼,吸收應該會更快一點,理解也會更透徹一點,上面這一版內容有包含到JPA2.1的部份,作者在內文都會有說明,若只是要準備1Z0-898,考試內容只會包含JPA2.0,JPA2.1的部份可以先跳過。
再來,就是「必讀的聖經」:Java Persistence Specification,這我看了三次,相較於EJB的Spec,JPA的Spec好念多了,其中還滿多以程式碼來說明的,我覺得有助於以實作的角度來理解某些觀念。
我覺得範例程式碼一定要自己打一遍,而且要能看到執行結果,對於了解一些Annotation或其他設定很有幫助。
最後,要考認證,一定免不了模擬考題,經由國外網友的推薦,我這次依然使用Enthuware出的模擬考題,他的優點是在每個題目都會有說明,真的能補足閱讀時的盲點,就如大多數的網友說的一樣:不管題目答對或答錯,一定要把它對題目的說明背起來,這樣做,對考試很有助益的
一開始在準備的時候,看它過的分數比較低,以為比較難,但這次過的分數是歷次來最高的,感到非常幸運。
其實,想想,要取得這張證照,除了對Java Persistence API要有一定程度的認識外,對EJB在交易(Transaction)的控制與例外(ex. EJBException)的處,以資料表間的設計,也要有一定認識,應該是這個關係,分數門檻才設在61%。
這次考試準備的參考書是先看下列這本:
這本是國外在準備認證的網友必推的一本,我一共看了兩遍,看第一次時,真的似懂非懂,看第二遍就會比較有感覺,現在回想,如果在閱讀時,搭配作者提供的範例程式碼,吸收應該會更快一點,理解也會更透徹一點,上面這一版內容有包含到JPA2.1的部份,作者在內文都會有說明,若只是要準備1Z0-898,考試內容只會包含JPA2.0,JPA2.1的部份可以先跳過。
再來,就是「必讀的聖經」:Java Persistence Specification,這我看了三次,相較於EJB的Spec,JPA的Spec好念多了,其中還滿多以程式碼來說明的,我覺得有助於以實作的角度來理解某些觀念。
我覺得範例程式碼一定要自己打一遍,而且要能看到執行結果,對於了解一些Annotation或其他設定很有幫助。
最後,要考認證,一定免不了模擬考題,經由國外網友的推薦,我這次依然使用Enthuware出的模擬考題,他的優點是在每個題目都會有說明,真的能補足閱讀時的盲點,就如大多數的網友說的一樣:不管題目答對或答錯,一定要把它對題目的說明背起來,這樣做,對考試很有助益的
2014年11月20日 星期四
2014年11月19日 星期三
【筆記】在Servlet中直接存取EntityManager的建議方式
因為Servlet是預設在多執行緒環境中運行的,所以若在Servlet使用下列方式來注入EntityManager物件,是違反執行安全的(NOT thread-safe):
@PersistenceContext(unitName="QueryPaging") private EntityManager em;所以,若要在Servlet若要直接存取EntityManager的話,應該用本文(context)查找(lookup)的方式來取得EntityManager,再做相關的操作
package examples.servlet; import java.io.IOException; import java.io.PrintWriter; import java.util.List; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import examples.model.Employee; @PersistenceContext(unitName="QueryPaging",name="myapp/QueryPaging") @WebServlet("/EmAccessServlet") public class EmAccessServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @SuppressWarnings("unchecked") protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter pw = response.getWriter(); try { EntityManager em = (EntityManager)new InitialContext() .lookup("java:comp/env/myapp/QueryPaging"); List使用上面的方式,對每個請求(request)都查找一個EntityManager,應用程式容器(container)會確保不會有相同的要求共享這些EntityManager。empList = em.createQuery("select e from Employee e").getResultList(); for(Employee e : empList) { pw.println(e); } } catch (NamingException e) { e.printStackTrace(); } } }
2014年11月10日 星期一
【筆記】使用Freemake Video Converter來編輯、旋轉影片
有時使用手機或DV拍攝回來的影片會因拍攝時,手拿角度不同,造成某些播放軟體在播放影片時,會轉90度或整個倒過來,如:
若要能正確地播放,可以使用Freemake Video Converter來編輯影片,Freemake Video Converter中有可以旋轉影片的功能,可以用來矯正影片的角度。
首先點這裡來下載Freemake Video Converter,在安裝過程中,會問你要不要安裝一些功能,下列是我的選項:
選擇不安裝「Optimizer Pro」:
在安裝「Linkey」步驟時,選擇自訂安裝,並取消勾選下列選項:
安裝完成後,開啟Freemake Video Converter,開啟後的執行畫面如下:
點按【視訊】按鈕加入要編輯的影像檔:
再來在要編輯的影像檔上,點按滑鼠左鍵兩下,以開啟編輯視窗:
點按下方的「Rotate」,旋轉影像到你要的方向後,再按下【OK】按鈕:
再來選擇要轉換的影像格式:
這裡選擇「AVI」格式後,按下【轉換】按鈕:
轉換完成後,按下【確定】鈕離開:
若要能正確地播放,可以使用Freemake Video Converter來編輯影片,Freemake Video Converter中有可以旋轉影片的功能,可以用來矯正影片的角度。
首先點這裡來下載Freemake Video Converter,在安裝過程中,會問你要不要安裝一些功能,下列是我的選項:
選擇不安裝「Optimizer Pro」:
在安裝「Linkey」步驟時,選擇自訂安裝,並取消勾選下列選項:
安裝完成後,開啟Freemake Video Converter,開啟後的執行畫面如下:
點按【視訊】按鈕加入要編輯的影像檔:
再來在要編輯的影像檔上,點按滑鼠左鍵兩下,以開啟編輯視窗:
點按下方的「Rotate」,旋轉影像到你要的方向後,再按下【OK】按鈕:
再來選擇要轉換的影像格式:
這裡選擇「AVI」格式後,按下【轉換】按鈕:
轉換完成後,按下【確定】鈕離開:
Labels:
小工具,
影片處理,
Free Video Converter
2014年10月31日 星期五
【閒聊】海棉寶寶出電影版將在2015年上映
哈!我滿喜歡的無釐頭搞笑卡通「海棉寶寶」竟然出電影了。
在他大受歡迎之時,我很少去注意這部卡通,直到有一次和兒子看完一集後,我喜歡上了他跳tone的搞笑方式,每每轉到,都會看到當天演完。
好像因為是美味蟹堡秘方被偷了,造成比奇堡一片混亂,為了拯求海底世界,眾搞笑班底,只好挺身而出,離開海底走到陸地尋找被偷走的秘方。
章魚哥「挫賽」的那一幕,感覺是有抄了海底總動員一下,XD
在他大受歡迎之時,我很少去注意這部卡通,直到有一次和兒子看完一集後,我喜歡上了他跳tone的搞笑方式,每每轉到,都會看到當天演完。
好像因為是美味蟹堡秘方被偷了,造成比奇堡一片混亂,為了拯求海底世界,眾搞笑班底,只好挺身而出,離開海底走到陸地尋找被偷走的秘方。
章魚哥「挫賽」的那一幕,感覺是有抄了海底總動員一下,XD
Labels:
閒聊
2014年10月19日 星期日
【筆記】使用JPA API中的@GeneratedValue來建立主鍵,以@TableGenerator為例
之前在【筆記】一個在Java SE中運行的簡單JPA程式有介紹如何在Java SE環境建立一個簡單的JPA應用程式。
在該範例中,我是手動幫
這裡要使用
先在資料庫中建立一個資料表,名為
在該範例中,我是手動幫
Employee
設定id
,但在JPA中,可以使用GeneratedValue這個Annotation來產生主鍵,使用的策略(strategy)有四種:
public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };詳細說明,可以參考這裡。
這裡要使用
strategy=GenerationType.TABLE
,使用一個TableGenerator來產生主鍵。
先在資料庫中建立一個資料表,名為
ID_GEN
create table ID_GEN(GEN_KEY varchar(100), GEN_VALUE BIGINT, primary key(GEN_KEY))再來新一筆資料:
insert into ID_GEN (GEN_KEY, GEN_VALUE) values('EMP_ID', 0)把先前
Employee
這個Entity的程式碼改成:
package examples.model; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.TableGenerator; @TableGenerator( table="ID_GEN", pkColumnName="GEN_KEY", valueColumnName="GEN_VALUE", pkColumnValue="EMP_ID", allocationSize=1, name = "empGen" ) @Entity public class Employee { @Id @GeneratedValue(strategy=GenerationType.TABLE, generator="empGen") private int id; private String name; private long salary; public Employee() {} public int getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public String toString() { return "Employee id: " + getId() + " name: " + getName() + " salary: " + getSalary(); } }然後修改
EmployeeService
中的createEmployee
方法,改成不用手動設定id
:
public Employee createEmployee(int id, String name, long salary) { Employee emp = new Employee(); emp.setName(name); emp.setSalary(salary); em.persist(emp); return emp; }然後把執行的主程式改成:
package examples.client; import java.util.Collection; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import examples.model.Employee; import examples.model.EmployeeService; public class EmployeeMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("EmployeeService"); EntityManager em = emf.createEntityManager(); EmployeeService service = new EmployeeService(em); // create and persist an employee em.getTransaction().begin(); Employee emp = service.createEmployee("Bio Young", 90000); em.getTransaction().commit(); System.out.println("Persisted " + emp); // find all employees Collection<Employee> emps = service.findAllEmployees(); for (Employee e : emps) { System.out.println("Found Employee: " + e); } em.close(); emf.close(); } }最後,執行主程式看結果。
2014年10月12日 星期日
【筆記】一個可以在Java SE中運行的簡單JPA程式
啟動Derby DB後,連線到我們建立的資料庫後,執行下列語法來建立
接著在Eclipse中建立一個
再來在
下一步,建立
完成後,執行
完整的範例程式,可以在這裡下載。
EMPLOYEE
資料表:
CREATE TABLE APP.EMPLOYEE ( ID INTEGER NOT NULL, NAME VARCHAR(255), SALARY INTEGER, PRIMARY KEY (ID))
接著在Eclipse中建立一個
hrService
的Java專案,專案中引入下列jar
檔:- derbyclient.jar:在Glassfish安裝目錄/javadb/lib下可以找到
- javax.persistence.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
- org.eclipse.persistence.asm.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
- org.eclipse.persistence.core.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
- org.eclipse.persistence.jpa.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
- org.eclipse.persistence.jpa.jpql.jar:在Glassfish安裝目錄/glassfish/modules下可以找到
再來在
src
下建立一個META-INF
的資料夾,然後在其中建立一個persistence.xml
的檔案:
idv.jk.hr.entity.Employee NONE
下一步,建立
idv.jk.hr.entity
的套件,在其中新增一個Employee
的Entity:
package idv.jk.hr.entity; import javax.persistence.Entity; import javax.persistence.Id; @Entity public class Employee { @Id private int id; private long salary; private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public long getSalary() { return salary; } public void setSalary(long salary) { this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } }最後,寫一個簡單的程式來嘗試新增一個員工資料,新增一個
idv.jk.hr.client
的套件,在其中新增一個EmployeeMain
的類別:
package idv.jk.hr.client; import idv.jk.hr.entity.Employee; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; public class EmployeeMain { public static void main(String[] args) { EntityManagerFactory emf = Persistence.createEntityManagerFactory("HrService"); EntityManager em = emf.createEntityManager(); Employee emp = new Employee(); emp.setId(168); emp.setSalary(100000); emp.setName("易路發"); em.getTransaction().begin(); em.persist(emp); em.getTransaction().commit(); } }
完成後,執行
EmployeeMain
這個類別,應該就可以在資料庫中的EMPLOYEE
資料表中新增一筆資料。完整的範例程式,可以在這裡下載。
2014年10月11日 星期六
【筆記】在GlassFish中啟動Java DB
在安裝GlassFish後,內建有Derby DB,要啟動就使用GlassFish內建的指令即可。
先切換到GlassFish安裝目錄下的bin目錄,此例是以GlassFish4為主來做說明。
如果看到下列訊息,就表示Derby DB已經成功啟動。
點按【Window】→【Open Perspective】,找到【Database Development】:
開啟【Data Source Explorer】後,在 【Database Connection】上點按滑鼠右鍵,再點按【New...】:
再來在【New Connection Profile】中,選擇【Derby】,然後在【Name】欄位中輸入Connection的名字,這是裡是「study」:
再來在下個對話窗中,在【Drivers】的右邊的【New Driver Definition】,如下方的紅框:
在跳出的對話窗中,先選擇【Derby Client JDBC Driver】且System Version為【10.2】這個,然後在下面的【Driver name】輸入要設定的名字,此例是「My Derby Client JDBC Driver」:
再來點按上方頁籤中間的【JAR List】後,再點選下方「Driver files」的「derbyclient.jar」,再點按右方的【Edit JAR/ZIP...】來指定正確的JAR位置:
可以在GlassFish安裝目錄下的javadb/lib中找到正確的derbyclient.jar,此例是位在「/Users/bioyang/glassfish4/javadb/lib」下。
按下【OK】後,再來進行資料庫名稱等設定:
此例中【Database】設定為「study_db」,【User name】和【Password】皆為「APP」,設定好後,可以先點按下方的【Test Connection】來測試連線,若出現「Ping succeeded」的對話窗,則表示連線設定成功,再來點按【Finish】完成設定。
回到【Data Source Explorer】後,可以看到剛才設定的連線已經生效,最後可以看到「study_db」的【APP】這個Schema,之後練習用的資料表,都會建立在這個Schema之下。
先切換到GlassFish安裝目錄下的bin目錄,此例是以GlassFish4為主來做說明。
$ cd /Users/bioyang/glassfish4/glassfish/bin在此目錄下,有一堆功能強大的指令,先找到
asadmin
這個指令後,執行:
$ ./asadmin start-database這樣Derby DB就會開始啟動。
如果看到下列訊息,就表示Derby DB已經成功啟動。
Starting database in the background. Log redirected to /Users/bioyang/glassfish4/glassfish/databases/derby.log. Command start-database executed successfully.再來使用Eclipse來進行連線,這裡是使用 Luna Release (4.4.0)的 Eclipse Java EE IDE for Web Developers。
點按【Window】→【Open Perspective】,找到【Database Development】:
開啟【Data Source Explorer】後,在 【Database Connection】上點按滑鼠右鍵,再點按【New...】:
再來在【New Connection Profile】中,選擇【Derby】,然後在【Name】欄位中輸入Connection的名字,這是裡是「study」:
再來在下個對話窗中,在【Drivers】的右邊的【New Driver Definition】,如下方的紅框:
在跳出的對話窗中,先選擇【Derby Client JDBC Driver】且System Version為【10.2】這個,然後在下面的【Driver name】輸入要設定的名字,此例是「My Derby Client JDBC Driver」:
再來點按上方頁籤中間的【JAR List】後,再點選下方「Driver files」的「derbyclient.jar」,再點按右方的【Edit JAR/ZIP...】來指定正確的JAR位置:
可以在GlassFish安裝目錄下的javadb/lib中找到正確的derbyclient.jar,此例是位在「/Users/bioyang/glassfish4/javadb/lib」下。
按下【OK】後,再來進行資料庫名稱等設定:
此例中【Database】設定為「study_db」,【User name】和【Password】皆為「APP」,設定好後,可以先點按下方的【Test Connection】來測試連線,若出現「Ping succeeded」的對話窗,則表示連線設定成功,再來點按【Finish】完成設定。
回到【Data Source Explorer】後,可以看到剛才設定的連線已經生效,最後可以看到「study_db」的【APP】這個Schema,之後練習用的資料表,都會建立在這個Schema之下。
2014年9月26日 星期五
【備忘】Eclipse常用快捷鍵整理
組合 | 功能 |
Ctrl + Shift + P | 在滑鼠指標在點擊處與其所在區塊的{ 與} 間來回移動
|
Ctrl + Shift + R | 開啟搜尋原始碼的對話窗,可以使用 |
Labels:
Eclipse
2014年9月17日 星期三
【A筆記】解決Redering Problems Missing Styles的方法
今天在MBP上升級0.8.9版的Android Studio後,在建立新應用程式後,都會出現下列的問題畫面:
在 Google之後,找到一個方法,可以解決我問題,就是【File】→【Invalidate Caches / Restart...】:
在Android Studio重新啟動後,上面的畫面就會消失。
另一個方法是,點按版面設計上方的Theme選取按鈕,重新選一個新的樣式:
參考資料
在 Google之後,找到一個方法,可以解決我問題,就是【File】→【Invalidate Caches / Restart...】:
在Android Studio重新啟動後,上面的畫面就會消失。
另一個方法是,點按版面設計上方的Theme選取按鈕,重新選一個新的樣式:
參考資料
Labels:
Android
2014年9月16日 星期二
【A筆記】sp和dp的分別
為了讓Android App畫面在不同手機上盡量保持一致,Android特別提供了
但
參考資料
sp
(scale-independent Pixels)和dp
(Density-independent Pixels)兩種邏輯單位。sp
會依使用者手機設定的【顯示 / 字型大小】值高整(4.X版才提供),例如選擇「大」字型,sp
的實際尺寸就會變大:但
dp
不受影響
Android官方文件建議使用dp
設定元件大小,用sp
設定字型大小。參考資料
Labels:
Android
2014年8月26日 星期二
【筆記】使用JavaScript來判斷是否為Chrome
用JavaScript來判斷是否為Chrome之前,先來看看
若要判斷其他瀏覽器,就請自行發揮了,XD
參考來源
navigator.userAgent
這屬性:
console.log(navigator.userAgent);開啟網頁後,上列的程式在Firefox 31.0中,會顯示:
Mozilla/5.0 (Windows NT 6.1; WOW64; rv:31.0) Gecko/20100101 Firefox/31.0若是在Chrome 36.0.1985.143 m中,會顯示:
Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36使用
navigator.userAgent
和JavaScript中一個簡單的正規表示式,就可以這樣判斷:
var isChrome = /chrom(e|ium)/.test(navigator.userAgent.toLowerCase()); console.log(isChrome); //在Chrome中顯示true,其他瀏器為false若是使用jQuery 1.9以前的版本(不包含1.9,此屬性在1.9以後就被移除了),可以為
$.browser
加上chrome
屬性來使用:
$.browser.chrome = /chrom(e|ium)/.test(navigator.userAgent.toLowerCase()); console.log($.browser.chrome);
若要判斷其他瀏覽器,就請自行發揮了,XD
參考來源
Labels:
JavaScript
2014年8月13日 星期三
【分享】移除Google Chrome的Ask toolbar外掛
不知何時在Google Chrome裝了一個叫Ask toolbar的外掛,每次開啟Google Chrome就會問你要啟動或移除。
但縱使在Google Chrome的設定中,將此外掛移除後,下次開啟Google Chrome還是一樣會出現,久而久之,漸覺不堪其擾。
後來發現當初在安裝時,好像是直接被安裝了一個背景程式:
既然是背景程式,那就是去【控制台】→【程式和功能】,將他解除安裝。
這一招試過,真的就徹底解決了我的困擾。
但縱使在Google Chrome的設定中,將此外掛移除後,下次開啟Google Chrome還是一樣會出現,久而久之,漸覺不堪其擾。
後來發現當初在安裝時,好像是直接被安裝了一個背景程式:
既然是背景程式,那就是去【控制台】→【程式和功能】,將他解除安裝。
這一招試過,真的就徹底解決了我的困擾。
Labels:
Google Chrome
訂閱:
文章 (Atom)