<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0" xml:base="http://www.joetsuihk.com/">
  <channel>
    <title>JOE Tsui's Drupal site</title>
    <link>http://www.joetsuihk.com/</link>
    <description />
    <language>en</language>
          <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/joetsuihk" type="application/rss+xml" /><feedburner:emailServiceId>joetsuihk</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
    <title>Project filmcritics.org.hk 香港電影評論學會</title>
    <link>http://feedproxy.google.com/~r/joetsuihk/~3/JOIBNsFAmkg/128</link>
    <description>&lt;!-- google_ad_section_start --&gt;&lt;div class="field field-type-filefield field-field-image"&gt;
      &lt;div class="field-label"&gt;Snapshot:&amp;nbsp;&lt;/div&gt;
    &lt;div class="field-items"&gt;
            &lt;div class="field-item odd"&gt;
                    &lt;a href="/node/128" class="imagecache imagecache-thrumbnail imagecache-linked imagecache-thrumbnail_linked"&gt;&lt;img src="http://www.joetsuihk.com/files/imagecache/thrumbnail/1.gif" alt="" title=""  width="150" height="150" /&gt;&lt;/a&gt;        &lt;/div&gt;
              &lt;div class="field-item even"&gt;
                    &lt;a href="/node/128" class="imagecache imagecache-thrumbnail imagecache-linked imagecache-thrumbnail_linked"&gt;&lt;img src="http://www.joetsuihk.com/files/imagecache/thrumbnail/2.gif" alt="" title=""  width="150" height="150" /&gt;&lt;/a&gt;        &lt;/div&gt;
              &lt;div class="field-item odd"&gt;
                    &lt;a href="/node/128" class="imagecache imagecache-thrumbnail imagecache-linked imagecache-thrumbnail_linked"&gt;&lt;img src="http://www.joetsuihk.com/files/imagecache/thrumbnail/3.gif" alt="" title=""  width="150" height="150" /&gt;&lt;/a&gt;        &lt;/div&gt;
        &lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Requirement gathering&lt;br /&gt;
Functional design&lt;br /&gt;
Drupal core&lt;br /&gt;
site XHTML, JS, CSS&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=JOIBNsFAmkg:NN39Xv360ys:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=JOIBNsFAmkg:NN39Xv360ys:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=JOIBNsFAmkg:NN39Xv360ys:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=JOIBNsFAmkg:NN39Xv360ys:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=JOIBNsFAmkg:NN39Xv360ys:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=JOIBNsFAmkg:NN39Xv360ys:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=JOIBNsFAmkg:NN39Xv360ys:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joetsuihk/~4/JOIBNsFAmkg" height="1" width="1"/&gt;</description>
     <pubDate>Mon, 15 Jun 2009 14:03:17 +0000</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">128 at http://www.joetsuihk.com</guid>
  <feedburner:origLink>http://www.joetsuihk.com/node/128</feedburner:origLink></item>
  <item>
    <title>svn 概念, 初階使用 </title>
    <link>http://feedproxy.google.com/~r/joetsuihk/~3/b-IO41gdNj4/127</link>
    <description>&lt;!-- google_ad_section_start --&gt;&lt;p&gt;svn 是一個管理源碼的工具&lt;br /&gt;
