程式設計週記[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

Python

Go

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 2015 CTF精选:一道400分的Android APK逆向题.
    • 學一下如何逆向android.幾個流程快速紀錄一下:
      • 拿到APK後,使用dex2jar反組譯
      • 如此一來可以看到大部分的source code如果要Hack就必須要製造假的server來傳遞資料.
      • 由於溝通有AES加密,這個範例要加上了製造假的AES key
  • Youtube: 15 tricks to master Chrome Developer Tools Console
    • 前端相關的programming一直是我的罩門,尤其是JS跟jquery.只知道怎麼用卻沒有一個好方式來debug.這一篇教學可以直接使用Chrome Web Console來debug. 果真是前端深似海….

網路文章

  • IBM Focused on 3 Major Languages: Java, Node.js and Swift
    • Apple將Swift開源之後,就跟IBM合作.讓IBM將Swift使用在商業應用上.這是一個很棒的開始.
  • Semantic method naming
    • 這一篇主要是探討在method命名上的討論,主要的建議如下.
      • 少使用”Get”
      • 不要每個都加上”do”
      • 當是回傳boolean的時候,不一定要使用isXXX或是hasXXX當命名.
      • 根據物件來推導出你的method名稱.
        • 回過頭來Method跟Function的不同是什麼? Method 是物件(Object)可以執行的方法.而Function不綁訂於任何物件.
        • 所以,如果Message物件的Method不要使用sendMessage而直接使用send
      • 不要將命名套用在參數上.
        • 個人認為這段值得討論,因為objc 的method很長使用 initWithNib 或是 initWithFormat 由於objc第一個參數無法詳細定義名稱.這個可能要討論.
  • 推薦每個軟體工程師最具影響力的書籍
    • .每本都是經典, 推薦給大家. 也記得要有空拿出來複習一下…
  • “为什么有些大公司技术弱爆了?”
    • 來自知乎的整理,裡面有著初生之犢與職場老將的對話.充分顯示出軟體工程上理想與現實的天人交戰.
    • 在職場工作十多年後,真的能夠瞭解一個在持續出貨與營利的公司是很難有著”完美”的軟體建置.不過並不是代表建置有問題,是因為每一個流程,每一段程式碼都有著他的故事.不論是已經出貨在舊的機器(或是產品)導致無法修改,或是其實有許多過渡性的問題.
    • 蠻建議大家看看.. 工作有一定資歷的一定都心有戚戚焉
  • Algorithms in the Real World: Host Matching
    • 大家都說演算法,但是卻很少在現實生活中會用到.作者透過協辦聚會所衍生出來的遊客住宿問題.(主辦方提供當地願意提供住宿的民眾登記類似沙發衝浪機制,而提供住宿的人可以獲得協會贈與的充氣床墊一個)
    • 由於需要住宿的人有他的需求,提供房間的人有他的條件.兩者的配對就成了兩兩配對的問題類似(biclustering).
    • 最後作者參考了Edmonds-KarpHopcroft-Karp兩個演算法來解決問題,不過這很可惜的並沒有解釋太多其中的方法論.
  • CI 怎樣帶你遠離平庸?
    • William Yeh大大的好文,主要是因為他身為Ansible推動者.寫了幾個Role受到官方的推薦.受到許多注目,也收到許多人送來的PR跟issue.要能夠快速檢驗每隔PR的是否會損害程式本身,就是得要透過CI.透過CI可以讓許多PR跨平台的驗證變得更簡單.

有聲書心得

  • IT公論: 巴西封禁 WhatsApp 背后的故事
    • 這一集還挺有趣的,因為有請到在巴西當地的華人贾儒來講講為何WhatApp在巴西被官方封閉.這段訪談也聽到了巴西本地的WhatApp主要是一般民眾與黑幫在使用,以及巴西官方雖然封閉但是封鎖WhatApp前還是會有官方公告,並且也在政壇掀起波瀾. 這個訪談也能了解一些巴西當地支付與對於網路通訊的一些特例.
    • 這集也討論到Apple Pay即將進入China的觀點.當然China已經不缺任何行動支付方案,但是二維條碼的安全性令人質疑(偷刷),但是行動支付所帶來的方便性就相當令人期待,當然台灣Apple Pay還是得等,不過等到行動支付都來了,接下來就是各家行動支付所帶來的優惠與折扣大戰.

網站介紹

這邊會寫一些我的Project 52的成果.

本週專案React-Diff,主要是透過React Element Diff的原理,將他實現在Binary Tree的Diff上面.

React-Diff具有以下特點:

  1. 支援三種Difference Option (INSERT, MOVE, REMOVE)
  2. 達到O(n)的時間複雜度.
  3. 支援Graphviz繪圖輸出樹狀結構

[iOS] 把舊專案換到XCode7與iOS9上面會出現上下黑條(Application appears with black bars on top and bottom)

##問題:

主要是心血來潮把自己就的App”粉絲相簿“想拿出來改版(終於). 結果發現上下邊有黑條.這裡有個示意圖:

不過,我的App明明就是使用系統預設的UITableViewController,NavigationController跟UITabBar而已. 趕緊來找找解決方法.

##主要原因:

根據iOS 9 Xcode 7 - Application appears with black bars on top and bottom這邊的解答,是說由於你沒有” LaunchScreen.storyboard”在你的App,所以XCode會”預設”而把你的App變成比較能夠跑的狀況(類似iPhone4 App跑在 iPhone6 Plus一樣).

這樣其實很不好,因為有上下邊黑條還有擴大的效果.

##解決方式:

根據http://stackoverflow.com/a/32614526/1316907這邊的解釋,進行以下的方式可以解決這樣的問題:

  • 更改”Launch Image Source” 成 “Brand Assets”
  • 不過由於我還是有問題,我必須還要修改”Launch Screen File”成MainStoryBoard

這裡有個修改後示意圖:

打完收工,本來想加新功能,卻踩一堆舊Bug.不過這樣也學了一課.. 真棒…

##相關鏈結:

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

這是什麼?

程式週記主要內容如下:

  • Gihub project 介紹:
    • 主要會貼一些github,但是會盡量寫上一些有用的評語(或是我容易想到的關鍵詞)幫助以後查詢
  • 網路文章心得:
    • 會寫些心得,強迫自己閱讀.

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

本週摘要

幾經思考決定(好像只是之前偷懶),決定把之前的“工作上的一些雜事筆記“改一下名字,並且持續努力的改成每週更新.

碎念一下: 其實之前停止是因為在忙著上coursera,不過我發現我既然還是都會寫一些twitter就應該要繼續更新我的部落格.

論壇與研討會

網路文章

iOS/MacOSX

Python

Go

一些網站

本週專案

這邊會寫一些我的Project 52的成果本週專案是https://github.com/kkdai/youtube A Youtube download package in Golang

其實方法很簡單,紀錄一下:

  • 分析你輸入的網址,找出Youtube ID
  • 透過http://youtube.com/get_video_info?video_id=來找出影片下載網址與簽章(下載用)
  • 由於找出影片資訊有數個(不同解析度)挑出你需要的
  • 下載影片 url + sig

[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 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有興趣可以看看.

相關鏈結

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

前言:

主要是記錄一下一個有趣的話題在gitter.im/CodeTengu/headquarters

請問有台灣有哪些 startup 寫過他們的系統架構, 使用哪些軟體、服務之類的嗎? 有點類似 stackshare.io 那樣把一些東西列出來?

整理:

以下為條列式紀錄:

[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

相關鏈結: