[研討會心得] Golang Taiwan Gathering #16 順利結束,相關資訊.

活動網址:

這裡

GTG16 - Slides:

可以 follow 這個 Repo

Talks - Slides

Lightning Talk - Slides

GTG16 - 影片:

Golang Taiwan Gathering 16 影片出爐:

  1. Part 1 主要是我講建置 IM Bot 與 luis.ai demo
  2. Part 2 hawk 講解 Telegram Bot 與 lightning Talk
  3. Lightning Talks
    • Umbo CV: Kakashi - Golang X CI X CD
    • duolC: Cyril - 使用Go實作跨平台匿名配對聊天app的後台機制
    • iotwav: Bean - Recruit for DevOps
    • Evan: Use go channel to write a disk queue

程式設計週記[2016/09/16]: 下週要舉辦 Golang Gopher 台灣聚會,記得參加

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

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

網路文章心得:

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

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

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

本週摘要

公司的公事開始要忙碌了,不過還是要開始把一些記錄一下.此外, Coursera 的 Cloud Computing 第二輪希望能夠修完.筆記有點多都還沒寫完.

最重要的是下週有 Gopher Taiwan 聚會在 09/20 ,大家記得要參加.



Go

初試 Go lang 經驗

同事透過 Pokemon naming package 來學習如何透過 VSCode 來寫 Golang.

SOLID Go Design

dfc (Dave Cheaney) 在 GopherCon 2016 上面的 Talk

如果想看中文版本,可以看這個

Creating a Bot using the Telegram Bot API

使用 Golag 的 Telegram Bot API 來建立一個聊天機器人

jpetazzo/Go + Docker = ♥

Docker 界的大大 jpetazzo 寫了篇講解如何透過 Docker 而不安裝 Golang 的方式來編譯,執行甚至是跨平台編譯的相關指令. 但是有些地方需要注意:

  1. cgo 與 net : 使用 Docker-Golang 來編譯與執行 Golang 程式碼,需要注意到是否有使用到 netcgo 的部分,如果有你的 base image 可能要換成 from debian 雖然會比較大,但是就比較不會有平台上的問題.
  2. 關於使用 ssl : 處理 SSL certificate 一直都是很麻煩的事情,這裡建議透過 alpine 來安裝 root certificate
FROM alpine:3.4
RUN apk add --no-cache ca-certificates apache2-utils

rpcx is a distributed RPC service framework based on net/rpc like alibaba Dubbo and weibo Motan. One of best performance RPC frameworks.

這個 RPC Service 透過分散式的方式來提供更好的 RPC 效能,甚至遠遠超過 GRPCAlibaba DubboWeibe Motan

除了速度快,更有以下的特點:

  • 支援多種資料格式 json, protobuf, gob
  • 支援多種 discovery service: zookeeper, etcd
  • 由於根據 net/rpc 寫成,使用原生套件的人可以很快速的轉換過來.
  • 支援 Load Balancer



Python

教你阅读Python开源项目代码

這幾個推薦的 Repo 跟作者都挺有名的.



Android/JAVA/NODE.JS/Scala

Use RecastAI to build A NodeJS chatbot tutorial

這篇文章教導了如何透過 RecastAI 一樣是做自然語言的公司.(使用 node.js)

yhsiang/pokemon-go-query: Pokemon Go Query, help to find the nearest pokemon (Use Go Radar)

G0V 的 LY 開源他的 Pokemon IM 機器人,透過 Go Radar 可以了解發文者周圍有沒有 Pokemon .



Docker

Cgroups, namespaces, and beyond: what are containers made from? (DockerCon Europe 2015)

舊文章,不過仔細地講解 cgroup, namespace 也就是 container 的底層教學.

Docker 1.13 : Checkpoint & Restore preview

主要講解 Docker 1.13 的新功能,可以將你的 container 狀態像是 snapshot 一樣做 checkpoint 與 restore 的功能.看起來很有趣.

Docker 線上讀書會: Willy - Docker Netowork

強者我同事 Willy 講 Docker Network 不得不學的好東西啊



Kubernetes



iOS/Swift



其他程式語言

PhxSQL: high availability MySQL cluster that guarantees data consistency between a master and slaves.

