程式設計週記[2016/01/15]: 改變台灣就在這週六,但是別忘了天天都要改變自己

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 明天(2016/01/16)就要舉行台灣的總統與立委選舉,大家別忘記投票. 下週要有Google Golang Gala也就是Golang的分散式駭客松.也就是可以在全世界各地舉行駭客松.這次希望能來的及寫完一些點子也來試試看. 大家有興趣也來參加看看.. 本週工作大部分都在看網路文章,還有玩一下Golang本身buildin的net UDP相關操作,希望能準備好一些東西下週參加比賽. Go Gopher Gala 01/22~01/24就要開始distributed hackathon,可以在任何地方參加.大家一起來參加.唯一的限制就是必須要使用Golang Difference Erlang and Golang concurrency 有人詢問關於Erlang與Golang在Concurrency上面處理的不同,有人就回答如果就Programming Model上來說: Elixir/Erlang 就像是Goroutine/Go.不同的是Goroutine是system thread而Elixir是Main Entity.所以如果你產生了一個Elixir,你會拿到PID. 但是Go特有Channel可以讓不同processese間的溝通更加透明化. 有興趣想要學習Erlang的Go Programmer,可以看這裡 Elixir concepts for Go developers lukasmartinelli/pipecat: Connect UNIX pipes and message queues 這個套件提供透過UNIX pipes的指令來處理message queues(AMQP). # Publish sequence of numbers to a job queue. seq 1 1000 | pipecat publish numbers # Multiply each number with 10 and store results in a different queue. pipecat consume numbers --autoack | xargs -n 1 expr 10 '*' | pipecat publish results # Aggregate the results and calculate the sum pipecat consume results --autoack --non-blocking \ | python -cu 'import sys; print(sum(map(int, sys.stdin)))' Writing AWS Lambda Functions in Go AWS Lambda是Amazone 開放的一個Service可以讓用戶上傳自己的程式或是服務.讓該程式會在Scale的時候自動執行. 那麼想要在AWS Lambda上使用Go? 雖然官方還沒有開放正式的方式來使用.這篇文章透過cross compiling的方式來將Go編譯成Linux Library的方式來透過node.JS或是Python來使用. CSharp #### Sony Computer Entertainment, Worldwide Studios:Open source software for game development Sony Worldwide 遊戲部門也是有Open Source project on Github.都是C# projects裡面有幾個很酷的:...
繼續閱讀

[Docker] 拆解我的網路服務

前言: 講了Docker半天,這一篇主要是記錄一下我把在用的一些Web Service全部放進Docker的紀錄,順便看看有沒有什麼地雷怕踩到的. 其實將自己的服務全部轉成Dockerize Services最重要的重點就是要能夠清楚了解--link的作用. 原先架構 稍微解釋一下原先架構: Go RPC: 主要處理接受一些API,連接MySQL MySQL: 主要的資料乘載 PHP: 裡面有數個Web Services,主要也是連接PHP 先從MySQL資料庫開始 資料庫沒有太多困難,由於可能會有資料庫的版本不同,所以做法會是: 啟動 MySQL Docker Container (版本自選或是最新) 導入資料庫SQL (空白或是有資料) docker run --name my-db -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql 這是一個基本的啟動最新版MySQL的Docker指令,其中也預設了root密碼. 可以使用-p 3306:3306來開放port出來給其他server連接.不過由於我們要使用--link,所以我們不需要用到export port來用.等等透過Go RPC Server來使用, 整合Go RPC Server 這邊其實不討論怎麼build go binary,而是假設你已經有個在ubuntu上面compile好的binary. docker run -p 8088:8088 --link my-db -it -v $BiaryADD:/rpc ubuntu /rpc/go-rpc-server 這一段程式碼會去執行ubuntu基本的image,主要是透過/rpc/go-rpc-server來執行已經build好的Go RPC Server binary. 開始串連各個microservixes,必須搞懂--link 如果你要用--link my-db在新的container上的話,那麼你的Go DB Connection 應該要類似以下的Go: sql.Open("mysql", "root:PW@my-db/DB_NAME") 重點就是你要把你要連接的target連到my-db而不是localhost.(因為container的localhost會是在docker裡面,而不是那台機器本身) 根據link的docker spec有提到,其實link就是做了兩件事情: 更新 container ip 在 /etc/hosts 設定好系統參數 (讓你可以直接使用my-db) 整合PHP Web Server 這裡使用的是tumtumcloud/apache-php這個image.不過我有稍微修改,一併把外面PHP位置放進去. docker run -v /YOUR_PHP_ADD:/app --link my-db 透過這個方式,只要你的PHP設定是連接 $db['host']="my-db" 就可以了. 整在一起放在docker-compose吧 透過以上三個services,其實我們可以寫在同一個docker-compose.yaml然後一次啟動.檔案可能是類似以下的方式: go-app: build: ./rpc/. ports: - 8088:8088 volumes: - ./GO_RPC:/rpc links: - atc-db command: /rpc/run_rpc.sh web-app: build: ./apache-php/. volumes: - ./apache-php/php:/app links: - my-db ports: - 80:80 my-db: image: mysql volumes: - ./db/db_data:/var/lib/mysql env_file: db.env 稍微解釋一下,主要這邊有三個服務 go-app, web-app跟my-db.就像前面提到的一樣,只是把每個設定不論是link或是volumes或是env_file甚至是command都寫入了docker-compose.yaml.他就會依照相依關係來啟動個別microservices my-db DB services go-app Web Go RPC services web-app PHP Apache services 這樣大概就把整個有在使用的服務串接成三個container來使用.算是第一個階段完成,有更多的services等著要去dockerized.並且也可以考慮導入swarm來分開在不同的host上面.
繼續閱讀

