Archive for the ‘FreeBSD’ Category

pcre & pcrecpp

星期二, 十二月 16th, 2008

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 用起來更爽快點.

libmemcached-base 的 memcached php extension

星期二, 十月 21st, 2008

http://www.toplee.com/blog/533.html

http://www.laoniphp.com/

這兩個都是大陸人, 說要寫 base on libmemcached 的 php extension 的網頁,

第一個寫一半就沒寫了,

第二個寫出來了, 不過我仔細看了一下 code, 殺雞焉用牛刀, 根本沒有用到 libmemcached 好用的地方.

所以我就自己寫了, 不過是替公司寫的, 目前也沒可能放出來吧.

除了 non blocking connection, 還有 consistent hash 的各種算法, 都已經做進去了.

set/get 也都可以吃任意的 php object type, 反正進去就幫你 serialize/unserialize 一下.

socket with ssl

星期一, 十月 6th, 2008

昨天做 net/spserver 的修改, 把原本少弄進去的 matrixssl, gnutls, xyssl 的東西補上,

看到 xyssl 的 sample code, 是讓一般的 tcp server & client 可以用 ssl 收發資料,

覺得還頗簡單的, 然後又去看了一下 openssl demo code,

我的第一印象, 就是覺得 openssl + socket 應該很難搞,

沒想到看了一下, 還真簡單

open socket 之後, 把 fd 用 SSL_set_fd 餵到 ssl 裡面,

再來就用 SSL_read & SSL_write 取代原本的 read/send 就好了.

真方便.

php qrcode

星期三, 六月 18th, 2008

在 php 上面要產生 qrcode,

大部分的人都是用某日本人寫的 pure php 套件,

據說要 include 一堆東西, 才能使用.

其實, 我在 2007/04 就寫好了 pecl-qrencode, 他是 base on libqrencode 的 php extension,

FreeBSD 使用者可以在 ports/graphics/pecl-qrencode 下面找到,

用法也很簡單,

先產生一個 qrencode resource, 然後用 qr_save 把圖檔吐出來,

可以選擇要不要給檔名, 沒有直接吐到瀏覽器上.


$qr = qr_encode ('test for qrcode');
if (is_resource ($qr))
    qr_save ($qr, '1.png');


or you can output direct to stdout.


$qr = qr_encode ('test for qrcode');
if (is_resource ($qr))
{
    header ("Content-type: image/PNG");
    qr_save ($qr);
}

一個 realpath(), 各自表述

星期三, 五月 28th, 2008

最近幫朋友弄 vmware iso, 裡面裝 php, 跑他們的東西,

原本他們是用 apache20 + mod_php4, 我把他改成用 lighttpd + fastcgi + php4,

不過馬上就出現問題了, realpath () 會出現不一樣的結果,

他們用 realpath 去組合一些路徑, 然後這些路徑有可能是尚未存在的,

原本用 apache20 的時候, 是正常的 (當然是他們覺得正常)

而用 lighttpd 的時候, 傳回值都是 false,

我看了一下, 原來狀況就是 ZTS 造成的呀,

當 php 有 ZTS enable 的時候, 他是用 zend 裡面自己實做的 realpath (),

如果沒有 ZTS, 而系統又有 realpath(3) 的時候, 就直接用系統的 realpath(3),

那都沒有的時候呢? 直接 strcpy(3)…

那到底系統的 realpath(3) 跟  zend 自己搞得有什麼不同呢?

系統的 realpath(3) 組出字串之後, 還會叫一下 lstat(3) 去檢查該目錄或者檔案是不是真的存在,

不存在一樣 return false.

zend 的應該是根本不管, 組出來就回傳了…

我該說是誰的錯呢?

[Update] 今天又仔細看了一下, ZTS 其實最後還是叫 access() 出來檢查, 所以要符合這需求,
最簡單就是 non-ZTS + 修改 freebsd’ realpath, 把 lstat () 拿掉,

朋友信誓旦旦的說, 他們一直都這樣用, 但是從 cvs log 看來, 起碼 2003 年就已經都會檢查了呀.

mysql++

星期一, 五月 26th, 2008

雖然很久以前試用過這套, 但是感覺沒有現在這麼好!!!

mysql++ 是 mysql client 的 c++ binding,

功能強大到不只是 c++ binding 而已,

一堆 stl 的搞法, 把用 c++ 做資料庫操作, 弄的很像寫 php 一樣簡單,

真是快活…

Mysql module for bsnmpd (FreeBSD native snmp daemon)

星期一, 三月 10th, 2008

最近算頗忙, 小孩都生出來了, 回家就是要幫忙帶小孩, 忙這忙那的…

不過上班的閒暇之餘, 寫了這個小東西, mysql module for bsnmpd.

在我的認知當中, 好像大部分的 monitor 機制 (nagios, cacti 等), monitor mysql 的時候,

都是由 moniter node 連線到 mysql server, 取得一些資訊後,把資料存起來.

這樣 mysql server 一多, 要就是紀錄每台的 username, password 等,

不然就是大家都用一樣的密碼.

其實很怪, 為甚麼 monitor node 要裝那麼多 client library?

不能有更簡單的方法嗎?

SNMP 好像原本的構想就是這樣, 只要大家符合了 snmp protocol, 理論上就可以取得你想要的資訊,

只是 server side 要自己去擴充而已.

FreeBSD 在 5.x (應該是這時候) 引進了 bsnmpd, 他比較好玩的是, 可以自己寫 module 去擴充原本沒有的東西,

現在已經有了一些 module, pf, netgraph, hostres 等等.

snmp_mysql 的 source code 可以在這邊找到.

解開之後,  “make” 就可以生出 snmp_mysql.so & snmp_mysql.so.5

copy 進 /usr/lib 就可以了 (其實 /usr/local/lib 才對)

然後把同目錄下的 snmp_mysql.conf copy 到 /usr/local/etc

這個檔案裡面只有兩行, 你的 mysql username & password, 自行修改.

然後修改 /etc/snmpd.config

增加下面這行

begemotSnmpdModulePath.”mysql”  = “/usr/lib/snmp_mysql.so”

重跑 (”/etc/rc.d/bsnmpd restart”) bsnmp 就好.

sockstat 就可以看到 bsnmpd 有連接到 mysql.sock

使用方法, 用 perl or php snmp module 就可以連接,

uid 如下.

1.3.6.1.4.1.12325.1.204.1.1.1.0 Connections

1.3.6.1.4.1.12325.1.204.1.1.2.0 SlowQuery

1.3.6.1.4.1.12325.1.204.1.1.3.0 Uptime

1.3.6.1.4.1.12325.1.204.1.1.4.0 Questions.

flickr comment reader (apache module version)

星期五, 十一月 30th, 2007

從八月說要寫這篇, 現在都要十二月了, blah blah…
上一篇是用 php 來寫這個 reader,

而本篇, 我則改用 c++ 來做這件事情,

先期需求, 有 flickr api, rss reader, 拉 rss, template engine, data structure, memcache

  1. flickr api 的部份, 在 flickr 網站上, 沒有任何的推薦 library,
  2. 而 leeym 長輩很久以前, 有推薦過 flickcurl 這套, 感覺還不錯, c & libxml2 & curl 弄出來的東西,

    自己拉資料透過 curl, 並且 parse 之後, 吐你要的東西出來,

    不過缺少了某些東西, 例如 contact list 就沒有實做,

    因此我把這部份補齊之後, 送給了作者, 發現作者竟然也是 y 員工, 還是 leeym 去美國之後的同事, hello kitty media team 的,

  3. rss parser 還是用 mrss 這套,
  4. mrss 雖然可以直接給 url 拉 rss 回來 parse, 但是問題還是存在, 一次只能一個 http connection,
    當 contact list 很長的時候, 我們一樣要等 list * 2 + 2 + 1 的時間,
    所以我們只讓他 parse rss 就好, 拉我們自己去拉吧.

  5. rss 透過 curl multi 拉, 所以必須自己寫這段,
  6. template engine 還是堅持傳統, 使用 google ctemplate.
  7. data structure 特別拿出來講的原因,
  8. 是因為我從沒真的碰過 c++ vector 之類的東西, 這次仔細的用了 vector 來過一些簡單的東西, 感覺還不錯.

  9. memcache 的 client, 使用了 databases/libmemcache

