2012年9月24日 星期一

修改 Debian 或 Ubuntu 預設 editor

前幾天突然想到一個問題....由於 Ubuntu 預設 editor 是 nano,這對於一個 vim user 來說實在是不太舒服啊XD 所以稍微找了一下,找到一個很簡便的作法,可以用來修改預設 editor,方式如下:


$ sudo update-alternatives --config editor    
[sudo] password for crboy: 
There are 4 choices for the alternative editor (providing /usr/bin/editor).

  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /bin/nano            40        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.tiny    10        manual mode

Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode.
$ 

其實重點就是那個 sudo update-alternatives --config editor 而已啦XD 後面照著指示操作就好了....:)

2012年9月21日 星期五

PHP 自動發信程式

之前為了發 COSCUP 的通知信,參考網路上的範例用 PHP 寫了個小程式。我把範例程式放在這個 gist 上:https://gist.github.com/3135053

其實明顯看得出來,程式沒什麼架構,純粹只是為了可以 work 而寫的拋棄式程式。不過丟出來一方面可以當自己的筆記,以後要找比較好找,另一方面,也許另一個人想要寫類似的小玩具的時候就可以參考了 :P

以下是一些簡單的介紹。

我使用這個程式的狀況是,我需要寄一封信給很多人,而我又希望每個人收到的信,收件者只有自己,而且信件開頭還會寫上他的名字,這樣比較貼心。所以沒辦法用「寄給自己 and BCC」的方法達成,只好透過程式完成。

這個小程式實際上是透過一套稱為 PHPMailer 的 library 做真正的寄信動作,所以困難的部分都被它做走了!我們只要把該設定的東西設定一下就差不多。要設定的項目大概有這些:

  • SMTP server 資訊 (主機、port、認證方式...等)
  • 登入資訊 (我使用 Gmail 寄信,所以需要登入)
  • 寄件者與收件者資訊
  • 信件資訊 (標題與內文)
在我這邊,每封信不同的地方只有收件者與內文,所以我會每次重新產生並設定,其餘部分都在最前面寫死。

收件者與內文的部分,我是先將收件者名單從 Google Spreadsheets 中匯出成 .tsv 檔 (因為比較容易 parse),再直接讀入。這個寫在 function parse_name_list_tsv($filename) 中。然後用一個自己刻的簡單 template tool (function fill_template($content, $data), 才 4 行XD) 去加上 user-specified 的資料,最後送信收工!

一些有趣的小細節:
  • 忘記為什麼了,我一開始跑起來會出現跟時區有關的錯誤,所以必須加上 date_default_timezone_set('Asia/Taipei'); 來避免這個問題
  • 因為我的 Google Account 有開啟兩階段驗證 (2-Step Verification),而我們這種小工具當然不可能支援,所以要為我們的程式特別創造一組應用程式密碼,才能正常使用喔!
  • 一開始不小心抓到舊版的 PHPMailer,它有個 bug 就是,CC 的人會變成 BCC (或是反過來...我忘了),所以我直接從它的 source code 裡找到有問題的那段修掉了 (open source rocks!),不過還是不太確定是不是我使用錯誤。結果後來發現有新版 PHPMailer,就特別關注了一下這個問題,發現已經被修掉了XD 修的方法一樣....哈!
  • 因為 PHPMailer 新增收件人的 API 是 AddAddress(),所以要注意,要更改收件人的話必須先執行 ClearAddresses(),否則收件人清單會一直長....(好險我在正式寄信前的測試就發現這個問題...orz)
大概...差不多是這樣吧!突然有點佩服自己,一點小東西也可以囉嗦這麼多,哈哈....

2012年9月19日 星期三

Gitit 簡介

最近打算發一系列的 gitit 相關文章,希望不要拖稿拖太久....萬一去當兵了,可能會拖很久很久這樣XD

之前我一直在尋找一個好用的共同協作平台系統,原因是我覺得 MediaWiki 的語法實在太難寫了....特別是當我看到 Ubuntu-TW Wiki 的首頁原始碼的時候,都快吐血了.....當下覺得我智商不足.....orz 但後來一直尋找,尋找的目標是:語法好寫、可即時線上協作的 wiki,所謂的「即時線上協作」就是像 Google Docs 那樣有可以多人同時編輯的頁面這樣。不過一直都找不到我想要的東西....即時線上協作有 etherpad-lite 這個 open source 專案,但是他是每個 pad 獨立的,而使用 Markdown 語法的 wiki 也不是沒有,但沒有勇氣(?)去嘗試....

一開始知道 gitit,是 @zeroplex (日落) 在噗浪上講的。因為之前也跟日落提過我想要尋找一個好用的 wiki system 這件事,他剛好不知道從哪裡獲得資訊,就分享給我了。結果沒想到,一玩下去,驚為天人啊XD

在 .htaccess 裡面修改 php 設定值

這篇筆記拖稿好久了....其實應該很短的,所以趕快寫一寫。

有時候在弄一些 php 相關的東西的時候,需要設定一些模組,例如之前用過的 Xdebug,但是每次設定 php.ini 就要重新啟動 apache server,很麻煩還是其次,有時候上線的系統這樣一搞就很多人掰了.....XD 所以我們需要一個修改後立即生效的做法。

「.htaccess」是非常實用的做法,只要先在 apache 的設定檔裡去 AllowOverride Options 即可使用 (我自己的機器通常會在特定目錄直接 AllowOverride All)。那麼,到底該怎麼做呢?下面是範例:
php_value xdebug.auto_trace on
php_value xdebug.trace_output_dir /tmp/xdebug
php_value xdebug.collect_params 3

php_value xdebug.profiler_enable on
php_value xdebug.profiler_output_dir /tmp/xdebug
應該滿好懂的?其實就是...前面先指定 php_value,後面不用等號,直接寫設定值即可。

這樣做出來的結果,可以在 phpinfo 裡面看到成效。phpinfo 下方的 Configuration 那邊,設定值的部分有三欄,分別是 Directive、Local Value、Master Value,Directive 就是設定值的名稱,Local Value 是在該目錄真的會生效的設定值,Master Value 則是全系統的設定值。如果你覆蓋了全系統的設定,那麼你會看到你的 Local Value 跟 Master Value 不同,應該滿好認的。

透過這個方式,我們可以隨時去修改 php 的設定值,對於一些測試性的行為很有幫助!:D

2012年9月10日 星期一

這拼音到底是什麼鬼?

有個已經讓我困擾非常久的問題....今天來抱怨一下。

