目前的手機 S3 ,終於也到的系統崩潰的時候了
到官方網站,要抓 firmware ,結果完全找不到
反而要由第三方的網站,才找的到載點
手機可以繼續故障下去
這是我第三次修理了,前兩次,都是 micro USB 接頭有問題,解法都要我換主機板
第一次,保固內,第二次,過保了一個月,我想他們手機的耐久壽命,可能只有抓
保固期的 0.9 ~ 0.98
這一次,開不了機了
Yosemite 的痛
我想 Mac Yosemite 的痛,大家漸漸感受到了
這裏有一篇,有關無線網路爛了的解法,有問題的朋友可以試試,我的 WL-330nul 一樣是沒有用,只能用斷斷續續的 Ap 模式
感覺回到了用 Linux 時的初衷,還會邊拔插裝置,tail -f 看一下 /var/log/system.log 的錯誤
http://osxdaily.com/2014/10/25/fix-wi-fi-problems-os-x-yosemite/
還有一種方法,就是把藍芽關掉,再試試看
另外,Yosemite 已經預設不讓你裝沒有簽證過的 kernel module 了,所以用 homebrew 要裝 osxfuse 會吐
terry@localhost /var/log $ brew install osxfuse
osxfuse: osxfuse is already installed from the binary distribution and
conflicts with this formula.
osxfuse: OS X Mavericks or older is required for this package.
OS X Yosemite introduced a strict unsigned kext ban which breaks this package.
You should remove this package from your system and attempt to find upstream
binaries to use instead.
Error: Unsatisified requirements failed this build.
我是直接下載 dmg 安裝了
Write in GO
優勝美地不太優
筆記一下 Fragment
在 twitter 上面,看到前輩分享 有關於 Android Fragment
的一些問題
http://corner.squareup.com/2014/10/advocating-against-android-fragments.html
Android 和 iOS 不同點
這真的要靠背一下,為什麼很少聽人說, Android 用 micro usb 基本上是設計有問題壓
iPhone 上面的插座,是母,線是公的,會聽到有人,有時候說線很爛,常斷之類的
可是 Android 上面的傳輸插座 micro usb 是母的,也是公的,中間那一個小插片,倒是線的接頭耐用多了,這一種設計
會斷,就是斷在手機的插座上,這根本就是做錯的東西吧
就是古典 Android App 發佈
Google Play 連結
https://play.google.com/store/apps/details?id=com.upassing.justclassic
這是一個專為古典樂做的 App.
所有的內容來源,都是屬於公共領域的音樂,小弟還蠻喜歡開放音樂,商業的創作也喜歡,只是,自由音樂在法律上,不會像商業的音樂全被唱片公司控制
未來如果真的有人喜歡自由開放的古典音樂,我會繼續改善這一個 App,也會加上廣告,以維持下載的頻寬
如果想要鼓勵我,繼續改善這一個 App,給個五顆星,還有您寶貴的建議,目前是非常 beta 的版本,基於 release early release often 的原則就先發佈了
最重要的就是一起聽音樂吧
這一次,寫這一個 Android 的心得,就是 IDE (Android Studio) 的開發環境,真的很聰明,自己不會寫 Android
以前比較多是用 cordova 包的 App , Java 的書也都沒 K 過,居然能發佈 very early beta release 的版本,還有很多的調教優化要邊做邊學
現在寫 Python Golang Node.js 的時候,用 Vim 寫,也都會一大堆提示,及提醒
Golang 裡面左括弧,寫成了冒號
Python 裏冒號變成左括弧
javascript 裏 for loop 寫成 Python 或是 Golang 的樣式
Golang 裏用了 Java for loop 的語法
這些全靠 Vim 或是 IDE 幫我檢查,以後要是有機會去面試,要是用筆寫程式,不能用我的電腦,應該會死的很慘 ;-)
PS: 給宅爸在家就是都會做一些怪怪的東西
參考資料
http://code.tutsplus.com/tutorials/create-a-music-player-on-android-user-controls--mobile-22787
iOS push notification
首先您必須到 https://developer.apple.com/ 去新增一個 App,一般就是你要用 push notification 的應用程式
設定好名字,還有 ID ,記得要把 Push Notifications 的服務打勾
我這裡說明就用中文,因為英文的說明有一堆了
接下來就可以打開您的 Mac / 應用程式 / 工具程式 / 鑰匙圈存取
我們選憑證輔助程式,從憑證授權要求憑證
把他存下來,我舉的例子就叫 PushMsg ,把檔名改成 PushMsg 所以你會得到 PushMsg.certSigningRequest 這一個 CSR ,待會要到 apple 網站上面產生憑證
產生後,到鑰匙圈存取 應用程式,選鑰匙的地方,你會看到有 PushMsg 的公鑰和密鑰,點選專用密鑰,按下滑鼠右鍵輸出憑證,輸出成 PushMsg.p12 待會用
這時候,請用剛剛的 PushMsg.certSigningRequest 到 Apple 開發者網站的 App 設定 notification 的地方去產生憑證,可以下載後,
開發模式,你會得到 aps_development.cer ,實際部署模式,請依此類推
我們現在有 PushMsg.certSigningRequest , PushMsg.p12 , 還有 aps_development.cer 接下來,我們來產生,Server 端程式需要的憑證格式
這裡的程式,我們用 Golang 的範例,其他用 Python , Node.js 或是其他語言的朋友請依此類推
產生 cert.pem
openssl x509 -in aps_development.cer -inform der -out cert.pem
產生 key.pem 由於我很懶,key.pem 不想加密碼,程式不想再判斷密碼部分,我用這樣,如果你要加 pass phrase 就不要加上 -nodes 即可
openssl pkcs12 -in PushMsg.p12 -out key.pem -nodes
最後就是用 Apple 文件上面的 openssl 測試即可,沒有錯誤,就是 OK 了
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert cert.pem -key key.pem
最後附上 golang 的測試程式,實際上已經有現成的 library 可以用 https://github.com/anachronistic/apns
只有連線的測試,有用 openssl 測試就可了,直接執行沒有錯誤,就是連線沒有問題了,送訊息可以直接用上面的 library
package main
import (
“crypto/tls”
“fmt”
“net”
“os”
)
func main() {
// load
cert, err := tls.LoadX509KeyPair("./cert.pem", “./key.pem”)
if err != nil {
fmt.Println(“key error: “, err)
os.Exit(1)
}
conf := &tls.Config{
Certificates: []tls.Certificate{cert},
ServerName: “gateway.sandbox.push.apple.com”,
}
// connect to APPLE
conn, err := net.Dial(“tcp”, “gateway.sandbox.push.apple.com:2195”)
if err != nil {
fmt.Println(“tcp error: “, err)
os.Exit(1)
}
tlsconn := tls.Client(conn, conf)
// be nice
err = tlsconn.Handshake()
if err != nil {
fmt.Println(“tls error: “, err)
os.Exit(1)
}
}
參考資料
http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html
http://bravenewmethod.com/2011/02/25/apple-push-notifications-with-go-language/
groupcache
這一個 golang 裡面非常帥氣的 library ,作者是原 memcached 的作者之一,主要就是讓 cache 機制再簡化
集群的部署能力也還不錯,完全不用再管 server instance ,我對這種,以簡單為名的 library 最沒有招架能力了
https://github.com/golang/groupcache
使用上也是非常的帥氣,可以參考 OSCON 的簡報
http://talks.golang.org/2013/oscon-dl.slide#1
詳細的使用上可以參考, source code ,或是 test case,還有很多種用法
以下是我用的範例,您可以用在很多地方,像是外部 url fetch ,或是很重的 query 或是檔案 IO 之類的
就是平常,你 cache 怎麼用,就可以怎麼用,cache 只有支援 拿,和寫,
以下的例子用這樣拿資料,我的 cache key 大概到小時,就用自己算每小時不同的 key
FileInfoCache.Get(nil, cacheFileInfo, groupcache.AllocatingByteSliceSink(&data))
另外,FileInfoFetch 就是另外一個做很多 disk IO 的工作
dest.SetBytes(FileInfoFetch(path))
// Example for groupcache
// snip from my code
var (
FileInfoCache *groupcache.Group
)
func init(){
//////////////////////////////////////////
// init book query cache
//cacheAddr := “127.0.0.1:55555”
//peers := groupcache.NewHTTPPool(“http://” + cacheAddr)
// the cache key is compose with timestamp hour
// 2006-01-02 15!!!url
getter := groupcache.GetterFunc(func(ctx groupcache.Context, key string, dest groupcache.Sink) error {
keys := strings.SplitN(key, “!!!”, 2)
//ts := keys[0]
path := keys[1]
dest.SetBytes(FileInfoFetch(path))
return nil
})
if FileInfoCache == nil {
// cache not been init
// allocate 64 MB memory for groupcache
FileInfoCache = groupcache.NewGroup(“FileInfo”, 64«20, getter)
}
}
你看,帥不帥氣,完全不需要另外跑,cache server daemon ,如果要組成 cluster 就直接在程式裡用 HTTPPool 的服務
bolt
記錄一下一些好用 golang library
blot 是一個純 golang 以簡單為美開發的 key value 資料庫,後來會用他,是因為一開始要存非常簡單的資料
想說就用 sqlite 來存就好了,反正欄位很少,資料結構簡單,開發環境是 Mac ,目標環境是 Linux ,部署的流程
就用 python 的 fabric 簡化,本地端編譯完 linux/amd64 的程式,複製到遠端 Linux,可是 github.com/mattn/go-sqlite3 有用到
CGO ,在 Mac 上面必須要用 gcc for linux 來編譯,編譯完後,到了目標機器上面又有 glibc 版本的問題,覺得這樣很花時間
不方便,另外就是 CGO 的編譯速度沒有很帥氣,立馬就決定找一個不依賴 CGO 的 key value store,目前覺得蠻合用了,這個專案的頁面的第一句話
就說服我了(我也太沒原則了吧) “Simple is the new beautiful.”
https://github.com/boltdb/bolt
使用簡單,由於我的 server 主要還是用簡單 JSON 格式,所以就先不用 gob 來 Encode 資料
// Example for bolt
package main
import (
“encoding/json”
“fmt”
“github.com/boltdb/bolt”
)
var (
db *bolt.DB
dbpath = “./user.db”
userbucket = []byte(“users”)
)
func main() {
db, _ = bolt.Open(dbpath, 0644, nil)
key := []byte(“unique_key_here”)
var value = struct {
Name string
Title string
}{“Somebody”, “Gopher”}
fmt.Println(key, value)
// in write transaction
err := db.Update(func(tx *bolt.Tx) error {
bucket, err := tx.CreateBucketIfNotExists(userbucket)
if err != nil {
return err
}
data, err := json.Marshal(value)
fmt.Println(“Please remember handle the error”, err)
if err == nil {
bucket.Put(key, data)
}
return nil
})
fmt.Println(err)
// in read
db.View(func(tx *bolt.Tx) error {
bucket := tx.Bucket(userbucket)
if bucket != nil {
// if have a struct to restore it
//json.Unmarshal(bucket.Get([]byte(key)), &user)
fmt.Println(bucket.Get(key))
}
return nil
})
}