Category in Objective-C

Category in Objective-C

OOP 的精神之一,就是如果你想研發一台新款式的車子,你並不需要重新發明輪子,通常的做法會去繼承某個現有的”車子類別”,然後加上你要的功能跟屬性,改一改就變成一款新的車子可以來騙錢了。

不過有時候你想幫原來的類別加功能,但又不想動到原來的程式碼,例如你可能下載了某款功能超強的 2D 物理引擎程式碼,但因為某些小地方寫的不合你的需求,於是你便動手改原始碼來加功能。這當然沒問題,但萬一原作出新的版本,你要不就選擇維持自己原來的版本不 update,不然就是 update 之後,你原來加在舊版本的程式碼得再重貼一次到新版。

Omit the PHP closing tag "?>"

自從開始改用 ZF 後,開始慢慢的調整自己的 code style,過程也許會痛苦,但相信結果應該會是甜美的。在 ZF 的 Coding Standard 裡有一段是這麼寫的:

For files that contain only PHP code, the closing tag (“?>”) is never permitted. It is not required by PHP, and omitting it prevents the accidental injection of trailing whitespace into the response.
- Zend Framework Coding Standard

看不太懂哪來的 injection,後來再翻了一下 PHP 的官方資料才發現也有提到這段:

The closing tag of a PHP block at the end of a file is optional, and in some cases omitting it is helpful when using include() or require(), so unwanted whitespace will not occur at the end of files, and you will still be able to add headers to the response later. It is also handy if you use output buffering, and would not like to see added unwanted whitespace at the end of the parts generated by the included files.
- PHP.net Instruction separation

後來自己動手做了一下實驗:

// 檔名 inc.php

<?php
// do something
?>
// 檔名:test.php

<?php
require_once('inc.php');
session_start();
?>

執行 test.php,看起來是沒什麼大問題;不過如果在 inc.php?> 後面再按幾下 enter,多加幾行空白行,test.php 就會丟出警告訊息「Cannot send session cookie – headers already sent by..」,如果把 inc.php 的 ?> 拿掉就 ok 了。

原來,在 ?> 之後多按的幾個 enter(newline)也會被當成資料丟給瀏覽器,所以如果 include 了這樣的檔案進來,會讓 header()session_start() 之類的指令丟出「headers already sent by..」的警告訊息,而如果省去結尾的 ?> 則可以避免這個問題。

果然魔鬼都是還是躲在細節裡,PHP 的手冊還是要多看啊!

順帶一提,ZF 有 PDF 版的離線手冊了,一千多頁,雖然不見得有比線上方便,但沒網路的時候倒還不錯用(我是把它放到 PDA 裡,上廁所可以看)

Zend Framework 之 Zend_Tool

看到 DjangoRails 之類的 Web Framework 都有可以快速的產生 scaffold 的工具,甚至連同樣都是 PHP framework 的CakePHP也有..還好我之前都是在 Zend Studio 裡直接 new 一個 Zend Framework Project,它也會自動產生基本的架構出來。隨著 Zend Framework 1.6 版的上市,它也提供了類似的方便工具(不過從目錄名字看起來還是在實驗階段而已..)

我的作業環境是 WinXP,如果要在別的系統可參考最底下的參考資料,有提到怎麼修改路徑。

簡單的使用方法如下:

Step 1.

ZF 官網下載 Zend Framework 1.6,解壓縮之後裡面有個 laboratory 資料夾,裡面有個 ZendL,把它放到你的 include_path 底下。

Step 2.

laboratory/Zend_Tool/bin 裡有個 zf.batzf.php,改一下 zf.bat 裡的 php.exe 的路徑(如果放在跟 php.exe 同目錄就不用改了)

Step 3.

以上設定完成之後,到 cmd 模式下,輸入 zf show version,應該會出現「Zend Framework Version: 1.6.0」字樣

Step 4.

隨便找一個資料夾來試試,輸入 zf create project,等一會,它就會幫你把資料夾跟檔案產生好了(如下圖)

完成! 這樣就完成了基本的 ZF MVC 的骨架出來了,也做了簡單的 bootstrap 跟幾個預設的 controller 跟 view。不過我發現這個 Zend_Tool 會把 ZF 的 library 整個也複製一份到 library 底下,雖然是方便發布,不過我個人是習慣不把它放在 web 資料夾下..

結論:不管是 Zend Studio 或是 Zend_Tool 都可以快速的產生架構出來,我還是習慣用自己的架構..

參考資料:Zend Developer Zone

Zend Framework 1.6 Release

之前用了一陣子的 RC 版,今天終於正式Release了,這個 1.6 版的 ZF 比 1.5 版多了不少有趣的東西啊(不過選在跟新聞炒很大的google chrome同一天出來,鋒頭多少被蓋去了一點點)

  • Dojo Integration
  • SOAP
  • Preview of Tooling Project in Laboratory (see /laboratory folder)
  • Unit Testing Harness for Controllers
  • Lucene 2.3 Index File Format Support
  • Zend_Session save handler for Database Tables
  • Paginator Component
  • Text/Figlet Support
  • ReCaptcha Service
  • Captcha Form Element
  • Zend_Config_Xml Attribute Support
  • Zend_File_Transfer Component
  • File Upload Form Element
  • Zend_Wildfire Component with FireBug Log Writer
  • Media View Helpers (Flash, Quicktime, Object, and Page)
  • Support in Zend_Translate for INI File Format