[Go]取得實體網卡的IPv4網路遮罩(Get device network mask)

##前言 最近在研究一些Golang在UDP上的處理,主要是要抓取網路遮罩(network mask)做一些進階使用.就發現要取得正確的網路遮罩,其實是蠻困難的.由於是無法直接使用到裝置上面的網卡設定. 這邊介紹一下相關的流程: ###先來抓取IPv4 這邊先顯示抓取IP的方式: func GetIP() net.IP { ifaces, err := net.Interfaces() // handle err if err != nil { log.Println("No network:", err) return nil } for _, i := range ifaces { //只抓取網路卡名稱為"en0", "en1"... if strings.Contains(i.Name, "en") { addrs, err := i.Addrs() // handle err if err != nil { log.Println("No IP:", err) return nil } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: log.Println("IPNET") ip = v.IP case *net.IPAddr: log.Println("IPAddr") ip = v.IP } //這裡會抓取兩種IP,分別是IPv4與IPv6 if ip[0] == 0 { //第一個byte是0為IPv4 log.Println("Get device:", i.Name) return ip } } } } return nil } 透過這個方式可以列舉所有的網路卡並且把第一張具有IPv4資料的net.IP傳回來. ###再來找Network Mask 其實透過官方的API,原本就有一個IP.DefaultMask()的函式可以使用.不過抓來的Network Mask是透過計算而來的,而不是跟網卡拿的.透過以下的範例: package main import ( "fmt" "net" ) func main() { addr := net.ParseIP("192.168.1.1") mask := addr.DefaultMask() fmt.Printf("Address : %s \n Network : %s \n", addr.String(), mask) //Mask 255, 255, 255, 0 addr = net.ParseIP("172.16.110.123") mask = addr.DefaultMask() fmt.Printf("Address :...
繼續閱讀

程式設計週記[2016/01/08]: 再爛的政局也要去投票,再糟的架構也要寫測試

