Amazon Ads

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,網頁應為回應下列訊息:


參考來源: