2009/12/30

明年的工作計畫

明年要做的事情大致上定下來了




  1. 2010/01/15 前結束掉手上所有的案子,準備寫一本 Drupal 版型開發的書



  2. 開始嘗試做 Drupal 相關的教學,跟幾個朋友詢問了一下行情,我應該會開價 NT$1,000 / hr



  3. 多參加各種社群活動、多認識人


2009/11/16

編號為 0 的使用者

上個禮拜幫客戶的 Drupal 網站做升級,一切狀況良好,不過這兩天客戶說,訪客發表的回應無法顯示。


剛剛回到家後做了幾個測試,發現狀況很有趣:的確如客戶所說,訪客發表的回應在文章中無法顯示,但是最新回應區塊卻有顯示。


本來以為是文章權限的問題,檢查了半天,也重設權限了,問題還是一直存在。


為了確認回應是否有寫入,我到管理回應的列表中看了一下,發現管理回應的列表也沒有列出訪客發表的回應。


 


這是怎麼回事呢?我想一定是最新回應區塊篩出的條件不一樣~


因此我用主機商提供的 phpMyAdmin 介面去看一下 comments 表,發現資料有寫進去,所以一定是因為某個緣故忽略掉訪客發表的回應。


後來我想到了,上次做系統升級時,我順手把 users 裡面 uid 為 0 的那筆資料刪掉了(因為我一直覺得那筆資料沒啥用),或許是這個原因吧~


憑著直覺,我新增了一個 uid 為 0 的使用者,問題就解決了~

2009/11/01

VirtualBox 的穩定性,跟版本有關~

話說自從 VirtualBox 3.0 正式 Release 以來,我就把目前手上管理的一個網站移到這上面來作穩定性測試。


歷經數個版本的升級,目前可以說說一些心得。


如果你期待跑了 VirtualBox 以後可以過著幸福快樂的生活,我會覺得那是想太多了~


目前我在 Windows 7 下跑了那麼久的 VirtualBox ,只有 3.0.6 這個版本堪稱穩定,其他的三天兩頭就會引起 OS Crash。


年底我打算買一台 1 L 以下的比較省電小機器來獨立跑看看~

2009/09/23

從虛擬主機的檔案重建 Drupal 系統

昨天跟客戶定期 meeting,有談到目前一個案子的畫面上的小調整。


由於要修改到 CSS 檔案,所以我把虛擬主機上的整個目錄打包複製下來、資料庫用 phpMyAdmin 匯出,配合空的 PAPM 重建後,卻發現每次進入首頁卻變成下載畫面。


嘗試了幾個方式都還是一樣,最後終於讓我重建成功。


底下是重建筆記(這個方式只適用同樣主版本的 Drupal 上,並且你沒有對原始 Drupal 的檔案做過太大幅度的修改):



  1. 清除瀏覽器的快取、停用前導程式(如果你發現跟我一樣出現下載頁面)

  2. 停用虛擬主機上的 Drupal 系統的效能選項中的所有選項

  3. 把虛擬主機上的 Drupal 系統的 sites 目錄打包回來

  4. 把虛擬主機上的資料庫用 phpMyAdmin 匯出

  5. 解開我提供的 Drupal with Portable APM for Windows 壓縮包(如果版本不對,請用空的 PAPM 跟 Drupal 官方提供的相同版本的 drupal 壓縮包先進行安裝程序),並執行前導程式(以下稱本機)

  6. 將本機的 Drupal 資料庫中所有資料表刪除,並把虛擬主機匯出的資料庫匯入

  7. 解開上述的 sites 壓縮包,並覆蓋掉本機的 sites 目錄

  8. 修改本機 sites/default/setting.php 中的資料庫設定(預設應該是:$db_url = 'mysql://site:site@localhost/site_drupal';)


這樣應該就重建完成,如果有要修改的 Drupal 檔案,記得改回去~

2009/09/15

在 View 裡面把另外一個 View 當作欄位插入

起源是我想要做一個像討論區板塊的 View,會顯示最上層的討論區,並在每個討論區下面列出該討論區的討論板。


方法很簡單,需要兩個模組:



安裝好了之後,要先設定被插入的 View


然後在另外一個 View 的欄位中新增一個 Customfield: PHP code


內容是


<?php
echo views_embed_view('View 的名稱', 'default', 要傳入的參數列...);
?>


這樣就行了~

2009/08/12

推掉了幾個案子

