Amazon Ads

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"、NULL、FALSE、array()、$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("四捨五入(ROUND_HALF_UP)到小數點下一位: " + b);       

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

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

    }

}

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

四拾五入(ROUND_HALF_UP)到小數點下一位: 3.5
四拾五入(ROUND_HALF_DOWN)到小數點下一位: 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("四捨五入(ROUND_HALF_UP)到小數點下一位: " + b);

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

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

執行結果:

四捨五入(ROUND_HALF_UP)到小數點下一位: 3.5
四捨五入(ROUND_HALF_DOWN)到小數點下一位: 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,我推薦: