Refactoring in AS3
最近連續兩場上台講話,深深覺得自己的口條跟講話的速度還得再好好的修練。這是今天在同業的AS聚會上講的內容 Refactoring in AS3
另外這是在上星期的Flash聚會分享的 AS3 Better Practices
有需要歡迎取用 :)
最近連續兩場上台講話,深深覺得自己的口條跟講話的速度還得再好好的修練。這是今天在同業的AS聚會上講的內容 Refactoring in AS3
另外這是在上星期的Flash聚會分享的 AS3 Better Practices
有需要歡迎取用 :)
這不是討戰文,也不是一篇討論程式語言的誰優誰劣的文章,反而比較像是昇火、勸敗文
僅就我個人這半年來使用Ruby on Rails(以下簡稱RoR,不是那個那個RO線上遊戲)用在工作上的一些簡單的心得跟大家分享 (閱讀全文)

最近有機會去資策會講課(python/django),剛好趁這個機會把手邊的一些資料整理一下,方便自己記憶也方便讓大家直接剪下貼上程式碼,免去打錯字的困擾。有需要的朋友歡迎取用。
內容主要以python 2.x及django 1.1.x為主,若發現有誤還請不吝告知 :)
話說今天django的1.2版也release了(release note), 再找個機會把手邊用1.1.1寫過的小案子昇級看看,希望不會爆炸 :)
最近手邊某個案子在試著用Cucumber來做測試開發(BDD - Behavior Driven Development),這真是個神奇的東西,寫測試腳本感覺像是在寫一般的英文句子一樣,以下兩篇是自己看著Ryan Bates在Railcast上的教學影片練習的心得筆記,供有需要的人參考
這小黃瓜能測的東西範圍相當廣,官網上的toturial有很多有趣的應用,而且越看越有趣,之後還會繼續再把一些自己試作的心得再貼上來,若有錯誤的地方再歡迎告知 :)
方便的工具,寫起來給自己做個備忘,免得到時候忘記 :)
在做資料庫存取的時候,常會把抓到的model object印出來看看到底內容正確與否 (閱讀全文)
=====
前言
=====
常聽很多朋友會問:「flash要怎麼樣跟資料庫串接?」
答案其實很簡單:「不行!目前flash沒辦法直接與資料庫串接」
那到底別人是怎麼做的,為什麼他們的flash可以由後台管理然後更新資料?
flash(*.swf) <--> Server端程式(asp, .net, php…etc) <--> DB
*.swf透過HTTP GET/POST的方式送給中間的程式
透過中間的程式,flash才得以從資料庫中取出/寫入資料
其中*.swf與server端程式溝通的格式,有簡單的純文字組合
或是用JSON或XML來包裝資料,再餵給*.swf,最後再呈現在flash上
特別是XML對AS3還滿友善的,可以簡單的就取出指定節點的資料
而今天要提的 AMF(Action Message Format)
其實做的工作跟上面的JSON或XML差不多,只是它的格式是binary的
AMF的實作,各家程式語言或Framework都有類似的實作品
像是PHP就有AMFPHP/Zend_Amf,Python有PyAMF,.NET有FluorineFx,Ruby的話則有RubyAMF
不過不管是哪家實作的AMF,流程上都差不多:
1. *.swf連上指定的Gateway
2. 呼叫/執行Gateway上掛載的service,並把所需的參數以AMF格式傳給它(如果有的話)
3. 執行結果回傳
最近手邊有個案子正好是用Rails寫的,剛好有用上AMF,就趁這個機會寫一下心得,免得自己以後忘記
(其實在Rails裡面,用respond_to直接render產出xml或json也還滿方便的...)
=====
環境
=====
Mac OX 10.6
Rails 2.3.5
ruby 1.8.7
RubyAMF 1.6.5
=====
安裝
=====
就不多做Rails的介紹了,直接開個空白的Rails Project來做示範
> rails rubyamf_demo
> cd rubyamf_demo
接下來,安裝RubyAMF
網址:http://code.google.com/p/rubyamf/
個人比較建議直接用script/plugin來安裝,簡單方便
當然如果要自己下載打包檔再手動放進來也ok的
> script/plugin install http://rubyamf.googlecode.com/svn/tags/current/rubyamf
沒問題的話,這個動作就會幫你把rubyamf安裝在vender資料夾裡了
其實這個安裝的過程中,除了把相關檔案裝到vender裡之外,背後有幫忙做了一些事你可能需要知道的:
1. app/controllers/ 裡多了一個rubyamf_controller.rb
這是整個amf的對外窗口,gateway就是寫在這裡了
2. config/ 裡多了一個 rubyamf_config.rb
RubyAMF的設定檔,打開這個檔案應該可以看到許多註解說明,可依情況及個人使用習慣做調整
3. config/initializers/mime_types.rb多加了一行
Mime::Type.register "application/x-amf", :amf
到時候可以像 render :text => "hello"一樣,直接用render :amf => "hello"來輸出
4. config/route.rb多了一行路徑設定
map.rubyamf_gateway 'rubyamf_gateway', :controller => 'rubyamf', :action => 'gateway'
gateway到時候的位置就是http://127.0.0.1:3000/rubyamf/gateway
5. public/ 資料夾多了一個 crossdomain.xml
常用AS在串接外部資料的人應該知道這是幹嘛的了,預設是全開
<allow-access-from domain="*" />
如果有需要調整可直接動手修改
接下來試著啟動server,看看能不能正常運作
> script/server
沒問題的話,接著開瀏覽器看看
http://127.0.0.1:3000/rubyamf/gateway/
如果你看到一個黑色的畫面,中間放著一個RubyAMF的logo
恭喜你,目前這樣就算是把RubyAMF安裝起來了
接下來,就要開始準備寫service上去了
=====
實作
=====
Rails部份:
先建立一個model,待會我們會用來取出/寫入資料用的
> script/generate model book author:string content:text
目前只放了author跟content兩個簡單的欄位
(for demo purpose, model部份沒有特別做validation)
> rake db:migrate
為了省去另建資料庫的麻煩,這裡直接使用預設的SQLite做為資料庫
table建立後,先塞一筆測試資料進去
> script/console
>> Book.create(:author => "eddie", :content => "this is a RubyAMF demo")
再來新增一個controller,裡面放一個hello_world這個action
> script/generate controller amf_test hello_world
在hello_world這個action裡,我們加一行:
def hello_world
render :amf => "Hello AMF"
end
大部份網路上看到的範例都是用Flex當範例,不過我個人比較偏好Flash
以下我就用Flash當做範例示範(其實沒太大差別啦,純粹個人喜好)
Flash部份:
範例檔案下載:amf_hello.fla
var nc:NetConnection = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF3;
nc.connect('http://127.0.0.1:3000/rubyamf/gateway');
var responder:Responder = new Responder(onOK, onErr);
nc.call('AmfTestController.hello_world', responder);
function onOK(res:Object):void
{
trace(res);
}
function onErr(res:Object):void
{
trace("Error!");
}
其中比較需要注意的是nc.call那一段
直接呼叫ControllerName.ActionName就行了
按下Ctrl+Enter之後,應該就可以看到"Hello AMF"的字樣了
代表你的swf已經可以成功從AMF Gateway讀資料回來了
如果這裡有發生錯誤,可能檢查一下是不是有打錯字,或是server忘了啟動
接下來,我們試著送資料給gateway,讓它寫入資料庫之後再回傳目前資料庫裡的書總共有幾本
這次我們先做flash端的介面,我放了一個按鈕跟二個輸入框
instance name分別取名為add_btw、author_txt及content_txt
(檔名:amf_addbook.fla)
AS3語法如下:
add_btn.addEventListener(MouseEvent.CLICK, click_handler);
function click_handler(evt:MouseEvent):void
{
var nc:NetConnection = new NetConnection();
nc.objectEncoding = ObjectEncoding.AMF3;
nc.connect('http://127.0.0.1:3000/rubyamf/gateway');
var amf_object:Object = {
'author': author_txt.text,
'content': content_txt.text
};
var responder:Responder = new Responder(onOK, onErr);
nc.call('AmfTestController.add_book', responder, amf_object);
}
function onOK(res:Object):void
{
trace("目前共有" +res +"本書");
}
function onErr(res:Object):void
{
trace("fail");
}
其實只是把呼叫的部份放到click handler裡,並且在裡面做了一個object,並且在呼叫的時候
nc.call('AmfTestController.add_book', responder, amf_object);
把它當做參數傳出去
接下來,在Rails裡,我們要來加一個add_book這個action,準備接收資料
這裡可以用is_amf來檢查傳進來的是不是AMF
傳進來的參數可用 params[0] 取得
接著執行flash,沒問題的話,當每次按下Add Book按鈕時,它就會把author跟content資料寫入DB
並回傳目前總筆數
以上為展示目的,都沒有加資料的驗證,所以就算空白資料也可以送出
以上是一些個人小小的心得,供大家參考囉
相關網站:
http://blog.rubyamf.org/
http://code.google.com/p/rubyamf/
原始檔下載(fla + rails project):
http://nayumi.myweb.hinet.net/downloads/sample.zip
今年八月底聚集了一些對Flash有熱好的朋友們,讓大家互相認識一下平常在版上互動的人長什麼樣子,也順便透過幾個專題演講來分享一下心得
連結在此:http://www.eddie.com.tw/FlashLabs/PTT-Flash.htm
這應該算是PTT Flash版第二度的板聚(上一次是在2008年的八月,已經相隔一年了)
Flash在台灣一直比較少見有專門大型的研討會,比較大型的大多是伴隨產品上市的發表會一起辦
雖然我們這個不是官方舉辦或贊助的活動,但我還是很羨幕能有像Adobe MAX或是Flash on the Beach那樣大型的研討會
希望有一天能在台灣也能看到純粹技術發表的研討會 :)
至於我們這個PTT Flash Workshop,我想希望可以把這樣的聚會變成固定舉辦的活動,也許可以辦在寒、暑假
然後再來去借個比較大一點的場地來辦party好了 :)
難得給自已排了一段時間出去玩,這趟去英國溜躂,音樂劇Les Miserables是心靈上最值回票價的體驗,當然物質上的一些戰利品也是不可少的啊(其實根本就是去買玩具的吧) (閱讀全文)
Oops! 發現最後一篇blog竟然已經是去年的事了!! 是時間過太快還是我太懶了?
最近因為幾個案子在趕著要上線,不久前的OSDC.tw沒辦法全程參加,只好挑自已喜歡的Session參加(ericsk的GAEO比我想像中的還好用)
以前某個我不喜歡的老闆曾跟我說過,做presentation就像表演一樣
近來我自告奮勇的找了一些對flash有興趣的朋友們每週來聚會,每次約2小時,我教大家怎麼來學 ActionScript3.0。沒另外收費(只需各自分擔場地費,我還太嫩,還不到那種敢收學費的等級)
常聽到「這個東西我懂,我只是不會講而已」,但我一直相信,真的懂的人一定是講得出來的;不會講不代表真的不會,只是還沒能完全透徹,某個環節沒學好,講不出來
在台上講話實在是件不容易的事,一來得先克服緊張感,二來得讓自已的腦袋保持清醒。
當然我也沒這麼佛心,開這樣的課當然是有目的:
1. 透過在台上講課,讓自已對AS3更熟悉
2. 訓練自已講話的技巧,練習怎麼掌握台下的反應(可能講太快或一下子講太難)
3. 透過每週準備課程,讓自已不會跟AS3離太遠
越是複雜的技術,要做這種大眾化的教學困難度也越高,像是知名的flash totur Lee Brimelow 用影音的方式來教學,清楚又易懂
最近在路邊牆上貼的一段話:「有困難是能力不夠,有麻煩是方法不對」看來,這條路還相當漫長 :)
Doctrine是一個在PHP上的資料庫ORM(Object Relational Mapper),最近手邊的幾個小案子透過Doctrine來實作。ORM的確是讓開發者少寫不少的SQL查詢,但相對的效能一定是比簡單的SQL要來得差,我想魚跟熊掌要兼得並不容易,便利跟效能之間總有個天平讓開發者來自已調整,所以ORM好不好用就見人見志囉。 (閱讀全文)
Flash在跟Server在交換資料,比較常見的是一般的文字訊息或是XML,我自己在趕時間的時候,會偷懶的隨便echo一個字出來知會flash說server程式已經做完了或是程式執行之後的結果,不趕時間且資料量較多的時候,則會乖乖的用XML。不過,最近開始我比較常用的是AMF跟JSON這兩個方法,其實都還滿方便的,各有其優缺點。
雖然我個人還是比較喜歡jQuery的簡潔方便,而且一些常用的function也都jQuery化了,不過畢竟Dojo從Zend Framework 1.6版後就被officially的收進去了,為了ZF寫起來的完整性,還是花點時間來研究一下。
廢話不多說,先來試玩一下! (閱讀全文)
自從開始改用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.
看不太懂哪來的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.
後來自己動手做了一下實驗:
檔名: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裡,上廁所可以看)
看到django、rails之類的framework都有可以快速的產生scaffold的工具,甚至連同樣都是php framework的cakephp也有...還好我之前都是在Zend Studio裡直接new一個Zend Framework Project,它也會自動產生基本的架構出來。隨著Zend Framework 1.6版的上市,它也提供了類似的方便工具(不過從目錄名字看起來還是在實驗階段而已..) (閱讀全文)
之前用了一陣子的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版,目前手邊的案子看起來都還滿正常的。