2013-12-18

IRC 紀錄即時推送

irssi + inotify-tools + git 即時將紀錄推送到 github

Irssi

首先將 irssi 紀錄檔設定為每天切割:
/log open -autoopen -targets #tcffm ~/irclogs/Freenode/#tcffm-%Y-%m-%d

Git init

cd ~/irclogs/Freenode
git init
touch README
git add README
git commit -am "First commit."
git remote add origin git@github.com:OOO/tcffm.git
git push -u origin master

腳本

1. daily.sh
此腳本使用 crontab 每天 0:00 啟動,內容如下:
#!/bin/bash
killall -9 inotifywait
cd '/home/OOO/irclogs/Freenode'
today=$(date +%Y-%m-%d)
git add \#tcffm-$today
inotifywait -qme modify --format "sh onchange.sh %w" \#tcffm-$today | sh
2. onchange.sh
#!/bin/bash
git commit -am "log"
git push
將兩個腳本權限設定為 755

啟動

執行 ~/irclogs/Freenode/daily.sh


後記

inotifywait 可以監看每個檔案修改的動作,產生對應的動作。

2013-11-28

Concurrency

以前總覺得 concurrency 很難很酷,如 pthread 那樣精深,難上手。最近三年的工作經驗認識 asynchronous I/O,發現這是一種 concurrency,才覺得沒有這麼夢幻,覺得實用。我的工作經驗上,沒遇過 concurrency computing。

Computer Memory Hierarchy 解釋,CPU 以外的 I/O 都是很慢的,讓  CPU 等待是罪過,此決定掌握在 programmer 手上。

使用 aio 方式我用過幾種:
1) Object-C delegate
初體驗,也是啟發的框架。

2) go goroutine + channel
新語言的設計。

3) JavaScript ajax + callback
常見的方式。

自從開始有這些體驗,盡量落實每個動作都是 async,朝 C10M 邁進。

2013-10-22

德國電信商保護境內資料

美國竊聽流往法國通信被揭露,看到德國的電信商正在研擬一個計畫,加強保護境內資料。只要是發送端和接收端都在德國,或是德活盟友。透過路由設定,資料只會在國內走,不會往外。目前看來影響不大,因為太多服務提供者不在德國。

這個草案表現出一個態度,德國人不喜歡被監聽,可能不選擇美國服務,且自身加強保護。如此一來,德國民眾可能會有更多自己國家的服務,形成特殊現象。

2013-08-08

使用 rsync & git 建立每日備份

工作上遇到災難,救災完畢後評估使用 rsync 和 git 建立每日還原點。

災難是:
前人建立某個帳戶,家目錄在 /,用 userdel -r 清理舊帳戶,時間過久才發現災難已經造成。
兩個月前閒來無事,有做系統總備份,httpd 和 mysql 是兩個月前的紀錄,客戶難免唉唉叫。救災完畢後,使用 git 建立每日備份。

主機特性是代管客戶網頁資料,包含圖片和資料庫。

概略步驟是:
1. rsync 初始,git init
2. 每日 rsync 同步,git commit
3. 每日產生 git bundle

Webpages

使用 rsync 將來源抓到工作目錄,然後在工作目錄建 git 資料夾。


接著每天做備份



最後每天產生 git bundle


MySQL

和 webpages 相似的步驟,先初始




接著每天備份,產生 git bundle




最後產生 git bundles




還原




後記

災難後尋找備份方案時,見到有人每日、每週、每月做不同程度的備份。記得將每日的動作放進 crontab 定時執行,放在離峰時間比較不影響服務品質。

資料搞失或資料復原都需要付出慘痛的代價,如果能做成自動化,可以降低很多反應時間和損失。

2013-05-29

Notification 掉包

Google Cloud MessagingApple Push Notification Service 對於發佈推撥期間裝置離線的處理,都採以下政策:

只送最後一則。

引用 GCM:
GCM will usually deliver messages immediately after they are sent. However, this might not always be possible. For example, the device could be turned off, offline, or otherwise unavailable. In other cases, the sender itself might request that messages not be delivered until the device becomes active by using the delay_while_idleflag. Finally, GCM might intentionally delay messages to prevent an application from consuming excessive resources and negatively impacting battery life.
GCM Advanced Topics, Setting an Expiration Date for a Message
引用 APNS:
If APNs attempts to deliver a notification but the device is offline, the notification is stored for a limited period of time, and delivered to the device when it becomes available. 
Only one recent notification for a particular application is stored. If multiple notifications are sent while the device is offline, each new notification causes the prior notification to be discarded. This behavior of keeping only the newest notification is referred to as coalescing notifications. 
If the device remains offline for a long time, any notifications that were being stored for it are discarded.
Local and Push Notification Programming Guide, Quality of Service

所以要自己做驗證,確保推撥有成功。

比較 Naver LINE Android 和 iOS 版本對於離線訊息的處理,一旦接上網路,離線訊息一併收到數則。猜測可能的作法是:

1. Device offline
2. Send #1 msg, server enqueue 1 msg
3. Send #2 msg, server enqueue 2 msgs
4. Device online
5. Server send queue
6. Device splits msgs and local notificate one-by-one.

2013-03-28

2013-01-09

MD5 使用注意事項

在 Go  裡使用 md5 做校驗不難,如範例所寫:


若要在迴圈裡做上面的事情,可能會有這樣的寫法:


跑出來的結果是:


f1() 和 f2() 會有不同的結果是因為 io.WriteStringmd5.go 實作細節, WriteString 會找 Writer 的實作,而在 md5.go 的實作如下:


看見 += 就可以猜的出來是附加的方式,所以每次非得使用新的 instance,目前還沒發現能清除 digest 內容的方法。