2009年7月16日 星期四

jommla的MVC之一

http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1


Developgin a Model-View-Controller Component Part 1

軟體開發框架是應用程式的基礎,開發人員能夠應用開發框架進行程式開發,joomla 1.5的開發框架釋放了強大的威力,所有的joomla的程式碼都經過嚴格的檢查並及程式碼的減量,這件文件會將使用框架,開發程式的過程展示出來。

這件文件只展示了如何開發一個hello world的component,在以後的教學文件中,這套開發框架將用來開發完整及多功能的程式,以便展現joomla的MVC設計模式。


Requirements

joomla1.5以上的版本


Introduction to Model-View-Controller

component背後的觀念相當簡單,可是一旦功能不斷增加或進行使用介面的客製化,程式碼會立刻變得複雜。

Mode-View-Controller是一種軟體設計模式,可以有效的組織程式碼,分離商業邏輯及畫面的顯示邏輯,這種設計模式背後的觀念是這樣的,把商業邏輯及顯示邏輯放在不同區塊,當改變顯示邏輯的時候,就不需要修訂商業邏輯的程式碼。

MVC component由三個部份組成,底下會簡短說明,如果要更完整的了解,參閱文件最後的相關連結。

Model

model負責包裝應用程式的資料,他會提供管理、操作及存取資料的方法,在我們的範例中,model將包含新增、移除及更新資訊的功能,他也包含了抓取資料庫資料的功能,通常,底層的資料存取應該被包裝在model中,如果應用程式後端的資料儲存系統由平面文字改成資料庫,model就應該是唯一需要變動的部份,而不是view或controller。

View

view負責從model中取出資料,與使用者互動,web應用程式的view就是html頁面,view從model中抓取資料,將資料填入template中,呈現給使用者,view並不會使資料被修改,他只會顯示從model中抓來的資料。

Controller

controller負責回應使用者的需求,web應用程式中,使用者的需求就是送出需求的頁面,controller會根據使用者的要求,使適當地回應,抓取model中的資料,並將model的資料送給view,controller 並不會在model中顯示資料,他只會觸發model中的method,並將model中的資料傳送給view,以便顯示有用的資訊。


Joomla! MVC Implementation

在joomla中,MVC設計模式使用三個類別:JModel、JView及JController,如果還需要與這三個類別更多的相關資訊,請參閱API手冊。


Creating a Component

這份文件的component,只需要五個檔案

site/hello.php - component的大門(進入位置)。
site/controller.php - 基本的controller
site/views/hello/view.html.php - view檔案
site/views/hello/tmpl/default.php - 輸出的樣板檔
hello.xml – 這個xml檔告訴joomla如何安裝這個component

進入點的檔案名稱必須與component的名稱相同,例如,如果你的component叫做"Very Intricate Name Component”,在安裝時,joomla會自動建立com_veryintricatenamecomponent目錄,進入點的檔案必須命名為veryintricatenamecomponent.php ,不然,這個component就不能運作,一些特殊字元,如底線'_',在joomla中有特殊意義,必須避免在joomla的component名稱或檔案中使用這些特殊字元。

這邊的site目錄就是component目錄。


Creating the Entry Point

joomla永遠透過單一進入點執行程式:前台應用程式的index.php或是後台程式的administration/index.php,應用程式會載入需要的component,根據url或post的資料,載入相關的component。

index.php?option=com_hello&view=hello

這會載入我們的主要檔案,這可以當做component的單一入口點:components/com_hello/hello.php,這個檔案的程式碼相當有代表性。

site/hello.php(site就是components/com_hello)


/**
* @package Joomla.Tutorials
* @subpackage Components
* components/com_hello/hello.php
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/

// No direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

// Require the base controller

require_once( JPATH_COMPONENT.DS.'controller.php' );

// Require specific controller if requested
if($controller = JRequest::getWord('controller')) {
$path = JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
if (file_exists($path)) {
require_once $path;
} else {
$controller = '';
}
}

// Create the controller
$classname = 'HelloController'.$controller;
$controller = new $classname( );

// Perform the Request task
$controller->execute( JRequest::getVar( 'task' ) );

// Redirect if set by the controller
$controller->redirect();

第一行是安全性檢查。

JPATH_COMPONENT是目前component的絕對路徑,在我們的範例裡是components/com_hello,DS是系統的路徑分隔符號,不是斜線就是倒斜線,這由開發框架自動設定,開發人員不必因為轉換作業系統而去煩腦這些事。

載入基本的contorller以後,再檢查是不是還需要其他的controller ,這個component裡,我們只需要基本的controller,但這段程式碼還是留著,以後會用到。

JRequest::getVar()可以在url或post表單中接收變數,如果url是index.php?option=com_hello&controller=controller_name,我們可以在component中存取變數,如echo JRequest::getVar('controller');

現在 ,我們有了基本的controller—HelloController在com_hello/controller.php中,如果有需要, HelloControllerController1可以新增到com_hello/controller1.php中,controller的命名規則是這樣:{Componentname}{Controller}{Controllername}。

當controller建立後,controller會以url指定的網址執行工作,index.php?option=com_hello&task=sometask,如果沒有指定task,就會執行預設的task,預設的task是display,當設定為display時,變數view可以決定要顯示的內容,其他task是save, edit, new...。

controller可以重導頁面,通常一項task,如save完成後,最後一項程式敘述是最後的重導頁面。

主要進入點程式(hello.php)會將控制權交給controller,controller會執行request中指定的task。

我們並沒有在程式中使用php程式的結束符號:?>,這樣的用法可以避免,程式碼輸出時產生不必要的空白,這是joomla1.5預設的寫法,被應用到純php的程式檔。



Creating the Controller

我們的component只有一項工作—向世界打招呼,所以,controller非常簡單,不需要操作任何資料,我們需要做的就是載入適當的view,我們的controller中只有一個method:display(),大部份的功能都已內建在JController類別中,我們要做的全部事情只是呼叫JController::display()方法。

site/controller.php基本類別的程式碼如下:
/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/

// No direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport('joomla.application.component.controller');

/**
* Hello World Component Controller
*
* @package Joomla.Tutorials
* @subpackage Components
*/
class HelloController extends JController
{
/**
* Method to display the view
*
* @access public
*/
function display()
{
parent::display();
}

}

JController類別的建構子一定會註冊display()方法,除非用別的方法另外註冊,display會被設定為預設task。

這段程式碼中的display()方法並不必要,因為它只是呼叫parent constructor,不過,這倒是很好的線索,讓我們發現controller裡頭發生了什麼事情。

Jcontroller::display()會從request中決定view及layout,並載入view,設定layout,當你在component中建立選單,menu manager會讓administrator可以選擇view,指定layout,view是指一群資料的組合,layout決定view如何組合排列。

在我們的component中,我們只有單一的view,叫做hello,及單一的layout(default)。



Creating the View

view的工作非常簡單,他抓取要顯示的資料,再把資料送到template,資料送到template是使用JView::assignRef 方法。


site/views/hello/view.html.php的程式碼如下:


/**
* @package Joomla.Tutorials
* @subpackage Components
* @link http://docs.joomla.org/Developing_a_Model-View-Controller_Component_-_Part_1
* @license GNU/GPL
*/

// no direct access

defined( '_JEXEC' ) or die( 'Restricted access' );

jimport( 'joomla.application.component.view');

/**
* HTML View class for the HelloWorld Component
*
* @package HelloWorld
*/

class HelloViewHello extends JView
{
function display($tpl = null)
{
$greeting = "Hello World!";
$this->assignRef( 'greeting', $greeting );

parent::display($tpl);
}
}



Creating the Template

joomla的template及layout是一般的php檔案,可以用來排列從view中傳來的資料,由JView::assignRef 方法指定的變數,可以在template中使用$this->{propertyname}變數,進行存取。

我們的template非常簡單,我們只要顯示從view中傳來的祝福語,這個檔案是site/views/hello/tmpl/default.php:


// No direct access

defined('_JEXEC') or die('Restricted access'); ?>

greeting; ?>





Wrapping It All UP – Creating the hello.xml File

你可以手動安裝component,使用ftp拷貝檔案,再手動修改資料庫,建立package,由joomla做安裝會是比較有效率的做法,package包含了不同的資訊。

基本的component描述(名稱)、版權敘述

需要拷貝的檔案

選擇性的:一個php檔案,進行安裝及反安裝的操作

選擇性的:一個sql檔案,進行資料庫資料的安裝及移除

檔案格式是xml,底下是hello.xml的檔案內容




Hello

2007-02-22
John Doe
john.doe@example.org
http://www.example.org
Copyright Info
License Info

1.01

Description of the component ...




controller.php
hello.php
index.html
views/index.html
views/hello/index.html
views/hello/view.html.php
views/hello/tmpl/default.php
views/hello/tmpl/index.html




Hello World!



hello.php
index.html







如果你仔細觀察這個檔案,你會發現需要拷貝的檔案,有一些並沒有討論到,例如index.html檔案,這個檔案是避免目錄下的檔案被全部列出,攤在使用者面前,一些伺服器沒有設定好,就會有這個問題,index.html檔案內容如下:



這是一個非常簡單的空白頁面。

另一個檔案是hello.php,這是admin section的進入點,暨然我們沒有admin section的進入點,他呈現的內容會跟index.html相同。

2009年5月20日 星期三

驚喜挪威

驚喜挪威這本書的作者是吳祥輝,整本書籍以吳祥輝的個人觀點,將台灣的狀況與挪威做對照,書籍起頭以台灣家庭常見的政黨藍綠對決起頭,結尾以挪威及台灣的親切民情結尾,整本書籍探討的不僅是挪威的狀況,也對台灣的現況做了許多的思考及研究。

書中介紹了許多挪威的歷史人物,其中有文學家、音樂家、政治人物,最讓我訝異的是著名的挪威文學家,他們的雕像佇立在挪威的市區,供許多人瞻養,這真是難得,跟台灣人愛跟政治人物沾上邊的習性,天差地別,台灣人的婚喪喜慶,總是需要政治人物來充場面,挪威人對文學家、音樂家的尊重,讓人感覺份外不同,著名的音樂家出殯時,城中一半的人口竟出門相迎,這充份展現對音樂家的尊重,國家人民的氣質跟習性大不相同。

挪威的社會福利好,物價高,挪威人的平均薪資約十八萬台幣月薪,不過東西也貴,一個漢堡要價台幣500元,搭一次電車要價200多元台幣,而且交通運輸的時間很短又很貴,不像台灣三更半夜還在發車或坐飛機,基本上只有白天才有辦法搭乘大眾運輸系統,而且只到五點多,過了這個時段,抱歉,下次請早,不然就租車吧!相較起來,台灣真是方便太多了。

挪威人似乎沒有顧客至上的概念,東西標價沒有在講折扣的,難怪他們這麼一板一眼,不像台灣價錢的彈性是可以談的,沒有定死不變的道理,無怪乎,台灣做什麼東西都講求彈性、速度,因為比較知道變通,不過這樣也可能走短線,沒有辦法建立紮實基礎。

