Quantcast
Channel: 小惡魔 – 電腦技術 – 工作筆記 – AppleBOY
Viewing all 325 articles
Browse latest View live

Laravel Homestead 搭配 phpMyAdmin Docker

$
0
0

laravel

相信大家對於 Laravel 推出的 Homestead 開發環境不陌生,本篇不會教學使用 Homestead,直接看繁中官網的教學就可以完成了,Homestead 可以幫助開發者快速架設好 Laravel 環境,當然 Homestead 也適用於 CodeIgniter 的開發,因為兩套 Framework 的環境是一樣的,Homestead 開啟 VM 後,會自動將 Local port 對應到 VM port 如下

  • SSH: 2222 → Forwards To 22
  • HTTP: 8000 → Forwards To 80
  • HTTPS: 44300 → Forwards To 443
  • MySQL: 33060 → Forwards To 3306
  • Postgres: 54320 → Forwards To 5432

所以可以透過電腦 Client 軟體控制相對應你想使用的 service,但是唯獨沒有提供 phpMyAdmin,所以我到 Docker Hub 找看看有無別人弄好的 phpMyAdmin 環境,很快的找到 Docker PHPMyAdmin,只要將相關指令設定好,就可以用一行指令在你的電腦開啟 phpMyAdmin 服務,Homestead 預設的 MySQL 帳號為 homestead 密碼 secret,看到上面 port 為 33060,用 docker-machine 指令來找 Host 名稱,請直接參考底下指令

$ docker run -d \
  -e MYSQL_USERNAME=homestead \
  -e MYSQL_PASSWORD=secret \
  -e MYSQL_PORT_3306_TCP_ADDR=192.168.99.1 \
  -e MYSQL_PORT_3306_TCP_PORT=33060 \
  --name laravel-phpmyadmin \
  -p 80 corbinu/docker-phpmyadmin

完成後,用 docker ps 來看目前啟動的 Docker VM

Screen Shot 2016-01-02 at 4.08.56 PM

從上圖可以發現 0.0.0.0:32771->80/tcp 打開 http://localhost:32771 就可看到 phpMyAdmin 登入介面,輸入預設帳號密碼就可以了。


Laravel 搭配 Google, Facebook, Twitter 第三方 OAuth 認證

$
0
0

laravel

Laravel 提供了 Socialite 套件讓開發者可以快速整合 Facebook, Twitter, Google, LinkedIn, GitHub and Bitbucket 等第三方服務的登入認證,我挑了大家最常使用的 Facebook, Twitter, Google 來整合,用 Google 跟 Twitter 需要注意一些小細節,首先是 Google 部分,如果大家去 Developer console 把 Oauth Callback 寫完,注意的是,這樣是不夠的,要去把 Contacts APIGoogle+ API 啟用,才可以真正使用 Google OAuth 認證服務。

Screen Shot 2016-01-14 at 10.28.14 PM

另外 Twitter App 部分,建立 App 請注意不要寫 localhost,要寫 127.0.0.1 這樣就可以送出了,預設的 Twitter App 是不給授權帳戶 Email 欄位,如果要拿到使用者 Email,請填寫此表單請官方開啟 Email 欄位權限服務即可,過幾天就會收來自 Twitter 底下信件

Screen Shot 2016-01-12 at 8.38.09 AM

最後到 App Console 介面就會看到多出額外權限設定選項,將其打勾就可以了。

Screen Shot 2016-01-12 at 9.20.15 AM

OpenSSH 安全性漏洞 CVE-2016-0777 and CVE-2016-0778

$
0
0

openssh

OpenSSH 今日公佈 Client Bug 漏洞 CVE-2016-0777 and CVE-2016-0778,發生原因是 SSH Clinet 跟 Server 溝通時,新功能 roaming 造成傳輸過程被惡意程式破解,影響的 OpenSSH 版本為 5.4 – 7.1. 大家快看看自己是否為這版本區間。此問題會發生在 SSH Client 而不是 Server 端,所以 Linux FreeBSDMacOS 都需要升級 OpenSSH,如果你是在 Windows 用 Putty 則不受影響。

修補漏洞

請升級您的 OpenSSH 版本,或者是透過底下方式先暫時修補,On Linux and FreeBSD

echo 'UseRoaming no' | sudo tee -a /etc/ssh/ssh_config

如果使用 MacOS 請改用底下指令

echo "UseRoaming no" >> ~/.ssh/config

最重要的步驟是,請重新產生您的 Key Pairs

# 產生 key
$ ssh-keygen -t rsa
$ ssh-copy-id user@123.45.56.78
# 或者是
$ cat ~/.ssh/id_rsa.pub | ssh user@123.45.56.78 "mkdir -p ~/.ssh && cat >>  ~/.ssh/authorized_keys"

延伸閱讀: OpenSSH Client Bug CVE-2016-0777 and CVE-2016-0778