它提供一個容許多人協作的平台, 幫助一個多人開發的團隊管理代碼&lt;br /&gt;
同時提供一個保存多版本的功能 (version-ing)&lt;/p&gt;
&lt;p&gt;而我因為多數都自己一個開發, 主要為了 versioning 而使用 svn&lt;br /&gt;
但因為有多個開發機器&lt;br /&gt;
為了保持代碼在多個機器中同步, 都會使用 svn&lt;/p&gt;
&lt;p&gt;我在 windows 機是使用 &lt;a href="http://www.google.com.hk/url?q=http://tortoisesvn.tigris.org/&amp;amp;ei=msArStO-MMSUkAWm7uXiCg&amp;amp;sa=X&amp;amp;oi=oneline_sitelinks&amp;amp;resnum=1&amp;amp;ct=result&amp;amp;cd=1&amp;amp;usg=AFQjCNF-uSRx8k1VHo7Fd49seoj8e2VpaA"&gt;TortoiseSVN&lt;/a&gt; GUI client&lt;br /&gt;
ubuntu 上使用 &lt;a title="nautilussvn" href="http://code.google.com/p/nautilussvn/" id="iw49"&gt;nautilussvn&lt;/a&gt;&lt;br /&gt;
使用上, 介面上都很類似, 都很好用&lt;/p&gt;
&lt;p&gt;&lt;b&gt;先談一下 svn 的概念&lt;/b&gt;&lt;br /&gt;
svn server 是指在 remote 上的server&lt;br /&gt;
大家都將大家的code 上傳 (commit) 到這個中央的server&lt;br /&gt;
而開發機則是 client端 (當然, 他們其實可以在同一部機器上)&lt;br /&gt;
而 head 是指最新的一組檔案的集合, 統稱 head version&lt;br /&gt;
trunk 一般指 server 上的 head.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;從日常使用次數最多的功能開始介紹&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;checkout&lt;/b&gt;&lt;br /&gt;
從server 上下載源碼(即 server 上己經建立好, 設定好)&lt;br /&gt;
在本機(即開發機上)建立一個拷貝&lt;br /&gt;
是在開發機上開始建立一個新的 project 的方法&lt;br /&gt;
完成便可以開始改動源碼, 開發的工作了&lt;br /&gt;
可以從 &lt;a title="code.google.com" href="http://code.google.com/hosting/" id="fd5n"&gt;code.google.com&lt;/a&gt; 隨便選一個 project 使可以checkout了 (source tab 便可以找到 svn url, &lt;a title="例" href="http://code.google.com/p/jquery-json/source/checkout" id="g7q1"&gt;例&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;commit / add&lt;br /&gt;
&lt;/b&gt;commit 是指將本機的源碼上載到 svn server 上(要已經checkout 過的檔案)&lt;br /&gt;
例如已經checkout 過的 project,&lt;br /&gt;
在改動源碼之後, 資料夾上使會有一個紅色的X, 代表需要 commit&lt;br /&gt;
而如果你有權力 commit, 便可以上載到 svn server 上了&lt;br /&gt;
而每一個commit 都儲存到 server 上, 之後的任何時候都可以調用, 還原等等 (就算commit 再覆寫過都可以)&lt;/p&gt;
&lt;p&gt;而 add 則是新增一個沒有 svn 的檔案到 svn server.&lt;/p&gt;
&lt;p&gt;commit 的策略是, 每午飯之前, 下班之前都commit, 原因在討論 update 之後再研究&lt;/p&gt;
&lt;p&gt;&lt;b&gt;update&lt;br /&gt;
&lt;/b&gt;如果我 checkout 了一個 project, 但 project code 在svn server 上有其他人 commit 了中&lt;br /&gt;
我應該如何更新我的 code 令自己和svn server 同步?&lt;br /&gt;
答案是 update.&lt;br /&gt;
svn 會幫我們從 server 上下載, 而且萬一需要覆寫一個我們正在修改的檔案(即一個衝突 conflict 發生了),&lt;br /&gt;
svn 會嘗試幫我們合併, 確保同事做的修改和我們的修改都正確的保存&lt;/p&gt;
&lt;p&gt;如果開發團隊同意了午飯前, 下班前commit 當日的源碼,&lt;br /&gt;
update 的策略便是 上班的第一件事, 和午飯後的第一件事了.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;change log, diff&lt;br /&gt;
&lt;/b&gt;每一次的commit 都會留下記錄在 server 上 (change log)&lt;br /&gt;
並有一個唯一的 版本(version) id&lt;br /&gt;
我們任何時候都可以將任何兩個 commit 比較&lt;br /&gt;
並還原, 合併任何兩個檔案&lt;/p&gt;
&lt;p&gt;svn 在處理 conflict 的時候, 不一定能自動合併&lt;br /&gt;
這時 svn 會要求我們做手動合併, diff 工具都會協助我們分析兩個衝突檔案的內容的&lt;/p&gt;
&lt;p&gt;&lt;b&gt;tag / branch&lt;br /&gt;
&lt;/b&gt;這是一個進階使用者的題目, 請先確保你試過, 用過上面的功能再繼續&lt;br /&gt;
head 便是一個等殊tag, 這個tag 是會隨著commit 而移動&lt;br /&gt;
而我可以因應需求tag 一個 2009-06-08 tag&lt;br /&gt;
標記這些便是 09年 6月 8日 的源碼, 主要是為了方便日後的調用 (稱為日期tag)&lt;/p&gt;
&lt;p&gt;而branch 其實和 tag 類似, 但 checkout 了 branch 的話, 你的 commit 會指定為 commit 到這個 branch,&lt;br /&gt;
而不是一般的主線&lt;br /&gt;
這樣, 你就可以將你的重大更新, refactoring 開一個 branch, 完成再 merge&lt;br /&gt;
令自己的重大更新的開發代碼不會干擾其他同事的開發&lt;/p&gt;
&lt;p&gt;指令上在 GUI 都好簡單, checkout/update 了以後, 直接在資料夾上右鍵-&amp;gt;tag/branch 便可以了&lt;/p&gt;
&lt;p&gt;&lt;b&gt;安裝 svn server @ubuntu&lt;br /&gt;
&lt;/b&gt;&lt;span style="font-size: 100%;"&gt;首先安裝 SVN&lt;br /&gt;
sudo apt-get install subversion&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;安裝 svn 在 Apache 使用的套件&lt;br /&gt;
sudo apt-get install libapache2-svn&lt;/p&gt;
&lt;p&gt;進階的權限便自己 google 一下了&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Project setup&lt;br /&gt;
&lt;/b&gt;安裝完便要建立一個 trunk,&lt;br /&gt;
而一般的資料夾習慣是:&lt;br /&gt;
SVN-ROOT&lt;br /&gt;
-PROJECT-NAME1&lt;br /&gt;
--trunk&lt;br /&gt;
--tags&lt;br /&gt;
--branches&lt;br /&gt;
-PROJECT-NAME2&lt;br /&gt;
--trunk&lt;br /&gt;
--tags&lt;br /&gt;
--branches&lt;/p&gt;
&lt;p&gt;建立 SVN-ROOT 到 /home/svn:&lt;br /&gt;
sudo svnadmin create /home/svn&lt;/p&gt;
&lt;p&gt;建立 PROJECT-NAME1:&lt;br /&gt;
GUI:&lt;br /&gt;
在開發資料夾 (例 /var/www) checkout &lt;a href="///home/svn" title="///home/svn"&gt;file:///home/svn&lt;/a&gt;&lt;br /&gt;
checkout 後建立 trunk, branches, tags 三個資料夾&lt;br /&gt;
commit 三個資料夾&lt;br /&gt;
再 del 三個資料夾, 然後 checkout trunk&lt;br /&gt;
便可以開始 add了&lt;/p&gt;
&lt;p&gt;&lt;b&gt;conclusion&lt;br /&gt;
&lt;/b&gt;會使用 svn 工具絕對是其中一個進階程序員的指標 (包括 tag/branch)&lt;br /&gt;
工具看似複雜, 但其實真正做起來只是很簡單的概念, 但用文字真的比較難以表達&lt;br /&gt;
找一個人教一教, 十分鐘便什麼都懂了.&lt;/p&gt;
&lt;p&gt;version control 的工具其實還有 cvs, git 等, 概念有一點不同&lt;br /&gt;
但一般的操作反而很類似, 舉一反三就是了&lt;/p&gt;
&lt;p&gt;但svn 都不是萬能&lt;br /&gt;
sql server 中設定很多的 cms (drupal 便是一個明顯例子) 如何做 version control?&lt;br /&gt;
mysqldump + commit?&lt;br /&gt;
有高手能解答嗎?&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=b-IO41gdNj4:KOBpREOotQo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=b-IO41gdNj4:KOBpREOotQo:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=b-IO41gdNj4:KOBpREOotQo:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=b-IO41gdNj4:KOBpREOotQo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=b-IO41gdNj4:KOBpREOotQo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=b-IO41gdNj4:KOBpREOotQo:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=b-IO41gdNj4:KOBpREOotQo:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joetsuihk/~4/b-IO41gdNj4" height="1" width="1"/&gt;</description>
     <comments>http://www.joetsuihk.com/node/127#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/development">Development</category>
 <category domain="http://www.joetsuihk.com/taxonomy/term/50">svn</category>
 <pubDate>Tue, 09 Jun 2009 13:01:10 +0000</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">127 at http://www.joetsuihk.com</guid>
  <feedburner:origLink>http://www.joetsuihk.com/node/127</feedburner:origLink></item>
  <item>
    <title>theme 使用theme 自己的 *.tpl.php, build a custom hook_theme() on a theme</title>
    <link>http://feedproxy.google.com/~r/joetsuihk/~3/e44hXmKkKN4/126</link>
    <description>&lt;!-- google_ad_section_start --&gt;&lt;p&gt;一個module 需要輸出html 的話, 會使用 hook_theme()&lt;br /&gt;
但如果一個theme 都需要輸出特定的html, 或者需要使用 *.tpl.php的話&lt;br /&gt;
因為Drupal 6 新增了 theme registry,&lt;br /&gt;
以前 Drupal 5 的theme 內的theme() 函數都不會自動加到theme registry&lt;br /&gt;
要在 template.php 內:&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=e44hXmKkKN4:LHBLXRYFszg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=e44hXmKkKN4:LHBLXRYFszg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=e44hXmKkKN4:LHBLXRYFszg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=e44hXmKkKN4:LHBLXRYFszg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=e44hXmKkKN4:LHBLXRYFszg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=e44hXmKkKN4:LHBLXRYFszg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=e44hXmKkKN4:LHBLXRYFszg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joetsuihk/~4/e44hXmKkKN4" height="1" width="1"/&gt;</description>
     <comments>http://www.joetsuihk.com/node/126#comments</comments>
 <category domain="http://www.joetsuihk.com/free_tags/development">Development</category>
 <category domain="http://www.joetsuihk.com/taxonomy/term/29">Drupal6.x</category>
 <pubDate>Sun, 03 May 2009 16:25:34 +0000</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">126 at http://www.joetsuihk.com</guid>
  <feedburner:origLink>http://www.joetsuihk.com/node/126</feedburner:origLink></item>
  <item>
    <title>Vertical Tab</title>
    <link>http://feedproxy.google.com/~r/joetsuihk/~3/aZQEYqycIsI/125</link>
    <description>&lt;!-- google_ad_section_start --&gt;&lt;p&gt;就是vertical tab, node form 終於都不需要hack 了...&lt;/p&gt;
&lt;p&gt;&lt;img src="http://www.joetsuihk.com/files/vertical-tab.gif" /&gt;&lt;/p&gt;
&lt;!-- google_ad_section_end --&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=aZQEYqycIsI:dvAoV0NiWu0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=aZQEYqycIsI:dvAoV0NiWu0:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=aZQEYqycIsI:dvAoV0NiWu0:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=aZQEYqycIsI:dvAoV0NiWu0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=aZQEYqycIsI:dvAoV0NiWu0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/joetsuihk?a=aZQEYqycIsI:dvAoV0NiWu0:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/joetsuihk?i=aZQEYqycIsI:dvAoV0NiWu0:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/joetsuihk/~4/aZQEYqycIsI" height="1" width="1"/&gt;</description>
     <comments>http://www.joetsuihk.com/node/125#comments</comments>
 <enclosure url="http://www.joetsuihk.com/files/vertical-tab.gif" length="19885" type="image/gif" />
 <pubDate>Wed, 22 Apr 2009 13:05:18 +0000</pubDate>
 <dc:creator>JOE</dc:creator>
 <guid isPermaLink="false">125 at http://www.joetsuihk.com</guid>
  <feedburner:origLink>http://www.joetsuihk.com/node/125</feedburner:origLink></item>
  </channel>
</rss>
