[Golang] 關於Go的Vendoring

起因

本來對於Golang的vendoring都是統一使用godep(如果比較大的專案),比較小的專案都直接使用go get來抓取dependency package.

但是由於Google Code在2016/01/25關閉了,所以常用的uuid沒得抓了.所以來試試看Go 1.5 開始的vendor experiment,順便做點記錄.

什麼是vendor experiment?

一般而言我們在使用Golang套件的時候都是很簡單的直接使用

import "github.com/kkdai/coapmq"

這樣只要編譯專案前先跑 go get -d就會把所有的相依專案都抓取最新的程式碼到你的GOPATH. 現在問題來了:

  • 引用的專案已經被砍掉了?
  • 引用的專案原作者或是維護團隊忽然決定大改API?
  • 引用的專案忽然出現意外的錯誤(break code)? (當然有可能是底層API被Google改掉)
  • 想要維護整個專案的穩定度

根據以上的需求或是要避免以上的一些問題.將你的專案Vendoring是必要的.而Vendoring的做法一般就是放一份你目前使用的相依套件的程式碼到 vendor目錄底下. 有可能是這樣

- vendor
  - github.com
	  - kkdai
		  - coapmq
		  - photomgr 

開始將你的專案轉換成可以使用vendor experiment

假設你現在有一個專案裡面用到了數個相依的套件(ex: mysqluuid (注意此鏈結已經失效) … )

建議流程如下:

確認你的專案是在GOPATH底下

不論是GO15VENDOREXPERIMENT還是govendor都是使用在GOPATH才能作用.所以請注意:

  • 專案一定要放GOPATH底下
  • 專案一定要放GOPATH底下
  • 專案一定要放GOPATH底下

如果不在GOPATH底下,將不會work.我想這也是godep或是GB能夠繼續讓大家熱愛的原因.

設定GO15VENDOREXPERIMENT=1

一開始得把這個flag打開,你可以先使用go env來查詢該flag是不是有開啟的狀態(初始是關閉,但是Go 1.6將會打開)

  • Mac/Ubutu: export GO15VENDOREXPERIMENT=1
  • Windows: set GO15VENDOREXPERIMENT=1

將你相依的專案列出來

這裡使用的是govendor,透過他可以將所有相依的專案.流程如下:

  • govendor init來初始化,並且將所有的專案寫入vendor.json裡面.
  • 這時候你可以透過govendor list來列出所有的相依專案,然後決定哪個要放入vendor資料夾
  • 假設你要把github.com/kkdai/coapmq放入vendor目錄中,就執行以下 govendor add github.com/kkdai/coapmq

依序把你需要的專案放在目錄中,然後就可以了.

如何透過Vendoring Experiment編譯檔案

將你需要的專案抓到GOPATH底下(必須),然後切記GO15VENDOREXPERIMENT=1,其實就簡單地跑go get然後go build就可以了.

其他Vendoring的用法

其實還有其他方式,不論是Godep或是GB 其實都各有愛護者,不過用的習慣與相關的使用場景是比較重要的.

相關鏈結

程式設計週記[2016/01/29]: Github被強國打趴,Parse將被獲利創新高的臉書收掉

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

  • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢

網路文章心得:

  • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

大部分內容在我的twitter都會有,這邊只是將一些簡單的心得與感想註解一下.

本週摘要

下個禮拜就要過年了,手邊只好先挑些簡單然後好像跟公事扯得上一點關係的小專案來玩.本週只好先玩Project Oxford的Face API,下週會把相關App寫得更詳細.

Go

inconshreveable/ngrok: Introspected tunnels to localhost

  • 透過hole punching的方式將內部網站穿過防火牆與NAT分享出去.每個網站透過一個中間網站ngrok.com來達到打洞的方式.

dvyukov/go-fuzz: Randomized testing for Go

