<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet href="http://blog.eddie.com.tw/styles/rss.css" type="text/css"?>
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
>
 <channel>
  <title>eddie@Home</title>
  <link>http://blog.eddie.com.tw</link>
  <description></description>
  <pubDate>Wed, 08 Sep 2010 23:55:47 +0800</pubDate>
  <generator>http://www.lifetype.net</generator>
    <item>
   <title>Refactoring in AS3</title>
   <description>
    &lt;p&gt;最近連續兩場上台講話，深深覺得自己的口條跟講話的速度還得再好好的修練。這是今天在同業的AS聚會上講的內容 Refactoring in AS3&lt;/p&gt;&lt;div id=&quot;__ss_4852812&quot; style=&quot;width: 425px&quot;&gt;&lt;strong style=&quot;display: block; margin: 12px 0pt 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/aquarianboy/refactoring-in-as3&quot; title=&quot;Refactoring in AS3&quot;&gt;Refactoring in AS3&lt;/a&gt;&lt;/strong&gt;&lt;object height=&quot;355&quot; id=&quot;__sse4852812&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2010-07-28refactoringas3-100727182413-phpapp01&amp;amp;stripped_title=refactoring-in-as3&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;/object&gt;&lt;div style=&quot;padding: 5px 0pt 12px&quot;&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/aquarianboy&quot;&gt;Eddie Kao&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;另外這是在上星期的&lt;a href=&quot;http://ptt-flash.heroku.com/&quot; target=&quot;_blank&quot; title=&quot;PTT-Flash聚會&quot;&gt;Flash聚會&lt;/a&gt;分享的 AS3 Better Practices&lt;/p&gt;&lt;div id=&quot;__ss_4830864&quot; style=&quot;width: 425px&quot;&gt;&lt;strong style=&quot;display: block; margin: 12px 0pt 4px&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/aquarianboy/2010-0700-as3-better-practice&quot; title=&quot;AS3 Better Practices&quot;&gt;AS3 Better Practices&lt;/a&gt;&lt;/strong&gt;&lt;object height=&quot;355&quot; id=&quot;__sse4830864&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=2010-07-00as3betterpractice-100724194140-phpapp02&amp;amp;stripped_title=2010-0700-as3-better-practice&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;&gt;&lt;/param&gt;&lt;/object&gt;&lt;div style=&quot;padding: 5px 0pt 12px&quot;&gt;View more &lt;a href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/a&gt; from &lt;a href=&quot;http://www.slideshare.net/aquarianboy&quot;&gt;Eddie Kao&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;p&gt;有需要歡迎取用 :) &lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2010/07/29/refactoring-in-as3</link>
   <comments>http://blog.eddie.com.tw/2010/07/29/refactoring-in-as3</comments>
   <guid>http://blog.eddie.com.tw/2010/07/29/refactoring-in-as3</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>Flash</category>
      
    <category>ActionScript</category>
         <pubDate>Thu, 29 Jul 2010 01:08:48 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>Ruby on Rails之門外漢心得</title>
   <description>
    &lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/80-rails_logo.png&quot; border=&quot;0&quot; alt=&quot;Ruby on Rails logo&quot; title=&quot;Ruby on Rails logo&quot; hspace=&quot;2&quot; vspace=&quot;2&quot; align=&quot;left&quot; /&gt;這不是討戰文，也不是一篇討論程式語言的誰優誰劣的文章，反而比較像是昇火、勸敗文&lt;br /&gt;僅就我個人這半年來使用&lt;a href=&quot;http://rubyonrails.org/&quot; target=&quot;_blank&quot; title=&quot;Ruby on Rails&quot;&gt;Ruby on Rails&lt;/a&gt;(以下簡稱RoR，不是那個那個RO線上遊戲)用在工作上的一些簡單的心得跟大家分享&lt;/p&gt;&lt;p&gt;很多廠商喜歡做網路活動來促銷新商品、打知名度或是跟網友拉近距離。目前廠商們比較愛的網路活動，大概有上傳照片、影片、票選、轉寄、推薦..等，而隨著&amp;quot;社會的進步&amp;quot;，客戶們也&amp;quot;得跟上時代&amp;quot;，都不免俗的要跟FB或plurk弄在一起，而我的工作，主要就是幫客戶處理這樣的需求。(我想這段我的同業應該知道我是在講反話!)&lt;/p&gt;&lt;p&gt;就我而言，我個人比較熟悉的程式語言算是ActionScript 2/3，大部份的工作也都是跟紅紅的flash為伍。但後來的網路活動越弄越複雜，單純的flash已經不見得夠用了，很多時候得跟server端交換資料。&lt;/p&gt;&lt;p&gt;從最早的asp，後來換到php，其實都還不錯用，也沒什麼問題(不然php現在不會有這麼大的市佔率)。後來試著用php的&lt;a href=&quot;http://framework.zend.com/&quot; target=&quot;_blank&quot; title=&quot;Zend Framework&quot;&gt;zend framework&lt;/a&gt;，因為現在比較流行的web framework都有照著&lt;a href=&quot;http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller&quot; target=&quot;_blank&quot; title=&quot;MVC&quot;&gt;MVC&lt;/a&gt;(Model-View-Controller)的樣子來打造，寫起來程式碼跟頁面有更清楚的感覺。&lt;/p&gt;&lt;p&gt;2009年試著換到&lt;a href=&quot;http://www.python.org/&quot; target=&quot;_blank&quot; title=&quot;Python&quot;&gt;python&lt;/a&gt;加&lt;a href=&quot;http://www.djangoproject.com/&quot; target=&quot;_blank&quot; title=&quot;Django&quot;&gt;django&lt;/a&gt;，它也是MVC的實作，感覺還不賴，有種程式寫起來可以打更少字的感覺。而且它所謂的batteries included，只要把一些設定打開，後台管理功能就直接做起來了，相當方便。&lt;/p&gt;&lt;p&gt;2010年起，我試著開始把案子用RoR來做，整個有種「我終於可以把時間花在&lt;strike&gt;吃喝玩樂&lt;/strike&gt;寫AS上了」的感覺了。&lt;br /&gt;&lt;br /&gt;以下是一些大家可能會有的疑問：&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Q: 為什麼你要一直換?&lt;/strong&gt;&lt;br /&gt;A: 我是善變的人 :)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q: 你是寫AS的，為什麼要自己寫server端的程式?&lt;/strong&gt;&lt;br /&gt;A: 情況允許的話當然我也想跟別人一起合作寫，不過網路活動很多都是急件，而且客戶通常不太會管你六日週末要不要休假。後來發現其實自己寫真的還挺快的，而要什麼資料或是要接什麼資料都可以自己加一下就搞定，免看人臉色。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q: RoR是一種程式語言嗎?&lt;/strong&gt;&lt;br /&gt;A: 不是，它是一種framework，它本身用的程式語言是Ruby&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Q: RoR要錢嗎?&lt;/strong&gt;&lt;br /&gt;A: 不用的，而且你有興趣的話，還可以取得完整的原始碼，印出來上廁所的時候閱讀 :)&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q: 為什麼用RoR來開發會快?&lt;/strong&gt;&lt;br /&gt;A: 以下的動作我先假設開發的工程師有一些RoR的開發經驗。&lt;/p&gt;&lt;p&gt;以一個發票登錄的程式來說，假設它需要使用者姓名、電話、地址、Email及發票號碼等幾個欄位，我的動作就是先建立一個Model來對應這些欄位(這動作大概1~2分鐘左右可完成)。再來就是建立一個Controller來準備接收使用者submit出來的動作(大概1~2分鐘左右)，而實際在Controller裡寫的程式碼，也就是把Model給叫出來，把使用者post的資料餵進去，程式碼如下：&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;invoice = Invoice.new(params[:invoice])&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;最後再一個save的動作&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;invoice.save&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;差不多就搞定了(這動作大概1分鐘左右可完成)&lt;/p&gt;&lt;p&gt;剛剛這些資料庫寫入的動作，再加上一些if..else的判斷，大概10行程式碼有找。整個發票程式部份，不包含設計的話，大概5分鐘能寫完，也許如果再加個發票重複登錄判斷的驗證，最多應該10分鐘搞定。&lt;/p&gt;&lt;p&gt;那要怎麼把資料庫裡的東西撈出來? 通常只要一行：&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;invoice = Invoice.all&lt;/em&gt;&lt;/span&gt; (大概3~10秒，依打字速度不同而有差異)&lt;/p&gt;&lt;p&gt;那要怎麼樣把它餵給flash? RoR的ActiveRecord有支援直接輸出成XML或JSON的方法，簡單的可以直接用invoice.to_xml 或invoice.to_json 就行了(大概10秒)，複雜一點的，也可以用xml builder來建個模板給它(看複雜程度，大概5分鐘內搞定)。&lt;/p&gt;&lt;p&gt;藉由&lt;a href=&quot;http://en.wikipedia.org/wiki/Object-relational_mapping&quot; target=&quot;_blank&quot; title=&quot;ORM&quot;&gt;ORM&lt;/a&gt;(Object-Relational Mapping)的包裝，把原本要用SQL操作的動作，都改用物件的方式來操作。而大部份的網路活動的寫入/查詢語法都挺單純，沒意外的話應該都不用自己寫SELECT * FROM 或是 INSERT INTO之類的東西了，不只操作簡單，也可避開&lt;a href=&quot;http://en.wikipedia.org/wiki/SQL_injection&quot; target=&quot;_blank&quot; title=&quot;SQL Injection&quot;&gt;SQL Injection&lt;/a&gt;的麻煩。&lt;/p&gt;&lt;p&gt;另外RoR的另一大優點，就是它有相當多好用的外掛(plugin)，而且幾乎都是免費可以取得的(含原始碼)&lt;/p&gt;&lt;p&gt;一樣以網路活動上傳照片這個來舉例，上傳照片之後，通常得自動再產生一些比較小尺寸的縮圖，可能還要裁切一下圖片。透過某個方便的外掛(&lt;a href=&quot;http://github.com/thoughtbot/paperclip&quot; target=&quot;_blank&quot; title=&quot;paperclip&quot;&gt;paperclip&lt;/a&gt;)，上面這些動作，真正要寫程式好像不到5行吧，搞定之後會有種「哇賽!怎麼就這樣就可以了?」的驚奇感。&lt;/p&gt;&lt;p&gt;再例如上傳照片後，資料一多，前端呈現的頁面通常就得有分頁的功能，而這功能透過某個方便的外掛(&lt;a href=&quot;http://github.com/mislav/will_paginate&quot; target=&quot;_blank&quot; title=&quot;will_paginate&quot;&gt;will_paginate&lt;/a&gt;)，大概只要多加一行程式碼就可以搞定分頁的工作。&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Q: 可是你知道，做網路的活動，客戶很愛改來改去...RoR改起來會不會很麻煩?&lt;/strong&gt;&lt;br /&gt;A: 網路活動的特性，就是變動性高。除了設計部份可能會被改來改去外，一會可能要你加個中獎名單，一會說這個頁面要放到另一個頁面之後...愛改來改去這件事，&lt;span style=&quot;color: #ff0000&quot;&gt;我想這個是許多同業的痛!&lt;/span&gt;&lt;/p&gt;&lt;p&gt;老實說，就以上面的例子來說，就算整個砍掉重練，也不見得花多少時間；如果是修改流程，說不定改一下route規則就可以技巧性的處理掉了，其實面對愛改來改去的狀況，RoR還是個不錯的應對工具。&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q: RoR效能好嗎?&lt;/strong&gt;&lt;br /&gt;A: 我沒比較過所有家的程式語言以及web framework，所以我沒辦法下這個結論。通常如果遇到效能差或是資料庫負載很吃重的地方，可以把它做cache或產出靜態頁面來提昇效能，而做cache或是把cache給expire掉的動作，在RoR裡是很容易做的。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q: 那，Ruby好寫嗎?&lt;/strong&gt;&lt;br /&gt;A: 我以AS程式碼來舉個例子：&lt;br /&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;if (my_age &amp;gt;= 30)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; trace(&amp;quot;you&amp;#39;re so old!&amp;quot;);&lt;br /&gt;}&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;改用ruby寫的話：&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;if my_age &amp;gt;= 30&lt;br /&gt;&amp;nbsp; puts &amp;quot;you&amp;#39;re so old!&amp;quot;&lt;br /&gt;end&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;基本上少了小括號、大括號，也不用分號結尾，至少就可以少打好些個字，甚如果想要的話，if也可以放到後面：&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;puts &amp;quot;you&amp;#39;re so old&amp;quot; if my_age &amp;gt;= 30&lt;/span&gt;&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;如何? 看起來更像一般的英文吧&lt;br /&gt;&lt;br /&gt;再例如如果我想要印出3天前的日期，有的程式語言可能要先new一個Date物件出來，再透過一些method可以取得日期。在Ruby裡，只要用「&lt;em&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;3.days.ago&lt;/span&gt;&lt;/em&gt;」就行了。3? 它不是數字嗎? 是的，你沒看錯，在Ruby裡什麼東西都是物件，包括數字也是，所以你可以對3這個物件呼叫方法，再來個例子：&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;&lt;em&gt;3.times do&lt;br /&gt;&amp;nbsp; puts &amp;#39;hello&amp;#39;&lt;br /&gt;end&lt;/em&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;猜得出來它在幹嘛嗎? 它就是把&amp;quot;hello&amp;quot;這個字串印3遍...&lt;/p&gt;&lt;p&gt;其它關於這個程式語言的細節，如果想了解更多，可參考&lt;a href=&quot;http://www.ruby-lang.org/en/&quot; target=&quot;_blank&quot; title=&quot;Ruby&quot;&gt;Ruby的官網&lt;/a&gt;，有相當多的文件可以看&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Q: 在flash裡可以用AMF的格式與server端溝通，RoR能做嗎?&lt;/strong&gt;&lt;br /&gt;A: 可以的，請參考 &lt;a href=&quot;http://blog.eddie.com.tw/2010/03/18/rubyamf&quot; title=&quot;RubyAMF&quot;&gt;http://blog.eddie.com.tw/2010/03/18/rubyamf&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Q: 還有什麼好處?&lt;/strong&gt;&lt;br /&gt;A: 前面提到，由於大部份的客戶想要做的東西都差不多，例如發票登錄來說，可以的話，也可以把這些常用的功能也做成「發票plugin」，也許下次要用的時候，就把plugin裝上去，可能再做一些微調就行了。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q: 那，好維護嗎?&lt;/strong&gt;&lt;br /&gt;A: 基本上RoR的骨架是依照MVC的架構來實做的，所以某A或某B寫的程式碼，只要寫的人不要用太奇怪的寫法，大概都可以知道XX程式或XX功能會放在哪裡(當然改不改得動是另一回事)。重點是，很多網路活動都是短期的，活動結束就會下架，&lt;span style=&quot;color: #ff0000&quot;&gt;老實說並沒有太多所謂的維護的問題&lt;/span&gt; :)&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Q: RoR好像被我講得很神，那它缺點是什麼?&lt;/strong&gt;&lt;br /&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;1. 它的學習曲線的高低決定於開發者的背景知識跟經驗&lt;/span&gt;&lt;br /&gt;如果你之前就有用別的程式語言開發過網站，那RoR對你來說應該會比較快上手；如果你對於什麼是Form、什麼是GET/POST還不清楚的話，那這個對你來說可能會有些吃力，很容易卡關。特別是如果沒有個導師帶入門，還真的很容易碰壁。 (PS: 其實最好還有一些*nix的操作經驗，以及熟悉一些版本控制系統如SVN或Git)&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff0000&quot;&gt;2. 台灣的hosting比較不好找&lt;/span&gt;&lt;br /&gt;台灣目前使用的人口還是相當少，國外雖然有比較多的solution，但客戶的網路活動的TA大部份都是在台灣，可能會有連線速度不夠快的問題。這個我解決的方法就是，我自己弄一台機器放機房，自己弄環境起來 :)&lt;br /&gt;&lt;br /&gt;綜合以上各項優缺點，我真的覺得RoR挺適合拿來做網路活動，當然做長期的官網也合適，這裡就我自己工作上常遇到的狀況提供一些建議。&lt;br /&gt;&lt;br /&gt;以上，僅以我這半年來用RoR的一些小小心得與大家分享，我也還是個一隻腳剛踏進去的新手門外漢，內容若有誤再請前輩、神人們不吝指教 :)&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2010/07/16/internet-campaign-with-ruby-on-rails</link>
   <comments>http://blog.eddie.com.tw/2010/07/16/internet-campaign-with-ruby-on-rails</comments>
   <guid>http://blog.eddie.com.tw/2010/07/16/internet-campaign-with-ruby-on-rails</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>My Diary</category>
      
    <category>Ruby</category>
      
    <category>Rails</category>
         <pubDate>Fri, 16 Jul 2010 11:59:56 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>Python and Django Tutorial</title>
   <description>
    &lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/python_logo.jpg&quot; border=&quot;0&quot; /&gt; &lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/django_logo.jpg&quot; border=&quot;0&quot; /&gt;&lt;br /&gt;最近有機會去&lt;a href=&quot;http://www.iiiedu.org.tw/&quot; target=&quot;_blank&quot; title=&quot;資策會&quot;&gt;資策會&lt;/a&gt;講課(python/django)，剛好趁這個機會把手邊的一些資料整理一下，方便自己記憶也方便讓大家直接剪下貼上程式碼，免去打錯字的困擾。有需要的朋友歡迎取用。 &lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.eddie.com.tw/course/index.php/Python_index&quot; target=&quot;_blank&quot; title=&quot;Python&quot;&gt;Python&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.eddie.com.tw/course/index.php/Django_index&quot; target=&quot;_blank&quot; title=&quot;Django&quot;&gt;Django&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;內容主要以python 2.x及django 1.1.x為主，若發現有誤還請不吝告知 :) &lt;/p&gt;&lt;p&gt;話說今天django的1.2版也&lt;a href=&quot;http://www.djangoproject.com/weblog/2010/may/17/12/&quot; target=&quot;_blank&quot; title=&quot;Django&quot;&gt;release&lt;/a&gt;了(&lt;a href=&quot;http://docs.djangoproject.com/en/dev/releases/1.2/&quot; target=&quot;_blank&quot; title=&quot;Django 1.2 release note&quot;&gt;release note&lt;/a&gt;)，