對我工作上比較大的影響是跟 Dojo 的整合(我還是比較喜歡 jQuery),這裡有篇文章有寫到 1.6 版新增的一些功能介紹。

另外,分頁、表單認證碼及檔案上傳功能…這些在做網站時常用的功能,之前都是自己拼裝出來用的,結果在 1.6 也都加進來了 :) 。我試著直接把 1.5 版昇級為 1.6 版,目前手邊的案子看起來都還滿正常的。

下載連結: http://framework.zend.com/download/current/

科學人 - 通往專家心智之路

我一直就很喜歡科學人月科,不過因為沒有定期訂閱,所以常常是到書店有看到才想到翻一翻。

九月份的「通往專家心智之路」專題很吸引我,其中提到一段對專家的定義:

在專業的領域中,我們可以看到有些人對於領域的問題,解決得特別快;對問題的掌握,能夠針對當時的情境,很快的連結上問題的解答,這些人對於領域中的知識非常豐富,能夠掌握理論與事實的來龍去脈,快速解決問題。

另外有幾段句子看了也很有感覺:

西洋棋大師高過生手之處,就在於最初幾秒鐘的思考過程。

「..真正重要的不是經驗,而是”潛心鑽研”的工夫,代表著持續接受超越個人能力的挑戰。這就是為什麼熱心的愛好者可以花數萬小時下西洋棋、打高爾夫球、玩樂器,卻永遠無法超越業餘水準,而訓練有素的學生卻可以在短期內就超越他們的緣故..」

「目前的心理學證據指出:專家是後天造就,而非天生」

「現在的補習培育了很多”績優生”,而不是”資優生”,逼迫一個小孩走了一條他沒有興趣的路,這當然是不好的,但如果照一般對專家的定義,培養一個人在專業領域上具有專業知識,能夠很快理解並解決問題,我想這是非常好的事」

CentOS

RedHat 宣布不再推出個人免費版本,並把原先 RedHat9 的相關技術,移至 Fedora 計劃,目前已推出到 Fedora Core3;同時也針對高階伺服器市場推出 Red Hat Enterprise Linux(RHEL)。RHEL 有 AS、ES 及 WS 三種版本,AS 是最高階的企業級伺服器,最多可以支援到 16 個 CPU 及 64G 的記憶體,WS 則是桌面 工作站,ES 則適用於一般中小型企業的社群級伺服器版本。當然,這個 RHEL 就是要收錢的(軟體費用及技術支援費用),可以參考一下這個網站或是 RedHat 官方網站的價錢。

CentOS : Community ENTerprise Operating System

有個叫做 CentOS 的 Linux 版本,便是以 RHEL 為架構發展出來的,一樣秉持著 Linux 的自由精神,可免費下載使用。CentOS2、3 聲稱與 RHEL2、3 完全 100%相容,日前 CentOS 已經推出第 4 個版本,本著 RHEL 的穩定性、支援高階伺服器硬體及低廉的軟體成本,以中、小型企業來 說,CentOS 成為架設 Linux 伺服器的不錯的選擇之一。

當然,軟體免費,不等於 Linux 就是免費,技術服務不是免費的,所以企業在引進這樣的系統時,也得考量這方面成本。

國內 ISO 下載:ISO image Mirror Site

CentOS Official Website: http://www.centos.org/

參考資料:

http://linux.tnc.edu.tw/techdoc/eltoyou/eltoyou.html

Postfix 的 Relay Control

Postfix 的 Relay 控制,是在 /etc/postfix/main.cf 裡面做設定,主要有四個部份:

  1. inet_interfaces
  2. mynetworks_style
  3. mynetworks
  4. relay_domains

inet_interfaces:

預設值是all,如果你的機器有多張網路卡,但又不想要全部都開放 relay,就可以指定只開放給某張網路卡。

mynetworks_style:

有三種型態:classsubnethost,預設值是 subnet。

  • class 是可以指定開放給 A/B/C class 的來源,這種設定方式滿冒險。
  • subnet 代表你的機器的 IP 所在網域的任何一個 IP 都可以接受 relay。(如果同一個 subnet 裡的機器多,要小心可能被當成垃圾信跳板)
  • host 表示只會設定 localhost 為信任的網域而已。

mynetworks:

這可以設定成檔案的方式或是直接以 IP/netmask 來做設定。例如:

mynetworks=192.168.1.0/24, 127.0.0.0/8

而如果要用檔案方式:

mynetworks = 127.0.0.0/8, hash:/etc/postfix/access

記得 postmap 一下這個 access 檔。

注意:

  1. 如果沒有設定 mynetworks 的話,記得把 mynetworks_style 改成 host,不然同一個子網域的 IP 都可以透過你的機器 relay 信件(當然如果所有子網域的使用者你都認識的話倒還 ok)
  2. 如果有設定 mynetworks_style 以及 mynetwork 時,mynetworks 的設定會取代掉 mynetworks_style。

relay_domains:

可以一次指定一個 domain 來開放 relay。例如:

relay_domains = eddie.com.tw

這樣的設定是代表所有由 eddie.com.tw 這個 domain 來的信件都會被當做可信任的,postfix 會幫忙 relay。但要注意的是,由「任何地方」來的信件,並且要寄往 eddie.com.tw 網域的信件,postfix 也會幫忙 Relay。

詳細設定在 /etc/postfix/main.cf 裡有說明。

Hinet 廣告信跳板測試: http://lcss.hinet.net/antispam/or_check.pl