2014年3月30日 星期日

【分享】使用Free Video Converter來合併影片檔和字幕檔

因為最近有需要將mp4srt字幕檔合併,讓我在看影片時,可以顯示字幕,上網找了一下,發現Free Video Converter這套軟體支援很多格式,又是免費的,決定試用看看,使用之後,發現還滿容易上手。

首先,前往它的網站下載,這裡使用的版本是「4.1.3」。

下載完成後,直接點按安裝檔,下一步接下一步,就可完成安裝。

安裝完成後,點按它的圖示開啟,它的介面長這樣:


這裡我要合併的影片檔格式是mp4,然後我要轉給avi檔,先點按右上角的+ 視訊新增要轉檔的檔案:


新增完成後,會顯示所選取的檔案:


再來點按下方的字幕關閉,這時若在存放影片檔的資料夾中含有檔,會預設帶入為選項,我直接按加入字幕...


選好字幕後,就點按下方的轉為AVI


按下後,會跳出一個可以再做一些畫質等的參數,並可以選擇要存放轉換檔案路徑的對話窗,調整所需的設定後,點按轉換


當看到下面的訊息時,就表示轉檔工作成功地完成了。


它還有更多應用,可以參考重灌狂人的介紹

若你有興趣,可以看看使用Freemake Video Converter來編輯、旋轉影片

2014年3月29日 星期六

【JS筆記】正規表示式(Regular Expression)中帶有中括號的比對模式

前面探討過一個簡單的正規表示式:
var pat = /abc/;
pat.test('abc is before def');  //true
pat.test('ab');    //false
以上列的模式/abc/來比對字串時,只有要比對的字串中,一定包含著「abc」這個字串,匹配才會成功,test()函式才會回傳true

再來看看,若上列的模式用一對中括號包起來呢?如下列模式:
var pat1 = /[abc]/;
pat1.test('ab'); //true
pat1.test('apple'); //true
pat1.test('big'); //true
pat1.test('dig'); //false
由上列的範例,好像只要比對的字串中,只要含有比對模式中一個字元,就能匹配成功?

是的,就是這樣沒錯。

當比對模式有用[]包起來時,只要比對的字串中,含有任何一個中括號內的字元,就能匹配成功。

另外,也可以使用來表示一個區間內的比對字元,如:
var pat2 = /[A-Z]/;  //比對的字串中,要含有任一個由A至Z的「大寫」字母
pat2.test('apple');  //false
pat2.test('Apple');  //true
var pat3 = /[1-9]/;  //比對的字串中,要含有任一個由1至9的數字
pat3.test('abc');  //false
pat3.test('1st');  //true
如果你想學好JavaScript,我推薦:

還有:


參考資料:

2014年3月28日 星期五

【J筆記】使用Struts2回傳JSON字串

在很多時候,動態網頁需要回應JSON字串給客戶端程式如JavaScript來做後續的處理的。我這裡做一個以Struts2回應的範例,以供日後回顧參考。

這裡的範例是以「2.3.16.1」為主。

需要的jar檔如下:


先簡單看一下web.xml的配置:

 mystruts

 
  struts2
  org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
 

 
  struts2
  /*
 

主要意思是,將所有的回應,轉給Struts來做處理。

再來看struts.xml的配置:
 

 
    
 
    
     
      
     
   
            /index.jsp
        
 
   
    /pages/HelloWorld.jsp
   
   
    
     jsonString
    
   
    
 

需要注意的是第9至11行這邊,需要替我要回傳的JSON格式定義一個result-type,在這裡就是json。

這裡使用Struts2定義的org.apache.struts2.json.JSONResult類別。

再來我只要再定義一個Action,它在execute方法處理好要轉成JSON字串的物件,並返回json_ok的結果就好,如上的第16至20行。

JsonAction.java的程式如下:
package org.apache.struts.helloworld.action;

import java.util.HashMap;
import java.util.Map;

import org.apache.struts.helloworld.model.JsonString;

import com.opensymphony.xwork2.ActionSupport;

public class JsonAction extends ActionSupport
{
 /**
  * 
  */
 private static final long serialVersionUID = 1645961153075600530L;

 private JsonString jsonString;
 
    public String execute() throws Exception {
         
        Map map = new HashMap();
        map.put("abc", "123");
        map.put("def", "456");
       
        this.getJsonString().setRes(map);
        return "json_ok";
    }

 public JsonString getJsonString()
 {
  if(jsonString == null)
  {
   this.jsonString = new JsonString();
  }
  return jsonString;
 }

 public void setJsonString(JsonString jsonString)
 {
  this.jsonString = jsonString;
 }
}

啟動伺服器後,送出要求後,就會得到下列的結果:


上列程式碼,可至這裡下載

2014年3月27日 星期四

【JS筆記】使用Rhino shell來執行JavaScript

很多時候,我若要寫個JavaScript就要先寫個HTML檔案,然後再寫JavaScript,若使用Rhino來執行,就不用這麼麻煩了。

Rhino是個開源(open-source)的,而且完全用Java寫成的JavaScript的實作,只要我的電腦可以執行Java,就可以使用它,可以到這裡下載