這個問題跟拼音有關,我指的是中文字以英文字母表示的那個拼音...最後還想提一下關於奇怪的「洋中文」 (我自己亂取的稱呼) 現象....但必須先說,我不是專業的語言或是文字學家,甚至我對語言、文字都沒有什麼深入的了解,我只是想表達我覺得很困擾,以及莫名奇妙莫名其妙的一些問題罷了。(感謝 http://www.plurk.com/mike771115 協助訂正錯字)

我們在某些特定場合,可能會需要提供自己的英文名字,特別是一些正式的場合,會需要正式的「中文姓名英譯」。而這個英譯應該以什麼為準呢?當然是護照上的英文名字。因為你如果出國,有法定效力的身分證明文件就是護照,所以不管是什麼證件、信用卡或是國際證照上面,最好都是寫護照上的英文名字。連帶的,像是發表論文之類的,我們也會填上護照上的英文名字。

OK,那這到底有什麼問題?

2012年9月9日 星期日

導讀:提問的藝術

這篇文章已經看過很多不同網頁都轉貼了,而我也不是很喜歡轉貼...所以我去 Google 搜尋了「提問的藝術」,然後直接貼第一條結果出來:http://ihower.tw/blog/archives/457/ (是 ihower 大大的部落格 <(_ _)>)。萬一未來哪天連結失效,那就自行搜尋吧~:)

那麼,要進入正題了。

首先,所謂黑客,在台灣可能比較常稱為駭客,指的是擁有高度知識與技術的人,但比較常用在電腦資訊相關領域。也許他鑽研的是資訊安全,也可能是深入作業系統,也可能是程式高手。我不夠資格對駭客下定義,但我認為這是種文化、是種哲學,體現的是喜好自由、喜好創造的個性。我想維基百科上的說明應該會更清楚。只要讀者不要把黑客跟蓄意搞破壞的人混為一談就好。這篇文章就是教你該怎麼從這些滿是知識跟經驗的駭客手上,獲得他們所會所學。

簡單來說:

  1. 保持謙遜的態度
  2. 找對問問題的地方
  3. 問對問題
  4. 把問題問對
態度是最重要的,也許包含了一切。很多人會不自覺的認為「別人應該告訴我答案」,這樣的想法會造成你提問的方式有很大的問題。如果你想的是「我想要拜託別人給我一個答案」,那也許會順利點。

想要「拜託」別人,總要拿出點誠意吧?要怎麼才能讓人看到你的誠意?你可以說明,你做了哪些動作。例如:你讀了說明文件 (哪一段?)、你看了 FAQ、你在網路上搜尋過、你有爬文。除了表現誠意以外,這對於別人找出你的問題也是有幫助的。也許你根本想錯方向,也許基本觀念不對,也許有地方誤解了等等...總之,做過哪些找答案的動作都可以提出來。(但最好不要胡亂猜測又不去嘗試,人家會想「那你怎麼不試試看?」)

透過提出具有思考性的問題,可以讓駭客們也對你的問題感興趣。若很多人對你的問題感興趣,那表示會有很多人一起幫你思考,幫你找出答案。(其實他們是在幫自己找出答案,只是你也可以從中獲益)

再來,請仔細思考你的問題。沒有思考過就拿去問人是很不禮貌的,特別是當你還覺得別人理應回答你的時候...除了仔細思考以外,也要仔細描述問題。特別是標題要清楚明確。如果你是別人,看到標題是「救命啊」的文章,你會覺得非看不可嗎?

第二點是找對地方。這很簡單,如果你有爬文,你應該有辦法分辨你的問題適不適合在這個地方出現。如果你每個地方都有爬文,那你應該就不會把問題胡亂貼到所有的地方去。

第三點,要問對問題。在很多情況下,你該問的是「我應該嘗試什麼?」而不是「答案是什麼?」為了你自己好,也為了節省別人的時間,請在問問題之前思考別人會怎麼回答你的問題。

最後,其實跟態度也有很大關連,要把問題問對。文章中已經舉了非常多例子,這邊應該不用多說,我寫得實在太差了,還是看原文比較好!:P

不過值得一提的是,要記得 RTFM (Read The Fucking Manual) 還有 STFW (Search The Fucking Web)。每次問問題的時候,最好都先自己找過答案。每次收到答案的時候,可能當中會有一些看不懂的東西,也記得要先找過答案。如果你收到了 *TF* 的答案....那就快去,因為答案真的在那裡.....


PS. 最近在思考一些關於學習的問題,總覺得普遍對於學習這件事不太抱有熱情...但似乎是個無解的問題。該如何鼓勵身邊的其他人 (例如學弟妹) 對探索跟學習的熱情,好像是個很難的問題...其實熱情也許是興趣的產物吧...沒興趣就很難解....

五月天 - 洗衣機

我記得...是今年的母親節吧。

還記得那時候五月天推出了這隻 MV,洗衣機。聽了好久的 KKBOX,一直都沒有仔細去聽歌詞,更沒有去看歌詞寫了什麼。

不過,看了 MV 之後,實在讓我太感動了.....也許,這跟我從小爸爸就過世了有關吧?一直在單親家庭長大的我,對這首歌如此有共鳴,也許是正常的.........先看看 MV 吧?



2012年8月1日 星期三

NAS 的 NFS 掛不上...竟然是 switch 害的!!

最近在新增設備,分別是 HP ProCurve 1810G-24 L2 switch 與 Synology RS812+ NAS,沒想到前兩天碰到一個讓人吐血的問題...故事要從這裡說起.....

一開始很開心的接上了 switch 還有 NAS,似乎相當正常,但操作相當緩慢....後來 ping 了一下,封包一直掉..........呃,但是後來換台電腦就好了,所以目前這個問題被我擱置.....XD

離題了,Synology NAS 算是還不錯,它的 OS (核心是 Linux,名稱叫做 DSM) 提供了 NFS 的支援,但主要的問題是......問題是我掛不上啊!!!!! 我碰到的狀況相當奇怪,我這台電腦連到 NAS 的管理介面沒有問題,ping 它也回很快,甚至是 CIFS (Windows 的網路芳鄰) 都很順利....獨獨 NFS 掛不上去 orz

我試了兩台電腦,都是 Linux,這兩台電腦跟 NAS 都接在上面說的那台 HP ProCurve 1810G-24 L2 switch 上。其中一台有防火牆,另一台沒有開,但是問題跟這個無關,所以就不理他了。我的狀況是,showmount 非常正常,NFS 權限也沒問題,但是真的要 mount 的時候就等很久很久很久.....然後就 timeout 了......= =

花了一個下午找不到問題,整個晚上在想原因,一直到隔天剛好 NAS 廠商過來,結果他們也找不出原因!!!! 後來是因為廠商帶了台很簡單的 ZyXEL switch 來 (因為之前跟他們說我 ping NAS 掉包掉很大),沒想到換上去就好了!!!!!! 杯具啊!!!!!!!! 天大的杯具啊!!!!!!!! 好......既然確定是 switch 的問題,當然立馬殺進去 switch 的管理介面看看...

這邊題外話,此時的網路接法是:HP[ZyXEL[我的電腦, NAS], 另一台電腦] (A[a,b] 表示 a 跟 b 接在 A 上)

接下來是我跟 NAS 廠商的工程師看著同一個螢幕 (其實他是用 VNC 連進來的,因為來我們這裡的人是搞 Windows 的XD),他一個個看著可以設定的選項,然後關了 security 選項中的兩個選項....這個時候我腦袋像是通電一樣....立馬連到另一台電腦 (因為我的電腦跟 NAS 之前沒有通過 HP switch),開始 mount.....馬上就好了= = (崩潰) 然後打開 Auto DoS......掛不起來了= = (崩潰) 然後關掉 Auto DoS 開啟 Storm Control (大概吧)....掛得起來= =

好啦越來越混亂了.......總而言之就是........

HP ProCurve 1810G-24 的 Auto DoS 功能會把 NFS 給擋掉!

對....跟 Synology 完全無關....都是 HP 害的!!!!!!!! 去 Google 搜尋「Auto DoS NFS」也可以找到相關文章....都是同一台= = 我還嘗試去找出原因....但是找來找去....我只能說這是個 bug 吧.....

總之,這真是太杯具了..............

2012年7月8日 星期日

導讀與心得:關於軟體的性能調校

今天來寫寫關於這兩篇文章的摘要跟心得:
http://coolshell.cn/articles/2967.html
http://coolshell.cn/articles/7490.html

第一篇文章裡面講的東西很簡單,卻很重要!用 profiler 跟看組語!我個人經常強調的一件事,就是在解決問題的時候一定要先找到問題在哪裡。以前我常用 debugger 來說明,但 debugger 最大的幫助其實不是找出問題,而是「快速的」找出問題。而透過 profiler,對於找出效能問題幾乎是最簡單的作法....(有一種相當土法煉鋼的方法是,在自己的程式碼裡面加上一大堆印出 timestamp 的程式碼,聰明一點的還會用夾擠來避免浪費太多時間。但是這個行為本身就是在浪費時間....)


這篇文章可說是支持了我的觀點,有時候「看起來好像很慢」的程式碼,實際上並不會浪費你太多時間。這是真的!這也是為什麼作者會說,做性能調校要注意兩個重點,一個是花很多時間的程式碼,另一個是被執行很多次的程式碼!看起來很花時間的程式碼,可能不花你很多時間,也不執行很多次!


第二篇文章講的就多了...但這四個步驟的核心觀念很好抓,先定義(效能)需求,然後做測試,接著找出問題,最後解決問題。聽起來很無趣,不是嗎?但常常見到的情況反而是,先看看程式碼,然後猜測問題,修改之後測試看看,最後接受結果。


常見的狀況都是這樣,我自己也是,但在我懂得使用 profiler 之後才終於知道該怎麼把效能問題的重點給抓出來。但這篇文章講得更多,第一步定義 throughput 與 latency,這兩個詞的差別常常被忽略,因為他們會互相影響,所以常被用「performance」給概括了,但其實是可以分開考慮的。


性能測試部份我就比較沒有經驗了,我只懂得使用 profiler 做簡單的分析,但文中所提到的 throughput 與 latency 測試分析,光用想的就很辛苦....更別提還要配合穩定性測試 (舉例來說,如果系統有 memory leak 問題,碰到高 throughput 狀況則可能很容易噴掉)


透過測試,我們可以知道系統效能狀況。可以從兩個角度來看:從外面看,看 CPU 與 IO 的使用率。從裡面看,看系統 profiling 的數據。但其實有個很尷尬的問題,profiler 會稍微降低系統效能,所以對於上線的(且忙碌的)系統來說,想抓到真實狀況又不想對系統造成影響真的很難.....orz


最後談到「解決問題」這就多了,因為不同的問題需要不同的解決方式,我認為文章裡每一條經驗都很值得參考!首先可能要改演算法,演算法對效能的影響,我想寫過 ICPC 比賽或是 UVa Online Judge 的人最清楚了!雖然有很多現實問題真的不是演算法解決的 (都是一些有的沒的雜事),但底下用到的每個演算法都有機會成為瓶頸,也就有可能是系統加速的關鍵。再來,底層會發生的問題也要注意!誰說寫程式不用知道底層?對底層知道的越多,越有可能寫出好程式,這個定律是不會變的...再來講到系統方面的最佳化,這也是對底層知道越多越有用的例子。後面則是講到資料庫...資料庫性能調校相對於系統或是程式語言底層實做來說,應該算是顯學了。但是顯學歸顯學,也不是每個人都了解資料庫,所以「亂調一通然後看看速度多快」反而變成最 popular 的技術了....= = 文章這部份也相當值得閱讀,首先要知道 DB 的 lock 還有其他實做問題,再來可以透過工具看到 SQL query 的 execution plan (這真的很有用!比亂猜好太多了!但有些 RDBMS 要看到 execution plan 相當麻煩= =)。最後則是常見的 SQL 性能問題,像是 full table scan、index 的使用不當,或是某些通常很花時間的功能...

簡單下個結論,軟體性能調校很重要,但是有些人常常沒有用對方法。建議好好讀過這兩篇文章,還有網路上的其他好文章,嘗試看看用比較好的方法做調整!:)

2012年7月3日 星期二

Vim: CamelCase to snake_case

這篇文章:http://fcamel-life.blogspot.tw/2010/03/vim-camel-case-underscore-based.html 提到用 vim 取代把 CamelCase 轉換成 snake_case 的作法,看到後有一點點小想法,特別紀錄一下 :P

作者提到的取代方式是:
:%s/\(\l\)\(\u\)/\1_\l\2/gc
但配合 very magic 可以變成這樣
:%s/\v(\l)(\u)/\1_\l\2/gc
短了一點點不是重點,重點是括號好看多了XD

另外作者稍微寫錯的部分是,\l\u 在 substitute pattern 中表示的的 小寫和大寫字元,而不是把下一個字變成大(小)寫,那是在後面做的事。可以 :help /character-classes 看到詳細的列表 (大心)。

既然這篇文章這麼短,那就提一下好了。今天找資料的時候不小心發現這位作者的 blog,實在看得我欲罷不能啊XD 而且他玩的東西好多,也玩系統、也寫程式,從 C 寫到 PHP、Python、Perl、Ruby.....太強了orz 還有很多有趣的東西,實在很好玩....太佩服 <(_ _)> 建議熱愛技術的人可以參考看看,我覺得很精采 :D

導讀:保持小而頻繁的 commit

今天讀到這篇文章 http://fcamel-life.blogspot.tw/2010/08/commit.html

這篇文章在講使用分散式版本控制系統 (DVCS) 時應該儘量保持小而頻繁的 commit 行為,我覺得值得一讀。

雖然作者使用的是 mercurial (hg),但其實跟 git 的觀念是很像的。

以下簡單導讀:
第一部分介紹這個做法的好處,像是可以很容易做 code review (就算是自己 review 自己的 code 也一樣容易)、容易知道現在做了那些修改 (使用 git diff 一目了然)。他還提到用二元搜尋法找到出錯的程式,可透過 git bisect 完成。而他有用到的 hg shelve 跟 hg revert 在 git 也都有對應的功能 (git stash 跟 git revert),前者是用來把目前 working copy 的修改「暫存」起來 (非 commit),之後可以再取出來繼續把它改完,後者則是可以還原特定 commit 的變更。也就是說,配合 revert,如果每個 commit 都很小的話,可以很輕鬆把特定修改還原。

