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




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