nlf/dlite: The simplest way to use Docker on OS X

  • 一個可以讓你更容易在Mac OSX下透過xhyve的虛擬方式使用docker的方式,會先在local建立一個VM所需要的檔案然後跑.不過消耗的硬碟空間有點大(預設至少要30G),還要再考慮一下.
  • 這裡有教學

Bidding farewell to Google Code

  • 這是去年的文章.. 不過時間已經過了(2016/01/25)…. Google Code已經關閉了.有使用go get Google Code的人.. 請注意.

Go 1.6 release party

  • Go team決定要使用software estimation的原力,來預告2016/02/17會舉辦Go 1.6 release party.這篇有順便預告了所有的新功能

Go 1.7 Plan

  • Go team決定好要在02/17舉辦Go1.6 release party之後,也順便開始了Go 1.7的計畫.這篇Google Forum有很清楚地討論,有興趣的可以進去仔細查看.

Visualizing Concurrency in Go

  • 不是很瞭解Go在concurrency上面的控制流程? 這篇文章全部都視覺化了…

Generate Free SSL Certs in Go

  • 使用Golang來架設一個免費的SSL Certs,這樣做一些內部HTTPS的測試就方便多了.

Automated Testing with go-fuzz by Filippo Valsorda

  • 這篇是教導go-fuzz的教學.go-fuzz可以幫助你產生fuzz testing,但是不是很容易上手.這篇範例算是簡單了,很推薦大家從這篇來入手go-fuzz

curl-to-Go: Instantly convert curl commands to Go code

  • 雖然我正在寫微軟的Project Oxford Face API wrapper 看到這種工具還是覺得相當的方便.直接幫你把Curl 指令轉換成Golang http.client的code.

ELM

Elm in 5 minutes

  • Learning ELM in 5 minutes video.

Python

jorgebastida/awslogs: AWS CloudWatch logs for Humans™

  • 將AWS的log變得比較親近與容易閱讀,並且支援group與filter的概念.可以讓你用比較lightweight 的方式來處理AWS logs (而不是使用ELK那些東西).

Android/JAVA/NODE.JS

Android 应用开发性能优化完全分析

  • 雖然這種題目隨便找就一堆,但是這篇整理得還不錯.

Tutorial: AWS API Gateway to Lambda to DynamoDB

  • 基礎教學如何導入AWS API透過Lambda 到 DynomoDB.

CSharp

Docker

透過 Vagrant 在 Azure 上面部署虛擬機器

  • 透過vagrant在azure上面來部署vm

How Container Clusters Like Kubernetes Change Operations

  • 透過Kubernetes用同一個 service,再搭配不同的 version、replica size 及 label,就能做到 canary deployment。

Running Docker Containers On Windows Server 2016 (Quick Start Guide)

  • Windows Server 2016 default support docker,感覺比較方便.
  • 也不用再管MingGW那種奇怪的path (ex: /c/ /d/ )與相關bug. 不過不知道%programfiles%會如何?

Docker SF Meetup January 2016

  • Docker Ecosystem 2016展望

iOS/Swift

How to detect whether custom keyboard is activated from the keyboard’s container app?

  • 在做一個custom 鍵盤嗎?想知道使用者有把你的鍵盤裝到了沒?很容易!(摘自: FB)
  • 其實,也可以用這個做法,但Swift + iOS 9目前有bug,不能用
  • 這篇算是整理的不錯,針對iOS 9帶來的Deep Link變革與相關的改變方式.

網站文章

數位時代: 創下單月 45TB 流量紀錄的個人專案: MyAudioCast

  • 其實我不常推薦數位時代的文章,因為大部分都是轉貼知名的網路文章.但是這一篇一定要推薦一下是因為這一篇是經驗談.發文的人為人稱海總管的海大.裡面有不少的經驗談,當這個個人專案遇到大量的流量開始,要如何轉變?如何scale?都是讓人可以好好學習的部分.