如何選擇 Web Framework

$
0
0

framework

現在各大語言都有很多 web framework 可以選擇,上週整理自己對於 Web Framework 的一些原因及考量,總共整理 12 點,給大家參考看看

  • 使用情境
  • 軟體架構
  • 主機部署
  • 安裝及開發
  • 學習曲線
  • 核心功能
  • 資料庫 ORM
  • 前端開發
  • 測試
  • 文件
  • 社群活動
  • 團隊合作

底下是整理好的投影片

提升 npm install 安裝速度

$
0
0

Npm-logo.svg

npmNode.js 套件管理模組,相信大家對 npm 不會很陌生,如果對於 npm 不了解的,可以參考阮一峰寫的這篇文章,今天要來探討的是如何提升 npm install 的安裝速度,如果你正在嘗試 npm@3 版本,我建議可以先換到 npm@2 的版本會比較快(為什麼呢?底下有數據會說話)。Github issue 上也蠻多速度上的討論,然而前幾天有網友發表一篇關掉 progress 提升不少速度,實際上我們可以拿專案來測試 npm@2 及 npm@3 的速度看看。

npm@2 測試如下

$ rm -rf ~/.npm && rm -rf node_modules && time npm install

real    0m50.443s
user    0m43.468s
sys     0m17.817s

npm@3 測試如下 (關閉 progress)

$ npm set progress=false && rm -rf ~/.npm && rm -rf node_modules && time npm install

real    1m1.417s
user    0m10.825s
sys     0m2.880s

npm@3 測試如下 (啟動 progress)

$ npm set progress=true && rm -rf ~/.npm && rm -rf node_modules && time npm install

real    1m37.965s
user    0m14.065s
sys     0m3.350s

看了上面數據,你還會想用 npm@3 版本嗎?如果 npm 無法滿足您要的速度,沒關係,可以參考另外一套 node 套件管理模組 ied

ied

為什麼會出現這專案呢?那就是因為 npm@3 performance 沒有變得更好,反而更差了,這時候就會有強者跳出來寫一套 ied 跟 npm 相容的套件管理模組,不過這套件目前尚未支援完整的 npm 指令 (像是無法安裝 private 模組),用起來問題也蠻多的,但是速度提升了非常多,底下來看看數據:

$ rm -rf ~/.ied_cache && rm -rf node_modules && time ied install

real    0m16.260s
user    0m5.739s
sys     0m2.264s

速度從原本的 1 分鐘,變成 16 秒,但是我對於 ied 產生的目錄結構不是很喜歡,ied 會將 cache 資料放到 ~/.ied_cache 內,並且在 node_modules 內是透過 symbolic links 方式來串接(參考底下附圖),這樣看起來跟 npm@3 的結構上沒啥區別,還是把每個相依套件都放到第一層目錄了。

Screen Shot 2016-01-30 at 8.15.11 PM

pnpm

最後來介紹本週 @rstacruz 寫另外一套高效能的 node 管理模組,作者有說到 pnpm (Performant npm) 的靈感來自於 ied,我個人推薦這套的原因是,pnpm 會將 cache 存在 .store 底下,外面才用 symbolic links 連接,可以參考底下圖示

Screen Shot 2016-01-30 at 8.15.29 PM

另外此作者開發速度蠻快的,這也是我選這套的原因之一,底下附上數據

$ rm -rf node_modules && time pnpm install

real    0m9.132s
user    0m5.411s
sys     0m2.253s

總結

把上面數據整理起來

npm@2                   0m50.443s
npm@3 disable progress  1m1.417s
npm@3 enable progress   1m37.965s
ied                     0m16.260s
pnpm                    0m9.132s

packages 內容為:

"dependencies": {
  "babel-preset-es2015": "^6.3.13",
  "browserify": "^13.0.0",
  "chalk": "^1.1.1",
  "debug": "^2.2.0",
  "minimist": "^1.2.0",
  "mkdirp": "^0.5.1"
}

不管你是用 ied 或 pnpm 時間都比用 npm 版本來得快,但是目前支援度會是比較低,可以拿目前專案測試看看,最保險的就是拿 npm@2 來安裝管理套件。

Git tips: 更改 commit log 作者

$
0
0

github

Github 上面看到這 git-blame-someone-else 專案,用來隨時修改 commit log 作者,也就是可以任意改 commit id 內的 Author 欄位資訊,作者也相當幽默,直接拿此 commit id 改成 Linux 作者 Linus Torvalds

使用時機

大家會問到什麼時候才會用到需要修改 commit 作者,以我自己的狀況為例,在團隊內開發新功能會直接開新的 Branch 來開發,完成後會進行 code review,此時原開發者目前正在忙其他專案,其他團隊成員就必須幫忙修改原先 commit 內容,通常我是直接建議透過 git reset --soft HEAD^ 來更動原本 commit,而不是產生新的 commit,修改後作者就會變成自己,此時後這功能就派上用場了。

