2009年6月5日 星期五

lighttpd web server - configure 篇 (issues)

其實在一個embedded system裡,要用lighttpd來達到所有web ui的工作,真的還滿複雜的,這裡說一下我所遇到的難題。

1. FireWare upgrade:
在案子開發初期,要能有FW upgrade功能是一定要的!! 但很其怪的是,我cgi那裡,明明就有很明確的把要lighttpd從client那裡要檔案,但為什麼總是傳一傳就斷了呢?! 我想了半天,也許是lighttpd本身default的最大上傳檔案size有限制,所以我在 lighttpd.conf裡,加了以下:

server.max-request-size = 900000000
server.network-backend="write"
server.upload-dirs=( "/tmp" )

這裡的意思是,讓lighttpd能接受的檔案變大。 再來就是告知lighttpd在有檔案進來時,要存在哪裡。

加了這一段後,再大的檔案都丟的進來,當然啦,不能大過你自已設的 max-request-size

這個問題我是靠"lighttpd upload limitation" 來找到答案的!

2. 在我們這裡遇到一個非常奇妙的事,就是只要用IE來access 板子上的htm檔,他就會被cache住,而且都不會去reload。使得我們有很多很奇怪的issue發生;像是: reset to default。因為檔案被cache住,所以就算底層的data已經被改成default, 但你從網頁看,所有欄位資料還是原本的,造成reset to default FAIL!

後來,發現,從lighttpd出去的封包裡,server-header裡,並沒有"cache-control=no-cache";於是,我抱著試驗的心態,把以下的 mod_setenv和一些configure加上去

server.modules 裡,要加 "mod_setenv", 然後還要加上這些configure

$HTTP["url"] =~ "^/(.*)" {
setenv.add-response-header = ( "Cache-Control" => "no-store, no-cache, must-revalidate, post-check=0, pre-check=0, max-age=-1" )
}

我稱之他為 "lighttpd cache-control" !

lighttpd web server - configure 篇 (default)

前一篇說了怎麼porting lighttpd,這裡就說一下,要怎麼讓這隻daemon很聽說的動起來。

首先,要注意到,這隻lighttpd要能起來,必須要吃一個叫 lighttpd.conf的檔案,也就是俗稱的conf 檔,上網找,可以找到很多很多sample.

基本上,在doc子目錄下面,你可以找到算是滿不錯的解釋,來教你怎麼大致上使用這個conf檔,來控制lighttpd. 像是,如果你要有user loggin的功能,你就把最上面那個 mod_auth 前的 #拿掉,在lighttpd起來時,他就會有loggin的功能了。 順帶一提,如果你要有loggin 功能,你必須提供 lighttpd.user的user:password的檔案,這樣子,lighttpd才知道你所能接受的使用者名稱和密碼。

如果你只是需要一個web server,那現在你只要執行 "lighttpd -f /etc/lighttpd/lighttpd.conf",你的lighttpd 就應該能被叫起來,這時,你從別台電腦連上去,應該就能在web browser裡能link得到了。

好了,基本的config到這裡應該是夠了,如果有遇到什麼問題,可以提出來大家討討論。

lighttpd web server - porting 篇

因為工作的關係,最近在研究一個很輕巧,很好用,而且功能算強大的web server - lighttpd (lighty)

在embedded system porting lighttpd 說實話算是很簡單,在這裡大約介紹一下

1. 到網路上下載 lighttpd,我的版本是 1.4.20. 下載連結請找google大神。
2. 如果只想在x86上面跑,沒有需要cross compile,或是不需要針對function做一些增減的話,可以直接make; make install.
3. 如果是要在embedded system上跑的話,必須要先編寫makefile, 我這裡提供一下範例

TARGETDIR=$(shell pwd)/target
SSL_CFLAGS += -I$(ROOTDIR)/lib/libssl/include/

CONFIGURE_CFG = \
--host=$(CROSS_COMPILE:-=) \
--target="" \
--build="" \
--htmldir="/www" \
--disable-ipv6 \
PCRECONFIG="$(ROOTDIR)/lib/pcre-7.8/pcre-config" \
PCRE_LIB="-L$(ROOTDIR)/lib/pcre-7.8/.libs -lpcre"

# --with-pcre="$(ROOTDIR)/lib/pcre-7.6" \

CONFIGURE_CFG += \
--with-pcre \
--without-bzip2 \
--without-zlib \
--with-openssl \
--with-openssl-libs=$(ROOTDIR)/lib/libssl/ \
--with-openssl-includes=$(ROOTDIR)/lib/libssl/include/

all: wwwlink Makefile
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile

# CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6/" LDFLAGS="$(SSL_LDFLAGS) -L$(ROOTDIR)/lib/pcre-7.6/.libs -lpcre" LIBS="$(SSL_LIBS)" \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6 -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" \
LDFLAGS="$(SSL_LDFLAGS) -L$(ROOTDIR)/lib/pcre7.6/.lib -lpcre" LIBS="$(SSL_LIBS)" \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.6 -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" LDFLAGS="$(SSL_LDFLAGS)" LIBS="$(SSL_LIBS)" \


wwwlink:
-rm -f www
ifeq ($(CONFIG_CTM_WWW_DIR),)
@if [ ! -d $(PRODUCTDIR)/www ] ; then \
echo "ERROR: There is no www directory in $(PRODUCTDIR)/www." ; \
exit 1 ; \
fi
ln -sf $(PRODUCTDIR)/www www
else
@if [ ! -d $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR) ] ; then \
echo "ERROR: There is no $(CONFIG_CTM_WWW_DIR) directory in $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR)." ; \
exit 1 ; \
fi
ln -sf $(PRODUCTDIR)/$(CONFIG_CTM_WWW_DIR) www
endif


Makefile:
chmod u+x ./configure; \
CFLAGS="$(SSL_CFLAGS) -I$(ROOTDIR)/lib/pcre-7.8/ -DHAVE_PCRE_H=1 -DHAVE_LIBPCRE=1" LDFLAGS="$(SSL_LDFLAGS)" LIBS="$(SSL_LIBS)" \
./configure $(CONFIGURE_CFG)

clean:
rm -rf $(TARGETDIR)
rm -f www
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile distclean

preinstall:
rm -rf $(TARGETDIR)
mkdir -p $(TARGETDIR)
DESTDIR=$(TARGETDIR) \
AM_MAKEFLAGS="-f Makefile" \
$(MAKE) -f Makefile install

romfs:
$(ROMFSINST) -p 755 src/.libs/lighttpd /usr/bin/lighttpd
$(ROMFSINST) -p 755 src/lighttpd-angel /usr/bin/lighttpd-angel
mkdir -p $(ROMFSDIR)/lighttpd_www
$(ROMFSINST) www /lighttpd_www
$(ROMFSINST) -s /var/config.bin /lighttpd_www/config.bin
$(ROMFSINST) -p 755 lighttpd.conf /usr/lighttpd_old.conf
$(ROMFSINST) -p 755 lighttpd.user /usr/lighttpd.user
$(ROMFSINST) -p 755 src/.libs/mod_indexfile.so /usr/local/lib/mod_indexfile.so
$(ROMFSINST) -p 755 src/.libs/mod_access.so /usr/local/lib/mod_access.so
$(ROMFSINST) -p 755 src/.libs/mod_auth.so /usr/local/lib/mod_auth.so
$(ROMFSINST) -p 755 src/.libs/mod_cgi.so /usr/local/lib/mod_cgi.so
$(ROMFSINST) -p 755 src/.libs/mod_ssi.so /usr/local/lib/mod_ssi.so
$(ROMFSINST) -p 755 src/.libs/mod_dirlisting.so /usr/local/lib/mod_dirlisting.so
$(ROMFSINST) -p 755 src/.libs/mod_staticfile.so /usr/local/lib/mod_staticfile.so
$(ROMFSINST) -p 755 src/.libs/mod_evasive.so /usr/local/lib/mod_evasive.so
$(ROMFSINST) -p 755 src/.libs/mod_setenv.so /usr/local/lib/mod_setenv.so
$(ROMFSINST) -p 755 src/.libs/mod_redirect.so /usr/local/lib/mod_redirect.so
$(ROMFSINST) -p 755 server.pem /usr/server.pem

4. 請注意,我在這裡遇到的第1個問題是,pcre的問題,看的出來,lighttpd和pcre有dependence的關係,要能成功的讓lighttpd 找到 pcre的resource,你必須要像我這樣寫,不然,lighttpd會去reference到你本機的pcre,也就是說,就算你build 好了,丟到板子上,也不會動,因為他會說 pcre is not supported.

5. 在romfs方面,則要看你想包什麼功能進去,所以這裡建議,用到什麼包什麼,不要全部包包進去,除非沒有空間限制。

6. 到這裡,打make下去,應該在 src/ 下找到 lighttpd-angel, 和 src/.lib/ 下找到 lighttpd 和一堆 mod_xxx.so。 這些都是最後要等到target board上的必要檔案。

Porting 到這裡,應該算是成功,接下來就要看你把檔案等到target board上能不能動了。

2009年6月4日 星期四

前十字韌帶「又斷」了

其實早就知道右膝又出毛病,也許是因為不想接受手術失敗的結果,所以一直都是不用想他。

唉,可是,我才30出頭,就不能跑跳,會不會也太難過了一點?! 好吧,牙一咬,就跟韓偉醫師橋了開刀的時間。韓醫師的診所也許是因為是自費的關係,很多事情進行的會比一般健保醫院來的快很多,像是照MRI,我記得之前在北醫看診時,要先看診3週,才能約MRI的時間,也就是「至少」要等4週才能看到片子,知道膝蓋裡的情況。

而韓醫師這裡呢?星期5看診,就約了隔週2照MRI,照MRI當天可以拿到片子,如果你看得懂的話,可以先帶回家看一下。當週的星期五,韓醫師就會針對MRI的結果解說。然後告知手術是要怎麼進行,會做些什麼事,你是釘子會從哪裡進,哪裡出。新的韌帶會接在哪個位置,以及半月板需不需要修復等等...  我是覺得很仔細,很令人放心。

好啦~ 開刀前一天晚上8點,到台北市中山醫院報到,抽抽血,辦辦paperwork... 很快就到病房,護士也都很nice,會告知隔天幾點開刀,幾點要換衣服,有的沒的一堆...

開刀當天,因為是10點刀,6,7點就叫我換衣服,打點滴,還有做最後術前教育,像是麻醉有的沒的一堆...

最令人感到驚訝的是,8點接到韓醫師的電話,來詢問還有沒有什麼疑問,有沒有需要什麼的.. 實在又是一整個令人很放心,覺得這位醫生還滿細心的。

嗯,不一會兒,輪到我進手術房了,冰冰冷冷的手術房裡擠了不少人,有護士,有麻醉醫師,有助理醫師,有的沒的,當然,韓醫師己經在手術房等我了。 手術前又是一陣介紹,要麻醉,會怎麼麻醉;接下來韓醫師還是會問,有沒有什麼問題..  我這時不免心裡想著:「都己經躺在手術房了,還能有什麼問題?」 可是,還是那句,很令人放心!

半身麻醉後,身旁的護士說:「我現在要打針讓你睡一下囉!」 真的,就在當她問完那句話後,我就在倒數,看我幾秒會睡著,結果,不騙人,就當我決定要開始讀秒後的下一個知覺就是 ... 醒來時,韓醫師在說:「手術快好囉,你看,這些白白的東西就是你的韌帶哦!」 我才意會過來,啊,手術己經要到尾聲了...

不一下子,手術好了,傷口也縫好了,眼睛閉起來瞇一下;一下子,就發現人在復原室,然後韓醫師正拿著幾張照片在跟我解譯剛才做了些什麼。這個時候,整個人昏沉沉的,也不太記得他說了什麼。

記得才沒瞇多久,人就被推回病房,大概昏了有好幾小時吧,然後伴隨著麻藥退去的是一陣陣的嘔心想吐。好加在我忍住了,差不多到隔天早上才真的正完全恢復,不會想吐,然後正常吃喝東西。

而我的膝蓋呢?! 一直包著冰敷器,很重,然後傷口又會痛,所以我都不太想動,但護士小姐說,如果我不下床尿尿,他就要來催尿了!嚇的我趕緊東抓西扶,搖搖晃晃的去尿尿。 沒錯,手術當天就可以下床走動了,只是當然用的不是那支會痛的腳,但說真的,沒有真的痛到哪裡去,可以用那隻腳站立,會覺得傷口漲痛漲痛,但不至於到痛到站不了。

接下來進入了1整個星期平躺的恢復期,住院我只住了3天,韓醫師就說可以出院了;吩復我要24hr的冰敷。真的! 那個冰敷器可以說是救命用的啊! 每次半夜冰敷器裡的冰都溶了,不夠冰的時候,膝蓋馬上發熱,只要冰塊一下去~~ 哇哈哈,一整個舒服!

術後到現在己經1個月,大概能彎100度左右,能正常走路和上樓梯;因為大腿沒啥力,下樓梯可能還要一陣子。但至少我現在能強烈感受到新做上去的韌帶很緊! 因為我是2次手術,所以一開始的2個星期,韓醫師限制我不能彎,所以現在有點緊! 聽我朋友說,第1次手術的人,第2週就要彎到90度囉!

總結是,手術我認為很成功,但復健真的很痛很辛苦!

至於費用方面,在這裡寫個大概,有需要的人可以看看當做 reference.

手術費+冰桶+住院3天 : $65000 左右
護膝: $46000
看診第1次 $1200,之後每次 $1000
復健1次 $1200,可使用新光教育會館的遊泳池

診所全名:新光骨科運動醫學中心
採預約制,所以,要先電話預約,walk in是沒辦法看的,可以google 一下囉!

算一算,要10多萬,如果沒保險,說真的,是個非常重的負擔,好在,我自己有保險,然後公司團保也可以給付,所以自己要出的錢其實還好。

最後,非常感謝韓偉醫師給予我一個新的膝蓋!