原文:用php做圖片臉部偵測
這是自己在ithelp網站上分享的文章,想一想如果需要在圖片上針對臉部特徵做一些處理的話,可以做參考,所以在這裡提一下,不另外寫文章了。
This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.
原文:用php做圖片臉部偵測
這是自己在ithelp網站上分享的文章,想一想如果需要在圖片上針對臉部特徵做一些處理的話,可以做參考,所以在這裡提一下,不另外寫文章了。
22 元月, 2010 17:16
之前想要熟悉一下PHP Extension的開發,剛好看到LightCloud,他是基於另外一個專案Tokyo Tyrant,Tokyo Tyrant的底層則是一個高速Key-Value pair資料庫,叫做Tokyo Cabinet。TokyoTyrant已經有不少專案支援,包括純php以及extension,但是Tokyo Cabinet似乎還沒有,所以就拿他來開刀。
結果在這裡:http://www.fillano.idv.tw/tokyocabinet3-0.1.src.tar.gz
其實我之前是根據TokyoCabinet 1.4.X的TCADB這個介面來開發,不過最近都在使用Ubuntu,他安裝的套件是1.3.X版本的,之前許多功能不能使用...所以就先把他改成與1.3.X相容,也稍微調整一下程式碼再釋出。
這個Extension主要是提供幾個東西:TokyoCabinet的Hash及B+ Tree格式的資料庫檔案及Hash的記憶體資料庫的支援,可以開啟(如果apache有讀寫權限,那檔案不存在時會產生檔案)、寫入、查詢、讀出等功能。另外雖然可以支援記憶體資料庫,但是用php extension的方式使用不太有意義,我當初寫這個extension除了練習之外,還順便拿來做檔案資料庫來測試使用。
要安裝,必須先安裝php的developer功能,解開檔案後,在目錄中執行phpize,然後./configure -> make -> make install等。mytest目錄中有兩個php檔案可以用來做測試。當然,在安裝前要先裝好tokyocabinet。
Tokyo Cabinet的key與value都是binary safe的,而且不限長度,所以拿來存放大檔案來做streaming也許是個不錯的用法。
因為是習作,所以歡迎指教囉,有些地方其實不太確定就硬上了,心有點虛......
除了透過memcached的協定來存取TokyoTyrant,PECL上面已經有extension支援TokyoTyrant,作者還在持續更新中:
http://pecl.php.net/package/tokyo_tyrant
開發的主站在github:
http://github.com/mkoppanen/php-tokyo_tyrant
作者的blog有不少好物:
http://valokuva.org/
16 元月, 2010 22:21
ECMA-262 Edition5在去年(2009)十二月通過成為新的javascript標準,最近看到一篇(其實就是node.js)blog文章 "ECMA 5/Mozilla Features Implemented in V8" 提到Chrome瀏覽器目前對於新標準的支援,其中有getter及setter,所以就來嘗試一下囉。
(閱讀全文)28 十一月, 2009 22:59
之前試用Chromeos時,在我的機器上跑起來非常慢,而且一段時間就會當掉。在噗浪上看到Jserv大大的噗說,Chromeos的window manager使用到Clutter這個函數庫,於是去http://www.clutter-project.org/網站看了一下,發現這個函數庫底層除了xlib,最主要的就是包裝OpenGL做出來的GUI API...所以強烈懷疑是因為驅動程式沒有支援硬體3D加速所以才讓Chromeos跑得那麼慢。(我的Asus U6S搭的是nvidia的8400M G)
所以就來自己手動把nvidia的驅動程式加到chromeos吧。
(閱讀全文)18 十一月, 2009 14:04
推文( 0 )
Spring Framework有兩個主要的功能,就是IoC容器與AOP。有接觸過AOP的人,就會知道AOP有許多好處,主要是有許多程式的需求其實跟程式的邏輯沒有直接關係,但是又需要在適時插入到邏輯中,最常見的就是在程式中插入紀錄log的功能。像這類的需求可以把它稱作Aspect或是cross-cutting concern,AOP(Aspect Oriented Programming)主要的目的,就是集中處理這一類的需求,讓這一類的需求與邏輯可以拆開,但是又可以在適當的時機介入到程式邏輯中。
AOP可以通過Proxy Pattern來實作,也就是說,透過一個Proxy來執行程式,因為是透過Proxy,所以有機會在做執行動作的前後做介入。Proxy有兩種,一種是靜態Proxy,它必須為每個要透過Proxy執行的類別設計一個相同介面的Proxy類別,然後透過這個Proxy來執行這個類別,這樣在實作上非常麻煩。自從Java有了Reflection能力後,可以用他來偵測類別的介面然後動態地產生Proxy來執行類別,這樣可以節省很大的功夫。
Javascript具備有基本的Reflection功能,所以也有可能用這個功能來實現動態Proxy,然後用來實作AOP。
(閱讀全文)海頓我真的不熟,很難比較批評,但是傅聰真的是以音樂為宗教的一個人。
今天的傅聰看起來其實精神不是很好,年紀不小了吧...但是他彈起琴來真是極度專注與享受,坐下來彷彿就變了一個人似的,每個音都非常注意地把它彈出來,難怪他不願意在記者會上彈琴秀兩手,因為他尊重音樂,不希望這樣輕易對待。
整體來說,今天的海頓充滿了活潑的線條與變化,很有樂趣。海頓的音樂在形式上非常好,我太太喜歡形容他好像是工程師在寫規格書,形式、趣味、優美都恰到好處。我個人其實不那麼喜歡這樣的形式,但是不能不佩服他可以做到這種程度。他是形式的建立者,但是又在一些地方幽默地把這些打破,留下一點意外的驚喜,傅聰把這些幽默感表現地恰到好處。而音樂線條的流暢,其實有時讓人感覺不到這是古典樂派的東西。
對於今晚各個曲目的印象,個人覺得最迷人的是第二首(Sonate in B minor, HOB XVI:32)(疑?這不是貝多芬嗎?)、第三首(Sonate in E flat major HOB XVI:49)(疑?這不是莫札特嗎?)、第四首(Variations in F minor HOB XVII:6)(這首真的讓人感受到對朋友的思念跟哀傷)。
時代、人生與天才造就了獨一無二的傅聰,聽完音樂會回家再把他的CD拿出來聽,感覺更能理解這個人跟他對音樂的想法了。(我太太對他的形容是,他就像一位大廚師用他的人生熬了一鍋的湯頭,把各個作曲家丟到湯裡,都會煮出美味的菜)
07 十月, 2009 10:43
推文( 2 )
為了測試自己寫的PHP Tokyo Cabinet Extension是否在多人運作下不會有問題,興起了利用Web Worker來做測試的念頭。
(按:我自己寫的extension只是包裝他的tcadb函式庫,這樣就可以做local access他的資料庫檔案或是記憶體資料庫。其實透過Tokyo Tyrant才是最好方法,Plurk的LightCloud也是基於Tokyo Tyrant的。Tokyo Tyrant已經有初期的PECL Connector可以支援,同時也有純PHP實現的Connector。)
(閱讀全文)這位七十六歲的老先生只能用一個字形容:「爽」。
上半場的貝多芬「離別」奏鳴曲一開始就非常個人風格,說實話,已經有點辨認不出...絕對是不中規中矩、循序漸進、醞釀張力的,而是時而獨自低語,但是高興起來就如火一樣奔放的貝多芬。有許多地方旋律跟伴奏似乎刻意不分主從,這樣的感覺頗奇妙。(因為從來沒有聽過有人這首這樣彈得,我實在很想聽他對於貝多芬的想法阿)
舒伯特的流浪者幻想曲我不是很熟,他彈安靜的地方非常安靜溫柔,但是速度一直有一個不穩定的緊張感,似乎隱隱要向前衝出去。
下半場的氣氛是越來越奇妙。依序是德布西的鋼琴組曲、六首前奏曲及快樂島。沉沒的教堂有一個在靜謐中隱隱浮現鐘聲的感覺,棕髮少女非常高雅而落落大方,西風果然到處肆虐,煙火真的有火花四冒的感覺...
彈快樂島之前,他對觀眾說,你們好安靜,真是太棒了...然後坐下來彈快樂島,真的頗快樂,煞車剎不住熱情奔放,結束時還順勢轉個身子起來致意。接下來才是重頭戲...
觀眾鼓掌鼓了不久,也獻過花,他很高興的說你們真是太好了,我要彈十五分鐘的安可(應該不止十五分鐘),然後坐下來彈貝多芬的「月光」奏鳴曲(全曲),這首開始時好像突然踩了煞車,非常的高雅、深情款款,當然第三樂章還是熱情如火。接下來彈了蕭邦的升C小調夜曲BI49,這首也是感情全開,一路殺到底。(這首比較簡單,我不時會彈一下,他彈的真的像是開了眼界了)最後,還彈了李斯特的匈牙利狂想曲第十五號(拉高基進行曲)...全場奔騰。鼓掌了許久,他謝幕幾次,然後輕輕闔上琴蓋,大家就知道意思了,很有一種默契感,這樣演奏者跟觀眾水乳交融的感覺很好。
這位老先生今天真是熱情如火又充滿個性阿,只是這樣的感覺恐怕在CD裡面不容易聽到。
之前在噗浪看到有人調查,自從用了噗浪後,減少了多少在部落格上發布的文章呢?自己想了一下,好像真的變少了...
其實看一下我自己在Twitter上面有在追蹤的人,例如John Resig,他一天頂多也只推兩三次,我用噗浪好像....超過了不少。
反省一下,今日不噗了...
(你看你看,連字數都變少了...)
22 七月, 2009 00:00
PHP 5.3.0開始,有一個重要的特性正式加到PHP裡面,就是匿名函數。(請參考:Anonymous functions。手冊還有提到,匿名函數目前是用 Closure內部類別實作,但是不要管他,因為實作方式有可能修改。)
在提到匿名函數之前,先看看PHP的callback應用。callback是php非常好用的功能,可以利用他來用自訂的方式處理資料,例如array_map,就可以用一個callback函數一次處理陣列中所有元素,不用iteration,也不用loop。下面是用callback函數處理一個整數陣列,傳回每個元素的平方:
(閱讀全文)06 七月, 2009 11:08
Plurk沒有提供api,但是有提供使用IM來收發訊息的功能,透過簡單的語法,就可以透過IM做出plurk機器人。
我自己是使用Google Talk來收發Plurk,Google Talk使用從XMPP標準延伸出來的協定,所以要利用XMPP來使用Google Talk不必花太多功夫。稍微找了一下,就在google code上面找到一個雖然還在開發中,但是已經可以使用的專案,叫做XMPPHP。
要讓他可以跑,還需要打開PHP的openssl模組,因為Google Talk會用到TLS以及SASL。另外,就算功能正常使用,我還是碰到許多無法fclose資源的訊息...沒辦法,還在開發中的東西吧...
接下來,只要修改一下他的範例(sendmessage_example.php):
(閱讀全文)26 六月, 2009 21:13
推文( 0 )
Firefox 3.5 RC剛剛出來,在他的 Release Note 裡面提到了一些新的功能,包含native JSON support以及web worker thread這兩個新的javascript功能。(另外,透過安裝addon,還可以支援canvas 3d)
如果熟悉Javascript,應該就知道他是single thread的。現在透過web worker,可以讓javascript擁有一些真正多工的能力(根據說明,他會使用到系統層級的thread)。
雖然web worker使用上有一些限制,例如每次要新增一個worker,都可能會有網路的loading,不過適當地使用還是對效率有所幫助。
使用上有幾個地方要先注意:
19 六月, 2009 12:56
之前用Quercus嘗試將CodeIgniter放到Google App Engines上執行,仿照Google提供的留言板例子,把程式放到CodeIgniter上跑。但是後來發現,在留言板上輸入中文會出現問題。
我的資料是放在一個java bean裡面(拿google的範例,所以叫做Greeting),資料存取透過jdo,存入時使用servlet,取出則用php。結果存入中文資料沒問題,取出中文資料就...一堆亂碼。
比較一下取出的資料,發現似乎字串長度是對的,但是編碼不對,每個中文字元長度似乎都被裁成一個位元組,而不是UTF-8的三個位元組。在java bean裡面動了一下手腳,把getter回傳的資料型態改成byte array,然後用getBytes("UTF-8")回傳,結果就是正確的了。(另外一個方法是用&#number;這樣的格式來處理每個字元)
看起來Quercus處理java與php資料型別轉換的方法(unmarshal)似乎怪怪的...要不然就是他內建的Env.createString()方法有點問題...另外,如果不使用GoogleQuercusServlet也會有一些問題,我把script_encoding改成iso-8859-1就正常顯示php程式中的中文???但是我用binary editor確認過,檔案編碼是UTF-8耶???真奇怪。我還特別修改unicode.semantics、unicode.script_encoding、unicode.runtime_encoding、unicode.output_encoding等選項耶,但是沒啥用處。
Quercus的功能感覺還不夠穩定...
15 五月, 2009 13:07
其實如前篇,並沒有什麼進度,不過反正一步一步測試。
目前是先把Quercus on the Google App Engine的例子porting到CodeIgniter然後放到google app engine跑跑看。urlrewrite的部份透過UrlRewrite Filter來做。
datastore還是用google app engine官網的例子與Quercus on the Google App Engine的php程式整合出來的,只是把MVC分開,用CodeIgniter來跑。
有興趣可以玩玩看:http://fillanocode.appspot.com/。
要改資料庫方法跟ActiveRecord方法,可能需要做一些抉擇。google提供的datastore其實是一個ORM的東西,跟直接操作關聯式資料庫的方法頗有差距,與其porting上去(但是背後要重組query),也許不如透過JDO去操作...,不然要實作到可以直接透過sql操作,要花不少功夫。
12 五月, 2009 20:19
怕標題太聳動,所以先聲明一下,我只是想讓CodeIgniter根目錄下的index.php會動。(怎麼在Google App Engine跑php,請參考前篇用Google App Engine跑php ,至於為何挑CodeIgniter?因為他架構比較簡單,似乎比較容易改...)
Google App Engine有一個限制,就是無法寫入檔案系統,這對於許多framework及php有很大殺傷力。尤其是cache機制,需要可以動態產生、更新cache,這樣在Google App Engine跑php就有很多問題。例如想要跑CodeIgniter,就會出現一堆錯誤訊息,主要來自無法寫入檔案。
Quercus有一個很方便的地方,就是可以自己寫QuercusModule,QuercusModule的公有方法就會成為php函數。使用自訂的函數,配合Google App Engine的datastore服務,就有可能把datastore當作檔案系統來使用。
(閱讀全文)