前言:

今年年底到數第二週,可以開始深入研究一些自己有興趣的東西.本週主要研究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,這樣就可以了.
      • 參考:
#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)

Evan

Attitude is everything