政治上的意識型態及挪威人的個性在書上也被一一提起,作者求真求善求美的個性也在書中表露,也對台灣的政治現狀做了批判及省思,也對台灣人的國家記憶不全症做了回顧及探討,作者以自己的角度出發,對台灣現有的價值觀及生活模式做了一場深度之旅。

2009年5月19日 星期二

digitalus

http://digitaluscms.com/

這個專案是以Zend Framework及jQuery做為基礎構建的cms管理系統,整個系統的程式碼有一種熟悉的感覺,因為Zend Framework及jQuery正好是我最熟悉的兩套開發框架,Zend Framework是Zend官方團隊所維護及發展的,最能展現PHP物件導向的威力,jQuery是最受歡迎的javascript開發框架,兩者的結合正好可以當做我研究的對象。

架好後,整套系統運作很順暢,只是專案的討論區上人氣稀疏,套件中有的功能並沒有全部實做,上open source的cms網站上看,這個專案並沒有被列為cms的選擇之一,想想也對,雖然專案有Zend Framework及jQuery的加持,但功能並不完整,最嚴重的缺點,就是套件必須安裝在apache上的根目錄上,這是在開什麼玩笑,難不成為了安裝這個套件,得弄一個虛擬主機,如果以子目錄安裝,圖片都不會出現,有的功能也不能使用,這應該是路徑的問題,其實不難解決,更動的程式碼應該不會太多。

整個套件的發展潛力十足,很容易安裝,大概十分鐘就裝好了,邊看網站上的tutorial,邊操作,只須二三個小時就能上手了,功能不複雜,非常簡單易用,套件以mysql為資料庫,資料庫引擎使用innodb,這點我非常欣賞,一堆的cms都是使用MyISAM資料庫引擎,這真的不是一個好的選擇。

digitalus雖然潛力十足,但前途未明,不知道未來走向如何,拿來研究,改進自己的程式碼應該不錯,但是如果套用在上線的程式上,就太可怕了,整個套件的用法應該會再變動,程式寫法也還會做變化,先看看再說,免得被當做試驗品。

2009年5月18日 星期一

digitalus

http://digitaluscms.com/

陳瑩光老師給的網址,這個cms專案是用Zend Framework及jQuery撰寫的,看了一下程式碼,有一種熟悉的感覺,這真是太好了,不用再重頭學新的語法,過去投資的時間及精神不用新來過,本來是想用joomla來玩一些應用,不過這套專案應該會更符合需求,符合我自己的開發需求。

2009年5月17日 星期日

PHP is NOW

PHP is NOW


資料來源:

http://www.ibuildings.com/blog/archives/1554-PHP-is-NOW.html


原始作者:

Cal Evans
Director of PCE
Cal Evans
Ibuildings公司的PHP專業發展中心的主管,他已經在IT產業26年了,過去9年,專注於PHPMySQL領域。 Cal PHP書籍及文章的作者,並且在世界上許多的PHP會議場合演講, Cal 的部落格在 http://blog.calevans.com


翻譯:

羅仁治


php正在轉折點上,目前有許多的因素促使php的應用加廣加深,並把scripting language的標籤撕掉,成為企業開發時的正式工具。


許多php社群的開發者在過去幾年已經將php視為正式的開發工具,Digg, Expedia, Yahoo facebook這些公司在php的討論會議上一再證實php是一項有用的工具,另一些公司,Ladbrokes, Channel Five, Fiat, Panasonic, 以及 BBC,他們不但使用php做為系統背後的整合性程式語言,也將他應用在正式地,企業等級地交易流程系統中。在數目不斷成長地大型開發商中,php己經從為何使用的思考邏輯變成了為何不使用的問題。


開放源碼的經濟效益

許多因素的匯聚造成了這個轉折點,目前的世界經濟局勢是最大的影響因素,在泡沫經濟期間,公司很容易花費六位數或七位數的代價購買私有軟體,這可看出IT系統缺乏投資報酬率,經濟狀況好的時候,經理人依據老闆專業術語數量的平方做為採購依據,換一個有趣的方式說明,就是在經濟狀況好時,IT系統能不能跟上潮流是判斷的依據,而不是根據最低的貢獻度。


當狀況轉壞時,IT預算緊縮,新科技必須展現在公司財務報表中的貢獻度,而不是順應潮流。


在軟體經濟時代,開放原始碼及php與私有軟體相較,有許多優勢,當然,php最大的優勢就是不須授權費用,php php的延伸功能 PEAR PECL 以及以php搭建的開發框架都是免費的,暨然不用授權費,維護費及購買費用,以更少的IT預算就可以做更多事情。


即使經濟情勢呈現下滑的走勢,免費仍然不是佈署php的決定性理由,PHP有自己的方式增加附加價值,從簡單的類別庫到系統的佈署都有公司提供支援或服務,許多公司,像Zend, php|architect, NuSphere 會替別的公司或開發人員,開發須支付費用的開發工具或服務,這樣的方式,與開放原始碼公司 EllisLab, Sensio Labs Acquia 的營運方式雷同,PHP免費,不代表跟PHP相關的所有東西都是免費的,當與PHP相關的產品或服務不是免費時,公司必須決定他們的標價是不是增加了公司的價值。


這個工具變得更強大了


第二個因素是即將釋出的php 5.3版本,PHP 5.3目前在RC階段,最終版本會在2009年夏天公佈,PHP 5.3不像大部份的小改版,他是有許多新功能的大改版,PHP物件模型的改變,強化的新語法,引擎的改善,使他比之前的版本快速穩定,PHP的核心開發成員花了很多時間強化穩定度,並加強PHP引擎—Zend Engine的功能,雖然每一個新的PHP版本會帶來一些新功能,只有PHP 5.3提供有價值的強化功能。