第二部分講 DVCS 的好處,很重要的就是每個人可以自己搞自己的,又可以知道別人的脈絡。如果是在一人專案的狀況下,最基本上也可以省去跟遠端主機溝通的成本。但 DVCS 也有缺點,就是對於無法 merge (或根本不須 merge) 的檔案無法很好的處理。

後面部分,關於暫存的部分上面提過了,主要就是 git stash。而 hunk selection 在 git 中可用 git add -p 或是 git add -i (interactive) 做到,如果不小心一次寫了太多功能,可以利用這種方式分別 commit,才能保持 commit 小而頻繁,以獲得好處。

最後一個部分,列了幾個常見的無趣但重要的工作,偏重構方面的。作者建議把這些工作各自獨立成單一的 commit,而事實上這樣真的有很大的好處,看 log 跟 diff 的時候可以少花很多心思。

2012年6月30日 星期六

Xdebug 遠端除錯 (Remote Debugging)

簡介

PHP 的除錯利器 - Xdebug 也可以進行互動式的除錯。什麼是互動式的除錯呢?當程式在執行中的時候,如果可以把程式的執行控制權攔截下來,那麼就可以根據自己的需求,單步執行我們的程式,並且可以監控程式的狀態。這些狀態包含了像是:目前執行到哪一行程式、目前所有的變數與其值、function 的 call stack (註) 等等。除了看到狀態以外,一個完善的 debugger 還允許開發者動態對變數進行修改,或是動態改變執行流程。

註:Call stack 指的是 function 呼叫的順序,如 A 呼叫 B,B 呼叫 C,則 call stack 的長相就像是把 B 到 A 上,再把 C 到 B 上,當 C 執行完畢後,就把 C 從 stack 中取走,如果接下來 B 又呼叫了 D,那麼就把 D 上來。所以在任何時候查看 call stack 都可以知道 function 間呼叫的從屬關係。關於 stack 與 call stack 的更多資訊都可以在網路上查到更清楚的解釋,這邊就不獻醜。

那麼要怎麼利用 Xdebug 進行互動式的除錯呢?由於很多 PHP 程式都是設計用來產生網頁的,所以常常會掛在 web server 底下執行,而非由我們手動去跑程式。Xdebug 身為一個 PHP module,他可以對執行流程進行監控,還可以藉由另外的通道跟開發者進行通訊,也就是說,開發者可以透過 Xdebug 對執行中的 PHP 進行控制。

2012年6月26日 星期二

Gitolite 使用教學

首先,要使用 gitolite 一定得先會使用 git。下面就不贅述。

初次設定

使用 gitolite 有以下兩個前置動作
  1. 建立 ssh keypair
    • 使用 Linux 或 Windows 上的 Git Bash
      $ ssh-keygen -f mykey
      Generating public/private rsa key pair.
      Enter passphrase (empty for no passphrase):
      Enter same passphrase again:
      Your identification has been saved in mykey.
      Your public key has been saved in mykey.pub.
      The key fingerprint is:
      xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx [email protected]
      
      這邊要注意幾個地方,-f 後面的參數表示檔名,可自行設定,此例中為 mykey。產生後會有兩個檔案,分別是 mykey.pubmykeymykey.pub 是 public key (公鑰),可以提供給你的 gitolite server 管理員,而 mykey 為 private key (私鑰),相當於密碼,不可以洩漏給任何人。再來,passphrase 是用來保護 key 的密碼,也要牢記。在認證時,同時擁有 private key 與 passphrase 的人才能通過認證,這才是安全的手法。最後,當 key 產生之後,會印出 key 的 fingerprint (指紋),是用來核對 public key 正確性用的。
    • 使用 PuTTY (PuTTYGen) 下載
      • 開啟 PuTTYGen
      • 點選「Generate」並根據指示隨意移動滑鼠
      • 修改上方「Key comment」並輸入 passphrase (passphrase 的說明可參考上一點)
      • 將上方文字區中的 public key (ssh-rsa 開頭的那串內容) 與其下方的 fingerprint 複製並提供給 gitolite 管理員
      • 點選下方「Save private key」將私鑰儲存
    如果對於產生過程有什麼疑慮,都可以刪掉剛產生的 keypair,重新產生,沒有不良影響。Keypair 產生後,就可以將 public key 與 fingerprint 提供給管理員新增帳號。為了確保安全,最好跟管理員用另外的管道確認 fingerprint 正確。(例如用網路傳輸 public key,用電話確認 fingerprint)
  2. 設定 ssh host alias (for Linux user, optional)
    如果想要簡化後續操作 ssh 時輸入的資訊,可以事先設定好。這邊須填入由 gitolite 管理者提供的 user, hostname, port 等資訊:
    $ vim ~/.ssh/config
    host gitserver  
        user git  
        hostname localhost  
        port 22  
        identityfile ~/.ssh/mykey
    
    最後面的 identity file 就是 private key,如果不想設定也可以直接把 private key 更名為 id_rsa 放在 ~/.ssh 下即可。

一般使用

申請 repository

申請 repository 只要將想使用的名字告知 gitolite 管理員即可。如果有特殊需求,可以建立規則,自行新增,但使用上須更加小心。

指定群組

如果有多人為同一個 team 的成員,可設定為群組,方便管理。

權限控制 (進階)

Gitolite 可以對 repository 中的每個 branch 或 tag 進行詳細的控制,例如 leader 可以讀寫所有 branch,而成員只能讀取 master,以及讀寫自己所屬的 branch 等等。若需要進階的權限控制可以詢問你的 gitolite 管理員。

範例

@team = alice bob

repo @all ### 所有 repo
    R = boss ### 老闆都可以看
repo project
    R master$ = crboy @team
    RW+ master$ = crboy
    RW dev$ = crboy @team

存取 repository

由 gitolite 建立的 repo link 比較單純,不須加上路徑,如下:
<git_user>@<host_address>:<repo_name>
以上面的例子而言,即為:
[email protected]:project (通常的狀況下不會是 localhost,這部份就要自己變通了)
如果有照上面設定 ssh config 的話,可以寫:
gitserver:project
在這裡我們將 host alias 設定為 gitserver (按照前面的 ssh config 設定),冒號後面直接接上 repo 名稱即可。

將現有 repo 放到 gitolite 上

其實只是把 clone 空 repo 的動作省略,改為直接設定遠端 repo 位置而已
$ git remote add origin ssh://[email protected]:project
$ git push origin master

結語

其實基本上的 gitolite 使用並沒有什麼技巧,只要把 ssh key 準備好並設定一下,能夠順利 clone 回來的話就沒問題了。或也可以把現有 repo push 到 gitolite server 上面的空 repo 去,方式其實都大同小異。如果要學習 gitolite 的管理才比較需要 K 文件之類的。:)

2012年6月21日 星期四

Gitolite 設定與管理

首先,要使用跟管理 gitolite 一定得先會使用 git。下面就不贅述。

初次設定

對使用者而言,只要設定好 ssh host alias 即可。如果是 gitolite 管理者,還必須將 gitolite-admin 給 clone 下來,才能繼續後面設定的動作。
  1. 設定 ssh host alias
    $ vim ~/.ssh/config
    host gitolite  
        user git  
        hostname localhost  
        port 22  
        identityfile ~/.ssh/admin
    
    這個設定的重點是指定連線時使用特定的 identity file (private key),如此才能被 gitolite 認可為管理者 (gitolite 是看你用什麼 key 來決定你的身分)。記得 hostname 的部分要以自己的狀況更換成正確的主機位址。
  2. 取得管理 gitolite 的 repository
    $ git clone gitolite:gitolite-admin
    
    這個 repository 紀錄了所有 gitolite 的權限資料,包含所有 user 的 public key 與 repository 的存取權限設定。conf/gitolite.conf 中記載了所有專案的名稱以及每個 user 對專案的權限。而 keydir 中即為所有 user 的 keys。對 gitolite 的管理與設定都必須透過這個 repo 進行。

管理與設定 (參考資料)

新增使用者

只要將新使用者的 public key 放入 keydir 中並 add, commit, push 至 gitolite server 即可,檔名即為使用者的帳號。 假設現在使用者 someone 提供給我們 public key,我們要將他加入 gitolite 的使用者中:
$ cp /PATH/TO/someone.pub keypair/someone.pub
$ git add keypair/someone.pub
$ git commit -m "Add user someone"
$ git push origin master
完成以上步驟後,someone 就可以利用他的 private key 來存取 server 上的 repos。如果他嘗試直接使用 ssh 登入時,畫面會列出他有權限存取的 repo,以及相對應的權限等級,並立刻結束連線。(這是 gitolite-shell 提供的功能) 下面是舉例:
$ ssh gitolite # 這是我在 ~/.ssh/config 中設定的 host 名稱
PTY allocation request failed on channel 0
hello admin, this is [email protected] running gitolite3 v3.01-14-gbc3eb34 on git 1.7.9.5

 R W    gitolite-admin
 R W    testing
Connection to localhost closed.
可以看到那個 admin 就是我們在 gitolite 中的虛擬帳號。再次提醒,gitolite 是根據你使用的 key 決定你的身分,如果你用了別把 key 那就會被認為是別的身分。萬一你用的 key 是不能通過的,那 ssh 會提示輸入密碼。為了安全性考量,可以禁止 git 帳號透過密碼登入。

新增專案 repository

修改 conf/gitolite.conf 即可新增或移除專案,並可以設定群組,方便管理。
repo    gitolite-admin
        RW+ = admin

repo    testing
        RW+ = @all
gitolite 預設了兩個 repo,一個就是我們正在使用的 gitolite-admin,另一個是 testing。repo 底下的則是該 repo 的權限設定。以此範例而言,gitolite-admin 僅有 admin 有權限存取,而 testing 則是所有人都可以存取。(由於 @ 開頭的表示群組,@all 應該是 gitolite 預設的群組)
值得注意的是,即使是 gitolite 的管理者,如果他沒有被加入 repo 的話,也是沒有權限存取的。同時也因為設定檔是經由 git 管理,管理者如果想要偷看別人的 repo,也很難完全隱匿 (有 log)。另外,如果管理者把自己的權限給拿掉的話,那就.....(但是還是可以登入主機去修理的,作法很簡單)

