程式設計週記[2017/02/10]: 雞年要開始努力了

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

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

網路文章心得:

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

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

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

本週摘要

過年的時候帶了家人去峇里島旅遊,事隔上次全家人出國也過了二十年了.家人永遠都是最重要的.



Go

travisjeffery/jocko: Kafka implemented in Golang with built-in coordination (No ZK dep, single binary install)

透過 Golang 將 Kafka 做出類似的功能.不需要依賴 ZooKeeper 並且是 single binary.

Go vs. Swift: The Languages of The Modern Tech Giants

一份文件比對 Swift 與 Golang 在各個方面的比較.

My Go Resolutions for 2017

Golang 大神 Russ Cox 把他 2017 的目標訂立出來,有不少的項目,其中有一個就是 Package Management.令人期待

golang/dep: Go dependency tool

golang/dep Google 官方的 #golang dependency tool ,會不會之後整合進去呢?可以好好觀察看看

講解 #Golang 的 selectors ,淺顯易懂

講解 Golang 的 selectors ,淺顯易懂



Python



Android/JAVA/NODE.JS/Scala



Docker



Kubernetes



iOS/Swift



其他程式語言



論文收集



網站文章

[若渴計畫] Studying Concurrency

關於 concurrency 的學習整理文章,很值得好好深讀.

RethinkDB: why we failed

RethinkDB 在去年的十月宣布要關閉,那時候就說會找個時間來把失敗的原因檢討一下. 現在這份檢討報告出來了,來看看身為 DBAAS (Database As A Service) 公司創業失敗的檢討報告.



Machine Learning

CS565500 Large-Scale Machine Learning

清大課程學 Machine Learning 聽說老師也太有型了,講中文的課程,使用 python

https://cloud.google.com/blog/big-data/2017/01/learn-tensorflow-and-deep-learning-without-a-phd

用一系列的課程來教導你如何使用 Tensorflow 就算你不是 Data Scientist 的 Phd.

Google Data Engineer 的認證: Google Certified Professional (Beta)

GCP 認證的 Data Engineer

arxiv: Outrageously Large Neural Networks: The Sparsely-Gated Mixture-of-Experts Layer

Geoffrey Hinton 和 Jeff Dean 的神作,類神經網路取得 1000 倍以上的 model capacity 大躍進。

Scaling of Cloud Applications Using Machine Learning

講解 VMWare 如何使用 ML 來做 Web App Scaling.



有聲書/影片心得





程式設計週記[2017/01/20]: 我也只有毅力這個優點

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

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

網路文章心得:

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

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

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

本週摘要

本週是認真做事週,可以好好的把許多事情規劃並且處理一下.也更有時間可以把過去一些東西拿回來學學. 把 MOOC 繳費開始要學習,並且也要認真學習看一些機器學習的論文,看不懂就可以跟強者同事們討論看看.



Go

xtaci/kcptun: A Simple UDP Tunnel Based On KCP

kcptun 是一個透過 KCP (A Fast and Reliable ARQ Protocol) 來達成的 tunnel 的方式.