安裝方式

根據源專案是透過 root 權限,將執行檔丟到 /usr/loca/bin 目錄底下,但是我個人不建議用這方式,因為還需要 root 權限,要打密碼有點麻煩,我建議透過在家目錄建立 bin 目錄,並將此目錄加到 $PATH 變數內即可。

$ mkdir ~/bin
$ wget https://raw.githubusercontent.com/jayphelps/git-blame-someone-else/master/git-blame-someone-else -O ~/bin/git-blame-someone-else
$ chmod 755 ~/bin/git-blame-someone-else

修改 .bashrc,加入底下程式碼

# add bin folder to $PATH.
if [ -d "${HOME}/bin" ]; then
    export PATH=$PATH:${HOME}/bin
fi

使用方式

$ git blame-someone-else <author> <commit>

其中 author 格式為 Name <Email> 就可以了,附上執行前後的結果

執行前:

Screen Shot 2016-02-11 at 7.54.47 PM

$ git blame-someone-else "appleboy <appleboy@wu-boy.com>" 3adf61fc1605922fd880d98fb94d1f4f5a0a6289

執行後:

Screen Shot 2016-02-11 at 7.57.21 PM

最後要強調的是,由於修改 commit Author 會影響整個 Git Source Tree,所以要更新到遠端 Server 像是 Github 的話,就必須強制覆蓋

$ git push origin master -f

使用前請三思。

在 MAC OS 快速又簡單安裝 Docker 環境 – dlite

$
0
0

Go-brown-side.sh

Mac OS X 底下安裝 Docker 服務不難,只需要到 Docker Mac 教學網站下載 Docker Toolbox,就可以使用 docker-machine, docker, docker-compose 等指令操作 Docker 服務。本篇提供另外一種工具,讓 Mac 開發者可以快速使用 Docker 服務,就是這套用 Go 語言寫的 dlite 工具。

安裝方式

dlite 提供三種方式安裝

  1. 直接下載執行檔案 (推薦) (下載連結)
  2. 直接透過 brew 指令安裝: brew install dlite
  3. 開發者模式: git clone 專案,然後下 make dlite 產生執行檔案

請大家直接使用第一種方式安裝即可。

使用方式

安裝 dlite 需要使用到磁碟空間及記憶體,你可以動態指定 memory 使用量,或者是磁碟空間,詳細指令可以透過 dlite install -h 觀看

$ sudo dlite install -h
Usage:
  dlite [OPTIONS] install [install-OPTIONS]

creates an empty disk image, downloads the os, saves configuration and creates a launchd agent

Help Options:
  -h, --help            Show this help message

[install command options]
      -c, --cpus=       number of CPUs to allocate (default: 1)
      -d, --disk=       size of disk in GiB to create (default: 20)
      -m, --memory=     amount of memory in GiB to allocate (default: 2)
      -s, --ssh-key=    path to public ssh key (default: $HOME/.ssh/id_rsa.pub)
      -v, --os-version= version of DhyveOS to install
      -n, --hostname=   hostname to use for vm (default: local.docker)
      -S, --share=      directory to export from NFS (default: /Users)

可以看到指令預設會佔用 20GB 的磁碟使用量及 2GB 的記憶體,所以安裝時可以調整成個人需求大小,安裝請用 root 使用者

$ sudo dlite install -d 10
Building disk image: done
Downloading OS: done
Writing configuration: done
Creating launchd agent: done

完成後請啟動 dlite 服務

$ dlite start

這邊要提醒執行上述指令後,請大約等 10 ~ 20 秒,再用 docker ps 來確認是否有成功,啟動後可以透過 ssh docker@local.docker 連到 Docker VM。可以在 /etc/hosts 看到

192.168.64.8 local.docker # added by dlite

關閉 VM 服務可以使用 stop 指令

$ dlite stop

如果沒有要用 Docker 了,請切換到 root 直接 uninstall 即可

$ sudo dlite uninstall

移除後會清空 /etc/hosts 內新增的 row,但是沒有清除 /etc/exports 內的資料,於是發了 PR 給作者 remove export command

評語

dlite 安裝起來真的很方便,但是我實際拿了 go-hello 專案來跑測試,結果 go server 竟然跑不起來,真是蠻神奇的,只是個簡單的 Hello world server。本來我還以為是不是 Docker 版本有問題,所以又用 Travis CI 跑了一次結果也沒問題。結論還是要裝官方提供的 Tool Box 比較穩定。

Golang 發佈 1.6 正式 Release

$
0
0

Go-brown-side.sh

今天 golang 正式發佈 1.6 版本,趕快到官方網站下載使用,如果你是用 gvm,直接下 gvm install go1.6 即可。golang wiki 提供了很多 Package Management Tools,可以隨意選一套來使用。底下整理幾點 1.6 的改變:

重大改變

效能議題

官方說無從比較,有些程式碼可能在 1.6 比較快,也有可能在 1.5 會比較快,但是在 garbage collector 上面 1.6 會比 1.5 好,前提是程式使用了大量的記憶體,1.6 版本也針對蠻多 package 做了 Performance 改善,提升了至少 10 % 喔 compress/bzip2, compress/gzip, crypto/aes, crypto/elliptic, crypto/ecdsa, 和 sort 套件。

更詳細的 1.6 釋出文件,可以直接參考這邊


為什麼我選擇使用 Laravel Framework?

$
0
0

用 Docker 取代 Laravel Homestead 開發環境

$
0
0

docker

新手第一次接觸 Laravel,我都會推薦使用 Homestead 來解決開發環境的困擾,但是我發現 Homestead 對於第一次接觸 Virtualbox 及指令的初學者,設定還是比較複雜,造成很多新手光是在這邊就卡關了,有沒有什麼辦法可以解決這煩人又複雜的 Homestead 設定,剛好今天在 Github 上看到 laraedit-docker 專案,此專案是把 Homestead 轉換成用 Docker 來跑,這樣只要您的環境有支援 Docker,就可以快速設定好環境含 MySQL, Redis …等

建立 Laravel 專案

透過 Composer 指令建立 Laravel 專案

$ composer create-project --prefer-dist laravel/laravel blog

先假設 blog 目錄路徑為 ~/git/blog,此路徑底下會用到

使用 Docker

首先從 Docker hub 下載 laraedit-docker 映像檔

$ docker pull laraedit/laraedit

完成下載後,就可以直接啟動專案

$ docker run -d --name laravel -p 8082:80 -p 3307:3306 -v ~/git/blog:/var/www/html/app laraedit/laraedit

參數說明

--name: 啟動後服務名稱
-p: 啟動外面的 port 對應到 container 內部 port
-v: 目錄掛載

laraedit 預設將 80, 443, 3306, 6379 port 開出來,所以如果外部要直接存取,請使用 -p 參數來設定。

登入 Docker Shell

要透過 ssh 連入 Docker 請透過底下指令

$ docker exec -it laravel /bin/bash

其中 laravel 就是最上面 --name 設定,執行指令後,你就會進入 Shell 模式,可以進行 DB 操作記錄,執行 DB Migration 等…

進入 MySQL Console

上面我們將 3307 port 對應到 docker 內部 3306 port,所以可以透過 mysql 指令直接連上 MySQL 服務

$ mysql -u homestead -h 192.168.99.100 -P 3307 -p

預設帳號為 homestead 密碼為 secret

$ mysql -u homestead -h 192.168.99.100 -P 3307 -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 5.7.11 MySQL Community Server (GPL)

Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| homestead          |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.01 sec)

mysql>

大致上用 Docker 就取代了 Homestead,所以大家快點把 Docker 安裝到自己的電腦。

Docker 實用指令及 Best Practices Cheat Sheet 圖表

$
0
0

docker

在網路上看到有人提供 DockerCheat Sheet,裡面整理了很多常用的指令,建議剛入門 Docker 的初學者務必把底下指令學完,底下就是 Cheat Sheet

Docker-cheat-sheet-by-RebelLabs

點我大圖

container 放大架構圖

Screen Shot 2016-03-20 at 1.11.30 PM

基本指令

下載映像檔

$ docker pull image_name

啟動或關閉 container

$ docker [start|stop] container_name

建立 -> 啟動 -> 執行指令 (-ti 參數)

$ docker run -ti --name container_name image_name command

建立 -> 啟動 -> 執行指令 -> 刪除 container (-rm 參數)

$ docker run --rm -ti image_name command

file system 及 port 對應 (-v-p 參數)

$ docker run -ti --rm -p 80:80 -v /your_path:/container_path -e PASSWORD=1234 image_name

Docker 清除 (cleanup) 指令

刪除所有正在執行的 container

$ docker kill $(docker ps -q)

刪除 dangling 映像檔

docker rmi $(docker images -q -f dangling=true)

刪除全部已停止的 container

docker rm $(docker ps -a -q)

Docker machine 指令

啟動 machine

$ docker-machine start machine_name

指定 machine 來設定 docker

$ eval "$(docker-machine env machine_name)"

與 container 互動指令

在 container 內執行指令

$ docker exec -ti container_name command

線上觀看 container logs

$ docker logs -ft container_name

儲存正在執行的 container 成 image 檔案

$ docker commit -m "message" -a "author" container_name username/image_name:tag

docker compose 格式

docker-compose.yml 格式如下

version: "2"
service:
  container_name: "hello-world"
  image: golang
  command: "go run hello-world.go"
  ports
    - "80:8080"
  volumes:
    - /hello-world:/root/hello-world
redis:
  image: redis

建立 -> 執行 container

$ docker-compose up

以上是常用的 docker 指令,初學者務必學習。

用 gofight 來測試 golang web API handler

$
0
0
Go-brown-side.sh 身為一位後端工程師,如果專案初期階段不導入測試,等到專案越來越大時,您就會發現,解了一個 bug,又產生好多個額外 bug,讓產品一直處於不穩定狀態。後端最主要提供前端或手機端 RESTFul API,所以今天來介紹一套 gofight 工具,用來測試 Golang 的 http handler,讓開發者可以送 Form, JSON, Raw 資料,後端處理後,可以拿到 response 資料,透過 Testify 來測試資料是否符合需求。 目前大部份的 Golang Web Framework 都可以透過 gofight 來測試,除非作者有把 ServeHTTP 改成自己定義 Response,不然基本上都是可以支援的,我自己測試了 Gin, Mux, HttpRouter 都是可以使用的,底下來看看 gofight 該如何使用。

安裝方式

$ go get -u github.com/appleboy/gofight
-u 代表將 local 端程式碼更新到最新

使用方式

不多說直接先看例子,用 golang 基本的 http handler
package main

import (
  "io"
  "net/http"
)

func BasicHelloHandler(w http.ResponseWriter, r *http.Request) {
  io.WriteString(w, "Hello World")
}

func BasicEngine() http.Handler {
  mux := http.NewServeMux()
  mux.HandleFunc("/", BasicHelloHandler)

  return mux
}
撰寫測試
package main

import (
  "github.com/appleboy/gofight"
  "github.com/stretchr/testify/assert"
  "net/http"
  "testing"
)

func TestBasicHelloWorld(t *testing.T) {
  r := gofight.New()

  r.GET("/").
    // trun on the debug mode.
    SetDebug(true).
    Run(BasicEngine(), func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {

      assert.Equal(t, "Hello World", r.Body.String())
      assert.Equal(t, http.StatusOK, r.Code)
    })
}

自訂 header

透過 SetHeader 可以自訂 Request header
func TestBasicHelloWorld(t *testing.T) {
  r := gofight.New()
  version := "0.0.1"

  r.GET("/").
    // trun on the debug mode.
    SetDebug(true).
    SetHeader(gofight.H{
      "X-Version": version,
    }).
    Run(BasicEngine(), func(r gofight.HTTPResponse, rq gofight.HTTPRequest) {

      assert.Equal(t, version, rq.Header.Get("X-Version"))
      assert.Equal(t, "Hello World", r.Body.String())
      assert.Equal(t, http.StatusOK, r.Code)
    })
}

自訂 Form Data

透過 SetFORM 來傳送 Form Data
func TestPostFormData(t *testing.T) {
  r := gofight.New()

  r.POST("/form").
    SetFORM(gofight.H{
      "a": "1",
      "b": "2",
    }).
    Run(BasicEngine(), func(r HTTPResponse, rq HTTPRequest) {
      data := []byte(r.Body.String())

      a, _ := jsonparser.GetString(data, "a")
      b, _ := jsonparser.GetString(data, "b")

      assert.Equal(t, "1", a)
      assert.Equal(t, "2", b)
      assert.Equal(t, http.StatusOK, r.Code)
    })
}

自訂 JSON Data

透過 SetJSON 來傳送 JSON Data
func TestPostJSONData(t *testing.T) {
  r := gofight.New()

  r.POST("/json").
    SetJSON(gofight.D{
      "a": 1,
      "b": 2,
    }).
    Run(BasicEngine, func(r HTTPResponse, rq HTTPRequest) {
      data := []byte(r.Body.String())

      a, _ := jsonparser.GetInt(data, "a")
      b, _ := jsonparser.GetInt(data, "b")

      assert.Equal(t, 1, int(a))
      assert.Equal(t, 2, int(b))
      assert.Equal(t, http.StatusOK, r.Code)
    })
}

自訂 RAW Data

透過 SetBody 來傳送 RAW Data
func TestPostRawData(t *testing.T) {
  r := gofight.New()

  r.POST("/raw").
    SetBody("a=1&b=1").
    Run(BasicEngine, func(r HTTPResponse, rq HTTPRequest) {
      data := []byte(r.Body.String())

      a, _ := jsonparser.GetString(data, "a")
      b, _ := jsonparser.GetString(data, "b")

      assert.Equal(t, "1", a)
      assert.Equal(t, "2", b)
      assert.Equal(t, http.StatusOK, r.Code)
    })
}
更多測試可以直接參考 gofight_test.go 程式碼

在 WordPress 內寫 Markdown 語法