指定群組

可以透過 @ 來指定群組,群組中也可以包含群組,如下
@project1 = alice bob
@project2 = crboy dean
@company = boss @project1 @project2
repo 也可以組成群組
@system = proj1 proj2 proj3
repo    @system
        RW+ = boss

repo 名稱

repo 的名稱可能是一個明確的名稱:
repo some_project
也可能用正規表示法 (regular expression) 表示:
repo team/.+$
結尾加上 $ 符號是為了確保系統將這個名稱認定為正規表示式,避免誤判。 關於 repo 名稱比較複雜,進階設定方式可參考這裡

權限控制

權限控制的語法為 (我用了類似正規表示法的寫法)
<權限> [<引用>]* = [<user>]+
可用的權限有:C, R, RW, RW+, RWC, RW+C, RWD, RW+D, RWCD, RW+CD (這是從 gitolite 給的 vim syntax 裡面挖出來的),還有一個 -,說明如下
  • R 讀取
  • W 寫入或建立新的 refs (branches, tags)
  • + 刪除或改變 refs (允許 push -f)
  • - 拒絕存取 (可用以明確拒絕使用者存取此 repo,須寫在 R 權限之前)
C 和 D 是比較特別的權限
  • C (獨立) 僅用於使用正規表示法的 repo,表示可建立符合該正規表示法的 repo 名稱
  • C (組合) 僅用於使用正規表示法的 refs,表示可建立符合該正規表示法的 refs 名稱
  • D 僅用於使用正規表示法的 refs,表示可刪除符合該正規表示法的 refs 名稱

完整範例

@team = alice bob ### user 群組
@system = proj1 proj2 proj3 ### repo 群組

repo @all                       ### 所有 repo
    R = boss                    ### 老闆都可以看
repo @system                    ### 前面定義過的 repos
    RW+ = crboy                 ### CrBoy 都可以讀寫
repo project                    ### 單一 repo
    RW+ master = crboy @team    ### 這些人可以讀寫與強制修改 master branch
    RWCD dev/ = @team           ### team 的人可以在 dev/ 開頭的 branch 底下任意操作
    RW+ release = crboy         ### 只有 CrBoy 可以更改 release branch
repo crboy/.+$                  ### crboy 目錄下的任意 repo
    C = crboy                   ### CrBoy 可以隨意創建
    RW+ = crboy                 ### 當然也可以隨意讀寫 (這行似乎不必要,因為創建的人就可以讀寫)

2012年6月20日 星期三

Gitolite ver.3 (g3) 安裝筆記

Gitolite 是一個持續開發中的 git server 專案,自 2009 年開始後,至今已經發展到第 3 版,作者將其稱之為 g3 (之前的版本分別為 g1 與 g2)。由於 g3 相對於之前的版本,是整個重寫的專案,根據紀錄,g3 是大約今年 4 月才開始的,所以很多文件早已過時,只好慢慢研究作者提供的文件。整個專案都放在 github 上,並且作者也提供了相關文件,本文就是參考該文件寫成。
我的操作環境是:
  • Ubuntu 12.04
  • Git version 1.7.9.5
  • Perl 5.14
本文章假設使用者已經具備 git 的基本知識與操作技能,以及基本的 ssh 認知,不再贅述。

準備步驟

  • 伺服器上須先預備好以下套件
    • Git 1.6.6 以上
    • Perl 5.8.8 以上
    • OpenSSH
  • 產生管理者的 ssh key (此 key 將專門提供給 gitolite 管理者使用)
    $ ssh-keygen -t rsa -f <key_filename>
    
    舉例:
    $ ssh-keygen -t rsa -f ~/admin
    
    會產生 ~/admin~/admin.pub 兩個檔案,分別是 private key 與 public key。
    此時會提示輸入 passphrase。passphrase 是用來加密 private key 的密碼,避免 private key 被竊時造成的安全性風險。每次 push/pull 的時候需要輸入 passphrase,可以配合 ssh-add (Linux) 或 Pageant (Windows) 來避免每次都要打 passphrase。
    這邊注意所使用的 <key_filename> 就是 gitolite 管理者 (非主機管理者也非 git 帳號管理者) 所使用的虛擬帳號。
  • 建立 git 專用帳號 (我使用 git 而非有些人慣用的 gitolite)
    # adduser --system git --shell "/bin/bash"
    
    必須給予 git 帳號一個可以執行 command 的 shell,但可放心所有 gitolite user 都只是虛擬帳號,他們會被導向到 gitolite-shell 這個 gitolite 提供的指令去,無法真的登入。
    以下未特別註明的,皆會使用 git 帳號作為 $ 的擁有者。