Nginx 的线程池与性能剖析

  • 清楚解釋了Nginx如何處理muliple request的方式,跟傳統伺服器不同的是Nginx會將多個request在一個處理器中處理。但是這樣會遇到接下來一個問題是如何處理block i/o? 這邊的方式透過thread pool的方式,將任何需要等待的block op (i/o or others)透過thread pool的方式來處理.就不會阻礙到後面排隊的其他task.

Microsoft releases CNTK, its open source deep learning toolkit, on GitHub

  • 相較於Google 開源Tensorflow,微軟也把他們的Deep Learning Engine CNTK(Computational Network Toolkit) 開源出來. 這一篇還有效能比較圖,可以看看.

真是佛心來的》Google 核心技術指導網路開課了,學費全免

  • Google 除了開源Tensorflow之外,還有開課告訴大家怎麼使用.挺值得看看的.

年会上的程序员们……

  • 某間軟體科技公司的尾牙用抽獎程式來抽獎,結果每個工程師都覺得這個程式有問題,於是尾牙開始一千多人來review code.這故事告訴我們,用簽桶當尾牙抽獎有多精準.

關於 Parse 服務準備關掉的一些因應措施

  • Facebook收購Parse之後,就一直沒有特別的動作.總算決定把它收掉(2017年),這是不是代表BaaS(Backend As A Service)開始式微?還是開始泡沫呢? 這篇文章告訴你該怎麼樣搬出來其中有官方的步驟也有一些個人的意見,相當有意義.

CVE-2016-0728 受災OS出爐,Linux核心漏洞影響大盤點

  • 近年來Linux kernel 最大的漏洞,只有有心人最多在30分鐘內就可以拿到root權限. 這邊有修復方法

有聲書/影片心得

IT公論: 188 美丽旧世界——从苹果 Music Memos 谈起

  • 這次有個來賓蠻特別的是負責教學生數位媒體跟聲學工程師TT,來談談Apple 的Music Memos算是挺有趣的題目.
  • 主要是從音質,操作方式與介面來討論這個App.也討論到iPhone的硬件與軟件在設計上如何讓使用者使用沒有任何困難.

本週專案

這邊會寫一些我的Project 52的成果.

本週題目,將微軟的Project Oxford的Face API implement出Golang.

https://github.com/kkdai/oxford-face

主要下週會開始針對這部份開始寫一個小的應用App

程式設計週記[2016/01/22]: 曙光女神的寬恕......

Picture from tweet.

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

  • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢

網路文章心得:

  • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

本週摘要

本週花了不少時間都在閱讀RFC 7252, 7641總算根據draft RFC寫完CoAPMQ又得來煩惱下一個禮拜要寫什麼了.

Go

Introducing Apex

  • 大神: TJ Holowaychuk 也寫了AWS Lambda function manager for Go

dgryski/go-ddmin: ddmin test case minimization algorithm