下載完成後,只要把下載的檔案解壓縮,然後用Windows的「命令提示字元」或Linux的「終端機」
前往解壓後的資料夾,執行js.jar,如:
$ cd tools/JavaScript/rhino1_7R4
$ java -jar js.jar
Rhino 1.7 release 4 2012 06 18
js> 
之後,我們就可以如在文字編輯器中寫JavaScript撰寫程式碼,如:
js> var a = 1, b = 2;
js> a + b
3

【R筆記】R的套件安裝

先來認識一下CRAN

CRAN是指存在於世界各地間,由ftp與網頁伺服所組成的網路,在這網路中存放相同的、最新版本的R程式碼和文件。

若要在CRAN下載套件(package)的話,可以依照下列步驟進行,這裡的環境是以Windows 7為主。

點按程式套件安裝程式套件...


會先出現CRAN的鏡像(mirror)網站列表,先選一個離我最近的鏡像點。


我這裡選擇的是Taiwan(Taipei)

再來會顯示套件的選擇對話窗,直接點選我要安裝的套件後,點按確定即可。


這裡值得注意的是,若我選擇安裝的套件有相依的套件,R會幫我安裝需要的相依套件後,我不用花時間去解決或煩惱套件間的相依問題。

若要移除已安裝的套件,就用remove.package()這個函式,如:
> remove.packages('actuar')

【JS筆記】正規表示式(Regular Expression)的「^」與「$」特殊符號

若想要有個方便的工具來練習JavaScript,可以看看使用Rhino shell來執行JavaScript這一篇。

我先來寫一個最簡單的表示式:
var pat1 = /java/;
var str1 = 'javascript'; 
var str2 = 'i love java'; 
pat1.test(str1);  //結果為 true

pat1.test(str2);  //結果為 true
因為上列比對的兩個字串str1str2中,都有全為小寫的java,所以比對的結果都會回傳true

用白話文來講,就是比對的字串中,只要有java就能匹配成功。

再來我們在表示式中,加入一個^的特殊字元:
var pat2 = /^java/; 
var str1 = 'javascript';
var str2 = 'I love java';

pat2.test(str1);  //結果為 true
pat2.test(str2);  //結果為 false
上列比對的兩個字串中,都有全為小寫的java,但這次str1比對的結果回傳true,而str2比對的結果回傳false

由上面的例子我可以知道,在正規表示式中,加入^後,則比對的目標字串的起始位置,要含有^後面的字元或字串,才能成功匹配,才會回傳true,例如上列的str1起始四個字元與定義的模式java匹配,而str2雖然含有java,但它不在一開頭的位置上。

用白話文來講,使用這樣的比對模式時,就是比對的字串,開頭的四個字元一定要是java才能匹配成功。

這裡要注意的是,^要放在比對模式的第一個字元,若放在其他地方,則有「否定」的意思,這之後會去探討。

延續上面的例子,再來看另一個特殊字元$,它若放在比對模式的「最後一個字元」,則表示要比對的字串,最後結尾的部份,要符合$符號前面定義的模式,才能匹配成功。

若它是放在比對模式中的其他位置,是沒有特殊意義的,這點要注意。

看看下面的範例。
var pat3 = /java$/;
pat3.test(str1); //結果為false
pat3.test(str2); //結果為true,因為str2是java結尾,所以比對成功

var str3 = 'I love jave';
pat3.test(str3); //結果為 false
var str4 = 'I love javaa';
pat3.test(str4); //結果為 false
所以用白話文來講,使用這樣的比對模式時,就是比對的字串,結尾的最後四個字元一定要是java才能匹配成功。

我知道了^$在正規表示中的意思了,那下列的比對模式,要怎樣的字串才能匹配成功呢?
var pat4 = /^java$/;
有時間就try一下吧!

參考資料:

2014年3月26日 星期三

【分享】Ubuntu解決SVN「資料不存在」、「Access to ... probidden」的問題

今天在用Eclipse更新SVN程式或要連線到SVN時,突然出現下列訊息:


或是「URL access forbidden for unknown reason」、「Access to 'http://... ' forbidden」,如下訊息:


看到「Access forbidden」讓我想到有可能是SVN認證的問題,於是就先試著把家目錄中subversion下的auth資料夾刪掉看看:
rm -r -f ~/.subversion/auth
果然問題就解決了。

這是我的經驗,與你分享!

2014年3月25日 星期二

【R筆記】初探R的矩陣

R的矩陣(matrix)就是有維度(dimension)的向量(vector)

一講到這,愈看愈抽像,來看看一些函式和例子吧! 首先要提到每一個物件都有一個屬性叫dim,它是一個函式(function),它的功能在取得或設定一個物件的維度。

再來來看看文件:
> ?dim
文件中對於dim()的描述是:取得或設定一個物件的維度。


「矩陣是有維度的向量」,那我們要取得矩陣之前,就先要有個向量出來:
> profit <- c(2.0, 2.1, 2.2, 2.1, 2.3, 2.4)
> profit
[1] 2.0 2.1 2.2 2.1 2.3 2.4
再來使用dim()函式把向量profit轉為矩陣:
> dim(profit) <- c(2, 3)
> profit
     [,1] [,2] [,3]
