Latest

Web

一種更緊湊的數據格式:Protobuf 入門

Protocol buffers,簡稱 Protobuf,是由 Google 設計的結構化序列化資料技術。對網路應用來講,常常需要在不同的伺服端、客戶端之間交換資料,這些資料格式有 XML、JSON 等等之類。XML 特點是完整,便於記載更多的 meta data,但格式複雜,需要更強的效能來解析,傳輸時也需要更多頻寬;而 JSON 是 JavaScript 用於表示物件的語法,相對 XML 來得簡潔,隨著 JavaScript 普及,也變成現在常用的輕量級資料交換格式。 儘管 XML 跟 JSON 在當前網路應用中已經相當常見,但用不同語言開發的伺服端程式,都需要分別實現自己語言的 XML 或 JSON 解析,同時,這些格式定義也是團隊協作的痛點。假設 A 團隊開發某支應用,

By Ken Chen

Go

訊息的處理架構:路由與中間層模式

進行後端程式開發時,常會使用到 Golang 的 http 標準庫。例如要對某個 URL 進行處理時,會用到 http.Handle("/foo", fooHandler) 可以想像,如果沒有 http 庫,就需要使用大量的 if else 來對 URL 判斷,大幅降低程式碼可讀性。http 庫對 URL 進行 function 註冊的設計模式,不僅可以使用在後端開發,也能應用於更普遍的情境。對於要對同類型資訊進行不同處理的例子,都可以使用這個設計模式。 本文會用 Golang 來開發一個類似 http middleware 的程式,處理自訂的訊息格式,藉由這過程,也順便走一次 http 庫的路由設計原理。 Build a

By Ken Chen

Go

Go 命令行工具初體驗:使用標準包開發

最初是在社群活動時接觸到 Golang,前陣子換工作後,新的產品團隊也是使用 Golang 來開發產品,在接觸新語言時覺得有些地方很有意思,好像能看到某種程式語言的變遷,或者說開發方向之類?跟常見的物件導向語言不同,Golang 不強調物件,而且帶有一些函式編程的特色,如果說 C++ 是替 C 補上物件導向的環節,那 Golang 更像是 C 語言的現代版。 本篇會簡單介紹如何使用 Golang 來開發一個簡單的命令行工具。我們可以假設一個微服務開發的情境,開發者需要頻繁在開發環境中啟動或關閉微服務,這時它會需要一個工具,能依照需求啟動各個微服務,通常在 Linux,我們會使用 shell script 來做這件事;如果是 Windows,則會使用 power shell 或 batch file;更正式的生產環境,可能會採用容器調度工具。Golang 由於具有跨平台的特性,也可以用在這個情境中。 Install

By Ken Chen

C/C++

Conan:C/C++ 的套件管理工具

開發 C++ 程式時,套件管理會是個困擾開發者的問題,C++ 不像 Python 有 pip;node.js 有 npm;lua 有 rock;C# 有 Nuget。它就只是沒有。沒有套件管理,當不同開發環境的使用者要開發程式時,不僅需要手動將相關的檔案塞進 repository 中,還會遇到相容性的問題,例如小明使用 paho-c 1.3.0 開發,開發到一半時,另一位開發者小華引用了小明放在 repo 中 include 資料夾下的 header file,卻使用了自己的 1.3.1 shared library,這使得兩個人的版本不相容,要花很多時間除錯。 此外,當需要更新

By Ken Chen

Cross Platform

跨平台軟體建置:CMake 入門

當我們將軟體的價值視為服務時,跨平台就會越來越重要,因為它代表軟體能跨越限制,降低客戶使用成本,進而更快創造價值。工程師可能很難想像,當客戶拿到新軟體時,他需要面對一堆設定問題,還需要建置平台,這會是一件多讓人厭世的事。 常見的跨平台是指,軟體可在三大主流平台上運作,也就是支援 Windows、Linux、Mac;也有些跨平台指硬體平台,像是 x86 或 arm。本文會用 cmake 這個跨平台建置工具,分別建置可於 Windows 與 Linux 上執行的應用程式。 Prerequisite 對於 Windows 的開發者,建議用 MinGW 來建置,這個工具讓 Windows 上有跟 Linux 相同的操作經驗,可以避免二次學習。Windows 10 有很便利的 Package Management Chocolatey,類似 Ubuntu

By Ken Chen

C/C++

C++ 開發環境架設:使用 CodeLite

很久沒寫 C++ 了,上次是一年多前的事,當時為了在專案中使用 TDD 開發,套用 CppUTest 當 Unit Test Framework,而這套 Framework 就是用 C++ 寫的。最近工作上又需要用到 C++ 當底層資源,環境重架之餘,順手紀錄一下歷程。 原本的開發環境是 Windows 7 + uVision,使用 C 來開發 MCU。為了導入 TDD,需要在 Local 端有編譯執行的能力,考量到資源開放性,選擇用 cygwin 來執行 GNU,同時選擇當時資源豐富的 VSCode 做為編輯器。如果現在重選的話,可能會直接使用 Ubuntu 的 GNU,搭配

By Ken Chen
訂閱 Facebook Group 的訊息:自建 RSS 伺服器

GCP

訂閱 Facebook Group 的訊息:自建 RSS 伺服器

