2010年11月14日 星期日

MBA升級10.6.5,FireFox的GoogleToolbar失靈!?

MBA 2009 升級到OSX 10.6.6 唯一的災情!FireFox的Google Toolbar的按鈕全部消失!?重裝也無效!(之前也發生過,原因不明!?)

解決方法:
  1. 移除 FilreFox的附加元件:Google Toolbar for FlreFox
  2. 移除 /使用者/你的名稱/資源庫/Application Support/Firefox/Profiles/ 路徑下的:"GoogleToolbarData" 檔案夾
  3. 重新安裝 Google Toolbar for FlreFox 附加元件。

2010年10月23日 星期六

BootCamp 3+Win 7+VMware Fusion 3=無網路設備問題解決

在MacBook Air上安裝Win 7+BootCamp 3.1+VMware Fusion 3.1,確發現Win 7無法上網,檢查Win 7的裝置管理員,會發現裡面的Ethernet出現驚歎號,重新安裝VMware Fusion Tools,裝置管理員還是找不到驅動程式。

解決方式透過Google找到這篇:
http://www.askdavetaylor.com/how_to_enable_ethernet_wifi_access_vmware_mac_windows_7.html
確發現無法找到這個檔案:
/Users/你的使用者ID/Documents/Virtual Machines/虛擬機名稱.vmx

原來VMware Fusion 3的設置檔案改了位置,放在:
/Users/你的使用者ID/Library/Application Support/VMware Fusion/Virtual Machines/虛擬機名稱/%2Fdev%2Fdisk0/
("%2Fdev%2Fdisk0"應該是磁碟路徑。)
底下有個“Boot Camp partition”的套件,按右鍵選擇“顯示套件內容”,就可以在新的視窗裡找到 Boot Camp partition.vmx 這個設定檔。用TextWrangler或其他文字處理器開啟,找到以下字串:

ethernet0.present = "TRUE"
ethernet0.connectionType = "nat"
ethernet0.wakeOnPcktRcv = "FALSE"
ethernet0.linkStatePropagation.enable = "TRUE"

在這些字串之後新增一行,加入以下字串:

ethernet0.virtualDEV = "e1000"

存檔後,重新開啟VMware Fusion下的BootCamp分區,就可以正常使用OSX的網路連線上網了。

2010年2月22日 星期一

CakePHP教學 on OSX(七)Blog練習:(2)Blog資料庫設計

RoRy框架中有一個"資料遷移(mirgate)"物件,可以用Ruby語法透過自動地在資料庫中產生對應的資料庫架構(schema),學習上的好處是可以省去花在資料庫設計與結構查詢語言(SQL)上的功夫,只要專心熟悉Ruby語法即可。

而CakePHP則是相反地,是透過讀取一個既有的(通常是MySQL)資料庫架構,來產生相對的資料模型、控制器與視圖程式碼。因此預先設計並建立好一個資料庫,對於應用CakePHP框架來說非常重要,也比較符合PHP開發者原有的習慣。

Blog資料庫
首先應用之前“Todo”練習建立資料庫的方法,透過phpMyAdmin建立一個“blog”資料庫,以及同名的使用者“blog”並設定權限與密碼。

Blog資料表設計
跟之前“Todo”練習的資料庫只有一個資料表不同,Blog的資料必須分別使用多個資料表來儲存,並透過資料庫的關連功能來取得相關的資料。

