Hello World
CodeTengu Weekly 碼天狗週刊
CodeTengu Weekly 會在 GMT+8 時區的每個禮拜一 AM 10:00 出刊,每期會由三位不同的 curator 負責當期的內容,每個 curator 有各自擅長的領域,如果你在這一期沒有看到自已感興趣的東西,可能下一期就有了。你也可以瀏覽一下前幾期的內容。
目前的 curator 陣容:
- @vinta - I failed the Turing Test - 科幻迷,最近在讀 The Quantum Thief
- @saiday - Imnotyourson
- @tzangms - Oceanic / 人生海海 - 衝動型購物
- @fukuball - ImFukuball - 有新工作了,但歡迎直接挖角
- @mingderwang - Ethereum enthusiast
- @kako0507 - 熱愛嘗試新事物的前端工程師
- @chiahsien - 徵有經驗的 Objective-C 工程師,快來 Twitter 私訊我
- @hiroshiyui - 歧路亡羊與中年危機的典範
- @uranusjr - Smaller Things - 邊緣人拉到 conference 還是邊緣人
- @kkdai - 態度萬歲 - 總算把 Gopher Day 辦完了..
- @yhsiang
- @johnlinvc - 挑戰自動化家中電器
你也可以關注我們的 Facebook、Twitter、GitHub 或 Open Source 專案,有很多 weekly 看不到的內容。有任何建議也歡迎來 Gitter 聊聊。
@vinta
Spark SQL cookbook (Python)
最近在為 StreetVoice 開發一個音樂的推薦系統,採用 Apache Spark,不過因為老是忘記 DataFrame 某某功能的用法,所以就乾脆仿效 O'Reilly 著名的 Cookbook 系列,幫自己寫了一篇 Spark SQL cookbook,複習、速查兩相宜啊。
因為 Spark 支援 Scala、Java、Python 和 R,一開始是打算用 Scala 來練練功的,不過畢竟是公司的專案,考慮到後續其他人的參與和維護,好像還是採用一個團隊成員都熟悉的語言比較好吶(成熟的大人.jpg)。
延伸閱讀:
How to Size Executors, Cores and Memory for a Spark application running in memory
在使用 spark-submit 的時候可以指定 --driver-memory、--executor-memory、--executor-cores 或 --num-executors 等參數來配置你的 Spark app 可以使用的運算資源,這篇文章指出了幾個需要注意的地方以及 One executor per core 和 One executor per node 這兩種做法會有什麼問題。
P.S. 現在 Spark 除了 Standalone 和 YARN 模式之外,也開始實驗性地支援 Kubernetes 了:apache-spark-on-k8s,看樣子 k8s 真的有一統江湖之勢了啊。
Mastering Feature Engineering
整個推薦系統的 pipeline 可以很粗略地分成 candidate generation 和 ranking 兩個部分,而 ranking 常用的模型之一就是簡單粗暴的 Logistic Regression(通常還會搭配 GBDT 或 Deep Neural Networks)。因為要用 LR 需要大量的 Feature Engineering,所以我就特地找了一本專門在講特徵工程的書,上週末去剪頭髮的時候終於讀完,正好可以推薦給大家。
不過這本書講的是比較基礎的部分(不要想一步登天嘛),例如針對數值特徵的 Binning 或標準化、針對文字特徵的 TF-IDF 和針對類別特徵的 One-hot encoding 或 Feature hashing,對創建出非線性特徵的 Feature Construction 則沒有什麼著墨。可以搭配前幾期推薦過的「机器学习中的数据清洗与特征处理综述」一起看。
Write Explicit Tests
Sometimes, normal programming good practices don’t apply to software tests. DRY in particular I don’t subscribe to for test code, because I want my tests to read like a story. - Kent Beck 如是說。
你減少了重複,但是卻帶來了耦合。寫程式真的很難啊。
Strace -- The SysAdmin's Microscope
strace 是個可以用來觀測某個 script 或 process 在 system call 這個層面到底做了哪些事的指令,是 troubleshooting 的好幫手,尤其是用來解決在 Linux 上大家喜聞樂見的「幹你娘為什麼 xxx 跑不起來?!(20 分鐘之後)噢我權限設錯了」的問題。
延伸閱讀:
差點忘了,為了慶祝 CodeTengu Weekly 即將邁入第 100 期,下週!開始!休刊!
@kako0507
React 16 beta 發布
React 16 Beta 終於發布,在這個版本有幾個重大的改變:
- 將 React 核心流程 — Reconciliation ,重新寫為 Fiber 架構,可以看 Lin Clark 在 React Conf 2017 的介紹 ,藉由拆分 Phases , main thread 就可以執行其他動作,而分解的過程又有各自的 priority ,較需要即時更新的畫面就可以流暢改變
- 加入 Error Boundaries ,可以透過 fallback UI 避免 component tree 直接出錯而中斷
Petition to open source Flash spec
Adobe 宣佈在 2020 年停止支援 Flash ,在 GitHub 上出現開源 Flash 的請願書,有興趣可以給個星號代表簽署這份請願。
Webpack: Implementing first-class support for WebAssembly
Webpack 獲得 Mozilla Open Source Support (MOSS) 的贊助,將實作 WebAssembly 為 first-class support 。因為目前所有載入到 webpack 的 resource 都會被視為 JavaScript,所以 webpack 的架構實作勢必需要重新改寫,不過也可以因此得到其他的好處,像是先前提到 CSS bundles lazy loading 的原生支援等等。
JavaScript Factory Functions with ES6+
ES6 提供很多方便的語法,本篇文章介紹非常實用的 object literal syntax 和 factory function 配合使用。
@uranusjr
CSS Grid Changes Everything (About Web Layouts)
Morten Rand-Hendriksen 在 WordCamp Europe ’17 展示 CSS grid 的威力。如果你已經習慣現在的前端排版思維,很難解釋 grid 有多厲害,不如直接感受一下。看看 Morten 的個人網站,稍微拉一下視窗觀察元件位置的響應,思考一下你會怎麼寫 markup。想好之後再打開 inspector 看看 Morten 的實作。身為從 GUI pgoramming 半路出家的網站工程師,這 markup 實在簡單到令我震驚啊!!!GUI 本來就是該這麼寫啊前端落後業界二十年終於跟上了好感動。
CSS grid 的主要功能就是把頁面上的各大項放到正確的位置,就像你用 graphic tools(例如 InDesign)一樣:拿著一個元件、把它放到方格畫布上某個位置;再拿另一個元件、把它放到另一個位置,以此類推。沒有 content flow、沒有 table、沒有 floating div、沒有 flexbox,就是單純的放置,和正常的圖像設計一樣。如同 Morten 在 talk 裡所說,這不是用來取代已有的排版工具,而是讓各種排版工具被用在它們本來的用途:如果你需要表格,就用 table;如果你需要浮動元件,就用 float;如果你需要並排類似元件,就用 flexbox。如果你需要排版一個頁面,就用 grid。
當然這年頭的前端技術一發表,第一排就會有人舉手說可是我的舊網站要支援 IE 所以不能用。Morten 基本上同意這件事,但 CSS grid 的用途有個 easy way out:mobile first。定義一個合理的排版(完全不用 grid)給 mobile 與所有過舊的客戶端使用,用 media query 在合適的尺寸與客戶端用 grids 顯示更花俏的排版。CSS grid 是革命性的排版變革(我完全同意),所以需要大家努力讓它儘早進入主流。
如果你比起影片更喜歡看文章,Morten 也在 Smashing Magazine 發表了一篇詳細的 write-up,可以參考。如果你之前學 flexbox 的時候看過 CSS-Tricks 的 cheatsheet 網頁,他們也為 grid 寫了一個,很好用喔。
A Rebuttal For Python 3
這篇其實很久了,但最近發現 Zed Shaw 仍然被當意見領袖訪問,然後還有人覺得他的觀點很有道理,所以再拿出來講一下。我個人是覺得如果連 Turing-complete 是什麼都搞不懂,而且還不接受自己搞不懂的事實,應該沒資格對這類議題發表意見啦。
如果你看不懂上面一段在寫什麼,我稍微解釋一下。Zed A. Shaw 是 Learn X the Hard Way 系列的作者,也寫了一篇 Python 教學 Learn Python the Hard Way,好像有被翻譯成簡體中文叫《笨方法学 Python》。他在 2016 年底發表了一篇文章,解釋他為什麼不喜歡(目前的)Python 3,認為不適合初學者,所以不打算更新教學。其中一個理由是 Python 3 無法執行 Python 2 程式,所以不是個 Turing-complete 語言。
!!???
然後霹靂星球 Python 社群就爆炸啦,很多人都寫了反擊文,包括上面這篇。其他還有一些理由也是很爛,族繁不及備載,大家就看 rebuttal 笑一笑吧。後來 Shaw 後來就跳出來說欸那 ger Turing-complete 很明顯 4 開玩笑 der R 尼們那摸認真肯定心裡有鬼 邪教無誤。嗯好喔總之我是不信啦。接著 2017 年初他就把教學更新到 Python 3 了。好不管怎樣,總之我是覺得這人已經被看破手腳技術信用破產,沒有發表公開意見的資格了啦。不過話說回來某神和某神雖然被很多人笑也是穩坐中文界大大地位,反正信者恆信啦,個人信仰我不干涉。
註:我對 CodeDojo 把 RoR 拿出課程本身沒有意見,只是認為 TNW 跑去問 Shaw 意見這件事情非常愚蠢。
價值 150 萬美元的引號
REXmls(一個 ICO)上週舉辦了 token sale。但他們忘了在網頁上顯示 contract 的 JavaScript 字串加上引號。正確的 contract 是 0x03e4B00B607d09811b0Fa61Cf636a6460861939F,因為沒有加引號而被視為數字。JavaScript 的 Number type 是浮點數,數字太大的時候會產生有效位問題,所以最後被 cast 成字串輸出的值是 0x3e4b00b607d0980668ca6e50201576b00000000,因為「長得和原本的值太像,沒人發現」(他們自己講的),結果就有 6600 ETH 轉帳變成空氣。
很多人都在說 JavaScript 現在沒很糟了,不過我是覺得如果一個程式語言無法了解整數浮點數字串是三個意義完全不同的概念,那它似乎不應該被拿來在工作上使用。
Women will never advance doing community work
雖然標題這樣下,但我覺得其實不只女性,這是社群一個很 general 的可怕矛盾。
- 如果社群領袖持續參與社群活動,就不可能在專業生涯進展
- 如果想在發展專業,就不可能密切參與社群活動
- 沒辦法在社群接觸真正的意見領袖;接觸過的人如果往上爬,你就再也看不到他了
這造成很多很弔詭的現象,例如很多在社群貢獻的人會被 underrecognised,像我們的主編 Vinta ㄉㄉ就應該要有更多人認識才對 我這樣會不會太狗腿;因為知名度不夠,沒辦法進入主流視野,就拿不到該有的資源。另一方面社群即使再良心立意再好對成員多有用,即使成員一個一個成長,社群本身仍然會像垃圾接案公司一樣,永遠原地踏步——因為強者練完功就會離開,留下被他們吸進來的 junior。
搞社群一段時間的可能多少都有這類矛盾吧,像 PyCon Taiwan 最近幾年也是結婚的結婚生小孩的生小孩出國的出國開公司的開公司(對我就是在講你和你和你和你不要懷疑)。當然大家發展得這麼好作為朋友超開心的啊,但是也同時會在想這好像沒辦法成為永續的社群模式,實在令人擔心。這個問題很難看到立即的影響(跟全球暖化有點像),大概也不會有人關注這篇吧,點閱率大概會在本期墊底,不過還是希望有更多人能注意到這個現象,而不是哪天熱浪襲擊歐洲才開始動作。