[1,]  2.0  2.2  2.3
[2,]  2.1  2.1  2.4
上列指令把向量profit轉為一個2 X 3的矩陣,再來我們就可以下列指令,來取得矩陣中的資料:
> profit[1,]
[1] 2.0 2.2 2.3
上列會取得第一列的資料。
> profit[,2]
[1] 2.2 2.1
上列會取得第二欄的資料。
> profit[1,3]
[1] 2.3
上列會取得第一列、第三欄的資料。 你可以比較原來的向量和之後的矩陣,看資料是怎麼放的。

2014年3月24日 星期一

【JS筆記】勇敢面對JavaScript中正規表示式(Regular Express)

首先,若想要有個方便的工具來練習JavaScript,可以看看使用Rhino shell來執行JavaScript這一篇。

根據W3C的定義,在JavaScript中,正規表示式(regular expression)是一個描述字元模式 (a pattern of characters) 的物件,它可以用來查看某一段文字是否符合我們定義的文字模式,也可以用來找尋或取代文字中符合模式的字串,而且在StringRegExp中定義了一些方法,搭配正規表示式,就能對文字進行強大的模式匹配、搜尋或取代的功能。

我們要得到一個regular expression的物件的話,可以使用下列語法:
var pt = new RegExp(pattern, modifiers);
或是
var pt = /pattern/modifiers; //我自己實作上比較常用這一方式
上列語法中:pattern是我們要定義的「表式示的模式」(pattern of expression)。

modifiers指明我們想要做是「不分大小寫」、「全部」或「多行」的比對,定義如下:

i:做不分大小寫(case-0insensitvie matching)的比對。

g:對全部要比對的字串,做比對,而不是比對成功後就停下來。

m:做多行的比對。

用些例子來說明吧!
//這個表示式的意思是,要找比對的字串中,有沒有含有字母「e」或「E」。
var reg1 = new RegExp('e', 'i'); 
//或者 var reg1 = /e/i; 請注意,這裡不用單引號或雙引號來包字串

//然後用來測試字串
reg1.test('e'); //結果 true
reg1.test('E'); //結果 true
這次若不加i再測試看看:
//這個表示式的意思是,要找比對的字串中,有沒有含有字母「e」,
//沒加「i」,所以有分大小寫
var reg1 = new RegExp('e');
reg1.test('e'); //結果為 true
reg1.test('E'); //結果為 false
從上列結果來看,若有加imodifier的話,則在比對時,就不會去分大小寫。

再來看g這個modifier,要看這個參數的功能我們要用Stringmatch()函式來說明。
var reg = /has/;
var para = 'He has a friend who has a dog that has long tail';
para.match(reg);    //結果為has
在上列程式中,match()函式會以array object回傳比對成功的結果,雖然在我們比對的字串para中有三個has,但這裡回傳的陣列只包含了第一個比對成功的字串。

再來加入g參數:
var reg = /has/g;
para.match(reg); //結果 has,has,has
現在回傳的陣列長度為3,包含了三個「has」了。

上列的也可以一起混用,如:
var reg = /has/gi; //比對不分大小寫,而且要比對到字串結尾為止
para.match(reg); //結果 has,has,has
至於m這個modifier,目前還沒想到比較好的例子,在這裡先跳過了。

接下來,我要開始探索比對模式的部份。

如果你想學好JavaScript,我推薦:

還有:

2014年3月22日 星期六

【分享】Oralce認證:OCEEJBD(Java EE 6 Enterprise JavaBeans Developer Certified Expert Exam,1z0-895)的考取心得

上個月以還算可以的分數,考過了Oracle編號1z0-895的認證,它的前身為SCBCD

在考試的準備上,先在JavaRanchSCBCD Links找相關的準備資料,再到JavaRanch考試結果討論區去看考過的人如何準備。

我是以EJB spec為主,若是以認證考試為目標的話,第六章至第十一章是可以先跳過的

另外再以下列兩位仁兄無私提供的筆記為輔。
  •  Frits Walraven的筆記,在SCBCD Links中也可以找到其它格式,內容主要是Spec的重點整理,因為大都以條理式的方式去整理比較重要的點,很容易背誦,我建議多看幾次。
  •  Ivan Krizsan's的筆記,這是他在準備考試時的筆記,裡面很多以範例程式來說明EJB的重點,自己真的用手去寫它的範例程式 (就是不要用複製貼上),可以實際地去體會一下,EJB是如何去運作,建議可以多念幾次,至少要真的了解他的範例程式要表達的觀念,我建議可以從這份文件開始念
既然準備考試的過程,真正動手去寫程式是不可少的,那就要準備一下環境,我是用GlassFish來當應用程式伺服器,使用Java EE 6來做我的開發環境,你可以去這裡下載

 現在的最新版本是「7」,若你真要選擇「6」的版本,就在此頁中找到「Previous Releases」進去下載,選擇GlassFish有的下載,在安裝過程中,也會一起安裝GlassFish

 若在論壇中,大都建議可以找一本比較好的書開始,而不要一開始就念Spec,我的感想也是一樣,若一開始就念Spec,對沒有開發經驗的人來說,可能會像「瞎子摸象」,大部份考過的人都建議這本:


