雖然敝社還是在 layoff 的輪迴中, 但是總是沉浸在這樣的氣氛也不好,
5/24 有所謂的 hackday, 原本堅持不參加這種無聊節目的我, 剛好在 g+ 看到朋友討論 sketchup 有 embed ruby,
想到了 2007 年我曾經玩耍過 embed php, 那就來拿這個來玩耍一下吧.
hosted app 是 multi thread, 是所謂的 apache traffic server 的下一代, 也可以寫 plugin,
所以玩法就是把 php 用 plugin 的方式, embed 進這 hosted app 裡面,
掐頭掐尾, 把每次 request 中間, 要處理的資料丟進去 php runtime 處理,
(其實所謂的 plugin/module 的概念都差不了太多, 就是把中間某段切出來處理呀, 只是我試著改用別種語言來搞)
plugin 註冊的時候, load 進一個 php file, 裡面寫著遵守某些規範的 function,
傳什麼樣的資料進去, 離開的時候, 傳什麼樣的資料出來等規範.
然後就可以在每一次 request 之後, call php function 來幫你做事情.
想法很完美, 大概能省的 resource 也都省掉了, code 也寫好了,
基本測試也做完了, 跟差距的沒差太多, 不過一開始擔心的事情,
在第二次做 concurrent connection 的時候就發生,
由於敝社的 php 是 non thread, 被 embed 進 multi thread hosted app 中的時候,
同時間只有一個 connection, 一切都很美好,
但是只要同時有兩個 function 被 call, php runtime 一些 global variable 就會爆炸了.
而即使 php 是 thread, 這問題也是會發生, 因為 php_embed 這一個 sapi 實作上的問題,
他沒有把一些 global variable 切得很乾淨, 所以一定會爆炸.
查了一下 php mailing list, 其實 2009 年有人遇到這樣的問題, 所以某人就實作了
php_embed2, 號稱即使是 non-thread, 也一樣可以 embed 在 multi-thread hosted app 中.
測試的結果, fail.
Zend engine 跟我的 hosted app, 都會試著將 malloc/free 替換成他們自己的版本,
然後在 php runtime init 的時候, 就爆炸了, 根本不用等到 request 處理的瞬間.
所以, php embed + multi-thread hosted app FAILED.
既然都 fail 了有什麼好講? 我不管, 反正就是要 embed 個什麼東西進去,
手頭上幾個選項有 python, perl, lua.
敝社並不養雞, 所以會寫 python 的不多, perl 很多人用,
但是 default 的 perl5.8 沒有 thread, perl5.10 才有開, 但只有 32 bits binary,
意思就是我得強制我的 hosted app 也跑在 32bits, 我不要呀.
lua 則是聽過的人少, 會寫的更少, 不然會是最好的選擇,
選項都選光了, 一樣沒有好處理的, 怎麼辦? 我話都說出去了, 要參加呀.
好吧, 那 embed js 進去好了.
c++ daemon 收 request, 中間轉用 js 處理一些邏輯, 最後又用 c++ 收尾,
多棒呀.
講到 server side js, 大家一定會想到 nodejs, 但是其實並不是 embed nodejs.
因為 nodejs 目前只能寫 module 去 extend 他, 但還不接受被別人 embed,
要 embed, 請找 v8.
查了一下公司內的 package, v8 的版本有, 但是是 1.3.xxx, 現在 github 上的 v8 都已經 3.10.x 了, 也太老舊了吧.
v8 不行, 那 spidermonkey 總行了吧?
spidermonkey 有兩個版本, 1.7.0 & 1.8.5,
試了一下之後, 發現這兩個版本, 雖然 api level 是基本上相容的,
但是其實 1.8.x 整個 js runtime 似乎是用 c++ 整個重新實作過.
我不知道誰比較好, 但是看起來 1.8.x 有把一些 jit 之類的都做出來, 好像很厲害的樣子.
基本的 code 寫好, unittest 還沒做, concurrent connection 測試作過.
目前的測試, 有過 js runtime 跟沒過, 大概只差了一點點.
看起來是可以拿上場跟人較量了.
2012年5月13日 星期日
2012年3月18日 星期日
vim + clang_complete
最近寫了不少 c/c++ code, 如果有 vs ide like 的 auto complete 的話, 可以少很多工.
vim 下老牌的 auto complete 大概是 omni cpp complete 了吧, 不過唯一的缺點我覺得是, 要搭配 ctags 服用.
前兩天在 twitter 上看人講到 clang_complete 這套, 試用之後果然考試都考一百分了, 感覺十分爽快.
在 FreeBSD 下面要安裝很簡單, 首先你需要 vim with python support.
1: 到 /usr/ports/editors/vim-lite 下面重新安裝 vim,
make WITH_PYTHON=yes install
2: 將 clang_complete clone 下來.
git clone https://github.com/Rip-Rip/clang_complete.git
3: 確定有裝 clang; cd /usr/ports/lang/clang; make install
4: freebsd 9.0 之後, 系統預設就有 clang 了, 但是如果要更快點,
這是不夠的, 因為相關 library 都被 static link 進 clang binary 中,
最好是另外安裝 ports 裡面的版本.
5: 到 clone 下來的 clang_complete 下面, make install 就完成了.
會看到相關的 code 都被安裝到 ~/.vim 下面.
6: 會感覺到慢吧? 因為他預設某些選項是關掉的,
所以每次要 auto complete 的時候, 都會執行一下 clang,
重新讀入所有要 parse 的 header files, 速度自然快不起來.
7: 在 .vimrc 下面加行 'let g:clang_use_library=1' 吧.
這會改用 libclang 做 parse 的動作, 並且將結果 cache 在記憶體
裡面, 你在該次的 vim session 中, 都會使用到 cache 裡的資料.
vim 下老牌的 auto complete 大概是 omni cpp complete 了吧, 不過唯一的缺點我覺得是, 要搭配 ctags 服用.
前兩天在 twitter 上看人講到 clang_complete 這套, 試用之後果然考試都考一百分了, 感覺十分爽快.
在 FreeBSD 下面要安裝很簡單, 首先你需要 vim with python support.
1: 到 /usr/ports/editors/vim-lite 下面重新安裝 vim,
make WITH_PYTHON=yes install
2: 將 clang_complete clone 下來.
git clone https://github.com/Rip-Rip/clang_complete.git
3: 確定有裝 clang; cd /usr/ports/lang/clang; make install
4: freebsd 9.0 之後, 系統預設就有 clang 了, 但是如果要更快點,
這是不夠的, 因為相關 library 都被 static link 進 clang binary 中,
最好是另外安裝 ports 裡面的版本.
5: 到 clone 下來的 clang_complete 下面, make install 就完成了.
會看到相關的 code 都被安裝到 ~/.vim 下面.
6: 會感覺到慢吧? 因為他預設某些選項是關掉的,
所以每次要 auto complete 的時候, 都會執行一下 clang,
重新讀入所有要 parse 的 header files, 速度自然快不起來.
7: 在 .vimrc 下面加行 'let g:clang_use_library=1' 吧.
這會改用 libclang 做 parse 的動作, 並且將結果 cache 在記憶體
裡面, 你在該次的 vim session 中, 都會使用到 cache 裡的資料.
2009年10月21日 星期三
freebsd + ahci
mav@freebsd.org 之前將 ahci(4) import 進 freebsd source tree, 昨天在桌機上裝了一下 freebsd 8,
順手把這個打開來用用看, 果然用起來沒問題呀.
安裝光碟, 預設還是 ata, 所以得裝完之後, 自己在 /boot/loader.conf 加上 ahci_loader="YES",
然後修改 /etc/fstab 之後, 重開機就可以使用 ahci 了, 當然, 硬體跟 bios 都要有支援就是, 有的 bios 預設就是 ata, 要自己進去改一下,
不然怎樣搞都還是進不了 ahci mode.
--
ata 硬碟的命名是 adX, ahci 則是 adaX, 所以 fstab 得自己改過.
順手把這個打開來用用看, 果然用起來沒問題呀.
安裝光碟, 預設還是 ata, 所以得裝完之後, 自己在 /boot/loader.conf 加上 ahci_loader="YES",
然後修改 /etc/fstab 之後, 重開機就可以使用 ahci 了, 當然, 硬體跟 bios 都要有支援就是, 有的 bios 預設就是 ata, 要自己進去改一下,
不然怎樣搞都還是進不了 ahci mode.
--
ata 硬碟的命名是 adX, ahci 則是 adaX, 所以 fstab 得自己改過.
2009年10月20日 星期二
git 的 hooks
由於公司內部一些東西改用 git 做版本控制, 所以現在用 git 的頻率還頗高的,
大家共用一個 codebase 最大的缺點, 就是有人可能搞爛東西, 然後大家還不知道,
為了預防這種事情發生, 大部分的 scm 都會有所謂的 hook, 可以在一些事情被執行前後, 做點檢查之類的事情.
我是直接拿 git pre-commit 這個 hook, 檢查更新過的 php 的 syntax, 如果有問題直接就不給 commit,
至於 bug, 當然是沒辦法檢查出來的.
下面是 code, 存成 .git/hooks/pre-install, chmod u+x 一下就可以用了,
不過比較好奇的是一般自己架設的 git server, 是可以自己處理 server side hooks, 但是 github 看起來並沒有這種機制.
大家共用一個 codebase 最大的缺點, 就是有人可能搞爛東西, 然後大家還不知道,
為了預防這種事情發生, 大部分的 scm 都會有所謂的 hook, 可以在一些事情被執行前後, 做點檢查之類的事情.
我是直接拿 git pre-commit 這個 hook, 檢查更新過的 php 的 syntax, 如果有問題直接就不給 commit,
至於 bug, 當然是沒辦法檢查出來的.
下面是 code, 存成 .git/hooks/pre-install, chmod u+x 一下就可以用了,
不過比較好奇的是一般自己架設的 git server, 是可以自己處理 server side hooks, 但是 github 看起來並沒有這種機制.
#!/usr/bin/env php
exec( "git diff --numstat", $output );
$fa = array();
foreach( $output as $o ) {
$f = explode( "\t", $o );
$p = pathinfo( $f[2] );
if( $p['extension'] == 'php' )
$fa[] = $f[2];
}
foreach( $fa as $f ) {
system( "php -l $f", $result );
if( $result != 0 ) {
$flag = true;
break;
}
}
if ($flag) exit( 1 );
?>
2009年6月24日 星期三
論 "php cpu 使用率不佳" 以及 php extension
pixnet 的大神貼了一篇徵才的 blog, 中間講到, "因為 php cpu 使用率不佳, 所以我們決定換成 python"...
會說這種話, 要不就是不用功, 沒真的找出怎樣壓榨出更多 cpu 效能的辦法, 不然就是手槍打得很兇, 只會假裝自己弄了新東西很炫...
簡單的講, facebook 大不大? yahoo 大不大? 他們都用 php 當前端顯示的 language, 你 pixnet 跟他們比, 算什麼咖?
php 作者 rasmus 自己都研究過, 一般狀況, 一個 request 進來, 到顯示完成,
php 本身只消耗了 10% 的 cpu, 剩下的時間, 幾乎都是等其他東西比較多, 例如資料庫, browser 端的 render 等等.
(http://talks.php.net/show/ntu/9)
就算真的 cpu 使用率不佳, 總能把不佳的部份, 改用 php extension (c or c++) 來改寫, 一個在網站內最常被使用到的 function (not bif),
改用 php extension 方式處理的話, 速度上得提昇, 馬上就可以感覺出來.
python 本身沒有不好, 只是把 "php cpu 使用率不佳" 這種沒有道理, 隨口胡謅的結果, 強加期望在 python 身上, 實在是罪過.
以 yahoo 架構上來講, 重要的核心, 基本上都會有 c or c++ library, 然後會有 php extension 來封裝起來,
一般的 web coder, 只要知道 php extension 版本的語法就好, 後面的速度跟效能, 只要 c or c++ library 升級, 馬上就得到成果.
會說這種話, 要不就是不用功, 沒真的找出怎樣壓榨出更多 cpu 效能的辦法, 不然就是手槍打得很兇, 只會假裝自己弄了新東西很炫...
簡單的講, facebook 大不大? yahoo 大不大? 他們都用 php 當前端顯示的 language, 你 pixnet 跟他們比, 算什麼咖?
php 作者 rasmus 自己都研究過, 一般狀況, 一個 request 進來, 到顯示完成,
php 本身只消耗了 10% 的 cpu, 剩下的時間, 幾乎都是等其他東西比較多, 例如資料庫, browser 端的 render 等等.
(http://talks.php.net/show/ntu/9)
就算真的 cpu 使用率不佳, 總能把不佳的部份, 改用 php extension (c or c++) 來改寫, 一個在網站內最常被使用到的 function (not bif),
改用 php extension 方式處理的話, 速度上得提昇, 馬上就可以感覺出來.
python 本身沒有不好, 只是把 "php cpu 使用率不佳" 這種沒有道理, 隨口胡謅的結果, 強加期望在 python 身上, 實在是罪過.
以 yahoo 架構上來講, 重要的核心, 基本上都會有 c or c++ library, 然後會有 php extension 來封裝起來,
一般的 web coder, 只要知道 php extension 版本的語法就好, 後面的速度跟效能, 只要 c or c++ library 升級, 馬上就得到成果.
2008年12月18日 星期四
php ctemplate for win32
昨晚突然想到, 應該弄一下 php ctemplate 的 win32 binary,
因為 google ctemplate 原本就是 win32 ready, php 也是, 那為甚麼不順便做一下 php ctemplate php extension for win32 呢?
測試了一下, 東西已經丟上 github 了.
有需要的自己弄一份吧, binary 的話, 私下講吧.
因為 google ctemplate 原本就是 win32 ready, php 也是, 那為甚麼不順便做一下 php ctemplate php extension for win32 呢?
測試了一下, 東西已經丟上 github 了.
https://github.com/vanillahsu/php-ctemplate/tree
有需要的自己弄一份吧, binary 的話, 私下講吧.
2008年12月16日 星期二
pcre & pcrecpp
pcre 是 unix 上被使用的很頻繁的 regex library, 原本是 exim (一套 sendmail like 的 mail) 想要做 perl compatible regex library,
最後一堆軟體都不小心有用到, php 的 preg_* 後面就是 pcre.
最近把一個工作上, 其他同事慣用的 php template library 改成 php ext,
為甚麼要這樣做呢?
因為 coder & designer 已經用習慣, 叫他們改, 大概會殺人吧.
所以只好退而求其次, 一樣用他們習慣的 rule & style 去做.
而該 template library, 其實就是一堆 preg_match & preg_replace 組成的,
php ext 也照圖說故事, 該用的地方就用一下.
我是用 c++ 來改寫的, 所以一堆原本 php 的 array, 直接用 stl 就可以很快樂,
preg_* 的 function, 也是可以直接用 pcre c function 來做,
但是, 但是.
google 約在 2006 年左右, 貢獻了一個 c++ binding 給 pcre, 所以如果願意的話, cpp binding 用起來更爽快點.
最後一堆軟體都不小心有用到, php 的 preg_* 後面就是 pcre.
最近把一個工作上, 其他同事慣用的 php template library 改成 php ext,
為甚麼要這樣做呢?
因為 coder & designer 已經用習慣, 叫他們改, 大概會殺人吧.
所以只好退而求其次, 一樣用他們習慣的 rule & style 去做.
而該 template library, 其實就是一堆 preg_match & preg_replace 組成的,
php ext 也照圖說故事, 該用的地方就用一下.
我是用 c++ 來改寫的, 所以一堆原本 php 的 array, 直接用 stl 就可以很快樂,
preg_* 的 function, 也是可以直接用 pcre c function 來做,
但是, 但是.
google 約在 2006 年左右, 貢獻了一個 c++ binding 給 pcre, 所以如果願意的話, cpp binding 用起來更爽快點.
訂閱:
文章 (Atom)