東西都準備好之後, 我先做了一個 Reader.cpp 的 class, 這個就是我們的主體,
先寫好的原因, 是拿來當成 command line 用, 至少比較好 debug.

Reader.cpp 裡面就做幾件事情, set_data, prepare, execute, parse 然後就結束了.

prepare 會把 url 加進去 vector 裡面, 順便先檢查 memcache 理面有沒有資料,
有的話, 就不用透過 curl 出去撈一次,

execute 是真的透過 curl + multi 出去撈了,

parse 是將拉回來的資料, 不管是透過 curl, 還是從 memcache 裡面的,
用 mrss parse 過一次, 排序之後, 吐 vector 回去.

Reader 部份大概就這樣,

不過一整個 apache module 其實有三個 page,
index, callback, reader.

index 單純就是 redirect 到 flickr,
使用者在 flickr 登入後, 會導回我們的 callback page,
callback 會取得 token,
然後將使用者導去 reader,
reader 就取得 contact list, 拉 rss, 做 parse, 吐頁面..

應該沒有很難才是..

PS, 不過目前現在已經不是這個版本了..

spserver

星期四, 八月 30th, 2007

ports/net/spserver

http://iunknown.javaeye.com/

作者是大陸人, 實作都是引經據典的, 頗屌…

看到這種人, 就真的覺得自己很差…

flickr comment reader (php version)

星期六, 八月 11th, 2007

上班上的頗煩,

所以 jeff 前幾個星期給了我一個作業,

他說他每天在 flickr 上面, 翻閱所有好友的 comments 很累, 因為必須要一個一個去看,

flickr 介面只會提供, 你在別人那邊的留言, 別人在你這邊的留言,

不會提供你朋友在別人那邊的留言, 更不用說別人在你朋友那邊的留言… (有點繞舌)

所以他想要有一個介面, 想要一次撈出所有的朋友名單, 一次就把這些 comment 從最新排到最舊, 省的花很多時間去找尋.

大概中午十一點多接到這個作業, 約下午六點前, 已經把 proto type 做給他了.

用 php + flickr api + mrss + curl 就完成.

不過第一版非常慢, 他是拉出好友名單之後, 一個一個去拉到 rss, 然後根據時間排序, 過濾掉重複的.

才顯示出來,

http connection 數量約是, (好友數量 * 2) + 2 + 1

然後一個一個排隊連線, 假設我有 25 個好友,

我的連線數量就是 25 * 2 + 2 + 1, 1 是原本的 flickr api rest, + 2 是我也要拉到我自己的.

這樣會有 53 個 connections, 每個只花一秒鐘的話, 從 request 這頁開始, 我要等 53秒以上, 頁面才會出現, 因為還要加上排序等處理.

因此第二個版本, 使用了 curl 特殊搞法, multi interface, 他可以一瞬間, 就把要開的 connections 一次開滿, 一次拉回來.

這個改法, 我自己約 25 個好友的狀況下, 從 53 秒以上, 拉低到 4 ~ 5 秒就出現結果.

但是還是有瑕疵, 因為每次, 都要真實的開那麼多 connections 出去, 可能一拉就是 500k, 但是經過過濾之後,

只有吐給使用者 30k 的資料而已.

怎麼辦呢? cache 吧. php 可以直接使用 apc, 將每次的 rss result 存個幾分鐘,

當使用者短時間內重複拉取同樣的 rss 時, 可以直接從 cache 中拉出, 不必浪費資源出去抓.

這次目前 php 版本的狀況, 也順便感謝某同事的支持, 弄了個漂亮簡單的頁面, 讓東西瞬間看起來有質感多了.

該版本的 url 是 http://www.alive.tw

Locations of visitors to this page