若你喜歡動手寫程式的話,其實上面這本裡面就有很多範例程式了,若還想多練習的話,可以考慮這一本:


我自己是有買下列的「MEAP」版本,但實體書還沒出,我就考完了。


另外,我有使用的Enthuware出的模擬考題,我的心得是對我助益非常地大,在做模擬考題的過程中,把原本零散的觀念串了起來,還有在範例程式和Spec中不會注意到的細節,一定會有「喔!原來是這樣」的驚喜!

這一張認證的考試沒有想像中的難,但也是在念過Spec三、四次後,才有這種感覺,我覺得模擬考題一定要做,無論對錯,它說明的觀念一定要搞清楚,不清楚的地方,再回去翻Spec加強觀念。

實際考試中,大部份的題目都是單選,多選也會跟你說選項有幾個,而且大部份多選都是「2」個選項,只要觀念清楚點,不會太難選。

2014年3月21日 星期五

【R筆記】初探R模式(mode)與類別(class)

R中,每一個物件(object)都有一個模式(mode),它在說明資料是以何種型式儲存在記憶體中。

若要取得物件的模式,可以使用mode(),這個函數,它需要一個R物件當做參數,下列是一些例子: 1.41421,在 R 的模式是numberic
> mode(1.141421)
[1] "numeric"
"Hello R"的模式是character
> mode("Hello R")
[1] "character"
當我們指定了一個向量(Vector)後,它的模式是由它所包含的元素來決定的:
> n <- c(1, 2, 3, 4, 5)
> mode(n)
[1] "numeric"
> n1 <- c("a", "b", "c")
> mode(n1)
[1] "character"
上列n變數所包含的元素的模式皆為numeric所以它的模式是numeric

再來看看n1,它所包含的元素的模式皆為character所以它的模式是character

鏘鏘鏘!在【R筆記】初探R資料結構-向量(Vector)有提到,在向量中所有的元素,其資料型別都要一樣,指的就是元素所有的模式。 接著,我們來看看列表(List)的模式為何:
> list2 <- list(1, 2, 3, "x", "y", "z")
> mode(list2)
[1] "list"
因為我們在【R筆記】初探R資料結構-列表(List)中有提到,在列表所包含的元素,其模式可以不一樣,所以使用mode()函式看模式時,有另一種list的模式。

最後,我們常常在使用的各種函式,也有自己的模式,如print()函式的模式是function
> mode(print)
[1] "function"
R中,每一個物件也有一個類別(class),相對於模式來講,它具備的是比較抽象的概念,R根據一個物件類別,來決定以何種方式來做資料處理。 如我們看一個內建的資料集mtcars的模式和類別:
> mode(mtcars)
[1] "list"
> class(mtcars)
[1] "data.frame"
上列結果說明,mtcars這個資料集是以list型式儲存在記憶體中,而我們要處理它時,如使用print()函式將mtcars輸出,R會依據它的類別來做合適的處理。

若你想進一步認識R,我推薦R 錦囊妙計

【R筆記】初探R資料結構-列表(List)

這裡我們來認識一下R中的列表(List)資料結構。 要宣告一個列表的變數時,可以使用下列的指令:
> mylist <- list(1, 2, 3, 4, 5)
> mylist
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] 4

[[5]]
[1] 5
跟向量(vector)不一樣的是,列表中的元素可以是異質 (heterogeneous) 的。

在同一個列表中的各個元素,可以各自是不同的資料型別,如:
> list2 <- list(1, 2, 3, "x", "y", "z")
> list2
[[1]]
[1] 1

[[2]]
[1] 2

[[3]]
[1] 3

[[4]]
[1] "x"

[[5]]
[1] "y"

[[6]]
[1] "z"
我們可以使用索引(index)來取得或參照到列表中某一位置的元表 下列的指令,參照到list2中第三個元素:
> list2[[3]]
[1] 3
鏘鏘鏘!這裡的中括號要有兩個,請記住,是兩個!

我們也可以使用多個索引來取得列表中某一群的元素。

使用下列指令,我們可以取得第1、3、5個元素所組成的列表:
> list2[c(1, 3, 5)]
[[1]]
[1] 1

[[2]]
[1] 3

[[3]]
[1] "y"
鏘鏘鏘!這裡的中括號只有一個!

我們可以為列表中的元素設定名稱。
> names(list2) <- c("le1", "le2", "le3", "le4", "le5", "le6")
> list2
$le1
[1] 1

$le2
[1] 2

$le3
[1] 3

$le4
[1] "x"

$le5
[1] "y"

$le6
[1] "z"
在指定元素名稱之後,要取得某一位置的元素,除了使用索引值之外,也可以使用「元素名稱」當索引來取得:
> list2[["le1"]]
[1] 1
或使用「list名稱$元素名稱」的方式來取得:
> list2$le1
[1] 1
鏘鏘鏘!上列指令中,兩個名稱之間是一個「$」符號。 如果你需要進一步地認識 R,我推薦:

還有只有 Kindle 版本的這本:

2014年3月19日 星期三

【R筆記】初探R資料結構-向量(Vector)

