December 27th, 2014
前言:
今年年底到數第二週,可以開始深入研究一些自己有興趣的東西.本週主要研究signal的處理,regex與新程式語言RUST學習,當然其中也有一些新的MOOCs學習.加上這個禮拜週六要補班,所以整個內容應該會比較多一點.
筆記:
- [Unix]關於Signal PIPE 更深入的研究
- 前言:
- 雖然加上了signal pipe的handler但是並沒有真正的測試到類似的狀況.
- 這個禮拜應該會花一些時間好好的研究詳細的內容.
- 筆記:
- 關於Signal:
- signal就是去接受或是傳送process間的溝通方式.系統設定好,也比較為人所知的就是 SIGINT (就是ctrl + c), SIGTERM(process 結束)或是 SIGKILL(被 kill,不過系統預設是不能catch 這個signal). 而這裡探討的是如何把接受到signal要做的一些處理做起來.這裏有更多的說明.
- 如何處理Signal:
- 基本上會收到任何signal,表示你的程式正在收到不可預料的狀況(以系統的signal為例),但是無法明確的了解哪些問題的發生.通常會建議把一些資源回收後,準備重啟的相關動作.
- [12/22]關於測試sigaction 的部分:
- 可以使用 kill -s (signal) process_id 來傳送signal
- 不過並不是完全可以接收的到.
- 以下是接受的清單:
- SIGINT (02)(handle ctrl + c signal)
- SIGSEGV (11)
- SIGALRM (14)
- SIGTERM (15)
- SIGSTOP (17)
- SIGTSTP (18)(handle ctrl + z signal)
- 以下接收不到:
- SIGSYS (12)
- SIGPIPE (13)
- SIGCONT (19)
- 以下是接受的清單:
- [12/23]於是我把我發現的事情,整理過後試著去stackoverflow詢問.得到了回應是他們測試是可以的,可能是我底層元件出了問題.
- 經過測試真的如網友回應的,看來底層的元件有把SIG_PIPE收走,造成我在上層無法接收加以處理. 得繼續研究如何解決類似的問題…..
- [12/24]最後網友提出解決方式就是在3rd party library 後面去加入sigaction,這樣就可以了.
- 參考:
- 關於Signal:
- 前言:
#include#include #include #include void handle_pipe(int sig) { printf("SIG_PIPE happen, error code is %d", sig); exit(0); } int main(int argc, char **argv) { struct sigaction action; sigemptyset(&action.sa_mask); action.sa_handler = handle_pipe; action.sa_flags = 0; //not work sigaction(SIGPIPE, &action, NULL); //Not work with kill -13 process_id //works well sigaction(SIGINT, &action, NULL); //work with kill -2 process_id sigaction(SIGSEGV, &action, NULL); //work with kill -11 process_id sigaction(SIGALRM, &action, NULL); //work with kill -14 process_id sigaction(SIGSTOP, &action, NULL); //work with kill -17 process_id while(1) { sleep(1); } } </pre> - [Python][Unix]深入研究regex (Regular Expression) (1) - 前言: - 主要是在伺服器的log上面,忽然有需要抓出某些特定的資訊.由於因為限定某些時間之內,所以無法改server,所以只好開始搞搞regex. - 不過當時手邊沒有一個可以快速找到內容並切輸出的內容regex語法,所以當時還是用一些巨集加上檔案的轉換才搞定. - 東西忙得差不多,決定把這個整理成一個python檔案.可以幫助以後快速的分析並且抓出需要的資料. - 筆記: - 首先關於regex,根據[鳥哥Linux的私房菜](http://linux.vbird.org/linux_basic/0330regularex.php)上免得說明.其實可以直接透過grep來完成.不過我沒辦法完成太複雜得,而且又牽扯到字串內的逃逸字串問題,所以這部分僅僅帶過. - grep -n 'REGEX' input_file - 後來決定使用python的[regex](https://docs.python.org/2/library/re.html)功能,其實提供的功能可以替換跟找出來並且轉換成list.已經很夠用了. - 以下是一段python找出檔案內電話資料格式的範例(以台灣室內電話與行動電話為例) - 相關資源: - Java script 去顯示regex 語法示意圖 - [http://jex.im/regulex](http://jex.im/regulex) - regex eval可以幫你找出特定文字內符合你輸入的regex內容. - [http://regexpal.com/](http://regexpal.com/) #python sample import os import re # filename variables filename = 'data//test_regex.txt' newfilename = 'result.txt' # read the file if os.path.exists(filename): data = open(filename,'r') bulkemails = data.read() else: print "File not found." raise SystemExit # regex to get phone # (01)2345-6789 , (01)23456789 # 0123456789 # 0911-234-567 r = re.compile(r'(\b(((\d{10})|([\(]??0\d{1}[\)]??\d{4}[\-]??\d{4})|(0\d{3}[\-]??\d{3}[\-]??\d{3})))\b)') results = r.findall(bulkemails) emails = "" for x in results: print str(x)+"\n"- [Python]關於raw string的用法與轉換 - 前言: - raw string 是python 裡面代表著原始字串的內容,其中不會將逃逸字串作轉換 (ex: \" -> ") - 在regex裡面,我們需要最原始的字串內容來表達搜尋的資料. - 這邊紀錄一下關於字串轉換這裡會遇到的問題. - 筆記: - 在這一篇的[stackoverflow裡面](http://stackoverflow.com/questions/2428117/casting-raw-strings-python),其實有不少的方式可以解決這件事情. - 有人提出可以透過 string.encode('string-escape') 但是對於這邊的系統會出現字串加上了unicode字元,就算改成string.encode(''unicode-escape')一樣不行. - 只能夠過字元 mapp來達到簡單的轉換,原始碼來自同一個網頁....escape_dict={'\a':r'\a', '\b':r'\b', '\c':r'\c', '\f':r'\f', '\n':r'\n', '\r':r'\r', '\t':r'\t', '\v':r'\v', '\'':r'\'', '\"':r'\"', '\0':r'\0', '\1':r'\1', '\2':r'\2', '\3':r'\3', '\4':r'\4', '\5':r'\5', '\6':r'\6', '\7':r'\7', '\8':r'\8', '\9':r'\9'} def raw(text): """Returns a raw string representation of text""" new_string='' for char in text: try: new_string+=escape_dict[char] except KeyError: new_string+=char return new_string- [RUST][MOOCs] 新的系統程式語言 RUST 線上課程與資料 - 前言: - 主要是[FB MOOCs社團上面的推薦](https://www.facebook.com/groups/courserazh/permalink/852795524760307/)的[課程作業系統](http://rust-class.org/index.html),但是特別的是用RUST上課.所以順便來看看號稱"安全,支援並行並且實用"的程式語言是什麼樣的架構. - 話說,介紹網頁寫得相當的棒.讓我引用原文從[官方網站](http://www.rust-lang.org/) - **Rust** is a systems programming language that runs blazingly **fast**, **prevents** almost all **crashes***, and **eliminates data races**. - 筆記: - 這裏主要只紀錄一下相關資訊,其他比較深入的內容可能就會另外弄成一篇. - 相關資訊: - [線上課程- OS - 使用RUST](http://rust-class.org/index.html) - [RUST官方網站](http://www.rust-lang.org/) - [trello RUST rush task](https://trello.com/b/uwzd0qUZ/rust-rush) - [MOOCs] 模型思考開課 - 有中文字幕的Model Thinking 開課一段時間,看了幾個slide挺有趣的.似乎可以幫助思考邏輯的提升. - [課程在這裡](https://class.coursera.org/modelthinkingzh-001)... 雖然有點晚~但是知識才是重點.... :) - [Python] 關於更多的python程式介紹網頁... - [https://inventwithpython.com/chapters/](https://inventwithpython.com/chapters/) - [Android][這一篇文章](http://blog.danlew.net/2014/11/26/i-dont-need-your-permission/)提到Android Intent其實藏有許多的問題 - 在於Intent不需要使用者關於權限的同意.所以即便項範例中舉例說每天半夜盜用妳電話打到某個地方.你也完全蒙在鼓裡. - 不過這篇文章受到大家的注意的是,英文翻譯的問題,最後竟然是由母語是英文的外國人來做翻譯: - The reason you need permission is because with this code you can initiate a phone call at any time without user action! If my app had this permission I could be calling 1-900-CAT-FACTS at 3 AM every morning and you'd be none the wiser - [Golang] 有趣的網址收集,大多是從Golang.tw的討論群組上看到的 - [這一篇介紹](http://jasonwilder.com/blog/2014/02/04/service-discovery-in-the-cloud/)許多有趣的Opens Source Services Discovery 其中相當多是Go寫的 - kite - A RPC services :[介紹網址](http://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/)[Source code](https://github.com/koding/kite) - 順手把Go 從1.3升到1.4,不過會發現許多library有不能與1.4共用.所以go\src下面幾乎所有的檔案都得砍掉重新抓. - 錯誤訊息: "... object is [darwin amd64 go1.3 X:precisestack] expected [darwin amd64 go1.4 X:precisestack" - Gin - A small REST microserver :[介紹網址](http://txt.fliglio.com/2014/07/restful-microservices-in-go-with-gin/) :[Source Code](https://github.com/gin-gonic/gin) - 感覺比[martini](https://github.com/go-martini/martini)更小.. 還得多多的實驗.不論如何.. 有了更多的選擇.... - 找尋的時候,發現有新的web framework [flotilla](https://github.com/thrisp/flotilla) 根據作者在reddit上面的講法,他希望能做出更具有延展性的Web Framework. Engine是可以抽換的. - [作者在reddit的討論](http://www.reddit.com/r/golang/comments/2hg50x/flotilla_set_your_fleet_afloat/) - [介紹網址](https://thrisp.github.io/flotilla/) - [Facebook Go Group](https://github.com/facebookgo/)隱藏的群組,不過有不少程式碼在Github上面. - 開始找一些可以解釋Golang比C/C++好的文章,以下是一些列表: - [Go: 90% Perfect, 100% of the time.](http://talks.golang.org/2014/gocon-tokyo.slide#1) - [Hacker News上面討論C跟Go的比較](https://news.ycombinator.com/item?id=4110480) - [某個人把php搬移到Go的心路歷程](http://tech.t9i.in/2013/01/why-program-in-go/) - [Powered by Go,介紹更多Go比起C/C++的優勢](http://talks.golang.org/2013/oscon-dl.slide#1)