雖然我是專業的 SOHO,有案子做當然是多多益善。


不過今天去幫朋友弄電腦(當志工)時,跟朋友聊到我最近推掉了兩個案子,他覺得很驚訝。


我個人接案有一個原則:同一時間我只做一個案子。


有些前輩他們可以同時做好幾個案子,不過我沒辦法,因為我很容易分心,所以不管是什麼事,我一次只能做一件事。


 

2009/07/29

升級到 PHP 5.3

PHP 5.3 Release 出來已經有一段時間了,不過我一直沒有去升級,原因之一是 XCache 沒跟上。


現在 XCache 1.3rc1 已經可以對應 PHP 5.3 了,連 XDebug 2.0.5 也跟上了,所以我也沒啥藉口~


之前在測試時,phpMyAdmin 一直有問題,後來我找到原因了,是因為 phpMyAdmin 的某一行設定的緣故。


在 config.inc.php 裡面,找一下 $cfg['Servers'][$i]['compress'] 這行,他必須設為 $cfg['Servers'][$i]['compress'] = false; 才行。


底下是我包好的 Portable APM,有興趣的人請自取~



下載


追記:目前 Drupal 6.13 跟 PHP 5.3 不相容~看來我還是會堅守 PHP 5.2 一陣子~


 

2009/07/01

FireFox 3.5 Release

這兩天有幾個我關注的軟體發表了,其中每天會用到的當然就是 Firefox 這個好用的瀏覽器啦~


底下是我目前有裝的附加元件列表:


2009/06/28

Virtual Box 3.0 支援 Direct3D 8/9

消息來源在這裡


雖然 MS 的 Virtual PC 也很好,不過我個人還是鍾愛 Virtual Box。


只是不知道能不能玩支援 DirectX 的遊戲,期待中~


追記:2009.06.30 Virtual Box 3.0 Release

2009/06/06

換用新的 IM 軟體

最近 Pidgin 常常連 MSN 出問題,就想說換個 IM 軟體來用。


不過我不想回過頭去用 Miranda,而且又希望能有可攜版的,後來在這裡找到了一個我以前從沒聽說過的 IM 軟體:digsby


下載回來用的結果很滿意,除了一件事:這個軟體需要到官方網站上去建立一個帳號才能用。


整個來說,設定上跟 Miranda 和 Pidgin 比較起來簡單很多,當然支援的 IM 類型沒有比這兩個多,但是也夠用了,而且還支援 email 的檢查跟一些社群網站。


 

2009/05/12

用 WAIK 自訂 Windows 7 RC 64 Bits 安裝光碟

經過多次實驗證明,在實際燒錄時,會受到燒錄軟體與光碟片(可能還有燒錄器及驅動程式等)因素影響成功率。


由於 Windows 7 目前缺乏廠商晶片組驅動程式的支援(我之前安裝時沒仔細看,其實根本沒裝,因為目前 AMD 只有顯卡的驅動程式有支援 Windows 7),所以只能說燒錄成功那幾次是機率問題。


我的電腦環境有點複雜,先說明清楚比較好:



  • 主機板是 ASUS 的 M4A78T-E,有開 AHCI

  • 燒錄器是 ASUS 的 DRW-1814BLT(SATA 介面)

  • 燒錄時用的 DVD+RW 可重複寫入的片子來做實驗


 


因此考慮的因素比較多,如果用 IDE 介面的光碟機的話,應該成功率會提高。


過程就不多說了,本來以為 Try 出安裝檔跟 vLite 後在 VirtualBox 上會過,燒成光碟安裝時應該也會過,看來我真是太天真了。


結論是:



  • vLite 的整合功能沒問題,但很詭異的是燒錄後可正常安裝的機率低,或許是剛好實驗用的那幾張光碟片比較差也不一定。

  • 不用 vLite 做整合,直接把檔案抓出來配合安裝檔,用 oscdimg 來產生 ISO,成功率很高。


 


相關的設定檔在這裡。這篇文章是以 Windows 7 RC 64 Bits 版為例,設定檔中也是以此為準。


解開來有三個檔,其中 Autounattend.xml 是在最後要燒錄 ISO 前要覆蓋 vLite 產生的檔案用的,另外兩個則是 vLite 用的設定檔。