安裝步驟 (未註明 # 的皆使用 git 帳號)

  1. 取得 gitolite 套件
    $ git clone git://github.com/sitaramc/gitolite.git
    
  2. 安裝 gitolite 於家目錄下 (其實只是做個 soft link 過去)
    $ mkdir -p ~/bin
    $ gitolite/install -ln
    
    記得把 $HOME/bin 加入 $PATH 中。
    或是也可以用複製的方式安裝到其他系統目錄下 (以 /usr/share/gitolite 為例)
    # mkdir -p /usr/share/gitolite
    # gitolite/install -to /usr/share/gitolite
    
  3. 設置 gitolite
    $ gitolite setup -pk admin.pub # 這裡的 admin.pub 就是之前產生的管理者公鑰
    
    這表示 admin.pub 這把公鑰所對應的私鑰擁有者就是 gitolite 的管理者,同時管理者的虛擬帳號即為 admin。 另外,如果 ~/.ssh 底下的 authorized_keys 已經有相同的 public key 的話,會出現 FATAL error:「admin.pub maps to shell access, not admin.」由於 gitolite 透過使用的 key 來決定使用者是不是管理者,故不可以使用本來已可連線取得 shell 的 key。

安全性

  • 實際使用 gitolite 後,會發現 ~git/.ssh/authorized_keys 這個檔案被加入一些東西,像是這樣
    # gitolite start
    command="/usr/share/gitolite/./gl-auth-command admin",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <很長一串 public key> <description>
    command="/usr/share/gitolite/./gl-auth-command someone",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ssh-rsa <很長一串 public key> <description>
    # gitolite end
    
    前面加上的那個稱為 ssh forced command,可以限制 user 登入後執行的 command。也就是說,gitolite 在使用時,並沒有啟動 daemon,而是透過 ssh 連線,並轉介到 gl-auth-command 進行動作的。
  • gitolite 在運作時,使用的都是 git 這個帳號 (以我的例子而言),如果對安全性有很高的要求,可以盡量限縮這個帳號的權限。不過還是得給他一個 shell 使用就是了,我試過將 shell 改成 /bin/false/usr/sbin/nologin,結果操作就失敗了orz
  • 預設狀況下,透過 gl-setup 產生的 repository 與其他相關檔案,權限都是 700。也就是說,即使主機上有其他的使用者,如果他沒有管理者權限 (或是 sudo 權限) 的話,也無法存取到那些受 gitolite 管轄的 repository。
  • 管理者在進行設定時,最好確認使用者提供的 key 是否正確,可透過
    $ ssh-keygen -lf <pubkey_file>
    
    來獲得 public key 的 fingerprint,並以其他管道與使用者對照確認,避免惡意攻擊。

總結

整體弄起來,覺得 g3 在管理設定上,還有使用上都跟 g2 沒有什麼差別,只是安裝上不一樣就是了。不過由於是 perl 程式,其實安裝上還滿容易的,一開始不了解架構的話容易撞牆而已。

2012年6月18日 星期一

Gitolite 2.2 安裝筆記

特別注意 - 為什麼標題要特別註明是 Gitolite 2.2?因為文章已經寫好之後才發現作者已經大幅更新版本。新版有文件在此。本文是以 ubuntu 12.04 套件庫中的 gitolite 2.2 作為安裝目標。
Gitolite 是一個持續開發中的 git server 套件,本來還在糾結要玩 gitolite 或是 gitosis,決定兩個都嘗試看看後,發現本來打算先嘗試的 gitosis 很難找到來源,唯一找到的是原作者(吧)在 github 上的 repo,已經有 3 年沒更新了,於是決定直接嘗試 gitolite。搜尋了一下發現,原來 gitolite 是作者從 gitosis 的想法發展而來,本來是 gitosis + lite,但現在已經發展得比 gitosis 還強大了。而且從 gitolite 作者的 github repo 發現,上次更新是一週前,這表示它現在還是一個活躍且成長中的專案,當然就決定是他了! (但其實後來才發現上次更新的是第 3 版,第 2 版現在只會修 bug 而已)
我的安裝過程主要是參考 Tsung's Blog 的這篇文章而成,但不曉得原因為何,我這邊碰到的狀況跟作者不太一樣,我想也許是他使用的是 Debian (?) 或者他用 Ubuntu 但是版本跟我不同吧。我還另外參考了這篇文章,裡面寫的東西滿豐富的。同時這裡也附上作者提供的文件
我的操作環境是:
  • Ubuntu 12.04
  • Git version 1.7.9.5
  • Gitolite version: 2.2-1
本文章假設使用者已經具備 git 的基本知識與操作技能,不再贅述。另外如果是大部分其他系統的管理者,可能不習慣用 sudo,那麼就先切換到 root 再去執行動作即可。這邊為了保險起見,還是使用一般帳號進行設定。

操作步驟

  1. 安裝 gitolite 套件
    $ sudo apt-get install gitolite
    
    此時可能會同時需要你安裝 openssh-serverssh-import-id。另外在這個時候,除了 /usr/share/gitolite/usr/share/doc/gitolite 還有兩個 vim 用的 syntax 跟 indent 檔案以外,系統還沒被裝上任何東西,所以這時候 /etc 底下沒有設定檔,查詢 /etc/passwd 也沒有 gitolite 這個帳號...orz 總而言之,在這裡我們必須自力更生!
    • 這邊如果不是用 Debian/Ubuntu,或是想要取得最新版本,或是有其他考量的話,可以直接從作者的 repo 抓:
      $ git clone https://github.com/sitaramc/gitolite.git
      $ cd gitolite
      $ git checkout g2
      $ sudo cp -r src /opt/gitolite && sudo ln -s /opt/gitolite /usr/share/gitolite
      
      由於作者已經更新他的 master 為 g3 版本,所以我們必須抓出 g2 branch 再行複製。
  2. 建立 git 專用帳號 (我使用 git 而非 gitolite)
    $ sudo adduser --system git --shell "/bin/bash"
    
    必須給予 git 帳號一個可以執行 command 的 shell,但可放心所有 gitolite user 都會被導向到 gl-auth-command 這個 gitolite 提供的指令去,無法真的登入。
  3. 將 gitolite 安裝至系統目錄
    $ sudo gl-system-install
    
    其中已包含預設路徑,若要修改預設路徑可加上 -h 參數獲得相關資訊。若以一般使用者權限進行安裝,則會將程式路徑設定在使用者家目錄下。
  4. 產生管理者的 ssh key (此 key 將專門提供給 gitolite 管理者使用)
    $ ssh-keygen -t rsa -f <key_filename>
    
    舉例:
    $ ssh-keygen -t rsa -f ~/admin
    
    會產生 ~/admin~/admin.pub 兩個檔案,分別是 private key 與 public key。
    建議不輸入 passphrase,這樣每次 push/pull 的時候才不需要輸入 passphrase。但如果相當注重安全性的話當然還是可以輸入的。(當然也可以配合 ssh-add 來避免每次都要打 passphrase)
  5. 設置 gitolite (須使用 git 帳號)
    $ /usr/share/gitolite/gl-setup /PATH/TO/admin.pub
    The default settings in the rc file (/home/git/.gitolite.rc) are fine for most
    people but if you wish to make any changes, you can do so now.
    
    
    hit enter...
    creating gitolite-admin...
    Initialized empty Git repository in /home/git/repositories/gitolite-admin.git/
    creating testing...
    Initialized empty Git repository in /home/git/repositories/testing.git/
    [master (root-commit) 104e5b2] start
     2 files changed, 6 insertions(+)
     create mode 100644 conf/gitolite.conf
     create mode 100644 keydir/admin.pub
    
    這表示 admin.pub 這把公鑰所對應的私鑰擁有者就是 gitolite 的管理者,同時管理者的帳號即為 admin。 另外,如果 ~/.ssh 底下的 authorized_keys 已經有相同的 public key 的話,會出現 FATAL error:「admin.pub maps to shell access, not admin.」由於 gitolite 透過使用的 key 來決定使用者是不是管理者,故不可以使用本來已可連線取得 shell 的 key。
安裝完畢!關於管理跟使用的部分將另外撰寫。

2012年6月15日 星期五

PHP Informix on Linux 安裝與設定

環境
  • Ubuntu 12.04 LTS
  • Apache 2.2.22
  • PHP 5.3.10
如果沒有 apache 與 php 環境可由套件庫安裝
$ sudo apt-get install apache2 php5
為了編譯模組,需要安裝 php5-dev
$ sudo apt-get install php5-dev
為了取得 PECL 上的原始碼,需要安裝 subversion (即 SVN)
$ sudo apt-get install subversion

安裝 Informix Client SDK

這個連結可以下載 Informix Developer Edition,有免費的版本,但僅供開發使用且有使用資源上的限制。我抓下來的檔案為 iif.11.70.UC5DE.Linux-RHEL5.tar。其實根據 [Install Informix on Debian] 這篇文章看來,應該是有單純的 ClientSDK 可以下載,但是我找不到...
將其解開
$ cd && mkdir informix && cd informix
$ tar -xf /PATH/TO/iif.11.70.UC5DE.Linux-RHEL5.tar
建立 informix 帳號與群組
$ sudo addgroup --system informix
$ sudo adduser --system informix --ingroup informix
開始安裝
$ sudo ./ids_install # 官方文件是要我們加上 `-i gui` 以圖形模式安裝,亦可
    #這中間的訊息會出現下面這一行疑似錯誤的訊息,但是不影響後面動作
strings: '/lib/libc.so.6': No such file
在安裝過程中,多數設定都用預設值,但安裝目錄預設為 /opt/IBM/informix,我改為 /opt/informix 了。另外,可以自訂想安裝的模組,由於我不需要自行架設 server,所以這邊我只留下 IBM Informix Client SDK 與 Global Language Support (GLS) 中的 Chinese,其他全都取消了。
最後設定環境變數供後續安裝使用
export INFORMIXDIR=/opt/informix

安裝 PHP Informix 模組

$ cd && mkdir php_informix && cd php_informix
取得 php informix 的原始碼
$ svn checkout http://svn.php.net/repository/pecl/informix/trunk/
進行建置
$ cd trunk
$ phpize --with-php-config=`which php-config`
$ ./configure --with-php-config=`which php-config`
停!這邊有個問題需要處理....在產生出來的 Makefile 的第 16 行有個這樣的敘述
INFORMIX_SHARED_LIBADD = -Wl,-rpath,/opt/informix/lib/esql -L/opt/informix/lib/esql -Wl,-rpath,/opt/informix/lib -L/opt/informix/lib -lifsql -lifasf -lifgen -lifos -lifgls -lnetstub -ldl -lcrypt -lifglx
我們必須手動給他加點參數才能讓後續執行動作正常,在後面加上 /opt/IBM/lib/esql/checkapi.o
INFORMIX_SHARED_LIBADD = -Wl,-rpath,/opt/informix/lib/esql -L/opt/informix/lib/esql -Wl,-rpath,/opt/informix/lib -L/opt/informix/lib -lifsql -lifasf -lifgen -lifos -lifgls -lnetstub -ldl -lcrypt -lifglx /opt/informix/lib/esql/checkapi.o
開始編譯與安裝
$ make
$ sudo make install
Installing shared extensions:     /usr/lib/php5/20090626+lfs/
每個人的安裝位置可能不同,以我這裡為例,我的安裝位置是在 /usr/lib/php5/20090626+lfs/ (後續設定會用到)。

設定

新增以下資料至相對應的設定檔中
/etc/php5/conf.d/informix.ini
extension=/usr/lib/php5/20090626+lfs/informix.so
/opt/informix/etc/sqlhosts (偷參考的設定的 nettype 是用 tli,但我測試需用 soc 才能正常連線)
<db_server>     <nettype>       <hostname>      <service>
/etc/hosts
<IP>    <hostname>
/etc/services
<service>   <port_num>/tcp
/etc/apache2/envvars (聽說在 RedHat 上為 /etc/sysconfig/httpd)
export INFORMIXDIR=/opt/informix
export INFORMIXSERVER=<hostname>
有可能需要做 locale 的設定
export DB_LOCALE=zh_TW.big5
export CLIENT_LOCALE=zh_TW.big5
重新啟動 apache
$ sudo service apache2 restart
設定完後可在 phpinfo 中看到 Informix 的區段,以及在 Environment 區段可以看到我們設定的環境變數。

測試用 script

這個程式僅供參考用,也可以使用本來可執行的程式進行測試。要注意的是如果使用 php command 進行測試的話,要設定環境變數。(如 /etc/apache2/envvars 中新增的設定)
<?php
$db = ifx_connect("[email protected]", "USERNAME", "PASSWORD");
var_dump($db);
?>
若可成功連結即表示安裝與設定成功

參考連結

2012年6月12日 星期二

Xdebug 基礎安裝與使用

環境

  • Ubuntu 12.04 LTS
  • Apache 2.2.22
  • PHP 5.3.10

安裝

透過套件庫安裝

$ sudo apt-get install php5-xdebug

設定

/etc/php5/conf.d/xdebug.ini

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so

xdebug.auto_trace = on  #自動進行 function trace
xdebug.trace_output_dir = /tmp/xdebug   #trace log 的位置
xdebug.collect_params = 3   #設定顯示參數內容

xdebug.profiler_enable = on #啟用 profiler
xdebug.profiler_output_dir = /tmp/xdebug    #profile log 的位置

建立記錄檔所需目錄

$ mkdir /tmp/xdebug && chmod 777 /tmp/xdebug

使用

每當你執行 php 的時候 (不管是透過 apache 或是用 command line 執行),會在 /tmp/xdebug 底下產生 log 檔。trace.*.xt 是 function trace 的 log,而 cachegrind.out.* 則是 profiler 的 log。

trace log 比較容易閱讀,可以直接開起來閱讀。至於 profile log 可以透過一些工具的輔助來進行統計,如 KCacheGrind (Windows版)、WinCacheGrind、或是 WebGrind 等等。

參考資料

2012年6月9日 星期六

明天,我們空中再見

延續上一篇...嗨,我來看你們了。

週三看的戲,到了現在才寫文章...哈,其實今天心情不佳,想說寫寫文章沈澱一下自己。前幾天也許真的壓力太大了吧....

這天我早早下班,直奔成功廳大門,雖然不意外,但是現場竟然已經有 10 個人左右在排隊了...才 5:15 耶,這群人都是瘋子....然後我加入了這群瘋子,開始等XD 到了 6 點多,開始發放「限量月亮版海報」,果然啊....第一天發太陽第二天發月亮,真是太奸詐了!!! 讓我很意外的是,竟然發生跟前一天一樣的狀況,延後入場時間。我還以為會碰到的突發狀況前一天都先撞過了...沒想到....看來他們對場地的掌握度還是不足,以後如果還要在成功廳演出的話,要更注意場地問題唷!

進場後,先是發了呆,後來發現一個很重要的改進,前一天太亮的「緊急出口」標示被遮起來了,變得雖然能夠看到,但光線不會照亮台上。雖然說遮起來這樣好像不太好,但是這是成功廳的問題吧= = 這標示做這麼亮也太詭異[email protected]@

開場後,發現依然有些微黑臉的狀況,不過燈光是由上往下打的,無法避免。也許在前方放置反光板可以幫忙打光?不曉得有沒有人這樣做....要不然就要請演員注意頭不能太低了....這是舞台方面的東西,我不太懂,我想也許有專業的人知道要怎麼辦吧?

該來爆雷談談內容了...這部戲「明天我們空中再見」把時間軸切的很亂,讓人很難迅速組織起來。每次提到劇名就會想到一件事,這部戲到底干「明天我們空中再見」什麼事啊...= = 除了開頭跟結尾的廣播內容,還有女主角是個播音員以外...我實在找不出為什麼要用這個當名稱啊...果然是藝術...XD

簡介一下故事,也順便可以審視一下我對於故事的理解是否正確。一開始的時間是「現在」,女播音員文媛到了 40 樓高的地方,看著風景,突然就失憶了,所以故事回到過去.....

2012年6月6日 星期三

面劇團 - 「明天我們空中再見」首演

嘛...實在覺得自己越來越不會寫文章了 >"< 各位讀者敬請見諒...就當這只是小弟心中的碎碎念好了~~

一如往常的,又在看完面劇團的演出後回家寫 blog 了...會像是個回家作業嗎?或是變成一種形式嗎?至少我不這麼認為...我是相當願意把心裡的想法,無論好壞、褒貶都寫出來給所有朋友們,還有所有面劇團的團員們看的。每次結束後總聽你們說「謝謝來看戲!」那我想說「謝謝來看文!」:P 噢對了,還有就是那張問卷這麼大張,哪有空寫這麼多字啊= = 而且根本沒有「背面空白處」嘛= =

好啦,來聊聊今天的心得,不過因為明天還有一場,所以今天不爆雷、不破梗!

排隊的時候啊,等啊等啊等的,延後了好久才進場,中間還兩度有工作人員出來說明會延後進場,還有鞠躬道歉耶@@ 辛苦了~我相信這不是你們的問題。另外還有發海報,我是回家才打開的,我拿到的是太陽....嗯.....我其實在猜會不會第一天拿到的都是太陽而第二天拿到的都是月亮呢?:P 明天就知道囉~

揭幕的時候啊,相當令人驚訝的是,那個佈景啊...沒想到這次的演出竟然搭了一個這麼大的景!(不能說不能說不能說啊....) 接著嘛...就是好戲上演了~

內容的部份說好不提的,留到明天再說。

但這次我看到三位認識的演員都在挑戰自我,做出改變啊!從清純小資女孩變身為火辣女人,從憨厚警員/學生變身為地痞流氓,還有從性感熟女變成拾荒老婦又變成傻小妹...這絕對是演技上的一大挑戰,對認識他們的觀眾們,也絕對是相當大的震撼。

還有舞台表演上,這次加上了很特別的元素,一開始有點疑惑,但其實我還滿喜歡的!:D 雖然沒有很強調,但我認為用這個元素所表現的內容,是一個相當值得思考的議題。人與人之間的距離、面對他人的每一張臉、面具下的真實又是什麼樣子?另外也很特別的是.....是.....不能說不能說不能說...XD 很妙,用這樣的方法去表現這個橋段!不曉得是從哪邊學的?或是團員們自己發想的呢?酷~!!

劇本部分,其實不是很好理解,時間軸相當破碎,所以因果跟時空關係需要好好思索,但我想明天應該就會看懂了!舞台設計部分,我覺得很有趣,很巧妙的設計,這個部分其實沒有什麼特別的想法,但因為我坐在面對舞台的左側,所以電梯那一幕的男播音員的臉就這樣被擋住了...我想也許往前站一點會比較好。另外也是跟臉有關係的,就是燈光的部份。有好幾個場景的燈光,照下來讓演員有很明顯的黑臉...我個人認為這應該不是故意營造的效果,也許是受限於場地吧,如果可以針對這個部分調整一下我想演出會更完美!

另外,看戲的時候一直有種感覺,似乎劇團對這個場地還有用到的道具都不是很熟悉?大道具的動作也一定沒有多試幾次,還有門.....(嘆) 是不是因為成功廳不容易借用,所以很難有機會用正式的場地跟道具彩排呢?我不敢肯定,但若是這樣的話,我想對於演出的品質會是一個很大的傷害。雖然我只是一介草民,但是之前也略有耳聞外面的團體會在正式演出場地做很多次的排練,以期讓演出達到最好的效果。如果可以的話,也希望面劇團未來能夠多多在成功廳排練囉!我想面劇團是成大之寶,學校會很樂意提供協助的!(吧?)

其實心裡還有好多東西跟想法....可是....呃.....好啦我想睡覺了XD 其他留到明天一起講好了~~

2012年6月4日 星期一

期待面劇團「明天我們空中再見」

過了大概半年吧,又可以看到面劇團的演出了!:D

面劇團 (Face To Audience, FTA) 是成大學生自己組成的一個劇團,最初是由一群修「表演藝術概論」通識的學生聚在一起所組成的。過去曾經舉行過兩場公演,每場各有兩個場次。地點都在成大的鳳凰樹劇場。

雖然我不是面劇團的團員,也跟裡面的團員一個都不認識,但過去的「四」個演出場次恰好我都參與到了!說來實在是緣份,最初不過是看到學校寄來的信,幫忙宣傳了面劇團的演出,那是第一場的「影痴謀殺」,而他的介紹文案相當的吸引我。雖然到了現在,我已經忘記當時為什麼會被文案吸引,但我還清楚的記得看戲的感動,還有結束後心中幫他們打了一百分滿分的評價!

隔天,我又傻傻的跑去排隊...也不曉得是為了什麼,但就很想再看一次,再好好品嚐他們的演出。對了,說到排隊...因為事前也不曉得要索票還是什麼的,反正我就相當懶惰,所以過去的四場演出,我都是當天提早到達現場排隊,等到開演前五分鐘才能依序入場的。不過,我還記得我運氣相當好,每次都坐到不錯的位置,都在中間靠前面耶!一定是我平常有做好事的關係。噢,然後那天有去找其中兩位演員拍照 :P,正妹小萍跟型男小張,開口的時候我整個超尷尬的XD

隔了半年,面劇團帶來「一躍之下,」作為校慶賀歲(?)演出。呃...因為擔心太過熱門,所以很早 (超級早) 就去排隊了,相當尷尬的排了一個第一名...記得當天不但下雨,而且稍早有另一場活動在那個場地舉辦,所以整個相當狼狽,又找不到地方可以等待。直到面劇團的團員開始佈置,我才終於有地板可以坐XD

「一躍之下,」我相當喜歡,也許除了演出以外,對於劇本也多了一份親切感吧。故事是以成大為出發點,描述男主角阿堂因為辛酸都往肚子裡吞,被教授冷嘲熱諷,還無法如期畢業,種種的壓力下,他選擇了...從電機系的天井向下墜落。看戲當時的我,也是一個延畢中的研究生,也常常假裝堅強,戴著面具面對這個世界。這個故事,相當令人鼻酸。我到現在依然無法忘懷劇中那句台詞:「我以為我可以讓他們後悔,沒想到最後悔的,是我自己。」 (哭)

後來不久,有段小插曲。某天去買水餃之家,當天很多人,我要外帶,當我站在那裡等的時候,發現旁邊有一桌的男女相當眼熟!竟然是....正妹小萍跟型男小張!!!噢,其實我一直都記得他們兩個的名字,但是擔心被當成變態,我就當做不記得了。當時鼓起勇氣去跟他們打招呼,首先偽裝成粉絲問「請問你們是面劇團的團員嗎?」『呃....是.....』「我有看過你們的演出~」天啊太尷尬的開場白了XD 沒想到後來提到我有在部落格寫他們的文章,竟然戳中小張的驚訝點 (我的意思是,讓他相當驚訝),原來他們不只是曾經回覆過而已,竟然還記得我,真害羞 >////< 啊,對了,他們不是兩個人去吃,還有第三位同學。但是...呃...嗯....哈哈.....我認不得他 orz

其實說實在話,我並沒有一直持續追著面劇團的消息,但是緣份讓我們碰在一起(?)。這次面劇團有公演的消息其實我是在網路索票當天早上才知道的,這次我終於可以不用再很可憐的排隊了啊!!!


雖然說去取票的時候一直很擔心會不會被白眼說「面劇團的票已經有夠難搶了你還索這麼多,是不是要拿票去賣啊?」不過還好沒事啦....XD 好歹我以前都是兩場都去的,這次去兩場過份嗎?XDDD 現在相當期待明後兩天的演出啊~我其實也不知道該用怎樣的心情去面對,畢竟如果對一樣事物抱著相當高的期待,即使這樣事物已經相當棒了,心中的評價依然會減分...但是,我知道面劇團相當優秀啊!而且他們也很努力...真矛盾 orz。無論如何,我相信他們會再一次帶來很棒的演出。 :)

