2017年1月14日 星期六

在Mac上使用Homebrew安裝R & RStudio

前言

此文章紀錄了在一台新的Mac上安裝R與RStudio的歷程。

因網路上的資訊較多集中在Windows系統的安裝,即便是Mac的教學也是以直接下載.pkg安裝的方式為主(https://cran.r-project.org/bin/macosx/)。
故特此紀錄使用Homebrew套件管理工具來安裝的過程。

套件資訊

其中收錄了許多科學計算的工具,其中也可以找到我們此次的目標:homebrew/science/R

使用Homebrew安裝

安裝必要的相依套件為數不少,其中包含需要下載並編譯gcc等,需要花不少時間。

Installing dependencies for homebrew/science/r:
gmp, mpfr, libmpc, isl, gcc, gettext, jpeg, libtiff, pcre, libpng, freetype, fontconfig, pixman, libffi, glib, cairo

安裝指令:
$ brew install homebrew/science/R

# 要注意保持網路連線與約半小時的時間。(by 2016 late Macbook Pro)

使用R

在命令視窗輸入R or r 即可執行
$ r

R version 3.3.2 (2016-10-31) -- "Sincere Pumpkin Patch"
Copyright (C) 2016 The R Foundation for Statistical Computing
Platform: x86_64-apple-darwin16.1.0 (64-bit)

R 是免費軟體,不提供任何擔保。
在某些條件下您可以將其自由散布。
用 'license()' 或 'licence()' 來獲得散布的詳細條件。

R 是個合作計劃,有許多人為之做出了貢獻。
用 'contributors()' 來看詳細的情況並且
用 'citation()' 會告訴您如何在出版品中正確地參照 R 或 R 套件。

用 'demo()' 來看一些示範程式,用 'help()' 來檢視線上輔助檔案,或
用 'help.start()' 透過 HTML 瀏覽器來看輔助檔案。
用 'q()' 離開 R。
>

查看版本

  1. 參考文件
    https://stat.ethz.ch/R-manual/R-devel/library/base/html/Version.html
  2. 查詢version
    進入R的互動介面中使用version,可知已安裝3.3.2版
  3. > version
                   _                           
    platform       x86_64-apple-darwin16.1.0   
    arch           x86_64                      
    os             darwin16.1.0                
    system         x86_64, darwin16.1.0        
    status                                     
    major          3                           
    minor          3.2                         
    year           2016                        
    month          10                          
    day            31                          
    svn rev        71607                       
    language       R                           
    version.string R version 3.3.2 (2016-10-31)
    nickname       Sincere Pumpkin Patch       
    >

安裝RStudio

  1. brew中搜尋rstudio
  2. $brew search rstudio
    homebrew/science/rstudio-server
    Caskroom/cask/rstudio                        Caskroom/versions/rstudio-daily            Caskroom/versions/rstudio-preview
    
  3. 可以得知rstudio位於Caskroom/cask/rstudio
  4. 安裝:brew install Caskroom/cask/rstudio
  5. $ brew install Caskroom/cask/rstudio
    ==> brew cask install Caskroom/cask/rstudio
    ==> Satisfying dependencies
    ==> Installing Formula dependencies from Homebrew
    homebrew/science/r ... ==> Warning: homebrew/science/r-3.3.2 already installed
    done
    complete
    ==> Downloading https://download1.rstudio.org/RStudio-1.0.136.dmg
    ######################################################################## 100.0%
    ==> Verifying checksum for Cask rstudio
    ==> Moving App 'RStudio.app' to '/Applications/RStudio.app'
    🍺  rstudio was successfully installed!
    
  6. 如上面成功訊息所述,可到應用程式中找到RStudio
  7. 開啟RStudio


2017年1月8日 星期日

Anaconda安裝

Anaconda安裝

#以下為使用Mac作為開發環境

原則:優先使用套件管理程式安裝

在此使用Homebrew作為套件管理工具,關於Homebrew安裝可參考:http://brew.sh/index_zh-tw.html

1. 使用情境

有了brew後想安裝anaconda,但在終端機使用brew search搜尋發現有兩個關鍵字anaconda和anaconda2,所以應該安裝哪一個呢?

brew search anaconda

Caskroom/cask/anaconda                                                 Caskroom/versions/anaconda2


搜尋後找到程式碼:

2. anaconda



3. anaconda2




4. anaconda官網



結論

證實brew上的anaconda是採用Python 3+的版本,anaconda2則是採用Python 2.7。
至於該用哪一個當然就是看需求了。

以安裝anaconda(anaconda3)為例,安裝命令如下:
        brew cask install Caskroom/cask/anaconda

  • 需要取得權限,所以得輸入登入密碼,可別下了命令就跑走了!
  • 會裝的東西滿多的,基本上算是懶人包。
  • 安裝訊息
    Running installer script Anaconda3-4.2.0-MacOSX-x86_64.sh
    PREFIX=/Users/[YourUserName]/anaconda3
    ...下略...
  • 查看安裝資料夾,安裝好了!
  • 可是現在還是無法方便地使用,因為還沒將Conda加入$PATH中,直接在終端機呼叫conda install SomePackage,會收到-bash: conda: command not found
  • 到bin下找到conda
  • 路徑為:/Users/[YourUserName]/anaconda3/bin
  • 將此路徑加入classpath中,詳細方式已經有很多教學可參考,如:
    https://coolestguidesontheplanet.com/add-shell-path-osx/
  • 簡單的說就是,將conda的路經加在原有的$PATH前,除了暴力的直接修改/etc/paths內容外,還可以用串的,如果沒有的話可以在家目錄下新增一個.bash_profile檔,在終端機起來時把要用的東西串進PATH來用。
    • 開啟檔案:vim .bash_profile
    • 新增內容:export PATH="/Users/[YourUserName]/anaconda3/bin:$PATH"
    • 存檔
    • 關閉終端機,重新開終端機
    • echo $PATH,應可看到新增的conda路徑在原本$PATH前。

2016年2月16日 星期二

Javascript的資料型態

以下說明建議安裝node.js環境,實際操作會較有印象。
  • 資料型態
    • 參考:http://www.w3schools.com/js/js_datatypes.asp
      • String, Number, Boolean, Array, Object.
      • null
      • undefined
    • 測試運算
      • typeof:用來測試物件型態,回傳值是字串
      > typeof 1 //Number
      'number'
      > typeof 'abc' //String
      'string'
      > typeof true //Boolean
      'boolean'
      > typeof {} //Object
      'object'
      > typeof undefined //undefined
      'undefined'
      > typeof null //null
      'object'
      > typeof function() {}; //Function
      'function'
      
      • instanceof:用來檢視某個物件是哪個型態的實例
      > var x = {};
      undefined
      > x instanceof Object;
      true
      > [] instanceof Object;
      true
      > [] instanceof Boolean;
      false

    1. Number
      • 沒有整數與浮點數的差別
      • 都是IEEE754 64位元浮點數
        • 最小值Number.MIN_VALUE
        • 最大值Numner.MAX_VALUE
      > Number.MIN_VALUE
      5e-324
      > Number.MIN_SAFE_INTEGER
      -9007199254740991
      > Number.MAX_VALUE
      1.7976931348623157e+308
      > Number.MAX_SAFE_INTEGER
      9007199254740991
      • 若使用位元運算(如:>>,<<等),結果會是32位元有號整數。
      • 不建議使用位元運算
      • 宣告數值時預設為10進位整數
        • 也可0開頭表示8進位整數
        • 或是0x開頭表示16進位整數
        • 嚴格模式下不允許使用8進位
      > 100
      100
      > 0100
      64
      > 0xFF
      255
      • 可用科學記號表示浮點數
      > 1.234
      1.234
      > 1.234E10
      12340000000
      • 數值的特殊值
        • 無限大
          • 正無限大:Infinity
          • 負無限大:-Infinity
      > Infinity
      Infinity
      > -Infinity
      -Infinity
      > Number.POSITIVE_INFINITY
      Infinity
      > Number.NEGATIVE_INFINITY
      -Infinity
      • 非數值(Not a Number)
        • 表示為NaN,也可用Number.NaN取得
        • NaN不等於任何值,NaN也不等於NaN
          • 故無法直接測試NaN === NaN
          • 有isNaN函式,但無法自動轉型成數字得值,都會讓isNaN的結果為true,故非絕對準確。
          • 但可利用NaN是JavaScript中唯一不等於自身的值之特性改採用 value !== value來判別。
          • 更特殊的是,typeof NaN的結果是number
      > var a = 1/'a'
      undefined
      > a
      NaN
      > isNaN(a)
      true
      > isNaN('abcdefg')
      true
      > isNaN(undefined)
      true
      > function isRealNaN(value) {
      ... return value !== value;
      ... }
      undefined
      > isRealNaN(a)
      true
      > isRealNaN('abcdefg')
      false
      > isRealNaN(undefined)
      false
      > typeof NaN
      'number'
    2. String
      • 可使用單引號或雙引號來包著一串文字,都是字串
      • JavaScript中沒有字元
      • 習慣在JavaScript程式中使用單引號,將雙引號保留在HTML中使用。
      > typeof 'A'
      'string'
      > typeof "A"
      'string'
      > var html = '<input type="text" value="123">';
      undefined
      > html
      '<input type="text" value="123">'
    3. Boolean
      • 只有true與false
      > typeof true
      'boolean'
      > typeof false
      'boolean'
    4. Array
      • 是物件(Object)
      • 以[ ]包覆並以逗點分隔的一組物件
      > typeof new Array();
      'object'
      > var arr = ['a',1,true]
      undefined
      > arr
      [ 'a', 1, true ]
      > typeof arr
      'object'
    5. Object
      • 即是指物件(Object),除了基本資料型態外都是Object的實例。
      • 以{}產生物件,其屬性是以逗點分隔之一組name:value pair
      • 屬性可以用.來存取,也可以['name']
      > var man = {name:'Peter',age:23};
      undefined
      > man
      { name: 'Peter', age: 23 }
      > man.age
      23
      > man['age']
      23
      > typeof man;
      'object'
      > typeof new Object()
      'object'
      > typeof {}
      'object'
      > typeof []
      'object'
    6. null
      • 表示沒有任何東西
      • 不參考至任何物件,可將變數設為null
      • 可用===測試變數是否為null
      • 特殊行為:
        • 對null做typeof會是object
        • 對null做instanceof會是false
      > var x = null;
      undefined
      > x === null
      true
      > typeof null
      'object'
      > null instanceof Object
      false
    7. undefined
      • 欲取得沒有指定任何值的變數或屬性,會出現undefined
      • 對undefined做typeof會是undefined
      • undefined會等於undefined
      > var x = null
      undefined
      > var y
      undefined
      > x
      null
      > y
      undefined
      > undefined === undefined
      true

    2016年2月4日 星期四

    node.js + jQuery 實作Ajax範例


    需求:讓純行動端開發的同仁認識Ajax的原理與流程
    目標:Server端接收到Post上行資料,並回應給前端網頁


    node.js快速建置HTTP回應電文範例所產生的server.js檔為基礎,來建構簡易的Ajax。
    請在處理createServer的匿名函數function(req,res)的一開頭加入:
    
    if (req.method === 'POST') {
        req.on('data', function (data) {
            console.log("Post data : " + data);
        }); 
    }
    說明:在request請求中判斷method為POST方法時,直接在後端印出POST的內容。

    此例中後端完整程式碼(server.js)如下:
    
    http = require('http');
    url = require('url');
    
    var host = '127.0.0.1';
    var port = 12345;
    
    var xml = 'KerKer';
    
    var server = http.createServer(
        function(req,res) {
            if (req.method === 'POST') {
                req.on('data', function (data) {
                    console.log("Post data : " + data);
                });
            }
    
            var pathname = url.parse(req.url).pathname;
    
            if(pathname === '/') {
                res.writeHead(200,{'Content-Type':'text/plain'});
                res.end('^_^ ~');
            } else if(pathname === '/aboutme/') {
                res.writeHead(200,{'Content-Type':'text/xml'});
                res.end(xml);
            }
        }
    );
    server.listen(port);
    console.log('Server running at http://' + host + ':' + port);
    

    前端部分,先準備一份基礎HTML:
    
    <html>
    <head>
        <title>Ajax</title>
        <script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
        <script>
            var Submit = function(){
                //待填入
            }
        </script>
    </head>
    <body>
        <form id="sentToServer">
            <input type="text" name="data"/>
            <input type="button"  value="Send" onClick="Submit()"/>
        </form>
    </body>
    </html>
    
    說明:
    • 使用到jQuery故須引用遠端資料,或是將jquery.js下載到電腦上再指定正確的目錄引用之。
    • 表單中只呈現一個輸入框與按鈕,Send按鈕在被點擊時呼叫JavaScript的函數Submit()
    • 以瀏覽器打開:
    接下來在Submit填入:
    
    var path="http://127.0.0.1:12345";
    $.ajax({
        url: path,
        data: $('#sentToServer').serialize(),
        type:"POST",
        dataType:'text',
        success: function(msg){
            alert(msg);
        }
    });
    
    • 以node.js執行server.js程式,監聽本機的12345 Port
    • 以開發工具瀏覽或瀏覽器打開ajax.html
    • 瀏覽器畫面:
    • 終端機畫面:
    • 前端接收到訊息並彈出對話框,後端成功收到並印出上行資料。
    此範例目的是感受Ajax的動作原理,大多數的狀況中html檔應該是由後端程式提供存取(放在後端),而非獨立在前端。 以Chrom瀏覽器為例,為了安全性問題避免跨站攻擊,後端會收到資料,但前端沒有正確跳出回應訊息。 此情境下要成功接收回覆需要在server.js的回應改為:
    
    res.writeHead(200,{'Content-Type':'text/plain','Access-Control-Allow-Origin': '*'});
    
    即允許所有來源的跨域存取(因此例只是執行在本機的html檔)

    2016年2月2日 星期二

    以node.js快速建置HTTP回應電文範例


    需求:Android與iOS作為Client端之開發單位進行電文查詢之教育訓練。
    目標:以最簡易的方式使手機開發工程師可以模擬與Server做資料交換。
    分析:考量到團隊成員大多只有純行動開發的經驗,故選用JavaScript作為共通的語言。
    環境:Mac OS


    下面分享在本機啟動http server並回覆電文的方式,使用node.js以Javascript語言開發步驟:
    1. 下載與安裝node.js:https://nodejs.org/en/
      • 此例使用的是v5.5.0
      • 安裝完成訊息如下,顯示安裝套件與其位置
      • Node.js was installed at
           /usr/local/bin/node
        npm was installed at
           /usr/local/bin/npm
        Make sure that /usr/local/bin is in your $PATH.
        
    2. 編輯javascript檔案如下範例server.js
    3. 在終端機前往server.js相同目錄內執行:node server.js
      • 在終端機內要停止目前執行的程式可按control + c
    4. 瀏覽器中連接http://127.0.01:12345/aboutme/
    5. 瀏覽器顯示aboutme電文:(查詢使用postman)
    6. 之後即可以Client端程式連接此服務進行後續資料解析。
    
    http = require('http');
    url = require('url');
    
    var host = '127.0.0.1';
    var port = 12345;
    
    var xml = '<root><name>KerKer</name></root>';
    
    var server = http.createServer(
        function(req,res) {
            var pathname = url.parse(req.url).pathname;
             
            if(pathname === '/') {
                res.writeHead(200,{'Content-Type':'text/plain'});
                res.end('^_^ ~');
            } else if(pathname === '/aboutme/') {
                res.writeHead(200,{'Content-Type':'text/xml'});
                res.end(xml);
            }
        }
    ); 
    
    server.listen(port);
    console.log('Server running at http://' + host + ':' + port);