feedly 是一款 Web RSS 訂閱服務,自從 Google Reader 2013 年停止服務後,我就一直使用它,但隨著社群媒體像 Facebook 或 Twitter 流行,訊息的樣貌也改變很多,最痛苦的就是在 Facebook 跟人互動,結果這些訊息都要透過 Facebook 動態來 Follow,等同於變相洗版,何況 Facebook 有自己的演算法,會篩掉它認為你沒興趣的訊息。 這幾天被 Facebook 洗版洗到受不了,外加漏掉一則重要訊息,終於忍無可忍決定找一個新的訂閱方式,但偏偏 Facebook 本身不提供 RSS 訂閱服務,只好土法煉鋼,自己想辦法。 本文會用 tweeper + GCP + feedly 來完成對 Facebook 公開頁面的訂閱。讓這些消息能更好地被管理。 Fetch

By Ken Chen
從零開始的 SMTP:以 Python 為例

SMTP

從零開始的 SMTP:以 Python 為例

這陣子在重溫 SMTP,想說拿 Gmail 來測試,看看能不能從底層刻出一個簡單的 SMTP Client。沒有其他目的,本文會使用 Python 當範例,一步步實現 SMTP 協議。 Set Gmail 既然是用 Gmail,就要先把 Gmail 設定好。因為安全性的因素,Gmail 會管控部分應用程式,不讓它們登入,很不幸的,我們自己寫的 Python Script 就是所謂的低安全性應用程式。因此在測試前請先到 Google 設定頁面中開啟「允許低安全性應用程式」,測試完後再改回去。 Create a SSL Socket 在寫 Code 前,要先知道 Server 的位置跟 Port,參考 Gmail 頁面的說明

By Ken Chen
監控節點的度量指標:Grafana 串接 Prometheus

Observability

監控節點的度量指標:Grafana 串接 Prometheus

在前面的討論中,我們可以用 Prometheus 去監控 End Devices,但 Prometheus 內建的 Dashboard 只是為了開發用,缺乏許多進階功能,在真正需要資料視覺化時並不方便。因此 Prometheus 通常會跟 Grafana 搭配使用。 Grafana 是一套開源的 Dashboard 平台,之前開發產品時,有用過 Grafana 來呈現 Database 中的資料。其實用起來還是偏 Monitor Host,並不適合用在 Domain Data Visualization,但在開發初期,我們可以先借用 Grafana 的呈現能力來確認方向(反正開發初期規格會一直修改,重要的是工具能否快速調整,實不實用倒是其次)。 Install Grafana 跟 Prometheus 一樣,用 docker 來安裝

By Ken Chen

Git

輕鬆上手約定式提交:Commitizen 初體驗

最近參加 DevOps Meetup 的活動,Speaker 提到團隊使用 Commitizen 這套工具來統一提交訊息的風格,當場就有種醍醐灌頂的感覺。我們團隊前陣子才 Suffer 在 Commit Style 分歧,知識管理效率低落,有時只有 commit 本人能看懂,而使用共同模板又太浪費時間,跟 Git 鼓勵 commit 的精神背道而馳。聽完後,真的是相見恨晚,完全命中我的痛點。 Commitizen 是由 AngularJS 的規範衍伸而來,各團隊可以依照需求自行調整,我們 Step by Step 來看看 Commitizen 的效果如何。 Install Node.js 因為 Commitizen 是使用 Node.js 開發,不免俗的,

By Ken Chen

Observability

監控節點的度量指標:Prometheus 入門

Prometheus 是一套開源的監控系統,常常搭配雲端,監控服務運行狀態。今年 COSCUP 有一位 Speaker 將它用於 End-Devices 的監控,看起來非常有意思。透過這套系統,我們能將各處節點的資訊整合於統一的平台,讓 Operation 監控服務,避免服務中斷導致價值鍊中斷,同時這些數據也能提供給 Developer,作為後續改善的依據。 Prometheus 的基本原理是用 HTTP 定期抓取監控端(target)的資料,target 上會有 exporter,將符合 Prometheus 定義的資訊輸出到 HTTP API,Prometheus 拉取後就能將它顯示於 Dashboard。 Install Prometheus 安裝有兩個方式,可以用 binary 安裝或是用 docker 安裝,為隔離與管理方便,這邊選擇使用 docker 安裝

By Ken Chen
配置即代碼:Ansible 入門

Cloud Native

配置即代碼:Ansible 入門

之前負責產品研發時,常常需要因應客戶需求,更新終端裝置上的應用程式。因為終端裝置在廠區可能一次就是幾十幾百台,如果用手動更新大概當天就不用做事了。Ansible 這類組態管理(Configuration Management)軟體就是為此而生。相對於同類軟體,Ansible 的系統需求單純,只要 Client 端有安裝 Python 即可,很適合資源受限的嵌入式系統。 這篇會用 Ansible 來模擬簡單的 Python 應用程式更新,看看它如何處理 Deployment 的問題。 Install Ansible and Setup Environment 首先在 Server 端安裝 Ansible,如果你使用的是 Ubuntu 的話,只需要執行 sudo apt-get install ansible 同時,使用一台 Raspberry Pi Model B

By Ken Chen