底下是在 32 bits XP / XP Mode 下來進行,因為 vLite 在 64 Bits 的 Windows 7 底下跑的很慢,在最終的套用設定時常出問題而無法完成。



  1. 先把從微軟站上拿到的 ISO 檔用虛擬光碟掛起來,然後把裡面的檔案複製到一個目錄下 (假設是 C:\W7) 準備進行整合。

  2. 安裝 WAIK 與 vLite 。

  3. 把上面提供的壓縮檔內的 W7.ini 與 W7_u.ini 複製到 vLite 底下的 presets 目錄。

  4. 執行 vLite,在工作階段把所有的工作項目全選,然後一直進行下一步直到燒錄光碟階段,此時選擇套用,讓 vLite 做整合。

  5. 整合完畢後離開 vLite 並將壓縮檔內的 Autounattend.xml 複製到第一步的目錄下覆蓋。

  6. 執行 WAIK 中的 Deployment Tools Command Prompt 。

  7. 在上述產生的 DOS BOX 中執行 oscdimg -u2 -h -y6 -m -bC:\W7\boot\etfsboot.com C:\W7 C:\W7.ISO


 


如果使用 vLite 來產生 ISO 檔,會因為 boot loader 不同而無法安裝 (雖然在 VirtualBox 中可以安裝,但實際燒成光碟來安裝時還是有一定機率無法安裝),vLite 用來整合 Windows 7 RC 目前還有蠻多問題的。


實際上,不使用 vLite,直接將原版光碟的內容複製到某個目錄下,再加上 Autounattend.xml 並安裝 WAIK 直接跳到上述的第六步來產生的 ISO 其實是比較穩定的。


 


有興趣的人可以研究一下 WAIK,不過個人是認為自從 Vista 以來,Windows 模組化的程度越來越高,已經不像 XP 時代時用 nLite 來縮減容量並自訂來的有意義。


這裡提供的設定檔並沒有刪除任何功能,只是預設將其禁用而已,有需要的人可以自行開啟。

2009/05/05

開始使用 Windows 7 RC

剛剛把 Windows 7 RC 安裝起來玩一玩,第一個印象就是,安裝的時候一口氣裝完,不像 XP 安裝時要重開機兩三次。


再來是驅動程式都不用另外安裝(除了 VIA 的音效驅動程式,這東西在安裝時還要騙安裝程式是在 Vista )。


然後是對 XP 32 位元程式的相容性做的不錯,至少我跑的幾個程式包括防毒軟體都可以跑(我是裝 64 位元版的 Windows 7 )。


這讓我想到前幾天在研究用隨身碟安裝 XP 時的窘境,真是研究辛酸的~


傳說中的 XP Mode 還沒試,不過已經先把下載點找出來了。



下面是 Windows Server 2008 RC 的下載點:



P.S. 雖然驅動程式都有抓到,但還是建議自己去各硬體廠商的下載區找來裝,效能有差~

2009/05/03

升級電腦~

昨天買了點零組件,把電腦做了點小升級。


過程中相當愉快,也要感謝店家的工程師,幫我把散熱器裝上去~


這是我第一次買散熱器,原以為安裝跟 CPU 的盒裝散熱器差不多,沒想到是必須把底板拆掉,整個主機板翻過來才能完成散熱器的安裝。


這次升級在省電、效能、安靜幾個要素中求取平衡,唯一不能平衡的是我的錢包。


本來我屬意購買 ASUS 的 M3N78-EM,不過到處打聽都沒賣,只好買了 M4N78T-E。


整體說來還好,不過 eSATA 反而是在 IDE 模式下才能抓到,跟之前的經驗有所不同,等過幾天 Windows 7 RC 開放下載時再測看看。


另外我也購買了 VANTEC 的外接硬碟座,這次買得是可以插兩顆硬碟的機種,沒辦法,我的硬碟實在太多了,2 TB 的硬碟還是買不下手。


這次買的機種,可以支援 HotSwap 的 Spindown 功能,果然是一分錢一分貨~

2009/04/25

Drupal 模組的翻譯

我一直認為,中文化是推廣軟體系統最重要的一步。


Drupal 是我非常喜歡的一套開源內容管理系統,最近因為自己出來作 SOHO 接案子的關係,時間比以前在公司上班時充裕許多,所以我可以一邊作案子,一邊作 Drupal 模組的翻譯。


最近我把相關作翻譯的模組包在一起,並在 Drupal Taiwan 那邊發了文章,希望能推廣翻譯工作。


 


底下是文章內容轉載(要下載請連過去,我不想兩邊維護):


我用 Drupal with Portable APM for Windows 為基礎,加上以下模組:



包在一起,作成一個翻譯 Drupal 模組用的工具包,希望可以降低翻譯者的門檻。


Localization client 是用它重新匯入翻譯套件的功能,讓翻譯好的模組的 PO 檔可以重新匯入 Drupal 中,看到翻譯的結果。

Translation template extractor 是用它抽取出每個模組的翻譯樣板 POT 檔。

Administration menu 跟 Poormanscron 只是協助一般的操作。


Windows 下翻譯用的工具建議是用 poEdit ,它可以從 POT 檔來轉換成 PO 檔,協助翻譯工作。

線上工具我推薦底下這幾個:



翻譯工作我個人有兩個原則:



  1. 先求有再求好

  2. 隨著案子需要作翻譯而翻譯


這個 l10n 包的更新並不會像 Drupal with Portable APM for Windows 那麼快,不過它還是有幾個階段的目的:

第一階段:推廣模組與版型的翻譯。(對,你沒看錯,版型也是可以翻譯的,請看 Acquia Marina 版型正體中文翻譯檔

第二階段:加入 Localization Server 的建置與翻譯。
第三階段:加入 OG、CCK、Views、Panels、 Internationalization 這幾個大模組的翻譯。


 

2009/04/17

可卸除 eSATA 裝置的 HotSwap

話說上個月我買了一個 eSATA / USB 雙介面的硬碟座,用起來是蠻快樂的,不過有個小問題,那就是 eSATA 裝置無法卸除。


(註:BIOS 中 SATA 必須設成 ACHI 模式,可以先用 IDE 模式,然後找 RAID / ACHI 的驅動程式裝完後,再進入 BIOS 設成 ACHI 模式)


 


後來聽說是晶片組的關係,我的板子是用 ATI 的晶片組,驅動程式不支援。


最近聽說 ASUS 出了 NVIDIA 980a SLI 的板子,是有點想敗下去,不過根據某主機板大廠工作的朋友講,NVIDIA 晶片的問題也不少,建議我再考慮。


 


後來我想說想測看看 NVIDIA 的板子是否真的可以卸除 eSATA 的裝置,於是今天我到了另外一位有人的家中借他的板子作測試,結果的確是可以。


不過我的這位友人很親切的告訴了我一個小程式:HotSwap


這個程式可以用來移除 eSATA 的裝置,我用了之後果然不錯,蠻符合我的需求,而且 ATI 晶片的板子也可以用。


唯一美中不足的部份是 Spindown 功能沒有作用~


不過因為 Spindown 沒作用,所以裝置卸除後,關掉硬碟座的電源後,不可以立刻把硬碟拔起來,要等大約10秒鐘,等讀寫頭自動歸位後再拔比較安全。

2009/04/11

佈景主題的列表樣式

今天心血來潮,想來換一換部落格的佈景主題,不過選來選去,每個佈景主題對於文章中內文的列表樣式都是 none。


另外就是固定寬度的問題,這對有寬螢幕的人實在是一種折磨,其他還有一些小問題...


這實在是很糟糕,所以手動改了改,在 部落格 » 樣式管理 » 樣式設計精靈 » CSS 原始碼編輯 加上以下的樣式即可:


 


/* 列表樣式 */
.article-content ol, .article-content ul {margin:1em; list-style-position:inside;}
.article-content ol {list-style-type:decimal;}
.article-content ul {list-style-type:disc;}

/* 所有文章列表 */
.box-more {display:inline;}

/* 分頁 */
.page {text-align:center;}

/* 比例寬度 */
#container2 {width:95%;}
#content {width:75%;}
#links {width:20%;}

2009/03/30

Drupal 的所見即所得編輯器

在 Drupal 裡面有許多的所見即所得編輯器,比如說: TinyMCE 和 FCKEditor 是兩個比較為大家熟知的。


不過在設定上,有些只允許本文輸入的狀況,常常需要為不同的 class 或是 path 設定例外條件,以免把所有的 TEXTAREA 都變成所見即所得的編輯畫面。


WYSIWYG API 就比較聰明,它可以根據輸入格式(Input Format )來設定不同的編輯器,這樣就無須設定例外條件了。


WYSIWYG API 也支援各種不同的所見即所得編輯器,包括:



  • FCKeditor

  • jWYSIWYG

  • markItUp

  • NicEdit

  • TinyMCE

  • Whizzywig

  • YUI


這些編輯器支援的功能不一,使用者可依需要來選擇使用。


接下來我來說說這些編輯器的的一些問題:



  • FCKeditor:自訂按鈕時,最多只有一排,超過編輯框寬度會被截掉。

  • YUI:按鈕會變成垂直排列。

  • TinyMCE:在 TinyMCE 3 時,如果有選 Flash 按鈕的話,所有的按鈕會消失不見。


TinyMCE 3 的 Flash 按鈕解法: TinyMCE 3 沒有 Flash 按鈕的 Plugin,要改成 Media 按鈕的 Plugin,所以需要修改相關的程式。


找到 [模組目錄]/wysisyg/editors/tinymce.inc 中的 wysiwyg_tinymce_plugins 函式。


註解掉以下幾行:


    'flash' => array(
      'path' => $editor['library path'] .'/plugins/flash',
      'buttons' => array('flash' => t('Flash')),
      'extended_valid_elements' => array('img[class|src|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name|obj|param|embed]'),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',
      'internal' => TRUE,
      'load' => TRUE,
    ),


 


將函數最後的:


  if ($editor['installed version'] > 3) {
    $plugins['xhtmlxtras'] = array(
      'path' => $editor['library path'] .'/plugins/xhtmlxtras',
      'buttons' => array('cite' => t('Citation'), 'del' => t('Deleted'), 'abbr' => t('Abbreviation'), 'acronym' => t('Acronym'), 'ins' => t('Inserted')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',
      'internal' => TRUE,
      'load' => TRUE,
    );
    $plugins['safari'] = array(
      'path' => $editor['library path'] .'/plugins/safari',
      'extensions' => array('safari' => t('Safari compatibility')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',
      'internal' => TRUE,
      'load' => TRUE,
    );
  }


換成:


  if ($editor['installed version'] > 3) {
    $plugins['xhtmlxtras'] = array(
      'path' => $editor['library path'] .'/plugins/xhtmlxtras',
      'buttons' => array('cite' => t('Citation'), 'del' => t('Deleted'), 'abbr' => t('Abbreviation'), 'acronym' => t('Acronym'), 'ins' => t('Inserted')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',
      'internal' => TRUE,
      'load' => TRUE,
    );
    $plugins['safari'] = array(
      'path' => $editor['library path'] .'/plugins/safari',
      'extensions' => array('safari' => t('Safari compatibility')),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/safari',
      'internal' => TRUE,
      'load' => TRUE,
    );
        $plugins['media'] = array(
            'path' => $editor['library path'] .'/plugins/media',
            'buttons' => array('media' => t('Insert media')),
            'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',
            'internal' => TRUE,
            'load' => TRUE,
    );
  } else {
    $plugins['flash'] = array(
      'path' => $editor['library path'] .'/plugins/flash',
      'buttons' => array('flash' => t('Flash')),
      'extended_valid_elements' => array('img[class|src|alt|title|hspace|vspace|width|height|align|onmouseover|onmouseout|name|obj|param|embed]'),
      'url' => 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/flash',
      'internal' => TRUE,
      'load' => TRUE,
    );
    }


即可。


 

2009/03/12

快速升級 CakePHP

底下是我用來升級新版的 CakePHP 的作法:



  1. 解壓縮新版的 CakePHP 壓縮包

  2. 刪除解壓出來的所有 .htaccess


    • <解壓目錄>\.htaccess

    • <解壓目錄>\app\.htaccess

    • <解壓目錄>\app\webroot\.htaccess



  3. 更名以下檔案


    • <解壓目錄>\app\config\bootstrap.php => bootstrap.php.default

    • <解壓目錄>\app\config\core.php => core.php.default

    • <解壓目錄>\app\config\inflections.php => inflections.php.default

    • <解壓目錄>\app\config\routes.php => routes.php.default



  4. 將解壓出來的檔案複製到程式目錄中


 

2009/01/06

回應 jaceju 抽象的意義

原文在此 http://www.jaceju.net/blog/?p=375


剛好我去年曾經實做過 DB Layer,對於抽象我有自己的看法。


首先相對於抽象,在編程上就是實做,換言之,抽象是訂定實做規格前必要的手段。
再來是抽象到底抽掉了什麼象?經驗告訴我,抽象是把介面從細節的「現象」抽出來。


用工程的角度來說,抽象是標準化的手法,它可以讓我們更快的瞭解一個系統。
不過抽象也有盲點,因為他抽掉了細節上的現象,所以在實做的時候,必須把細節補回去。


一來一往這就構造了一個系統。