php有許多朋友


我們提到了PHP系統,也提到了供應者的深度及廣度,然而,造成這個轉折點的另一個因素,是PHP現在開始被許多大廠支援,他們對php的成功有商業興趣,IBM釋出了WebSphere sMash (也就是大家熟知的 ProjectZero)sMash上的php是在JVM上執行的,而不是在Zend Engine上跑,sMash上的php並沒有包含所有的php延伸套件,但己經可以執行許多的重要應用,像是SugarCRM phpBB. IBM採用ProjectZero,代表對php語言的承諾及擔保,他們選擇php做為開發的語言不只代表他們對這個語言的強大信心,也對圍繞在php四周的社群投下信任票。


微軟對php的興趣每年都在增加,開始時是在2006年,對事業伙伴Zend感興趣,再來是每年發表的Microsoft Web Developers Summit都會有PHP,他們已經承諾,會讓PHPwindows上長期地健康發展,他們甚至雇用了一位全職的php核心開發人員,強化windows上的PHP,努力的成果,就是最近在FastCGI上發表的PHPPHPwindows上的成熟度就跟.netjava相同,可以用來開發各種規模的web應用程式。


Oracle長期支援PHP,了解並支援社群,鼓勵他們使用公司的旗艦產品,Oracle會透過Christopher Jones定期釋出PHP核心的函式庫或程式碼,此外,他們也會對PHP的會議提供財務或其他援助,像是即將到來的Dutch PHP Conference.就接受Oracle的援助。


最後一位但不是最不重要的一位朋友,是 Adobe 。他們援助的計畫,像是 AMFPHP Zend_AMF, PHP整合為Adobe開發工具的一部份。


結論


這三個因素相加,經濟情勢轉壞,下一個版本的強化,及大廠的支援,共同指出2009第二季到2010PHP在企業開發領域占有一席之地,PHP非常普及,穩定並有良好支援,如果你問到IT經理人,採用新科技的三個因素是什麼,他們會至少說出其中的二個原因,這是PHP的轉折點,對開發人員而言,這代表更多的機會,對IT經理人來說,這開啟了許多不可能實行的專案另一道門,不論如何,PHP時代的到來,意味著人人有機會成功並互相分享。


IbuildingsPHP的支援廠商,我們相信,回饋社群是我們的義務,他們給了我們機會站在領先地位,我們也是世界上PHP開發商的翹楚之一,不論你是才剛開始探索PHP的可能性,或是找尋一位伙伴實現這些可能性,我們希望可以和你一起奮鬥,就像是許多公司一樣。


(c) 2009 Ibuildings All rights reserved. Use by permission

2009年4月29日 星期三

人聲雜響 螢火點點

昨晚學校護士阿姨臨時召集大隊人馬,約大家晚上一起去看螢火蟲,約好的時間是六點集合,為了趕上集合時間,隨便抓了蛋糕跟玉蜀黍把肚子填飽,就趕去跟大家會合。

車上阿賢跟佩宜與佩琦一直鬥嘴,阿賢一直被虧,不過他也一直虧自己,車上真是非常熱鬧,第一站停留的竟然是晚飯的地方,我心想,天啊!我趕什麼勁,早知道一口飯都不吃,美食當前,我根本沒辦法下嚥,我已經飽了。

到目的地後,往山裡走,月光照射下,不難認路,產業道路兩旁螢火蟲一閃一滅,很多人會去抓螢火蟲,有一、二隻螢火蟲還會飛到我身上,不過都不會想把螢火蟲抓住,我只要欣賞就好了,遠遠看比較漂亮,喜歡慢慢走、慢慢看,看這些漂亮的燈火變化,聽人嬉鬧,拍照的愉悅笑聲。

2009年4月28日 星期二

放鬆

晚上跟同事一起吃飯,雖然還是一樣沈默,大部份時間都是靜靜聽著同事的喧鬧鬥嘴,可是會有一種融入人群的感覺,逃避人群太久了,這樣跟人相處讓我漸漸可以放開,尤其對面的小女生講話一直不停,有時戰火還不時會延燒到這,話語非常直接,覺得很好玩。

這個小女生非常活潑,飯後又邀大家到pub裡頭,這是我第一次到pub,裡頭燈光昏暗,她又招呼朋友快點到,她的個性大概很急吧!我是思考型的,事情總要想清楚後,計畫好後還不太敢動手,她是手機拿起來就直接按了,真是滿新奇的,十足的行動派,不知道要怎麼形容。

回到家後,樓下留下一盞燈還亮著,爸媽都睡了,坐在電腦前,心中煩躁的情緒突然消失,一些解不開的程式設計的問題都暫時拋開,有一種放鬆的感覺,真舒服。這次大概不會有任何結果,不過心頭舒服,交個朋友還不錯,原來人有時也需要一些朋友之間互相的交流,以後有時麼聚會,管他是什麼性質,只要不是打官腔的飯局,都去,才會找到情緒的出口。

2009年4月27日 星期一

蘇杭四日遊

全中運期間,苗栗市的學校做為選手村,學校放假,這段期間剛好可以做為旅行假期,讀書會的老師安排了蘇杭之旅,邀大家出遊,自己心中有事放不下來,本來是不太想去的,只是杜子老師喜愛旅遊,平常又非常關心讀書會的成員,受到杜子老師的感染後,就決定去了,體驗一下蘇杭風情及上海的繁華。