「明天我們空中再見」的演出時間是 6/5, 6/6,晚上 7:00,地點在成大光復校區成功廳,如果你正在閱讀這篇文章,如果你也對面劇團很感興趣,建議你可以來看唷!嗯...我知道你沒有票,但你只要跟我一樣有不屈不撓的精神,當天早點來現場排隊,相信你一定可以成功入場的XD




.......唉,也許未來就沒機會看到面劇團的演出了... :( 等到離開了成大,不要說有沒有收到消息,就算收到了消息,也沒有權限索票了。當完兵後,勢必得去工作,好像也很難排隊.....嗯,總之怎麼想都不可能 (攤手) 就把這兩天的演出,當做是對面劇團留下一個最美好的回憶吧...

2012年5月31日 星期四

PHP imagettftext() could not read font

今天撞牆撞很大....由於手邊在碰的一個專案裡面需要產生類似驗證碼的圖片,他用了 imagecreate(), imagettftext(), imagesetpixel() 這些 PHP functions。聽說這支程式「曾經」是可以 work 的,不過在我手上就不 work,為了證明不是人品問題,一定要把這個 bug 修掉!
一開始我傻傻的在程式碼裡面翻找,但這樣實在太沒效率了,身為一個專業的....呃...雜工,一定要懂得善用工具!所以我用了..... command line php.....
$ php image.php > /dev/null
對啦,只不過是測試環境從 apache 換到 command line 底下了,這樣是有比較強嗎?有喔~因為我的測試環境有裝 xdebug,只要有 enable 就可以在 command line 底下看到 debugging messages,不用特別打開 stack trace。至於最後面把 standard output 導向 /dev/null 是為了不想看到他輸出的那張不完整的圖,那會干擾畫面。
首先第一步,我忘記詳細的訊息了,大意是說 imagecreate() is undefined 等等,這時候當然要去找找這函式有沒有需要什麼相依的 library 啊!找了一下發現,這些函式是由 PHP 的 GD module 所提供的,所以我迅速的安裝了 GD 模組...
$ sudo apt-get install php5-gd
接著,才是重頭戲的開始....

2012年5月30日 星期三

對 Vim 啟動過程做效能分析

昨天在噗浪上看到有趣的分享,是一篇 StackOverflow 上的文章:Profiling vim startup time
其實講的東西相當單純,就是 vim 提供了 --startuptime 選項,後面接上 log 檔的檔名,他會幫你把啟動過程中每個部份所花的時間都記錄下來,有個別時間也有累計時間。例如:

$ vim --startuptime vim.log
然後就可以看 vim.log 的內容來了解自己啟動 vim 的時候在哪個部分花最多時間囉。對於 vim plugin 裝很多又想瘦身的朋友應該很實用。:)