(image from twitter) 這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 本週想研究iOT傳輸協定中使用UDP的CoAP(Constrained Application Protocol),看了挺久的RFC還是沒有很了解.先寫一些簡單的應用來試著了解. iOS/MacOSX iOS崩溃调试的使用和技巧总结 如何來抓取iOS App crash log? 這裡有三個建議方式: 使用第三方的Crash log ( 這裡是講百度) 自己寫crash log然後上傳server XCode-Device裡面查看(如果機器在你那邊) 使用Apple Xcode自帶功能 Window->Organizer->Crashes Python 透過IDAPython 反組譯Python 一連有三部曲教學,主要是教導如何查看變數與斷點偵錯. Go mission-liao/dingo: An easy-to-use, distributed, extensible task/job queue framework for #golang ss rakyll/gom: A visual interface to work with runtime profiling data for Go 這是透過Golang自薦的profiling tool pprof來呈現的輕量化UI.當然Dave Cheney也寫了一個profile. davecheney/profile: A simple profiling support package for Go Dave Cheney寫得,將pprof簡單化的函式. mission-liao/dingo: An easy-to-use, distributed, extensible task/job queue framework for #golang 這個task/job queue library提供許多進階的功能: Two-way binding Distributed Task Framework Stateful Worker Functions dustin/go-humanize: Go Humans! (formatters for units to human friendly sizes) 算是一個helper,可以幫你把許多資料格式轉換的鄉黨的人性化.ex: humanize.Bytes(82854982) //83MB humanize.Time(someTimeInstance) //3 days from now pubnative/mysqldriver-go: GC optimized MySQL driver 原本的Go build-in的MySQL driver由於使用到太多的heap會造成GC頻繁的產生,而這個是 GC optimized 過的 Golang MySQL driver,大量減少heap的產生,進而減少GC的發生次數.讓系統效能能夠更好. Heap size與Heap的使用率是GC發生的基本參數(參考這篇Go GC: Latency Problem Solved).雖然透過GOGC可以調整heap的數量(GOGC越高heap上限變得更高,但是記憶體更消耗.反之記憶體比較低,但是GC會很常發生.) 網路文章 区块链:比特币的灵魂,下一个风口 Block Chain一直就是Bitcoin最值錢的部分,慢慢的許多應用也會浮出來.最近比較紅的就是有人將Block Chain跟Application結合在一起,可以透過BitProof裡面的Block Chain來證明你就是該應用程式的創始人.這邊有更詳細的說明文章.當然也有IBM想透過Block Chain來達到Smart Contract的功能. “【簡報】《Final Fantasy Record Keeper》開發實務暨產品架構經驗分享” 由專業的電玩部落客”吹著魔笛的浮士德“介紹,有完整的中日文對整解釋.. 以下為簡單的心得: FFRK的架構為WebView +...
繼續閱讀

程式設計週記[2015/12/31]: The year of Go

這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 由於週五剛好是元旦,這個禮拜只有四天.剛好上週拿到了來自拍賣的Eddystone Beacon,就先玩了一下也順便把Eddystone Beacon Scanner寫好. 2016即將來臨,應該要給自己一些不同的期許與挑戰. iOS/MacOSX Flickr’s experience with iOS 9 Flickr在iOS9上的經驗談,想要用”Spotlight Search”, “Universal Links”, “Deep linking into the app” 跟”3D Touch”一定要仔細閱讀這一篇. Python python-cn/slack_bot: 立志成为一个可被调戏的Bot 這是一個Python Slack Bot的套件,從小黄鸡改過來.大部分資料都是從人人網過來,有電影資訊,美食資訊,地理資訊.新聞轉貼. djacobs/PyAPNs: Python library for interacting with the Apple Push Notification service (APNs) 透過Python來使用APNS(Apple Push Notification Services) Setting Up Sublime Text 3 for Full Stack Python Development 介紹不少好用的Sublime Text 3的package,透過這些package可以讓Sublime Text馬上變身成全端工程師的開發利器. 蠻基本的漣漪開始怎麼安裝Package Management都有教. Ruby Portus:CLAIM CONTROL OF YOUR DOCKER IMAGES 不想要使用公開的Docker Hub? 想要使用私有的Docker Registry.但是又怕無法有良好的權限控管與被人家修改你的Docker Registry? Suse提供一個良好的機制來管理,並且連網頁介面都有了. Go chai2010/tensorflow: tensorflow for Go tensorflow 的Golang wrapper dobyrch/termboy-go: Another Game Boy emulator for your terminal 可以在terminal上面玩GBA. 恩.. 你沒有看錯.. 是terminal不過可惜的是只有Linux可以用,還不支援Mac OSX.底層透過他自己寫的terminal display library: libtermboy與參考gba模擬器.另外一個terminal display library可以參考termUI,他是跨平台. “Handwritten Parsers & Lexers in Go” 這篇教學文章,首先先教導了在Parser裡面的一些基本概念,不論是Lexer或是AST.最後在教導如何寫出自己的Lexer跟Parser. 挺好的文章.簡單概念整理一下: 範例 SELECT * from Mytable 就是一個句子,如何把他掃成有意義的內容變成AST(Abstract Syntax Tree) 類似 Fileds []string 跟 table string. 首先要把句子透過Lexer Analysis也就是一個一個字掃描.並且將你需要的部份放入該AST裡面. Java/Android wasabeef/awesome-android-ui: A curated list of awesome Android UI/UX libraries 有著所有的Android UI Opensource List,並且還有圖片顯示.可以快速幫助你找到需要的library來用. Android Open Source...
繼續閱讀

