程式設計週記[2015/12/18]:大家都是秋生萬

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 幾經思考決定(好像只是之前偷懶),決定把之前的“工作上的一些雜事筆記“改一下名字,並且持續努力的改成每週更新. 碎念一下: 其實之前停止是因為在忙著上coursera,不過我發現我既然還是都會寫一些twitter就應該要繼續更新我的部落格. 論壇與研討會 Container Summit 2015 所有的投影片都開放下載,點選文件就可以了. 這裡有rojerchen寫的心得 另外有Smalltown Tech Blog兩篇(上)(下) 網路文章 Why did Google open-source their core machine learning algorithms?: 大家都知道,Google在幾個禮拜前開源了自己的機器學習引擎(TensorFlow),讓人很想不通為何他們會把他們有價值(大家認為的)部分開源. 作者認為,其實沒有人能夠跟Google一樣去應用他,因為資料無法跟Google一樣. 這也帶來作者的新思維,演算法與程式碼或許以後不再是企業的秘方(配方),反而是使用者資料才是. 湾区日报是如何运作的 透過slack與hubot來控制電子報的文章整理與發送.. Slackbots: Landscape, opportunities and risks 最近由於有看到灣區日報公佈他們跟slackbot溝通(也就是slack+hubot)的流程.不少人討論所謂的chatDevOp.這篇有詳細提到一些機會與危機. [隨筆] The Three Laws of TDD-從紅燈變綠燈的過程 TDD三大法則: (1)先依照需求與情境寫出測試程式 (2)不要增加其他項目 (3) 修復這個測試程式的的錯誤(寫程式主體).. iOS/MacOSX “Xcode 7 Bitcode的工作流程及安全性评估”: 很好的教學.. 來了解xcode7 新功能 Bitcode,雖然面向是由駭客的角度來看安全性考量.但是會有更深層的了解. IBM出的Swift Sandbox 架在Bluemix上面,這個Swift Online Playground相當有用.手上需要測試小程式我就會拿來用. Python aws-shell: An integrated shell for working with the AWS CLI. AWS 的auto-complete shell,可以幫助你自動拼字一些指令. littleq0903/gcloud-zsh-completion: Z Shell auto completion for Google Cloud SDK 同場加映Colin Su的另外一套Auto complete寫在GCE上面. [Top 10 Python libraries of 2015 Tryolabs Blog](http://blog.tryolabs.com/2015/12/15/top-10-python-libraries-of-2015/) 2015十大受歡迎的Python Libraries: 第一名果然是jupyter Jupyter Notebook好專案分享(1): Kalman and Bayesian Filters in Python Jupyter Notebook好專案分享(2): Notebooks for “Python for Signal Processing” book Go dockersh: 把每一個登入使用者放入一個docker container內管理,避免傷害整個系統. google/git-appraise: Distributed code review system for Git repos Google 的分散式Code review系統,不過還不是很了解要怎麼使用它. gernest/hot: Hot golang templates 一些HTML template,已經套好可以給html/template使用. 一些網站 阿里巴巴前端team 部落格 少見看到用git issue 寫部落格,聽說不少大陸大企業的部落格都改成Git issue.可能的好處是因為有comment可以跟讀者溝通. “團隊成長書單與學習資源”...
繼續閱讀

[Golang][BLE] Eddystone 初體驗(包含Beacon模擬器)

前言 今年(2015)的年中,Google發表了Beacon Platform,並且引入了Eddystone也就是新的Beacon資料格式.本篇整理包含了簡單的資料格式介紹,Beacon模擬器的尋找(我也寫了一個模擬器)與一些App去掃描Eddystone Beacon. 那麼來開始看Eddystone Eddystone 主要的資料單位是Frame,而主要有三種資料為: URL Frame: 用來顯示URL,裡面的資料會經過編碼. UID Frame: 用16 bytes來記錄一個唯一的識別碼,其中包含10 bytes的namespace跟6 bytes的instance TLM Frame: 這個Frame主要是拿來傳輸資料,主要是用於傳輸beacon的感知器資料(電池壽命,溫度,開機多久…). 啟動一個Eddystone Beacon Simulator (模擬Eddystone Beacon) 這邊有兩個語言推薦,不過主要都是支援Mac OS與Linux.大家可以看看自己決定要不要使用. Node.js - Eddystone beacon simulator Eddystone beacon simulator 如何跑的細節可以看接下來的教學. Golang - suapapa/go_eddystone https://github.com/suapapa/go_eddystone 執行: (Mac OSX) go get github.com/suapapa/go_eddystone go run $GOPATH/src/github.com/suapapa/go_eddystone/example/beacon.go Node.js Eddystone Simulator與簡單Node.js教學 這邊稍微紀錄一下關於Node.js的簡單教學.會需要用到Node.js主要是因為現在只有支援”Eddystone beacon simulator“這個模擬器,所以得來稍微跑一下Node.js,只要會安裝跟執行就好. 安裝npm 請愛用brew brew install npm npm 下載套件 其實npm的套件都是放在網路repository上,所以要裝任何套件只要 npm install 套件名稱 就可以,但是如果找不到索引,就可能要下載git後本地端安裝 npm install -l 執行Node.js 套件 安裝好套件後,就找到某個.js檔案(可能是自己寫,可能是放在examples) vu app.js 加入以下的程式碼 EB = require('eddystone-beacon'); EB.advertiseUrl('http://goo.gl/uagFfW'); 存檔後執行 node app.js 這樣就可以了.. 由於這個套件沒有網頁顯示.執行玩得直接拿Eddystone 的verifier來驗證. 如何驗證 Eddystone Beacon是否正確 (Eddystone Validator/Scanner) iOS 可以使用 Chome iOS 版本的 Today 只要進入 Today (iOS 下拉顯示”今天”),加入Chrome Extension. 就會搜尋實體網路 (Physical Web),可以搜尋到具有 URL Frame 的Eddystone Beacon. 如果要搜尋其他的Eddystone Beacon(UID Frame and TLM Frame_還是要使用專用軟體. Android 推薦App 這個App我覺得很好用,iBeacon & Eddystone Scanner. 推薦給大家,還可以查詢RSSI的強弱. Windows 請用Bluetooth Beacon Interactor (Bluetooth Beacon Interactor)是UAP,下載鏈結. 這裡有原始碼 相關專案 最後我把所有的Golang beacon simulator 整理成一個小專案,希望能幫助大家. https://github.com/kkdai/beacon [更新:12/30] 我也寫了一個Golang的Eddystone Beacon Scanner有興趣可以看看. 相關鏈結 Go for Eddystone translator Eddystone beacon simulator How to discover/verify...
繼續閱讀

[筆記] 一些新創產業的架構簡報收集

前言: 主要是記錄一下一個有趣的話題在gitter.im/CodeTengu/headquarters 請問有台灣有哪些 startup 寫過他們的系統架構, 使用哪些軟體、服務之類的嗎? 有點類似 stackshare.io 那樣把一些東西列出來? 整理: 以下為條列式紀錄: PyCon2013 Pinkoi by Mike http://taipei.python.org.tw/history/2012-11-29-pinkoi-startup-python-plone-cms-mike-marr 備註: 他們來 Taipei.py 分享後…(略)…就得到紅杉資本投資 AWS 2013 Amazon Cloud Kata AWS Cloud Kata Taipei: Getting to mvp 第45頁開始有Fandora用的架構跟服務 iCook slide LIVEHOUSE.in slide
繼續閱讀

[Golang] 來玩玩Golang的效能評估-Benchmark

##前言 在寫Project52的過程中,其實寫了不少的資料結構實作,或是寫了一些演算法的實作. 一直以來由於Golang內建了單元測試的工具,所以基本的go test都有跑. 不過最近由於有個小專案trigram人氣飆高,所以心血來潮來跑跑他的效能測試.發現效果不太好,於是本週的課題就是要來評估你的Go專案效能,並且讓他跑得更快. Go內建的效能評估 - Benchmark ###如何建立效能評估 首先要講回來,在Go裡面通常而言的習慣是我們會把一個相關的物件寫在同一個檔案.並且把相關的測試寫在obj_test.go裡面.舉例而言: 一個物件 skiplist 檔名為 skiplist.go 相關測試與效能評估會寫在 skiplist_test.go 那效能評估要怎麼寫,我拿個例子來看: func BenchmarkSliceInsert(b *testing.B) { var sl []uint32 b.ResetTimer() var i uint32 for i = 0; i < uint32(b.N); i++ { sl = append(sl, i) } } 這段代碼主要是來效能評估slice對於append的速度. ###如何跑效能評估 那麼要如何在Go上面跑效能評估呢? go test -bench=. 就可以看到類似的效果 BenchmarkSliceInsert-4 100000000 29.6 ns/op 不同資料結構間的效能評估 接下來放一些關於我在測試skiplist的數據,也能做些簡單的筆記: BenchmarkSliceInsert-4 100000000 29.6 ns/op BenchmarkSliceSearch-4 20000 81506 ns/op BenchmarkMapInsert-4 5000000 283 ns/op BenchmarkMapSearch-4 30000000 42.4 ns/op 這邊有些簡單的重點可以整理: 以資料結構插入而言: Slice 最快,Map 很慢 這也是很重要的slice是簡單的資料結構,雖然要iterator起來相當的繁瑣.(也很慢) 但是就資料的新增操作上,就快很多了. 如果要寫會一直變動的資料結構(或是很多複製與新增刪除的動作)就比較建議還是使用slice 以資料查詢而言: Map實在快多了 由於我測試流程裡面,slice是以找不到為範例.所以速度差異有點大.不過事實也是,Map的查詢真的快多了,所以如果要建立大量查詢的資料,其實很建議使用Map而不是使用Slice來管理你內部的資料存取. 小專案: 最後,我一樣放上我本週的專案.就是把上個禮拜的專案”trigram“的效能提升後,並且把他的切割格式增加兩個與四個.修改為Ngram 相關鏈結: 我的Golang Project 52文章 Golang- Package testing DFC: How to write benchmarks in Go
繼續閱讀

[Docker] 在Mac OSX上使用筆記

前言 自從之前把我的Macbook Air上面的空間加以清理之後.總算也空出了20~30G,可以好好的練習一下關於docker在swarm與其他在跨機器端的應用. 不過這裡稍微紀錄一些關於Mac上面使用docker的小筆記. 一些筆記 如何讓Docker Setting記錄在你所有的console 由於Docker在MacOSX 是使用VM的方式來架設,其實真正執行docker的機器是你Virtual Box裡面的Linux VM,所以去呼叫docker相關指令一般有兩個方式: 透過Docker Quickterminal來跑 另外一個也可以透過SSH的方式主要是鏈接ssh: 192.168.99.100:2376 帳號密碼是 docker/tcuser 不過這樣多少有些麻煩,有沒有可能讓我在我的console裡面(比如說iTerm2)裡面的每一個tab可以直接使用docker呢? 方法如下: (假設你是使用bash) 打開 ~/.bash_profile 加入這行 eval "$(docker-machine env default)" 這樣你的預設使用者都可以找到正確的docker socket並且直接使用docker指令 (ex: docker run, docker build …) 如何讓root 使用相同docker環境 一般而言,原本的docker指令是需要透過sudo docker XXXX來執行.但是你會發現這件事情在Mac OSX下面會出現問題. Cannot connect to the Docker daemon. Is the docker daemon running on this host? 一查才發現,上面設定的環境參數並沒有在root的環境變數裡面.而且docker-machine是找不到原先的設定(docker-machine預設會讀該使用者的docker socket),所以你不能像上面一樣使用docker-machine env來設定環境變數. 必須要依照以下的方式來設定(假設你root也是使用bash,如果不是可以使用chsh -s /usr/local/bin/bash root來變更: 先在你安裝docker的使用者下執行docker-machine env,可能會跑出類似以下的資料: export DOCKER_TLS_VERIFY="1" export DOCKER_HOST="tcp://192.168.99.100:2376" export DOCKER_CERT_PATH="/Users/USER/.docker/machine/machines/default" export DOCKER_MACHINE_NAME="default" 將以上的資料複製起來,編輯到root的.bash_profile.也就是執行sudo su 再來編輯 vi ~/.bash_profile 把以上設定放在裡面,並且儲存 呼叫sudo docker xxx 改成 sudo -i docker xxx 如此一來可以正常執行了.不過缺點是你只要用docker-machine 新增會刪除default的時候,就得重新設定.
繼續閱讀

[Golang] 學習Google Code Search 使用的Trigram Indexing

前言 一直以來,我有在追蹤許多優秀工程師的github(RD的臉書).其中尤其是dgryski. 因為他有許多有趣使用Golang來開發的演算法小專案,所以我也會一起學習一些演算法與特別的資料結構. 本週的課程是Trigram Indexing.一邊學習,一邊寫成小專案. 什麼是Trigram Indexing 直接打Trigram會找到一堆關於卦的資料.不過Trigram主要是由兩個字組合而成 Tri-gram 也就是三個字元(N-gram中的tri-gram). 其實Trigram很簡單,主要就是把一串文字透過三個三個來分組: 將所有字元改成小寫 把每個空白處理.這裡有些不太相同,不少人將空白作為分隔符號.而Google Code Search把空白當作其中字元放進去. 把字元做成trigram 如何做把一個單字做 Trigram 拆解 舉例: Search 變小寫 “search” 開始拆解,三個三個為一組 sea ear arc rch 如何在程式裡實作拆解trigram 其實在程式裡面實作拆解很簡單,只是重要的是要如何比對.因為如果你真的把"sea", "ear" …. 存成字串,比對又是相當的消耗時間.所以不論是Google還是一般人在做Trigram的時候都會這樣拆解. 講一個個字元換成ascii的uint32並且透過位移方式存放.舉例而言s := "abc"就變成 uint32(s[0]), uint32(s[1]), uint32(s[2])也就是 97, 98, 99.並且透過位移存放.97<<16 + 98<<8 + 99 = 6382179. 這樣比較的速度就會快的更多,也很適合儲存. var trigrams []uint32 //存放所有拆解好的trigram s := "abc" //要拆解的字 for i := 0; i <= len(s)-3; i++ { //透過將每個字元轉換成uint的方式,並且透過位移方式存放 t := uint(uint32(s[i])<<16 | uint32(s[i+1])<<8 | uint32(s[i+2])) trigrams = append(trigrams, t) } //最後結果 6382179 如何在Code Search中使用 這邊開始很建議打開Russ Cox關於Google Code Search的介紹文章,雖然主軸是Regex 不過是透過Trigram Indexing的方式. 如同前面提到的,由於這個是”Code Search” 所以空白本身相當的重要.也就必須要將空白當作一個字元來作為Trigram Indexing的來源. 請注意: 本文重點在於討論Trigram Indexing,所以原先在Google Code Search針對Regex處理的部分就不討論. 透過簡單例子來了解 比如說,我們現在要輸入搜尋的是以下三段文字: Google Code Search Google Code Project Hosting Google Web Search 處理空白與加上Trigram Indexing 接下來,讓我們真的來處理一些字串,這裡結果就會有點複雜,所以我們只拿第一段文字舉例: “Google Code Search”來做Trigram Indexing: "Goo", "oog", "ogl", "gle", "le_", "e_c", "_Co", "Cod", "ode", "e_S", "_Se", "Sea", "ear", "arc", "rch" 在每一個Trigram上加上Document ID Document ID就是你原本是第幾段文字(以這裡為例子),當然隨著文件變大,有可能是檔案或是磁碟代號. 這裡將以上的每個資料都加上 {1}. 將Trigram 文字轉成數字方便比對 就像之前提到,要一個個比對文字 “Goo”比對 “Goo” 其實在CPU上面是比較慢的.而且存放成文字也是比較佔空間.所以比較好的方式就是都轉成Ascii的方式: "Goo" = uint("G") uint("o") uint("o") =...
繼續閱讀