踏上大陸的土地後,導遊招呼大家上了小巴,當地的全程導遊,單名一個雷字,喜愛中國古典文學,愛寫詩,是位性情中人,一路上,中國古典的詩詞歌賦不斷從他口中吐出,優美的景物在典雅的辭藻襯托下,彷彿成了一幕幕的電影場景,讓人回味當時的故事情節,白蛇傳的故事、蘇軾的才華洋溢、杭州的富庶過往,就在腦海中一一浮現,這些豐富的歷史故事,讓優美的景物頓時活了起來,讓人不禁想再三停留在這些景點當中。

第一天及第二天早上,旅行社還安排了蘇州當地的地陪,這位地陪是一位嗆辣的女導遊,國學素養一樣很好,講話單刀直入,個性直率豪不掩飾,專業素養真是沒話說,杜子老師跟林老闆有時會故意脫隊,到處走走晃晃,這位女導遊就會毫不客氣地說教,車上的讀書會成員就會開始跟她抬槓,全車的人都一起哈哈大笑,這種測試人性的方式,真的滿好玩的,杜子老師並沒有生氣,跟她一起拍照,賠不是,這位導遊把我們當做小學生在帶,感覺上,很像我們在帶學生的方式。

西湖的龍井茶莊,服務員介紹杭州最有名的龍井茶,席間,有人提到微婚條件,這位小姐直說「房卡、車鑰拿來」,還真直接,讓人體會到兩岸人民個性上的差異,只不過這位小姐已婚,這句話可能只是說說而已吧!杭州真是一座美麗的都市,遊覽車行經的每條路上,路旁或道路中央都會栽種樹木,這座城市的居民,每人可以分到15棵樹木,真是超級幸福的,在綠樹環繞中,西湖悄悄地出現在視線中,第一眼看去,湖面廣闊,台灣的日月潭與之相比,簡直是小池塘,如果能在這住上幾天,肯定值得,壯闊的湖面,美麗的景緻,絕對能體驗湖光山色之美。

上海市不愧是新興都市,高樓林立,城市規畫井井有條,到處都在大興土木,上海外灘的老樓房,有濃濃的歐洲風味,站在江邊看這些樓房,會懷疑自己真的是身在中國嗎?怎麼中國會有一個地方,建築風情像是歐洲大陸的風格,這種歷史情調,台北無法營造,外灘對面的高樓一棟棟矗立,城市規畫有條不紊,從高樓向下俯瞰,車流量龐大,許多地方都在塞車,繁華景緻猶勝台北,只是沒有雜亂無章的招牌或是破壞景緻的頂樓違建,果然有大國氣勢,大國崛起的企圖心令人讚嘆,城市規畫的氣度、規模,執行的魄力、膽識,思維的細膩、周全,大概難有其他城市可以匹敵吧,我不清楚細節,直覺上這真是一個快速向前飛躍的國家。

蘇州留園停留的時間短暫,林園設計細膩,建築思想中體現人文概念,標準的中國園林建築,以前都不覺得中國建築特別漂亮,但這次的參觀後,真覺得美,台灣雖然也有園林設計,但規模這麼大,設計這麼繁複的,還沒看到,就像中國電影一樣,在沒看赤壁之前,總覺得中國古代軍隊的軍事實力沒什麼看頭,看過赤壁這種大手筆的戰爭片後,才會有震撼的感覺,雖然與好來坞相比,還有一段差距,但中國古代部隊強悍的作戰能力已經令我刮目相看。

這次的旅遊,住宿飯店都是五星級的,在台灣還沒自費住過五星飯店,五星飯店的住宿品質果然不同,房間的設計細緻貼心,整體設計非常舒服,晶華開的五星飯店的分店,我比較欣賞,跟我喜歡的設計風格很像(simple、clear、clean),簡單、明白、乾淨是我設計網站時的設計座右銘,說起來簡單,但要做到,背後必須要有非常好的規畫能力及自我堅持,不然很容易就放棄的,這種風格做起來是困難重重的,不過使起來非常舒服,沒有負擔。

回程的機上,和杜子老師坐在一起,他觀察到一個現象,飛機停妥後,所有人都離開位子,站在走道上,只剩下杜子老師、我(因為我出去的位置被杜子老師堵住了)和林老闆三個人還坐在位子上,杜子老師用了一個故事比喻這種現象:有一位雞農養了許多的雞,有一天,一隻老鷹飛過雞舍上空,被一隻小雞發現,立刻發出訊息警告所有的雞隻,雞舍立刻陷入一片騷動中,雞農被這陣騷動聲響驚動,跑動雞舍一看,整個雞舍的雞隻互相踐踏,死傷慘重,假若沒有任何雞隻發現老鷹在上空盤旋,就不會有這麼嚴重的死傷。杜子老師接著說:當人們說台灣完了、股市要崩潰了,其實是自己嚇自己,這就是人性,人習慣和團體一起行動,而不是做自己,要知道如何做自己是有難度的。


從小到大,我們就被教育大陸是一個落後國家,如果到繁華的上海一趟,這種執著會立刻崩解,進步的上海,繁華程度絕對在台北之上,如果死抱著之前的想法,是一種自我封閉,其實自己心中還有許多的執著放不下,這種執著讓我脫離現實,沒辦法看清事情,放下心中的界限,不要限定什麼事情一定要怎麼處理,朋友間的關係必定要如何,這樣就會快樂一些吧

2009年4月6日 星期一

流量分析軟體

二套流量分析軟體

1.google analytics

申請一個帳號後就可以使用,申請流量服務時,只要將javascript程式碼貼在想要統計流量的網頁上,google就會幫你進行網頁流量的統計,不用再費心於伺服器的架設,程式的修改,非常方便。

免付費的服務有一些限制,不過已經非常夠用了。

2.piwik:http://piwik.org/

phpMyVisites的更新版,要自行架設server,以php及mysql撰寫而成,功能非常不錯,有空可以研究研究。