WeChat 出的具有 HA 的 MySQL Cluster 稱為 PhxSQL , 細節可以看 MySQL的一致性世界

裡面有提到 MySQL 5.7 本身其實已經支援 Group Replica ,除了 HA 之外已經支援多結點寫入的功能.



論文收集



網站文章

DevOps Taiwan wiki

整理許多好文的列表,並且歡迎大家的 PR .

DevOps Summit 2016 全部影片

Y2016W36| Just for noting by m157q

這個禮拜整理的鏈結都還不錯,可以建議長期訂閱相關文章.

[成功大學: 進階電腦系統理論與實作

THE PERSPECTIVE AND APPLICATIONS OF COMPUTER SYSTEMS 授課大綱](http://class-qry.acad.ncku.edu.tw/syllabus/online_display.php?syear=0105&sem=1&co_no=P75I100&class_code)

學生必須要先具備 Guts .可惡,已經就業的人可以修嗎?

Evan Klitzke 受訪談論為什麼 Uber 要從 PostgreSQL 轉到 MySQL

以下文字截自 Ant 臉書

主持人問 3 年前 #Uber 從 #MySQL 轉用 PostgreSQL 的原因。Evan 指出最重要的原因之一,就是 MySQL 的 Schema change 功能不如 PostgreSQL 好,例如需要新增欄位或索引。

Uber 的簡報分享於 2013-03-13,而 MySQL 5.6 同年 2 月才剛 GA ,所以估計 Uber 當初使用的還是 MySQL 5.5,而 MySQL 5.6 對於 Online DDL (Online Schema change) 才開始廣泛支援。

主持人問轉到 PostgreSQL 後遇到什麼問題。Evan 指出效能問題,在轉用 PostgreSQL 後,Uber 需要新增更多的機器來撐起效能需求,例如 PostgreSQL Connection ability 不如 MySQL。

其他內容官方網站上都有,就不引述了

逆向工厂(一):从hello world开始

從基本的程式概念解釋,一直到如何開始你的第一個逆向工程.這篇算是科普文章,不過相當實用.

丁香园现任CTO:我二次创业遭遇的3个失败

幾次的創業經驗分享,蠻值得好好閱讀的.主要就是專注在創業方向與好的創業團隊.

如何透過聊天機器人(Chatbot) 翻轉企業與客戶的溝通方式

台灣新創的自然語言系統,至於有多麼強大可已慢慢期待.

O’REILLY最新报告:人工智能将在这5个方向触发医疗变革

根據這份報告, AI 將在以下幾個方面對於醫療有著重大改革:

  1. 人口管理: 透過學習來識別是否有重大危險.
  2. 護理管理: 個性化護理管理.
  3. 患者自我管理:透過學習來管理患者服藥以及其他的自我管理.
  4. 系統設計: 透過設計讓每一份支出可以獲得最大效益,或是病人獲得最好的照顧.
  5. 決策支援: 讓醫生可以有更快速與更精準的決策輔助.

深度解读:阿里离亚马逊还有多远?

很有趣的文章,主要講到 Alibaba 跟 Amazon 一樣都是注重長遠發展(超過七年的計畫).並且在 Cloud Service 上 AWS 雖然居於領先的地位,但是阿里雲也是緊追在後.



網站收集



有聲書/影片心得

Paxos lecture (Raft user study)

講解 Paxos ,不光是有 Basic-Paxos 也有 Multiple-Paxos .還有 Raft Case Study .



[Golang] 安裝流程 CoreOS/DEX : OAuth Server

挑選 DEX

挑選 CoreOS 的 Dex ,因為它具有以下特點:

  • 支援 OpenID
  • 支援 Kubernetes Authenication (via OpenID)
  • 支援 OAuth
  • CoreOS 開發 (XD)

以下就是基本建置方式

建立 Google API Console 憑證

  • 進入 Google API Console 選擇已經有的專案(或是建立一個新的)
  • 進入”憑證中心“,建立一個新的憑證.
    • 選取 “OAuth 用戶端 ID “
    • 選取 “網路應用程式”
    • 在 “已授權的重新導向 URI” 輸入 “http://127.0.0.1:5556/dex/auth/google/callback”
  • 這邊會取得 “ID” 跟 “Secret” 記得存下來.

建立資料庫 (PostgresQL)

1. 設定 postgres docker

docker run --name postgres -e POSTGRES_PASSWORD=YOURPASSWORD -d postgres

2. 登入建立相關 schema

docker run -it --rm --link postgres:postgres postgres psql -h postgres -U postgres

>Password for user postgres: 
>psql (9.5.4)
>Type "help" for help.


postgres=# CREATE DATABASE dex_db;
> CREATE DATABASE

postgres=# CREATE USER dex WITH PASSWORD 'dex_pass';
> CREATE ROLE

postgres=# GRANT ALL PRIVILEGES ON DATABASE dex_db TO dex;
> GRANT

postgres=# \q //離開 postgre console

3. 編譯 DEX

先設定 postgres 環境變數,將剛剛資料庫密碼帶入

export DEX_DB_URL=postgres://dex: YOURPASSWORD@localhost/dex_db?sslmode=disable

P.S.: 如果你跟我一樣 postgres 使用 docker ,記得將 localhost 改成該 container 的 IP.

下載並且編譯 DEX

git clone https://github.com/coreos/dex.git
cd dex
./build

4. 設定環境變數與啟動 DEX 服務

準備一段密碼(可能需要在其他電腦,如果你機器是乾淨的): (我是在 Mac 下跑這段:)

  • 產生 Secret Symmetric Key
export DEX_KEY_SECRET=$(dd if=/dev/random bs=1 count=32 2>/dev/null | base64 | tr -d '\n')

//這是 Mac 產生的
> dd if=/dev/random bs=1 count=32 2>/dev/null | base64 | tr -d '\n'
hwMSvt8Fr39WN2tN1ydyPlD02szBhhL6REjGgCIhn3o=

  • 產生 Admin API Secret
DEX_OVERLORD_ADMIN_API_SECRET=$(dd if=/dev/random bs=1 count=128 2>/dev/null | base64 | tr -d '\n')

//這是 Mac 產生的
> dd if=/dev/random bs=1 count=128 2>/dev/null | base64 | tr -d '\n'

B02cILOvy6o7DNU/zH7umCNkWr+E2MSkFsV3+nj5uKNaqVK7T33OLdN1ou38Rid6Swy/ZL4GljqeGOFhDgHJTkjA1so2HYr8Uda2FYHRuz2/AMSamwjLCOANl+3i9WOGduTDc8BtksN+fXB5xaJYpKDxWbcZoAaC1rU3VZyajDM=

設定環境變數,啟動伺服器.

export DEX_OVERLORD_ADMIN_API_SECRET=$DEX_OVERLORD_ADMIN_API_SECRET
export DEX_OVERLORD_DB_URL=$DEX_DB_URL
export DEX_OVERLORD_KEY_SECRETS=$DEX_KEY_SECRET
export DEX_OVERLORD_LOG_DEBUG=true
./bin/dex-overlord &

5. 執行 worker

這裡要修改 static/fixtures/emailer.json 不過可以先依照原本範例使用 fake email

./bin/dex-worker --db-url=$DEX_DB_URL --key-secrets=$DEX_KEY_SECRET --email-cfg=static/fixtures/emailer.json --enable-registration=true --log-debug=true &

6. 執行 Connector

記得要先將 $DEX_GOOGLE_CLIENT_ID$DEX_GOOGLE_CLIENT_SECRET 換成你在 Google API Console 拿來的資料.

cat << EOF > /tmp/dex_connectors.json
[
    {
        "type": "local",
        "id": "local"
    },
    {
        "type": "oidc",
        "id": "google",
        "issuerURL": "https://accounts.google.com",
        "clientID": "$DEX_GOOGLE_CLIENT_ID",
        "clientSecret": "$DEX_GOOGLE_CLIENT_SECRET",
        "trustedEmailProvider": true
    }
]
EOF
./bin/dexctl --db-url=$DEX_DB_URL set-connector-configs /tmp/dex_connectors.json

7. 啟動 Client

eval "$(./bin/dexctl --db-url=$DEX_DB_URL new-client http://127.0.0.1:5555/callback)"

記得要把 127.0.0.1 換成你的 public IP .

8. 啟動 Web Server

./bin/example-app --client-id=$DEX_APP_CLIENT_ID --client-secret=$DEX_APP_CLIENT_SECRET --discovery=http://127.0.0.1:5556/dex &

記得要把 127.0.0.1 換成你的 public IP .

Authenitication for Kubernetes

Seems no OAuth support

參考鏈結 OAuth Server

其他參考鏈結

程式設計週記[2016/09/09]: Kubernetes GO!

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

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

網路文章心得:

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

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

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

本週摘要

忙完了幾個研討會後,可以慢慢回歸正常的學習生活. 目前專注於研究 Kubernetes 的代碼與運作架構. 歡迎各位先進來討論討論 :)

