[Server 番外篇] 建立自己的本機虛擬伺服器 2 - Ubuntu 基本設定與安裝 Node.js, MongoDB 嗨又到了 Server 時間了!
接下來我們都會做一些指令操作,
如果進一步有興趣的可以 Google 鳥哥的私房菜,
完整的 Linux 操作教學,淺顯易懂,想學習操作 linux OS 的話必看!
今天我們要稍稍整理一下昨天剛安裝完的 Ubuntu 作業系統,以及安裝一些我們需要用到的東西
首先我們的第一步就是先開啟終端機,到昨天放 Vagrantfile 的資料夾:
$ cd ~/ithome/ 開啟 Ubuntu
$ vagrant up 順帶一提,有時候開機時可能會卡在一個地方:
default: Warning: Connection timeout. Retrying... default: Warning: Connection timeout. Retrying... default: Warning: Connection timeout. Retrying... 這個就稍微等一下吧~ 如果電腦性能比較差的話可能會卡比較久,不過應該不至於會卡超過 10 分鐘
如果卡超過十分鐘可能要強制中斷,並且尋找解決辦法了~
開機完成後就登入吧!
$ vagrant ssh ... vagrant@vagrant-ubuntu-trusty-64:~$ Ubuntu 套件, 設定時區 今天就要來幫 Ubuntu 安裝一些東西,
Playground - function 來看看 Swift 各種 function 的寫法吧!
Swift 使用 func 當作宣告的保留字
GOLANG 的 fu…. XD
寫 Swift 的 function 會很開心
基本的 func say() { println("Hello!") } 有一個回傳值的 func say() -> String { return "Hello!" } 有多個回傳值的!!! (就是回傳 Tuple) func say() -> (String, Int) { let greeting = "hello" let times = 5 return (greeting, times) } say() 有參數的 func say(g: String) { println(g) } say("Hello") 多個參數
VirtualBox 是一套虛擬軟體,可以方便幫助我們在現有的作業系統上
模擬另一個作業系統 (如 linux, Ubuntu, CentOS…)
在虛擬機器裡面所以的一切變動,都不會影響到現有的作業系統,
非常適合拿來做測試使用
由於現在大部份的 Service 除了架設在 Windows Server 外,最大宗的就是 *nix distribution 了
因此這在這個系列文中,也是一定要教大家如何建立起虛擬測試機器,
來模擬真實 Server 環境中,如何架設自己撰寫的 API Service
VirtualBox 到 VirtualBox 官方網站下載合適的安裝檔案吧!
安裝完成就可以了!
因為我們接下來會使用 Vagrant 這套 commaond line tool 來對 VirtualBox 進行操作
因此只要安裝完 VirtualBox 後就可以不用管他了 XD
Vagrant Vagrant
它可以幫助我們快速的建立一個輕量、可重複使用、並且可以打包起來帶著走的環境
透過編輯一個設定檔,就可以簡單設定該虛擬系統的 *nix 基本設定,如 共享資料夾、網路存取等等,
不需要透過 VirtualBox
通常這套軟體可以應用在團隊開發上:
以網頁開發來說,如果大家的測試環境與版本都不太一樣,例如 apache 或 php 版本不同
有時候會造成團隊溝通的負擔,因此透過 Vagrant 將 server 環境重新建立一套虛擬機器,
並且透過 Vagrant 打包,就可以丟給其他人使用,這樣一來大家的環境都一樣,
就可以避免這個問題,
而且還有一點,Server 的安裝是很累人的,同樣的事情基本上都不會想做第二遍,
因此打包一個乾淨的環境後備份,弄髒了可以隨時快速再把備份拿出來用,非常方便!
安裝: 到 下載頁面 尋找適合自己的下載並且安裝
Array 宣告 // var VARIABLE_NAME: [TYPE] = ..... var fruits: [String] = ["apple", "banana"] var nums: [Int] = [1, 2] // 或是讓 Swift 自行判斷類型: var fruits = ["apple", "banana"] var nums = [1, 2] // 初始化: var cars = [String]() ps. Beta 版時的寫法是 var fruits: String[]
現在已經變成了 var fruits: [String]
操作 // 判斷該陣列是否有值,回傳 true 或 false fruits.isEmpty // 增加元素 fruits.append("watermelon") fruits += ["lemon"] // 取值 fruits[0] fruits[0...2] // 刪除值 - 將 apple 移除,banana 會自動補上 fruits.
使用技術與工具介紹及原因 終於要開始進入正題了!
在了解 REST/RESTful 後,
就要從無到有 - 從 Server 到 API endpoint 都由自己打造
今天會先來說明接下來會使用到哪些工具及技術
由於筆者使用 Mac ,因此若是有其他平台的使用者可能需要自行找教學
Server - Ubuntu with Vagrant + VitrualBox 接下來幾天會先從這個部分開始提起
我們會使用 VirtualBox + Vagrant 的方式來建立自己的虛擬環境
避免一些讀者可能對 Server command line 不熟
這個部分是大家可以跳過的部分,但是我還是會從無到有架起來
Backend Language - Node.js 後端語言使用了 Node.js,其實本來有考慮使用 Golang,
但顧及自己的時間… 還是使用 Node.js,方便快速
這幾年是 Javascript 的時代,
優勝美地似乎也可以支援使用 Javascript 撰寫 Automation Tool
從前端打到後端甚至到 DB 都可以使用到 Javascript ,
是該來看看 Javascript 的語法特性了 :D
而且 Node.js Event-driven 的特性,可以利用少少的資源提供高效能的服務
同時搭配易用性及社群活躍度,這是我選擇 Node.js 而非選擇 Golang 的原因
Playground - Optional, ! and ? 今天要來探討 Optional 型別,我認為這塊是初學 Swift 常遇到的問題
大家搞不懂 “!” “?” 到底在幹什麼,所以今天就來了解一下
在 Swift 中,所有的資料型別都不能賦予 nil
也就是以下這件事是不成立的:
var x: String = "test" x = nil 所以在 Swift 底下,就要使用 Optional 來處理值可能不存在的情況
當一個變數 x 被宣告成 Optional 型別時,該變數就會有兩個情況:
1. 有值,等於 x 2. 沒有值 要宣告一個變數可能為 nil 時的方式是使用問號 ‘?‘:
// 此時 x = "yaya" var x: String? = "yaya" // 此時 x 沒有值 x = nil 拿以下程式在 Playground 執行看看:
使用時機與實際 API 參考 什麼時候需要打造 RESTful API?
看看別人的 RESTful API (Instagram/Twitter)
什麼時候需要打造 RESTful API?
我認為當有數組資源要被多種不同平台使用時,就需要打造 RESTful API
例如,有 Android/ iOS / Web 要對同一 table 做存取時,
假設有個 MySQL DB,各個平台都使用各自的 mysql-driver 來直接操作 DB
假設有個 A 專案建立了一套書籍管理系統,資料庫裡記錄了大大小小的書籍,
而有個新的 B 專案需要使用到書籍的資料,此時 DB 操作的程式碼只能再寫一遍,
且各個平台重新撰寫,似乎是不大靠譜。
撰寫 RESTful API 的好處之一即是 RESTful 使用 HTTP 協定,
各個平台皆支援,不需要太複雜的程式,只需要使用各個平台的 http-client,
各個平台也不需要了解 DB 操作語法,只需要知道 json, xml 習慣的資料格式,
且開發 API 還能夠對各個資源輕易地上 cache 增進反應速度,
開發 RESTful API 好處多多,哪天想 Open API 也就不需要再多作處理了~
接著讓我們來看看兩個有名網站的 API 吧!
變數與常數 定義一個變數:
var obj: String = "" var 是保留字,宣告 obj 是一個變數名稱,冒號後面接資料形態
以此例子來說,宣告了一個字串變數叫做 obj,並且初始化為 “” 空字串
let obj: String = "" let 同樣是用來宣告一個變數,但是宣告此變數後,該變數的值無法被改變,
無法被改變的數值其實正正的名字就叫做常數 以上面的例子來說, 若我們多做一件事:
let obj: String = "" obj = "test" 若我們試圖去更改 obj,讓 obj 從空字串變成 “test” 時,
Xcode 就會報錯,不能更改該值
再來是宣告的變型,其實宣告時不一定要給資料形態,
Swift 會自動從後面的值來判斷 x 可能是什麼資料形態,
只是由於筆者的習慣,會儘量在後面加上該變數的資料型別
var x = "test" 一行內宣告多值:
var x = 0.0, y = 0.0, z = 0.0 我們就可以在 Playground 裡面試著宣告一些變數看看,並且使用昨天的輸出函式來輸出變數:
Representational State Transfer,簡稱 REST,
它是一種網路架構風格,他並不是一種標準。
而 RESTful 可以這樣子想像:
美麗 (Beauty) 的事物可以稱為 Beautiful
設計為 REST 的系統就可以稱為 RESTful
以 API 而言,假設我們正在撰寫一組待辦事項的 API,
可能會有以下方式來作為 API 的 interface:
獲取使用者資料 /getAllUsers 獲取使用者資料 /getUser/1 新增使用者資料 /createUser 更新使用者資料 /updateUser/1 刪除使用者資料 /deleteUser/1 若是以 REST 風格來開發 RESTful API 的話:
獲取使用者資料 /GET /users 獲取使用者資料 /GET /user/1 新增使用者資料 /POST /user 更新使用者資料 /PUT /user/1 刪除使用者資料 /DELETE /user/1 兩者差異是在於 RESTful API 充分地使用了 HTTP protocol (GET/POST/PUT/DELETE),
達到
1. 以直觀簡潔的資源 URI
2. 並且善用 HTTP Verb
承上篇,
RESTful 的優點如下所列:
1. 瀏覽器即可以作為 client 端 2. 可以更高效地利用 cache 來達到更快的回應速度 3. 界面與資料分離 4. 節省伺服器的計算資源 5. 可重用! web/android/ios 都可以用, 無痛轉換! RESTful 的要求:
1. client - server 架構 2. 分層系統 3. 利用快取機制增加效能 server-side: 在 GET 資源時,若該資源並沒有被變更,就可以利用 cache 機制減少 query,並且加快回應速度 client-side: 透過 client 端 cache 記錄 cache 版本, 若向 server 要求資源時發現 server 最新版與 cache 相同, 則 client 端直接取用本地資源即可,不需要再做一次查詢 省機器運算及流量 = 省錢 4. 通訊協定具有無狀態性 不能讓兩隻 API 做同一個動作! 假設完成轉賬手續必須先 call A 再 call B 的話, 若做完 A 後斷線導致 B 無法執行,後續要處理 A -> B 的方式會很麻煩 且不應該假設伺服器知道目前的狀態!