再找個機會把手邊用1.1.1寫過的小案子昇級看看，希望不會爆炸 :) &lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2010/05/18/python-and-django-tutorial</link>
   <comments>http://blog.eddie.com.tw/2010/05/18/python-and-django-tutorial</comments>
   <guid>http://blog.eddie.com.tw/2010/05/18/python-and-django-tutorial</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>Python</category>
      
    <category>Django</category>
         <pubDate>Tue, 18 May 2010 17:29:46 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>Testing with Cucumber</title>
   <description>
    &lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/cucumber.png&quot; border=&quot;0&quot; alt=&quot;Cucumber&quot; title=&quot;Cucumber&quot; hspace=&quot;3&quot; vspace=&quot;3&quot; width=&quot;89&quot; height=&quot;87&quot; align=&quot;left&quot; /&gt;最近手邊某個案子在試著用&lt;a href=&quot;http://cukes.info/&quot; target=&quot;_blank&quot; title=&quot;Cucumber&quot;&gt;Cucumber&lt;/a&gt;來做測試開發(BDD - Behavior Driven Development)，這真是個神奇的東西，寫測試腳本感覺像是在寫一般的英文句子一樣，以下兩篇是自己看著&lt;a href=&quot;http://workingwithrails.com/person/6491-ryan-bates&quot; target=&quot;_blank&quot; title=&quot;Ryan Bates&quot;&gt;Ryan Bates&lt;/a&gt;在Railcast上的&lt;a href=&quot;http://railscasts.com/episodes/155-beginning-with-cucumber&quot; target=&quot;_blank&quot; title=&quot;Rubycast&quot;&gt;教學影片&lt;/a&gt;練習的心得筆記，供有需要的人參考&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.eddie.com.tw/course/index.php/Ruby_cucumber_basic&quot; target=&quot;_blank&quot; title=&quot;Test with Cucumber&quot;&gt;基本篇&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.eddie.com.tw/course/index.php/Ruby_cucumber_advance1&quot; target=&quot;_blank&quot; title=&quot;Test with Cucumber&quot;&gt;表單填寫篇 &lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;這小黃瓜能測的東西範圍相當廣，官網上的&lt;a href=&quot;http://wiki.github.com/aslakhellesoy/cucumber/tutorials-and-related-blog-posts&quot; target=&quot;_blank&quot; title=&quot;Cucumber toturials&quot;&gt;toturial&lt;/a&gt;有很多有趣的應用，而且越看越有趣，之後還會繼續再把一些自己試作的心得再貼上來，若有錯誤的地方再歡迎告知 :)&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2010/05/06/testing-with-cucumber</link>
   <comments>http://blog.eddie.com.tw/2010/05/06/testing-with-cucumber</comments>
   <guid>http://blog.eddie.com.tw/2010/05/06/testing-with-cucumber</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>Ruby</category>
      
    <category>Rails</category>
      
    <category>Test</category>
         <pubDate>Thu, 06 May 2010 00:56:51 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>rails console / irb 裡的方便工具-Hirb</title>
   <description>
    &lt;p&gt;方便的工具，寫起來給自己做個備忘，免得到時候忘記 :)&lt;br /&gt;&lt;br /&gt;在做資料庫存取的時候，常會把抓到的model object印出來看看到底內容正確與否&lt;br /&gt;假設我有個名叫Book的model，我從裡面隨便抓一筆資料出來大概會長這樣：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/output_default.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;除此之外，也可以透過y方法把內容以YAML格式輸出&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/output_yaml.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;其實這樣也不會多難看，反正看久就習慣了&lt;br /&gt;剛好最近在看&lt;a href=&quot;http://railscasts.com/&quot; target=&quot;_blank&quot; title=&quot;Railscast&quot;&gt;Railscasts&lt;/a&gt;的時候才發現原來有更方便的gem可以用..它叫做&lt;a href=&quot;http://github.com/cldwalker/hirb&quot; target=&quot;_blank&quot; title=&quot;Hirb&quot;&gt;Hirb&lt;/a&gt;&lt;br /&gt;可以讓在console模式下輸出的內容更清楚了&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://github.com/cldwalker/hirb&quot; target=&quot;_blank&quot; title=&quot;Hirb&quot;&gt;官網&lt;/a&gt;的安裝說明其實就很清楚了，簡單的說，就是用gem一個動作就搞定了&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #993300&quot;&gt;&amp;gt; sudo gem install hirb&lt;/span&gt;&lt;/p&gt;&lt;p&gt;進入rails project裡的console模式後&amp;hellip;&lt;br /&gt;&lt;span style=&quot;color: #993300&quot;&gt;&amp;gt;&amp;gt; require &amp;#39;hire&amp;#39;&lt;br /&gt;&amp;gt;&amp;gt; Hirb.enable &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;接下來，剛剛那個object會變成：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/output_hirb.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;如果再加一下logger的設定，還可以讓輸出的同時把查詢的log也秀出來&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/output_hirb_with_log.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;當你不想用的時候，只要用：&lt;br /&gt;&lt;span style=&quot;color: #993300&quot;&gt;&amp;gt;&amp;gt; Hirb.disable&lt;/span&gt;&lt;/p&gt;&lt;p&gt;就可以把它關掉了&lt;br /&gt;&lt;br /&gt;如果覺得hirb很方便但又不想每次進console都打這些指令的話，也可以把上面這些動作放到.irbrc裡(檔名: ~/.irbrc)&lt;br /&gt;&lt;span style=&quot;color: #993300&quot;&gt;require &amp;#39;rubygems&amp;#39;&lt;br /&gt;require &amp;#39;hirb&amp;#39;&lt;br /&gt;require &amp;#39;active_record&amp;#39;&lt;br /&gt;Hirb.enable&lt;br /&gt;ActiveRecord::Base.logger = Logger.new(STDOUT)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;當然，hirb不只有這樣而已，不過光是這樣我就覺得很棒了。更細節的說明請洽&lt;a href=&quot;http://github.com/cldwalker/hirb&quot; target=&quot;_blank&quot; title=&quot;Hirb&quot;&gt;網站&lt;/a&gt; :)&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2010/04/09/hirb-the-convenient-gem-for-console-and-irb</link>
   <comments>http://blog.eddie.com.tw/2010/04/09/hirb-the-convenient-gem-for-console-and-irb</comments>
   <guid>http://blog.eddie.com.tw/2010/04/09/hirb-the-convenient-gem-for-console-and-irb</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>Ruby</category>
      
    <category>Rails</category>
         <pubDate>Fri, 09 Apr 2010 02:37:11 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>如何在Rails裡使用AMF</title>
   <description>
    &lt;p&gt;=====&lt;br /&gt;&amp;nbsp; 前言&lt;br /&gt;=====&lt;br /&gt;&lt;br /&gt;常聽很多朋友會問：「flash要怎麼樣跟資料庫串接?」&lt;br /&gt;答案其實很簡單：「不行!目前flash沒辦法直接與資料庫串接」&lt;br /&gt;&lt;br /&gt;那到底別人是怎麼做的，為什麼他們的flash可以由後台管理然後更新資料?&lt;br /&gt;&lt;br /&gt;flash(*.swf) &amp;lt;--&amp;gt; Server端程式(asp, .net, php&amp;hellip;etc) &amp;lt;--&amp;gt; DB&lt;br /&gt;&lt;br /&gt;*.swf透過HTTP GET/POST的方式送給中間的程式&lt;br /&gt;透過中間的程式，flash才得以從資料庫中取出/寫入資料&lt;br /&gt;&lt;br /&gt;其中*.swf與server端程式溝通的格式，有簡單的純文字組合&lt;br /&gt;或是用JSON或XML來包裝資料，再餵給*.swf，最後再呈現在flash上&lt;br /&gt;特別是XML對AS3還滿友善的，可以簡單的就取出指定節點的資料&lt;br /&gt;&lt;br /&gt;而今天要提的 AMF(&lt;a href=&quot;http://en.wikipedia.org/wiki/Action_Message_Format&quot; target=&quot;_blank&quot; title=&quot;Action Message Format&quot;&gt;Action Message Format&lt;/a&gt;)&lt;br /&gt;其實做的工作跟上面的JSON或XML差不多，只是它的格式是binary的&lt;br /&gt;&lt;br /&gt;AMF的實作，各家程式語言或Framework都有類似的實作品&lt;br /&gt;像是PHP就有&lt;a href=&quot;http://www.amfphp.org/&quot; target=&quot;_blank&quot; title=&quot;AMFPHP&quot;&gt;AMFPHP&lt;/a&gt;/&lt;a href=&quot;http://framework.zend.com/&quot; target=&quot;_blank&quot; title=&quot;Zend Framework&quot;&gt;Zend_Amf&lt;/a&gt;，Python有&lt;a href=&quot;http://pyamf.org/&quot; target=&quot;_blank&quot; title=&quot;PyAMF&quot;&gt;PyAMF&lt;/a&gt;，.NET有&lt;a href=&quot;http://www.fluorinefx.com/&quot; target=&quot;_blank&quot; title=&quot;FluorineFX&quot;&gt;FluorineFx&lt;/a&gt;，Ruby的話則有&lt;a href=&quot;http://code.google.com/p/rubyamf/&quot; target=&quot;_blank&quot; title=&quot;RubyAMF&quot;&gt;RubyAMF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;不過不管是哪家實作的AMF，流程上都差不多：&lt;br /&gt;1. *.swf連上指定的Gateway&lt;br /&gt;2. 呼叫/執行Gateway上掛載的service，並把所需的參數以AMF格式傳給它(如果有的話)&lt;br /&gt;3. 執行結果回傳&lt;br /&gt;&lt;br /&gt;最近手邊有個案子正好是用Rails寫的，剛好有用上AMF，就趁這個機會寫一下心得，免得自己以後忘記&lt;br /&gt;(其實在Rails裡面，用respond_to直接render產出xml或json也還滿方便的...)&lt;br /&gt;&lt;br /&gt;=====&lt;br /&gt;&amp;nbsp; 環境&lt;br /&gt;=====&lt;br /&gt;Mac OX 10.6&lt;br /&gt;Rails 2.3.5&lt;br /&gt;ruby 1.8.7&lt;br /&gt;RubyAMF 1.6.5&lt;br /&gt;&lt;br /&gt;=====&lt;br /&gt;&amp;nbsp; 安裝&lt;br /&gt;=====&lt;br /&gt;就不多做Rails的介紹了，直接開個空白的Rails Project來做示範&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&lt;br /&gt;&amp;gt; rails rubyamf_demo&lt;br /&gt;&amp;gt; cd rubyamf_demo&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;接下來，安裝RubyAMF&lt;br /&gt;網址：&lt;a href=&quot;http://code.google.com/p/rubyamf/&quot; target=&quot;_blank&quot; title=&quot;RubyAMF&quot;&gt;http://code.google.com/p/rubyamf/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;個人比較建議直接用script/plugin來安裝，簡單方便&lt;br /&gt;當然如果要自己下載打包檔再手動放進來也ok的&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;gt; script/plugin install http://rubyamf.googlecode.com/svn/tags/current/rubyamf&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;沒問題的話，這個動作就會幫你把rubyamf安裝在vender資料夾裡了&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/p1.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;其實這個安裝的過程中，除了把相關檔案裝到vender裡之外，背後有幫忙做了一些事你可能需要知道的：&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000&quot;&gt;1. app/controllers/ 裡多了一個rubyamf_controller.rb&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;這是整個amf的對外窗口，gateway就是寫在這裡了&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000&quot;&gt;2. config/ 裡多了一個 rubyamf_config.rb&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;RubyAMF的設定檔，打開這個檔案應該可以看到許多註解說明，可依情況及個人使用習慣做調整&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000&quot;&gt;3. config/initializers/mime_types.rb多加了一行&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;Mime::Type.register &amp;quot;application/x-amf&amp;quot;, :amf&lt;/span&gt;&lt;/p&gt;&lt;p&gt;到時候可以像 render :text =&amp;gt; &amp;quot;hello&amp;quot;一樣，直接用render :amf =&amp;gt; &amp;quot;hello&amp;quot;來輸出&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000&quot;&gt;4. config/route.rb多了一行路徑設定&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;map.rubyamf_gateway &amp;#39;rubyamf_gateway&amp;#39;, :controller =&amp;gt; &amp;#39;rubyamf&amp;#39;, :action =&amp;gt; &amp;#39;gateway&amp;#39;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;gateway到時候的位置就是http://127.0.0.1:3000/rubyamf/gateway&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #008000&quot;&gt;5. public/ 資料夾多了一個 crossdomain.xml&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;常用AS在串接外部資料的人應該知道這是幹嘛的了，預設是全開&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #999999&quot;&gt;&amp;lt;allow-access-from domain=&amp;quot;*&amp;quot; /&amp;gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;如果有需要調整可直接動手修改 &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;接下來試著啟動server，看看能不能正常運作&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;gt; script/server&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;沒問題的話，接著開瀏覽器看看&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;http://127.0.0.1:3000/rubyamf/gateway/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;如果你看到一個黑色的畫面，中間放著一個RubyAMF的logo&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/p2.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;恭喜你，目前這樣就算是把RubyAMF安裝起來了&lt;br /&gt;&lt;br /&gt;接下來，就要開始準備寫service上去了&lt;br /&gt;&lt;br /&gt;=====&lt;br /&gt;&amp;nbsp; 實作&lt;br /&gt;=====&lt;br /&gt;&lt;br /&gt;Rails部份：&lt;br /&gt;先建立一個model，待會我們會用來取出/寫入資料用的&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;gt; script/generate model book author:string content:text&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;目前只放了author跟content兩個簡單的欄位&lt;br /&gt;(for demo purpose, model部份沒有特別做validation)&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;gt; rake db:migrate&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;為了省去另建資料庫的麻煩，這裡直接使用預設的SQLite做為資料庫&lt;br /&gt;table建立後，先塞一筆測試資料進去&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;gt; script/console&lt;br /&gt;&amp;gt;&amp;gt; Book.create(:author =&amp;gt; &amp;quot;eddie&amp;quot;, :content =&amp;gt; &amp;quot;this is a RubyAMF demo&amp;quot;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;再來新增一個controller，裡面放一個hello_world這個action&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;gt; script/generate controller amf_test hello_world&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在hello_world這個action裡，我們加一行：&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;def hello_world&lt;br /&gt;&amp;nbsp; render :amf =&amp;gt; &amp;quot;Hello AMF&amp;quot;&lt;br /&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;大部份網路上看到的範例都是用Flex當範例，不過我個人比較偏好Flash&lt;br /&gt;以下我就用Flash當做範例示範(其實沒太大差別啦，純粹個人喜好)&lt;br /&gt;&lt;br /&gt;Flash部份：&lt;br /&gt;&lt;br /&gt;範例檔案下載：amf_hello.fla&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #808080&quot;&gt;var nc:NetConnection = new NetConnection();&lt;br /&gt;nc.objectEncoding = ObjectEncoding.AMF3;&lt;br /&gt;nc.connect(&amp;#39;http://127.0.0.1:3000/rubyamf/gateway&amp;#39;);&lt;br /&gt;&lt;br /&gt;var responder:Responder = new Responder(onOK, onErr);&lt;br /&gt;nc.call(&amp;#39;AmfTestController.hello_world&amp;#39;, responder);&lt;br /&gt;&lt;br /&gt;function onOK(res:Object):void&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; trace(res);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onErr(res:Object):void&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; trace(&amp;quot;Error!&amp;quot;);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;其中比較需要注意的是nc.call那一段&lt;br /&gt;直接呼叫&lt;span style=&quot;color: #ff0000&quot;&gt;ControllerName.ActionName&lt;/span&gt;就行了&lt;br /&gt;&lt;br /&gt;按下Ctrl+Enter之後，應該就可以看到&amp;quot;Hello AMF&amp;quot;的字樣了&lt;br /&gt;代表你的swf已經可以成功從AMF Gateway讀資料回來了&lt;br /&gt;如果這裡有發生錯誤，可能檢查一下是不是有打錯字，或是server忘了啟動&lt;br /&gt;&lt;br /&gt;接下來，我們試著送資料給gateway，讓它寫入資料庫之後再回傳目前資料庫裡的書總共有幾本&lt;br /&gt;&lt;br /&gt;這次我們先做flash端的介面，我放了一個按鈕跟二個輸入框&lt;br /&gt;instance name分別取名為add_btw、author_txt及content_txt&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/p3.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;(檔名：amf_addbook.fla)&lt;br /&gt;&lt;br /&gt;AS3語法如下：&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;add_btn.addEventListener(MouseEvent.CLICK, click_handler);&lt;br /&gt;&lt;br /&gt;function click_handler(evt:MouseEvent):void&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; var nc:NetConnection = new NetConnection();&lt;br /&gt;&amp;nbsp; nc.objectEncoding = ObjectEncoding.AMF3;&lt;br /&gt;&amp;nbsp; nc.connect(&amp;#39;http://127.0.0.1:3000/rubyamf/gateway&amp;#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; var amf_object:Object = {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;author&amp;#39;: author_txt.text,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;content&amp;#39;: content_txt.text&lt;br /&gt;&amp;nbsp; };&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp; var responder:Responder = new Responder(onOK, onErr);&lt;br /&gt;&amp;nbsp; nc.call(&amp;#39;AmfTestController.add_book&amp;#39;, responder, amf_object);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onOK(res:Object):void&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; trace(&amp;quot;目前共有&amp;quot; +res +&amp;quot;本書&amp;quot;);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function onErr(res:Object):void&lt;br /&gt;{&lt;br /&gt;&amp;nbsp; trace(&amp;quot;fail&amp;quot;);&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;其實只是把呼叫的部份放到click handler裡，並且在裡面做了一個object，並且在呼叫的時候&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #808080&quot;&gt;nc.call(&amp;#39;AmfTestController.add_book&amp;#39;, responder, amf_object);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;把它當做參數傳出去&lt;br /&gt;&lt;br /&gt;接下來，在Rails裡，我們要來加一個add_book這個action，準備接收資料&lt;/p&gt;&lt;span style=&quot;color: #808080&quot;&gt;def add_book&lt;br /&gt;&amp;nbsp; if is_amf&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Book.create(:author =&amp;gt; params[0][:author], :content =&amp;gt; params[0][:content])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; render :amf =&amp;gt; Book.count&lt;br /&gt;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; render :text =&amp;gt; &amp;quot;error&amp;quot;&lt;br /&gt;&amp;nbsp; end&lt;br /&gt;end&lt;/span&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;這裡可以用is_amf來檢查傳進來的是不是AMF&lt;br /&gt;傳進來的參數可用 params[0] 取得&lt;br /&gt;&lt;br /&gt;接著執行flash，沒問題的話，當每次按下Add Book按鈕時，它就會把author跟content資料寫入DB&lt;br /&gt;並回傳目前總筆數&lt;br /&gt;&lt;br /&gt;以上為展示目的，都沒有加資料的驗證，所以就算空白資料也可以送出&lt;br /&gt;&lt;br /&gt;以上是一些個人小小的心得，供大家參考囉&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;相關網站：&lt;br /&gt;&lt;a href=&quot;http://blog.rubyamf.org/&quot; target=&quot;_blank&quot; title=&quot;RubyAMF Blog&quot;&gt;http://blog.rubyamf.org/&lt;/a&gt;&lt;br /&gt;&lt;a href=&quot;http://code.google.com/p/rubyamf/&quot; title=&quot;RubyAMF&quot;&gt;http://code.google.com/p/rubyamf/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;原始檔下載(fla + rails project)：&lt;br /&gt;&lt;a href=&quot;http://nayumi.myweb.hinet.net/downloads/sample.zip&quot; target=&quot;_blank&quot; title=&quot;sample code&quot;&gt;http://nayumi.myweb.hinet.net/downloads/sample.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2010/03/18/rubyamf</link>
   <comments>http://blog.eddie.com.tw/2010/03/18/rubyamf</comments>
   <guid>http://blog.eddie.com.tw/2010/03/18/rubyamf</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>ActionScript</category>
      
    <category>Ruby</category>
      
    <category>Rails</category>
         <pubDate>Thu, 18 Mar 2010 16:33:53 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>2009 PTT Flash 版聚</title>
   <description>
    &lt;p&gt;今年八月底聚集了一些對Flash有熱好的朋友們，讓大家互相認識一下平常在版上互動的人長什麼樣子，也順便透過幾個專題演講來分享一下心得&lt;/p&gt;&lt;p&gt;連結在此：&lt;a href=&quot;http://www.eddie.com.tw/FlashLabs/PTT-Flash.htm&quot; target=&quot;_blank&quot; title=&quot;PTT Flash Workshop list&quot;&gt;http://www.eddie.com.tw/FlashLabs/PTT-Flash.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;這應該算是PTT Flash版第二度的板聚(上一次是在2008年的八月，已經相隔一年了)&lt;/p&gt;&lt;p&gt;Flash在台灣一直比較少見有專門大型的研討會，比較大型的大多是伴隨產品上市的發表會一起辦&lt;/p&gt;&lt;p&gt;雖然我們這個不是官方舉辦或贊助的活動，但我還是很羨幕能有像&lt;a href=&quot;http://max.adobe.com/&quot; target=&quot;_blank&quot; title=&quot;Adobe MAX&quot;&gt;Adobe MAX&lt;/a&gt;或是&lt;a href=&quot;http://www.flashonthebeach.com/&quot; target=&quot;_blank&quot; title=&quot;Flash on the Beach&quot;&gt;Flash on the Beach&lt;/a&gt;那樣大型的研討會&lt;/p&gt;&lt;p&gt;希望有一天能在台灣也能看到純粹技術發表的研討會 :)&lt;/p&gt;&lt;p&gt;至於我們這個PTT Flash Workshop，我想希望可以把這樣的聚會變成固定舉辦的活動，也許可以辦在寒、暑假&lt;/p&gt;&lt;p&gt;然後再來去借個比較大一點的場地來辦party好了 :) &lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2009/10/27/2009-ptt-flash-workshop</link>
   <comments>http://blog.eddie.com.tw/2009/10/27/2009-ptt-flash-workshop</comments>
   <guid>http://blog.eddie.com.tw/2009/10/27/2009-ptt-flash-workshop</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>Flash</category>
      
    <category>Funny</category>
      
    <category>Miscellaneous</category>
         <pubDate>Tue, 27 Oct 2009 07:11:12 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>戰利品</title>
   <description>
    &lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/uk_flag.png&quot; border=&quot;0&quot; alt=&quot;UK Flag&quot; title=&quot;UK Flag&quot; hspace=&quot;3&quot; vspace=&quot;3&quot; align=&quot;left&quot; /&gt;難得給自已排了一段時間出去玩，這趟去英國溜躂，音樂劇Les Miserables是心靈上最值回票價的體驗，當然物質上的一些戰利品也是不可少的啊(其實根本就是去買玩具的吧)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;1. 電話亭存錢筒：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;是鐵製的，拿在手上挺有份量(存錢這是一定要的啊)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/DSC01414.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;2. 小羊鑰匙圈&lt;/span&gt; &lt;/p&gt;&lt;p&gt;這個是在湖區買的小羊鑰匙圈，造型真是超可愛&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/DSC01420.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;3. 懷舊寶箱&lt;/span&gt;&lt;/p&gt;&lt;p&gt;這是在二手店看到的小寶箱，不知道為什麼我看了就覺得很愛&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/DSC01409.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;4. 超難拼圖&lt;/span&gt;&lt;/p&gt;&lt;p&gt;號稱世上最難的拼圖，雖然只有529片，但拼起來像是4,000片?!&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/DSC01413.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;5. Doctor Who模型&lt;/span&gt;&lt;/p&gt;&lt;p&gt;大概二、三十公分高，人物部份要自已著色，Tardis在啟動的時候會發出跟影集一樣的聲音。&lt;br /&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/DSC01410.jpg&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;6. Daleks&lt;/span&gt;&lt;/p&gt;&lt;p&gt;有看Doctor Who的人一定知道這像垃圾筒的機器人是誰啊.... &lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/DSC01416.jpg&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;而且壓它還有音效的咧，真讚&lt;/p&gt;&lt;p&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; width=&quot;450&quot; height=&quot;350&quot; data=&quot;http://www.youtube.com/v/o4S83qiwyFA&quot; id=&quot;ltVideoYouTube&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://www.youtube.com/v/o4S83qiwyFA&quot; /&gt;&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot; /&gt;&lt;param name=&quot;allowScriptAcess&quot; value=&quot;sameDomain&quot; /&gt;&lt;param name=&quot;quality&quot; value=&quot;best&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&lt;param name=&quot;FlashVars&quot; value=&quot;playerMode=embedded&quot; /&gt;&lt;/object&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #ff6600&quot;&gt;7. 其它&lt;/span&gt;&lt;/p&gt;&lt;p&gt;每個景點專屬的名信片當然也是不可少的(本來要寄的，但最後都捨不得只寄了一張最不喜歡的出去了..) &lt;/p&gt;&lt;p&gt;另外還有個搖控的小直昇機(給我爸玩的)&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;結論：&lt;/p&gt;&lt;p&gt;要努力工作，趕快把錢賺回來了....!!!&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2009/06/04/booty-from-uk</link>
   <comments>http://blog.eddie.com.tw/2009/06/04/booty-from-uk</comments>
   <guid>http://blog.eddie.com.tw/2009/06/04/booty-from-uk</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>Funny</category>
      
    <category>My Diary</category>
         <pubDate>Thu, 04 Jun 2009 00:07:02 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>上台講話</title>
   <description>
    &lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/previews/ActionscriptIcon_400.png&quot; border=&quot;0&quot; alt=&quot;ActionScript 3.0&quot; title=&quot;ActionScript 3.0&quot; hspace=&quot;5&quot; vspace=&quot;5&quot; align=&quot;right&quot; /&gt;Oops! 發現最後一篇blog竟然已經是去年的事了!! 是時間過太快還是我太懶了?&lt;br /&gt;&lt;br /&gt;最近因為幾個案子在趕著要上線，不久前的&lt;a href=&quot;http://osdc.tw/&quot; target=&quot;_blank&quot; title=&quot;OSDC.TW&quot;&gt;OSDC.tw&lt;/a&gt;沒辦法全程參加，只好挑自已喜歡的Session參加(&lt;a href=&quot;http://blog.ericsk.org/&quot; target=&quot;_blank&quot; title=&quot;Ericsk&quot;&gt;ericsk&lt;/a&gt;的&lt;a href=&quot;http://code.google.com/p/google-app-engine-oil/&quot; target=&quot;_blank&quot; title=&quot;GAEO&quot;&gt;GAEO&lt;/a&gt;比我想像中的還好用)&lt;br /&gt;&lt;br /&gt;以前某個我不喜歡的老闆曾跟我說過，做presentation就像表演一樣&lt;br /&gt;&lt;br /&gt;近來我自告奮勇的找了一些對flash有興趣的朋友們每週來聚會，每次約2小時，我教大家怎麼來學 &lt;a href=&quot;http://en.wikipedia.org/wiki/ActionScript&quot; target=&quot;_blank&quot; title=&quot;ActionScript&quot;&gt;ActionScript3.0&lt;/a&gt;。沒另外收費(只需各自分擔場地費，我還太嫩，還不到那種敢收學費的等級)&lt;br /&gt;&lt;br /&gt;常聽到「這個東西我懂，我只是不會講而已」，但我一直相信，真的懂的人一定是講得出來的；不會講不代表真的不會，只是還沒能完全透徹，某個環節沒學好，講不出來&lt;br /&gt;&lt;br /&gt;在台上講話實在是件不容易的事，一來得先克服緊張感，二來得讓自已的腦袋保持清醒。&lt;br /&gt;&lt;br /&gt;當然我也沒這麼佛心，開這樣的課當然是有目的：&lt;br /&gt;1. 透過在台上講課，讓自已對AS3更熟悉&lt;br /&gt;2. 訓練自已講話的技巧，練習怎麼掌握台下的反應(可能講太快或一下子講太難)&lt;br /&gt;3. 透過每週準備課程，讓自已不會跟AS3離太遠&lt;br /&gt;&lt;br /&gt;越是複雜的技術，要做這種大眾化的教學困難度也越高，像是知名的flash totur &lt;a href=&quot;http://theflashblog.com/&quot; target=&quot;_blank&quot; title=&quot;Lee Brimelow&quot;&gt;Lee Brimelow&lt;/a&gt; 用影音的方式來教學，清楚又易懂&lt;br /&gt;&lt;br /&gt;最近在路邊牆上貼的一段話：「有困難是能力不夠，有麻煩是方法不對」看來，這條路還相當漫長&amp;nbsp; :)&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2009/05/06/speak-on-the-stage</link>
   <comments>http://blog.eddie.com.tw/2009/05/06/speak-on-the-stage</comments>
   <guid>http://blog.eddie.com.tw/2009/05/06/speak-on-the-stage</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>My Diary</category>
      
    <category>Miscellaneous</category>
      
    <category>ActionScript</category>
         <pubDate>Wed, 06 May 2009 17:00:42 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
    <item>
   <title>Doctrine, the PHP ORM Framework</title>
   <description>
    &lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-logo.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://www.doctrine-project.org/&quot; target=&quot;_blank&quot; title=&quot;PHP Doctrine&quot;&gt;Doctrine&lt;/a&gt;是一個在PHP上的資料庫ORM(Object Relational Mapper)，最近手邊的幾個小案子透過Doctrine來實作。ORM的確是讓開發者少寫不少的SQL查詢，但相對的效能一定是比簡單的SQL要來得差，我想魚跟熊掌要兼得並不容易，便利跟效能之間總有個天平讓開發者來自已調整，所以ORM好不好用就見人見志囉。 &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: medium&quot;&gt;一、前置作業：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;1. 系統需求&lt;br /&gt;依官網上面提到的，Doctrine需要PHP 5.2.3以上的版本，除此之外就不用再另外安裝其它的套件或函式庫即可運作，不過如果要使用PDO(&lt;a href=&quot;http://tw2.php.net/manual/en/intro.pdo.php&quot; target=&quot;_blank&quot; title=&quot;PDO(PHP Data Object)&quot;&gt;PHP Data Object&lt;/a&gt;)的話，則可能會需要另外安裝PDO驅動程式。&lt;/p&gt;&lt;p&gt;2. 檢查PDO驅動程式&lt;br /&gt;如果你要用PDO的話，想要知道你的主機上是不是有安裝你所需要的PDO驅動程式，只要一行簡單的PHP程式放到主機上執行：&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;lt;?php phpinfo(); ?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;如果你有看到一段PDO的資訊，那差不多應該就是有安裝了，再確認一下是不是有你要的版本，以及是否啟用即可。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: medium&quot;&gt;二、取得原始檔&lt;/span&gt;&lt;/p&gt;&lt;p&gt;有幾種取得Doctrine的方法：&lt;/p&gt;&lt;p&gt;* SVN(Subversion)&lt;br /&gt;* Pear&lt;br /&gt;* Zip-package&lt;/p&gt;&lt;p&gt;如果你熟悉SVN的操作的話，這應該是最簡單使用的了。如果你只是想試玩一下Doctrine的功能的話，你可以下載官網上打包好的&lt;a href=&quot;http://www.doctrine-project.org/download/1_0_5/sandbox/1/format/tgz&quot; target=&quot;_blank&quot; title=&quot;Sanbox&quot;&gt;Sandbox套件&lt;/a&gt;來玩。我個人比較喜歡官方打包好的壓縮檔 :) &lt;/p&gt;&lt;p&gt;什麼是Sandbox套件?&lt;br /&gt;Doctrine網站的&lt;a href=&quot;http://www.doctrine-project.org/download&quot; target=&quot;_blank&quot; title=&quot;Doctrine Download&quot;&gt;下載區&lt;/a&gt;有貼心的打包了免設定的方便套件，直接下載、解壓縮後，就可以拿來試玩了。這裡面包括了一些範例schema檔案以及可以匯入的資料檔，讓你可以很快的就可以開始體驗Doctrine的優點。&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: medium&quot;&gt;三、開始第一個專案&lt;/span&gt;&lt;br /&gt;在Doctrine裡，Doctrine_Record是最基本的元件。資料庫裡的每個資料表都會有一個對應的Doctrine_Record類別。這個類別是以&lt;a href=&quot;http://en.wikipedia.org/wiki/Active_record_pattern&quot; target=&quot;_blank&quot; title=&quot;Active Record Pattern&quot;&gt;Active Record&lt;/a&gt;這個設計模式實作的，所以在其它語言像是在ROR(Ruby on Rails)上才看得到方便功能，在Doctrine裡也可以使用到了，即使是複雜的資料庫操作，透過這個類別也可以簡單的完成。&lt;br /&gt;&lt;br /&gt;在使用Doctrine_Record來建立資料表時，如果沒有特別指定Primary Key的話，Doctrine會自動幫你加一個叫做&amp;quot;id&amp;quot;的主索引欄位(自動編號)。接下來你需要做的事情，就是建立一個繼承自 Doctrine_Record類別的子類別，然後透過setTableDefinition()以及hasColumn()就可以來建立你的資料表。&lt;br /&gt;&lt;br /&gt;為了單純一些，我們這裡只先用一個表格做範例(多個表格之間的關聯性操作，例如一對一、一對多、多對多等關係，再另外開幾篇再寫)。假設我們現在要建立一個叫做&amp;quot;member&amp;quot;的會員資料表，這個資料表裡會有id、username、password以及建立日期這幾個欄位，我們可以這樣做：&lt;br /&gt;&lt;br /&gt;檔案：models/Member.php&lt;/p&gt;&lt;blockquote&gt;&amp;nbsp;&lt;span style=&quot;color: #999999&quot;&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; class Member extends Doctrine_Record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function setTableDefinition()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 預設將會使用跟&amp;quot;user&amp;quot;做為資料表的名稱(同名)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 並且會自動加一個欄位id的主索引鍵 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;hasColumn(&amp;#39;username&amp;#39;, &amp;#39;string&amp;#39;, 30);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;hasColumn(&amp;#39;password&amp;#39;, &amp;#39;string&amp;#39;, 30);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public function setUp()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; $this-&amp;gt;actAs(&amp;#39;Timestampable&amp;#39;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;/span&gt;&lt;/blockquote&gt;&lt;p&gt;除了手工打造模型類別外，你也可以使用YAML格式的檔案來建立資料表的schema檔案，底下這個範例的設定跟上面這個類別是一樣的意思，而且也可以透過Doctrine的一些指令來互相轉換。&lt;br /&gt;&lt;br /&gt;檔案：schemas/schema.yml&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;color: #808080&quot;&gt;Member:&lt;br /&gt;&amp;nbsp; columns:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; username: string(30)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; password: string(30)&lt;br /&gt;&amp;nbsp; actAs: [Timestampable]&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;這裡要注意的是，YAML的縮排是有意義的，所以要特別注意縮排的層級。你可以用一行簡單的語法就可以把YAMLY檔案(.yml)轉換成模型類別(.php)：&lt;/p&gt;&lt;p&gt;檔案：createMode.php&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;nbsp;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Doctrine::&lt;strong&gt;generateModelsFromYaml&lt;/strong&gt;(&amp;#39;schemas/schema.yml&amp;#39;, &amp;#39;models&amp;#39;); &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;執行之後看一下models資料夾以models裡有一個自動產生的generated資料夾(如下圖)，你會看到有一個&amp;quot;Member.php&amp;quot;以及&amp;quot;BaseMember.php&amp;quot;。其中，&amp;quot;Member.php&amp;quot;是可以讓你自己定義一些功能用的，而&amp;quot;BaseMember.php&amp;quot;裡的內容則是依據YAML的內容幫你寫好的。(要特別注意BaseMember類別會在每次執行轉換的時候重新產生一次，而Member類別只會產生一次)。&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-5.png&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;我們現在有一個透過YAML建立的Doctrine_Record類別，接下來就可以把它匯入資料庫來建立資料表了。&lt;br /&gt;&lt;br /&gt;檔案：modelToDatabase.php&lt;/p&gt;&lt;blockquote&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;nbsp;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // 建立資料表&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Doctrine::&lt;strong&gt;createTablesFromArray&lt;/strong&gt;(array(&amp;#39;Member&amp;#39;));&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;這樣就搞定了!看一下資料表的樣子：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-1.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;如前面說的，它會自動加上&amp;quot;id&amp;quot;這個欄位，而&amp;quot;Timestampable&amp;quot;則會自動幫忙加上&amp;quot;created_at&amp;quot;及&amp;quot;updated_at&amp;quot;這兩個欄位。&lt;/p&gt;&lt;p&gt;現在我們有一個資料表以及一個對應的模型類別可以讓我們來練習資料的基本操作了(新增、修改、刪除及查詢)。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;新增：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;檔案：testInsert.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;username = &amp;#39;eddie&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;password = &amp;#39;mypassword&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;save();&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;資料表欄位的指定，除了上面這種物件式的存取方式外，也可以使用陣列的方式：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp; $myTable[&amp;#39;username&amp;#39;] = &amp;#39;eddie&amp;#39;;&lt;br /&gt;&amp;nbsp; $myTable[&amp;#39;password&amp;#39;] = &amp;#39;mypassword&amp;#39;;&lt;br /&gt;&amp;nbsp; $myTable-&amp;gt;&lt;strong&gt;save&lt;/strong&gt;(); &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;不用寫什麼insert...into，只要一個save()就完成了! 回頭看一下資料表就會發現，有一些神奇的事情它幫忙做了。上面這段程式碼執行後，member資料表會長得像這樣： &lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-2.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;&lt;strong&gt;修改： &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假設剛剛寫入的那筆資料的id編號是1號，更新方法是先找到它，然後一樣用save()來更如下：&lt;/p&gt;&lt;p&gt;檔案：testUpdate.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record = $myTable-&amp;gt;getTable()-&amp;gt;find(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;password = &amp;#39;mynewpassword&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;save();&lt;br /&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;結果如下：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-3.png&quot; border=&quot;0&quot; /&gt;&lt;/p&gt;&lt;p&gt;你會發現，password欄位變成&amp;quot;mynewpassword&amp;quot;之外，它的更新時間(updated_at)也跟著更新了。 &lt;/p&gt;&lt;p&gt;&lt;strong&gt;刪除：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;跟更新差不多，也是先找到那筆資料後，再給它一個delete()：&lt;/p&gt;&lt;p&gt;檔案：testDelete.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable-&amp;gt;getTable()-&amp;gt;find(1)-&amp;gt;&lt;strong&gt;delete&lt;/strong&gt;();&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;&lt;strong&gt;查詢：&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;假設我要找出id編號是1號的資料，可以這樣做： &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #999999&quot;&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp; $result =$myTable-&amp;gt;getTable()-&amp;gt;find(1);&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;除了透過find方法外，Doctrine還有它自已一套叫做DQL的語法，使用方法大致如下： &lt;/p&gt;&lt;p&gt;檔案：testDQL.php &lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;&amp;lt;?php&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; require_once &amp;#39;config/doctrine_config.php&amp;#39;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $myTable = new Member;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record = $myTable-&amp;gt;getTable()-&amp;gt;find(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;password = &amp;#39;mynewpassword&amp;#39;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $record-&amp;gt;save();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; $result = Doctrine_Query::CREATE()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;select(&amp;#39;*&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;from(&amp;#39;Member&amp;#39;)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;where(&amp;#39;id = ?&amp;#39;, 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; -&amp;gt;fetchArray();&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print_r($result);&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;印出來的結果如下：&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-4.png&quot; border=&quot;0&quot; /&gt; &lt;/p&gt;&lt;p&gt;上面的DQL相當於底下的SQL：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;span style=&quot;color: #808080&quot;&gt;select * from member where id = 1;&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;其實DQL的細節也可以另外來寫一篇 :) &lt;/p&gt;&lt;p&gt;&lt;span style=&quot;font-size: medium&quot;&gt;結語：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;老實說，如果只是簡單的查詢，Doctrine寫起來不見得比原本的SQL快，而且效能又比較差一些，但如果是比較複雜的查詢，透過Doctrine包裝好的一些方法，可以不用去想那些單引號、雙引號的問題外，也可以安全的避開可能的危機(例如SQL Injection) ，就如同最前面說的，便利跟效能，我會比較偏向便利的這一方。 &lt;/p&gt;&lt;p&gt;更多的細節，可參考&lt;a href=&quot;http://www.doctrine-project.org/documentation&quot; target=&quot;_blank&quot; title=&quot;PHP Doctrine Manual&quot;&gt;Doctrine官網手冊&lt;/a&gt;，寫得滿詳細的。&lt;/p&gt;&lt;p&gt;上面的程式碼我也有打包了一份供大家參考囉 :) &lt;/p&gt;&lt;p&gt;&lt;a href=&quot;http://blog.eddie.com.tw/gallery/1/doctrine-lession1.rar&quot; target=&quot;_blank&quot; title=&quot;Source Code&quot;&gt;檔案下載&lt;/a&gt; &lt;/p&gt;&lt;p&gt;使用前請先看一下config/doctrine_config.php裡面的資料庫相關設定。&lt;/p&gt;&lt;p&gt;相關連結：&lt;/p&gt;&lt;p&gt;．&lt;a href=&quot;http://www.doctrine-project.org/&quot; target=&quot;_blank&quot; title=&quot;Doctrine&quot;&gt;Doctrine官方網站&lt;/a&gt; &lt;br /&gt;．&lt;a href=&quot;http://groups.google.com/group/doctrine-user&quot; target=&quot;_blank&quot; title=&quot;Doctrine User Group&quot;&gt;Doctrine User Group&lt;/a&gt;&lt;/p&gt;
   </description>
   <link>http://blog.eddie.com.tw/2008/12/23/doctrine-the-php-orm-framework</link>
   <comments>http://blog.eddie.com.tw/2008/12/23/doctrine-the-php-orm-framework</comments>
   <guid>http://blog.eddie.com.tw/2008/12/23/doctrine-the-php-orm-framework</guid>
      <dc:creator>eddie</dc:creator>
      
    <category>PHP</category>
      
    <category>Doctrine</category>
         <pubDate>Tue, 23 Dec 2008 11:00:49 +0800</pubDate>
   <source url="http://blog.eddie.com.tw/rss.php?blogId=1&amp;profile=rss20">eddie@Home</source>
     </item>
   </channel>
</rss>