嗯.....身為一個程式語言 (vim script) 的 interpreter....果然會出現這種東西XD

2012年5月25日 星期五

Git on Windows 安裝筆記

Git 是一套很棒的分散式版本控制系統。不過由於它一直是在 Linux 上生長的,對於在 Windows 上使用來說其實稍嫌麻煩。在網路上搜尋通常會找到 Git for windows 跟 msysGit 這兩個不同的名詞,我過去一直沒辦法很清楚的把他們兩者區分開來。根據 msysgit 在 github 上的首頁StackOverflow 上的討論,我目前的理解是,msysGit 就是 msys + Git 的完整環境,包含了 build 程式用的 toolchain,同時他的執行檔是直接在 user (或者該說是 developer) 的機器上 compile 出來的,使用者隨時可以透過 git pull 取得最新版的 msysGit 來編譯,算是給 git 開發者用的。而 Git for Windows 可說是 msysGit 的「產出」,是預先 compile 好的 git.exe 還有其他執行檔們...其中只包含了基本的 msys 環境、有 bash、ssh、甚至 Git GUI 等工具,但是沒有 toolchain,適合 git 使用者安裝。
另外還可能會找到一個更有名的東西,稱為 TortoiseGit,這是知名專案 TortoiseSVN 的相關專案,顧名思義,就是烏龜殼包了 Git 啦!要注意的是,他只是一個 Git frontend,需要指定相關執行檔 (如 git.exe) 的位置才能工作。特別的是,他本身附帶了 PuTTY 的 ssh client (plink.exe),讓使用者可以透過比較符合 windows 使用習慣的方式來使用 ssh,如果不是很熟 linux 或是 GUI 狂熱份子可能會比較喜歡。XD
註:知名專案 cygwin 也可以安裝 git 並在 command line 下使用,但對於沒在使用 cygwin 的使用者而言麻煩得多,故此處不介紹。
這篇文章分成三個部分:首先介紹 Git for Windows (免 compile 的那個) 的安裝,接著是 msysGit (需要 compile 的那個) 的安裝,最後會介紹 TortoiseGit 的安裝,並以一個簡單的 git clone 作為結束。如果是一般單純想在 windows 上用 git 的人,可以只看第一跟第三部分即可,第二部分就當作參考資料吧!
另外報告一下我用的環境:
  • Windows 7 32bit
  • msysGit 1.7.10
  • TortoiseGit 1.7.9 32bit

2012年5月23日 星期三

「cannot open shared object file」的解決方案

有時候執行一些指令,會碰到下面這樣的訊息:

error while loading shared libraries: libiconv.so.2: cannot open shared object file: No such file or directory

在這個例子中,我們的程式找不到 libiconv.so.2 這個 dynamic library。那麼應該怎麼解決呢?

首先必須找到系統中的 libiconv.so.2,下面四條指令選一條作就好:

$ locate libiconv.so.2
$ whereis libiconv.so.2
$ find /usr /lib -name libiconv.so.2
$ find / -name libiconv.so.2 2>/dev/null

這時候就可以找出函式庫位置,例如:

/usr/local/lib/libiconv.so

萬一沒有找出來的話,就要自行安裝了。這篇文章有教該如何安裝 libiconv,如果是其他函式庫的話可以自行變通。

找到位置之後,應該怎麼做呢?如果我們有 root 權限的話,可以把函式庫所在路徑寫入 /etc/ld.so.conf,再重新產生 ld 的 cache 即可,如下:

# echo "/usr/local/lib" >> /etc/ld.so.conf # 注意! 要用 >> 而非 >!
# ldconfig