2009年3月8日 星期日

為什麼使用jQquery

jQuery是一套以javascript開發的函式庫(開發框架),但這套函式庫的用法及背後的觀念與javascript大不相同,jQquery的開發概念就以直覺、容易使用做為開發的目標,所以使用起來非常容易上手,只要熟悉jQuery的用法及使用概念,會被jQuery精簡的程式碼及直覺的設計方式吸引,jQuery是一套容易上手的javascript函式庫。

網路上有非常多的javascript開發框架,許多的開放源碼套件都會採用這些開發框架,使用這些javascript​的開發框架,可以省去不少自行撰寫函式庫的時間,不用重頭再去撰寫功能相同功能的函式庫。jQquery、prototype、dojo這些javascript​的開發框架讓我們可以只使用jQuery或是prototype或是dojo的語法就與不同的瀏覽器溝通,而不同的瀏覽器表現的行為會是相同的,如果直接以javascript撰寫這些功能,就必須考慮不同的瀏覽器所表現出的結果會是不相同的,必須判斷瀏覽器的種類再分別撰寫相同的功能,使用jQeury這類開發框架,可以讓我們省去這道步驟,jQuery這類開發框架,已經幫我們處理掉這些問題,我們只要專心寫程式邏輯,而不用去考慮瀏覽器的種類及版本的問題,使用這類開發框架,可以輕易跨越瀏覽器的鴻溝,讓client程式天生就有跨越瀏覽器平台的基因。

許多的開發框架,其實並不容易親近,看了dojo的文件,我覺得與原本的javascript相比,其實一樣麻煩,並沒有減少多少撰寫程式碼所需花的功夫。jQuery的設計原則就大不相同了,基本上,撰寫jQuery程式只要把握兩個原則,第一個原則就是要找到你要叫他做事情的瀏覽器物件,這個物件可能是一個文字輸入框、一個超連結,找這些瀏覽器物件的方式,是使用css的物件階層架構,第二個原則就是發生了什麼事件後,這些你找到的瀏覽器物件,要做什麼事,我們撰寫的邏輯,就是在選定的物件及事件內,寫程式,叫瀏覽器做事情,清楚明白,不用跟一堆迴圈奮戰,節省很多寫程式的時間。

jQquery的plugin非常多,官方的ui plugin套件,功能非常強悍,許多client端的功能都已經做進去了,使用文件豐富,很容易上手,非官方的plugin更不得了,太多了,要用的功能不用自己重頭寫,找一找,非尚豐富的,許多的plugin也是非常有質感的,可以快速套用到自己的程式中。

使用jQuery的人非常多,現在還有中文書籍可以參考,大陸的參考資料更多,線上文件也很豐富,我的第一個jQuery程式就是看線上文件寫出來的,如果不想買書,直接看線上文件也可以很容易學會這套易學易用的javascript開發框架。

2009年2月25日 星期三

Zend_File的功能

Zend Framework的文件上列出Zend_File的功能算非常完整的,看文件看得非常認真,想說,就用現成的套件就可以了,把文件都看完後,上線實做卻發現一堆的功能都是正在開發中,實際檢視原始碼,才發現天啊! 根本就沒有這些功能的程式碼,心裡真是圈圈叉叉。

解決方式有兩個,自己寫一個物件或是在每段程式碼都代入上傳的程式碼,當然是寫一個物件,省得多寫一堆東西。煩啊!!

2009年2月23日 星期一

美麗的海灘

星期六看了一天的Zend Framework文件,眼睛不舒服,下午騎著摩托車到處亂晃,本來是想去水尾看海的,但是忘了怎麼走,因為那是高中時代的事了,東晃西晃,不知怎麼的就到了後龍海堤。

站上海堤,出海口的幾座風力發電機,遠遠望去,感覺好舒服,最高處的風力發電機的位置應該就是著名的景點───好望角了,好望角人太多了,像是菜市場,人擠人的,想在那邊安靜的走一會,是不可能的。

海堤下,是黑灰色的沙灘,不知道是不是因為眼睛太累的關係,第一次感覺黑灰色的沙灘是如此的美麗,冬天的夕陽照射下有一種含蓄沈靜的美,看著海,看著沙灘,自己一個人在沙灘上慢慢走,心頭很舒服,這時,腦中的Zend Framework的運作細節還是在運作,只是沒有剛接觸時的茫然感,而是一種紛亂的感覺,底層的運作細節、Adapter、Abstract、Interfacce、事件觸發等都在互相連結(也可能是互相糾結吧),自己覺得必須抽離這種感覺,免得神經發作。

這個時候,很想跟另一個人一起散步說,不過,應該很難,心頭五味雜陳,內心的煩躁感只是稍微平歇,事情放心裡,很難過。

心痛的感覺

很喜歡一個女生,有氣質又漂亮,只是似乎很不好追,幾次短暫的接觸,態度很冷的,令我直打哆嗦,大概是對我沒意思吧!心碎!!長這麼大,很少有這種感覺說,心頭酸酸的,想提起勇氣,又不想再經歷這種感覺,真是矛盾。

換個方式好了,我個性直來直往的,大概嚇到人家了吧!用書面方式好了,避免去嚇人,希望有用,也省得再次體驗在冷凍庫的感覺,避免失落感再次浮現心中,這種感覺很難過的。

不過,雖然很想再嚐試,但總是不能付諸行動說,這也很難過說,老天!怎麼辦?人生的十字路口,這需要用心經營的,不跨出去就不會有結果,哪怕只有過程,我都會覺得很快樂說,但是第一步很重要。

不管了,等一下先去打球,晚上再慢慢從長計議。