在 R 中 Vector 是最常用的資料結構,使用它前,我們需要了它幾個主要的特性。

在 Vector 中的資料,需要是同質性的,也是說在一個 Vector 的所有元素 (element),需要是同一型別,用 R 的話來說,就是要同一種模式 (mode)。

如我們指定一個 Vector 給變數d,則在指定的元素中,需要是同型別的:
> d <- c(1, 2, 3, 4, 5)
> d
[1] 1 2 3 4 5
若我們在指定 Vector 時,指定了不同型別的元素,則 R 會自動幫我們轉型:
> e <- c(1, 2, "a", "b")
> e
[1] "1" "2" "a" "b"
或是
> f <- c(2.0, e)
> f
[1] "2" "1" "2" "a" "b"
Vector可以使用索引 (index) 來取得某一位置的元素,如: > d[3] [1] 3 上列的指令取得d中第三個元素的值,這裡要注意的是,在R中的索引,是由1算起,而不是0
Vector 可以使用索引 (index) 來取得多個位置的元素,並回傳一個 Vector,如:
> d <- c(2, 4, 6, 8, 10)
> g <- d[c(1, 3, 5)]
> g
[1]  2  6 10
Vector 中的元素可以被設定一個名稱,Vector 有一個names的屬性,我們可以使用它來設定 Vector 的元素名稱,如:
> names(d) <- c("element1", "element2", "element3", "element4", "element5")
> d
element1 element2 element3 element4 element5 
       2        4        6        8       10 
請注意,這裡的names有「s」。 一旦給了元素名稱之後,我們也就可以使用名稱來取得 Vector 的元素了:
> d["element1"]
element1 
       2 
鏘!鏘!在中括號的元素名稱,請記得用兩個「"」 (雙引號) 包起來喔!
如果你需要進一步地認識 R,我推薦:

還有只有 Kindle 版本的這本:

2014年3月18日 星期二

【R筆記】R內建資料集

R中,有一些內建的資料集,在學習或練習時,可以用來當做原始資料,如:
> CO2
   Plant        Type  Treatment conc uptake
1    Qn1      Quebec nonchilled   95   16.0
2    Qn1      Quebec nonchilled  175   30.4
3    Qn1      Quebec nonchilled  250   34.8
4    Qn1      Quebec nonchilled  350   37.2
(以下略)
上列結果會列出CO2這資料集中的欄位和資料,若只是要看某一欄位內的資料,可以使用「資料集名稱$欄位名稱」的指令來取得,如:
> CO2$Plant
 [1] Qn1 Qn1 Qn1 Qn1 Qn1 Qn1 Qn1 Qn2 Qn2 Qn2 Qn2 Qn2 Qn2 Qn2 Qn3 Qn3 Qn3
[18] Qn3 Qn3 Qn3 Qn3 Qc1 Qc1 Qc1 Qc1 Qc1 Qc1 Qc1 Qc2 Qc2 Qc2 Qc2 Qc2 Qc2
[35] Qc2 Qc3 Qc3 Qc3 Qc3 Qc3 Qc3 Qc3 Mn1 Mn1 Mn1 Mn1 Mn1 Mn1 Mn1 Mn2 Mn2
[52] Mn2 Mn2 Mn2 Mn2 Mn2 Mn3 Mn3 Mn3 Mn3 Mn3 Mn3 Mn3 Mc1 Mc1 Mc1 Mc1 Mc1
[69] Mc1 Mc1 Mc2 Mc2 Mc2 Mc2 Mc2 Mc2 Mc2 Mc3 Mc3 Mc3 Mc3 Mc3 Mc3 Mc3
12 Levels: Qn1 < Qn2 < Qn3 < Qc1 < Qc3 < Qc2 < Mn3 < Mn2 < ... < Mc1
當我們要知道這些資料集中欄位意思等資訊,可以使用help()這個函式來開啟資料的相關文件:
> help(CO2)
或是
> ?CO2
就可以看到資料集描述、欄位定義與用法等資訊:


若要看目前可以使用的資料集有那些,可以使用data()這個函式:
> data()
執行後,就會出現資料集的說明文件:


若我們想要使用其他套件的資料集的話,也是可以使用data(),但此時要傳入兩個參數,第一個參數是我們要引入的「資料集名稱」,第二個參數是該資料集所在的「套件名稱」,如在MASS套件中,有一名為Cars93的資料集,在引入之前使用他,會得這樣的結果:
> Cars93
錯誤: 找不到物件 'Cars93'
若我們先執行下列指令:
> data(Cars93, package="MASS")
再看一次Cars93的內容,就會看到他的資料結構:
> Cars93
    Manufacturer          Model    Type Min.Price Price Max.Price
1          Acura        Integra   Small      12.9  15.9      18.8
2          Acura         Legend Midsize      29.2  33.9      38.7
3           Audi             90 Compact      25.9  29.1      32.3
4           Audi            100 Midsize      30.8  37.7      44.6
5            BMW           535i Midsize      23.7  30.0      36.2
6          Buick        Century Midsize      14.2  15.7      17.3
7          Buick        LeSabre   Large      19.9  20.8      21.7
8          Buick     Roadmaster   Large      22.6  23.7      24.9
9          Buick        Riviera Midsize      26.3  26.3      26.3
(以下略)
若我們己經有使用library()函式去引入MASS這個套件,則我們可以直接使用Cars93這個資料集。