會注意到這個專案是因為以前的公司曾經為了 firewall penetration 而使用 UDT ( http://udt.sourceforge.net/ ) .但是 UDT 這個專案已經多年沒人維護,並且支援的程式語言相當的少 (C++) 要跟其他語言來結合就很麻煩.

快速整理: 在做 firewall penetration 由於封包特性,不使用 ICE protocol 下,最簡單方式就是將 TCP 封包改成 UDP 來做到資料傳遞到 stub. 但是 UDP 又沒有 TCP 的相關優點,所以有 UDT 這個將 TCP 的機制做在 UDP protocol 上面的專案.

KCP 看起來有不少優點: (https://github.com/skywind3000/kcp)

  • 支援語言比較多 (Go, C#, Lua…)
  • 沒有修改 socket 部分,完全透過演算法來用 (所以封包會大 10~20%)
  • Header file 24 byte include control and data sync
  • 近幾個月都還有在維護

UDT 比較麻煩點: (http://udt.sourceforge.net/)

  • 只有 C++
  • 一套完整的 UDP 解決方式,但是有不少雷可以踩
  • Header file 16 byte, separate control and data sync

KCP 畢竟是強國人開發,中文文件不少可能是一個優點.

相關鏈結:

Ross Cox:My Go Resolutions for 2017



Python



Android/JAVA/NODE.JS/Scala

Building the TensorFlow android example app on Mac OS

讓 Tensorflow 跑在你的 Android 手機上面直接做 prediction .透過這樣的方式,就算你沒有網路也能讓手機跑已經學習好的機器學習模型.

不過這個範例需要的手機配備還蠻高規的,



Docker



Kubernetes



iOS/Swift



其他程式語言



論文收集



網站文章

AirBnB original deck in 2008

原本 AirBnB 在 2008 年的 pitch

The Infrastructure Behind Twitter: Scale

Twitter 在 2017 新的一年談到

另外可以看看 Uber Scale 的方式

RUNNING ONLINE SERVICES AT RIOT: PART II

Riot Game 介紹了他們的 Container Orchestration 架構 rcluster 是主要透過 Go 來完成的 ADMIRAL 來寫自己的 Resource Scheduler . 文章是寫在兩個月前,而這個系統其實是在目前的接近一年前開始探討與開發,當然他們也是有觀察過其他架構的:

  • Mesos + Marathon (後來的 DCOS )
    • 不容易架設
    • 不支援 Container Group
    • 當時尚未支援 Docker Container ( Mesos 一開始只支援自己的 Container 架構)
  • Kubernetes (一開始的 LMCTFY )
    • 當時還沒有 Constraint
    • 之後有支援各種 constraint 或是 node select 甚至是之後的 1.5 要支援的 Taint
  • Fleet
    • 剛剛才 Open Source ,還不夠成熟
    • 比較適合建置系統服務,而不像是給一般應用程式部署而用.

所以他們在半年前建置了自己的 Resource Scheduler (Admiral) 結合了 Docker Container 的概念與 Mesos Constraint 的概念來建置,讓整個系統其實很像… 目前的 DCOS (笑) .

最後的結論也提到,他們正在思考將 Admiral 慢慢轉移到 DCOS 上面來處理.



Machine Learning

谷歌云首席科学家李飞飞:人工智能 极客公园 2017 年 大会演讲

新智元:2016年全球AI巨头开源深度学习库Top 50

Gigaom对话吴恩达:迁移学习是未来五年的重要研究方向

Andrew Ng 談到他在百度的相關工作內容,並且提到 Transfer Learning 與 Multi-Tasking Learning 將會是未來 AI 的趨勢.

Multi-task learning(多任务学习)简介

創造AlphaGo的台灣「土博士」,他們眼中的黃士傑

黃博士的故事,這篇專注在他進到 DeepMind 之前的事情

A guideline from Google - Best Practices for ML Engineering from Google [pdf]



有聲書/影片心得

ATP 205: PEOPLE DON’T USE THE WEIRD PARTS

最近剛離開 Apple 到 Tesla 的 Chris Lattner 接受 ATP (ACCIDENTAL TECH PODCAST) 的邀請來談談 LLVM 跟其他相關科技. 記錄一下一些重點摘錄:

  • 關於職涯轉換:
    • 當然有談一下關於 Apple 跟 Tesla 在職業生涯上面的轉換. 對於 Chris Lattner 從工程師到管理階層的轉換,他自嘲不是一個所謂的 People person 但是他喜歡這方面的轉換.
  • 有討論到 Apple 對於 Objective C 想要改善的想法,一直到了 ARC 甚至談到了 Swift 誕生的起因.
  • 關於 Swift 的開源 (Open Source):
    • Lattner 提到原本在他心中就覺得會發生,但是礙於公司政策無法來運作.
    • 其實從一開始的 Commit 到相關工具的開發,都有顯示出來 Lattner 是從 Open Source 的角色來思考.
    • 但是 Swift 2 Open Source 後, 公司無法規劃到說會得到那麼多的回饋.

其實有更多的部分,對於 LLVM GC 有興趣的人都很歡迎好好聽聽.整段訪問有兩個多小時.

從 HN 找到一些,關於 Chris Lattner 的八卦:

備註一下: Chris Lattner 是 LLVM 跟 Swift 的發明者跟主要維護人.

參考:



Meetup

GDG#32 《Tensor What? AI and Mobile - 行動應用與人工智慧》

昨天晚上 GDG Tensorflow on Android 的投影片:

影片

心得:

雖然前一天已經把範例跑過了(需要 Nexus 5 以上手機) 但是這次演講對於 Machine Learning 由淺入深並且很有趣的介紹.



[Coursera] Illinois: Cloud Computing Concept Part 1 : Week 3

課程鏈結: 這裡

學習鏈結:

課程內容:

這裡先簡單的介紹整系列的課程內容,希望能讓大家了解這個課程想做什麼.

這整堂課主要是圍繞著 Cloud Computing 經常會使用到的技術與相關的概念. 整堂課其實只有一個程式語言作業:

	使用 C++ 寫 Gossip Protocol

雖然課程裡面程式語言的作業不多,但是整體上的內容還算不少. 除了有談到一些雲端技術的基本概念:

  • Map Reduce
  • Multicasting and Gossip Protocol
  • P2P Protocol and System
  • K/V DB, NOSQL, and Cassandra (畢竟都談了 Gossip)
  • Consensus Algorithm - Paxos, FLP Proof

其實課程內容很有料,也可以學到很多的東西.

前提:

最近決定要把這堂課學完,於是付錢並且開始從 week3 繼續我的學習進度.

Week3 卡住相當久,由於裡面有許多東西需要好好的計算.往往就很難靜得下心來算.加上內容相當充實,介紹了許多種 P2P 軟體的運作方式,不僅僅有 Napster 還有 Bittorent 的運作方式,更有 Gnutella 與具有 Consistent Hashing 架構的 Chord

Week3 P2P (Peer-To-Peer) System

這一週主要講到 P2P (Peer To Peer) 不僅僅有提到基本的概論外,也有將各種 P2P 軟體的傳輸方式做一個簡單的整理.

Napster

伺服器不存檔案,但是存每個節點的資料與檔案清單.並且也存放節點網路狀況.

  • Server maintain <file, ip_address> tuple
  • How client search:
    • Send key word to server
    • Server search tuple list, return ip list
    • Client ping each node to find transfer rate.
    • Client fetch file from best host.
  • Using TCP

Problem:

  • Centralize server
  • Server cannot fixed SPOF
  • No security (plaintext)

Gnutella

下一代的 Napster ,主要針對 Napster 集中式伺服器的問題來解決.Client act as server call Servents

Gnutella 有五種訊息種類:

  • Query (Search)
  • QueryHit (Reponse for Search)
  • Ping (Hearbit)
  • Pong (Response for Heartbit)
  • Push (Init for transfer)

Message Format:

  • Descriptor ID
  • Payload Descriptor (Messavge Type)
  • TTL (Time To Life)
  • Hops (Increase by each node (hop) )
  • Payload Length

P.S.:

  • TTL only use for QueryHit to provide distance of overlay network.
  • 透過 HTTP 傳遞檔案
  • 具有 Reverse-Routed 功能的只有 QueryHit ,因為他是回應 Query 的答案,需要具有回傳的的功能.

避免過多的 Query 流量

  • 每個節點記住傳過的清單
  • 每個節點只會轉達 “一次” 相同來源的 Query
  • 重複的 Qeury 會被 drop

Problem:

  • 太多的 Ping/Pong 網路流量.(約莫 50%)
    • 解法: 透過 cache 解決 heartbit 流量.

Fasttrack and Bittorent

Fasttrack 的特點

  • 混合 Gnutella 與 Napster 的優點
  • 某些節點( node )會變成 Supernode 也就是可以作為目錄的節點.

Bittorent

流程:

  • 下載 .torrent 檔案
  • 讀取裡面所有的 tracker (所謂的 tracker 就是管理所有 peer 的清單的伺服器)
  • 分別到 tracker 去下載相關的 peer 清單
  • 跟每一個 peer 去要求下載自己所需要的 block

選取檔案策略

  • 採取 Local Rarest First 也就是會先找重複性最少的 block 來下載
  • 如此一來可以增加檔案的健康度

Chord

效能比對

  Memory Lookup Latency Message for lookup
Napster O(1) O(1) O(1)
Gnutella O(n) O(n) O(n)
Chord O(log(n)) O(log(n)) O(log(n))

What is Chord

  • A DHT (Destributed Hash Table)
  • Using consistent hashing

Finger Table 計算方式

根據上圖

  • 如果 m = 7
  • 那麼如果要找出 N80 的 ft(finger table of N80 ) 就會是:
    • 80 + \(2^0\) = 80+ 1 = 81 > 80 –> 96
    • 80 + \(2^1\) = 80+ 2 = 82 > 80 –> 96
    • 80 + \(2^2\) = 80+ 4 = 84 > 80 –> 96
    • 80 + \(2^3\) = 80+ 8 = 88 > 80 –> 96
    • 80 + \(2^4\) = 80+ 16 = 96 = 96 –> 96
    • 80 + \(2^5\) = 80+ 32 = 112 > 96 –> 112
    • 80 + \(2^6\) = 80+ 64 = 144 mod 128 = 16 = 16 –> 16

How to handle Chord Failure?

尋找繼承者節點 (successor)
  • N32
    • successor N45
    • presuccessor N16
  • N112
    • successor N16
    • presuccessor N96
備份方式:

通常會有 r 份備份 \(r = 2 log(N)\)

新增節點

如果增加新節點 N40 在 N32 與 N45 之間,那麼有經過這兩個的上的 FT (並不是代表這兩個節點..) 就需要重新計算.

Pastry

特色

  • 相當類似 Chord 使用consistent hashing table
  • 每個葉節點 (Leaf Node) 會知道自己前一個( Predecessor ) 葉節點跟後一個( Successor )葉節點
  • Routing Table 採取 Prefix Matching
    • 時間複雜度就是 \(log(N)\)
    • 由第一個位元開始比對,相同 prefix 最多的就是 “best next-hop”

ex:

10110110111

的 best next-hop 就是 101101101”0”1

程式設計週記[2017/01/13]: 他人看來的成功或失敗都是一時的,只要不認輸都不是失敗

這是什麼?

程式週記主要內容如下:

Gihub project 介紹:

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

網路文章心得:

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

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

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

本週摘要

真是一個瘋狂的禮拜,每天都是滿滿的會議.見識了很多特別的人,也了解了許多商場上的策略.很開心能有這樣的機會了解與參與公司在擴張與尋找合作夥伴的機會.

在學習上,也開始能夠參加公司內部 Macine Learning 的讀書會. 希望能花上更多時間來好好學習.



Go

uber/cherami-server: Distributed, scalable, durable, and highly available message queue system.

Uber 將他們的 Task Queue - Cherami 開源. 原本 Uber 是使用 Celery (Python) 作為他們的 task queue . 由於業務的增加,對於 HA 的需求增加,於是用 #Golang 重寫成過,

並且與 Uber 許多好用的套件 TChannel (管 RPC) 與 RingPop (負責 Health Checking 與 Membership ) 結合在一起.

成為一個具有 Distributed, scalable, durable, 跟 highly available 的 task/message queue 系統

說明的部落格在這裡

Goroutine leak

Goroutine leak #golang 這篇文章敘述了再使用 goroutine 的時候經常呼叫了卻沒有跑完而造成 memory leak

Go 1.8 development stats

Golang 二月將要發行的 1.8 目前開發的狀況!!

Go 1.8 Performance improvements on ARM (RasPi)

有人在 reddit 上面丟出 #Golang 1.8 針對 RPI (Raspberry Pi) 跟 1.7.4 來比較,平均效能能高出一倍左右.

Dataman-Cloud/swan: A Distributed, Highly Available Mesos Scheduler, Inspired by the design of Google Borg

Swan 是一個用 Golang 寫出的 mesos 資源管理器套件. 參考了 Borg 裡面的精神.

作者並且在 Reddit 上面寫了兩篇來介紹了如何透過 Golang 來寫另外一套類似 Mesos 的資料管理器,文章不僅僅有介紹了身為”資源管理器”所需要的功能與面向,也介紹了該如何透過 Golang 來實作 Mesos 資料管理器.

主要推廣的 Golang Package Dataman-Cloud/swan: github.com/Dataman-Cloud/swan

教學文章整理:



Python



Android/JAVA/NODE.JS/Scala

Cassandra backup script on linux system

Use nodetool to backup cassandra DB.



Docker



Kubernetes

kubernetes-incubator/kompose: Tool to move from docker-compose to Kubernetes

幫你把 Docker-Compose 的機制放到 Kubernetes 上面,更容易來部署 Kubernetes 的 Pods .



iOS/Swift



其他程式語言



論文收集

Apache Hadoop YARN: Yet another resource negotiator

Morning Paper 是一個會每天讀一篇論文,然後幫你寫導讀跟介紹的網站. 裡面論文的精彩程度是每個做軟體工程師不可不讀的.

之前一系列的 Deep Learning 之後,作者準備要來好好讀讀分散式系統了. 所選的第一篇論文就是這篇 Hadoop YARN 的論文.

YARN 是從 Hadoop 2.0 之後從 Hadoop 中抽出來的架構.本篇論文裡面的 YARN 還無法解決 SPOF . (Hadoop 2.4 之後有支援 HA)

本篇論文也有討論到底 Mesos 跟 YARN 有什麼差異:

Mesos -> Offer-based approach YARN -> Request-based approach

同場加映:

有沒有辦法把 Mesos 跟 Hadoop YARN 一起用呢? 可以看看這篇文章



網站文章

资本寒冬,你真的懂怎么裁员吗?

對照 H 公司,這篇文章真的很有趣

各大互联网公司架构演进之路汇总

將中國大陸的比較大的互聯網架構演進文章都收集得好好的.



Machine Learning



有聲書/影片心得





[TIL][心得] K-MC2: Approximate K-Means++ in Sublinear Time

前提

每週五是我們公司的資料科學家讀書會時間,常常這類時間我可能都會在外面跟客戶開會無法參加. 但是這個禮拜總算把時間空出來參加,還好聽得懂內容跟為何要這麼做,所以相當的開心.

本週分享的是 Clustering 中的 K-Means , K-Means++ 與 \(K-MC^2\) 也就是有名的文章 K-MC2: Approximate K-Means++ in Sublinear Time

其中 K-MC2 : K-Means++ with Markov chain Monte Carlo.

簡單筆記

  • Fast and Provably Good Seeding for means
    • K-mean
      • 計算 k-gram 之間距離
      • 如果以三角形來說 tri-gram
      • 透過”三角不等式”
        • 第三邊不小於 1 - 2
        • 第三邊不能大於 1+ 2
      • 透過這樣來限縮第三邊的範圍可以加速 k-means 運算
    • K-mean++
      • 解決 k-mean 容易因為初始值導致 clustering 效果不佳
      • 透過修正取點的方式(比較遠的比較容易被取到) 透過機率性的方式
      • 取點只做第一次,後面還是使用 k-mean 來計算
    • MCMC Samling (K-MC2)
      • 在做 clustering 中心點取樣的時候
      • 透過取樣後 clustering 中心點,然後來分群
      • 透過 Markov Chain
      • [優點]
        • 以往做 K-mean 挑點,需要 k * m
        • 透過這個方式可以不在需要把每個點都走過挑選

思考脈絡與筆記

  • K-Means
    • 優點:
      • 分群效能快,取樣隨便取.
    • 缺點:
      • 精準度不足,當一開始的取樣點不好的時候.需要不斷重新取樣來重新計算.
  • K-Means++
    • 優點(解決 K-Means 問題):
      • 分群精准度好
    • 缺點:
      • 取樣的時間複雜度變高.試著每次取樣比較遠的點.
  • K-MC2
    • 優點(解決 K-Means++ 問題):
      • 分群精準度好之外,也減少了取樣的複雜度.
    • 缺點:
      • 需要Markov Chain length 超過一定比例的 m
      • 你的精準度,就會達到 K-Means++

圖表

  K-Means K-Means++ K-MC2
取樣效率
精準度 當初取點錯誤,精準度就差 解決取點精準度問題,但是構成取點效率差 當 MCMC 長度 m 夠大的時候,精準度就跟 K-Means++ 一樣精準
取樣方式 隨機選 透過全部距離計算,高機率選取到比較遠的點 透過 MCMC 的方式,來解決 Sample 點是否要繼續來計算距離.某些機率下,不在繼續計算距離而直接移到下一個節點來計算距離.

代碼 github.com/obachem/kmc2 :

安裝

pip install numpy
pip install kmc2

不過… macOS 會報錯

kmc2.c:232:10: fatal error: 'numpy/arrayobject.h' file not found
    #include "numpy/arrayobject.h"
             ^
    1 error generated.
    error: command 'clang' failed with exit status 1
    

解決方式

解法

export CFLAGS="-I /usr/local/lib/python2.7/site-packages/numpy/core/include $CFLAGS"

範例

import kmc2
import numpy
X = numpy.random.random((3, 3))
seeding = kmc2.kmc2(X, 5)  # Run k-MC2 with k=5

參考資料:

[TIL] Kubernetes Anywhere, 1.5 and Beyond 影片導讀

前提

2016/12 底由 CoreOS 主辦的 TECTONIC 2016 Summit 裡面有將 Kubernetes 1.5 做了一整個清楚的說明. Kubernetes 1.5 (與未來) 針對了大家一直以來的痛點做了很多的改進,並且用很生動的範例來解釋如何使用.相當推薦的好影片,以下快速整理一下:

簡化安裝流程: (KubeAdm, KubeFed)

KubeAdm: 一直以來安裝 Kubernetes 一直都不是簡單的事情 (與 Docker Swarm 與 DCOS 比較起來) .當然 Google 找出了解決方式,就是 KubeAdm ( 跟 Docker Swarm 一樣的使用方式)

個人有使用過 KubeAdm ,真的使用起來就像 Docker Swarm Mode 一樣簡單.就是 init 之後,其他就透過 join 來加入就好.

KubeFed: 就是 Kubernets 解決多個集群的問題.

支援更複雜的排程: (Taint, Toleration, Forgiveness 目前都還沒完成)

  • Taint/Toleration (issue 25320) : 透過 Taint 標記每個節點的特性 (比如說機器具有 GPU),然後 Toleration 可以挑選具有 GPU 的機器 (反之,沒有透過 Toleration 的 Pod 無法分配到 Taint 上面. 相同的也可以設定使用者特定的 Pod 在特定幾台專屬用該使用者機器上. 細節在這裡

  • Forgiveness(issue 1574): 可以透過對於 pod 的 health check 判別是否 pod 已經出問題,如果出問題會移到另外的節點重啟.

  • Disruption Budget: 可以透過他來做 stateful server 的關閉與升級. 細節在這裡

  • Network Policy Object: 可以設定哪些 pod 可以跟哪些 pod 溝通,甚至可以規定到單向. 細節在這裡

如何更輕鬆地不少複雜的軟體服務?: (比如說成套的服務套件,或是有優先順序?)

HELM: The Kubernetes Package Manager : 就把它當成 Kubernetes apt-get,可以快速幫你安裝軟體.

投影片

在這裡