第一個是“users”資料表的SQL:
CREATE TABLE  `users` (
 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `name` VARCHAR(100) DEFAULT NULL ,
 `email` VARCHAR(150) DEFAULT NULL ,
 `firstname` VARCHAR(60) DEFAULT NULL ,
 `lastname` VARCHAR(60) DEFAULT NULL ,
 `created` DATETIME DEFAULT NULL ,
 `modified` DATETIME DEFAULT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
依照CakePHP的命名慣例,“users”資料表名稱必須是複數名詞,主鍵(PRIMARY KEY)名稱是“id”。

第二個是“posts”資料表的SQL:
CREATE TABLE  `posts` (
 `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT ,
 `title` VARCHAR(255) DEFAULT NULL ,
 `content` TEXT,
 `user_id` INT(11) DEFAULT NULL ,
 `created` DATETIME DEFAULT NULL ,
 `modified` DATETIME DEFAULT NULL ,
 PRIMARY KEY (`id`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;
依照CakePHP的命名慣例,“posts”資料表名稱也必須是複數名詞,主鍵(PRIMARY KEY)名稱也是“id”。為了避免混淆並指定關連的資料表,這裡以“user_id”欄位與“users”資料表建立關連性。注意,這裡“user_id”欄位是單數詞。還有跟書上的不同,這裡還是用“created”跟“modified”兩個魔術欄位來自動儲存製作與修改日期。

“users”跟“posts”兩個資料表的關係是所謂的“一對多”,也就是每一位“user”有很多篇的“posts”,但每一篇“post”只屬於一位“user”所有。用RoR框架開發時,要在資料模型程式中指明“user”跟“posts”兩個物件的關係,然後RoR會自動地在資料庫中產生相對的資料表。而用CakePHP開發時,CakePHP則是透過分析“user”跟“posts”兩個資料表,來產生資料模型程式的範本。


上一篇|下一篇:

2010年2月17日 星期三

CakePHP教學 on OSX(七)Blog練習:(1)命名習慣

CakePHP沿襲RoR的觀念,使用“慣例優於組態(Convention over Configuration)”的“設計典範(Design Paradigm)”。因此不論是程式檔案與功能函式的名稱、放置程式檔案的目錄名稱與路徑、或是資料庫表格的名稱與欄位的設計,都有一定的命名慣例。

依循慣例設計程式的好處,一方面可以讓CakePHP這種程式框架可以自動地產生相關的程式樣板以加速程式的開發的速度;另一方面也方便開發者閱讀與理解程式與函式之間的關聯性,方便程式的管理與維護。唯一的缺點,就是要注意英文名詞的單複數問題,避免使用程式框架已經使用到的關鍵字詞,同時要不小心迷失在一堆複雜的檔案路徑之中。

“類大檔小”與“模單表複”慣例
CakePHP是採用物件導向的程式編寫範式,因此每個程式檔案就是一個“類別(class)”。程式語法中,類別的名稱用“駝峰式命名法”,每個詞的第一個字母大寫,多個詞之間不留空白;但是程式檔案名稱則是全部小寫,多個詞之間要用“_”符號分開。

因為英文名詞有單複數的分別,所以基本上CakePHP命名方式也有單複之分。除了“模型(model)”類別通常是以(一個詞或多個詞組合的)單數名詞命名之外,“控制器(controller)”、“視圖(view)”程式,以及儲存模型的“資料表(table)”等等,都是以“複數名詞”命名。除非是“單複數同形”的名詞,不要忘了開加上“s”、“es”或“ies”的地方要正確(這是考托福嗎!?),以免整個CakePHP程式框架因為命名問題運作出錯。

因此按照CakePHP的命名方式,一個“User”類別有關的所有程式的命名與路徑如下:
模型:程式根目錄/models/user.php
class User extends AppModel {
    var $name = 'User';
    ....
}

控制器:程式根目錄/controllers/users_controller.php
class UsersController extends AppController {
    var $name = 'Users';
    ....
    function index() {
        ....
    }
}

視圖:程式根目錄/views/users/動作函式名稱.ctp
視圖檔案可以針對控制器中個別的動作函數指定,例如控制器UsersController之中的index函數的視圖檔案,應該是:程式根目錄/views/users/index.ctp

還好,大部份的時候我們可以用CakePHP提供的bake程式把這些檔案範本製作出來,不用自己傷腦筋命名問題。不過熟記這些命名與路徑慣例,對於修改與維護程式功能就很有用。不過跟RoR架構不同,CakePHP要先把資料庫架構好,才能用bake指令自動地“烤”出應用程式。
上一篇|下一篇:資料庫設計

2009年12月23日 星期三

CakePHP教學 on OSX(六)Todo應用程式練習:(3)應用程式測試 Taste “todo” cake!

CakePHP的bake all腳本可以根據資料表的架構(schema),一次產生CRUD所需的程式碼。如果你按照幾篇的動作已經用bake all將items資料表的程式產生,就可以在瀏覽器輸入 http://localhost/todo/items 這個網址來測試。如果要在Aptana裡測試,請按照這一篇的方法,用“Run As > PHP Web Page”執行todo專案下的index.php叫出Aptana的內建瀏覽器,然後在輸入 http://localhost/todo/items 這個網址來測試。

CakePHP遵循MVC的軟體架構,語言的編寫方式是採用物件導向(Object-Oriented Programming)。所謂的“物件導向”是用“物件”來類比一個“獨立的程式”。一個“物件”有自己的“屬性(properties)”跟“行為(behaviors)”,例如一隻“小狗”會有自己的“品種”、“年齡”、“毛色”等屬性,以及“吃、喝、拉、撒”等行為。“物件”在實際的程式撰寫時,通常就是一個“獨立的程式檔案”,其內容稱為一個“類別”。一個“類別”的物件屬性,就是以類別的“變數(variables)來儲存;而“類別”的物件行為,就是以“函數(functions)”來實現。把適當的資料傳入一個“類別”的“函數”,就會引發一些行為,例如改變自己或其他類別的“屬性”,或引發自己或他類別的近一步的“行為”。物件導向的編寫方式有好處也有壞處,但基本上已經是目前廣被採用的程式設計典範,因此PHP語言在第4版之後就開始支援物件導向的語法。

其次所謂的MVC架構,簡單的說,就是把一個完整的應用程式的複雜任務,分為(資料儲存與驗證的)模型(model),(資料存取與運算的)控制器(controller)以及(資料輸出入與運算結果顯示的)視圖(view)三個部份。用“物件導向”來實現MVC架構,就是把一個應用程式拆成三個model, controller 以及 view 三個類別,也就是(至少)三個獨立分離的程式檔案。每個類別裡都有自己的變數與函數,功能獨立並可以互相傳遞資料。

跟“物件導向”一樣,MVC架構對於小型的應用程式來說是殺雞用牛刀,比較適合大型與複雜的功能。就我個人的看法,“物件導向”配合MVC的好處,可以將整個複雜的程式,分離成比較簡單與獨立的任務。當任務一多會有點繁雜,並產生除錯上的困難。但因為每個任務都簡化了,所以相對來說,可以容易完成程式的撰寫。


“Todo” 測試
  1. 基本上Cake的設計,是以 http:/網站根目錄/控制器名稱/函數名稱/函數引數 的方式,來導入或呼叫相關的程式。前面的練習我把應用程式寫在MAMP的網頁根目錄下的todo檔案夾,所以應用程式根目錄應該是 localhose/todo ;
  2. 由於我們的todo程式是用bake all腳本用從資料庫內的items資料表產生,所以控制器名稱就是 items 。依照CakePHP的命名規則,model名稱是名詞單數,例如如item,item的控制器以及資料表通常就是model名稱的複數,例如items。(所以建立資料表的時候,名稱記得要加“s”。)因此只要在瀏覽器輸入 http://localhost/todo/items 這個網址,就可以看到用來控制items資料表的items控制器程式的首頁。(由於目前CakePHP的除錯(Debug)模式是開啟的狀態,所以底下會看到SQL程式存取資料庫的輸出結果。):
  3. CakePHP的bake all腳本,會一次製作出items控制器的好幾個函數,例如:add, view, edit 與 delete 等等。因此如果要新增一筆資料,只要輸入網址: http://localhost/todo/items/add ,或網頁按下方的“New Item”連結,就會進入新增資料的頁面。請試試看新增幾筆資料看看。
  4. 如果已經有了幾筆資料後,要編輯 id=1 的這筆資料,只要輸入網址: http://localhost/todo/items/edit/1
  5. 如果要查看 id=1 的這筆資料的完整內容,只要輸入網址: http://localhost/todo/items/view/1
  6. 如果要刪除 id=1 的這筆資料,只要輸入 http://localhost/todo/items/delete/1 ,然後todo程式會提示確認是否要刪除?
  7. 這樣一來CRUD的“Create(add)”、“Update(edit)”、“Delete”都有了,那“Retrieve(find?)”呢?CakePHP的bake all產生出來的程式,是把items控制器的首頁,作成“find all”顯示所有的資料,並以“List”方式輸出,甚至還有分頁的功能!所以其他add, edit, view, delete頁面的“List Items”,都會導回到 http://localhost/todo/items 這個網址。所以“Retrieve”功能也算是有了。
這個todo練習只有用到一個資料表,蛋多數的網站需要多個彼此關連的資料表才能實現。因此接下來實作比較複雜一點,使用多個資料表的Blog網站。