$
0
0
Markdown-mark.svgMarkdown 還沒出來之前,要寫一篇部落格教學真的非常麻煩,尤其是要學習 html 語法及如何引用程式碼在文章內,Markdwon 的出現,改變了整個工程師寫 Blog 的習慣,現在不管使用任何網站,沒有支援 Markdwon 語法,真的就不太想留言或發文了。最早以前自己的部落格是用 WP-Markdwon 這套 Plugin,但是這套 Plugin 在整合 SyntaxHighlighter Evolved 的時候根本無法使用,需要特定的語法才可以使用。WP-Markdwon 有個好用的工具那就是 editor tool bar,幫你省下製作 hyperlink 的時間,會自動幫忙編號,如果沒有 SyntaxHighlighter 需求,我個人是推薦用 WP-Markdwon。

golang 範例

package main

import (
    "fmt"
)

func main() {
    fmt.Println("Welcome Golang World")
}
為了解決 SyntaxHighlighter 問題,後來換到 jetpack plugin,這套 Plugin 蠻強大的,內建一堆好用的工具,像是會自動分析每天來造訪你的 Blog 有哪些人。所以推薦大家用 jetpack。最後要學習 Markdown 語法,可以直接參考這網站教學

Docker 基礎介紹與實戰

$
0
0
docker 在個人開發環境或者是部署上,Docker 已經是不可或缺的工具,尤其是團隊開發上,如何用 Docker 統一團隊開發環境,減少團隊成員浪費在環境建置及開發上互不影響,底下來看看投影片大綱:

頭影片大綱

強烈推薦大家將 Docker Best Practices Cheat Sheet 圖表 印出來貼在座位前面

在 linkit smart 7688 寫 golang

$
0
0
7688_7688duo 很高興 Mediatek 在去年推出 linkit smart 7688 開發版,你可以把 7688 想成是一台迷你型 Router,如果不來拿開發,也可以當家用 Router 也是不錯的。7688 讓開發者可以在上面寫 Node.js, Python 及 Native C,光是聽到 Node.js 就很興奮,用 JavaScript 控制硬體。但是本篇要介紹如何在 7688 執行 Golang 程式,其實不難,只要把 OpenWrt 支援 gccgolibgo 即可。底下步驟同步於我的 Github Repo

用 Docker 安裝 7688 環境

我建立了一個 Dockerfile,讓開發者可以透過 Docker 快速在任何作業系統產生開發環境,安裝步驟如下:
$ git clone https://github.com/appleboy/linkit-smart-7688-golang.git 
$ cd linkit-smart-7688-golang && docker build -t mt7688 .
開啟 7688 terminal 環境
$ docker run -ti --name 7688 mt7688 /bin/bash

啟動 gccgo 和 libgo

底下步驟教您如何打開 gccgo 及 libgo 選單。打開 package/libs/toolchain/Makefile 找到
define Package/ldd
在前面插入
define Package/libgo
$(call Package/gcc/Default)
  TITLE:=Go support library
  DEPENDS+=@INSTALL_GCCGO
  DEPENDS+=@USE_EGLIBC
endef

define Package/libgo/config
       menu "Configuration"
               depends EXTERNAL_TOOLCHAIN && PACKAGE_libgo

       config LIBGO_ROOT_DIR
               string
               prompt "libgo shared library base directory"
               depends EXTERNAL_TOOLCHAIN && PACKAGE_libgo
               default TOOLCHAIN_ROOT  if !NATIVE_TOOLCHAIN
               default "/"  if NATIVE_TOOLCHAIN

       config LIBGO_FILE_SPEC
               string
               prompt "libgo shared library files (use wildcards)"
               depends EXTERNAL_TOOLCHAIN && PACKAGE_libgo
               default "./usr/lib/libgo.so.*"

       endmenu
endef
找到
define Package/libssp/install
在前面插入
define Package/libgo/install
    $(INSTALL_DIR) $(1)/usr/lib
    $(if $(CONFIG_TARGET_avr32)$(CONFIG_TARGET_coldfire),,$(CP) $(TOOLCHAIN_DIR)/lib/libgo.so.* $(1)/usr/lib/)
endef
找到
$(eval $(call BuildPackage,ldd))
在前面插入
$(eval $(call BuildPackage,libgo))
打開 toolchain/gcc/Config.in 最後面插入
config INSTALL_GCCGO
    bool
    prompt "Build/install gccgo compiler?" if TOOLCHAINOPTS && !(GCC_VERSION_4_6 || GCC_VERSION_4_6_LINARO)
    default n
    help
        Build/install GNU gccgo compiler ?
打開 toolchain/gcc/common.mk 找到
TARGET_LANGUAGES:="c,c++$(if $(CONFIG_INSTALL_LIBGCJ),$(SEP)java)$(if $(CONFIG_INSTALL_GFORTRAN),$(SEP)fortran)"
取代成
TARGET_LANGUAGES:="c,c++$(if $(CONFIG_INSTALL_LIBGCJ),$(SEP)java)$(if $(CONFIG_INSTALL_GFORTRAN),$(SEP)fortran)$(if $(CONFIG_INSTALL_GCCGO),$(SEP)go)"
打開 Kernel Configuration
$ make menuconfig
  • Target System: Ralink RT288x/RT3xxx
  • Subtarget: MT7688 based boards
  • Target Profile: LinkIt7688