晚上再把要改寫的程式用workbench畫出來,規畫程式的架構,希望把不好的感覺淡化,這是我喜歡做的事,希望有效,思考程式的流程也可以讓我專注,忘掉這些,如果沒辦法,就只好轉移追求目標了,希望這種事不要發生。

2009年2月18日 星期三

clone virtualbox的磁碟系統檔

在virtual box中建立的ubuntu映像檔,使用VBoxManage命令可以建立另一個相同的映像檔,就不用重灌另一套ubuntu,在virtual box中如果要建立多個server同時運行的環境,就非常簡單了,只要用VBoxManage命令拷貝多個ubuntu映像檔就可以很方便的建立多個server,以便進行整個系統的實做。

為了進行mysql replication的實做,我用virtual box的VBoxManage命令,另外烤貝了一份ubuntu映像檔,但烤貝的映像檔,網卡都動不了,後來使用dmesg|grep eth命令,發現系統竟然要我改設定檔的網卡代號,真神奇,原來映像檔的網卡代號是eth0,eth1,烤貝出來的映像檔,網路卡號就必須是eth2,eth3,不然網卡不會動,這真神奇。

網卡設定好後,測試網路沒問題後,設定mysql的master及slave,實際上機跑起來,一切順暢,slave上都可以自動接收master的資料,這以後要做自動化的備份就比較方便了,不用手動做這些備份的煩人動作。

再來,就要測試innodb database engine的各種狀況及dead lock的處理,一切沒問題後再寫程式,程式上線不能出問題,innodb的部份要小心測試,不然到時出錯,麻煩就大了。

2009年2月9日 星期一

php編輯器比較

目前我正在使用的php編輯器有兩套,一套是eclipse pdt,另一套是netbeans ide,這二套編輯器都是開放源碼軟體,不用付費就可以使用。eclipse pdt可以在www.zend.com的網站上下載使用,netbeans ide可以在www.netbeans.org網站上下載。

這兩套軟體的操作概念都非常類似,所有相關的程式碼、檔案、圖片等等資源匯聚成一個專案,再針對專案撰寫程式,或進行設定。在進行程式碼撰寫前,必須先建立一個專案,專案其實就是一個目錄,將所有的程式碼、檔案等等資料放在這個專案裡(目錄),以便進行專案的設定或管理。

eclipse除了專案的概念外,他與netbeans還有一個不同點,eclipse有workspace的觀念,workspace其實也是一個目錄,所有的專案都必須放在這個workspace下,不然eclipse就會找不到相關的專案,如果放專案的位置與目前的workspace不同,就必須切換workspace的位置,才能使用專案。netbeans就沒有workspace的觀念,設定專案時,就必須指定專案的目錄位置,專案可以散落在各個不同的目錄。

eclipse的檔案管理能力比較強悍,程式碼自動補齊的功能也比較完善,在eclipse中,可以直接匯入或匯出檔案,但在netbeans中就沒有這個功能,必須用檔案總管進行拷貝的動作,如果在eclipse中直接拷貝檔案是會出問題的,一定要用內建的檔案匯入匯出功能,eclipse會追蹤這些檔案訊息,如果直接拷貝,eclipse就無法追蹤了。

eclipse的畫面比起netbeans,真是漂亮太多了,我不太喜歡使用netbeans,畫面感覺比較粗糙,沒那麼有質感,這二套軟體的鍵盤快速鍵,不太相同,轉換編輯器時會有一段適應期。

eclipse的php檔案內如果含有html碼,如view檔案,這類php檔就會有排版用的html碼,eclipse的自動重排功能沒有辦法把html排得很整齊,他會把html和php程式碼混在一起,不重排還好,一重排簡直慘不忍睹,netbeans這方面的功能就好太多了。

這二套編輯器都要花一段時間適應,操作上各有千秋,不過我比較喜歡使用eclipse,eclipse有免安裝的版本,下載後直接解壓縮後就能用了,netbeans就一定要安裝,不過安裝的速度很快,一直按下一步就好了,這二套軟體都是跨平台的,目前我家裡的作業系統是ubuntu,上班的地方是xp,這樣就不會有跨平台的問題了,這大概就是開放源碼的好處吧!轉移作業系統比較方便。

2009年1月27日 星期二

佇列

佇列是先進先出的資料結構,先塞進來的資料就必須先取出。

class Queue{
private $head=0,$tail=0;
private $max=100;
private $data=array();
private $error;

public function pop(){
if($this->head != $this->tail){
$this->head++;
if($this->head >$this->max){
$this->head = $this->head -$this->max - 1;
}
$data = $this->data[$this->head];
unset($this->data[$this->head]);
return $data;
}
}

public function push($data){
$original=$this->tail;
$this->tail++;
if($this->tail >$this->max){
$this->tail = $this->tail - $this->max -1;
}

if($this->tail == $this->head){
$this->error='佇列已滿';
$this->tail=$original;
return false;
}else{
$this->data[$this->tail]=$data;
return true;
}
}

public function showQueue(){
foreach($this->data as $key=>$value){
echo $key.'=>'.$value."\n";
}
}

}

$queue=new Queue();

for($i=0;$i<=2000;$i++){
$queue->push($i);
}

for($i=0;$i<39;$i++){
$queue->pop();
}

for($i=0;$i<100;$i++){
$queue->push($i);
}


$queue->showQueue();


程式碼解說:
Queue::pop() 取出資料
Queue::push() 塞進資料
Queue::showQueue() 列出佇列內的所有資料

2009年1月25日 星期日

更改innodb預設的資料庫存放位置