程式設計週記[2015/12/25]: 聽說Swift很好玩.. 連我都忍不住想再學一次

某人的寶貝女兒設定檔 (Daughter YAML refer from Ansible) (pic from: https://twitter.com/chrisnuber/status/679069190377066497) 這是什麼? 程式週記主要內容如下: Gihub project 介紹: 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢 網路文章心得: 會寫些心得,強迫自己閱讀. “程式週記”並且定期週期性更新. 本週摘要 Go 出了1.6 beta 1,讓大家在聖誕節感受到HTTP/2的威力.Swift持續在熱頭上,到處都是Swift的討論文章.程式語言的討論第一名也不是開玩笑的.本週開始想一些演算法與現實社會的應用,希望可以把之前寫過的專案來想想有沒有實作可以弄. iOS/MacOSX facebook/AsyncDisplayKit: Smooth asynchronous user interfaces for iOS apps. Facebook 出的可以讓你的App順暢的讀取一些遠端(或是比較需要時間的資料).由於是非同步,讀取到資料後會再回頭更新UI. Python 理解python中的装饰器(decorators) 介紹什麼是Python decorators與怎麼使用它,可以看看原文. An AI That Can Mimic Any Artist” 想不到機器學習引擎TensorFlow可以拿來做圖片的濾鏡效果.(內有Python Github) Go NYTimes/gizmo:A Microservice Toolkit from The New York Times gizmo 是什麼? gizmo是一個類似go-kit的微型服務的工具包.這一篇文章有解釋為何紐約時報需要建立自己的microservices的toolkit而不是使用go-kit. 稍微解釋一下go-kit,他提供了許多的小工具不論是斷路器(Circuit breaker)還是Rate limiter. 可以幫助你建立與管理Microserivces. “PHP7+Swoole比Nginx/Golang性能高75%” 測試方式挺受爭議,不過可以看看結果. RobotsAndPencils/buford: A push notification delivery engine for the new HTTP/2 APNS service. Go 1.6 beta 1 剛放上了 HTTP/2 馬上有人寫出搭配Apple更新的APNS services. RobotsAndPencils/marvin: Slack bot written in Go 用Go寫出的Slat bot,主要功能是列出Github上面的所有issue跟相關進度.如果用github來做專案管理或是開源專案的一定不要放過.還提供Heroku Deploy. ory-am/hydra: Run your own AWS-like identity & access management (IAM) service in less than 2 minutes. Written in Go. Backed by PostgreSQL. Built cloud native. 一個套件可以幫助你快速的建置出類似AWS的Identy & Access Services(IAM).資料庫使用PostgresSQL. 這是一個遠遠比起AWS IAM更輕量的服務,而且可以快速地部署出去.可以管理帳號與權限控管.對於網路服務提供商(SaaS or API Services provider)有著相當好的切入點. Java GovernmentCommunicationsHeadquarters/Gaffer: A large-scale graph database Gaffer是用Java寫出來的大型圖學資料庫(Graph Database),可用來分析不同資料之間的內部關係,相較於圖學處理系統(Graph Processing System),Gaffer特別優化了在特定節點上的資料檢索能力。使用者可以將資料整批上傳或是持續地將資料匯入,這個軟體有能力識別出大批電話記錄中的一組通話者是誰,或針對單一對象進行資料蒐集與分析,也可以透過API來進一步檢索或篩選出所需的資料。(摘自: IThome) A-Frame: Building blocks for the virtual reality web Mozilla出的framework,主要針對WebGL跟WebVR的部分.可以讓你的網站在瀏覽器上馬上看到3D效果(當然是指Firefox). SECCON...
繼續閱讀