2014年12月24日 星期三

【雜志】生錯

你會不會常常覺得自己是…

生錯時代,


生錯國家,


亦或生錯星球,XD


【筆記】解決在VirtualBox中安裝Ubuntu14.04後,無法調整螢幕解析度的問題

今天在Windows 8.1上,使用VirtualBox安裝Ubuntu 14.04後,發現要調整螢幕解析度時,只有640 X 480這一個選項:


後來找到這一篇討論,好像是在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中的作業系統視窗不再是小小一塊,而且進入系統設定後,也可以看到解析度有其他選項可以選擇:


參考資料

2014年12月14日 星期日

【分享】在Java List中,使用元素(物件)的屬性來排序

你一定在某個時候,曾經把一堆物件放到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]

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

參考資料

2014年12月7日 星期日

【筆記】在Linux中使用wget下載jdk

若去過Oracle下載過Java Development Kit等的人應該都知道,大部份的下載,在可以下載前,都被要求要點【Accept License Agreement】這個選項後才能進行:


這個要求在使用瀏覽器的情況下,相信不會造成困擾,但若是在終端機中操作時,直接使用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 VAIOBIOS就花了我很多時間,後來終於發現,要在關機的狀態下,按下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】,這時,畫面就會變成下面有階層的樣子:


如上面的下拉選單,這時候可以選擇要不要有轉場效果,若選擇【淡化轉場】,則當要進入下一個影片時,會有一小段前面影片的淡化效果。

最後,再點按下面的轉檔鈕轉成要的格式就完成了。

2014年12月2日 星期二

【雜志】每日三省吾身,請記得為自己做些改變

在11/29以前,我們用了很多心力想改變台灣,

現在看起來有了不同的未來。

但真要踏實地掌握,

更要改變自己。

改變,才有未來。


2014年12月1日 星期一

【筆記】使用MySQL指令來匯入本機檔案到資料庫

現在我們有一個純文字檔,裡面有三筆使用者的資料,我們要匯入到USER資料表中,資料如下:
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指令來匯出資料

【筆記】使用MySQL指令來匯出資料

最近我發現若使用指示來匯出MySQL中的資料非常方便,尤其是在某些情境下,沒有UI工具可以使用時。

在這裡,來看一下,如何在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指令來匯入本機檔案到資料庫有興趣。

【筆記】一個簡單的JAX-RS應用程式範例

這裡使用GlassFish 4來當伺服器,使用它的好處在於在GlassFish的函式庫( <glassfish安裝目錄>/glassfish/modules)中,已經內含支援JAX-RS的函式庫(如:jersey-container-servlet-core.jar等),我不用再另外下載,而且日後可以和其他Java EE元件搭配應用。


這裡使用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")是跟容器講,若是/userURL,就交給我負責。

而在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出的模擬考題,他的優點是在每個題目都會有說明,真的能補足閱讀時的盲點,就如大多數的網友說的一樣:不管題目答對或答錯,一定要把它對題目的說明背起來,這樣做,對考試很有助益的

2014年11月20日 星期四

【雜志】今天天氣真是他媽媽的好

今天出大太陽,聽說會有幾天的好天氣。

像這樣的陽光,應該是騎著車浸濡其中的。


2014年11月19日 星期三

【雜志】有時我們需要的只是...

今日小小創作...XD


【筆記】在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 empList = em.createQuery("select e from Employee e").getResultList();
   for(Employee e : empList)
   {
    pw.println(e);
   }
  } catch (NamingException e)
  {
   e.printStackTrace();
  }
 }
}
使用上面的方式,對每個請求(request)都查找一個EntityManager,應用程式容器(container)會確保不會有相同的要求共享這些EntityManager

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」格式後,按下【轉換】按鈕:


轉換完成後,按下【確定】鈕離開:



2014年10月31日 星期五

【閒聊】海棉寶寶出電影版將在2015年上映

哈!我滿喜歡的無釐頭搞笑卡通「海棉寶寶」竟然出電影了。

在他大受歡迎之時,我很少去注意這部卡通,直到有一次和兒子看完一集後,我喜歡上了他跳tone的搞笑方式,每每轉到,都會看到當天演完。

好像因為是美味蟹堡秘方被偷了,造成比奇堡一片混亂,為了拯求海底世界,眾搞笑班底,只好挺身而出,離開海底走到陸地尋找被偷走的秘方。


章魚哥「挫賽」的那一幕,感覺是有抄了海底總動員一下,XD

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後,連線到我們建立的資料庫後,執行下列語法來建立EMPLOYEE資料表:
CREATE TABLE APP.EMPLOYEE (
    ID INTEGER NOT NULL, 
    NAME VARCHAR(255), 
    SALARY INTEGER, 
    PRIMARY KEY (ID))

接著在Eclipse中建立一個hrServiceJava專案,專案中引入下列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的套件,在其中新增一個EmployeeEntity
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為主來做說明。
$ 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日 星期五

【分享】2014 Java Developer Day會後分享 Java Functional API

或抄、或摻雜自己一點想法,若有什麼想法,請不吝賜教,謝謝。


【備忘】Eclipse常用快捷鍵整理

Ctrl + Shift + P 在滑鼠指標在點擊處與其所在區塊的{}間來回移動
Ctrl + Shift + R 開啟搜尋原始碼的對話窗,可以使用*來加強搜尋

2014年9月23日 星期二

2014年9月17日 星期三

【A筆記】解決Redering Problems Missing Styles的方法

今天在MBP上升級0.8.9版的Android Studio後,在建立新應用程式後,都會出現下列的問題畫面:



Google之後,找到一個方法,可以解決我問題,就是【File】→【Invalidate Caches / Restart...】:



Android Studio重新啟動後,上面的畫面就會消失。

另一個方法是,點按版面設計上方的Theme選取按鈕,重新選一個新的樣式:


參考資料

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設定字型大小。

參考資料

2014年8月26日 星期二

【筆記】使用JavaScript來判斷是否為Chrome

JavaScript來判斷是否為Chrome之前,先來看看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.userAgentJavaScript中一個簡單的正規表示式,就可以這樣判斷:
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

參考來源

2014年8月13日 星期三

【分享】移除Google Chrome的Ask toolbar外掛

不知何時在Google Chrome裝了一個叫Ask toolbar的外掛,每次開啟Google Chrome就會問你要啟動或移除。



但縱使在Google Chrome的設定中,將此外掛移除後,下次開啟Google Chrome還是一樣會出現,久而久之,漸覺不堪其擾。

後來發現當初在安裝時,好像是直接被安裝了一個背景程式:


既然是背景程式,那就是去【控制台】→【程式和功能】,將他解除安裝。


這一招試過,真的就徹底解決了我的困擾。