SQLite 的效能

在考慮要使用 SQLite 還是其它資料庫的時候看到了這篇:http://stackoverflow.com/questions/14217249/sqlite-and-concurrency
裡面提到 SQLite 的效能最高可以達到每秒五萬筆 INSERT,但會因硬碟的性能不同而有差異。而我要使用的環境別說每秒上萬筆,一秒有上百次操作就很了不起了。

於是寫了簡單的測試,看看在我機器上跑得怎麼樣:

本來想說每秒五萬筆的話,那我得弄個十萬筆才能執行超過一秒,結果沒想到這一跑就超過了半個小時還沒跑完。平均下來每秒只執行了 38 筆的操作。果然夢想與現實的差距就是這麼大嗎?

不可能吧。於是開始檢討差距這麼大的原因,第一個想到的是硬碟速度的問題,也確實在執行期間硬碟幾乎是一直忙碌的狀態。但我這已經是固態硬碟了,怎麼樣也不會這麼難看吧。而且這已經是少到不能再少的資料了,實際運用上一定會更多資料量的。

後來在這篇文章裡看到了 nosync 這個關鍵字:http://www.sqlite.org/speed.html
進而找到了這個說明:http://www.sqlite.org/pragma.html#pragma_synchronous

所以就開始了第二版的測試:

只加了一行,但這次只花了不到八秒就跑完了。算一算這樣每秒就有上萬筆的操作,雖然跟五萬筆還是差了一些,但應該是很夠用了。

ZendFramework 2 AbstractRestfulController

Zend Framework 2 有提供一個 AbstractRestfulController 用來實作 REST API。不過按照慣例,Zend Freamework 的說明文件都只是簡單帶過而已,真正的用法與規則還得去閱讀程式碼。

使用方法,就只要繼承 AbstractRestfulController 即可:

在 Router 那邊,記得不要設置 action:

之後,就會自動對應到 Controller 的 Method:

  • GET => getList()
  • GET + id => get($id)
  • POST => create($data)
  • PUT => replaceList($data)
  • PUT + id => update($id, $data)
  • DELETE => deleteList()
  • DELETE + id => delete($id)
  • HEAD => head($id)
  • OPTIONS => options()
  • PATCH => patchList($data)
  • PATCH + id => patch($id, $data)

因此,一個支援 GET 與 POST 的 Controller 大概長這樣:

其它沒有實作的部份,AbstractRestfulController 會幫你回應 405 Method Not Allowed 。

另外,identifier 的名稱,預設是用 “id”,為了可讀性,你也可以自訂 identifier,下面我們改用 “name” 作為 identifier:

相對應的 Router 也需要把 id 改為 name:

AbstractRestfulController 的用法大致上就這樣。

PHP include 的運作方式

PHP 的 include 暗藏了一些潛規則,如果沒搞懂的話,遇到問題會以為見鬼了。所以這篇主要就在研究 PHP 的 include 運作方式。

首先,我們從官方文件可以看到 include 會區分為兩種模式,一種是 include 檔案,另一種是 include 路徑。只要是絕對路徑,或是相對路徑,就是以 include 路徑來運作。這裡比較容易搞混的是相對路徑的部份,因為 PHP 只把 “.” 或 “..” 開頭的作為相對路徑看待。

因此 include “foo/bar.php” 是屬於 include 檔案,而 include “./foo/bar.php” 則是 include 路徑。

在 include 檔案時,會先從 include_path 開始搜尋,再來是搜尋此 PHP 程式所在的資料夾(the calling script’s own directory),最後是搜尋 current working directory(CWD)。

而在 include 路徑時,則只會從 CWD 去搜尋。

為了驗證,我設置了這樣的環境來作測試:

其中 lib{xx,yy,zz}.php 的內容都是一樣的:

include_priority.php 是將要執行的主程式,分別將 include_path 以及 CWD 設置到 inc_path 與 cwd 資料夾,這樣就能分辨優先順序,其內容是:

最終結果是這樣子:

由結果來看,符合文件中所描述的運作方式。

接著來驗證第二種情況,如果 a.php include b.php 且 b.php 又 include c.php 的話,那麼在排除 include_path 與 CWD 的情況下,會如何運作?
環境設置:

root.php 是主程式,內容為:

sub.php 的內容:

libxx.php 的內容與前一個實驗相同。
最後的輸出結果是:

由此可見程式所在的資料夾(非CWD)是會隨著 include 所在的檔案而變動的。換句話說,就是以這一行 include 語法所在的檔案的位置為主。

綜合以上的內容,就可以解釋下面這個看到鬼的例子了:

在 root.php 裡面 include 了 sub.php 檔案:

然後在 sub.php 裡面又分別 include libxx.php 與 tools.php 兩個檔案:

因為 include “library/libxx.php” 成功了,於是以為相對路徑是由 sub.php 所在位置來計算,因此又下了 include “../tools.php” 這樣的指令,結果死的不明不白。

其實 libxx.php 是以檔案的方式去 include 的,所以會搜尋三個地方:include_path,sub.php 所在的位置,以及 CWD。而 sub.php 所在的位置剛好就可以找到 library/libxx.php 這檔案,所以 include 成功。

在 include tools.php 時則是因為它以 “..” 開頭,所以只會從 CWD 來計算相對路徑找檔案。而此時的 CWD 是在 root.php 那邊,自然就找不到東西了。

Eclipse 當掉後沒有畫面

今天 Eclipse 無預警的當掉了,然後再打開,選完 workspace 後就只有一片空白的畫面,連選單都沒出現。

網路上有找到解決方法,紀錄一下:
到 workspace 底下,刪除檔案
.metadata/.plugins/org.eclipse.core.resources/.projects//.markers.snap
或是
.metadata/.plugins/org.eclipse.core.resources/.snap

其實也不一定要刪除,我把檔名改掉後先成功開啟一次,再關閉 Eclipse,將 .snap 改回來,之後就都正常了。

參考:
http://stackoverflow.com/questions/207843/how-do-i-prevent-eclipse-from-hanging-on-startup

HiNet 企業網路固定 IP 區網互連不通

前幾天才在 ithome 看到類似的問題,想不到今天就被我遇到了。

原本 ATUR 上面使用了第一到三孔,今天在第四孔上面接上了設備,發現完全無法連往區網內的其它固定 IP,而其它三個孔都是通的。

利用 tcpdump 查了一下,發現第四孔送到區網內的 ARP 封包沒有回應,所以沒辦法連線。猜測應該是 ATUR 內部有些設定造成的。

連進 ATUR 偷看一下,發現一個很可疑的東西:
cht_port_arp_1s
剛好 MOD 的 Port 是設定在第四孔,於是嘗試看看改成選第一個空白,並重開機器測試:
cht_port_arp_2s

然後就通了 xD 誤打誤撞的解決了。

FreeBSD 使用新的 pkgng 套件管理系統

pkgng 意思是 Next Generation (下一代)的套件管理系統,將用來取代原有的 pkg_* 系列指令。
主要的指令只有一個,就是 pkg。

新的 FreeBSD 將會預設使用 pkgng 來運作,所以是時候來練習一下了。
要在現有的 8.x 或 9.x 使用的話,步驟如下:

  • 安裝 ports-mgmt/pkg
  • 執行 pkg2ng 進行轉換
  • 增加 WITH_PKGNG=yes 到 /etc/make.conf
  • 設定 repository,在 /usr/local/etc/pkg/repos/FreeBSD.conf 加入以下內容:

這樣就可以了。

pkgng 依然與原有的 pkg_* 系列指令保有很好的相容性,只要將原有指令的底線拿掉就可以了。
例如 pkg_version -v 現在可以用 pkg version -v 來取代,其它依此類推。

試用了一下以後,覺得這個新系統用起來很方便,也改進了一些小缺點,例如剛安裝完新的東西不用再 rehash 就能用了。
因為是直接安裝編譯好的 binary 檔,所以速度也很不錯。當然要用 ports 依然是可以的,沒有問題。

不過新系統還是有些需要注意的地方,原本在 ports config 裡面設定的選項可能會壞掉。例如 php 如果要安裝 apache module,就需要另外安裝 mod_php5,直接使用 pkg upgrade 會把原本的 php module 給刪掉,造成 apache 無法啟動。另外 svn 附帶的 mod_dav_svn 則是只能由 ports 來安裝編譯,目前(2014/4/15)還沒有找到 pkgng 相對應的安裝方法。

詳細的指令用法可以參考 https://wiki.freebsd.org/pkgng#the_pkg_command

XP 更新 ESXi 及 VMware vSphere Client 後出現錯誤 An unknown connection error occurred. The Client could not send a complete request to the server.

今天給 ESXi 更新到 5.1 update2 (1483097) 以後,我平常用來跑 vSphere Client 的 XP 就沒辦法連上 ESXi 了
用 Windows 7 卻沒什麼問題,所以重新檢查了 XP ,確認安裝的確實是相應的新版本
上網查了一下,發現是個普遍問題,ESXi 5.5 或 ESXi 5.1 update2 都有這樣的情況

原因簡單來說,是因為 ESXi 停用了較不安全的 cipher suite
而 XP/2003 正是使用了不夠安全的 cipher suite 去連線,所以就失敗了
若是 64 位元的系統,可以透過安裝 Windows 更新來解決:
http://hotfixv4.microsoft.com/Windows%20Server%202003/sp3/Fix192447/3790/free/351403_ENU_x64_zip.exe
http://hotfixv4.microsoft.com/Windows%20Server%202003/sp3/Fix192447/3790/free/351385_ENU_i386_zip.exe

偏偏我用的是 32 位元的 XP 啊…那就只能降低 ESXi 的安全性設定了
方法如下:

  1. ssh 連線到 ESXi
  2. 移動到設定檔的位置:cd /etc/vmware/rhttpproxy/
  3. 先做個備份:cp config.xml config_bak.xml
  4. 修改 config.xml :vi config.xml
  5. 找到 <vmacore> 裡面的 <ssl> 區塊
  6. 在裡面加上一行:<cipherList>ALL</cipherList>
  7. 存檔後重啟服務:/etc/init.d/rhttpproxy restart

修改後的 ssl 區塊應該長成這樣:

上述步驟做完後我就可以正常連線了。

參考資料:
http://kb.vmware.com/selfservice/microsites/search.do?language=en_US&cmd=displayKC&externalId=2049143

C語言網路相關的標頭檔

從網路上找資訊, 最怕的就是找到舊的或錯誤的東西
今兒個找了個範例, 結果遇到無法編譯的問題, 就是因為用的是舊方法

問題主要出在 #include <linux/ip.h> 然後就跳出一堆錯誤:

拿這些訊息去 google 還查不出什麼來, 都是些老舊的文章
後來跑去翻自己以前寫的程式來比對, 才找到真正問題

原因是 linux/ 底下的東西本身是給 kernel 內部使用的
因此開發一般 userland 的程式不應該使用這些
較新的 linux 版本甚至把這些標頭檔也拿掉了

比較正確的作法, 是採用 netinet/ 底下的標頭檔
這是由 POSIX 所規範的標頭檔, 所以用這個開發出來也比較具有移植性
改成使用 netinet/ip.h 以後, 上面遇到的錯誤也就消失了

email 的 html 與 css 支援度問題

今天幫朋友解決電子報在 Outlook 顯示不正確的問題。其實問題很簡單,在 html 裡面的 width 數值不用加 px,若是加上去了,在 Outlook 就會被忽略掉,導致整個指定的寬度跟高度都不對了。

這個在 Outlook Express 與 Thunderbird 裡面看都沒問題,唯有 Outlook 2007/2010 會顯示不正確。或是應該說,只有 Outlook 嚴格的檢查了 html 語法。

查問題的時候又看到一些有用的資料,紀錄一下:

各個 email client 對 CSS 的支援
http://www.campaignmonitor.com/css/

Outlook 的 CSS 支援速查表
http://maanehunden.wordpress.com/2009/05/25/how-to-write-compatible-html-for-outlook-mails/

一個 email 測試軟體, 讓你預覽各家 client 的畫面, 同時 blog 裡也有不少有用的資訊
http://www.emailonacid.com/blog

Ubuntu GCC Link Library 的順序問題

今天在 ubuntu 中了招,Makefile 中這樣寫:

結果一直顯示錯誤:

檢查了 libssl-dev 有安裝,也跑去 /usr/lib 建立一些 link,但是問題都沒有解決。

最後原因是這個:

The –as-needed option also makes the linker sensitive to the ordering of libraries on the command-line. You may need to move some libraries later in the command-line, so they come after other libraries or files that require symbols from them.

Ubuntu 自 11.04 後,預設會將 –as-needed 選項打開,所以參數的順序突然變得很重要了,改成這樣就可以了:

參考資料:
https://wiki.ubuntu.com/NattyNarwhal/ToolchainTransition