此外,最近在籌辦新一次的 Golang 聚會 (Gopher Taipei Gathering ) 歡迎大家一起參加.如果發現報名報不到,歡迎參與閃電秀來分享一下 :p .



Go

fastcsv:

這個套件因為它支援的 csv 種類比較少所以能號稱比原生的 Enconding/csv 快上五倍.

有人因為 encoding/csv 真的太慢了,於是發了 issue

  • Go: avg 1.489 secs
  • Python: avg 0.933 secs (1.5x faster)
  • Java: avg 0.493 secs (3.0x faster)

恩… 真的不快吧 XDDD 有興趣的可以進去 issue 裡面看更多的細節

iamduo/workq: Job server in Go

Golang 寫的 Job Scheduler ,具有一千多的 star

Introduction to OAuth on gRPC

透過 GRPC 的方式來串接 OAuth Server

[有用小技巧] 使用 gofmt 與 golint 將 snake_case 換成 camelCase

由於 Golang 還算新,所以許多人原本都是從 java 或是 python 來學 GO . 就容易在程式碼裡面看出一些蛛絲馬跡 ( 使用 python 的 snake_case 或是 使用 foo().bar().do() 這樣類似的用法.

這個工具可以幫你把 GO 程式碼裡面所有的 python snake_case 轉換成 camelCase.

golint |
   awk '/should be/{printf("gofmt -w -r %c%s -> %s%c .\n", 39, $9, $12, 39)}' |
   sh

coreos/dex: OpenID Connect Identity (OIDC) and OAuth 2.0 Provider with Pluggable Connectors

coreOS 開發出來的 dex 不僅僅支援 openID , OAuth 還可以快速的跟 Kubernetes 整合

https://github.com/dgryski/go-lttb/commit/b13787546e2d18325b0222e9cad298a3943c7fab

[有用小技巧] 使用 gofmt 與 golint 將 snake_case 換成 camelCase

由於 Golang 還算新,所以許多人原本都是從 java 或是 python 來學 GO . 就容易在程式碼裡面看出一些蛛絲馬跡 ( 使用 python 的 snake_case 或是 使用 foo().bar().do() 這樣類似的用法.

這個工具可以幫你把 GO 程式碼裡面所有的 python snake_case 轉換成 camelCase.

gravitational/teleconsole: UNIX shell broadcasting tool

類似 tmate 有自己帶網路伺服器的 SSH console sharing 小工具.

透過一個自己建立的 SSH Public 伺服器,甚至可以提供防火牆內的使用者來分享自己的終端器介面.

此外,補充一下 原來不需要 tmate , tmux 跟 screen 就可以。



Python

How I built a Slack bot to help me find an apartment in San Francisco

這篇很有趣,他分享了如何透過自己寫的 Slack Bot 來幫自己找房子.

projectcalico/calico-containers: Project Calico deployed in a containerized environment

calico 是一個幫助你設定網路的工具(類似 ip addr 但是功能比較強大) .



Android/JAVA/NODE.JS/Scala



Docker



Kubernetes

Huawei Launches a Kubernetes-based Container Engine

Huawei 發表了他們自己的 Container Engine 稱為 CCE (Cloud Container Engine).市場似乎針對 NFV 因為高喊著極低的 CPU 與 network latency .

awesome-kubernetes

不少關於 Kubernetes 好的文章介紹. 不論從起源,如何使用,如何在 RPI 上面架設都有清楚的介紹.

Kubernetes Logging With Elasticsearch and Kibana

如何使用ElasticSearch 跟 Kibana 來串接 Kubernetes 的 log .



iOS/Swift



其他程式語言



論文收集

Majority agreement is not necessary for consensus

論文草稿

來自劍橋的博士生 Heidi Howard 針對 Consensus 演算法 Paxod 提出了一個相當有趣的見解.也就是在至少達成一個 commit 的狀態下,可以不需要達到 majority agreement (超過半數的同意) 就可以讓 Paxos 保有相當程度的穩定 (Steady state) 與可用性 (avaliability) .

相當有趣的論點,要好好找時間來瞭解一下. 同時相當推薦可以看看這個博士生的部落格,有著相當多對於 Consensus Algorithm 的研究.



網站文章



網站收集



有聲書/影片心得

Kubernetes Migration with Sheriff Mohamed

15 years company GolfNow share experience move from C# .Net to #kubernetes



[TIL] 投影片- Docker Swarm 介紹

Docker swarm introduction from Evan Lin

介紹:

這是公司與工研院合作的專案中的教育系列中的教學投影片.主要是介紹 Docker Swarm ,裡面涵蓋三種 Docker Swarm 的介紹與比對. 並且附上簡單的指令來帶領著走一回.

有個小八卦是 Docker Swarm Mode 的 Routing Mesh 成功率有點低,找時間得來看看為什麼 gossip 會斷掉造成資料無法順利傳回來.

[TIL] 中文導讀 - 如何征服老舊的程式碼 (How to conquer legacy code)

原文: How to conquer legacy code

鏈結

“How to conquer legacy code”

如何征服老舊的程式碼 (英文):

以下為中文導讀: (原文七分鐘可以讀完)

常常聽到許多人很害怕來解老舊程式碼裡面的 bug 尤其越是剛入門的工程師.甚至有些人會使用到 “ 通靈 “ 或是 “ 猜測 “ 來表示閱讀老舊程式碼的痛苦.

這一篇就是一篇很好的教學來教導你如何面對老舊的程式碼.

首先是心態問題,面對這樣的程式碼千萬不要抱著 “這麼不好的架構,我一定可以寫得比他更好的心態來看問題“

It’s easy to look at work that came before you and decide it’s no good and that you can do better. This is the wrong attitude. It will lead you down a very dangerous path.

建議的方式如下:

  1. 虛懷若谷看待老舊的程式碼,絕不輕易重寫.
  2. 試著畫出循序圖來解釋整個程式碼流程
  3. 儘量做最小的變動 (minimum viable change) 來修復問題
  4. 每次的修改讓原來的程式碼能夠更好一點
  5. 慢慢地,當你更熟悉之後,就可以仔細思考整個架構與流程上的問題.
  6. 想要在老舊程式碼上面增加新功能,千萬要依照著原先的思考流程.
  7. 如果有新的架構與流程修改,試著透過 Adapter Pattern 來開始整合.

同場加映: “The Best Programming Advice I Ever Got” with Rob Pike

Google 同為 Golang 發明者的 Rob Pike 曾經在某次採訪就有提到,受過最好的 debugging 建議就是來自 Ken Thompthon (C 語言的共同發明者)

“Thinking—without looking at the code—is the best debugging tool of all, because it leads to better software.”

最好的除錯工具,不是直接去面對程式碼而是仔細思考整段流程.因為它能夠引導你做出更好的軟體…

心得:

還記得當初學校畢業之後,本來還信心滿滿的.結果第一份工作到了視窗軟體開發的公司 (Intervideo Inc.) 就發現所有的環境都不了解之外,還得去面對超過三五年以上的程式碼.

要面對如此龐大的架構的老舊程式碼,當初的部門經理就很推薦我使用循序圖的方式來慢慢瞭解整體架構.透過這些方式進行最小變動的修改來解 bug ,並且慢慢的來了解整個軟體的架構.

後來對於系統架構越來越有了解後,更了解思考對於解決問題的重要性.不論是整體架構的思考,或是對於流程的改造與優化都有事半功倍的效果.

最近常常在推特或是臉書上看到大家對於老舊的程式碼困擾,於是把這篇文章介紹出來,希望能幫到更多的人.