要什麼引入與缷除套件,可以參考【R筆記】R的套件載入與缷除

如果你需要進一步地認識 R,我推薦:

還有只有 Kindle 版本的這本:

【R筆記】R的套件載入與缷除

在使用 R 載入套件時,一定要先來認識 labrary() 這個函式:
> ?library
它的功能就是「載入並掛載附加套件」。 這個函式主要功能在用來載入我們要用的R套件,比如我們要用一函式名稱為 lda,首先想要瞭解一下它的用法:
> ?lda
No documentation for ‘lda’ in specified packages and libraries:
you could try ‘??lda’
但我們會得上列的錯誤訊息,意思是說,在目前的套件或函式庫找不到 lad 這個函式的說明,它又很好心地告訴我們,可以試試「??lda」,於是我們在 console 中輸入:
> ??lda
就會跑出來搜尋的結果的說明文件:


再點「lda」,就可以看到如下的畫面:


太好了,在文件的第一行,我們可以看到「lda{MASS}」這一行字,在函式後面的大括號中所列出來的,是一個套件名稱,這表示「lad」這個函式,是存在於「MASS」這個套件中。我們知道要使用「lda」這個函式,就需要「MASS」這個套件,再來就是使用這個指令來引入:
> library(MASS)
引入之後,我們再輸入「?lda」這個指令,說明文件就會直接開啟,而不會回傳任何錯誤訊息了。

若我們要檢視目前引入的套件有那些,可以使用這個 search() 這個函式:
> search()
 [1] ".GlobalEnv"        "package:MASS"      "tools:RGUI"       
 [4] "package:stats"     "package:graphics"  "package:grDevices"
 [7] "package:utils"     "package:datasets"  "package:methods"  
[10] "Autoloads"         "package:base"  
嗯哼!在結果中,可以看出目前引入的套件,也包含 MASS 這個套件。 在引入某個套件後,若要缷除 (detach) 它,可以使用 detach() 這個命令,它需要傳入一個參數,就是我們要缷除的套件名稱,如:
> detach(package:MASS)
這裡要注意的是,在參數中,缷除的套件名稱前,需要加「package:」。 缷除後,我們再使用 search(),再次檢視引入的套件時,就看不到「MASS」這個套件了:
> detach(package:MASS)
> 
> search()
 [1] ".GlobalEnv"        "tools:RGUI"        "package:stats"    
 [4] "package:graphics"  "package:grDevices" "package:utils"    
 [7] "package:datasets"  "package:methods"   "Autoloads"        
[10] "package:base"
如果你需要進一步地認識 R,我推薦:

還有只有 Kindle 版本的這本:

2014年3月12日 星期三

【筆記】使用Redis client時的指令整理

使用 Redis client 連線到遠端伺服器,使用下列指令:
$ ./redis-cli -h your_ip
使用 Redis client 要關閉與伺服器的連線,使用下列指令:

redis 127.0.0.1:6379> QUIT

連線到 Redis DB 後,要關閉伺服器,使用下列指令:

關閉 Redis DB,並且強制 DB 儲存目前的運作 (operation):

redis 127.0.0.1:6379> SHUTDOWN SAVE

關閉 Redis DB,並且制止 DB 儲存目前的運作 (operation):

redis 127.0.0.1:6379> SHUTDOWN NOSAVE

參考資料:

  1. http://redis.io/commands#server

【P筆記】PHP中 empty、isset,與 is_null 的用法

php.net的文件中,可以找到下列的一張表格,它說明了如何對一個變數做型別上的判斷等函數間的比較:

這裡到提到三個函數:empty()is_null()isset()

empty
  1. 判斷傳傳入的變數是否為空,若傳入的變數是空、0、FALSE的值,或該變數不存在,則此函數傳回 true。在PHP5.5以前的版本,empty() 只支援以變數傳入,如 empty(0) 不是一個合法的呼叫方式。
  2. 下列的值會被視為是空的:""0"0"NULLFALSEarray()$var (一個被宣告的變數,但沒有被指定值)。

is_null

判斷傳入的變數是否為NULL

isset

判斷一個變數是否己被設置 (set),而且不是 NULL,若使用 unset() 函數釋放 (unset) 一個變數之後,將該變數傳入 isset() 則會回傳 true。此函數可以接受多個參數,如:
isset($x, $y, $z);
當所有傳入的變數都有被設置時,此函式才會回傳 true。

現在擷取上列表格一些結果,以程式碼做些範例:
var_dump(empty($v0));    //若變數傳入 empty 前未宣告 ,empty 回傳:true

var_dump(is_null($v0));    //若變數傳入 is_null 前未宣告,
                           //is_null 會報「Undefined variable」的錯誤

var_dump(isset($v0));    //若變數傳入 isset 前未宣告 ,isset 回傳:false

$v1 = "";

var_dump(empty($v1));    //若變數值為 "",empty 回傳:true

var_dump(is_null($v1));    //若變數值為 "",is_null 回傳:false

var_dump(isset($v1));    //若變數值為 "",isset 回傳:true

$v2 = NULL;

var_dump(empty($v2));    //若變數值為 NULL,empty 回傳:true

var_dump(is_null($v2));    //若變數值為 NULL,is_null 回傳:true

var_dump(isset($v2));    //若變數值為 NULL,isset 回傳:false

$v3 = array(); //(空陣列)

var_dump(empty($v3));    //若變數值為 array() (空陣列),empty 回傳:true

var_dump(is_null($v3));  //若變數值為 array() (空陣列),is_null 回傳:false

var_dump(isset($v3));    //若變數值為 array() (空陣列),isset 回傳:true

$v4 = FALSE;

var_dump(empty($v4));    //若變數值為 FALSE,empty 回傳:true

var_dump(is_null($v4));    //若變數值為 FALSE,is_null 回傳:false

var_dump(isset($v4));    //若變數值為 FALSE,isset 回傳:true

$v5 = TRUE;

var_dump(empty($v5));    //若變數值為 TRUE,empty 回傳:false

var_dump(is_null($v5));    //若變數值為 TRUE,is_null 回傳:false

var_dump(isset($v5));    //若變數值為 TRUE,isset 回傳:true

$v6 = "FALSE";

var_dump(empty($v6));    //若變數值為 "FALSE"(字串),empty 回傳:false

var_dump(is_null($v6));    //若變數值為 "FALSE"(字串),is_null 回傳:false

var_dump(isset($v6));    //若變數值為 "FALSE"(字串),isset 回傳:true

$v7 = "TRUE";

var_dump(empty($v7));    //若變數值為 "TRUE"(字串),empty 回傳:false

var_dump(is_null($v7));    //若變數值為 "TRUE"(字串),is_null 回傳:false

var_dump(isset($v7));    //若變數值為 "TRUE"(字串),isset 回傳:true

$v8 = 0;

var_dump(empty($v8));    //若變數值為 0,empty 回傳:true

var_dump(is_null($v8));    //若變數值為 0,is_null 回傳:false

var_dump(isset($v8));    //若變數值為 0,isset 回傳:true

$v9 = "0";

var_dump(empty($v9));    //若變數值為"0"(字串),empty 回傳:true

var_dump(is_null($v9));    //若變數值為"0"(字串),is_null 回傳:false

var_dump(isset($v9));    //若變數值為 "0"(字串),isset 回傳:true

2014年3月10日 星期一

【J筆記】Java的小數點進位與四捨五入

在Java中對小數點做四捨五入,是拜歐曾經的痛,不過,只痛那一下下,之後就通體舒暢了。

要在Java中對小數做處理,不得不提到BigDecimal這個類別,使用它的setScale方法,就可以得到想要的小數點處理。

如,要做四捨五入:
package idv.jk.math;

import java.math.BigDecimal;

public class BigDecimalEx {

    public static void main(String... args){

        double a = 3.454;
        double b = new BigDecimal(a)
                           .setScale(1, BigDecimal.ROUND_HALF_UP)
                           .doubleValue();
        System.out.println("四捨五入到小數點下一位: " + b);

        b = new BigDecimal(a)
                        .setScale(2, BigDecimal.ROUND_HALF_UP)
                        .doubleValue();
        System.out.println("四捨五入到小數點下二位: " + b);

    }

}

得到的結果:

四捨五入到小數點下一位: 3.5
四捨五入到小數點下二位: 3.45

setScale中,傳入的第一個參數為要進位的小數點位數,第二個參數表示進位時的方式,如上例就是我們熟知的「四捨五入」,當要捨去的位數為「>= 5」時,就進位,詳細請見Java Doc

大概知道用法後,來看一個令拜歐一度視為「玄學」的現象:
package idv.jk.math;

import java.math.BigDecimal;

public class BigDecimalEx {

    public static void main(String... args){

        double a = 3.45;
        double b = new BigDecimal(a)
                          .setScale(1, BigDecimal.ROUND_HALF_UP)
                          .doubleValue();

        System.out.println("四捨五入到小數點下一位: " + b);       

        b = new BigDecimal(a)
                     .setScale(1, BigDecimal.ROUND_HALF_DOWN)
                     .doubleValue();

        System.out.println("四捨五入到小數點下一位: " + b);

    }

}

在上列程式碼第17行的地方,拜歐將參數改成BigDecimal.ROUND_HALF_DOWN,在Java Doc中,若在setScale使用此參數,則捨去的部位要「> 5」才會做進位,所以「3.45」使用此參數,要進位到小數點下一位,應該是「3.4」,但程式執行得到的結果卻是:

四拾五入到小數點下一位: 3.5
四拾五入到小數點下一位: 3.5

去看了一下BigDecimal中的建構方法中有提到:你宣告一個double變數出來丟進BigDecimal中的建構方法中,如上列的「3.45」,但在Java中,「3.45」真正的值是「3.4500000000000000....555...」,所以上列程式捨去的部份是「> 5」的。

若你要精確地建構「3.45」的BigDecimal物件,就要用new BigDecimal(String str)這個建構方法,如:

package idv.jk.math;

import java.math.BigDecimal;

public class BigDecimalEx {

    public static void main(String... args){

        String a = "3.45";

        double b = new BigDecimal(a)
                           .setScale(1, BigDecimal.ROUND_HALF_UP)
                           .doubleValue();

        System.out.println("四捨五入到小數點下一位: " + b);

        b = new BigDecimal(a)
                     .setScale(1, BigDecimal.ROUND_HALF_DOWN)
                     .doubleValue();

        System.out.println("四捨五入到小數點下一位: " + b);
    }
}

執行結果:

四捨五入到小數點下一位: 3.5
四捨五入到小數點下一位: 3.4


【R筆記】使用R的向量(vector)的來做資料運算

vector 在 R 中是最簡單的資料結構,他是包含一系列資料的集合,如:
v <- (1, 2, 3, 4, 5)
上列的指定中,v 這個變數被指定了含有五個數字的集合。
ch <- c('a', 'b', 'c')
上列的指定中,ch 這個變數被指定了含有三個字元的集合。

上列指定運算子右邊的 c(...) 其實是一個函數,可以在 R console 中輸入:
help(c)
來看如何使用他的說明。

除了上列的指定方式外,我們也可以使用下列方式來指定一個 vector 內的元素:
v4 <- c(1, 2, 3, 6:10)
這指定了「1, 3, 3, 6, 7, 8, 9, 10」給 v4 這個變數。

若我們要取得 vector 某一個 index 的元素,可以使用:
v4[1]
這表示取得 v4 中的第一元素,這裡要注意的是 vector 的 index 是從 1 開始算的。

另外,也可以使用判斷式來取得滿足某一條件的元素,像下列運算式中,會取得 v4 中大於、等於 6 的元素:
v4[v4 >=6]
結果:

[1]  6  7  8  9 10

指定一個 vector 變數之後,我們就可以對他做一些運算、操作,如要取得平均值,例如,我們可以使用
sd(v)
或者使用 mean 函數來取得平均值,如:
mean(v)
vector 另一個好用的地方,在於可以一次對 vector 中的所有元素 (element) 做運算,如:
1/v
結果就會得到 v 中每一個元素的倒數。 也可以對兩個 vector 做加減乘除的運算,例如我們另外指定一個 v1 的變數:
v1 <- (2, 4, 6, 8, 10, 3, 6, 9, 12, 15)
v/v1
依序就會得到 v 第1個元素除以 v1 第1個元素的值、 v 第2個元素除以 v4 第2個元素的值..., v 第1個元素除以 v4 第6個元素的值,以此類推。

這要注意的是,當使用兩個 vector 做運算時,其中一個 vector 內包含的元素數量,要是另一個 vector 中包含元素數量的倍數,不然就會出現如下的警告訊息:
警告訊息:
In v/v1 : 較長的物件長度並非較短物件長度的倍數

2014年3月6日 星期四

【R筆記】R的指定運算子 (assignment operator)

在R中,指定運算子 (assignment operator) 是「<-」,就是一個小於符號加上一槓,例如:
x <- 168
就是把「168」這個值指給「x」這個區域變數 (local variable)。

另外,也可以使用「=」來指定變數的值,如:
x = 168
但這樣的方式可能會和「==」這個比較的運算子搞混,因此不建議這樣使用。

還有,也可以用使用「->」,就是一槓加上一個大於的符號,將變數放在右邊,把值放在左邊,如:
168 -> x
但這樣程式碼一多的時候,會降低程式碼的可讀性,因此也不建議這樣使用。

有時候可能會看到有兩個小於加上一槓的指定運算子,像:
x <<- 168
這個指定方式是把「168」這個值指定給「x」這個「全域變數 (global variable)」。

另外,上方程式碼中的空格,是為了增加易讀性,你當然也可以寫成:
x<-168
但這樣擠在一起,程式看起來就不那麼易讀了。

在 R 中,還有一個函式 assign,也是用來指定變數的值:
> assign("y", 1234)
> y
[1] 1234
我在指定一個變數之後,直接在 console 中輸入該變數,就可以輸出該變數的值了:
> x
[1] 168
這樣的結果,和使用 print 這個函數輸出的結果一樣:
> print(x)
[1] 168
當我要列出我有指定過的變數時,我可以用
> ls()
[1] "x" "y"
最後,當我離開 R 時,若有儲存工作空間,指定過的變數也會被儲存,再次開啟時,這些變數也一樣可以再被使用。

【R筆記】如何設定R的工作目錄 (working directory of R)

執行R的時候,可以使用下列指令,來取得目前所在的工作目錄:
getwd();


R就會顯示目前所在的工作目錄:


 若你要自訂執行R時的預設工作目錄,可以使用下列方法:

在桌面捷徑上點按滑鼠右鍵,開啟選單後再點按【內容】:


在「開始位置」的欄位中輸入你啟動程式後要做為預設工作目錄的資料夾位置:


點按【確定】後完成設定。

再執行一次 getwd() 就可以看到工作目錄已經更改。

若你有儲存某一個「.RData」在某個資料夾下,當你開啟該檔案後,R的工作目錄就會是存放該「.RData」檔的資料夾。

若你想要進一步學習R,我推薦: