顯示具有 Web程式設計(PHP | Ajax | PostgreSQL) 標籤的文章。 顯示所有文章
顯示具有 Web程式設計(PHP | Ajax | PostgreSQL) 標籤的文章。 顯示所有文章

2008年5月24日 星期六

商業服務的PostgreSQL Database Cluster



(本文圖片皆引用自PGCluster官方網站,http://pgcluster.projects.postgresql.org)

我在商業服務的Ruby on Rails HTTP Cluster觀念及測試中的第一張圖的前面那一段有提到說,DB的情況有點像是如此,不過實際上情況有點不同。因為有網友的疑問,如今我認為該是時候補完一下。

應用系統如果要能夠真正地服務大量的使用者,與常見裝個MySQL然後跑個PHP論壇程式,是完全的兩回事。因此一個良好的資料庫管理員,必須清楚地知道自己的應用程式與資料庫在單台機器上執行的時候,效能的瓶頸在哪裡。如果不清楚應用程式及資料庫各佔的資源比例,那在切割成叢集的時候,並不見得有 顯著的效能提升,因為負載平衡以及複寫管理的程式都會吃CPU。認為1+1就極有可能等於2,這個是一般的管理員錯誤的認知。

舉例來說,許多大型的論壇,擁有上萬使用者,每天流量破10G;這樣的論壇,有些時候一開始因為資金及管理人力的限制,會考慮只買一台效能相當好的伺服器(例如HP ProLiant 380 G5),並且將Apache+PHP(應用程式)與MySQL(DBMS)擺在同一台主機上。管理員會想說反正這台效能高,一方面省下買另一台伺服器的錢,一方面PHP程式不用透過網路與MySQL連線,理論上應該效能很好。卻沒有考慮到,一般的論壇Web應用程式是以CPU及RAM需要量大的應用,而DBMS是一種I/O裝置(RAM+Disk)需要量大的應用。這是由於,大多數的管理員會誤以為DBMS僅吃CPU與RAM。負載低的時候看起來沒什麼,一旦人數增多,表示應用程式的部分記憶體就會越吃越多。系統用來快取的記憶體不足,很快地瓶頸就會出現在記憶體及硬碟之間,造成資料庫效能低落。這個代價比使用兩台機器跨網路線這樣的部署方式要來的大太多。



2007年9月26日 星期三

Single Page Application - 下一代的Web應用程式

在Web Service, Ajax, Web 2.0, REST等Web應用與技術話題熱潮,帶動許多第二代的Web開發技術成長之後,這些話題也漸漸地消退。不過許多人可能不曾發現,其實這些技術名詞,是在慢慢地顯露一點:Web應用程式逐漸從Server Side轉移到Client Side,也就是瀏覽器身上。

本篇文章要從以往的Server Side Web應用程式,其開發方式與演進來介紹Single Page Application(SPA) 與現今所有主流Web技術。

我在Web 2.0過去,現在與未來介紹Ruby On Rails都有提到一些Web技術的演進,比較明顯的趨勢就是從靜態到動態頁面,而設計的方式也更程式化。而在http://atedev.wordpress.com/2007/01/09/Web2.0:過去,現在及未來也有讀者在前言提到,技術並不是將一個名詞安上去就好。我相當贊同這句話,因此也在這篇文章中希望來做個總整理,以技術及歷史來看看Web是怎樣成長的。

Web應用程式的演進


動態網頁


儘管Web並不是一個三言兩語能拿個版本號碼來解釋,但實際上Web技術確實有些明顯的分隔點。

最早期我們熟知的就是靜態網頁,這應該沒啥問題。儘管在2000前,php,asp就開始流行,坊間的書上也都稱之為動態網頁。而我在此提及的動態網頁程式,實際上卻是從php4釋出的那一年開始(註釋)。這邊要讓大家瞭解的分界點,其實是php4開始被許多商業公司所採用,而軟體的形式也更為套裝化,而不再像之前大家認定的「動態」網頁僅僅只是拿來完成一些簡單的區塊來與一般的靜態網頁整合。


在2004年的時候,Web Framework的產生,創造了Web應用程式另一個新的高峰。而在這個時候也開始有一些Rich Web Client概念的雛形了。我將Ruby On Rails定為一個分界點是因為,他顛覆了傳統動態網頁還在使用設計方式,而改用MVC。但要注意的是Ruby On Rails儘管整合了Ajax與進階Javascript函式庫,但還是沒有改變回傳完整或部分HTML的方式,意思便是HTML的產生始終在Server Side。

2007年6月27日 星期三

PostgreSQL MySQL Firebird 效能比較

http://postgresql-chinese.blogspot.com/2007/06/postgresqlmysqlfirebird.html

我覺得大家看到這一篇就可以不用再爭了,這已經解釋地相當清楚
以往我經常遭到到底該使用哪個資料庫的挑戰,很可惜的是到最後MSSQL,Oracle我幾乎都沒有考慮
你應該不會有聽過人用裝Oracle只是來架個Blog吧?

不過比起文章中我還要附加一點
相較於mysql,視窗版的postgresql安裝介面比較不人性化,而且同樣地視窗管理介面比較簡單(剛好滿足基本功能)

firebird在資料庫系統的定位中就相當模糊,他既無法承受大量的連線數,又需要啟動服務程序,否則效能就會大減
還是一句話,總不能架blog用firebird吧?

至於單機應用,那當然是選擇sqlite
最佳的範例就是GoogleGears

2007年1月8日 星期一

重新探討Cakephp,Ruby on Rails與MVC


關於Model的問題


去年,我還在用cakephp的時候,我注意到這篇文章

http://mk.netgenes.org/archives/230/

當然那個時候,我相當贊同這篇文章的論點,也有回應他。
接著我就開始進行大概半年的專案,當然最後也有成果,我是使用cakephp,所以那個時候也有寫了這一篇。

進階php程式設計-介紹MVC與Cakephp

其中一張圖,我也有提到MVC的寫法,很明顯地我那時候還是認為Model是形同於表格的快取。之所以會這樣認為,也是跟上面的文章一樣。不能否認現在大多數做Web的都還是偏向做做網站,簡單的資料CRUD,將資料庫的資料撈進Controller,簡單地處理就可以達成需求,根本不需要啥複雜的商業邏輯。

那個時候確實知道這跟傳統的MVC觀念根本不一樣,但硬要去說不一樣不如說是一種適應在Web Framework上的變形。畢竟現在cakephp還是用這樣的方式。

我的專案雖然看起來是簡單的管理系統,但確有複雜的程序控制,資料檢查產生的商業邏輯。隨著專案進行,我逐漸發現這樣是不能解決問題的。Cakephp的Model傳回來的是Array,並不是物件,這樣讓我完全無法將商業邏輯寫在Model,在這種情況之下,Model就真的只剩下table快取的功能。

2006年10月30日 星期一

Web2.0:過去,現在及未來


本篇文章主要在介紹Web的發展歷史,目前技術上的發展情況,以及未來的景象。

Web


在有Internet的時候,歐洲高能物理實驗室(CERN)的研究員Tim Berners-Lee,在1989~1991的時候,參考了TCP及DNS,設計了HyperText(超本文),以及HTML(HyperText Markup Language)及用來傳輸HTML的HTTP(HyperText Transfer Protocol)。他也設計了第一套HTTP伺服器NCSA Httpd,在NextStep系統上的第一套瀏覽器WorldWideWeb,以及世界上第一個網站http://info.cern.ch/。隨後,他創立了W3C(WWW Consortium)組織來開發及建立WWW上的協定及共通標準。

2006年8月10日 星期四

PostgreSQL vs MySQL

http://docs.moodle.org/en/Arguments_in_favour_of_PostgreSQL

要仔細想想,自己的堅持並不是道聽途說,也不是人云亦云。

MySQL的3byte Unicode發生過無法透過MyODBC正確敵select的問題,所以我這裡用途不能夠使用MySQL。
目前是因為這樣而無法使用。


PostgreSQL資料庫本身我「還沒有」遇過問題。
PostgreSQL的管理介面沒有MySQL豐富,社群也沒他大,這並不是代表他沒有問題,免錢的有這種成績我已經要感謝上蒼,
而只是如果我是要做商業用途,我應該找一個自己用起來符合要求的資料庫。
因為這樣我選擇PostgreSQL。

選那邊站不重要,重要的是目標有達成。
我應該維持一個立場,如果今天是我整握大局,那就應該由我決定要用什麼,而決定了就更不應該懷疑自己的決定。

2006年6月23日 星期五

有關PostgreSQL好笑的文章

http://my.so-net.net.tw/seiliki/pgsql-advocacy1.html

說好笑應該是在那一段拿機車公車比喻mysql與postgresql的一段,覺得真的是很傳神。
總歸起來mysql適合輕量,只有資料,關連單純的應用,他保證你快。
而postgresql適合良好或是複雜設計的應用,你會用到trigger, stored procedure等功能來處理你的資料(你總不會說論壇的文章需要這些東西吧),那你應該選擇postgresql。
postgresql的穩定度真是嚇死人,以前我把pgcluster的load balancer操爆了,結果DB還沒事。
當然還是一句老話各有優缺點,你應該要慎選你所適合的DBMS,不要人云亦云!

至於為啥都沒提到MSSQL和Oracle,也不過就是因為他們要錢,對於一些小型的專案真的是不可能去使用的...


更多閱讀
http://www-css.fnal.gov/dsg/external/freeware/mysql-vs-pgsql.html

PGCluster安裝及設定

0. 介紹
PGCluster是日本作者修改PostgreSQL,使其達到Auto Replication, Load Balance 的能力。操作方式與原本PostgreSQL沒有太多差異,新增增加的幾個功能也會在下面介紹。

在安裝之前也建議將所有的node使用NIS/NFS管理。

php與MVC

[b]有褒有貶[/b]

看到一些文章,真的是對php在MVC的發展上有褒有貶。我並不是一個會專注一個程式語言,一種曉以大義的全功能解決方案,然後死扒著他覺得非用他不可的人。儘管我現在的工作需求也確實需要在php上發展MVC。在一開始的時候,我也曾經很認真地去追究Asp.Net, jsp, php的優缺點,並不是為了選出選美皇后,而是想想到底誰適合什麼?

想當然爾,php怎樣也拼不過java或是.Net原本忠實可以呈現MVC模式的環境,那這樣子似乎連我這篇文章都要寫不下去。

2006年6月21日 星期三

2006年6月6日 星期二

Web 2.0的發展與迷思

發展
想想,我用網路用了多久了?
一開始的電話撥接BBS(trumpet winsock),
小學時開始有hinet撥接,而這持續了很久一陣子
國中時HTML,Mail開始有聽說,而開始風行
高中時是靠internet,FTP下載東西燒成CD
大學時大家靠internet來找作業...

我想這些都是小市民的過去,一定也是有一堆人跟我一樣過了類似的生活。

大一拿phpbb當作計概作業,不然就是上討論版找分享
大二時一堆討論版變成xoops
大三時google,yahoo購物無人不曉
大四時開始出現blog,wiki
大五的現在...web 2.0

Ajax based component

http://www.scbr.com/docs/products/dhtmlxGrid/index.shtml

2006年6月2日 星期五

進階PHP程式設計-單元測試



  • Why Unit Test(單元測試)?


在本篇文章,要來討論的是Unit Test。
由於文章中會談到許多物件導向分析與設計,軟體工程的觀念,比較適合正在參與或是實做中大型專案的程式設計師閱讀。

2006年5月10日 星期三

進階PHP程式設計-php與 COM




  • COM


在微軟的架構中,有一個著名的技術稱做COM(Component Object Model),本篇文章先不從技術面探討,而是從應用面。微軟大部分的產品都具備COM的能力,不管是什麼程式,都按照COM的介面Type Lib來開發。造成微軟的所有產品,下到OS,上到自己開發的應用程式(如果照著COM的架構設計),都可以藉由COM架構進行溝通。舉例說你可以利用IE呼叫Word或是任何語言所撰寫的ActiveXObject,這便是所謂的ActiveX技術。或是在Excel中嵌入一個IE,並且控制IE內部的任何物件,甚至是HTML物件,這是所謂的OLE Automation技術。可以瞥見這些技術都來自於COM。

2006年4月29日 星期六

進階PHP程式設計-Ajax


這一篇文章主要是教導各位怎樣在php的環境上開發Ajax程式
如果要撰寫ajax,HTML及JavaScript的基礎是相當必要的。

2006年3月6日 星期一

DoxyGen

 

DoxyGen的功能相當多,目前我已經使用在C/C++,C#,php,perl,javascript上
此軟體也附了GUI介面來快速產生Doxyfile
以下就對各種平台及語言的安裝做個介紹

 

平台


Windows
Linux
MacOS X
Solaris9
FreeBSD 

下載頁面

在可以安裝apt的平台上,你也可以找得到doxygen

 


               

語言共同特性


在這之前,你可以先參考以下文章
http://www.dev.idv.tw/wp/index.php?p=22
http://cdblog.twbbs.org/post/119/1657
http://www.longwin.com.tw/~jon/blog/archives/000299.html
這些文章會讓你先熟悉各種操作及撰寫方式。
本文主要在比較告種語言的撰寫過程及會遇到的問題。

各種語言有其不一樣的註解方式,不過遵循以下的註解方式,會讓文件比較不會出錯 。
注意到第二行開始的*都是有一個空白在前面的,雖然我曾嘗試過不依照這種法則,不過會發生有文件解析不出來的情況。對於各種語言,只要維持原本程式本身的註解樣式即可。但是註解要怎樣搭配各種程式語言,就是本篇文章要討論的。

JAVADOC_AUTOBRIEF

將這個選項開啟,你將可以用下列方式撰寫。

[code lang="cpp"]
/** 第一行是簡述 
 * 這邊開始才是詳文
 */
[/code]

否則你就必須在第一行加上@brief
 

C#,Java


C#和Java比較簡單的是,照著IDE預設撰寫的方式,就很容易地產生文件。
雖然有個工具可以輔助Visual Studio.Net 2003快速新增註解,叫做DoxyComment,不過在2005上跑是有問題的。

再設定Doxyfile的時候,還是要注意windows平台使用的都是絕對位置,所以更動專案的位置會導致問題。不過WorkingSpace卻不需要指定,重新開啟doxyfile就會自動決定。

php4


在這裡要討論的是比較舊的PHP4。
PHP說起來在Doxyfile的設定並沒有什麼太大的不同,但tag與phpDocumenter比較起來,就少了@var的tag。由於PHP4並沒有accessor(如public, protected),所以要記得在private member的名字前加上" _ "來和public member做區別。Doxygen只會掃瞄到public method,不會掃到任何class內的public member。所以撰寫php的時候,還是比較像撰寫C++的習慣,會寫get,set來存取property,而var的宣告,就只能當作private property了。

PHP對於原生型態的判斷,如is_null,is_object等。如果是撰寫物件導向,就經常會遇到物件型態的判斷。
[code lang="php"]
function testInput($arg)
{
if(gettype($arg) == "object")
{
if(get_class($arg) == "domdocument")
print "input domdocument"
elseif(get_class($arg) == "domelement")
print "input domelement"
}
elseif(gettype($arg) == "string")
{
print "input is string"
}
else
{
print "input wrong type"
}
return $arg
}
?>
[/code]
就這個範例來說,在註解的時候,就比較不能像是php官方文件經常會看到的mixed arg這樣的註解方式。我還是比較推薦,使用以下的註解:
[code lang="php"]
/**
* @param arg
* DomDocument: 輸入DomDocument object
* DomElement: 輸入DomElement object
* string: 輸入string會自動建立...
* @return
* DomDocument: 原DomDocument object
* DomElement: 原DomElement object
* string: 原string...
*/
[/code]
如此便不會有輸入型態錯誤的問題,你的程式如果釋出的是函示庫,使用者撰寫你的函示庫也會比較得心應手。

Perl


Doxygen並不支援Perl,也是因為Perl的物件導向撰寫有大大的不同。BigSister團隊也使用doxygen,他們自己撰寫了perl doxygen filter,產生出來的文件會比較像是php撰寫的。

安裝相當簡單
[code lang="cpp"]
tar zxf doxygenfilter-1.01.tar.gz
cd doxygenfilter-1.01
perl Makefile.PL
make all install
[/code]

之後在你的Doxyfile內加上
INPUT_FILTER = doxygenfilter
FILE_PATTERNS = *.pm *.pl

註解的樣式也是要特別注意,開頭沒有兩個#加一個空白是不行的。
[code lang="perl"]
## @file
# 檔案的描述
# @class MyClass
# class的描述
package Some::Name::Space::MyClass;
## @cmethod new($arg,%opt)
# 建構子
# @param arg
# XML::DOM::Document: 傳入Document
# XML::DOM::Element: 傳入Element
# string: 輸入string會自動建立...
# @param opt
# [optional]Debug=>Integer,值可以是1.
# [required]Run=>Boolean
sub new {
my ($class,$arg,%opt)=@_;
...
}
[/code]

Perl也是很難做物件型態的判斷,所以還是要註解清楚。