2012年9月3日 星期一

心得:稍微加強一下 Python 的 logging module

Python 的 logging module 是一個非常好用、方便的工具
關於他的介紹除了官方文件外
這裡有一篇雖然是英文可是淺顯易懂的文章 Good logging pratice in Python 推薦參考

我發現我個人使用 logging 時,特別是使用 logger.error 來紀錄一些例外狀況時
  • 會想要隨手塞幾個 object 當作參數
  • 使用 logger.error 後,常伴隨著的是 return False 的語句
因此我嘗試寫個 wrapper 來把 logger.error 給包裝一下
但是這樣會有個小缺點,實際執行 logger.error 的 function 會變成是 wrapper function
這樣的行為,對於想要紀錄是哪一行程式碼呼叫 logger.error 時
會抓錯位置而導致跑到定義 wrapper function 的地方
或許還有辦法解決,不過我還是忍不住直接使用 PDB++ 來瞧瞧 logger.error 的 source code
意外發現相當容易修改

我的小修改如下:
  • 寫一個 error_hack 直接取代 error,當然是 based on 原本的程式碼作一點點小修改
  • 加上一個將所有 args 參數轉成字串的小功能
  • 在函數的最後加上一個回傳值 False

程式碼及範例如下:
(其實也沒什麼特別的,就是一個小修改,讓我以後方便使用及少寫一點程式碼)


# Modified by joe.dev 
import logging

FORMAT = '%(asctime)-15s %(message)s'
logging.basicConfig(format=FORMAT)
logger = logging.getLogger()
def error_hack(*args, **kwargs):
    if len(args) > 1:                   
        log_str = ""
        for a in args: 
            log_str += str(a) + "  "
    else:
        log_str = str(args)
    logger._log(40, log_str, None, **kwargs)# 40 -> error level
    return False
logger.error = error_hack

def do_some_task():
    return logger.error("Orz 1", "Orz 2", ["Orz 3"], {"Orz 4": "Orz 5"})

if do_some_task() is False:
    print "My task failed"

2012年8月8日 星期三

介紹:Munin - 安裝 Plugins 以及 Python 化 Plugin 的撰寫



Munin 支援加入 plugins 以監控更多的系統或特定應用程序項目,而且方法非常簡單
首先我們先透過執行 munin-node-configure | less 來閱讀 plugins 的使用情況
事實上我們也可以到直接放 plugins 的資料夾
觀看目前 munin 可用的 plugins 以及正在用的 plugins

#正在用的
ls -al /etc/munin/plugins
#可用的
ls /usr/share/munin/plugins/

我們發現到了放在 /etc/munin/plugins 內的檔案為連結檔
而且是連結到 /usr/share/munin/plugins/ 內對應的檔案
沒錯!若要新增或是移除目前使用的 plugins
只需透過新增、移除放在 /etc/munin/plugins 內的連結檔即可


有關 plugins 的安裝、撰寫可以參考 官網 或是 上一篇文章 推薦過的 Tutorial
在此則是推薦安裝這一個 Python Framework: python-munin
可透過撰寫 Python 來開發 plugins 也可以直接使用許多已經寫好的 plugins
安裝方式如下:

git clone git://github.com/samuel/python-munin.git
cd python-munin
sudo python setup.py install

安裝完成後就可以參考 教學文件 使用 Python 開發 plugins
或是直接到 plugins 資料夾內看看有哪些 plugins 可以使用

我們發現 plugins 竟然已經支援了下列這些常見的應用程序、系統:
* AWS ELB
* AWS SQS
* Cassandra
* DD-WRT Wireless Rate & Signal
* Memcached
* MongoDB
* MySQL
* Nginx
* RabbitMQ
* Redis
* Riak
* … …

要啟動 plugins 就直接把相關的 plugin files 複製或製作連結檔案放到 /etc/munin/plugins 內即可
如此一來,就可以輕鬆的監控自己的系統狀態了!



備註:
有些 plugin 是 rely on 特定的環境的,例如如果要監控 nginx 的狀態
可能需要開啟 nginx_http_status_module
這裡附上大神 Tsung 的 啟用 Nginx Status 的設定 一文



介紹:Munin - 容易上手且支援網路傳輸的圖形化系統監控工具

使用 Munin 監控網路狀態的系統畫面

標題雖有點冗長,其實 Munin 對於大多數的終端使用者而言
就是一個可以透過 Web 介面觀看自己系統狀態的工具
詳細介紹請參考: 官網 Wiki
有關 Munin 的教學,此篇 Tutorial 寫的很好、值得一觀
本文只簡單的介紹部分內容

我們可以透過類似 sudo yum install munin-node 的指令安裝 munin-node 在特定 Server
以及在欲蒐集監控內容並且產生報表的 Server 安裝 munin 透過 sudo yum install munin 的指令
安裝完成之後,我們需要編輯兩者的 config 檔案:
(如果兩者都安裝在同一台 Server,那麼 config 檔案可以不用修改)

#首先編輯 munin-node.conf
sudo vim /etc/munin/munin-node.conf
#找到下列這一行,以修改成可查詢者的 IP (預設只允許本機做查詢)(系統若有防火牆,記得修改,預設使用的 port 為 4949)
allow ^127\.0\.0\.1$ 

#執行 munin-node
sudo /etc/init.d/munin-node start
#再來編輯 munin.conf
sudo vim /etc/munin/munin.conf

#找到被註解起來的這一行,此資料夾為最後圖形化報表的輸出目錄,可以自訂
# htmldir /var/www/html/munin/

#找到帶有 a simple host tree 的註解,下方會有一個 sample,填入被監控的 node 的資訊
[node_domain_name]
    address 127.0.0.1
    use_node_name yes
    
#不用主動執行 munin,他已經被設為 5 分鐘執行一次,如果想要更改頻率可以透過修改以下檔案達成:
sudo vim /etc/cron.d/munin


最後一步,就是將 munin 所生成出來的監控結果放到 Web Server 上面
然後使用瀏覽器觀看監測結果
如果想要直接放到 nginx 上面,可以修改以下 script:
location /SOME_FOLDER_NAME/ { 
    alias /var/www/html/;
}
如果想要先隨手架一個 light-weight 的 Web Sever 來試試看,Bottle 是我推薦的首選:
#save as test.py
from bottle import route, run, static_file
@route('/')
def return_static_file(filename):
    return static_file(filename, root='/var/www/html/munin/')
run(host='localhost', port=80, debug=True)
Run Web Server: python test.py
請打開 Browser 輸入: http://your_domain/index.html
這樣就可以見到預設的監控首頁了!

備註:
1.
如果出現 404 訊息
可以檢查 /var/www/html/munin/ 內是否已經有 munin 自動生成出的 index.html
還沒生成出來的話,就請等待幾分鐘再看看
2.
監控的結果當然不應該是 Public 開放出來的
因此無論使用哪個 Web Server
都應該啟動基本的身分驗證功能
Munin 所輸出的 HTML 資料夾內包含了 .htaccess 可供某些 Server 設置
而 Bottle 的 HTTP BASIC Authentication 方式可能比較少人知道
所以我附上實作方法:
       ###關鍵在於使用 auth_basic function, 並且傳入一個用來檢查 username 及 password 的 function###
from bottle import route, run, static_file, auth_basic
@route(‘/<filename:path>’)
@auth_basic(lambda name, pwd: name==“username” and pwd==“password”)
def return_static_file(filename):
    return static_file(filename, root=‘/var/www/html/munin/’)
run(host=‘localhost’, port=80)
3.
如果 munin-node 與 munin 並非在同一台主機內
那麼兩者之數據傳輸應該啟用 TLS 功能,以確保資訊安全

2012年8月6日 星期一

筆記:利用 Python 將 Markdown 文件轉成 Mou Style HTML


近期手邊的 API Server 在規劃自動生成 Doc 的功能
而 Survey 許多標記格式以後,最後由極輕量化的 Markdown 勝出
雖然平常在 Mac 下使用 Mou 進行 Markdown 的撰寫是一件輕鬆愉快的事情
但是我希望自動生成出來的 Markdown Doc 轉換成 HTML Doc 的過程不要使用到 Mou
因此 Python 的 markdown module 派上了用場:
import markdown
html = markdown.markdown(your_text_string)


理論上,只要這樣子使用並且注意 your_text-string 的編碼
就可以解決問題了 …
不過很「恰巧」的是,由於 Mou 支援簡易表格對 HTML 的轉換
而我也不小心使用了如下的語法:
First Header | Second Header | Third Header
:----------- | :-----------: | -----------:
Left         | Center        | Right
Left         | Center        | Right
以產生這樣的 HTML:
First Header Second Header Third Header
Left Center Right
Left Center Right


markdown module 並不支援簡易表格的轉換
因此我只好去找看看是否有其他使用不同 engine 的 module
最後我找到 snudown module 可以支援簡易表格:
import snudown
output = snudown.markdown(input)
不過他的小問題是對於 <pre> <code> 的支援有點問題
(畢竟是 for reddit )
儘管如此,我們還是可以僅只是把有關簡易表格的部分交給 snudown module 來處理
其他部分由 markdown module 或是更加容易上手的 markdown2 module 來處理

最後,我希望使用 Python 轉換出來的 HTML 格式能夠盡可能的與 Mou 外觀一致
所以我去偷看了 Mou 所使用的 CSS file (可從 Preferences -> CSS -> Edit 開啟檔案)
我選擇了 github 的 Style 作為參考依據
如此一來就可以在遠端的主機全自動化的生成我想要使用的文件啦!

備註:本文即為由 markdown 撰寫而成

2012年7月15日 星期日

介紹: From Screen To Tmux

近日 coolshell 的 28神器文 引起了許多人的注意
(身為一個真的不會 linux 的人,只好加到書籤,慢慢研究)
其中神器 tmux 又因此被推薦啦!

由於這幾個月摸 linux 以來不斷的聽到有人說 tmux 比 screen 好用
而 screen 我僅僅只會一點皮毛(黏、不黏、新增、刪除、改名)就覺得很方便了
索性便藉此從 screen 換到 tmux
順便好好學一下此類的工具
以下為個人的筆記與心得,整理成問答的方式:



1. 為什麼要從 screen 轉換到 tmux ?


專業的回答 在此 ,而對我而言其實 screen 的功能已經算夠用
如果平常 screen 也只是開兩三個分頁,或者螢幕根本不大
那麼其實換到 tmux 在閱讀以及視窗轉換上,並沒有辦法得到多大的好處

但我轉換到 tmux 以後,花了好幾個小時思考及設定 .tmux.conf 的設置
因而能夠自動初始化我的工作環境,對於日後生產力的提升肯定是有的!


2. 如何從 screen 無痛轉換到 tmux ?

專業的無痛轉換 在此,說穿了就是把 tmux 的快捷建設定跟 screen 一樣
那基本上就不會痛了!另外建議將 .tmux.conf 也加入版控系統中吧!
我比較懶惰一點,因此 .screenrc .tmux.conf 都是塞在 vim 的 repository 裡面
然後再 ln -s 建立對應的連結,放在家目錄下


3. 如何設定 .tmux.conf 以提升效率?

第一位專家 在此
有兩行設定很值得參考:
bind-key r source-file ~/.tmux.conf 
bind-key S command-prompt -p ssh: "new-window -n %1 'ssh %1'"
前者使得 tmux 的 .tmux.conf 設定檔可以動態的更新
後者的 command-prompt 用法,則是利用快捷建開啟新視窗及啟動 ssh 程式

第二位專家 在此
相信很多人一看到 #!/bin/sh 眼睛就會亮了 ....
這邊是透過撰寫 shell script 來自動初始化工作環境

第三位專家們 在此
這是 stackoverflow 的討論串
有許多種初始化工作環境的方法
下面這一種在 .tmux.conf 中設定快捷鍵去讀取外部檔案以進行初始化的方法頗有趣:
bind S source-file ~/.tmux/session1
在 session1 此檔案中可以定義該如何初始化,如:
new -s hello -n world
就代表新增一個名為 hello 的 session 並且切出一個名為 world 的視窗



4. 如何更瘋狂的設定 .tmux.conf 以提升效率?

不專業的回答在此,請大家斟酌參考!
首先可以使用 bind -n F9 new-window 此類的方式讓鍵盤上的 Function Key 有事情做

如果大家真的很討厭按 ctrl + a 或是 ctr + b 這一種 prefix 的設定方式的話
其實也可以把 prefix 設定成單鍵,如某個 Function Key
小缺點是 Function Key 可能有點遠
因此我選擇將 prefix 設定成: `     <-- 就是跟 ~ 同一顆鍵盤按鍵的符號
為了讓 vim 裡面常用的快捷鍵 `` 以及 `. 可以正常運作
因此我加上了:
unbind '.'
bind '.' send-keys '`''.'
unbind '`'
bind '`' send-keys '`''`'

至於原本 vim 的前往書籤功能
我選擇改為使用 <leader> + m + 書籤字母
~/.vimrc 加上這一行:
nnoremap <silent> <leader>m `
所以最後就變成:
ma               -> 建立書籤a
<leader>ma  -> 前往書籤a
由於我不常用到自定義書籤功能,所以我是可以接受多敲一個鍵的!

這樣的小缺點是真的要打出 ` 符號的時候,必須連敲兩下才會一口氣出現兩個 ``
不過我真的不常打這一個符號!便利性遠大於不便利!
這樣子設定之後,tmux 應該已經沒有不好打的快捷鍵了
即便有,也可以透過修改 .tmux.conf 來簡化他!



希望大家使用 tmux 愉快!



備註:
.tmux.conf 的設定方式,可能因版本不同而略有小差異
如果嘗試使用專業或不專業的建議而出現錯誤訊息
煩請注意錯誤訊息上面所寫的正確用法或是詢問 google











2012年6月20日 星期三

心得:Python 中文入門書


在此分享自學 Python 半年多以來的中文入門書讀書心得


如果你已經有程式基礎且馬上要用 Python 寫些東西:
請不要看這些入門書,直接使用 google 查教學
一兩個晚上大概就可以學完語法、了解 Python 表面上的特性
然後找一個適合你用的 IDE ,直接寫點程式進步最快!


如果你是學生,放暑假時想自學個語言來玩玩
且你比較喜歡閱讀圖文並茂的「講義」
那麼 Head First 系列的 深入淺出 Python 應該很適合你
雖然這一本書我翻過後發現他其實只有「淺出」Python,並不深入
但是這樣活潑直覺的講義書,起碼可以讓你不會容易想睡覺
你若是有認真的去想或寫本書的習題
應該可以很快的上手 Python 這一門語言


如果你想要更深入點了解 Python 這一個語言
那麼老鼠書 Python 學習手冊 會是好一本好書
有關 Python 的語言特性,你所該知道的基本知識,這一本書都有具備
且書中的程式碼例子都專注在解釋語言特性,不會太複雜
我把本書定義成一本「標準教科書」
內容是可理解的,不會太困難的
如果你有三五天的空閒可以看書,這一本書很快就可以看完了


如果你曾經學過 Python 怎麼寫,或看過其他的入門書
那麼 精通 Python 3 程式設計 可以是一本不錯的學習兼工具書
本書要直接閱讀可能要有基本的程式底
書中除了講解 Python 的語言特性以外,更加著重在怎麼用
程式碼範例皆被設計成用來處理特定任務,具有實用性
這樣的缺點是程式碼除了表現語言特性以外還參雜著任務處理的邏輯
使得閱讀者需要想想他在幹什麼
但是好處卻是能讓使用者立即知道該語言特性的實際用處
本書內容較深,三五天內未必看的完



三本書的難度大概是:
深入淺出 Python < Python 學習手冊 < 精通 Python 3 程式設計
可以的話,後兩本書都值得收藏!


#備註 精通 Python 3 程式設計 介紹了許多 Python 3 的新特性
   對於想入門 Python 且沒有任何包袱的人而言
   可以直接考慮 Python 3 了,他的確變得更棒!
   另外本文是以目前找得到的中文書為主進行簡介
   若是也可以考慮原文書的話,fcamel's Blog 有更好的介紹


# 2013.12.17 更新:
今年 PyConTW 的 先修課程 中,邀請的講師良葛格有製作一份 Slide:

並於近期陸續與 CodeData 撰文介紹 Python:前往一看





2012年6月11日 星期一

活動: PyConf 2012

幾個月前看到正在學習的語言要辦 conference
於是二話不說便在早鳥訂票開放日訂票
事實上, 議程 在訂票前並沒有仔細看過
只是覺得身旁有一群會寫 python 的人,心情就很好了!
(事後得知公司決定全額補助諸如此類的進修費用,心情就更好了!)

怕自己學 python (<1year)還太嫩
聽不懂大神們在講什麼
除了收了一本實用導向的 精通Python 3程式設計
趕快看一下 python 3 有什麼東西以外
我稍微追 PycTW2011 的資訊
可惜的是我好像沒有找到錄影的紀錄?
總之,胡亂的看過上面的投影片 ...
(發現 魏老師 的 Python 2 vs 3,  50 行中文手寫辨識 好有趣啊!)



這是我第一次前往中研院參加研討會
雖然位置有點偏遠,進去後還必須走很遠
不過硬體設施真的頗高級
兩天都是在很舒適的狀況下聽演講、等便當跟點心
第一天的議程以科學運算上之應用為大宗
其中 Jimmy Lai 大神是我大學時的同學(他都已經在台上了,我在幹嘛啊)
他的演講沒安排什麼梗,就是很平實而邏輯清楚的介紹自己使用的工具及方法
(做人就是要這樣正直才有辦法連拿兩個大賽的冠軍啊!)
由於講者大都把主力放在 python 在科學上的應用
因此第一天講者的演講 style ,大都給人較重的學術感
老實講,我目前在做 web 開發,所以大多數的演講對我直接的幫助性不大
除了 Gage Tseng 大神的 Even Faster Django 以外 ...
他的標題有梗,演講的內容也有梗,整個演講很值得參考
可一提的是,他們的系統架構與我們頗類似
Django 也的確是我早期開發 web server 時使用的 framework
不過隨著分工成 api server,我就決定使用更 light-weight 的 bottle
(大概是以前寫 C 寫太多,我竟然曾經認真考慮不要用 bottle 直接自幹一個 WSGI app!)
我對 Gage Tseng 大神印象最深刻的是,他介紹自己的公司的時候
提到他們就是要做社交網路,那種氣魄讓我深感認同,真想拍手叫好!
(我們 PIPOSEA 也是想做社交網路(握手))
一整天的節目結束後,本來應該去參加最重要的 BOF
不過由於晚上我另有活動,所以只能含淚提早離去 ... ... Orz


第二天開場就是 Django 的開發者
就是一個大師在向我們娓娓道來 web 歷史的感覺
緊接著的 Rasiel Chang 以及 toki 大神們
Rasiel Chang 的表達非常條理分明,很明顯有所用心準備及練習
toki 則是題材有趣,頗吸引人!
講的都很精彩,Rasiel Chang 的 團隊 也在 appworks #4 內
不過由於我們團隊對外大都是由老闆出席,實在很不好意思去認親
(我果然有社交障礙!)
其後的演講,無論是用 Mac 的 ericsk 大神, 12 道家書的 lwshu 大神
或是讓人驚訝竟然已經用 python 十年的 Cyber link 講者 Honder Tsou 大神
這些大神的演講都使我獲益良多
最後一場 hychen 大神的演講則大概是這兩天最專注於語言特性的一場 talk
也是對我幫助最大的一場演講
在台下聽講時其實一直覺得很有趣
因為 hychen 講的頗快速且一下子就講到重點
這恐怕會使得某些比較不熟 python 語言特性的聽眾完全在狀況外
但對於正好需要 meta class 這樣特性的我而言
只能夠用「聽君一席話,勝讀十年書」來感謝他 Orz
(附上投影片)


整體來講,這兩天的演講學術味較重
但是對於探討 python 這一個語言特性的演講較少
很可能大家都是拿 python 來應用
所以演講的主題就集中在 科學運算、繪圖、web ... 等等地方
(我原本以為每個 talk 都是像 hychen 大神的 meta class 一樣深入!)
小可惜的地方是,有關 python 在 web 上面的應用我聽得還不夠過癮 Orz
總之,感謝主辦單位的辛勞付出及抽獎貪食蛇!
希望 python 這個好玩意,可以更為人所知,為人所用。
(希望某年我能夠熟 python 熟到能上台向大家介紹牠 ... Orz)