在某些系統中,/etc/ld.so.conf 可能會預設加上 include /etc/ld.so.conf.d/*.conf 這樣的敘述,那們我們也可以把路徑放在那個目錄下:

# echo "/usr/local/lib" >> /etc/ld.so.conf.d/usr_local_lib.conf
# ldconfig

這樣一來就可以讓程式順利搜尋到需要的 library 囉!

BUT!! 玩 Linux 最重要的就是這個 BUT!!

如果我們沒有 root 權限的話該怎麼辦呢?這時候只好很可憐的自己搞定了...如果需要自行編譯 library 的話,可以照著類似的步驟做,但是 prefix (也就是安裝位置) 要設定在自己的家目錄下,例如:

$ ./configure --prefix=$HOME/libiconv

但這邊假設系統中已經有 /usr/local/lib/libiconv.so.2 這個檔案,進行以下步驟:

$ echo "export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH" >> ~/.bashrc

原理很簡單,就是透過設定 LD_LIBRARY_PATH 來讓程式找得到需要的 library 檔案。修改後需要重新登入才會生效喔!

但是...基本上還是建議不要用後面這個方法啦,找你的系統管理員協助設定 /etc/ld.so.conf 才是好主意。這裡有篇文章:Why LD_LIBRARY_PATH is bad,專門在討論為什麼不要隨意使用 LD_LIBRARY_PATH

2012年5月18日 星期五

SSH 安全性設定筆記

以下收錄可增加 ssh 安全性的各種技巧,主要的修改都在 /etc/ssh/sshd_config 中,同時,修改設定後別忘了重新載入設定值或重新啟動 sshd。
  • 修改預設 port (可用多行開啟多個 port)
    Port <port>
    
  • 僅監聽特定 ip (適用於多網卡/多 IP 的情形)
    ListenAddress 192.168.1.10
    
  • 禁止 root 登入
    PermitRootlogin no
    
    管理者必須先以個人帳號登入,再 su 成 root,或利用 sudo 工作。
  • 禁止使用空密碼登入
    PermitEmptyPasswords no
    
  • 僅允許或拒絕特定帳號或群組登入
    AllowUsers <user1> <user2> <user3>
    AllowGroups <group>
    DenyUsers *
    DenyGroups no-ssh
    
    根據實驗,對於同一帳號而言,如果同時 Allow 跟 Deny 的話,結果會是 Deny 的。
  • 廢除密碼登錄,強迫使用 RSA/DSA 驗證
    RSAAuthentication yes
    PubkeyAuthentication yes
    AuthorizedKeysFile %h/.ssh/authorized_keys
    PasswordAuthentication no
    
    並確保 user 的 ~/.ssh 權限為 700,同時將該 user 的 public key 加入其 ~/.ssh/authorized_keys 中。Public key 的產生方式可搜尋 ssh-keygen
  • 僅允許 SSHv2
    Protocol 2
    
  • 限制特定使用者、群組、主機或位址的登入行為,這裡以限制 somebodyhandsomebody 不可使用密碼登入為例
    Match User somebody,handsomebody
    PasswordAuthentication no
    
    但是要怎麼結束 Match block 我只找到有資料說「In sshd_config, Match blocks must be located at the end of the file.」,如果真是這樣,那就只好認了。
  • 使用 TCP wrappers 限制來源 IP
    # vim /etc/hosts.deny
    sshd: ALL
    # vim /etc/hosts.allow
    sshd: 192.168.1 1.2.3.4 # 僅允許 192.168.1.* 與 1.2.3.4 連線
    
  • 使用 iptables 限制來源 IP
    # iptables -A INPUT -p tcp -m state --state NEW --source 1.2.3.4 --dport 22 -j ACCEPT
    # iptables -A INPUT -p tcp --dport 22 -j DROP
    
    設定會立即生效,若希望重開機後還能保存,需要手動儲存 iptables 的設定。
  • 時間鎖定 (這段直接引用並修改原作者的文字,有空再消化整理)
你可以使用不同的iptables參數來限制到SSH服務的連接,讓其在一個特定的時間範圍內可以連接,其他時間不能連接。你可以在下面的任何例子中使用 /second/minute/hour/day 開關。
第一個例子,如果一個用戶輸入了錯誤的密碼,鎖定一分鐘內不允許在訪問SSH服務,這樣每個用戶在一分鐘內只能嘗試一次登陸
  # iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
  # iptables -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP
第二個例子,設置iptables只允許主機193.180.177.13連接到SSH服務,在嘗試三次失敗登陸後,iptables允許該主機每分鐘嘗試一次登陸
  # iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT
  # iptables -A INPUT -p tcp -s 193.180.177.13 -m state --syn --state NEW --dport 22 -j DROP
  • 檢查相關檔案權限,不安全則不允許登入
    StrictModes yes
    
    某些相關檔案權限設定若有錯誤時,可能造成安全性風險。如使用者的 ~/.ssh/authorized_keys 權限若為 666,可能造成其他人可以盜用帳號。
  • 自訂使用者登入時顯示的 banner (話說這跟安全性有什麼關係...? 大概可以用社交方式嚇跑壞人吧...= =a)
    Banner /etc/ssh/banner # 任意文字檔
    
  • 限制 su/sudo 名單
    # vi /etc/pam.d/su
        auth       required     /lib/security/$ISA/pam_wheel.so use_uid
    # visudo
        %wheel  ALL = (ALL) ALL
    # gpasswd -a user1 wheel
    
  • 限制 ssh 使用者名單
    # vi /etc/pam.d/sshd
        auth required pam_listfile.so item=user sense=allow file=/etc/ssh_users onerr=fail
    # echo <username> >> /etc/ssh_users
    

參考文章列表

2012年4月8日 星期日

在 iPhone 上設定 Google 帳戶

今天來耍點小技巧衝文章數。

最近打算把一些我會的技巧什麼的....把它們整理起來並寫出來,未來想要查閱也比較方便。

恰好之前做過一份簡報,連結在此:當 Google 遇上 iPhone。雖然已經是 iOS5 的年代了,不過設定方式沒有差很多,大概就是畫面有點不同而已....所以就不更新了!

這份簡報的內容是關於怎麼在 iPhone 上加入你的 Google 帳號。這裡說的 Google 帳號可能是 Gmail (*@gmail.com) 或是 Google Apps (*@<your_domain>) 的帳戶。內容包含:
  • 收信
  • 同步行事曆(特別是帳號底下有多個行事曆的同步,預設狀況下只能同步一個行事曆)
  • 通訊錄
  • 工作表 (tasks)
這些都是我在 iPhone 上相當依賴的功能,雖然 iPhone 跟 Google 在通訊錄方面的整合上有點小問題,但是用起來還是相當方便的。

提供給有興趣的朋友使用 :P

2012年4月5日 星期四

C, C++ 中沒有 return 敘述的 main function

今天在噗浪上討論+研究了一個問題,這邊記錄一下,不然每次查完資料都會忘記= =
相關的討論在這則噗浪上,如果有興趣也可以去看。

我所研究的問題很簡單,「在 C/C++ 語言中,main function 不寫上 return statement 的話,會怎樣?」因為有些人會寫上 void main () 這種 prototype (我想有個原因是 Visual C++ 6.0 預設就這樣搞),或是有些人寫了 int main () 但是卻沒在 main function 中寫上 return 0; 或是 return EXIT_SUCCESS;。那麼,到底會不會出現問題呢?

2012年4月3日 星期二

如何設定 Gmail 帳戶收取 Google Apps 帳戶的信件

今天學弟在問,要怎麼在自己的 Gmail 信箱中,收取實驗室信箱的 e-mail。我們實驗室的 e-mail 本來是自己架設,不過現在已經轉換到 Google Apps 上去了。而 Google Apps 的帳號其實相當於另一個 Gmail 帳號,除非管理員設定不允許外部 POP3 與 IMAP,否則其實跟一般設定沒什麼兩樣。

設定這個可分為兩個部分:在要被收信的信箱開啟 POP3 功能,以及在要用來收信的信箱(通常是自己的 Gmail 帳號)設定收取 POP3 信件。

2012年4月2日 星期一

「那些老師沒教的事」簡報釋出

在緊張得半死的狀況中,終於把這個 talk 給講完了XD 希望來聽的人都有些收穫~

不過可惜的是,我太緊張了,所以有些東西講的不是很完整,甚至是漏講....orz 而且滿多東西好像....呃....有點臨場發揮....XD 希望不要讓人覺得太亂~


當日演講簡報可點選此處下載

2012年3月23日 星期五

透過 ssh 遠端存取 git repository

好,今天來寫個我架設「偽 - git server」的作法吧!

為什麼叫做「偽 - git server」呢?因為他不是真的跑起來一支 daemon 去負責 git 的 access,像是 gitolite 或是 gitosis 那樣。(事實上我也不知道該怎麼把那些東西架起來XD)
由於 git 可以透過 ssh protocol 來 access,當然要善用這點!

以下我分為單人各自使用與多人共用來講:

2012年3月17日 星期六

在 bash (zsh) script 中使用 trap

最近在跑分散式的程式,每次測試都要開好幾隻程式在跑。就算可以寫 script 自動開啟,還是會遇到一個很討厭的問題,沒辦法自動關閉那些屬於 worker 的程式。好像解釋的不太清楚....就是我希望在我程式跑完的時候,或是我把程式強迫終止的時候,我可以同時把好幾個 process 也 kill 掉。特別是強迫終止的時候,因為無論我在最後寫好什麼動作,一旦強迫終止就執行不到了。

於是上網尋找解法,找到了 trap 可以用。Trap 這東西,也就是陷阱...我想他的意思是,會讓你指定的那些 signal 掉入陷阱吧...(笑)。不曉得 signal 是什麼的請自行閱讀 manpage 或是上網找。

這裡提供兩個範例,第一個是測試 trap 功能的範例:
這個範例中,我指定 SIGTERM SIGINT SIGHUP 這三個 signal 會被 trap 抓住,而 trap 抓到後所要執行的指令為 "echo TRAP!!; exit"。注意這邊我加上了 exit 讓這個 script 會在接到 signal 的時候終止,否則它只會 echo 出 TRAP!! 後繼續執行它要執行的動作。如果你沒有另外指定別的離開方法,就必須乖乖的等待 script 執行完畢,或是用 kill -9 (送 SIGKILL) 才能終止它了...

再來是第二個範例:
這裡差不多是一個實際使用的 use case 了,參考自:這篇文章。把需要做清理的動作寫進 function 裡,以我最上面提到的情況就是把該關掉的 worker 程式都關掉,在這裡我就印出個 CLEAN UP!! 代替就好XD。然後在 trap 裡設定它負責清理,另外也在 script 正常結束前清理,這樣就可以保證(大概吧?)清理動作一定會被執行,除非是被 SIGKILL 強迫中斷。

對了...我實際在用的時候其實是用 zsh 啦,不過我試過了,用 bash 也可以正常執行沒有問題。我指的是 script 第一行指定的 shell,不是執行 script 的 shell 唷!

另外還有,我認為 clean_up 應該只要負責清理就好,所以最後小小修改,變成了這樣:
以上,請多多指教!<(_ _)>

2012年3月16日 星期五

Talk (March 29): 寫程式?那些老師沒教的事 - Code Smart; Don't Code Hard

這是確定的演講資訊了....多少人願意來就看我的造化了XD


「寫程式?那些老師沒教的事 - Code Smart, Don't Code Hard」

身為一個資工系的學生,經手過的 C 語言程式想必不少。而我們以前都是怎麼寫程式的呢?有沒有想過,也許寫程式這件事不用如此辛苦?在 C 語言的開發過程中,從撰寫、編譯、測試、除錯,中間碰到多少工具?俗話說「工欲善其事,必先利其器」,以往所用的工具是不是真的「夠利」呢?

如果是成大資工系的學生,想必大一都接受過一段慘痛(?)的日子。我們這些小大一,被壓著去用什麼 pietty 連上 server,還要開什麼 vi 來寫程式。「那是什麼東西?難用死了!」是很多人大一時的心聲。寫完之後還要打好多指令,像是「機西西」...呃,我是說 gcc,後面接上好多難懂的參數,才能把程式編譯完成。 但我一直到了大三才慢慢知道,這樣的環境才是 C 語言最快樂的地方,也要在這種環境下,我們才能很輕鬆的掌握 C 語言的全貌。噢,當然不是非要透過 putty/pietty 連上工作站才能使用到這類環境,在 windows 上一樣可以使用功能強大的命令列環境。(透過 cygwin/msys) 未來在外寫程式,仍然需要接觸這些東西的。

除此之外,有經驗的人都知道,我們要隨時備份寫好的程式碼。至少剛剛會動的那個版本要留下來,不然萬一改爛了可能會改不回來。你都怎麼做的呢?backup_01.zip, backup_02.zip, backup_03.zip, ...?跟同學合作 project 的時候,又是怎麼做的呢?「欸我傳給你了喔!」『你改了哪些地方啊?我 copy 不完啦!』
如果你有上述症狀,請立刻撥打下面這隻專線:
0987-987-987 (哩揪北七-揪北七-揪北七)

這場小小的分享,是我個人在學習克服上面這些問題時的心得。其實早就已經有很多好工具可以解決這些問題,端看我們懂不懂得使用。我會介紹到:vim、gcc、make、gdb、git
由於東西太多了,這天我只會做一個通盤的概論,介紹這些工具分別是做什麼用的,而我們又為什麼需要這些工具,以及這些工具可以帶來什麼好處。
歡迎完全沒有概念的朋友們來學習,也歡迎有一些概念的朋友們來一起研究,更歡迎相當有概念的朋友們來給小弟批評指教。鼓勵自行攜帶電腦現場實作!或是帶著你的問題來共同討論!希望可以達成演講50%、討論50%的目標!謝謝 <(_ _)>

時間:3月29日 晚上7:32
地點:成大資訊系館 4261 4263 教室 (地點更新,新教室僅在原教室隔壁)
講者:畢玉泉 (小畢/CrBoy)
講題:寫程式?那些老師沒教的事 - Code Smart, Don't Code Hard

歡迎宣傳、轉貼以及蒞臨指教 :P

2012年1月22日 星期日

S型調整函數

前陣子一位學妹在噗浪上這樣發問:「問!! 假設我要讓數字越大的越大 越小的越小 我該怎麼做?? 假設零到一百 處理完區間還是零到一百 但是大於五十的會變大 小於五十的會變小 應該要做什麼@@???開根號??微積分?? 」

OK....我來整理一下我對這個問題的理解:求一函數,定義域為 [0,100],值域亦為 [0,100],且若 0<x<50 則 f(x)<x,若 50<x<100 則 f(x)>x。另外還有一部分是我猜測應該也是需求的:若 x<y 則 f(x)<f(y),f(0)=0,f(50)=50,f(100)=100。後面這幾項其實是為了讓這個調整更加完備一點...

由於這個調整的曲線很像是相片後製時常用的S型曲線(我不是很清楚專有名詞,好像是 gamma 曲線的調整云云),說不定未來哪天會用到,所以特別寫篇文章記錄這件事 :P

2012年1月9日 星期一

以特定時間點為基準刪除老舊目錄

今天因為某些原因,得刪除特定目錄底下,太老舊的一些目錄。目錄數量有上百個,一個個刪實在令人難過,身為一個 Linux user,就該善用工具來解決這個問題!

這篇是個簡單的速記,就不囉唆。只要使用以下指令即可:
$ find * -maxdepth 0 -mtime +365 -exec rm -r {} \;
其中幾個重點說明如下:

  1. 使用 find 可以找出符合特定條件的檔案並對該檔案做點事情(下指令)
  2. -maxdepth 是用來限制 find 往下搜尋的層數,由於我僅針對此目錄下的所有目錄做處理,故僅使用「find * -maxdepth 0」
  3. -mtime 是針對 modified time 做限制,後面接 +n 表示「早於 n 天前修改的檔案(比 n 天還舊)」,若是接上 -n 則表示「晚於 n 天前修改的檔案(比 n 天還新)」。類似的選項還有 atime, amin, ctime, cmin, mmin。可自行查看 manpage。值得注意的是,manpage 中是以「n*24 hours」來說明,不曉得是否有何特殊之處?
  4. -exec 則是針對找到的檔案進行動作,後面接上要執行的指令,並以 {} 代表找到的檔案,結尾並加上 \; 即可。
網路上找到的通常會是刪除「老舊檔案」而非目錄,以下亦附上參考用法。
$ find . -mtime +365 -exec rm {} \;
祝各位刪檔愉快(笑)。