啟動 gccgo
-> Advanced configuration options
-> Toolchain options
-> Select Build/Install gccgo
-> C library implementation
-> Use eglibc

撰寫 golang hello world

Go-brown-side.shalias 設定 mips gccgo 路徑
alias mips_gccgo='/root/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_glibc-2.19/bin/mipsel-openwrt-linux-gccgo -Wl,-R,/root/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_glibc-2.19/lib/gcc/mipsel-openwrt-linux-gnu/4.8.3 -L /root/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_glibc-2.19/lib'
hello world 程式
package main

import "fmt"

func main() {
  fmt.Println("hello world")
}
編譯執行檔
$ mips_gccgo -Wall -o helloworld_static_libgo helloworld.go -static-libgo
在 7688 裝置內執行 helloworld_static_libgo
root@mylinkit:/tmp/7688# ./helloworld_static_libgo 
hello world
以上步驟就可以完成 hello world 程式,詳細步驟都記錄在 linkit-smart-7688-golang

來聊聊 PHP & JavaScript & CSS 的 Coding Style

$
0
0
Screen Shot 2016-04-20 at 11.47.45 PM 專案開始前,要決定好前端或後端各用什麼語言及制定符合團隊的 Coding Style,統一團隊 Style 是非常重要的,尤其是專案需要經過 Code Review 步驟,不要造成 Reviewer 困擾。底下寫了一份投影片介紹 PHP & JavaScriptCSS 的基本 Coding Style 及該如何透過工具來改善 Coding Style。

大綱

  • 為什麼要制定團隊 Coding Style
  • PHP 語言的 Coding Style 及工具
  • PostCSS 簡介
  • JavaScript ES5 Style Rule
  • 開始寫 JavaScript 2015

Git Flow 與團隊合作

$
0
0
branching-illustration@2x 本月最後一篇投影片來介紹 Git Flow 流程該如何導入團隊,之前寫過一篇 Git branch model 文章,裡面提到該如何正確使用 branch,但是現在回想起來要導入團隊內真的是有點麻煩,也遇到蠻多問題的,後來最後只採用 Github Flow,簡單又容易理解,如果開發者很常在 Github 活動,相信對於此方法並不會很陌生。

投影片大綱

Golang 套件管理工具 Glide

$
0
0
Go-brown-side.sh 套件版本管理已經是各大語言不可或缺的工具,像是 Node.jsnpmPHPComposerRubyRVM 等…,都已經發展很成熟了,但是在 Golang 語言呢,在 Go 1.5 以後的版本,可以透過 GO15VENDOREXPERIMENTGlide 來管理套件版本,在 Go 官方網站也有整理一份 Wiki,開發者可以選一套適合自己的來使用,而今天要介紹這套 Glide,在開始之前,大家先來了解 Go 提出的 vendor experiment

vendor experiment

Golang 1.5 版本提出 vendor experiment 功能,讓每個 Package 都可以擁有自己的 vendor 目錄,當 compiler 要找尋 import package 時,會預設先從 vendor 目錄找起,如果沒有的話就會繼續找 $GOPATH 最後找 $GOROOT。底下來看一個 Project 範例。

example

- $GOPATH/src/github.com/example/foo
  |
  -- main.go
  |
  -- vendor/
       |
       -- github.com/example/bar
在這範例可以看到有主程式 main.go,在 main.go 內 import github.com/example/bar,系統就會把相關 import package 都下載到 vendor 目錄,取代原本會下載到 $GOPATH 目錄,這邊要注意的是,開發中的專案目錄(在這範例是 github.com/example/foo),務必要放在 $GOPATH 目錄內。如果你還在用 go 1.5 版本,請記得加上環境變數 GO15VENDOREXPERIMENT=1,1.6 版本已經預設將 GO15VENDOREXPERIMENT 設定為 1 了,不知道環境變數可以透過 go env 看看目前 go 變數狀態。

Glide 套件管理

Glide 是 golang 套件管理工具,用來管理專案的 vendor 目錄,開發者可以透過 Glide 建議各專案的 glide.yaml 設定檔,並且定義相關套件版本資訊,Glide 會負責將套件下載到 vendor 目錄內。底下是 Glide 安裝方式。

安裝 Glide

安裝 Glide 非常簡單,可以直接到 Github 下載 Binary 執行檔,或者是透過 go 來安裝
$ go get github.com/Masterminds/glide
$ cd $GOPATH/src/github.com/Masterminds/glide &amp;&amp; make install

使用 Glide