Design Patterns in Golang: Singleton

  • Singleton在Design Patterns裡面是常用的pattern,但是在Golang上面其實架構上沒有太大的差異.只是這一篇有指出如果有threading (在Go稱為Goroutine)的話,需要有once sync.Once 然後透過 once.Do(func() { /*INIT SINGLETON*/ } 來呼叫.

Dave Cheney: cgo is not Go

  • Dave Cheney大大寫的文章,不過其實在不少地方都已經提到cgo不是Go,因為cgo主要是讓Go能夠使用c++的橋樑.當然還有透過SWIG的方式.

“Secret” interfaces in go

  • 關於interface的文章

CAFxX/pluggo: In-process plugin framework for Golang code

dvyukov/go-fuzz:Randomized testing for Go

  • 用來做隨機測試用的

google/gofuzz: Fuzz testing for go.

  • 用來做隨機測試用的,不過這是Google出的.

Python

samshadwell/TrumpScript: Make Python great again

  • 透過Python來撰寫的新的程式腳本”Trump Script”,語法最後一定要有”America is great.” XDDD

“Political Speech Generator”

  • Looks interesting, it also include a paper on it.

JAVA/NODE.JS

记一次 Node.js 应用内存暴涨分析

  • 先記錄起來.

“为Java说句公道话”

  • 王垠的文章爭議性一直都很高,而且又艱澀難懂.不過這次這篇蠻好懂的 XDDD.大意就是其實作者認為“Java可以解決95%的問題,另外5%可以使用比較笨的方法解決.”,所以新語言Scala與Clojure,都有一些方式可以透過Java原本支持的部分來達成.

tooling 让你从 jQuery 中解脱出来

CSharp

ASP.NET 5 is dead - Introducing ASP.NET Core 1.0 and .NET Core 1.0

[舊聞] 如何將專案從C++轉成C# 以Dragon Quest 8為例

  • 這一篇主要是講解SQUARE ENIX如何將PS2上面的DQ8(Dragon Quest8)當時為C++的專案,移植到Unity的C#上面.不少技巧的,不過主要還是題目是DQ8我覺得很有趣.

Docker

Raspberry pi with Docker Swarm 跨網域溝通使用 network

  • Swarm有玩過,下週應該會開始來玩玩RPI Docker.

为什么Kubernetes不使用libnetwork

Getting started with Docker on your Raspberry Pi

  • 在RPI上面架設Docker並不難,重點是image要尋找能夠正常在Docker上面能夠跑的.裡面有提到建議要加關鍵字RPI或是ARM
  • 這邊有令萬一篇是中文的文章: 門外漢的 Raspberry Pi 2 運行 Docker

Docker Registry 的簡單安裝紀錄

  • 有簡單的教學可以教導如架設private的docker registry服務.透過架設私有的registry,你可以把一些比較隱密的docker image放在上面.

有聲書/影片心得

Exploring HTTP/2 with Go

  • 這一段影片很推薦,不僅僅有HTTP/2的基本介紹(從HTTP演變開始).
  • 結構上: HTTP/2每一個connection,可以切成多個stream,而每一個stream可以包含多個data frame.
  • 流程上: 一個Header交換,再來Communication之後就可以開始傳Data.
  • 根據這段影片,HTTP/2需要在安全的狀態下.所以這篇Go的指導有講到關於HTTPS的(ListenAndServeTLS)部分.
  • 使用上不會有差異(coding上),不過可以看到速度變快(因為connection 次數減少,加上header compression)

IT公論187: 「真想不到我为微信说了那么多好话。」

  • 聽眾反饋: 有講到台灣的行動支付的現況.不過台灣行動支付已經完全輸大陸一大截,所以在他們的角度來看會覺得台灣發展現況還挺慢的.而且竟然有那麼多的行動支付方案.
  • 恥辱柱方面: 百度貼”吧的”是一個論壇服務,但是因為被商業團體購買之後造成論壇的服務再也不中立.引爆點是因為有血友病的論壇,被藥商所購買了.整個論壇的走向就偏向了那個廠商,並且相當有商業性質.
  • iOS 9 beta : 最新的功能藍光調整功能(night shift),主要是參考了f.lux的功能.主要也是因為f.luxside loading(也就是透過MBA的Xcode可以安裝沒有上架的軟體).

網站介紹

程序员专用笔记 Quiver

  • 這個軟體還不錯用,看來可以支援markdown跟latex.不過我現在都直接放上blog,不然其實會考慮一下.

本週專案

這邊會寫一些我的Project 52的成果.

這個禮拜準備了CoAPMQ,主要的重點是讀熟draft RFC其實還挺好玩的.

程式設計週記[2016/01/15]: 改變台灣就在這週六,但是別忘了天天都要改變自己

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

  • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢

網路文章心得:

  • 會寫些心得,強迫自己閱讀.

“程式週記”並且定期週期性更新.

本週摘要

明天(2016/01/16)就要舉行台灣的總統與立委選舉,大家別忘記投票.

下週要有Google Golang Gala也就是Golang的分散式駭客松.也就是可以在全世界各地舉行駭客松.這次希望能來的及寫完一些點子也來試試看. 大家有興趣也來參加看看..

本週工作大部分都在看網路文章,還有玩一下Golang本身buildin的net UDP相關操作,希望能準備好一些東西下週參加比賽.

Go

Gopher Gala

  • 01/22~01/24就要開始distributed hackathon,可以在任何地方參加.大家一起來參加.唯一的限制就是必須要使用Golang
Difference Erlang and Golang concurrency
  • 有人詢問關於Erlang與Golang在Concurrency上面處理的不同,有人就回答如果就Programming Model上來說:
    • Elixir/Erlang 就像是Goroutine/Go.不同的是Goroutine是system thread而Elixir是Main Entity.所以如果你產生了一個Elixir,你會拿到PID.
    • 但是Go特有Channel可以讓不同processese間的溝通更加透明化.
  • 有興趣想要學習Erlang的Go Programmer,可以看這裡 Elixir concepts for Go developers

lukasmartinelli/pipecat: Connect UNIX pipes and message queues

  • 這個套件提供透過UNIX pipes的指令來處理message queues(AMQP).
# Publish sequence of numbers to a job queue.
seq 1 1000 | pipecat publish numbers

# Multiply each number with 10 and store results in a different queue.
pipecat consume numbers --autoack | xargs -n 1 expr 10 '*' | pipecat publish results

# Aggregate the results and calculate the sum
pipecat consume results --autoack --non-blocking \
  | python -cu 'import sys; print(sum(map(int, sys.stdin)))'

Writing AWS Lambda Functions in Go

  • AWS Lambda是Amazone 開放的一個Service可以讓用戶上傳自己的程式或是服務.讓該程式會在Scale的時候自動執行.
  • 那麼想要在AWS Lambda上使用Go? 雖然官方還沒有開放正式的方式來使用.這篇文章透過cross compiling的方式來將Go編譯成Linux Library的方式來透過node.JS或是Python來使用.

CSharp

####

網路文章

【 雜湊函式生命週期表 】

  • 紅色表示已糟破解,橘色表示已找到嚴重弱點,黃色表示已找到輕微的弱點,只有綠色是可接受的。所以實務上現在還能用的只剩下 SHA-2 及 SHA-3,其他諸如 MD5、SHA-1 都陣亡了。 (from ANT FB)
  • 2004有大量的破解MD5是因為有大陸學者王小雲教授發現MD5破解法

架构师(2016年1月)

  • 本期提到很有趣的是CAPTCHA與圖像辨識的演變.這個主題蠻有趣的而且很多詳細的介紹都有提到.

A few thoughts on the role of software architects

  • 一篇2008的舊文章,由微軟的Platform Group的Director撰寫的.如果你想當Software Architect裡面有許多至理名言.
  • 主要是提到(0)適時的授權讓底下的人發揮(1)千萬不要微觀管理(2)測試很難評估效用,但是他是無價的(3)親自下來寫code(4)瞭解自身的缺點(5)任何架構都是為了客戶,不是為了你自己(6)遇到錯誤,承認他並且快速修復它.

程序员的黄金时代:下載軟體的時代眼淚

  • 網路螞蟻,快播,迅雷,網際快車與暴風影音你有用過幾個?文章中敘述這些檔案續傳與加速軟體都是大眾拿來作為毛片(也就是A片)的下載軟體. 不過每一家的背後技術其實都相當的深厚,不論是多點續傳,線上觀看,哈希碼分享都是相當先進的技術.但是迅雷扶正而快速的集資上市,暴風影音更是股王,而快播的開發者堅持做原本的部分持續進步,但是卻落得被政府”嚴打”下被判刑的人. 這些時代的眼淚,可以好好的看看這篇文章.

The Easy Way To Learn Hard Stuff: 簡單地學習困難的事物

  • 這篇介紹了如何去學習一個困難的事物(範例拿Django舉例),這邊列出一個方法可以讓你更容易上手.以下依序介紹:
    1. 先使用它:
      • 這邊提到,摒棄難懂的spec/RFC,建議你先開始使用它.不論是從簡單的sample code,hello world或是一些tutorial開始.開始去建立一些東西.隨著一些使用,你慢慢會體會到一些系統的架構,一些基本的原理..
    2. 解決你的困惑:
      • 隨著使用它,你逐漸會遇到一些不瞭解與困惑的地方.當你開始遇到困惑與阻礙的時候,試著去解決他並且了解相關的原理.
    3. 建立一些東西:
      • 這時候tutorial再也無法吸引你了,你可以開始建立一些你的應用或是你想要使用這個來建立的服務.或是是一些更進階的應用.
  • 就是這麼簡單.開始學習新事物吧..

有聲書/影片心得

TED 中英字幕: 怎麼尋找你熱愛的工作?

  • 如何尋找你熱愛的工作,講者提出一個Living your Legend的裡面並且建議以下的步驟:
    • 瞭解你得長處:
      • 你是全世界唯一能夠真正瞭解你自己的人.認真地去瞭解自己得長處與缺點.
    • 制定你人生的價值(先後順序):
      • 你必須要整理對於你而言最重要的是什麼?家人?健康?事業?財富? 這樣的整理有助於你可以更專注的去追求你人生想要的事物,不會失去了焦點.
    • 透過經驗來反省與思考:
      • 別讓每一個失敗變得沒有意義.必須要思考你哪裡做錯,哪裡沒有做好.也別忘記去記錄從每個人身上學習的部分.
    • 定義你人生的”成功”:
      • 透過自己得長處與經驗並且追求人生的價值途中,定義一個清楚的成功.
  • 此外,講者也建議你必須要選對你周遭的人:選擇能讓你成長的朋友,遠離帶給你負面的朋友.因為周遭的人會不斷地刺激你的努力,帶給你正面的影響,讓你了解成功不是遙不可及.
  • 最後,甘地的這番話相當激勵人心:
First they ignore you, 
then they laugh at you, 
then they fight you, 
then you win.
 - Mahatma Gandhi
  • Youtube: Google Developer - Getting started with Brillo & Weave:
    • 重點整理:
      1. Weave是protocol 介於手機,雲端跟裝置,Brillo 是相容於Android 的IoT OS
      2. 所有可以使用Android的設備都可以使用Brillo,不過都需要註冊Google Account,Weave也是依據Google雲端相關服務.
      3. 最重要的是 Brillo/Weave 公開是下一季,相容裝置是年底 整段影片有點長,建議跳著看slide跟最後的Q&A
    • 看來…繼續來看看CoAP跟IoTivity…

IT公論#186-「越来越不觉得 2016 年是虚拟现实元年了。」

  • 這一期沒有其他來賓,主要討論2015年底發生的一些事情.
  • 恥辱柱: 就是大公司們控訴被電信服務商的流量綁架,也就是使用某些電信商來瀏覽網站,第一個到達的不是該網站,而是電信商希望你看的廣告.(這是哪招?不過台灣免費WiFi也有類似狀況).
  • 本集主要討論一些CES的新產品,不論是VR的 Oculus Rift或是聯想的筆電.一些新產品的想法.
  • 也有討論到最近很熱門的Netflix開放了138國(包含台灣)
  • 當然也有提到快播審訊,我在網路文章裡面也有提到.

投影片心得

簡單易懂的 OAuth 2.0 by Yu-Cheng Chuang

  • 相當清楚而詳細介紹OAuth2你該了解的流程,資料的走向與資料格式.除了會使用之外,我們需要更加了解之中的一些小細節.

網站介紹

“The evolution of massive-scale data processing”

  • 介紹各種Big Data處理的幾個方案: Map Reduce, Hadoop, Flume, Storm, Spark… 速度與使用語言與效能比較.

一個可以讓你比對JSON資料的網站

  • 丟上變動前與變動後的JSON資料,透過生動的圖形來瞭解哪些有變動.

Ubiquity Dev Summit 2016

  • 2016/01/11~2016/01/12在美國舊金山舉辦的Ubiquity Dev Summit是Google針對IoT與一些行動的研發專案開的研討會.有不少關於Beacon Platform或是IoT (Brillo與Weave)的介紹.
  • 全部影片可以在Youtube: Google Developer找到

本週專案

這邊會寫一些我的Project 52的成果.

week30: UDP client/server to get Public and Private IP and Port for hole punching

先寫好抓取網路資訊的服務,下週應該就要準備參加比賽的題目.想整合MQTT + CoAP做個東西(client/server) 不知道做不做得完…. 趕緊來偷做…

這個專案可以幫你抓取網路資料包含ipv4, ipv6 port, network mask,透過與一部外在server的連接你可以抓取到external ipv4/port資訊.

[Docker] 拆解我的網路服務

前言:

講了Docker半天,這一篇主要是記錄一下我把在用的一些Web Service全部放進Docker的紀錄,順便看看有沒有什麼地雷怕踩到的. 其實將自己的服務全部轉成Dockerize Services最重要的重點就是要能夠清楚了解--link的作用.

原先架構

稍微解釋一下原先架構:

  • Go RPC:
    • 主要處理接受一些API,連接MySQL
  • MySQL:
    • 主要的資料乘載
  • PHP:
    • 裡面有數個Web Services,主要也是連接PHP

先從MySQL資料庫開始

資料庫沒有太多困難,由於可能會有資料庫的版本不同,所以做法會是:

  • 啟動 MySQL Docker Container (版本自選或是最新)
  • 導入資料庫SQL (空白或是有資料)
docker run --name my-db -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql

這是一個基本的啟動最新版MySQL的Docker指令,其中也預設了root密碼. 可以使用-p 3306:3306來開放port出來給其他server連接.不過由於我們要使用--link,所以我們不需要用到export port來用.等等透過Go RPC Server來使用,

整合Go RPC Server

這邊其實不討論怎麼build go binary,而是假設你已經有個在ubuntu上面compile好的binary.

docker run -p 8088:8088 --link my-db -it -v $BiaryADD:/rpc ubuntu /rpc/go-rpc-server

這一段程式碼會去執行ubuntu基本的image,主要是透過/rpc/go-rpc-server來執行已經build好的Go RPC Server binary.

如果你要用--link my-db在新的container上的話,那麼你的Go DB Connection 應該要類似以下的Go

sql.Open("mysql", "root:PW@my-db/DB_NAME")

重點就是你要把你要連接的target連到my-db而不是localhost.(因為container的localhost會是在docker裡面,而不是那台機器本身)

根據link的docker spec有提到,其實link就是做了兩件事情:

  • 更新 container ip 在 /etc/hosts
  • 設定好系統參數 (讓你可以直接使用my-db)

整合PHP Web Server

這裡使用的是tumtumcloud/apache-php這個image.不過我有稍微修改,一併把外面PHP位置放進去.

docker run -v /YOUR_PHP_ADD:/app --link my-db

透過這個方式,只要你的PHP設定是連接 $db['host']="my-db" 就可以了.

整在一起放在docker-compose吧

透過以上三個services,其實我們可以寫在同一個docker-compose.yaml然後一次啟動.檔案可能是類似以下的方式:

go-app:
  build: ./rpc/.
  ports:
    - 8088:8088
  volumes:
    - ./GO_RPC:/rpc
  links:
    - atc-db
  command: /rpc/run_rpc.sh
web-app:
  build: ./apache-php/.
  volumes:
    - ./apache-php/php:/app
  links:
    - my-db
  ports:
    - 80:80
my-db:
  image: mysql
  volumes:
    - ./db/db_data:/var/lib/mysql
  env_file: db.env

稍微解釋一下,主要這邊有三個服務 go-app, web-appmy-db.就像前面提到的一樣,只是把每個設定不論是link或是volumes或是env_file甚至是command都寫入了docker-compose.yaml.他就會依照相依關係來啟動個別microservices

  1. my-db DB services
  2. go-app Web Go RPC services
  3. web-app PHP Apache services

這樣大概就把整個有在使用的服務串接成三個container來使用.算是第一個階段完成,有更多的services等著要去dockerized.並且也可以考慮導入swarm來分開在不同的host上面.

[Go]取得實體網卡的IPv4網路遮罩(Get device network mask)

##前言

最近在研究一些Golang在UDP上的處理,主要是要抓取網路遮罩(network mask)做一些進階使用.就發現要取得正確的網路遮罩,其實是蠻困難的.由於是無法直接使用到裝置上面的網卡設定.

這邊介紹一下相關的流程:

###先來抓取IPv4

這邊先顯示抓取IP的方式:

func GetIP() net.IP {

	ifaces, err := net.Interfaces()
	// handle err
	if err != nil {
		log.Println("No network:", err)
		return nil
	}

	for _, i := range ifaces {
		//只抓取網路卡名稱為"en0", "en1"...
		if strings.Contains(i.Name, "en") {
			addrs, err := i.Addrs()
			// handle err
			if err != nil {
				log.Println("No IP:", err)
				return nil
			}

			for _, addr := range addrs {
				var ip net.IP
				switch v := addr.(type) {
				case *net.IPNet:
					log.Println("IPNET")
					ip = v.IP
				case *net.IPAddr:
					log.Println("IPAddr")
					ip = v.IP
				}
				
				//這裡會抓取兩種IP,分別是IPv4與IPv6
				if ip[0] == 0 {
					//第一個byte是0為IPv4
					log.Println("Get device:", i.Name)
					return ip
				}
			}
		}
	}

	return nil
}

透過這個方式可以列舉所有的網路卡並且把第一張具有IPv4資料的net.IP傳回來.

###再來找Network Mask

其實透過官方的API,原本就有一個IP.DefaultMask()函式可以使用.不過抓來的Network Mask是透過計算而來的,而不是跟網卡拿的.透過以下的範例:

 package main

 import (
         "fmt"
         "net"
 )

 func main() {
         addr := net.ParseIP("192.168.1.1")
         mask := addr.DefaultMask()
         fmt.Printf("Address : %s \n Network : %s \n", addr.String(), mask)
        //Mask 255, 255, 255, 0
 
         addr = net.ParseIP("172.16.110.123")
         mask = addr.DefaultMask()
         fmt.Printf("Address : %s \n Network : %s \n", addr.String(), mask)
        //Mask 255, 255, 0, 0
}

這邊可以看到,如果你的內部網路不是設定192.168.XXX.XXX的話,你抓到的mask都會是255.255.0.9.這樣的結果跟你在網路卡上面查到的可能會完全不相同.

###跟網卡拿取資料

比較好也比較不容易有問題的方式,就是直接透過系統的指令(console)去跟OS拿取網卡的資料.這裡貼上兩種方式:

Windows 版本(目前Go 1.5.2 broken,預計Go 1.6會修好)

網路上搜尋到的應該都是透過這個方式,不過在Go 1.5.2似乎broken了,聽說Go 1.6會修好. 可以參考這個Go: issue 12551

Mac OSX的版本,透過Ipconfig指令來抓取

這是我自己尋找的,透過Mac OS X的命令列來抓取資料,其實是比較簡單也比較方便的.不會因為版本有太大的問題. 使用方式就是call GetNetMask("en0")

###結論:

要抓取IP可以透過net package來抓取,但是需要IPv4的網路遮罩,還是得要跟實體設備直接抓取比較妥當. 不過之後都要使用IPv6了,就不用那麼麻煩啦.

參考練結: