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)




2012年5月5日 星期六

活動: Python 程式設計(上)(下)

之前在 Plurk 上面意外看到這一個教學 活動 ( 講者是 Mosky )
心想自己「用」了 Python 也已經一陣子
而事實上 我也只有在半年前看過 Python 學習手冊 (老鼠書!)
以及網路上零散的教學及文件
還蠻需要看看專業的 Python 推廣者是怎麼介紹這一個好東西的
於是我便報名參加了這一次的活動 ( 由 OSSF 舉辦,感謝 Rock 兩天來的努力跟冷笑話 )
上課投影片跟錄影之後應該會公布在活動網址


摘要描述一下這兩天的小心得:
1. 恆逸教育訓練中心真是有趣的地方
2. 吃了兩天的免費中餐便當(不難吃耶)
3. Mosky 是個熱血的 Python 正妹
4. 參與者有不少學生的樣子


由於我比較像是帶著「複習」、「開視野」的目的去上課
所以課程中就是一直翻著那本好久以前看過但是也忘光了的老鼠書
兩天的課程中, Mosky 教課的進度都緊咬著我看書的進度
非常快速而講重點,是很好的 Tutorial
小缺點是到了 Python OOP 的部分,速度就有點小暴走
不過 OOP 可探討的地方太多了,倒也難以在短時間說明完畢
Mosky 對於 Python 在數學及解決課業難題的應用,介紹的很好
我看到了以後,只能說對 Python 是相見恨晚 Orz
整體來講,講者講課時口齒清晰、思路清楚、課程內容及節奏大致OK
盡量讓大家多去打一點字玩 Python 是好的教學方式
雖有小瑕疵(如有時候會切換到一個人模式、 因為要拿麥克風只能一隻手打字...)
但是整體的教學是不錯的,尤其講者還只是大學生(Orz ... 拜)



兩天以來,頗有獲益
抓到了別人眼中 Python 的入門重點
重看老鼠書,也把以前看不懂或是不知道在幹嘛的內容都理解
(這本書值得看兩三次啊!)
最後,我也決定去訂購精通 Python 3 程式設計這一本書了!

2012年4月16日 星期一

引用:Meta Class In Python




利用這一次在追 OSDC 影片的時候 (講者:Hychen 大大,Blog)
順便來搞懂一下到底什麼是 Meta Class
之前在 這裡 看到 Meta Class 的介紹的時候
其實我因為當時功力太淺所以看的似懂非懂,帶過去後過一陣子就忘光了

而事實上,我們的好朋友已有提供 Meta Class 的最佳解答了:
What is a meta class in Python ?
不用懷疑,就直接閱讀有 855 (增加中)個正面評價的答案吧!


另外澄清一下
在 Django 當中確實也有使用到 Meta Class 的方式來達成一些目的
但是 Class Meta: ... 的使用方式 與 Meta Class 無直接關係就是了 (Ref.





# 順便講一下無關的東西
在 PIPOSEA的開發過程中
由於 API Server 的性質 + 對 Python 不熟
所以我目前採用的 Framework 是極 light-weight 且簡單的 bottle 而不是萬能的 Django
當然,外面有掛上其他東西 ( gevent )


2012年4月7日 星期六

活動:PIPOSEA @ Appworks Demo Day #4




Video streaming by Ustream


我們的團隊大約在 1:23:22 開始進行 Presentation
上台的是我們 Team 的 Leader 同時也是老闆
我認為他的表達大約有 75 分的水準
但是投影片的質量實在還是不及格



我們大約在今年過年前確定了要做的東西及方向 我所負責的部分為 API Server 的開發
過年後在討論之餘,開始一步一步刻出整個框架
以及逐漸解決要面對的技術問題
事實上,我們想要做的東西還是一直在改 ...
因此大約到了 Demo Day 前兩到三週
外包給美工的圖以及DB的設計才完全確定


整個具體的產品真的就是這兩三個禮拜生出來的
我大約在兩週的時間內寫了接近 2k 的 Python Code
( 順便附上計算 line number 的語法: find . -name '*.py' | xargs wc -l )
要是加上之前練功用的 FakeAPI Server 以及部分 Django + Piston code
我的 Python Code 總產量大約有 3k ,算是從 Very New 變成 New 了


這兩週三個開發者 ( Terry, Joe, Cirtis ) 過著相當「燃燒」的生活
但卻在逐漸看著自己的產品「具現化」的過程中得到無與倫比的成就感
那種做自己想做的事情的感覺,是很好的
也是這樣的熱情(以及 Demo Day 的壓力)
讓我們至少能夠順利的完成產品的 Prototype


Demo Day 的交流時間時,有許多有興趣的人來到攤位看我們DEMO
有大四的在學學生(其實看得出來是學生!)
比我們稍年長的學長
作硬體的外國人(馬上交給團隊中的擁有 USC 碩士的 lenny 應付)
對我們很有興趣,一直問問題的大叔(還問到雲端AWS去了~)
... ...
整體來講,大家都覺得有趣,覺得還有許多可能性
被肯定的感覺還挺好的
我們也得到了一些回饋


小評一下,雖然我們的表現很手忙腳亂,呈現的東西還缺東缺西
但是至少向大家說明了一件事情:「Hello world !! We are PIPOSEA !!」



About PIPOSEA:


現在的時間是 2012 年,Facebook 已經差一步就統一地球了
這個世界上卻還有人想要做 Social Network ???


一切的緣起就如同 Terry 在馬來西亞時的遭遇 --「無法與身旁的陌生人互動」
這是大多數既有的社交網路的弱項
因為他們專注的是強化朋友與朋友之間的連結
而現存的陌生社交網路,過於強調「愛情」,無法廣泛的被人們接受
而社交資料的重建,更是造成麻煩


而我們想做的,只是想要解決人與陌生人之間互動的問題
透過 自動化社交機制、虛擬(實際)位置介面、邀約互動設計以及其他有趣的元素
讓人與人可以達到架構於虛擬/真實世界之上的互動


Enjoy It !! 



2012年3月20日 星期二

筆記:Python: reload reload reload reload 大全

Python 提供了一個方便又惹人厭的 reload function
好處在於透過重新 reload 一個 module,可以進行程式碼更新
(不過在記憶體內的東西還是更新不到...)
惹人厭的地方則是 module 與 module 之間往往具有相依性
當 module A import module B ,且兩者同時有所更新的時候
reload(A); reload(B) 的結果不盡然與 reload(B); reload(A) 相同


關於這一方面的問題可以參考:
這篇中文介紹 英文原文 以及 一個解決此問題的專案
另外,使用此專案時要注意:


1. 由於 import 已經被暫時蓋掉,由 reload._import 執行
   所以是否真的要對所有的 modules 建立一個 graph
   取決於最後的目的
#我個人偏好,只對自己寫的 module 建立 graph
   因為我不會吃飽太閒去改別人的 module
2. 如果使用 reload._import 某些外部的 module 的時候造成問題
   那麼可以考慮"早點" import 這些 module
3. 對於 monitor.py ,記得補上應該要在 import reload 後面的 reload.enable()
   該 module 的使用方式如下:
   import 該 module 後,製造出monitor.Reloader() 的 instance
   並且使用 .poll() 來詢問是否檔案有所更新



另外如果不考慮相依性,只是希望達到更新 module 便 reload module 的功能
也可以參考 對岸朋友的文章 原理就只是檢查檔案是否更新過


stackoverflow 上面也有類似上述的問題,不過解法是使用pyinotify觀察檔案的更新:
detect if a python module changes and then reload: 原文  程式碼