PHP 5.4 的新功能…

PHP 5.4 在 3/1 已經發布了,其中我覺得比較重要的幾個新功能:

  • Traits – 看範例應該就會懂用法了,code reuse用的。
  • 內建Web Server,開發測試的時候不需要設定 apache 或 nginx 了。
  • Closure 裡面支援 $this。
  • $a = [1,2,4,5]; 這樣的 Array Notation。
  • func()[0](new Foo)->bar() 這樣的寫法。
  • json_encode() 的第二個參數可以給 JSON_PRETTY_PRINT(印出人類方便閱讀的 JSON 格式)與 JSON_UNESCAPED_UNICODE(不要 escape unicode 字元)

然後 5.4 剛出的新功能就有 bug 了…XD

Unbound 回傳 RR Set 的順序問題

unbound 是個輕薄短小好用的 DNS Resolver,也支援 DNSSEC

這幾天剛好遇到一個問題:有一組 Cluster 的 Server Loading 分布不均,但一個小時後 Loading 會轉移 Server,原本有 Loading 的變成沒 Loading,原本沒 Loading 的變成有 Loading。
經過檢查之後發現是 Unbound 回傳 Resource Record (RR) 的順序問題。

按照這篇 Maillist 的說法,unbound 在回傳結果的時候,會完全按照原本結果的資訊回傳,包含 RR 的順序。所以 RR 的順序會固定一個 TTL (被 unbound cache 住了),而剛好我們把 TTL 設為一個小時。

除了把 TTL 設短一些外,寫 Client 程式的時候,如果考慮有使用到 DNS Round Robin 來作 Load Balance 的話,最好不要固定使用回傳的第一個 RR 會比較好。

徵才:PIXNET 徵網路系統工程師一名

我現在服務的公司 PIXNET 要徵求一名 System Administrator:

工作內容:

  • 伺服器 (主要為 FreeBSD 與 Debian、Ubuntu 系統) 系統維護,包括套件 (ports 與 apt/deb) 維護
  • 機房與辦公室網路設備 (Cisco/Juniper Router、Switch、VPN) 維護。

工作時間:9:30 ~ 18:30 (一~五),特殊狀況時 (例如晚上處理緊急事件,或是凌晨停機等) 另外補休。
就職日:可馬上就職,或 2012 年二月到職即可。
地點:台北市中山區 (捷運行天宮站旁),機房於台北市內湖區。
需求:熟悉 UNIX-like 系統,Script (Perl, Python 或 shell script 之一) 撰寫。熟 Cisco 網路設備操作者佳。
薪資:約 40k/month,其他技能面議另談。

有意者請聯絡 techjob@pixnet.tw

Google Chrome 全球市佔率超過 Mozilla Firefox,位居第二

根據 statcounter 的統計:

台灣則是在今年七月份就超過了:

於是有人在討論Google Chrome會不會是下一個IE6。配合之前 ppk 的擔憂:Mobile Safari 會不會是行動裝置上的 IE6?

我倒是覺得 Web Developer 的堅持比以上的所有討論都重要的多。畢竟,寫出 IE only 網站的,並不是 Microsoft,而是不夠專業的開發者。

使用 Virtual Box Headless 跑 Virtual Machine

VirtualBox 是 Sun (後來被 Oracle 買下) 開發的一套虛擬化軟體。他的 Host OS 可以是 Windows, Linux, MacOS, FreeBSD。除此之外,VirtualBox 可以在 Terminal 下執行,顯示的畫面由 RDP/VNC 輸出,亦即 Headless 模式。要特別注意的是,RDP 輸出僅限於專屬授權版本,OSE (Open Source Edition) 版本是沒有這個功能的。

要使用 VNC 輸出,必須在安裝的時候加入 VNC 支援:

# cd /usr/ports/emulators/virtualbox-ose; make WITH_VNC=yes all install clean

安裝好 VirtualBox 之後,必須再安裝 kernel module:

# cd /usr/ports/emulators/virtualbox-ose-kmod; make install clean

接著把需要的 Kernel Module 載進來:

# kldload vboxdrv; kldload vboxnetadp; kldload vboxnetflt

之前寫在 /boot/loader.conf 會導致開機時 Kernel Panic,但如果開完機手動載入就不會,目前還沒找出原因。

接下來新增一個 Virtual Machine:(以下都可以不需要 root 權限)

% VBoxManage createvm winxp --register

然後設定 VM 的資源需求:

% VBoxManage modifyvm winxp --acpi on --ioapic on --memory 1024 --cpus 2 --nic1 bridged --nictype 82540EM --bridgeadapter1 em1

以上的範例分配了 1024MB (1GB) 的 RAM 與 2 個 Virtual CPU 給 winxp 這個 VM,另外建立了一張虛擬網卡,型號為 Intel 82540EM,橋接到實體的 em1 這張網卡上。

再來建立一個新的 120GB 虛擬硬碟:

% VBoxManage createhd --filename winxp --size 122880

在 VM 裡增加一個 IDE Controller:

% VBoxManage storagectl winxp --name "IDE Controller" --add ide

把硬碟與安裝 ISO 檔連接到 IDE Controller:

% VBoxManage storageattach winxp --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium winxp
% VBoxManage storageattachwinxp --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium winxp.iso

接著就可以開機了:

% VBoxHeadless -s winxp --vnc --vncport 5900 --vncpass password

執行成功後,可以用 VNC 連入看到安裝 Windows XP 的畫面:

關機、重開機可以使用 VBoxManage 來完成:

% VBoxManage controlvm winxp poweroff

Python 的 GIL (Global Interpreter Lock)

前幾個月在做專案的時候,發現用 mod_wsgi + web.py 寫的程式,理論上支援 multi-thread,應該可以完全利用在多核 CPU Server 的優勢;但實際上跑的時候,會有沒辦法把 CPU Resource 吃完的問題。當時因為時間很趕,想到的解法就是多跑幾個 Process:

<VirtualHost *:80> 
   DocumentRoot “/srv/web/webroot" 
   ServerName python.example.com 
   WSGIProcessGroup pythonexample 
   WSGIDaemonProcess pythonexample processes=16 threads=128 maximum-requests=1024 display-name=%{GROUP}
</VirtualHost>

COSCUPlwhsu 聊到這件事,他講到 CPython 的 GIL,回來查了一下果然就是這個原因。剛好 Web 不需要在每個 thread 之間互相傳資料,所以可以直接用多個 Process 解掉這個問題。

雖然 Python 在執行前就把程式碼轉成 byte code了,但因為這個 Lock 是實做在 CPython 的 Bytecode Interpreter 裡面,所以導致了同時只會有一個 thread 執行 Python bytecode,也因此無法利用到多核 CPU 的優勢 ((Stackoverflow: Python threading and gil))。

除了多跑幾個 Process 之外,也可以用 ctypes 配合用 C 寫的 library 來解決這個問題,不過以 Web 應用來說,寫 C 的機會不高就是了。

FreeBSD 的 EC2 AMI…

剛到公司就被DK長輩提醒,Amazon Web Services可以跑FreeBSD 64 bit 的 AMI 了(us-east 的 ami-c69862af)。一樣是Colin Percival做出來的AMI。

然後他的作法居然是開一台Windows的機器,然後把Kernel換掉 XD
這樣確實可以跑 HVM 沒錯,不過缺點是每小時的費用比較高(目前會計入微軟稅)。

作者也希望AWS能夠早日把HVM開放給非微軟平台,這樣就不用繳微軟稅了。

Flickr 提供 OAuth Core 1.0a 認證方法

Flickr 今天公佈了一個新功能:OAuth Core 1.0a 認證方法。現有的 API 方法不變,只有認證改用 OAuth Core 1.0a 的方法。原本的認證方法將在明年(2012年)移除。

另外, Flickr 也提供了舊API的轉換認證方式,只要用 Flickr 提供的  flickr.auth.oauth.getAccessToken API 就可以把舊的 Flickr  Access Token 轉為 OAuth 的 Access Token,也就是使用者不需要重新授權一次就可以轉換成 OAuth。

Linode 的 Load Balancer…

長輩那邊看到了Linode 也推出 Load balancer 服務… (剛開始 beta),於是就來測試一下:

這是增加一個 Port 的畫面,可以選 TCP 或 HTTP Protocol(沒有HTTPS),另外可以看Cookie或者查表來把同一個人導到同一台backend上。

Healthy Check 的部份有TCP、HTTP Valid Status 與 HTTP Body Regex,所以可以檢查回傳的頁面是不是正確(例如有沒有</html>)。但是不能指定 Host: 這個 Header。

設定完大概就長這樣:

然後接下來是加入 Member Node:

不能填非 192.168.*.* 或是 IPv6 Link Local Address 以外的值:

討論區的公告上面寫說支援IPv6,不過實際測試發現填不進去:

實際使用上是可以支援 IPv6 的,也有實做 X-Forwarded-For

實際使用上的問題有兩個:

  1. 跟之前的 AWS 的 ELB 一樣,有 Load Balancer IP 的信任問題。沒辦法確認這個 X-Forwarded-For 是不是被假造的。
  2. Node 的 Healthy Check UP/Down Status 更新速度很慢。我今天17:00加了新的Node進去,到現在(21:30)的 Status 還是 Unknown…

security/pam_google_authenticator: Two Factor Authentication PAM Module

security/pam_google_authenticator 是 Google 推出的 Open Source PAM Module,提供 RFC 4226 (HOTP: An HMAC-Based One-Time Password Algorithm) 的 OTP 功能。

只要使用 Android 手機(未來會支援iOS裝置),安裝 Google  提供的 App,開啟並設定 pam_google_authenticator,之後的 ssh 連線就可以使用 OTP 登入。

Linux 上的安裝方法可以看 @gasol 寫的替主機上第二道鎖 – Google Authenticator,這裡介紹的是 FreeBSD 上的安裝方法:

  1. 先安裝 security/pam_google_authenticator
  2. 執行 google-authenticator ,設定 secret key。螢幕上會出現一個 QR Code,用手機 App 掃描之後就會把 secret key 存到手機內。接著按照螢幕上指示把 secret key 存到 ~/.google_authenticator 裡。記得要 chmod 600。
  3. 設定 /etc/pam.d/sshd,在 auth pam_unix 下面增加一行:

auth required /usr/local/lib/pam_google_authenticator.so

這樣就生效了。要注意的是,這不會影響使用 Public/Private Key Pair 登入的使用者。另外,PAM設定完成之後,如果沒有設定 secret key 的使用者,就不能用帳號密碼登入了。

測試前記得請留下一個連線的 terminal,避免設錯導致人得跑到 console 前去處理。