在專案內直接執行底下指令來建立 glide.yaml 設定檔
$ glide init
# 或
$ glide create
產生出來的 glide.yaml 格式如下
package: github.com/appleboy/gorush
import:
- package: gopkg.in/yaml.v2
- package: gopkg.in/redis.v3
- package: github.com/Sirupsen/logrus
  version: v0.10.0
- package: github.com/appleboy/gin-status-api
- package: github.com/fvbock/endless
- package: github.com/gin-gonic/gin
- package: github.com/google/go-gcm
- package: github.com/sideshow/apns2
  subpackages:
  - certificate
  - payload
- package: github.com/stretchr/testify
- package: github.com/asdine/storm
- package: github.com/appleboy/gofight
- package: github.com/buger/jsonparser
如果原本專案內就有使用 Godep, GPM, or GB 等套件管理,Glide 會自動把該套件無痛整合進來。完成後可以透過 glide upglide install 來安裝相關套件。兩個指令差別在哪?如果專案內沒有 glide.lock 檔案,當您執行 glide install 後,其實系統會先執行 glide up 產生 glide.lock 檔案,glide.lock 內記錄了所以套件版本資訊。你可以把 glide.lock 想像成 PHP 的 composer.lock
hash: 4e05c4dd1a8106a87fee3b589dd32aecc7ffeb1246bed8f8516b32fe745034d6
updated: 2016-05-04T14:26:47.161898051+08:00
imports:
- name: github.com/alecthomas/kingpin
  version: e1543c77ba157565dbf7b3e8e4e15087a120397f
- name: github.com/alecthomas/template
  version: a0175ee3bccc567396460bf5acd36800cb10c49c
  subpackages:
  - parse
也就是專案內使用了 A 套件,A 又使用了 B,這樣 Glide 會把套件 hash 值記錄在 glide.lock 檔案內,其他開發者下載您的專案後,只需要下 glide install 就可以開始 build binary 了。如果要安裝單一套件呢,可以使用 glide get 指令,該指令會將新的套件寫入 glide.yaml 設定檔。
$ glide get --all-dependencies -s -v github.com/gin-gonic/gin
  • --all-dependencies: 下載相依套件全部的 dependencies
  • -s: 下載後刪除 .git 目錄
  • -v: 移除 Godeps/_workspace 等相關目錄
當然你也可以指定套件版號
$ glide get --all-dependencies -s -v github.com/gin-gonic/gin#v1.0rc1
如果是想更新全部 dependencies 寫到 glide.lock,可以直接下底下指令,Glide 會把套件 dependencies 全部下載到 vender 內,就好比執行 go get -d -t ./... 指令一樣。
$ glide update --all-dependencies --resolve-current

結論

使用套件管理後,務必將 glide.lock 加入版本控制,更新時請務必看看各套件的 Changelog,並且將測試寫完整。如果是 API 測試,可以參考之前寫的一篇測試工具 用 gofight 來測試 golang web API handler

在 Github 專案內搜尋 Golang 函式,Golang 開發者必裝 Chrome Extension

$
0
0
Go-brown-side.sh 在 IDE 編輯器我們可以用內建的 go to definition 直接跳到該函式,但是身為工程師,每天接觸最多的就是觀看 Github 程式碼,有沒有什麼方式可以透過 Web 介面直接搜尋專案內 Golang 所有函式,讓 Golang 開發者快速跳到該函式,這時就要來安裝 Sourcegraph Chrome extension for GitHub 啦。

Sourcegraph Chrome extension

可以接看官方的介紹影片 安裝完成後,只要你到 golang 的專案目錄內,就可以看到搜尋的功能 Screen Shot 2016-05-08 at 6.21.53 PM 瀏覽程式碼也會直接顯示該函式描述,或者可以直接跳到該函式,檢視該函式如何實作 Screen Shot 2016-05-08 at 6.25.06 PM 此 Chrome Extension 最主要兩大功能
  • Jump-to-definition
  • Better code search
讓開發者可以透過瀏覽器快速檢視程式碼,大大縮短開發時間。重點是這 Extension 是 Free 的,大家快點下載安裝吧。

基礎 JavaScript ES6 和 CSS cheat sheet PDF 下載

$
0
0
es6-logoToptal Blog 看到 JavaScript Cheat Sheet: ES6 And Beyond 及另外一篇 A Practical CSS Cheat Sheet by Toptal Developers,這兩篇提供了一些 JavaScript ES6 及 CSS 的基礎寫法及教學,蠻適合前端工程師將 PDF 印出來貼在座位前面,cheat sheet 內提供的語法幾乎都是天天在用,像是在 ES2015 內 let vs var 語法差別,什麼時候要用 constlet,或 Template String,預設參數 .. 等功能,其實非常不賴。CSS 則是介紹基本的 Box Model、Selectors、Pseudo-selectors .. 等。

PDF 下載

在 Toptal 文章內有提供 PDF 下載連結,我也在 Google Drive 備份一次,連結如下
Viewing all 325 articles
Browse latest View live