ubuntu上預設存放innodb資料庫的位置是/va/lib/mysql,這真不是一個存放資料的好位置,如果作業系統是32位元的,單一檔案的上限是2G,最好是使用整個分割區當做innodb資料庫的存放位置,這樣就沒有2G的限制,因為這是分割區,而且效率會比較好。

試了幾個方式都試不出來,花了一整天,真是煩人,不過用google上網找資料,二分鐘內就解決了,感謝google,用起來真方便說,參考網走如下:
http://www.ubuntugeek.com/how-to-change-the-mysql-data-default-directory.html

整個步驟如下:
1.開啟/etc/apparmor.d/usr.sbin.mysqld
2.將/目錄名稱/ r,及目錄名稱/** rwk,加入以/va/lib/mysql開頭的指令行下面
3./etc/init.d/apparmor reload
4./etc/init.d/mysql restart

這樣就可以將innodb的資料存放到不同位置,而不會產生錯誤訊息,使mysql無法啟動

2009年1月24日 星期六

看山又是山

最近把Zend Framework的文件下載後,列印出來,讀讀這些paper,Zend Framework每個物件的用法雖然不同,但背後的運作邏輯卻是相通的,這是一種思考方式的轉變,將程式設計的方式由程序導向的方式轉變為以物件導向的方式進行思考,將傳統程式設計模式以直接解決問題的思考方式,轉變為以設計出架構,將問題分類為不同的階層及架構後,再設計出適當的物件,擺在不同的架構及階層中,再將問題解決。

這種設計方式,站在程式計設師的角度來說,可是一點都不直覺,以設計電腦來做說明,為了讓電腦完成運算的功能,如果以傳統程序導向方式的思考方式,CPU、記憶體、硬碟這些東西,是完成運算的功能,就會把他們全部兜在一起,結果一台電腦中,所有的功能(CPU運算、記憶體的記憶功能、硬碟的儲存功能)就會全部混在一起,而不是分拆成不同的物件,程序導向只要單線思考,以完成功程式的功能即可,物件導向的思考方式就不同,必須將電腦折成CPU、記憶體、硬碟等物件,還要考慮這些物件怎麼連接,如何組合這些物件一起運作,除了要完成必要的功能,還要設計出一套能夠運作的架構,如CPU怎麼與主機板連接,怎麼與記憶體做協同運算。

物件導向的思維邏輯,在於建立一套問題解決的架構,讓經驗可以被重複應用,而不是重複相同的程式編碼作業,就像電腦的設計一樣,將CPU、記憶體、硬碟分拆成不同的元件後,這套元件化的設計階層架構就可以被重複使用,不論CPU的速度是怎麼加快,記憶體的容量如何增長,電腦元件組合的階層架構還是不變的,這就是物件導向的思維方式,從實務經驗建立問題解決的架構。

剛接觸物件導向時,由於只接觸概念部份,認為這真是直覺的方式,只要把程式分拆成一個個的元件,就可以完成程式設計,是非常容易的,就像初學畫的人要畫山一樣,只不過是畫一座山嘛!畫出那座山就好了,這應該就是看山是山的階段。

等到實際撰寫程式碼,這跟傳統程式導向的方式大不相同,變得很複雜,為什麼不直接把功能做出來就好了,為什麼繞了一大圈解決問題,這就跟學畫當中的人心境相同,不過是畫一座山嘛!為什麼還有那麼多的畫法及理論。這是看山不是山的階段,滿腦子想的都是一些技巧及注意事項。

比較熟悉物件導向的思考方式及程式撰寫風格後,會發現世界是那麼的美好,一個個的元件排列組合後就能完成各種程式的功能,這種方式比起傳統的開發方式,架構的彈性及威力不能相比。這就類似技巧比較成熟的畫家,要畫山時,只會想到山的美好,會想表現出山在自己心中的感覺,這就是看山又是山的階段吧!

2009年1月23日 星期五

virtual box灌ubuntu server出問題

環境
作業系統:ubuntu desktop
軟體:virtual box

問題
在ubuntu desktop上的virtual box上安裝完ubuntu server後,重新開機,會出現下面這行錯誤:

this kernel requires the following features not present on your CPU

用google找了一下,十分鐘內就找到解決辦法了

網址:
http://ubuntuforums.org/showthread.php?t=905497

解法:
1.開啟vitual box
2.點選 機器->設定值->一般->進階
3.enable PAE/NX 打勾
4.重新啟動即ok

2009年1月22日 星期四

堆疊

堆疊是一種後進先出的資料結構,這種資料結構類似上部開口的杯子,把從球上方的開口丟進杯子後,就要從上方的開口處取出球。

資料在堆疊中放進去的方式及取出的方式也是相同的,先丟進去的資料,必須等上層的資料都被取出後,才能取出。

這是一種後進先出的方式,最後丟進去的資料,可以最先被取出來使用,最早被丟進去的資料,卻必須在所有資料取出後,才能取出。

class Stack{

private $sp=-1;
private $spMax=100;
private $data=array();

public function pop(){
if($this->sp >= 0){
$result=$this->data[$this->sp];
unset($this->data[$this->sp]);
$this->sp--;
return $result;
}
}

public function push($data){
if($this->sp < $this->spMax){
$this->sp++;
$this->data[$this->sp]=$data;
}
}

public function setSpMax($max){
$this->spMax=(int)$max;
}
}


$stack = new Stack();
$stack->push('a');
$stack->push('b');

echo $stack->pop();
echo '
'."\n";
echo $stack->pop();


程式碼說明:
一個很簡單的類別,專門處理堆疊。

Stack::pop() 取出資料
Stack::push() 放進資料
Stack::setSpMax() 設定堆疊能存放的資料筆數