Hello World
CodeTengu Weekly 碼天狗週刊
CodeTengu Weekly 會在 GMT+8 時區的每個禮拜一早上 10:00 出刊,每一期會從目前的 curator 名單中選出三位來負責當期的內容,每個 curator 各自負責不同的領域。如果你在這一期沒有看到自已感興趣的東西,說不定下一期就會有了。你也可以瀏覽一下前幾期的內容。
以下是目前的 curator 陣容:
- @vinta - I failed the Turing Test - 科幻迷,最近在讀 The Best of Isaac Asimov
- @saiday - Imnotyourson - 妙蛙種子破音
- @tzangms - Oceanic / 人生海海 - 衝動型購物
- @fukuball - ImFukuball - GCP 好用嗎?
- @wancw - comiXology 的坑好大啊~
- @mingderwang - Ethereum enthusiast
- @kako0507 - 熱愛嘗試新事物的前端工程師
- @chiahsien - 我們在找 iOS 工程師與其它人才,歡迎來跟我當同事。
- @hiroshiyui - 沒有人是一座孤島
- @uranusjr - Smaller Things - 不愛談技術的技術人,最近對做菜很有興趣
- @kkdai - 態度萬歲 - 喜歡 Golang 的略懂工程師
- @yhsiang
大家也可以關注我們的 Facebook、Twitter、GitHub 或微博,有很多 Weekly 看不到的內容。有任何建議或疑問也可以來 Gitter 聊聊,歡迎亂入 👺
致力於解決開發者之間的資訊不對稱
@saiday
Testing, for people who hate testing
這一篇文章的目標族群是不喜歡寫測試的人,內容涵蓋你討厭測試的原因跟改善的方法、你應該對什麼樣的東西做測試、測試的道理。
我覺得 Hating testing less 這個段落寫得還不錯。
從這個段落做延伸,很多人在測試這件事上就是卡在連第一步都啟動不了,覺得值得測試的 module 完全是一個很難寫測試的狀態,說要測那些比較容易被測試的 module 嘛,卻又覺得測它一點意義都沒有。
我會覺得第一個測試從你覺得重要的 module 開始會比較好,即便要改寫的東西很多,但也因此才能比較好地感受測試的方法、道理跟好處。
工作了好幾年,總覺得習慣寫測試的工程師的程式風格大概就是一種樣子,而不習慣寫測試的工程師們卻有各式各樣的程式風格。
以寫不寫測試來評斷一個軟體工程師的優劣是不精準的,但我相信好的工程師都可以掌握測試帶來的優點跟影響。
PS. 王垠前陣子也寫了一篇批判測試形式主義的文章 测试的道理,風格還是一如往常地激烈,當然所有的形式主義都應該被討厭,但還是有很多人可以把測試這個工具發揮地很好的。
Immutable models and data consistency in our iOS App
Pinterest 分享他們將 iOS app 重新設計成 immutable models (entities) 的經驗。
主要動機是想要 models 可以 thread safe。
文章也揭露他們在 API response 跟 model initialization 之中還擋了一層 model cache,這樣的優點是可以從多個都不完整的 API response 合成出一個包含全部最新資料的 model。
重新設計後得到的 immutability object 也影響以往他們是用 KVO 來處理資料的更新,現在得改用 NSNotificationCenter 來發送特定 model 需要更新的 event。
PS. 在 app 擋一層 persistence layer 可以讓 remote API 的設計更有彈性,可以像 Pinterest 一樣塞到 cache 裡,或者是 app 自己維護一份 client 的 DB。
openURL Deprecated in iOS10
iOS 9 開始,我們就必須要把 app 會使用到的所有 openURL:
的 scheme 加到白名單裡面,關於這件事,可以參考一年前的這篇 Quick Take on iOS 9 URL Scheme Changes。
而這次 iOS 10 更是直接棄用了 openURL:
改以非同步的 openURL:options:completionHandler:
代替。
相信這個改動會影響大多數 iOS 的開發者。
Make your build.gradle great again
一些 build.gradle
的小技巧,列了一些可以透過 build.gradle
處理那些能在 build time 做的事情、將那些獨立的 task 拆成不同的 scripts 再用 apply
讓主要的 build.gradle
保持精簡跟閱讀性。
有一些比較有意思的技巧:
- Android library 庫用
jcenter
會比mavenCentral
來得反應速度更快,作者建議大家唯一使用jcenter
- 如果 app 的
minSdkVersion
小於 21,可以只在 debug 的時候將minSdkVersion
指到 21,這是 build tools 優化的一個 API level 分水嶺,可以讓 build 的速度變快
拆轮子系列:拆 RxJava
我用過不少種的 Reactive framework,但其實一直都不明白它從 Observable
開始到我最喜歡的 onNext
中間是怎麼設計的,這篇文章對我來說是一個很好的觀念引導。
作者從最間單的 Observable.just().subscribe()
開始觀察 just
跟 subscribe
的實作,再慢慢加入 map
、observeOn
、subscribeOn
。
@kako0507
Is Your JavaScript Function Actually Pure?
本篇文章探討 JavaScript 的 Purity 、 Referential Transparency ,最簡單的解釋方式就是,將同樣的參數給同個 function 或 expression 可以保證獲得相同結果。 文內舉了一個簡單的 sum 例子探討該 function 內的行為是 pure 或 impure ,最後的答案是不確定的,必須依據 runtime 的行為,而大部分人之所以認為該例子是 pure 的,是因為對該 function 有了一些假設(如 sum 是用來加總數字的,其餘參照內文),而 functional programming 和 JavaScript 相比的好處就是讓你很容易把這些假設變成限制,進而讓行為更可預測。
You Might Not Need Redux
學習 Redux 前可以先評估自己是否真的需要用到這樣的 framework ,在使用 Redux 時有很多限制:
- 使用 plain objects 或 arrays 來組成 application state
- 使用 plain objects 來描述 state change
- 處理程式邏輯和 state change 都必須透過 pure functions
不過不論是否使用 React ,上面這些限制都不是必要的。 如果你剛接觸 React , 應該先去搞懂 think in React ,等真的需要了,再來使用 Redux。
然而就算你沒有使用 Redux ,你也可以自己將它的精神實作出來, Redux 把「發生了什麼」與「怎麼發生的」完整的 decouple ,但每次都需要這樣做嗎?或許應該自己先權衡利弊。
Descartes, Berkeley and Functional Reactive Programming
本篇文章從兩個西洋哲學家的理念,來探討 functional reactive programming,一開始先從一個思想實驗轉換成兩種不同的程式實作,再和 René Descartes 與 George Berkeley 的哲理一一對應,算是一個有趣的(?)切入點,有興趣可以看看。
@kkdai
我的社群之路: 參加,參與,受到啟發與啟發別人的道路
又到了 Curator 自肥時間. 來分享一下我的研討會與社群心得給大家.
在參與研討會的演講中,其實我們會遇到很多熱情的讀者.有的甚至會來感謝講者,不過其實身為講者受到這些人的感謝.自己往往感謝最多.
很多時候,當你啟發別人的時候.其實,最受到啟發的將會是你自己.
Go + Docker = ♥
Docker 界的大大 jpetazzo 寫了篇講解如何透過 Docker 而不安裝 Golang 的方式來編譯,執行甚至是跨平台編譯的相關指令. 但是有些地方需要注意:
- cgo 與 net : 使用 Docker-Golang 來編譯與執行 Golang 程式碼,需要注意到是否有使用到
net
與cgo
的部分,如果有你的 base image 可能要換成from debian
雖然會比較大,但是就比較不會有平台上的問題. - 關於使用 ssl : 處理 SSL certificate 一直都是很麻煩的事情,這裡建議透過
alpine
來安裝 root certificate
FROM alpine:3.4
RUN apk add --no-cache ca-certificates apache2-utils
gravitational/teleconsole: UNIX shell broadcasting tool
類似 tmate 有自己帶網路伺服器的 SSH console sharing 小工具.
透過一個自己建立的 SSH Public 伺服器,甚至可以提供防火牆內的使用者來分享自己的終端器介面.
此外,補充一下 原來不需要 tmate , tmux 跟 screen 就可以。
使用 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
[Podcast] Rust with Steve Klabnik
Podcast 分享 Software Engineer Daily Podcast: 由 Steve Klabnik 介紹 Rust 透過淺顯易懂的方式來介紹 Rust ,並且介紹三大 Goal:
- Safety
- Speed
- Concurrency
如果你還在觀看 Rust ,針對以下三個角色講者也提出一些 Rust 會吸引你的地方:
- 如果你是 C/C++ 的使用者
- 如果你是 FP 的使用者
- 如果你是 Web App 的使用者 ( Python/Ruby)
並且有介紹為何 Rust 沒有 GC 與 使用 LLVM 的優點,也有介紹到 LLVM 與其優點. 蠻適合新手聽聽看
雖然本人是熱愛 Golang 的,但是 Rust 的許多優點也是我們要好好重視的.
延伸閱讀: 王垠: 对 Rust 语言的分析
Random Cool Stuff

fogleman/primitive: Reproducing images with geometric primitives.
這是一個用 Go 寫出來的工具,用 geometric primitives 來繪製輸入的圖像,效果蠻好的。
可以研究他的演算法或是直接拿來做一些圖片的效果。 它有一個 Twitter 帳號 @PrimitivePic 每 30 分鐘會上傳一張作品。
由 @saiday 提供
This RSS feed is published on http://weekly.codetengu.com/. You can also subscribe via email.