<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-97055916877503749</id><updated>2011-12-31T01:07:52.342+08:00</updated><category term='FMS'/><category term='JavaEE'/><category term='Picture'/><category term='slides'/><category term='C language'/><category term='Messaging'/><category term='543'/><category term='debugger'/><category term='Flash Remoting'/><category term='AppEngine'/><category term='Bug'/><category term='AJAX'/><category term='Monitor'/><category term='SWFAddress'/><category term='CodeIgniter'/><category term='SQLite'/><category term='Security'/><category term='SWF'/><category term='IDE'/><category term='forum'/><category term='RIA'/><category term='Tutorials'/><category term='HTTP'/><category term='Robotlegs'/><category term='multipart'/><category term='Flash'/><category term='Web server'/><category term='Graphics'/><category term='UDP'/><category term='ROR'/><category term='AS2'/><category term='ini'/><category term='Software'/><category term='Flex'/><category term='unicode'/><category term='Apache'/><category term='Free resource'/><category term='JSON'/><category term='Video'/><category term='Facebook'/><category term='Mobile'/><category term='CNS11643'/><category term='Zip'/><category term='XMLSocket'/><category term='RTMP'/><category term='jQuery'/><category term='FLV'/><category term='MySQL'/><category term='CSS'/><category term='PDF'/><category term='Cookie'/><category term='note'/><category term='AIR'/><category term='pseudo domain'/><category term='AS3'/><category term='Library'/><category term='XML'/><category term='Tips'/><category term='Win7'/><category term='Java'/><category term='Groovy'/><category term='OpenSource'/><category term='mdm'/><category term='PHP'/><category term='LCDS ES'/><category term='Netbeans'/><category term='XFL'/><category term='blogger'/><category term='3D'/><category term='Proxy'/><category term='upload'/><category term='Eclipse'/><category term='dropbox'/><category term='IE Tab'/><category term='Tools'/><category term='PopUp'/><category term='PageFlip'/><category term='Works and Tests'/><category term='components'/><category term='JavaScript'/><category term='Adobe Extension'/><category term='Information'/><category term='AMF'/><category term='google'/><category term='Books'/><title type='text'>qop's blog</title><subtitle type='html'>Shinder Lin, flash, flex and RIA (Rich Internet Applications)</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://qops.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default?start-index=101&amp;max-results=100'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>204</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7175907999994030301</id><published>2011-10-17T10:01:00.000+08:00</published><updated>2011-10-17T10:01:16.084+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>jsonTrace 小工具</title><content type='html'>&lt;a href="http://qops.blogspot.com/2007/06/dump-as3.html"&gt;QopDump&lt;/a&gt; 好像有不少人使用，但感覺還是不理想，於是利用&amp;nbsp;com.adobe.serialization.json package 和 &lt;a href="http://qops.blogspot.com/2010/04/json-formatter.html"&gt;JsonFormater&lt;/a&gt;&amp;nbsp;組合起來，弄了個 jsonTrace() 。&lt;br /&gt;JSONTrace 專案位置在&amp;nbsp;&lt;a href="https://github.com/shinder/JSONTrace"&gt;https://github.com/shinder/JSONTrace&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;標頭定義為：&lt;br /&gt;&lt;span class="Apple-style-span" style="background-color: white; font-family: 'Bitstream Vera Sans Mono', 'Courier New', monospace; font-size: 12px; line-height: 16px; white-space: pre;"&gt;&lt;span class="kd" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;public&lt;/span&gt; &lt;span class="kd" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;function &lt;/span&gt;&lt;span class="nf" style="color: #990000; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;jsonTrace&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;(&lt;/span&gt;&lt;span class="n" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;rawObj&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;span class="kt" style="color: #445588; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Object&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;=&lt;/span&gt;&lt;span class="kc" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;null&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt; &lt;span class="n" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;noTrace&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;span class="kt" style="color: #445588; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Boolean&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;=&lt;/span&gt;&lt;span class="kc" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;false&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;,&lt;/span&gt; &lt;span class="n" style="margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;noFormat&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;:&lt;/span&gt;&lt;span class="kt" style="color: #445588; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;Boolean&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;=&lt;/span&gt;&lt;span class="kc" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;false&lt;/span&gt;&lt;span class="o" style="font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;):&lt;/span&gt;&lt;span class="kt" style="color: #445588; font-weight: bold; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;String&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;參數：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;rawObj : 所欲查看的物件 (主要類型為 Object 和 Array)&lt;/li&gt;&lt;li&gt;noTrace : true 表示不 trace 輸出, 只回傳結果字串&lt;/li&gt;&lt;li&gt;noFormat : true 表示不做 JSON 字串的對位格式&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7175907999994030301?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7175907999994030301/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7175907999994030301' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7175907999994030301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7175907999994030301'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2011/10/jsontrace.html' title='jsonTrace 小工具'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-1454428465241567945</id><published>2011-10-02T23:33:00.001+08:00</published><updated>2011-10-02T23:38:28.539+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='dropbox'/><title type='text'>Dropbox 邀請</title><content type='html'>Always have your stuff when you need it with @Dropbox. 2GB account is free!&lt;br /&gt;&lt;a href="http://db.tt/8U45HXb"&gt;立刻申請免費 2G 雲端空間&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-1454428465241567945?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/1454428465241567945/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=1454428465241567945' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1454428465241567945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1454428465241567945'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2011/10/dropbox.html' title='Dropbox 邀請'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3470994211916257735</id><published>2011-03-30T11:21:00.000+08:00</published><updated>2011-03-30T11:21:08.895+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='note'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>AS3-Signals 筆記</title><content type='html'>&lt;a href="https://github.com/robertpenner/as3-signals"&gt;AS3-Signals&lt;/a&gt; 是 ActionScript 中替代 Event 系統的方案。使用 Event 就好了，為什麼還要 signal 呢？在某些專案需要自訂 Event，通常自訂 Event 必須定義一個繼承 Event 的新類別。為了多傳遞一個資料項而定義一個類別，感覺就很累贅。此時使用 signal 就顯得清新許多。&lt;br /&gt;AS3-Signals 好用，但也有些缺點：&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;不能設定 useCapture。其實 Event 的這個功能，在專案上個人幾乎是沒用過，所以就顯得不重要了。若要用 useCapture 就使用 Event&amp;nbsp;吧。&lt;/li&gt;&lt;li&gt;不能設定 useWeakReference。據作者的說明，weak reference 有 bugs ，目前沒有將這個功能加入。視情況去 remove signal listener。&lt;/li&gt;&lt;/ol&gt;值得參考的資料：&lt;br /&gt;&lt;a href="http://www.developria.com/2010/10/an-introduction-to-as3-signals.html"&gt;An introduction to AS3 Signals&lt;/a&gt; &lt;br /&gt;&lt;a href="http://blog.tkassembled.com/83/"&gt;as3signals – An Awesome Solution to Events/Signals in AS3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;Signals 並不能完全取代 Event，主要原因是無法取代原生的 Event 如 MouseEvent。此時，使用NativeSignal 去做轉接的動作。&lt;br /&gt;&lt;pre class="brush: as3"&gt;package {&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;import org.osflash.signals.natives.NativeSignal;&lt;br /&gt;&lt;br /&gt;[SWF(width="600", height="400")]&lt;br /&gt;public class Test1NativeSignal extends Sprite{&lt;br /&gt;    public function Test1NativeSignal() {&lt;br /&gt;        var btn:Sprite = new MyButton();&lt;br /&gt;        this.addChild(btn);&lt;br /&gt;        // 建立和滑鼠事件相關的 signal物件&lt;br /&gt;        var clickSignal:NativeSignal = new NativeSignal(btn, MouseEvent.CLICK, MouseEvent);&lt;br /&gt;        // 在 signal物件 上註冊處理器&lt;br /&gt;        clickSignal.add(clickHandler);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private function clickHandler(event:MouseEvent):void {&lt;br /&gt;        var txt:TextField = new TextField();&lt;br /&gt;        this.addChild(txt);&lt;br /&gt;        txt.autoSize = TextFieldAutoSize.LEFT;&lt;br /&gt;        txt.y = this.height;&lt;br /&gt;        txt.text = event.type + ':' + event.target.name;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;&lt;br /&gt;class MyButton extends Sprite {&lt;br /&gt;    private static var count:int;&lt;br /&gt;    public function MyButton () {&lt;br /&gt;        var g:Graphics = this.graphics;&lt;br /&gt;        g.beginFill(0x666699);&lt;br /&gt;        g.drawRoundRect(10, 10, 100, 60, 20, 20);&lt;br /&gt;        g.endFill();&lt;br /&gt;        this.name = 'MyButton' + ++count;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;習慣上會將 signal 定義為某個會發送訊息物件的屬性。&lt;br /&gt;&lt;pre class="brush: as3"&gt;package {&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;&lt;br /&gt;[SWF(width="600", height="400")]&lt;br /&gt;public class Test2NativeSignal extends Sprite {&lt;br /&gt;    public function Test2NativeSignal() {&lt;br /&gt;        var btn:MyButton;&lt;br /&gt;        for(var i:int=0; i&lt;5; i++) {&lt;br /&gt;            btn = new MyButton();&lt;br /&gt;            this.addChild(btn);&lt;br /&gt;            btn.x = (btn.width+10)*i;&lt;br /&gt;            btn.click.add(clickHandler);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    private function clickHandler(event:MouseEvent):void {&lt;br /&gt;        var txt:TextField = new TextField();&lt;br /&gt;        this.addChild(txt);&lt;br /&gt;        txt.autoSize = TextFieldAutoSize.LEFT;&lt;br /&gt;        txt.y = this.height;&lt;br /&gt;        txt.text = event.type + ':' + event.target.name;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import org.osflash.signals.natives.NativeSignal;&lt;br /&gt;&lt;br /&gt;class MyButton extends Sprite {&lt;br /&gt;    private static var count:int;&lt;br /&gt;    public var click:NativeSignal;&lt;br /&gt;    public function MyButton () {&lt;br /&gt;        var g:Graphics = this.graphics;&lt;br /&gt;        g.beginFill(0x666699);&lt;br /&gt;        g.drawRoundRect(10, 10, 100, 60, 20, 20);&lt;br /&gt;        g.endFill();&lt;br /&gt;        this.name = 'MyButton' + ++count;&lt;br /&gt;        click = new NativeSignal(this, MouseEvent.CLICK, MouseEvent);&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;使用 NativeMappedSignal 轉換發出的物件格式。&lt;pre class="brush: as3"&gt;package {&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;&lt;br /&gt;[SWF(width="600", height="400")]&lt;br /&gt;public class Test3NativeMappedSignal extends Sprite{&lt;br /&gt;    public function Test3NativeMappedSignal() {&lt;br /&gt;        var btn:MyButton;&lt;br /&gt;        for(var i:int=0; i&lt;5; i++) {&lt;br /&gt;            btn = new MyButton();&lt;br /&gt;            this.addChild(btn);&lt;br /&gt;            btn.x = (btn.width+10)*i;&lt;br /&gt;            btn.click.add(clickHandler);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;    public function clickHandler(data:String):void {&lt;br /&gt;        var txt:TextField = new TextField();&lt;br /&gt;        this.addChild(txt);&lt;br /&gt;        txt.autoSize = TextFieldAutoSize.LEFT;&lt;br /&gt;        txt.y = this.height;&lt;br /&gt;        txt.text = data;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;import flash.display.Graphics;&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.MouseEvent;&lt;br /&gt;import org.osflash.signals.natives.NativeMappedSignal;&lt;br /&gt;&lt;br /&gt;class MyButton extends Sprite {&lt;br /&gt;    private static var count:int;&lt;br /&gt;    public var click:NativeMappedSignal;&lt;br /&gt;    private var clickCount:int;&lt;br /&gt;&lt;br /&gt;    public function MyButton () {&lt;br /&gt;        var g:Graphics = this.graphics;&lt;br /&gt;        g.beginFill(0x666699);&lt;br /&gt;        g.drawRoundRect(10, 10, 100, 60, 20, 20);&lt;br /&gt;        g.endFill();&lt;br /&gt;        this.name = 'MyButton' + ++count;&lt;br /&gt;        click = new NativeMappedSignal(this, MouseEvent.CLICK, MouseEvent, String)&lt;br /&gt;                .mapTo(function(event:MouseEvent):String {&lt;br /&gt;                    return name+':' + ++clickCount;&lt;br /&gt;                });&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;使用 Signal 類別的例子&lt;pre class="brush: as3"&gt;package {&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.Event;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;import org.osflash.signals.Signal;&lt;br /&gt;&lt;br /&gt;public class Test4Signal extends Sprite{&lt;br /&gt;    public var count:int;&lt;br /&gt;    private var signal:Signal;&lt;br /&gt;&lt;br /&gt;    public function Test4Signal() {&lt;br /&gt;        // 限定傳送資料的類型&lt;br /&gt;        signal = new Signal(String, int);&lt;br /&gt;        signal.add( listener );&lt;br /&gt;        this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private function listener(str:String, count:int):void {&lt;br /&gt;        var txt:TextField = new TextField();&lt;br /&gt;        this.addChild(txt);&lt;br /&gt;        txt.autoSize = TextFieldAutoSize.LEFT;&lt;br /&gt;        txt.y = this.height;&lt;br /&gt;        txt.text = str + ':' + count ;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private function enterFrameHandler(event:Event):void {&lt;br /&gt;        count++;&lt;br /&gt;        if( count%30 == 0) {&lt;br /&gt;            // 觸發&lt;br /&gt;            signal.dispatch('count', count);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;使用 DeluxeSignal 類別的例子&lt;pre class="brush: as3"&gt;package {&lt;br /&gt;import flash.display.Sprite;&lt;br /&gt;import flash.events.Event;&lt;br /&gt;import flash.text.TextField;&lt;br /&gt;import flash.text.TextFieldAutoSize;&lt;br /&gt;&lt;br /&gt;import org.osflash.signals.DeluxeSignal;&lt;br /&gt;import org.osflash.signals.events.GenericEvent;&lt;br /&gt;&lt;br /&gt;public class Test5DeluxeSignal extends Sprite {&lt;br /&gt;    public var count:int;&lt;br /&gt;    private var signal:DeluxeSignal;&lt;br /&gt;&lt;br /&gt;    public function Test5DeluxeSignal() {&lt;br /&gt;        // 設定 target 為 this&lt;br /&gt;        signal = new DeluxeSignal(this);&lt;br /&gt;        signal.add( listener );&lt;br /&gt;        this.addEventListener(Event.ENTER_FRAME, enterFrameHandler);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private function listener(event:GenericEvent):void {&lt;br /&gt;        var txt:TextField = new TextField();&lt;br /&gt;        this.addChild(txt);&lt;br /&gt;        txt.autoSize = TextFieldAutoSize.LEFT;&lt;br /&gt;        txt.y = this.height;&lt;br /&gt;        txt.text = event.currentTarget + ':' + event.currentTarget.count ;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private function enterFrameHandler(event:Event):void {&lt;br /&gt;        count++;&lt;br /&gt;        if( count%30 == 0) {&lt;br /&gt;            // 觸發&lt;br /&gt;            signal.dispatch(new GenericEvent());&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3470994211916257735?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3470994211916257735/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3470994211916257735' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3470994211916257735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3470994211916257735'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2011/03/as3-signals.html' title='AS3-Signals 筆記'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-1985757513095576053</id><published>2011-02-22T17:21:00.000+08:00</published><updated>2011-02-22T17:21:37.462+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>Initialization blocks in AS3</title><content type='html'>在 Java 有&amp;nbsp;Initialization block，在 AS3 也有。以下是在 Flash CS5 的環境下測試。&lt;br /&gt;原始檔為&amp;nbsp;&amp;nbsp;static_test.fla，Document Class 為 static_test.as。&lt;br /&gt;MySym 為元件，其連結的類別為 MySym.as。&lt;br /&gt;MyClass.as 為非視覺物件的類別。&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;static_test.as&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package {&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; {&lt;br /&gt;  trace('m1');&lt;br /&gt; }&lt;br /&gt; public class static_test extends MovieClip {&lt;br /&gt;  {&lt;br /&gt;   trace('m2');&lt;br /&gt;  };&lt;br /&gt;  public function static_test() {&lt;br /&gt;   trace(this);&lt;br /&gt;  }&lt;br /&gt;  {&lt;br /&gt;   trace('m3');&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; {&lt;br /&gt;  trace('m4');&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;MySym.as&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package {&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import MyClass; // import 並沒有載入類別&lt;br /&gt; {&lt;br /&gt;  trace('s1');&lt;br /&gt; }&lt;br /&gt; public class MySym extends MovieClip {&lt;br /&gt;  {&lt;br /&gt;   trace('s2');&lt;br /&gt;   MyClass + ''; // 為了載入類別&lt;br /&gt;  }&lt;br /&gt;  public function MySym() {&lt;br /&gt;   trace(this);&lt;br /&gt;  }&lt;br /&gt;  {&lt;br /&gt;   trace('s3');&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; {&lt;br /&gt;  trace('s4');&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package  {&lt;br /&gt; {&lt;br /&gt;  trace('c1');&lt;br /&gt; }&lt;br /&gt; public class MyClass {&lt;br /&gt;  {&lt;br /&gt;   trace('c2');&lt;br /&gt;  }&lt;br /&gt;  public function MyClass() {&lt;br /&gt;   trace(this);&lt;br /&gt;  }&lt;br /&gt;  {&lt;br /&gt;   trace('c3');&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; {&lt;br /&gt;  trace('c4');&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;結果為:&lt;br /&gt;s2&lt;br /&gt;c2&lt;br /&gt;c3&lt;br /&gt;c1&lt;br /&gt;c4&lt;br /&gt;s3&lt;br /&gt;s1&lt;br /&gt;s4&lt;br /&gt;m2&lt;br /&gt;m3&lt;br /&gt;m1&lt;br /&gt;m4&lt;br /&gt;[object static_test]&lt;br /&gt;&lt;br /&gt;由結果可知：&lt;br /&gt;1. Symbol 所連結的類別要比 Document class 先載入。&lt;br /&gt;2. Initialization blocks 寫在相同的類別檔時，屬於類別的先執行，屬於 package 者則較慢執行。&lt;br /&gt;3. Import 無法讓類別載入，只有在使用到該類別時，類別才會被載入。&lt;br /&gt;&lt;br /&gt;另外，使用 Flash CS5 時，類別在編譯至 SWF 裡前應該有被 Flash CS5 修改過。使得在 Initialization block 裡宣告的變數無法使用，變通的方式是將變數宣告為類別的 static 變數。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-1985757513095576053?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/1985757513095576053/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=1985757513095576053' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1985757513095576053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1985757513095576053'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2011/02/initialization-blocks-in-as3.html' title='Initialization blocks in AS3'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-1386658691536520914</id><published>2010-12-15T21:08:00.000+08:00</published><updated>2010-12-15T21:08:16.865+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>開發 CodeIgniter 時，NetBeans 的程式碼自動完成設定</title><content type='html'>&lt;a href="http://rhasan.com/blog/2009/09/codeigniter-auto-complete-with-netbeans/"&gt;CodeIgniter auto complete with Netbeans&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;原理是把以下的註解格式存成 php 檔，放置 nbproject 目錄內&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #110000; font-family: 'Microsoft YaHei', Verdana, Geneva, sans-serif; font-size: 13px; line-height: 19px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;pre class="php" style="clear: none; font-family: monospace; font-size: 12px; line-height: 1.333; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre; width: auto;"&gt;&lt;span style="color: #009933; font-style: italic; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: none; outline-width: initial; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;/**&lt;br /&gt;* @property CI_Loader $load&lt;br /&gt;* @property CI_Form_validation $form_validation&lt;br /&gt;* @property CI_Input $input&lt;br /&gt;* @property CI_Email $email&lt;br /&gt;* @property CI_DB_active_record $db&lt;br /&gt;* @property CI_DB_forge $dbforge&lt;br /&gt;*/&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-1386658691536520914?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/1386658691536520914/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=1386658691536520914' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1386658691536520914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1386658691536520914'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/12/codeigniter-netbeans.html' title='開發 CodeIgniter 時，NetBeans 的程式碼自動完成設定'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3974410347118577989</id><published>2010-11-30T03:09:00.002+08:00</published><updated>2010-12-01T11:28:39.694+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>MySQL 剔除某欄重複的資料</title><content type='html'>使用 GROUP BY：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;SELECT * FROM `some_table` GROUP BY `some_field`&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;將結果寫入另一張表：&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;CREATE TABLE `tmp_table` AS (&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt; &lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;SELECT * FROM `some_table` GROUP BY `some_field`&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;使用 DISTINCT 只能用於某一欄或著某些欄位：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;SELECT DISTINCT `some_field` FROM `some_table`&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;SELECT DISTINCT `some_field`,&amp;nbsp;`another_field`&amp;nbsp;FROM `some_table`&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;SELECT DISTINCT * FROM `some_table`&lt;/span&gt; &lt;span class="Apple-style-span" style="color: blue;"&gt;（含主鍵的話，此行無用）&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;另外，計算重複的個數：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;SELECT *, count(*) FROM `some_table` GROUP BY `some_field`&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3974410347118577989?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3974410347118577989/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3974410347118577989' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3974410347118577989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3974410347118577989'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/11/msql.html' title='MySQL 剔除某欄重複的資料'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2001717834780252124</id><published>2010-11-29T18:14:00.000+08:00</published><updated>2010-11-29T18:14:43.537+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pseudo domain'/><title type='text'>本機設定虛擬網域</title><content type='html'>在 Windows，修改下列的設定檔：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: magenta;"&gt;C:\WINDOWS\system32\drivers\etc\hosts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在 Mac，修改下列的設定檔：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: magenta;"&gt;/etc/hosts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;在 Mac，用 TextEdit 的方式（使用 Terminal）：&lt;br /&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;sudo -s&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: orange;"&gt;/Applications/TextEdit.app/Contents/MacOS/TextEdit /etc/hosts&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;內容格式為：&lt;br /&gt;127.0.0.1 &amp;nbsp;my_pseudo_domain.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2001717834780252124?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2001717834780252124/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2001717834780252124' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2001717834780252124'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2001717834780252124'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/11/blog-post.html' title='本機設定虛擬網域'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4224085782632259501</id><published>2010-11-22T00:06:00.005+08:00</published><updated>2010-11-22T00:33:46.292+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>在 PHP 中使用 SQLite3</title><content type='html'>很早就知道 PHP5 內建 SQLite 的功能，但是一直沒在 PHP 上使用 SQLite，原因無它「有 MySQL 幹嘛用 SQLite」。&lt;br /&gt;Adobe AIR 上的是 SQLite3，Firefox 的外掛 SQLite Manager 也(只)支援 SQLite3，搭配起來還蠻方便的。&lt;br /&gt;最近有個案子是要做多國語言的展示平台（當然是用 Flash 做囉），要讓管理人員（不會是我）上平台的內容。問題出在那台機器可能沒有網路，就算有網路，頻寬也可能會是個問題，所以要做單機的版本。&lt;br /&gt;展示端無庸置疑 Adobe Flash/AIR 是個好選項，但內容管理用 AIR 就顯得麻煩。為了方便更新內容（拷貝/貼上），目前考慮使用 PHP + SQLite，而把 MySQL 排除在外。&lt;br /&gt;&lt;br /&gt;PHP 目前最新的版本是 5.3.X，我租用的 PHP 空間為 5.1.6，雖然這個專案不會用到租用的空間，但為了可以通用，就會以 5.1.6 為預設版本。&lt;br /&gt;用了 PHP5 的 SQLite 才知道原來它的版本是2。PHP 5.1.6 要使用 SQLite3 必須透過 PDO。PHP 5.3 之後的版本才有直接支援 SQLite3 的類別。SQLite2 有啥不好？其實沒什麼不好，只是個人用慣&amp;nbsp;SQLite Manager 了，而且用舊版心中總會掛念它是舊版，若要用新版的功能時，可能就悔不當初 :P&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;iframe src="https://docs.google.com/document/pub?id=18Gz4aA7_nvmj8WKjILo6YmeVfG2m2HWuOKOYLYoAyHE&amp;amp;embedded=true" width="100%" height="700px"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4224085782632259501?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4224085782632259501/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4224085782632259501' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4224085782632259501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4224085782632259501'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/11/php-sqlite3.html' title='在 PHP 中使用 SQLite3'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8155949748162624328</id><published>2010-11-20T18:44:00.000+08:00</published><updated>2010-11-20T18:44:50.703+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>承上篇「無法使用phpMyAdmin時的DB資料備份及回復」</title><content type='html'>&lt;a href="http://www.sqlbuddy.com/"&gt;sqlbuddy&lt;/a&gt;&amp;nbsp;試用了一下, 功能雖然較 phpMyAdmin 簡單許多, 但其實已經很夠用了 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8155949748162624328?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8155949748162624328/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8155949748162624328' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8155949748162624328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8155949748162624328'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/11/phpmyadmindb.html' title='承上篇「無法使用phpMyAdmin時的DB資料備份及回復」'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8920956281091693500</id><published>2010-09-03T10:44:00.000+08:00</published><updated>2010-09-03T10:44:04.603+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>無法使用phpMyAdmin時的DB資料備份及回復</title><content type='html'>在某些情況，無法使用 phpMyAdmin，資料庫操作時都會挷手挷腳。&lt;br /&gt;資料備份可以使用 &lt;a href="http://www.scripts.oldguy.us/mybackup/"&gt;Old Guy Mybackup&lt;/a&gt;，只有一個檔案，加密碼設定一下連線帳號資料，再用瀏覽器連一下就 OK 了，很方便。&lt;br /&gt;回復資料的話，用&amp;nbsp;&lt;a href="http://www.ozerov.de/bigdump.php"&gt;BigDump&lt;/a&gt;。&lt;a href="http://briian.com/?p=5102"&gt;briian 的介紹&lt;/a&gt;、&lt;a href="http://www.lis186.com/?p=1604"&gt;阿修的介紹&lt;/a&gt;。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8920956281091693500?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8920956281091693500/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8920956281091693500' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8920956281091693500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8920956281091693500'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/09/phpmyadmindb.html' title='無法使用phpMyAdmin時的DB資料備份及回復'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-1786592601162500591</id><published>2010-08-30T12:17:00.000+08:00</published><updated>2010-08-30T12:17:45.404+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><title type='text'>本地端測試 Facebook App</title><content type='html'>Facebook App 註冊之後，可以使用 appId 在本地端測試，而不用上傳到 Canvas URL。&lt;br /&gt;然而，測試時只能使用 127.0.0.1 而禁止使用 localhost 或其它網域名。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-1786592601162500591?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/1786592601162500591/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=1786592601162500591' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1786592601162500591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1786592601162500591'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/facebook-app.html' title='本地端測試 Facebook App'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7891660556708456633</id><published>2010-08-26T02:08:00.000+08:00</published><updated>2010-08-26T02:08:05.426+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><title type='text'>Adobe AIR Launchpad</title><content type='html'>Adobe AIR Launchpad 是個 AIR app，用來快速建立 AIR 專案，以方便在 Flash Builder 編寫。&lt;br /&gt;官網：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://labs.adobe.com/technologies/airlaunchpad/"&gt;http://labs.adobe.com/technologies/airlaunchpad/&lt;/a&gt;&lt;br /&gt;Blog 介紹：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://gregsramblings.com/2010/08/23/air-launchpad/"&gt;Adobe AIR Launchpad – a tool for Flex developers building AIR&amp;nbsp;applications&lt;/a&gt;&lt;br /&gt;Videos：&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=_zHVuWfjLHg"&gt;Introduction to the Adobe AIR Launchpad&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;a href="http://www.vimeo.com/14360527"&gt;Adobe AIR Launchpad beta for RIAgora.com&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7891660556708456633?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7891660556708456633/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7891660556708456633' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7891660556708456633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7891660556708456633'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/adobe-air-launchpad.html' title='Adobe AIR Launchpad'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8540922286248700430</id><published>2010-08-26T01:45:00.000+08:00</published><updated>2010-08-26T01:45:29.435+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><title type='text'>Facebook 開發者常用的連結</title><content type='html'>原文：&lt;a href="http://labs.thesedays.com/2010/08/25/10-links-for-facebook-developers/"&gt;10 LINKS FOR FACEBOOK DEVELOPERS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://developers.facebook.com/docs/" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Official developer’s documentation&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://fbrell.com/examples" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Working examples of Javascript SDK methods and XFBML tags&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://app.apigee.com/console/facebook" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Console for testing Graph API queries&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://developers.facebook.com/docs/reference/rest/fql.query" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Console for testing FQL queries&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://developers.facebook.com/tools/lint/" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;URL Linter&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://forum.developers.facebook.net/" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Developers’ Forum&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://bugs.developers.facebook.net/" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Bugzilla&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://thinkdiff.net/category/facebook/" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;ThinkDiff.net tutorials&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="line-height: 16px; margin-bottom: 16px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"&gt;&lt;span class="Apple-style-span" style="font-size: 14px; font-weight: bold;"&gt;&lt;a href="http://www.smashingmagazine.com/2010/07/23/free-facebook-gui-psd-kit/" style="color: #c80000; line-height: 16px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-decoration: underline;" target="_blank"&gt;Facebook GUI PSD kit&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8540922286248700430?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8540922286248700430/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8540922286248700430' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8540922286248700430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8540922286248700430'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/facebook.html' title='Facebook 開發者常用的連結'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8774119027679518087</id><published>2010-08-26T01:37:00.000+08:00</published><updated>2010-08-26T01:37:12.500+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript 的 Lazy Function</title><content type='html'>&lt;a href="http://peter.michaux.ca/articles/lazy-function-definition-pattern"&gt;Lazy Function Definition Pattern&lt;/a&gt;&lt;br /&gt;&lt;a href="http://chuiwenchiu.spaces.live.com/blog/cns!CA5D9227DF9E78E8!1184.entry"&gt;中文解說連結&lt;/a&gt;&lt;br /&gt;&lt;div&gt;JavaScript 的一些寫法真是深奧，常常讓我水土不服～&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8774119027679518087?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8774119027679518087/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8774119027679518087' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8774119027679518087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8774119027679518087'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/javascript-lazy-function.html' title='JavaScript 的 Lazy Function'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2225855366735563793</id><published>2010-08-22T23:34:00.000+08:00</published><updated>2010-08-22T23:34:57.385+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='SWFAddress'/><title type='text'>SWFAddress 和 SWFObject 還得配對了才行 ?!</title><content type='html'>用SWFAddress時，瀏覽器的 back 和 forward 按鈕老是失效。JS 和 AS 都是再三檢查，寫的都是對的。索性把 swfaddress.js 和 swfobject.js 換成 SWFAddress cs3 範例裡的 js，結果就 OK 了。這會不會太瞎了 :-&amp;amp;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2225855366735563793?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2225855366735563793/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2225855366735563793' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2225855366735563793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2225855366735563793'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/swfaddress-swfobject.html' title='SWFAddress 和 SWFObject 還得配對了才行 ?!'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3943084347576997481</id><published>2010-08-19T20:52:00.000+08:00</published><updated>2010-08-19T20:52:56.977+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='multipart'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='upload'/><title type='text'>Flash 以 multipart/form-data 的方式上傳資料/檔案</title><content type='html'>AS3 的 FileReference 和 FileReferenceList 實際上一次只能上傳一個檔案，若一次要上傳多個檔案或者多個資料（數個 ByteArray）時，就會遇到困難。&lt;br /&gt;&lt;br /&gt;使用 URLRequest 和 URLLoader 以 POST 的方式傳送或許可以解決部份情況，但同時傳遞變數和 ByteArray 時會有問題，除非是很了解 HTTP 資料格式的工程師。&lt;br /&gt;&lt;br /&gt;這裡介紹的當然是現成的工具&amp;nbsp;&lt;a href="http://code.google.com/p/in-spirit/wiki/MultipartURLLoader"&gt;MultipartURLLoader class&lt;/a&gt;，MultipartURLLoader 是 &lt;a href="http://code.google.com/p/in-spirit/"&gt;in-spirit&lt;/a&gt; 專案裡的一部份（作者 Eugene 是俄國人），其 blog 介紹在&amp;nbsp;&lt;a href="http://blog.inspirit.ru/?p=139"&gt;http://blog.inspirit.ru/?p=139&lt;/a&gt;。&lt;br /&gt;&lt;br /&gt;MultipartURLLoader&amp;nbsp;使用起來非常方便，Eugene 的 blog 就有很好的例子，enjoy it :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3943084347576997481?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3943084347576997481/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3943084347576997481' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3943084347576997481'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3943084347576997481'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/flash-multipartform-data.html' title='Flash 以 multipart/form-data 的方式上傳資料/檔案'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7833197869860959650</id><published>2010-08-18T01:53:00.000+08:00</published><updated>2010-08-18T01:53:00.788+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash 可以透過 JavaScript 取得 Facebook 的 session</title><content type='html'>Flash 可以透過 ExternalInterface (JavaScript) 取得 Facebook 的 session，&lt;br /&gt;只要取得 session 裡的&amp;nbsp;access_token 就可以在 Flash 呼叫 Facebook 的 Graph API。&lt;br /&gt;&lt;br /&gt;以下程式碼的要點：&lt;br /&gt;1. 使用 swfobject 顯示 Flash 內容。&lt;br /&gt;2. JavaScript 都載入後再顯示&amp;nbsp;Flash。&lt;br /&gt;3. Flash 先呼叫 JS function，JS function 呼叫 FB function，callback function 呼叫 Flash function。&lt;br /&gt;4. JS function 裡，swf movie name 和 callback function name 以傳入的方式設定。&lt;br /&gt;5.&amp;nbsp;access_token 以 get 方式傳送。&lt;br /&gt;6. Graph API 回傳的內容是格式化過的 JSON 字串。&lt;br /&gt;&lt;span class="Apple-style-span" style="color: #333333; font-family: Verdana, Arial, sans-serif; font-size: 13px; line-height: 16px;"&gt;&lt;a href="https://docs.google.com/document/edit?id=132NTdYDWLilpORIgSuhMHKl2VlT-0Qe8LgpyHj0ej8w&amp;amp;hl=en" style="color: #336699;"&gt;Code 參考&lt;/a&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7833197869860959650?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7833197869860959650/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7833197869860959650' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7833197869860959650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7833197869860959650'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/flash-javascript-facebook-session.html' title='Flash 可以透過 JavaScript 取得 Facebook 的 session'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7044092423447198276</id><published>2010-08-15T16:17:00.000+08:00</published><updated>2010-08-15T16:17:26.533+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Win7'/><title type='text'>在 Win7 console 啟動 FMS</title><content type='html'>在 Win7 上安裝 FMS 3.5.1 接著安裝 3.5.3 update&lt;br /&gt;用「開始」的工具列啟動 FMS 卻發生沒有啟動的情況, 不知道是否是權限問題 -.-&lt;br /&gt;&lt;br /&gt;後來決定用 console (命令列) 來啟動:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;在桌面放一個命令列的捷徑&lt;/li&gt;&lt;li&gt;在命令列的捷徑圖示上按滑鼠右鍵，選「以系統管理員身份執行」&lt;/li&gt;&lt;li&gt;啟動 FMS 用「＞net start FMS」&lt;/li&gt;&lt;li&gt;停止 FMS 用「＞net stop FMS」&lt;/li&gt;&lt;li&gt;啟動 FMSAdmin 用「＞net start&amp;nbsp;FMSAdmin」&lt;/li&gt;&lt;li&gt;停止&amp;nbsp;FMSAdmin&amp;nbsp;用「＞net stop&amp;nbsp;FMSAdmin」&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7044092423447198276?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7044092423447198276/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7044092423447198276' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7044092423447198276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7044092423447198276'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/win7-console-fms.html' title='在 Win7 console 啟動 FMS'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3951179474991246785</id><published>2010-08-13T02:23:00.001+08:00</published><updated>2011-03-31T20:34:54.230+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Robotlegs'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>insideria.com 上介紹 Robotlegs 的文章</title><content type='html'>&lt;a href="http://www.developria.com/2009/09/as3-dependency-injection-demys.html"&gt;AS3 Dependency Injection Demystified&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.developria.com/2010/06/robotlegs-for-framework-beginn.html"&gt;Robotlegs for Framework Beginners&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.developria.com/2010/06/an-introduction-to-robotlegs-a.html"&gt;An Introduction to Robotlegs AS3 Part 1: Context and Mediators&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.developria.com/2010/06/an-introduction-to-robotlegs-a-1.html"&gt;An Introduction to Robotlegs AS3 Part 2: Models&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.developria.com/2010/06/an-introduction-to-robotlegs-a-2.html"&gt;An Introduction to Robotlegs AS3 Part 3: Services&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3951179474991246785?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3951179474991246785/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3951179474991246785' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3951179474991246785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3951179474991246785'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/insideriacom-robotlegs.html' title='insideria.com 上介紹 Robotlegs 的文章'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-941815280024389660</id><published>2010-08-12T00:31:00.001+08:00</published><updated>2010-08-12T00:33:17.505+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>從 AS3 改寫的 JavaScript JSON Formatter</title><content type='html'>參考　&lt;a href="http://qops.blogspot.com/2010/04/json-formatter.html"&gt;http://qops.blogspot.com/2010/04/json-formatter.html&lt;/a&gt;&lt;br /&gt;用法&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var jf = new JsonFormatter(JSON.stringify(response));&lt;br /&gt;jQuery("#show1").html("&amp;lt;pre&amp;gt;" + jf.getResult() + "&amp;lt;/pre&amp;gt;");&lt;/pre&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;原始內容&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;/**&lt;br /&gt;* ...&lt;br /&gt;* @author shinder.lin&lt;br /&gt;*/&lt;br /&gt;function JsonFormatter(jsonString){&lt;br /&gt; this.jsonString = jsonString;&lt;br /&gt;    this.spaces = 0;&lt;br /&gt;    this.spaceUnit = "    ";&lt;br /&gt;    this.resultStr = "";&lt;br /&gt;    this.prevCh = "";&lt;br /&gt;    &lt;br /&gt; // *** getResult method *** &lt;br /&gt;    this.getResult = function(){&lt;br /&gt;  // alert("123");&lt;br /&gt;  // alert(this.findBracket);&lt;br /&gt;        if (this.jsonString) {&lt;br /&gt;            this.findBracket(this.jsonString);&lt;br /&gt;        }&lt;br /&gt;        if (this.resultStr.charAt(0) == "\n") {&lt;br /&gt;            this.resultStr = this.resultStr.slice(1);&lt;br /&gt;        }&lt;br /&gt;        return this.resultStr;&lt;br /&gt;    };&lt;br /&gt; &lt;br /&gt; // *** findBracket method *** &lt;br /&gt;    this.findBracket = function(str){&lt;br /&gt;        var ch;&lt;br /&gt;        var leftStr;&lt;br /&gt;        var midStr;&lt;br /&gt;        var rightStr;&lt;br /&gt;        for (var i = 0; i &amp;lt; str.length; i++) {&lt;br /&gt;            ch = str.charAt(i);&lt;br /&gt;            &lt;br /&gt;            if (ch == '[' || ch == '{' || ch == ',') {&lt;br /&gt;                leftStr = str.slice(0, i + 1);&lt;br /&gt;                rightStr = str.slice(i + 1);&lt;br /&gt;                break;&lt;br /&gt;            }&lt;br /&gt;            else &lt;br /&gt;                if (ch == '}' || ch == ']') {&lt;br /&gt;                    leftStr = str.slice(0, i);&lt;br /&gt;                    midStr = str.slice(i, i + 1);&lt;br /&gt;                    rightStr = str.slice(i + 1);&lt;br /&gt;                    break;&lt;br /&gt;                }&lt;br /&gt;        }&lt;br /&gt;        if (leftStr == null) {&lt;br /&gt;            return;&lt;br /&gt;        }&lt;br /&gt;        if (ch == ',' &amp;amp;&amp;amp; (prevCh == '}' || prevCh == ']')) {&lt;br /&gt;            this.resultStr += leftStr;&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            this.resultStr += this.getSpaces() + leftStr;&lt;br /&gt;        }&lt;br /&gt;        switch (ch) {&lt;br /&gt;            case '[':&lt;br /&gt;            case '{':&lt;br /&gt;                this.spaces++;&lt;br /&gt;                break;&lt;br /&gt;            case '}':&lt;br /&gt;            case ']':&lt;br /&gt;                this.spaces--;&lt;br /&gt;                break;&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        if (midStr != null) {&lt;br /&gt;            this.resultStr += this.getSpaces() + midStr;&lt;br /&gt;        }&lt;br /&gt;        prevCh = ch;&lt;br /&gt;        &lt;br /&gt;        if (rightStr.length &amp;gt; 1) {&lt;br /&gt;            this.findBracket(rightStr);&lt;br /&gt;        }&lt;br /&gt;        else {&lt;br /&gt;            this.resultStr += "\n" + rightStr;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt; // *** getSpaces method *** &lt;br /&gt;    this.getSpaces = function(){&lt;br /&gt;        var str = "\n";&lt;br /&gt;        for (var i = 0; i &amp;lt; this.spaces; i++) {&lt;br /&gt;            str += this.spaceUnit;&lt;br /&gt;        }&lt;br /&gt;        return str;&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-941815280024389660?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/941815280024389660/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=941815280024389660' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/941815280024389660'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/941815280024389660'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/as3-javascript-json-formatter.html' title='從 AS3 改寫的 JavaScript JSON Formatter'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6499884112176541837</id><published>2010-08-11T22:00:00.000+08:00</published><updated>2010-08-11T22:00:21.176+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>JavaScript JSON Formatter</title><content type='html'>Blog:&amp;nbsp;&lt;a href="http://joncom.be/code/javascript-json-formatter/"&gt;http://joncom.be/code/javascript-json-formatter/&lt;/a&gt;&lt;br /&gt;Source file:&amp;nbsp;&lt;a href="http://static.joncom.be/script/jsonformatter.js"&gt;http://static.joncom.be/script/jsonformatter.js&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;以下為 FormatJSON 函式內容：&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;function FormatJSON(oData, sIndent) {&lt;br /&gt;    if (arguments.length &amp;lt; 2) {&lt;br /&gt;        var sIndent = "";&lt;br /&gt;    }&lt;br /&gt;    var sIndentStyle = "    ";&lt;br /&gt;    var sDataType = RealTypeOf(oData);&lt;br /&gt;&lt;br /&gt;    // open object&lt;br /&gt;    if (sDataType == "array") {&lt;br /&gt;        if (oData.length == 0) {&lt;br /&gt;            return "[]";&lt;br /&gt;        }&lt;br /&gt;        var sHTML = "[";&lt;br /&gt;    } else {&lt;br /&gt;        var iCount = 0;&lt;br /&gt;        $.each(oData, function() {&lt;br /&gt;            iCount++;&lt;br /&gt;            return;&lt;br /&gt;        });&lt;br /&gt;        if (iCount == 0) { // object is empty&lt;br /&gt;            return "{}";&lt;br /&gt;        }&lt;br /&gt;        var sHTML = "{";&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // loop through items&lt;br /&gt;    var iCount = 0;&lt;br /&gt;    $.each(oData, function(sKey, vValue) {&lt;br /&gt;        if (iCount &amp;gt; 0) {&lt;br /&gt;            sHTML += ",";&lt;br /&gt;        }&lt;br /&gt;        if (sDataType == "array") {&lt;br /&gt;            sHTML += ("\n" + sIndent + sIndentStyle);&lt;br /&gt;        } else {&lt;br /&gt;            sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // display relevant data type&lt;br /&gt;        switch (RealTypeOf(vValue)) {&lt;br /&gt;            case "array":&lt;br /&gt;            case "object":&lt;br /&gt;                sHTML += FormatJSON(vValue, (sIndent + sIndentStyle));&lt;br /&gt;                break;&lt;br /&gt;            case "boolean":&lt;br /&gt;            case "number":&lt;br /&gt;                sHTML += vValue.toString();&lt;br /&gt;                break;&lt;br /&gt;            case "null":&lt;br /&gt;                sHTML += "null";&lt;br /&gt;                break;&lt;br /&gt;            case "string":&lt;br /&gt;                sHTML += ("\"" + vValue + "\"");&lt;br /&gt;                break;&lt;br /&gt;            default:&lt;br /&gt;                sHTML += ("TYPEOF: " + typeof(vValue));&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        // loop&lt;br /&gt;        iCount++;&lt;br /&gt;    });&lt;br /&gt;&lt;br /&gt;    // close object&lt;br /&gt;    if (sDataType == "array") {&lt;br /&gt;        sHTML += ("\n" + sIndent + "]");&lt;br /&gt;    } else {&lt;br /&gt;        sHTML += ("\n" + sIndent + "}");&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // return&lt;br /&gt;    return sHTML;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6499884112176541837?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6499884112176541837/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6499884112176541837' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6499884112176541837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6499884112176541837'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/javascript-json-formatter.html' title='JavaScript JSON Formatter'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-1188947628539135136</id><published>2010-08-11T19:13:00.000+08:00</published><updated>2010-08-11T19:13:43.549+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='jQuery'/><title type='text'>FaceBook 的 JavaScript 和 jQuery 混用</title><content type='html'>FaceBook 的 JavaScript 和 jQuery 混用時，Chrome 執行是正常的（如預期），但是 FireFox 和 IE8 卻看不到東西，也沒有錯誤提示。&lt;br /&gt;後來想說會不會是 $ 衝到，不使用 $ 而以 jQuery 替代之後，執行就正常了。&lt;br /&gt;難道 FB 的 JavaScript API 裡使用 $ 當變數，嘖！&lt;br /&gt;&lt;a href="https://docs.google.com/document/edit?id=1QZ1cYVtS6lu2gR-F6g7LY3h1Xlijw2QwVHphma9t6ZM&amp;amp;hl=en"&gt;Code 參考&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-1188947628539135136?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/1188947628539135136/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=1188947628539135136' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1188947628539135136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1188947628539135136'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/facebook-javascript-jquery.html' title='FaceBook 的 JavaScript 和 jQuery 混用'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-610309157451078093</id><published>2010-08-11T18:28:00.000+08:00</published><updated>2010-08-11T18:28:16.710+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>目前瀏覽器幾乎都實作了 JavaScript 的 JSON 物件</title><content type='html'>以往在 JavaScript 要使用 JSON 的功能必須要使用&amp;nbsp;&lt;a href="http://www.json.org/json2.js"&gt;http://www.json.org/json2.js&lt;/a&gt;。&lt;br /&gt;目前各家 browser 應該都實作了 JSON 功能，無需使用 JavaScript 的 library，&lt;br /&gt;直接就可以使用&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, mono; white-space: pre;"&gt;JSON.stringify() 和 &lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, mono; white-space: pre;"&gt;JSON.parse()。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, mono;"&gt;&lt;span class="Apple-style-span" style="white-space: pre;"&gt;測試過的有 FireFox 3.6、Google Chrome、IE8。手持裝置的瀏覽器沒試過&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, mono; white-space: pre;"&gt;。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-610309157451078093?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/610309157451078093/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=610309157451078093' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/610309157451078093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/610309157451078093'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/08/javascript-json.html' title='目前瀏覽器幾乎都實作了 JavaScript 的 JSON 物件'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5578109377938923293</id><published>2010-07-08T23:09:00.000+08:00</published><updated>2010-07-08T23:09:02.645+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Netbeans'/><title type='text'>Netbeans 編輯區的字體反鋸齒</title><content type='html'>編輯 Netbeans 安裝目錄裡的 /etc/netbeans.conf，在啟動設定 netbeans_default_options&amp;nbsp;加參數&lt;br /&gt;-J-Dawt.useSystemAAFontSettings=on&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5578109377938923293?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5578109377938923293/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5578109377938923293' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5578109377938923293'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5578109377938923293'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/07/netbeans.html' title='Netbeans 編輯區的字體反鋸齒'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4744063521888781315</id><published>2010-06-22T13:20:00.000+08:00</published><updated>2010-06-22T13:20:57.728+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='UDP'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='Monitor'/><title type='text'>用 AIR2 透過 DatagramSocket (UDP) 及截圖做簡陋的監視服務</title><content type='html'>安裝 &lt;a href="http://www.riarock.net/qopsblog/2010/PicServer.air"&gt;PicServer.air&lt;/a&gt; 的電腦必須要有 Webcam，當然也要有網路功能，使用 port 24688，啟動後會等待 client 登入。安裝 &lt;a href="http://www.riarock.net/qopsblog/2010/PicClient.air"&gt;PicClient.air&lt;/a&gt; 的電腦是監看端，使用 port 24689，記得防火牆要讓訊息通過才行。由於使用 UDP，所以無法得知連線狀態，因為 client 必須傳 session 給 server，server 才會傳畫面資料給 client。client 端還可以發展成調整時間間隔、畫面品質、及存檔等。&lt;br /&gt;原始碼如下(請使用 Flash CS5)。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;PicServer&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package  {&lt;br /&gt; import com.adobe.crypto.MD5;&lt;br /&gt; import com.adobe.images.JPGEncoder;&lt;br /&gt; import fl.controls.TextInput;&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import flash.net.DatagramSocket;&lt;br /&gt; import flash.events.DatagramSocketDataEvent;&lt;br /&gt; import flash.utils.ByteArray;&lt;br /&gt; import flash.utils.Dictionary;&lt;br /&gt; import flash.utils.getTimer;&lt;br /&gt; import flash.media.Video;&lt;br /&gt; import flash.media.Camera;&lt;br /&gt; import flash.geom.Matrix;&lt;br /&gt; import flash.display.BitmapData;&lt;br /&gt; &lt;br /&gt; public class PicServer extends MovieClip {&lt;br /&gt;  public var password_txt:TextInput;&lt;br /&gt;  private var UDPSocket:DatagramSocket;&lt;br /&gt;  private var clients:Dictionary = new Dictionary();&lt;br /&gt;  private var video:Video;&lt;br /&gt;  private var camera:Camera;&lt;br /&gt;  private var jpgEnc:JPGEncoder = new JPGEncoder();&lt;br /&gt;  &lt;br /&gt;  public function PicServer() {&lt;br /&gt;   password_txt.text = '新德測試';&lt;br /&gt;   UDPSocket = new DatagramSocket();&lt;br /&gt;   UDPSocket.addEventListener(DatagramSocketDataEvent.DATA, dataReceived);&lt;br /&gt;   UDPSocket.bind(24688);&lt;br /&gt;   UDPSocket.receive();&lt;br /&gt;   &lt;br /&gt;   camera = Camera.getCamera();&lt;br /&gt;   video = new Video();&lt;br /&gt;   this.addChild( video );&lt;br /&gt;   video.y = 55;&lt;br /&gt;   video.attachCamera( camera );&lt;br /&gt;   video.width = camera.width;&lt;br /&gt;   video.height = camera.height;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function dataReceived(event:DatagramSocketDataEvent):void {&lt;br /&gt;   // 傳入的是 AMF 格式的 Object&lt;br /&gt;   var obj:Object = event.data.readObject();&lt;br /&gt;   var ba:ByteArray;&lt;br /&gt;   // 如果傳入的是密碼&lt;br /&gt;   if( obj.password &amp;&amp; obj.password == password_txt.text) {&lt;br /&gt;    obj.srcAddress = event.srcAddress;&lt;br /&gt;    obj.srcPort = event.srcPort;&lt;br /&gt;    // 產生個認證碼&lt;br /&gt;    obj.session = MD5.hash(''+Math.random());&lt;br /&gt;    clients[ obj.session ] = obj;&lt;br /&gt;    &lt;br /&gt;    ba = new ByteArray();&lt;br /&gt;    ba.writeObject( {session: obj.session} );&lt;br /&gt;    // 傳回 session id&lt;br /&gt;    UDPSocket.send(ba, 0, 0, obj.srcAddress, obj.srcPort);&lt;br /&gt;   } else if ( obj.session &amp;&amp; clients[obj.session] ) {&lt;br /&gt;    var matrix:Matrix = new Matrix();&lt;br /&gt;    matrix.tx = - video.x;&lt;br /&gt;    matrix.ty = - video.y;&lt;br /&gt;    var bmd:BitmapData = new BitmapData(video.width, video.height);&lt;br /&gt;    // 抓畫面&lt;br /&gt;    bmd.draw( this, matrix);&lt;br /&gt;    ba = jpgEnc.encode( bmd );&lt;br /&gt;    var client:Object = clients[ obj.session ];&lt;br /&gt;    UDPSocket.send(ba, 0, 0, client.srcAddress, client.srcPort);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;PicServer&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package {&lt;br /&gt; import com.adobe.serialization.json.JSON;&lt;br /&gt; import fl.controls.Button;&lt;br /&gt; import fl.controls.TextInput;&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import flash.net.DatagramSocket;&lt;br /&gt; import flash.events.DatagramSocketDataEvent;&lt;br /&gt; import flash.events.MouseEvent;&lt;br /&gt; import flash.utils.ByteArray;&lt;br /&gt; import flash.display.Loader;&lt;br /&gt; import flash.utils.Timer;&lt;br /&gt; import flash.events.TimerEvent;&lt;br /&gt;&lt;br /&gt; public class PicClient extends MovieClip {&lt;br /&gt;  public var login_btn:Button;&lt;br /&gt;  public var ip_txt:TextInput;&lt;br /&gt;  public var password_txt:TextInput;&lt;br /&gt;  private var UDPSocket:DatagramSocket;&lt;br /&gt;  private var session_ba:ByteArray;&lt;br /&gt;  private var loader:Loader;&lt;br /&gt;  private var timer:Timer;&lt;br /&gt;&lt;br /&gt;  public function PicClient() {&lt;br /&gt;   password_txt.text = "新德測試";&lt;br /&gt;   UDPSocket = new DatagramSocket();&lt;br /&gt;   UDPSocket.addEventListener(DatagramSocketDataEvent.DATA, dataReceived);&lt;br /&gt;   UDPSocket.bind(24689);&lt;br /&gt;   UDPSocket.receive();&lt;br /&gt;   login_btn.addEventListener(MouseEvent.CLICK, clickHandler);&lt;br /&gt;&lt;br /&gt;   loader = new Loader();&lt;br /&gt;   this.addChild( loader );&lt;br /&gt;   loader.y = 50;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function dataReceived(event:DatagramSocketDataEvent):void {&lt;br /&gt;   if (session_ba == null) {&lt;br /&gt;    var obj:Object = event.data.readObject();&lt;br /&gt;    if (obj &amp;&amp; obj.session) {&lt;br /&gt;     login_btn.enabled = false;&lt;br /&gt;     ip_txt.editable = false;&lt;br /&gt;     password_txt.visible = false;&lt;br /&gt;     session_ba = event.data;&lt;br /&gt;     // 1 秒傳 1 次&lt;br /&gt;     timer = new Timer(1000,1);&lt;br /&gt;     timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerCompleted);&lt;br /&gt;     timer.start();&lt;br /&gt;    }&lt;br /&gt;   } else {&lt;br /&gt;    loader.loadBytes( event.data );&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function clickHandler(event:MouseEvent):void {&lt;br /&gt;   var byteArray:ByteArray = new ByteArray();&lt;br /&gt;   byteArray.writeObject( {password:password_txt.text} );&lt;br /&gt;   UDPSocket.send(byteArray, 0, 0, ip_txt.text, 24688);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function timerCompleted( event:TimerEvent):void {&lt;br /&gt;   UDPSocket.send(session_ba, 0, 0, ip_txt.text, 24688);&lt;br /&gt;   timer.start();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4744063521888781315?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4744063521888781315/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4744063521888781315' title='8 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4744063521888781315'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4744063521888781315'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/air2-datagramsocket-udp.html' title='用 AIR2 透過 DatagramSocket (UDP) 及截圖做簡陋的監視服務'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-36991921183273411</id><published>2010-06-18T23:39:00.000+08:00</published><updated>2010-06-18T23:39:37.413+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Graphics'/><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='Zip'/><title type='text'>值得注意的專案：ZipUtil、AppengineJS、Axiis</title><content type='html'>訊息來源：&lt;a href="http://blogs.adobe.com/cantrell/archives/2010/06/a_simple_zip_utility_for_adobe_air.html"&gt;A Simple Zip Utility for Adobe AIR&lt;/a&gt;、&lt;a href="http://radar.oreilly.com/2010/06/four-short-links-18-june-2010.html"&gt;Four short links: 18 June 2010: Facebook Scraping, Law Code, AppEngine in Javascript, and Flash Visualization&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A) &lt;a href="http://github.com/cantrell/ZipUtil"&gt;ZipUtil&lt;/a&gt;: 專門給 Adobe AIR 用的&amp;nbsp;zip 壓縮解壓工具。&lt;br /&gt;B) &lt;a href="http://www.appenginejs.org/"&gt;AppengineJS&lt;/a&gt;:利用 JavaScript 寫 App Engine 的專案，架在 Java 平台之上，使用 Rhino。&lt;br /&gt;C) &lt;a href="http://www.axiis.org/"&gt;Axiis&lt;/a&gt;: 建立在 &lt;a href="http://www.degrafa.org/"&gt;Degrafa&lt;/a&gt; graphics framework 之上的資料視覺化工具。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-36991921183273411?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/36991921183273411/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=36991921183273411' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/36991921183273411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/36991921183273411'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/ziputilappenginejsaxiis.html' title='值得注意的專案：ZipUtil、AppengineJS、Axiis'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6223269257930647332</id><published>2010-06-17T23:32:00.000+08:00</published><updated>2010-06-17T23:32:23.307+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='RTMP'/><category scheme='http://www.blogger.com/atom/ns#' term='FMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Proxy'/><title type='text'>使用 Adobe AIR 建立 RTMP Proxy</title><content type='html'>在此使用 Adobe AIR 建立 RTMP Proxy 的目的是去查看 RTMP 傳送的內容。雖然 Adobe 已經釋出 &lt;a href="http://xn--%20adobe%20air%20%20rtmp%20proxy-o185cjz9wrhph0osb/"&gt;RTMP Specification&lt;/a&gt;，但是在 Flash Player 10.0.32.18 後還是有變動（&lt;a href="http://hi.baidu.com/homegy/blog/item/3a05a738de5d59ced5622520.html"&gt;註&lt;/a&gt;）。&lt;br /&gt;注意事項：&lt;br /&gt;A) Fla 檔記得使用 Flash CS5 開 AIR 2。&lt;br /&gt;B)&amp;nbsp;在桌面建立個空的 rtmp_proxy 目錄，用來存放執行時的資料存檔。&lt;br /&gt;C)&amp;nbsp;在 Flash Media Server，開個名為「test」的 Application，並啟動 Server。&lt;br /&gt;D) 先執行 RTMPProxy 再執行 VideoTest，&lt;br /&gt;E) 跑一下子就關掉 VideoTest，否則檔案會越來越多，硬碟可能會爆。&lt;br /&gt;&lt;br /&gt;以下是 兩個 Document Classes 的內容，Fla 就不附了：&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;RTMPProxy.as&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package {&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import fl.controls.TextArea;&lt;br /&gt; import flash.net.ServerSocket;&lt;br /&gt; import flash.net.Socket;&lt;br /&gt; import flash.events.ServerSocketConnectEvent;&lt;br /&gt; import flash.events.ProgressEvent;&lt;br /&gt; import flash.utils.ByteArray;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.filesystem.File;&lt;br /&gt; import flash.filesystem.FileStream;&lt;br /&gt; import flash.filesystem.FileMode;&lt;br /&gt; import flash.utils.getTimer;&lt;br /&gt;&lt;br /&gt; public class RTMPProxy extends MovieClip {&lt;br /&gt;  public var info_txt:TextArea;&lt;br /&gt;  private var server:ServerSocket;&lt;br /&gt;  private var forClient:Socket;&lt;br /&gt;  private var forServer:Socket;&lt;br /&gt;  private var file:File;&lt;br /&gt;  private var fileStream:FileStream;&lt;br /&gt;  private var count:int;&lt;br /&gt;&lt;br /&gt;  public function RTMPProxy() {&lt;br /&gt;   info_txt.text = "";&lt;br /&gt;   server = new ServerSocket();&lt;br /&gt;   server.addEventListener(ServerSocketConnectEvent.CONNECT, connectHandler);&lt;br /&gt;   server.bind( 1936 );&lt;br /&gt;   server.listen();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function connectHandler(event:ServerSocketConnectEvent):void {&lt;br /&gt;   forClient = event.socket;&lt;br /&gt;   forClient.addEventListener(ProgressEvent.SOCKET_DATA, clientDataHandler);&lt;br /&gt;   forClient.addEventListener(Event.CLOSE, closeHandler);&lt;br /&gt;   forServer = new Socket('localhost',1935);&lt;br /&gt;   forServer.addEventListener(ProgressEvent.SOCKET_DATA, serverDataHandler);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function clientDataHandler(event:ProgressEvent):void {&lt;br /&gt;   count++;&lt;br /&gt;   var ba:ByteArray = new ByteArray();&lt;br /&gt;   forClient.readBytes( ba );&lt;br /&gt;   forServer.writeBytes( ba );&lt;br /&gt;&lt;br /&gt;   file = File.desktopDirectory.resolvePath("rtmp_proxy/proxy_" + count + "_c.data");&lt;br /&gt;   fileStream = new FileStream();&lt;br /&gt;   fileStream.open(file, FileMode.WRITE);&lt;br /&gt;   fileStream.writeBytes( ba );&lt;br /&gt;   fileStream.close();&lt;br /&gt;   info_txt.appendText("\n proxy_client:"+ba.length );&lt;br /&gt;   forServer.flush();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function serverDataHandler(event:ProgressEvent):void {&lt;br /&gt;   count++;&lt;br /&gt;   var ba:ByteArray = new ByteArray();&lt;br /&gt;   forServer.readBytes( ba );&lt;br /&gt;   forClient.writeBytes( ba );&lt;br /&gt;&lt;br /&gt;   file = File.desktopDirectory.resolvePath("rtmp_proxy/proxy_" + count + "_s.data");&lt;br /&gt;   fileStream = new FileStream();&lt;br /&gt;   fileStream.open(file, FileMode.WRITE);&lt;br /&gt;   fileStream.writeBytes( ba );&lt;br /&gt;   fileStream.close();&lt;br /&gt;   info_txt.appendText("\n proxy_server:"+ba.length );&lt;br /&gt;   forClient.flush();&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function closeHandler(event:Event):void {&lt;br /&gt;   info_txt.appendText("\n client_close" );&lt;br /&gt;   forServer.close();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;VideoTest.as (客戶端)&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package {&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import flash.media.Video;&lt;br /&gt; import flash.media.Camera;&lt;br /&gt; import flash.net.NetConnection;&lt;br /&gt; import flash.net.NetStream;&lt;br /&gt; import flash.display.SimpleButton;&lt;br /&gt; import flash.events.MouseEvent;&lt;br /&gt; import flash.events.NetStatusEvent;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.events.AsyncErrorEvent;&lt;br /&gt; import flash.events.IOErrorEvent;&lt;br /&gt; import flash.events.SecurityErrorEvent;&lt;br /&gt; import com.adobe.serialization.json.JSON;&lt;br /&gt;&lt;br /&gt; public class VideoTest extends MovieClip {&lt;br /&gt;  public var video:Video;&lt;br /&gt;  public var camera:Camera;&lt;br /&gt;  public var btn:SimpleButton;&lt;br /&gt;  private var connection:NetConnection;&lt;br /&gt;  private var stream:NetStream;&lt;br /&gt;&lt;br /&gt;  public function VideoTest() {&lt;br /&gt;   connection = new NetConnection();&lt;br /&gt;   connection.addEventListener(NetStatusEvent.NET_STATUS, statusHandler);&lt;br /&gt;   connection.connect("rtmp://localhost:1936/test/");&lt;br /&gt;&lt;br /&gt;   video = new Video();&lt;br /&gt;   camera = Camera.getCamera();&lt;br /&gt;   video.width = camera.width;&lt;br /&gt;   video.height = camera.height;&lt;br /&gt;   this.addChild( video );&lt;br /&gt;   video.attachCamera( camera );&lt;br /&gt;   btn.addEventListener(MouseEvent.CLICK, clickHandler);&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function clickHandler(event:MouseEvent):void {&lt;br /&gt;   stream = new NetStream(connection);&lt;br /&gt;   stream.attachCamera( camera );&lt;br /&gt;   stream.publish("lin");&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function statusHandler(event:Event):void {&lt;br /&gt;   trace( event.toString() );&lt;br /&gt;   trace( JSON.encode( event['info'] ) );&lt;br /&gt;   trace('connection.connected:'+connection.connected);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6223269257930647332?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6223269257930647332/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6223269257930647332' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6223269257930647332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6223269257930647332'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/adobe-air-rtmp-proxy.html' title='使用 Adobe AIR 建立 RTMP Proxy'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5255402888524500753</id><published>2010-06-15T20:59:00.000+08:00</published><updated>2010-06-15T20:59:38.800+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='Groovy'/><title type='text'>Groovy 使用 JSON-simple</title><content type='html'>想在 Groovy 上使用 JSON，想說 Json-lib 還滿多人用的，就試試看。結果，Json-lib 相依性太多，還需要另外 4 支 jar，而且 run 的時候，錯誤一堆，浪費一些時間後，決定放棄&amp;nbsp;Json-lib。&lt;br /&gt;後來找到 &lt;a href="http://code.google.com/p/json-simple/"&gt;json-simpe&lt;/a&gt;, 果然比較簡單, 搭配 Groovy 顯得更容易使用。不過中文的部份似乎不會轉成 Unicode 的表示法, 這部份在傳給別的程式語言時可能會發生問題。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import org.json.simple.*;&lt;br /&gt;def map = [abc:123, def:'哈囉']&lt;br /&gt;def list = [5,8,12, "lin", map, null]&lt;br /&gt;println JSONValue.toJSONString(list)&lt;br /&gt;def str ='[5,8,12,"lin",{"abc":123,"def":"哈囉"},null]'&lt;br /&gt;def obj = JSONValue.parse(str)&lt;br /&gt;obj.each{&lt;br /&gt; println "$it ::: ${it.getClass().name}"&lt;br /&gt;}&lt;br /&gt;obj[4].each{&lt;br /&gt; println "$it.key = $it.value"&lt;br /&gt;}&lt;br /&gt;/*&lt;br /&gt;  [5,8,12,"lin",{"abc":123,"def":"哈囉"},null]&lt;br /&gt;  5 ::: java.lang.Long&lt;br /&gt;  8 ::: java.lang.Long&lt;br /&gt;  12 ::: java.lang.Long&lt;br /&gt;  lin ::: java.lang.String&lt;br /&gt;  [abc:123, def:哈囉] ::: org.json.simple.JSONObject&lt;br /&gt;  null ::: org.codehaus.groovy.runtime.NullObject&lt;br /&gt;  abc = 123&lt;br /&gt;  def = 哈囉&lt;br /&gt;*/&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5255402888524500753?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5255402888524500753/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5255402888524500753' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5255402888524500753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5255402888524500753'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/groovy-json-simple.html' title='Groovy 使用 JSON-simple'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8791818805536101327</id><published>2010-06-10T13:11:00.000+08:00</published><updated>2010-06-10T13:11:52.057+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Eclipse'/><title type='text'>Eclipse 混合專案功能</title><content type='html'>查到這篇&amp;nbsp;&lt;a href="http://scott0228.blogspot.com/2009/04/eclipse-java-project-dynamic-web.html" style="text-decoration: none;"&gt;&lt;span class="Apple-style-span" style="color: #b45f06;"&gt;Eclipse 中 將Java Project 轉換為Dynamic Web Project&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;在專案目錄的 .project 中的 natures 節點增加子節點：&lt;br /&gt;&lt;br /&gt;&lt;nature&gt;org.eclipse.wst.common.project.facet.core.nature&lt;/nature&gt;&lt;br /&gt;&lt;nature&gt;org.eclipse.wst.common.modulecore.ModuleCoreNature&lt;/nature&gt;&lt;br /&gt;&lt;nature&gt;org.eclipse.jem.workbench.JavaEMFNature&lt;/nature&gt;&lt;br /&gt;&lt;br /&gt;再將其它專案的 nature 放在一起就可以有不同專案的功能了，例如放入下行就有 Groovy project 的功能，當然 Eclipse 必須先安裝 Groovy 外掛：&lt;br /&gt;&lt;nature&gt;org.eclipse.jdt.groovy.core.groovyNature&lt;/nature&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8791818805536101327?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8791818805536101327/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8791818805536101327' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8791818805536101327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8791818805536101327'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/eclipse.html' title='Eclipse 混合專案功能'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-173885643744355366</id><published>2010-06-09T01:27:00.002+08:00</published><updated>2010-06-09T01:37:04.682+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='AppEngine'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>在 App Engine 上執行 PHP</title><content type='html'>Google App Engine 目前只支援 Java 和 Python，支援 Java 就有許多好玩的東西。Quercus 是&amp;nbsp;Caucho 用 Java 實現的 PHP 解譯引擎，在 Java 環境就可以執行。最早，&lt;a href="http://www.webdigi.co.uk/blog/2009/run-php-on-the-google-app-engine/"&gt;webdigi 就弄了個 Demo&lt;/a&gt;，後來&amp;nbsp;&lt;a href="http://blog.caucho.com/?p=187"&gt;Quercus 官網也弄了個範例&lt;/a&gt;。以下是個人實作的方式：&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Step 1&lt;/span&gt;&lt;/b&gt;: 先要有 Gmail 帳號，到「&lt;a href="https://appengine.google.com/"&gt;https://appengine.google.com/&lt;/a&gt;」註冊使用 App Engine，認證方式使用手機認證，目前台灣只有三家電信收得到認證碼：中華電信、台哥大、威寶。我的是中華電信門號，當初是由台哥大轉過來的，結果收不到認證碼，後來借老婆的手機。另一種方式是寫 email，效率上當然較慢。&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Step 2&lt;/span&gt;&lt;/b&gt;: 安裝 Eclipse 3.5 (&amp;nbsp;&lt;span class="Apple-style-span" style="font-family: Arial, sans-serif; font-size: 12px; line-height: 16px;"&gt;&lt;a class="packageTitle" href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/galileo/SR2/eclipse-jee-galileo-SR2-win32.zip" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #7036be; font-size: 14px; font-weight: bold; line-height: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 3px; padding-left: 0px; padding-right: 0px; padding-top: 3px; text-align: left; text-decoration: none;"&gt;Eclipse IDE for Java EE Developers&lt;/a&gt;&amp;nbsp;&lt;/span&gt;)，接著依照 App Engine Help 安裝&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: small; line-height: 16px;"&gt;「&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: small; line-height: 16px;"&gt;&lt;a href="http://code.google.com/intl/zh-TW/appengine/docs/java/tools/eclipse.html" style="color: #0000cc;"&gt;Eclipse 專用的 Google 外掛程式&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: small; line-height: 16px;"&gt;」使用「&lt;/span&gt;&lt;span class="Apple-style-span" style="color: #007000; font-family: monospace; font-size: 12px; line-height: 15px; white-space: pre;"&gt;http://dl.google.com/eclipse/plugin/3.５&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: small; line-height: 16px;"&gt;」。&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: small; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="background-color: white;"&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;&lt;b&gt;Step 3&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;: 設定 Eclipse 使用 JDK。Preferences → Java → (點擊) Installed JREs，將 JDK 安裝的路徑新增進去，再勾選使用。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-family: Helvetica, Arial, sans-serif; font-size: small; line-height: 16px;"&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: medium; line-height: normal;"&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-family: Arial; font-size: medium; line-height: normal;"&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;&lt;b&gt;Step 4&lt;/b&gt;&lt;/span&gt;: 設定文件預設編碼為 UTF-8。&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Preferences → General →&amp;nbsp;(點擊) Workspace，變更 Text file encoding 為 UTF-8。&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Step 5&lt;/span&gt;&lt;/b&gt;: 建立新專案，選「Web Application Project」，然後類似下圖設定，Google SDKs 的兩個項目請皆勾選。&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_x0Mqwpk8Pw8/TA54XJ6TfnI/AAAAAAAAARQ/gGDTpr-GXHc/s1600/New+Web+App+Project.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_x0Mqwpk8Pw8/TA54XJ6TfnI/AAAAAAAAARQ/gGDTpr-GXHc/s320/New+Web+App+Project.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;&lt;b&gt;Step 6&lt;/b&gt;&lt;/span&gt;: 專案建立完成後，到「&lt;a href="http://www.caucho.com/products/quercus/"&gt;http://www.caucho.com/products/quercus/&lt;/a&gt;」下載「quercus-4.0.1.war」，用 7z 或可解 zip 的工具，解壓縮。將其中的「\WEB-INF\lib\resin.jar」放到 Eclipse 專案「\war\WEB-INF\lib\」裡。注意，版本不要用太高，否則會超過 App Engine 單一檔案大小限制 10 M，「quercus-4.0.3.war」就已經不行了 =..=&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Step 7&lt;/span&gt;&lt;/b&gt;: 更改「\war\WEB-INF\web.xml」：&lt;br /&gt;&lt;div&gt;&amp;lt;?xml version="1.0" encoding="UTF-8"?&amp;gt;&lt;br /&gt;&amp;lt;!DOCTYPE web-app&lt;br /&gt;PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"&lt;br /&gt;"http://java.sun.com/dtd/web-app_2_3.dtd"&amp;gt;&lt;br /&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!-- Servlets --&amp;gt;&lt;br /&gt;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;greetServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;servlet-class&amp;gt;lin.shinder.appengine.server.GreetingServiceImpl&amp;lt;/servlet-class&amp;gt;&lt;br /&gt;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;servlet&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;servlet-name&amp;gt;QuercusServlet&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;servlet-class&amp;gt;com.caucho.quercus.servlet.GoogleQuercusServlet&amp;lt;/servlet-class&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;/servlet&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;servlet-name&amp;gt;greetServlet&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;lt;url-pattern&amp;gt;/qopstudio/greet&amp;lt;/url-pattern&amp;gt;&lt;br /&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;servlet-mapping&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;servlet-name&amp;gt;QuercusServlet&amp;lt;/servlet-name&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;url-pattern&amp;gt;*.php&amp;lt;/url-pattern&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;/servlet-mapping&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;!-- Default page to serve --&amp;gt;&lt;br /&gt;&amp;lt;welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;welcome-file&amp;gt;QopStudio.html&amp;lt;/welcome-file&amp;gt;&lt;br /&gt;&amp;lt;/welcome-file-list&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Step 8&lt;/span&gt;&lt;/b&gt;:&amp;nbsp;更改「\war\WEB-INF\appengine-web.xml」：&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;appengine-web-app xmlns="http://appengine.google.com/ns/1.0"&amp;gt;&lt;br /&gt;&amp;lt;application&amp;gt;qopstudio&amp;lt;/application&amp;gt;&lt;br /&gt;&amp;lt;version&amp;gt;1&amp;lt;/version&amp;gt;&lt;br /&gt;&amp;lt;!-- Configure serving/caching of GWT files --&amp;gt;&lt;br /&gt;&amp;lt;static-files&amp;gt;&lt;br /&gt;&amp;lt;include path="**" /&amp;gt;&lt;br /&gt;&amp;lt;!-- The following line requires App Engine 1.3.2 SDK --&amp;gt;&lt;br /&gt;&amp;lt;include path="**.nocache.*" expiration="0s" /&amp;gt;&lt;br /&gt;&amp;lt;include path="**.cache.*" expiration="365d" /&amp;gt;&lt;br /&gt;&amp;lt;exclude path="**.gwt.rpc" /&amp;gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;exclude path="/**.php"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;/static-files&amp;gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;resource-files&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;include path="/**.php"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="color: blue;"&gt;&amp;lt;/resource-files&amp;gt;&lt;/span&gt;&lt;br /&gt;&amp;lt;!-- Configure java.util.logging --&amp;gt;&lt;br /&gt;&amp;lt;system-properties&amp;gt;&lt;br /&gt;&amp;lt;property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/&amp;gt;&lt;br /&gt;&amp;lt;/system-properties&amp;gt;&lt;br /&gt;&amp;lt;/appengine-web-app&amp;gt;&lt;br /&gt;&lt;b&gt;&lt;span class="Apple-style-span" style="color: purple;"&gt;Step 9&lt;/span&gt;&lt;/b&gt;: 寫個 phpinfo.php 放在「\war」裡，就可以測試了。$_SESSION 使用起來也 OK :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-173885643744355366?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/173885643744355366/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=173885643744355366' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/173885643744355366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/173885643744355366'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/app-engine-php.html' title='在 App Engine 上執行 PHP'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_x0Mqwpk8Pw8/TA54XJ6TfnI/AAAAAAAAARQ/gGDTpr-GXHc/s72-c/New+Web+App+Project.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6937973673082976309</id><published>2010-06-03T11:38:00.000+08:00</published><updated>2010-06-03T11:38:04.117+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debugger'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='mdm'/><title type='text'>利用 MDM Zinc 做的 Flash 除錯工具「ZDebugger」</title><content type='html'>利用 LocalConnection 類別做的工具。使用時，先開啟 ZDebugger.exe，滙入 lin.shinder.mdmzinc.ZTracer類別，接著用 ZTracer.print(你的訊息)。&lt;br /&gt;下載：&lt;a href="http://www.riarock.net/qopsblog/2010/shinder_zdebugger.zip"&gt;含原始碼及執行檔的壓縮檔&lt;/a&gt;。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;ZDebugger&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.mdmzinc &lt;br /&gt;{&lt;br /&gt; import fl.controls.Button;&lt;br /&gt; import fl.controls.ComboBox;&lt;br /&gt; import fl.controls.TextArea;&lt;br /&gt; import fl.data.DataProvider;&lt;br /&gt; import flash.display.SimpleButton;&lt;br /&gt; import flash.display.Sprite;&lt;br /&gt; import flash.display.Stage;&lt;br /&gt; import flash.display.StageAlign;&lt;br /&gt; import flash.display.StageScaleMode;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.events.MouseEvent;&lt;br /&gt; import flash.net.LocalConnection;&lt;br /&gt; import flash.text.TextField;&lt;br /&gt; import flash.text.TextFormat;&lt;br /&gt; import mdm.*;&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * @author shinder.lin@gmail.com&lt;br /&gt;  * @date 2010/06&lt;br /&gt;  */&lt;br /&gt; public class ZDebugger extends Sprite&lt;br /&gt; {&lt;br /&gt;  public var info_txt:TextArea;&lt;br /&gt;  public var clear_btn:Button;&lt;br /&gt;  public var close_btn:Button;&lt;br /&gt;  public var size_cb:ComboBox;&lt;br /&gt;  &lt;br /&gt;  private var localConnection:LocalConnection;&lt;br /&gt;  private var textField:TextField;&lt;br /&gt;  private var myStage:Stage;&lt;br /&gt;  &lt;br /&gt;  public function ZDebugger() {&lt;br /&gt;   mdm.Application.init( this, mdmInit );&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function mdmInit():void {&lt;br /&gt;   myStage = this.stage;&lt;br /&gt;   myStage.scaleMode = StageScaleMode.NO_SCALE;&lt;br /&gt;   myStage.align = StageAlign.TOP_LEFT;&lt;br /&gt;   myStage.addEventListener(Event.RESIZE, stageResized);&lt;br /&gt;   &lt;br /&gt;   textField = info_txt.textField as TextField;&lt;br /&gt;   info_txt.setStyle("textFormat", new TextFormat("Arial", 16) );&lt;br /&gt;   size_cb.dataProvider = new DataProvider([16, 20, 24, 30, 36, 48, 60]);&lt;br /&gt;   &lt;br /&gt;   clear_btn.addEventListener(MouseEvent.CLICK, clear);&lt;br /&gt;   close_btn.addEventListener(MouseEvent.CLICK, close);&lt;br /&gt;   size_cb.addEventListener(Event.CHANGE, changeFontFormat);&lt;br /&gt;   &lt;br /&gt;            localConnection = new LocalConnection();&lt;br /&gt;            localConnection.client = this;&lt;br /&gt;   textField.text = "Please use this debugger console with [lin.shinder.mdmzinc.ZTracer]\n";&lt;br /&gt;   textField.appendText("ex: ZTracer.print( YOUR_MESSAGE )\n");&lt;br /&gt;            try {&lt;br /&gt;                localConnection.connect("ZDebugger");&lt;br /&gt;            } catch (error:ArgumentError) {&lt;br /&gt;                textField.appendText("Can't connect...the connection name 'ZDebugger' is already used by another SWF\n");&lt;br /&gt;            }&lt;br /&gt;  }&lt;br /&gt;  private function stageResized(event:Event):void {&lt;br /&gt;   info_txt.width = stage.stageWidth;&lt;br /&gt;   info_txt.height = stage.stageHeight - info_txt.y;&lt;br /&gt;   close_btn.x = stage.stageWidth - close_btn.width;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function print(msg:String):void {&lt;br /&gt;   textField.appendText(msg +"\n");&lt;br /&gt;   info_txt.verticalScrollPosition = info_txt.maxVerticalScrollPosition;&lt;br /&gt;   info_txt.validateNow();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function clear(event:Event=null):void {&lt;br /&gt;   textField.text = '';&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function changeFontFormat(event:Event=null):void {&lt;br /&gt;   var font:String = "Arial";&lt;br /&gt;   var size:int = int(size_cb.value);&lt;br /&gt;   info_txt.setStyle("textFormat", new TextFormat(font, size) );&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  private function close(event:MouseEvent):void {&lt;br /&gt;   var result = mdm.Dialogs.promptModal("Are you sure to close ZDebugger?", "yesno", "alert");&lt;br /&gt;   if (result) {&lt;br /&gt;    mdm.Application.exit();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;ZTracer&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.mdmzinc &lt;br /&gt;{&lt;br /&gt; import flash.net.LocalConnection;&lt;br /&gt; /**&lt;br /&gt;  * @author shinder.lin@gmail.com&lt;br /&gt;  * @date 2010/06&lt;br /&gt;  */&lt;br /&gt; public class ZTracer&lt;br /&gt; {&lt;br /&gt;  private static var localConnection:LocalConnection;&lt;br /&gt;  &lt;br /&gt;  public static function print(msg:String):void {&lt;br /&gt;   if (! localConnection) {&lt;br /&gt;    localConnection = new LocalConnection();&lt;br /&gt;   }&lt;br /&gt;   trace(msg);&lt;br /&gt;   localConnection.send("ZDebugger", "print", msg);&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;Sqlite: 在 MDM Zinc 中, 替 SQLite 除錯的工具&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.mdmzinc &lt;br /&gt;{&lt;br /&gt; import mdm.*;&lt;br /&gt; /**&lt;br /&gt;  * @author shinder.lin@gmail.com&lt;br /&gt;  * @date 2010/06&lt;br /&gt;  */&lt;br /&gt; public class Sqlite&lt;br /&gt; {&lt;br /&gt;  public static function fetchAssoc(query:String, tableName:String):Array {&lt;br /&gt;   var i:int, k:int;&lt;br /&gt;   var data:Array;&lt;br /&gt;   var obj:Object;&lt;br /&gt;   var returnData:Array = [];&lt;br /&gt;   &lt;br /&gt;   var columnNamesQuery:String = "PRAGMA table_info(" + tableName + ")";&lt;br /&gt;   mdm.Database.SQLite.runQuery( columnNamesQuery );&lt;br /&gt;   traceError("columnNamesQuery");&lt;br /&gt;   var columnNames:Array = [];&lt;br /&gt;   data = mdm.Database.SQLite.getData();&lt;br /&gt;   for (i = 0; i &lt; data.length; i++) {&lt;br /&gt;    columnNames.push( data[i][1] );&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   mdm.Database.SQLite.runQuery( query );&lt;br /&gt;   traceError("runQuery");&lt;br /&gt;   data = mdm.Database.SQLite.getData();&lt;br /&gt;   &lt;br /&gt;   for (i = 0; i &lt; data.length; i++) {&lt;br /&gt;    obj = { };&lt;br /&gt;    for (k=0; k &lt; data[i].length; k++) {&lt;br /&gt;     obj[ columnNames[k] ] = data[i][k];&lt;br /&gt;    }&lt;br /&gt;    returnData.push( obj );&lt;br /&gt;   }&lt;br /&gt;   return returnData;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public static function traceError(msg:String=""):void {&lt;br /&gt;   if ( mdm.Database.SQLite.error() ) {&lt;br /&gt;    ZTracer.instance.print( msg + ":" + mdm.Database.SQLite.errorDetails() );&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6937973673082976309?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6937973673082976309/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6937973673082976309' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6937973673082976309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6937973673082976309'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/06/mdm-zinc-flash-zdebugger.html' title='利用 MDM Zinc 做的 Flash 除錯工具「ZDebugger」'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-30971959306993027</id><published>2010-05-09T23:26:00.000+08:00</published><updated>2010-05-09T23:26:27.628+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='SQLite'/><title type='text'>AIR 不支援提供系統資料表 sqlite_master</title><content type='html'>Adobe AIR 不支援提供系統資料表 sqlite_master 和 sqlite_ 開頭的資料表，&lt;br /&gt;可以透過&amp;nbsp;&lt;a href="http://help.adobe.com/zh_TW/AS3LCR/Flash_10.0/flash/data/SQLConnection.html#loadSchema()" style="color: #0000cc; text-decoration: underline;"&gt;SQLConnection.loadSchema()&lt;/a&gt;&amp;nbsp;取得相關資料。&lt;br /&gt;&lt;br /&gt;Adobe AIR 這樣的做法有點討厭。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-30971959306993027?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/30971959306993027/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=30971959306993027' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/30971959306993027'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/30971959306993027'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/05/air-sqlitemaster.html' title='AIR 不支援提供系統資料表 sqlite_master'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-720034972110796851</id><published>2010-04-24T00:07:00.002+08:00</published><updated>2010-04-24T00:16:23.632+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AJAX'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Ajax Animator</title><content type='html'>&lt;a href="http://antimatter15.com/ajaxanimator/wave/"&gt;Ajax Animator&lt;/a&gt; 是個動畫編輯器, 顧名思義是用 Ajax 做的, 能用 JavaScript 做到這樣實在不容易~&lt;br /&gt;這種東西才能在 iPad 上跑 :P&lt;br /&gt;它也可以利用後台技術和 Flex SDK (或&amp;nbsp;&lt;a href="http://www.libming.org/"&gt;MING&lt;/a&gt;&amp;nbsp;)&amp;nbsp;生成 SWF&lt;br /&gt;其它非官方、開源、免費工具請參考 &lt;a href="http://www.flashmagazine.com/news/detail/open_source_and_free_development_tools_for_flash/"&gt;Open Source and free Development Tools for Flash&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-720034972110796851?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/720034972110796851/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=720034972110796851' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/720034972110796851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/720034972110796851'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/ajax-animator.html' title='Ajax Animator'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4929270591289237548</id><published>2010-04-23T00:40:00.001+08:00</published><updated>2010-04-24T00:09:07.370+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='XFL'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash CS5 支援的 XFL 格式</title><content type='html'>&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;XFL 的簡單介紹&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://twelvestone.com/forum_thread/view/40892"&gt;XFL - eXtensible Form Language Format first&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://twelvestone.com/forum_thread/view/40892"&gt;&lt;/a&gt;XFL 算是蠻新的格式, 在 Flash CS4 時就支援了, 但 CS4 只能開不能存或滙出。我用 CS5 beta 存 XFL，但在 CS4 卻沒辦法開，應該是格式有更新過。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;CS4 時 After Effects 可以滙出，再用 Flash 開&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://www.layersmagazine.com/exporting-xfl-fomrat-from-after-effects-to-flash.html"&gt;Exporting XFL Format from After Effects to Flash&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://www.layersmagazine.com/exporting-xfl-fomrat-from-after-effects-to-flash.html"&gt;&lt;/a&gt;下面這篇說明 XFL 的功能以及為什麼 Flypaper 很快就支援了&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://blog.flypaper.com/why-does-adobes-new-xfl-format-matter-and-why-is-flypaper-first-to-support-it/"&gt;Why Does Adobe’s ‘New’ XFL Format Matter and Why is Flypaper First to Support It?&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;重點來了，XFL 是 XML 格式不是 Binary 格式，Spec一定會公開，支援編輯、轉換的軟體也會變多，如此一來 Flash &amp;lt;-&amp;gt; HTML5 中間的隔閡是越來越小。Flash: Die-hard&lt;/div&gt;&lt;div&gt;:D&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;span class="Apple-style-span" style="font-size: 13px;"&gt;&lt;a href="http://blog.flypaper.com/why-does-adobes-new-xfl-format-matter-and-why-is-flypaper-first-to-support-it/"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4929270591289237548?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4929270591289237548/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4929270591289237548' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4929270591289237548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4929270591289237548'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/flash-cs5-xfl.html' title='Flash CS5 支援的 XFL 格式'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4265266397426460567</id><published>2010-04-21T16:06:00.000+08:00</published><updated>2010-04-21T16:06:16.298+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Picture'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>AS3 可載入超過 40 種圖片格式的工具</title><content type='html'>&lt;span class="Apple-style-span" style="color: #444444; font-family: 'Lucida Grande', 'Lucida Sans Unicode', Arial, Verdana, sans-serif; font-size: 13px; line-height: 20px;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;h1 class="noline" style="border-bottom-width: 0px; border-color: initial; border-left-width: 0px; border-right-width: 0px; border-style: initial; border-top-width: 0px; color: #757575; font-family: inherit; font-size: 40px; font-style: normal; font-weight: normal; letter-spacing: -0.02em; line-height: 1em; margin-bottom: 0px; margin-left: -0.05em; margin-right: 0px; margin-top: 0px; outline-color: initial; outline-style: initial; outline-width: 0px; padding-bottom: 10px; padding-left: 0px; padding-right: 0px; padding-top: 5px; vertical-align: baseline;"&gt;ZaaIL&lt;/h1&gt;&lt;br /&gt;&lt;a href="http://www.zaalabs.com/2010/04/introducing-zaail-40-image-format-support-for-flash/"&gt;http://www.zaalabs.com/2010/04/introducing-zaail-40-image-format-support-for-flash/&lt;/a&gt;&lt;br /&gt;open source&lt;br /&gt;&lt;a href="http://zaalabs.com/demo/TestZaaIL/srcview/index.html"&gt;http://zaalabs.com/demo/TestZaaIL/srcview/index.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4265266397426460567?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4265266397426460567/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4265266397426460567' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4265266397426460567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4265266397426460567'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/as3-40.html' title='AS3 可載入超過 40 種圖片格式的工具'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6725109262791767433</id><published>2010-04-16T23:02:00.001+08:00</published><updated>2010-04-18T00:04:15.413+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='mdm'/><title type='text'>MDM ZINC 3 雜記</title><content type='html'>最近使用 MDM ZINC 3 的雜記:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;使用 AS2 時，SWF 發佈的版本必須為 for Flash Player 8 (含) 以下。&lt;/li&gt;&lt;li&gt;AS2 類別檔使用到 mdm 時，宣告為 dynamic。&lt;/li&gt;&lt;li&gt;AS3 Flash document class 一定要在 constructor 內呼叫 domdm.Application.init()。&lt;/li&gt;&lt;li&gt;載入其它 SWF 時，記得在主要的 Flash Movie 的最前面下 mdm.Flash.setSWFDir()。&lt;/li&gt;&lt;li&gt;SQLite 無法存放中文，可以用 URL-encoded 解決（mdm 存入時不會自動轉換為 UTF-8）。&lt;/li&gt;&lt;li&gt;SQLite 開啟資料庫時，檔案會自動建立。&lt;/li&gt;&lt;li&gt;SQLite 判斷資料表是否存在用 "SELECT * FROM sqlite_master WHERE type='table' AND  name='DB_TABLE'"。&lt;/li&gt;&lt;li&gt;Firefox 的附加元件 SQLite Manager 相當好用。&lt;/li&gt;&lt;li&gt;中文輸入有問題，會變亂碼。&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6725109262791767433?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6725109262791767433/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6725109262791767433' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6725109262791767433'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6725109262791767433'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/mdm-zinc-3.html' title='MDM ZINC 3 雜記'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5167005864008963915</id><published>2010-04-12T14:30:00.000+08:00</published><updated>2010-04-12T14:30:17.746+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PageFlip'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash AS3 翻頁、翻書效果</title><content type='html'>這是個被問到爛的效果, 不過難得有 open source 又是 ActionScript 3 的版本&lt;br /&gt;&lt;a href="http://megazine.mightypirates.de/"&gt;http://megazine.mightypirates.de/&lt;/a&gt;&lt;br /&gt;使用前還是請看一下說明文件。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5167005864008963915?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5167005864008963915/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5167005864008963915' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5167005864008963915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5167005864008963915'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/flash-as3.html' title='Flash AS3 翻頁、翻書效果'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3866912968789334699</id><published>2010-04-09T15:22:00.001+08:00</published><updated>2010-04-09T15:27:42.116+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>JSON Formatter 用法</title><content type='html'>Frame Actions:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import lin.shinder.utils.JsonFormatter;&lt;br /&gt;input_txt.text='[{"name":"shinder", "num":"123"}, {"name":"dephne", "num":"124"}]';&lt;br /&gt;format_btn.addEventListener(MouseEvent.CLICK, formatClick);&lt;br /&gt;&lt;br /&gt;function formatClick(event) {&lt;br /&gt; var jf:JsonFormatter=new JsonFormatter(input_txt.text);&lt;br /&gt; output_txt.text = jf.result;&lt;br /&gt;}&lt;/pre&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;embed src="http://www.riarock.net/qopsblog/2010/testJsonFormatter.swf" quality="high" bgcolor="#ffffff" width="550" height="600" name="testJsonFormatter" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.adobe.com/go/getflashplayer_tw"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3866912968789334699?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3866912968789334699/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3866912968789334699' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3866912968789334699'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3866912968789334699'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/json-formatter_09.html' title='JSON Formatter 用法'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8281275028405821085</id><published>2010-04-09T15:06:00.001+08:00</published><updated>2010-04-09T15:07:17.086+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>JSON Formatter</title><content type='html'>可搭配 as3corelib 裡的 JSON 類別使用, 格式化 JSON 字串, 以方便給人閱讀。在這裡並不會檢查JSON 的格式是否正確。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.utils &lt;br /&gt;{&lt;br /&gt; /**&lt;br /&gt;  * ...&lt;br /&gt;  * @author shinder.lin&lt;br /&gt;  */&lt;br /&gt; public class JsonFormatter&lt;br /&gt; {&lt;br /&gt;  private var spaces:int;&lt;br /&gt;  private var spaceUnit:String = " ";&lt;br /&gt;  private var resultStr:String = "";&lt;br /&gt;  private var prevCh:String;&lt;br /&gt;  &lt;br /&gt;  public function JsonFormatter(str:String = null) {&lt;br /&gt;   if (str) {&lt;br /&gt;    findBracket( str );&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public function get result():String {&lt;br /&gt;   if ( resultStr.charAt(0) == "\n") {&lt;br /&gt;    resultStr = resultStr.slice(1);&lt;br /&gt;   }&lt;br /&gt;   return resultStr;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function findBracket(str:String):void {&lt;br /&gt;   var ch:String;&lt;br /&gt;   var leftStr:String;&lt;br /&gt;   var midStr:String;&lt;br /&gt;   var rightStr:String;&lt;br /&gt;&lt;br /&gt;   for (var i:int = 0; i &lt; str.length; i++) {&lt;br /&gt;    ch = str.charAt(i);&lt;br /&gt;&lt;br /&gt;    if ( ch == '[' || ch == '{' || ch == ',' ) {&lt;br /&gt;     leftStr = str.slice(0, i + 1);&lt;br /&gt;     rightStr = str.slice(i + 1);&lt;br /&gt;     break;&lt;br /&gt;    } else if ( ch == '}' || ch == ']' ) {&lt;br /&gt;     leftStr = str.slice(0, i);&lt;br /&gt;     midStr = str.slice(i, i+1);&lt;br /&gt;     rightStr = str.slice(i+1);&lt;br /&gt;     break;&lt;br /&gt;    } &lt;br /&gt;   }&lt;br /&gt;   if (leftStr == null) {&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   if (ch == ',' &amp;&amp; (prevCh=='}' || prevCh==']')) {&lt;br /&gt;    resultStr += leftStr;&lt;br /&gt;   } else {&lt;br /&gt;    resultStr += getSpaces() + leftStr;&lt;br /&gt;   }&lt;br /&gt;   switch(ch) {&lt;br /&gt;    case '[':&lt;br /&gt;     spaces ++;&lt;br /&gt;     break;&lt;br /&gt;    case '{':&lt;br /&gt;     spaces ++;&lt;br /&gt;     break;&lt;br /&gt;    case '}':&lt;br /&gt;     spaces --;&lt;br /&gt;     break;&lt;br /&gt;    case ']':&lt;br /&gt;     spaces --;&lt;br /&gt;     break;&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   if (midStr != null) {&lt;br /&gt;    resultStr += getSpaces() + midStr;&lt;br /&gt;   }&lt;br /&gt;   prevCh = ch;&lt;br /&gt;   &lt;br /&gt;   if(rightStr.length&gt;1) {&lt;br /&gt;    findBracket( rightStr );&lt;br /&gt;   } else {&lt;br /&gt;    resultStr += "\n" + rightStr;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function getSpaces():String {&lt;br /&gt;   var str:String = "\n";&lt;br /&gt;   for (var i:int = 0; i &lt; spaces; i++){&lt;br /&gt;    str += spaceUnit;&lt;br /&gt;   }&lt;br /&gt;   return str;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8281275028405821085?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8281275028405821085/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8281275028405821085' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8281275028405821085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8281275028405821085'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/04/json-formatter.html' title='JSON Formatter'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2624777864014180825</id><published>2010-03-29T11:40:00.000+08:00</published><updated>2010-03-29T11:40:40.436+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>寫了個方便處理 FacebookSession 的類別</title><content type='html'>承上一篇「&lt;a href="http://qops.blogspot.com/2010/03/flash-builder-4-facebook-apps.html"&gt;Flash Builder 4 寫 Facebook Apps&lt;/a&gt;」，有自行測試者應該都會覺得在開發 Facebook appa上，除錯顯得很麻煩。必須先把 AppKey 和 AppSecret 填入程式中，測試完，拿掉 AppKey 和 AppSecret，編譯再上傳測試，中間會來來回回很多次。時間應該浪費在美好的事物上，玩 Games 應該比寫 Codes 美好 :P。&lt;br /&gt;可以將 AppKey 和 AppSecret 放到一個檔案裡，再載入。URL-encoded 的文字檔是個選擇，為了讓本篇看起來有深度點(誤)，在此採用SWF。若要更有深度可以用ZIP、DOC...，也可以修改副檔名偽裝一下。&lt;br /&gt;若可以載入 Key 檔，表示是在開發過程，必須連一下 Facebook 取得 Session。若無法載入 Key 檔，表示己經發佈了。&lt;br /&gt;&lt;a name='more'&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Step 1&lt;/span&gt;: 製作 Key 檔，如下的類別檔，用FlashDevelop搭Flex編譯成SWF&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package &lt;br /&gt;{&lt;br /&gt; import flash.display.Sprite;&lt;br /&gt; public class FbastutorialKey extends Sprite&lt;br /&gt; {&lt;br /&gt;  public static var appapikey:String = '::AppKey::';&lt;br /&gt;  public static var appsecret:String = '::AppSecret::';&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Step 2&lt;/span&gt;: 將 AppKeyLoader 和 SessionGetter 複製到專案裡。AppKeyLoader 是載入 Key 檔，若有取得 Keys，丟出個 complete 事件；若沒取得，丟出個 ioError 事件。SessionGetter會使用AppKeyLoader，依 Keys 取得的方式，做不用的處理，丟出個 connect 事件。接到 connect 事件再去拿 facebookSession 或 facebook 物件即可。&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.facebook.utils&lt;br /&gt;{&lt;br /&gt; import flash.display.Loader;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.events.EventDispatcher;&lt;br /&gt; import flash.events.IOErrorEvent;&lt;br /&gt; import flash.net.URLRequest;&lt;br /&gt; import flash.system.ApplicationDomain;&lt;br /&gt; import flash.system.LoaderContext;&lt;br /&gt; import flash.utils.getDefinitionByName;&lt;br /&gt;&lt;br /&gt; [Event(name="complete", type="flash.events.Event")]&lt;br /&gt; [Event(name="ioError", type="flash.events.IOErrorEvent")]&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * ...&lt;br /&gt;  * @author shinder.lin&lt;br /&gt;  * @date 2010/03/28&lt;br /&gt;  */&lt;br /&gt; public class AppKeyLoader extends EventDispatcher&lt;br /&gt; {&lt;br /&gt;  private var loader:Loader;&lt;br /&gt;  private var loaderContext:LoaderContext;&lt;br /&gt;  private var request:URLRequest;&lt;br /&gt;  private var keyClassName:String;&lt;br /&gt;  &lt;br /&gt;  private var _appapikey:String;&lt;br /&gt;  private var _appsecret:String;&lt;br /&gt;  private var _loaded:Boolean;&lt;br /&gt;  &lt;br /&gt;  public function AppKeyLoader(keyClassName:String) {&lt;br /&gt;   this.keyClassName = keyClassName;&lt;br /&gt;   loader = new Loader;&lt;br /&gt;   loaderContext = new LoaderContext;&lt;br /&gt;   loaderContext.applicationDomain = ApplicationDomain.currentDomain;&lt;br /&gt;   &lt;br /&gt;   request = new URLRequest(keyClassName + ".swf");&lt;br /&gt;   loader.load(request, loaderContext);&lt;br /&gt;   loader.contentLoaderInfo.addEventListener(Event.COMPLETE, eventHandler);&lt;br /&gt;   loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, eventHandler);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function eventHandler(event:Event):void {&lt;br /&gt;   if (event.type == Event.COMPLETE) {&lt;br /&gt;    var KeyClass:Class = getDefinitionByName(keyClassName) as Class;&lt;br /&gt;    _appapikey = KeyClass.appapikey;&lt;br /&gt;    _appsecret = KeyClass.appsecret;&lt;br /&gt;    _loaded = true;&lt;br /&gt;   } else&lt;br /&gt;   if (event.type == IOErrorEvent.IO_ERROR) {&lt;br /&gt;    _loaded = false;&lt;br /&gt;   }&lt;br /&gt;   dispatchEvent(event);&lt;br /&gt;  }&lt;br /&gt;  public function get appapikey():String {&lt;br /&gt;   return _appapikey;&lt;br /&gt;  }&lt;br /&gt;  public function get appsecret():String {&lt;br /&gt;   return _appsecret;&lt;br /&gt;  }&lt;br /&gt;  public function get loaded():Boolean {&lt;br /&gt;   return _loaded;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.facebook.utils&lt;br /&gt;{&lt;br /&gt; import com.facebook.Facebook;&lt;br /&gt; import com.facebook.events.FacebookEvent;&lt;br /&gt; import com.facebook.utils.FacebookSessionUtil;&lt;br /&gt; &lt;br /&gt; import flash.display.LoaderInfo;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.events.EventDispatcher;&lt;br /&gt; import flash.events.IOErrorEvent;&lt;br /&gt; import flash.net.URLRequest;&lt;br /&gt; import flash.net.navigateToURL;&lt;br /&gt; &lt;br /&gt; import mx.controls.Alert;&lt;br /&gt; import mx.core.FlexGlobals;&lt;br /&gt; &lt;br /&gt; import spark.components.Application;&lt;br /&gt; &lt;br /&gt; [Event(name="connect", type="com.facebook.events.FacebookEvent")]&lt;br /&gt; &lt;br /&gt; /**&lt;br /&gt;  * ...&lt;br /&gt;  * @author shinder.lin&lt;br /&gt;  * @date 2010/03/28&lt;br /&gt;  */&lt;br /&gt; public class SessionGetter extends EventDispatcher&lt;br /&gt; {&lt;br /&gt;  private var session:FacebookSessionUtil;&lt;br /&gt;  private var appKeyLoader:AppKeyLoader;&lt;br /&gt;  private var application:Application;&lt;br /&gt;  private var loaderInfo:LoaderInfo;&lt;br /&gt;  &lt;br /&gt;  public function SessionGetter(keyClassName:String) {&lt;br /&gt;   application = Application(FlexGlobals.topLevelApplication);&lt;br /&gt;   loaderInfo = application.loaderInfo;&lt;br /&gt;   &lt;br /&gt;   appKeyLoader = new AppKeyLoader( keyClassName );&lt;br /&gt;   appKeyLoader.addEventListener(Event.COMPLETE, getSessionBySWFKey);&lt;br /&gt;   appKeyLoader.addEventListener(IOErrorEvent.IO_ERROR, getSessionByURLKey);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function getSessionBySWFKey(event:Event):void {&lt;br /&gt;   var appapikey:String = appKeyLoader.appapikey;&lt;br /&gt;   var appsecret:String = appKeyLoader.appsecret;&lt;br /&gt;   session = new FacebookSessionUtil(appapikey, appsecret, loaderInfo);&lt;br /&gt;   session.addEventListener(FacebookEvent.WAITING_FOR_LOGIN, whenWaitingForLogin);&lt;br /&gt;   session.addEventListener(FacebookEvent.CONNECT, onSessionConnect);&lt;br /&gt;   session.login();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function whenWaitingForLogin(event:FacebookEvent):void {&lt;br /&gt;   var alert:Alert = Alert.show("登入 Facebook 後點按 OK！","登入");&lt;br /&gt;   alert.addEventListener(Event.CLOSE, onAlertClosed);&lt;br /&gt;  }&lt;br /&gt;  private function onAlertClosed(event:Event):void {&lt;br /&gt;   session.validateLogin();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function getSessionByURLKey(event:Event):void {&lt;br /&gt;   var appapikey:String = loaderInfo.parameters.fb_sig_api_key;&lt;br /&gt;   var appsecret:String = null;&lt;br /&gt;   session = new FacebookSessionUtil(appapikey, appsecret, loaderInfo);&lt;br /&gt;   session.addEventListener(FacebookEvent.WAITING_FOR_LOGIN, whenWaitingForLogin);&lt;br /&gt;   session.addEventListener(FacebookEvent.CONNECT, onSessionConnect);&lt;br /&gt;   &lt;br /&gt;   if(loaderInfo.parameters.fb_sig_added == true){&lt;br /&gt;    session.verifySession();&lt;br /&gt;   } else if(loaderInfo.parameters.fb_sig_added == false){&lt;br /&gt;    navigateToURL(new URLRequest("http://www.facebook.com/login.php?api_key="+appapikey),"_top");&lt;br /&gt;   } else {&lt;br /&gt;    session.login();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function onSessionConnect(event:FacebookEvent):void {&lt;br /&gt;   dispatchEvent(event);&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function get facebookSession():FacebookSessionUtil{&lt;br /&gt;   return session;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function get facebook():Facebook{&lt;br /&gt;   return session.facebook;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Step 3&lt;/span&gt;: 接著使用起來就很方便了。&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;private function init():void {&lt;br /&gt;    sessionGetter = new SessionGetter("FbastutorialKey");&lt;br /&gt;    sessionGetter.addEventListener(FacebookEvent.CONNECT, onSessionConnect);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;private function onSessionConnect(event:FacebookEvent):void {&lt;br /&gt;    facebook = sessionGetter.facebook;&lt;br /&gt;    var call:FacebookCall = facebook.post( new GetFriends() );&lt;br /&gt;    call.addEventListener(FacebookEvent.COMPLETE, onGetFriendsComplete);&lt;br /&gt;}&lt;/pre&gt;原始檔同樣&lt;a href="http://apps.facebook.com/fbastutorial/"&gt;在此&lt;/a&gt;按右鍵→View Source。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: red;"&gt;Step 4&lt;/span&gt;: 發佈時，記得不要把 Key 檔放上去。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2624777864014180825?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2624777864014180825/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2624777864014180825' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2624777864014180825'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2624777864014180825'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/03/facebooksession.html' title='寫了個方便處理 FacebookSession 的類別'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4631001552509893032</id><published>2010-03-26T11:10:00.008+08:00</published><updated>2010-03-26T12:07:32.289+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Facebook'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash Builder 4 寫 Facebook Apps</title><content type='html'>Adobe Developer Center 上　Jeanette Stallons　的兩篇 Quick Start 是必看的文章：&lt;a href="http://www.adobe.com/devnet/facebook/articles/first_flex_facebook_web_app_pt1.html"&gt;Build  and test locally&lt;/a&gt;、&lt;a href="http://www.adobe.com/devnet/facebook/articles/first_flex_facebook_web_app_pt2.html"&gt;Deploy  on Facebook&lt;/a&gt;。熱騰騰的 Flash Builder 4 當然要好好利用一下 :D&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 1:&lt;/span&gt; 先要有網站空間，使用免費的也行。設定一個空目錄，如：「http://www.riarock.net/fbapps/fbastutorial/」給 Facebook App 使用。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 2:&lt;/span&gt; 登入 Facebook 並在「http://www.facebook.com/developers/」建立新的應用程式。其中必填的項目為：&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;基本資料→應用程式名稱&lt;/span&gt; :: 就是應用程式名稱，不能用 Face、FB 等混淆視聽的字眼，所以在此用了 Footbook。&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;畫布→畫布頁面網址&lt;/span&gt; :: 如「http://apps.facebook.com/fbastutorial/」。&lt;br /&gt;畫布→Canvas Callback URL :: 在這個例子設定為「http://www.riarock.net/fbapps/fbastutorial/」。&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;畫布→呈現方法&lt;/span&gt; :: 設定使用「Iframe」。&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;聯外通→聯外通網址&lt;/span&gt; ::  在這個例子設定為「http://www.riarock.net/fbapps/fbastutorial/」。&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;進階→沙盒模式&lt;/span&gt; :: 測試時先設定為「啟用」。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 3:&lt;/span&gt; 安裝好 Flash Builder 4 之後，開一個新專案，命名為 fbastutorial。將 &lt;a href="http://code.google.com/p/facebook-actionscript-api/"&gt;Facebook_library_v3.4_flex.swc&lt;/a&gt; 放到專案的 libs 目錄。 預設的 Application 為 fbastutorial.mxml，不寫程式，直接執行。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 4:&lt;/span&gt; 將產生的 bin-debug/fbastutorial.html 複製到 src/index.html。並在指定的位置增加下面標起來的程式碼，用來取得 Facebook 給的 GET 參數。&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var flashvars = {}; // ← 找到這一行，增加下面的程式碼&lt;br /&gt;// *** START 增加的部份 ***&lt;br /&gt;var strHref = window.location.href;&lt;br /&gt;if ( strHref.indexOf("?") &amp;gt; -1 ) {&lt;br /&gt;  var strQueryString = strHref.substr(strHref.indexOf("?")+1);&lt;br /&gt;  var aQueryString = strQueryString.split("&amp;amp;");&lt;br /&gt;  for ( var iParam = 0; iParam &amp;lt; aQueryString.length; iParam++ ) {&lt;br /&gt;      var aParam = aQueryString[iParam].split("=");&lt;br /&gt;      flashvars[aParam[0]] = aParam[1];&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;// *** END 增加的部份 ***&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 5:&lt;/span&gt; fbastutorial.mxml 的內容如下。&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;s:Application xmlns:fx=&amp;quot;http://ns.adobe.com/mxml/2009&amp;quot; &lt;br /&gt;      xmlns:s=&amp;quot;library://ns.adobe.com/flex/spark&amp;quot; &lt;br /&gt;      xmlns:mx=&amp;quot;library://ns.adobe.com/flex/mx&amp;quot; minWidth=&amp;quot;840&amp;quot; minHeight=&amp;quot;500&amp;quot;&lt;br /&gt;      applicationComplete=&amp;quot;init()&amp;quot;&lt;br /&gt; viewSourceURL=&amp;quot;srcview/index.html&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;!-- *** 注意：這裡是用 applicationComplete，不是用 creationComplete *** --&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;fx:Script&amp;gt;&lt;br /&gt;  &amp;lt;![CDATA[&lt;br /&gt;   import com.facebook.Facebook;&lt;br /&gt;   import com.facebook.commands.friends.GetFriends;&lt;br /&gt;   import com.facebook.commands.users.GetInfo;&lt;br /&gt;   import com.facebook.data.friends.FriendsCollection;&lt;br /&gt;   import com.facebook.data.friends.GetFriendsData;&lt;br /&gt;   import com.facebook.data.users.FacebookUser;&lt;br /&gt;   import com.facebook.data.users.FacebookUserCollection;&lt;br /&gt;   import com.facebook.data.users.GetInfoData;&lt;br /&gt;   import com.facebook.events.FacebookEvent;&lt;br /&gt;   import com.facebook.net.FacebookCall;&lt;br /&gt;   import com.facebook.utils.FacebookSessionUtil;&lt;br /&gt;   &lt;br /&gt;   import mx.controls.Image;&lt;br /&gt;   &lt;br /&gt;   private var session:FacebookSessionUtil&lt;br /&gt;   private var facebook:Facebook;&lt;br /&gt;   private var fbUser:FacebookUser;&lt;br /&gt;   private var dictionary:Dictionary;&lt;br /&gt;   &lt;br /&gt;   private function init():void {&lt;br /&gt;    // *** 一開始測試時可以先填入 API Key 和　Application Secret&lt;br /&gt;    //session = new FacebookSessionUtil(&amp;quot;&amp;lt;API Key&amp;gt;&amp;quot;, &amp;quot;&amp;lt;Application Secret&amp;gt;&amp;quot;, loaderInfo);&lt;br /&gt;    session = new FacebookSessionUtil(loaderInfo.parameters.fb_sig_api_key, null, loaderInfo);&lt;br /&gt;    // 取得 Facebook Session，有 Session 才有權使用 Facebook API&lt;br /&gt;    facebook = session.facebook;&lt;br /&gt;    // 取得 Facebook Session 並連結之後，呼叫 onSessionConnect 方法&lt;br /&gt;    session.addEventListener(FacebookEvent.CONNECT, onSessionConnect);&lt;br /&gt;    &lt;br /&gt;    if(loaderInfo.parameters.fb_sig_added == true){&lt;br /&gt;     // 有登入時，呼叫核對 Session，OK的話發出 CONNECT 事件&lt;br /&gt;     session.verifySession();&lt;br /&gt;    } else if(loaderInfo.parameters.fb_sig_added == false){&lt;br /&gt;     // 沒登入時&lt;br /&gt;     navigateToURL(new URLRequest(&amp;quot;http://www.facebook.com/login.php?api_key=&amp;quot;+loaderInfo.parameters.fb_sig_api_key),&amp;quot;_top&amp;quot;);&lt;br /&gt;    } else {&lt;br /&gt;     // 沒取得資料時&lt;br /&gt;     session.login();&lt;br /&gt;     btnLogin.visible = true;&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   private function onSessionConnect(event:FacebookEvent):void {&lt;br /&gt;    // 呼叫取得朋友資料&lt;br /&gt;    var call:FacebookCall = facebook.post( new GetFriends() );&lt;br /&gt;    // 取得朋友資料之後，執行 onGetFriendsComplete&lt;br /&gt;    call.addEventListener(FacebookEvent.COMPLETE, onGetFriendsComplete);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   private function onGetFriendsComplete(event:FacebookEvent):void {&lt;br /&gt;    // 呼叫時用 GetFriends，取得時用 GetFriendsData&lt;br /&gt;    var friendsData:GetFriendsData = event.data as GetFriendsData;&lt;br /&gt;    var friends:FacebookUserCollection = friendsData.friends;&lt;br /&gt;    // 將朋友的 ID 放入 uids 陣列&lt;br /&gt;    var uids:Array = [];&lt;br /&gt;    for(var i:int=0; i&amp;lt; friends.length; i++) {&lt;br /&gt;     var f:FacebookUser = friends.getItemAt(i) as FacebookUser;&lt;br /&gt;     uids.push(f.uid);&lt;br /&gt;    }&lt;br /&gt;    // GetFriends 只能取得朋友的 uid，必須呼叫 GetInfo 才能取得朋友資料&lt;br /&gt;    var call:FacebookCall = facebook.post(&lt;br /&gt;     // 設定要取得的資料項&lt;br /&gt;     new GetInfo(uids, [&amp;quot;name&amp;quot;, &amp;quot;pic_square&amp;quot;])&lt;br /&gt;    );&lt;br /&gt;    call.addEventListener(FacebookEvent.COMPLETE, onGetFriendsAttr);&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   private function onGetFriendsAttr(event:FacebookEvent):void {&lt;br /&gt;    // 呼叫時用 GetInfo，取得時用 GetInfoData&lt;br /&gt;    var getInfoData:GetInfoData = event.data as GetInfoData;&lt;br /&gt;    var userCollection:FacebookUserCollection = getInfoData.userCollection;&lt;br /&gt;    dictionary = new Dictionary();&lt;br /&gt;    // 一一取出朋友資料&lt;br /&gt;    for(var i:int=0; i&amp;lt;userCollection.length; i++) {&lt;br /&gt;     var usr:FacebookUser = userCollection.getItemAt(i) as FacebookUser;&lt;br /&gt;     var img:Image = new Image();&lt;br /&gt;     // 沒有大頭貼時用預設的圖&lt;br /&gt;     if(! usr.pic_square) {&lt;br /&gt;      img.source = 'http://static.ak.fbcdn.net/pics/q_silhouette.gif';&lt;br /&gt;     } else {&lt;br /&gt;      img.source = usr.pic_square;&lt;br /&gt;     }&lt;br /&gt;     img.toolTip = usr.name;&lt;br /&gt;     img.buttonMode = true;&lt;br /&gt;     // 使用字典以方便用物件取得字串&lt;br /&gt;     dictionary[img] = usr.uid;&lt;br /&gt;     img.addEventListener(MouseEvent.CLICK,onImageClick);&lt;br /&gt;     tilesPic.addElement( img );&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;   private function onImageClick(event:MouseEvent):void {&lt;br /&gt;    var img:Image = event.currentTarget as Image;&lt;br /&gt;    navigateToURL(new URLRequest(&amp;quot;http://www.facebook.com/profile.php?id=&amp;quot;+dictionary[img]),&amp;quot;_blank&amp;quot;);&lt;br /&gt;   }&lt;br /&gt;  ]]&amp;gt;&lt;br /&gt; &amp;lt;/fx:Script&amp;gt;&lt;br /&gt; &lt;br /&gt; &amp;lt;s:Button x=&amp;quot;10&amp;quot; y=&amp;quot;10&amp;quot; label=&amp;quot;點按登入 Facebook&amp;quot; id=&amp;quot;btnLogin&amp;quot;&lt;br /&gt;     visible=&amp;quot;false&amp;quot; click=&amp;quot;session.validateLogin()&amp;quot;/&amp;gt;&lt;br /&gt; &amp;lt;s:Scroller x=&amp;quot;30&amp;quot; y=&amp;quot;30&amp;quot; width=&amp;quot;800&amp;quot; height=&amp;quot;450&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;s:TileGroup width=&amp;quot;100%&amp;quot; height=&amp;quot;100%&amp;quot; clipAndEnableScrolling=&amp;quot;true&amp;quot; id=&amp;quot;tilesPic&amp;quot;&amp;gt;&lt;br /&gt;  &amp;lt;/s:TileGroup&amp;gt;&lt;br /&gt; &amp;lt;/s:Scroller&amp;gt;&lt;br /&gt; &lt;br /&gt;&amp;lt;/s:Application&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 6:&lt;/span&gt; 發佈，上傳至「http://www.riarock.net/fbapps/fbastutorial/」測試。&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;Step 7:&lt;/span&gt; 範例在「&lt;a href="http://apps.facebook.com/fbastutorial/"&gt;http://apps.facebook.com/fbastutorial/&lt;/a&gt;」，於 swf 上按右鍵選「View Source」就可以看到原始檔，並下載專案檔了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4631001552509893032?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4631001552509893032/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4631001552509893032' title='5 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4631001552509893032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4631001552509893032'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/03/flash-builder-4-facebook-apps.html' title='Flash Builder 4 寫 Facebook Apps'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6289231353895219054</id><published>2010-03-26T10:04:00.007+08:00</published><updated>2010-04-11T02:11:52.675+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Books'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Remoting'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>新作：FLASH+PHP資料庫網站開發設計</title><content type='html'>個人新作「FLASH+PHP資料庫網站開發設計」出版了，感謝舊雨新知的支持！&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/_x0Mqwpk8Pw8/S6wYGlKvG-I/AAAAAAAAAQU/L2Tben5yp54/s1600/NE20289_flash_php.jpg" onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}"&gt;&lt;img alt="" border="0" id="BLOGGER_PHOTO_ID_5452759750174252002" src="http://4.bp.blogspot.com/_x0Mqwpk8Pw8/S6wYGlKvG-I/AAAAAAAAAQU/L2Tben5yp54/s400/NE20289_flash_php.jpg" style="cursor: pointer; display: block; height: 200px; margin: 0px auto 10px; text-align: center; width: 148px;" /&gt;&lt;/a&gt;&lt;br /&gt;個人新作「FLASH+PHP資料庫網站開發設計」出版&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/2010/flash_php_ch06_p19.pdf"&gt;&lt;span style="color: #cc0000;"&gt;試讀「第6章」18頁&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.drmaster.com.tw/Bookinfo.asp?BookID=NE20289"&gt;出版公司書籍介紹&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.books.com.tw/exep/prod/booksfile.php?item=0010464313"&gt;博客來&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.kingstone.com.tw/book/book_page.asp?kmcode=2013120108813"&gt;金石堂&lt;/a&gt;&lt;br /&gt;建議：老話一句，一本書是無法滿足所有人需求的，&lt;span style="color: #cc0000;"&gt;請先到實體書店翻閱&lt;/span&gt;，符合需求再購買！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6289231353895219054?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6289231353895219054/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6289231353895219054' title='16 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6289231353895219054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6289231353895219054'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/03/flashphp.html' title='新作：FLASH+PHP資料庫網站開發設計'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_x0Mqwpk8Pw8/S6wYGlKvG-I/AAAAAAAAAQU/L2Tben5yp54/s72-c/NE20289_flash_php.jpg' height='72' width='72'/><thr:total>16</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6375146413751101714</id><published>2010-03-13T23:57:00.003+08:00</published><updated>2010-03-14T00:08:42.430+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash Remoting'/><category scheme='http://www.blogger.com/atom/ns#' term='AMF'/><title type='text'>AMFPHP 1.9</title><content type='html'>AMFPHP 終於在 2010/02/02 釋出 1.9 正式版, 原本以為開發主角換人後, 專案應該會掛掉, 顯然 AMFPHP 還活著 :P。&lt;br /&gt;1.9 正式版的 gateway.php 中, 明顯不同在 PRODUCTION_SERVER 預設為 true, beta 版預設為 false。&lt;br /&gt;PRODUCTION_SERVER 設為 true 時, 在 Flash IDE 測試, 會發生 NetConnection.Call.BadVersion 的錯誤, 但是發佈後卻又正常。應該是 Debug 版 Flash player 造成的問題。&lt;br /&gt;所以使用 Flash IDE 搭 AMFPHP 時, PRODUCTION_SERVER 請設為 false。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6375146413751101714?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6375146413751101714/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6375146413751101714' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6375146413751101714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6375146413751101714'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/03/amfphp-19.html' title='AMFPHP 1.9'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5083003992894108170</id><published>2010-02-22T15:02:00.002+08:00</published><updated>2010-02-22T15:16:38.838+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Video'/><category scheme='http://www.blogger.com/atom/ns#' term='FLV'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Video 保護</title><content type='html'>目前 FLV 的保護主要由 FMS 下手, 但是用 FMS 有諸多缺點。&lt;br /&gt;Adobe AIR 2 將提供 DRM 的功能, 但是需搭配 Flash Access 2 使用。依據之前的經驗, Flash Access 2 應該不會便宜到哪去, 而且 Video 的傳輸頻寬也是問題。&lt;br /&gt;&lt;br /&gt;在簡單保護方面(防外行), NetConnection 和 NetStream 實在包的太「好」了, 沒有下手的空隙。如果使用 AIR 2, 可以用 ServerSocket 弄個 HTTP Server 來傳 Video 資料。這個時候, Video 就可以編碼(隨君高興)存成檔案, 在 Server 讀資料送出時, 可以自行解碼, 再送給 Client。這樣做的缺點是效能會略差, 而且要想辦法藏好解碼的 KEY(可以透過登入機制再拐個彎, 有心要找的人還是可以找到)。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5083003992894108170?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5083003992894108170/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5083003992894108170' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5083003992894108170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5083003992894108170'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2010/02/video.html' title='Video 保護'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5628111703277687952</id><published>2009-12-24T11:56:00.003+08:00</published><updated>2009-12-24T12:07:35.442+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FMS'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><title type='text'>Flash Media Server 加上 JSON 功能</title><content type='html'>1) 到 http://www.json.org/ 找 ActionScript 1 的版本&lt;br /&gt;2) 修改其中 JSON.error 的部份, 存成 JSON.asc&lt;br /&gt;3) 將檔案放到 /scriptlib 或 application目錄&lt;br /&gt;4) 在 main.asc 裡用「load( "JSON.asc" );」&lt;br /&gt;&lt;br /&gt;修改後的 code:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;/*&lt;br /&gt;Copyright (c) 2005 JSON.org&lt;br /&gt;&lt;br /&gt;Permission is hereby granted, free of charge, to any person obtaining a copy&lt;br /&gt;of this software and associated documentation files (the "Software"), to deal&lt;br /&gt;in the Software without restriction, including without limitation the rights&lt;br /&gt;to use, copy, modify, merge, publish, distribute, sublicense, and/or sell&lt;br /&gt;copies of the Software, and to permit persons to whom the Software is&lt;br /&gt;furnished to do so, subject to the following conditions:&lt;br /&gt;&lt;br /&gt;The Software shall be used for Good, not Evil.&lt;br /&gt;&lt;br /&gt;THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR&lt;br /&gt;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,&lt;br /&gt;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE&lt;br /&gt;AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER&lt;br /&gt;LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,&lt;br /&gt;OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE&lt;br /&gt;SOFTWARE.&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;/*&lt;br /&gt;Ported to Actionscript May 2005 by Trannie Carter ,&lt;br /&gt;wwww.designvox.com&lt;br /&gt;&lt;br /&gt;Ported to Actionscript 1 May 2006 by Malte Ubl ,&lt;br /&gt;http://joose-js.blogspot.com&lt;br /&gt;&lt;br /&gt;2006-11-18: Fixed assumption that an empty string evaluates to false in boolean &lt;br /&gt;context that is wrong in Flash 8 an later.&lt;br /&gt;&lt;br /&gt;2007-04-08: Fixed bad behavior with switch statements when publishing to Flash 6 from Flash MX.&lt;br /&gt;Report and Patch by Dan Wich &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Updated 2007-04-08&lt;br /&gt;&lt;br /&gt;USAGE:&lt;br /&gt;   var o = JSON.parse(jsonStr);&lt;br /&gt;   var s = JSON.stringify(obj);&lt;br /&gt;   &lt;br /&gt;   // If there is an error, the method calls _root.debug("Error message...")&lt;br /&gt;   // Override JSON.error for the desired behaviour&lt;br /&gt;   &lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;   JSON = new Object();&lt;br /&gt;   // shinder.lin modified 2009-12-24&lt;br /&gt;   JSON.error = function(msg) {&lt;br /&gt;        JSON.error_occured = true;&lt;br /&gt;  trace(msg); &lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   JSON.stringify = function (arg) {&lt;br /&gt;       var c, i, l, s = '', v;&lt;br /&gt;       JSON.error_occured = false;&lt;br /&gt;&lt;br /&gt;       switch (typeof arg) {&lt;br /&gt;       case 'object':&lt;br /&gt;           if (arg) {&lt;br /&gt;               if (arg instanceof Array) {&lt;br /&gt;                   for (i = 0; i &lt; arg.length; ++i) {&lt;br /&gt;                       v = JSON.stringify(arg[i]);&lt;br /&gt;                       if (s != '') {&lt;br /&gt;                           s += ',';&lt;br /&gt;                       }&lt;br /&gt;                       s += v;&lt;br /&gt;                   }&lt;br /&gt;                   return '[' + s + ']';&lt;br /&gt;               } else if (typeof arg.toString != 'undefined') {&lt;br /&gt;                   for (i in arg) {&lt;br /&gt;                       v = arg[i];&lt;br /&gt;                       if (typeof v != 'undefined' &amp;&amp; typeof v != 'function') {&lt;br /&gt;                           v = JSON.stringify(v);&lt;br /&gt;                           if (s != '') {&lt;br /&gt;                               s += ',';&lt;br /&gt;                           }&lt;br /&gt;                           s += JSON.stringify(i) + ':' + v;&lt;br /&gt;                       }&lt;br /&gt;                   }&lt;br /&gt;                   return '{' + s + '}';&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           return 'null';&lt;br /&gt;       case 'number':&lt;br /&gt;           return isFinite(arg) ? String(arg) : 'null';&lt;br /&gt;       case 'string':&lt;br /&gt;           l = arg.length;&lt;br /&gt;           s = '"';&lt;br /&gt;           for (i = 0; i &lt; l; i += 1) {&lt;br /&gt;               c = arg.charAt(i);&lt;br /&gt;               if (c &gt;= ' ') {&lt;br /&gt;                   if (c == '\\' || c == '"') {&lt;br /&gt;                       s += '\\';&lt;br /&gt;                   }&lt;br /&gt;                   s += c;&lt;br /&gt;               } else {&lt;br /&gt;                   switch (c) {&lt;br /&gt;                       case '\b':&lt;br /&gt;                           s += '\\b';&lt;br /&gt;                           break;&lt;br /&gt;                       case '\f':&lt;br /&gt;                           s += '\\f';&lt;br /&gt;                           break;&lt;br /&gt;                       case '\n':&lt;br /&gt;                           s += '\\n';&lt;br /&gt;                           break;&lt;br /&gt;                       case '\r':&lt;br /&gt;                           s += '\\r';&lt;br /&gt;                           break;&lt;br /&gt;                       case '\t':&lt;br /&gt;                           s += '\\t';&lt;br /&gt;                           break;&lt;br /&gt;                       default:&lt;br /&gt;                           c = c.charCodeAt();&lt;br /&gt;                           s += '\\u00' + Math.floor(c / 16).toString(16) +&lt;br /&gt;                               (c % 16).toString(16);&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           return s + '"';&lt;br /&gt;       case 'boolean':&lt;br /&gt;           return String(arg);&lt;br /&gt;       default:&lt;br /&gt;           return 'null';&lt;br /&gt;       }&lt;br /&gt;   }&lt;br /&gt;   &lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;   JSON.parse = function (text) {&lt;br /&gt;       var at = 0;&lt;br /&gt;       var ch = ' ';&lt;br /&gt;       JSON.error_occured = false;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       function error(m) {&lt;br /&gt;           JSON.error("JSONError: "+m)&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function next() {&lt;br /&gt;           ch = text.charAt(at);&lt;br /&gt;           at += 1;&lt;br /&gt;           return ch;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function white() {&lt;br /&gt;           while (!JSON.error_occured &amp;&amp; ch != null) {&lt;br /&gt;               if (ch &lt;= ' ') {&lt;br /&gt;                   next();&lt;br /&gt;               } else if (ch == '/') {&lt;br /&gt;                   next();&lt;br /&gt;                   switch (ch) {&lt;br /&gt;                       case '/':&lt;br /&gt;                           while (!JSON.error_occured &amp;&amp; next() != null &amp;&amp; ch != '\n' &amp;&amp; ch != '\r') {}&lt;br /&gt;                           break;&lt;br /&gt;                       case '*':&lt;br /&gt;                           next();&lt;br /&gt;                           while (true) {&lt;br /&gt;                               if (ch) {&lt;br /&gt;                                   if (ch == '*') {&lt;br /&gt;                                       if (next() == '/') {&lt;br /&gt;                                           next();&lt;br /&gt;                                           break;&lt;br /&gt;                                       }&lt;br /&gt;                                   } else {&lt;br /&gt;                                       next();&lt;br /&gt;                                   }&lt;br /&gt;                               } else {&lt;br /&gt;                                   error("Unterminated comment");&lt;br /&gt;                               }&lt;br /&gt;                           }&lt;br /&gt;                           break;&lt;br /&gt;                       default:&lt;br /&gt;                           error("Syntax error");&lt;br /&gt;                   }&lt;br /&gt;               } else {&lt;br /&gt;                   break;&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function str() {&lt;br /&gt;           var i, s = '', t, u;&lt;br /&gt;           var outer = false;&lt;br /&gt;&lt;br /&gt;           if (ch == '"') {&lt;br /&gt;               while (!JSON.error_occured &amp;&amp; next() != null) {&lt;br /&gt;                   if (ch == '"') {&lt;br /&gt;                       next();&lt;br /&gt;                       return s;&lt;br /&gt;                   } else if (ch == '\\') {&lt;br /&gt;                       next();&lt;br /&gt;                       switch (ch) {&lt;br /&gt;                       case 'b':&lt;br /&gt;                           s += '\b';&lt;br /&gt;                           break;&lt;br /&gt;                       case 'f':&lt;br /&gt;                           s += '\f';&lt;br /&gt;                           break;&lt;br /&gt;                       case 'n':&lt;br /&gt;                           s += '\n';&lt;br /&gt;                           break;&lt;br /&gt;                       case 'r':&lt;br /&gt;                           s += '\r';&lt;br /&gt;                           break;&lt;br /&gt;                       case 't':&lt;br /&gt;                           s += '\t';&lt;br /&gt;                           break;&lt;br /&gt;                       case 'u':&lt;br /&gt;                           u = 0;&lt;br /&gt;                           for (i = 0; i &lt; 4; i += 1) {&lt;br /&gt;                               t = parseInt(next(), 16);&lt;br /&gt;                               if (!isFinite(t)) {&lt;br /&gt;                                   outer = true;&lt;br /&gt;                                   break;&lt;br /&gt;                               }&lt;br /&gt;                               u = u * 16 + t;&lt;br /&gt;                           }&lt;br /&gt;                           if(outer) {&lt;br /&gt;                               outer = false;&lt;br /&gt;                               break;&lt;br /&gt;                           }&lt;br /&gt;                           s += String.fromCharCode(u);&lt;br /&gt;                           break;&lt;br /&gt;                       default:&lt;br /&gt;                           s += ch;&lt;br /&gt;                       }&lt;br /&gt;                   } else {&lt;br /&gt;                       s += ch;&lt;br /&gt;                   }&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           error("Bad string");&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function arr() {&lt;br /&gt;           var a = [];&lt;br /&gt;&lt;br /&gt;           if (ch == '[') {&lt;br /&gt;               next();&lt;br /&gt;               white();&lt;br /&gt;               if (ch == ']') {&lt;br /&gt;                   next();&lt;br /&gt;                   return a;&lt;br /&gt;               }&lt;br /&gt;               while (!JSON.error_occured &amp;&amp; ch != null) {&lt;br /&gt;                   a.push(value());&lt;br /&gt;                   white();&lt;br /&gt;                   if (ch == ']') {&lt;br /&gt;                       next();&lt;br /&gt;                       return a;&lt;br /&gt;                   } else if (ch != ',') {&lt;br /&gt;                       break;&lt;br /&gt;                   }&lt;br /&gt;                   next();&lt;br /&gt;                   white();&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           error("Bad array");&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function obj() {&lt;br /&gt;           var k, o = {};&lt;br /&gt;&lt;br /&gt;           if (ch == '{') {&lt;br /&gt;               next();&lt;br /&gt;               white();&lt;br /&gt;               if (ch == '}') {&lt;br /&gt;                   next();&lt;br /&gt;                   return o;&lt;br /&gt;               }&lt;br /&gt;               while (!JSON.error_occured &amp;&amp; ch != null) {&lt;br /&gt;                   k = str();&lt;br /&gt;                   white();&lt;br /&gt;                   if (ch != ':') {&lt;br /&gt;                       break;&lt;br /&gt;                   }&lt;br /&gt;                   next();&lt;br /&gt;                   o[k] = value();&lt;br /&gt;                   white();&lt;br /&gt;                   if (ch == '}') {&lt;br /&gt;                       next();&lt;br /&gt;                       return o;&lt;br /&gt;                   } else if (ch != ',') {&lt;br /&gt;                       break;&lt;br /&gt;                   }&lt;br /&gt;                   next();&lt;br /&gt;                   white();&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           error("Bad object");&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function num() {&lt;br /&gt;           var n = '', v;&lt;br /&gt;&lt;br /&gt;           if (ch == '-') {&lt;br /&gt;               n = '-';&lt;br /&gt;               next();&lt;br /&gt;           }&lt;br /&gt;           while (!JSON.error_occured &amp;&amp; ch &gt;= '0' &amp;&amp; ch &lt;= '9') {&lt;br /&gt;               n += ch;&lt;br /&gt;               next();&lt;br /&gt;           }&lt;br /&gt;           if (ch == '.') {&lt;br /&gt;               n += '.';&lt;br /&gt;               next();&lt;br /&gt;               while (!JSON.error_occured &amp;&amp; ch &gt;= '0' &amp;&amp; ch &lt;= '9') {&lt;br /&gt;                   n += ch;&lt;br /&gt;                   next();&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           if (ch == 'e' | ch == 'E') {&lt;br /&gt;               n += ch;&lt;br /&gt;               next();&lt;br /&gt;               if (ch == '-' || ch == '+') {&lt;br /&gt;                   n += ch;&lt;br /&gt;                   next();&lt;br /&gt;               }&lt;br /&gt;               while (!JSON.error_occured &amp;&amp; ch &gt;= '0' &amp;&amp; ch &lt;= '9') {&lt;br /&gt;                   n += ch;&lt;br /&gt;                   next();&lt;br /&gt;               }&lt;br /&gt;           }&lt;br /&gt;           v = Number(n);&lt;br /&gt;           if (!isFinite(v)) {&lt;br /&gt;               error("Bad number");&lt;br /&gt;           }&lt;br /&gt;           return v;&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function word() {&lt;br /&gt;           switch (ch) {&lt;br /&gt;               case 't':&lt;br /&gt;                   if (next() == 'r' &amp;&amp; next() == 'u' &amp;&amp;&lt;br /&gt;                           next() == 'e') {&lt;br /&gt;                       next();&lt;br /&gt;                       return true;&lt;br /&gt;                   }&lt;br /&gt;                   break;&lt;br /&gt;               case 'f':&lt;br /&gt;                   if (next() == 'a' &amp;&amp; next() == 'l' &amp;&amp;&lt;br /&gt;                           next() == 's' &amp;&amp; next() == 'e') {&lt;br /&gt;                       next();&lt;br /&gt;                       return false;&lt;br /&gt;                   }&lt;br /&gt;                   break;&lt;br /&gt;               case 'n':&lt;br /&gt;                   if (next() == 'u' &amp;&amp; next() == 'l' &amp;&amp;&lt;br /&gt;                           next() == 'l') {&lt;br /&gt;                       next();&lt;br /&gt;                       return null;&lt;br /&gt;                   }&lt;br /&gt;                   break;&lt;br /&gt;           }&lt;br /&gt;           error("Syntax error");&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       function value() {&lt;br /&gt;           white();&lt;br /&gt;           switch (ch) {&lt;br /&gt;               case '{':&lt;br /&gt;                   return obj();&lt;br /&gt;               case '[':&lt;br /&gt;                   return arr();&lt;br /&gt;               case '"':&lt;br /&gt;                   return str();&lt;br /&gt;               case '-':&lt;br /&gt;                   return num();&lt;br /&gt;               default:&lt;br /&gt;                   return ch &gt;= '0' &amp;&amp; ch &lt;= '9' ? num() : word();&lt;br /&gt;           }&lt;br /&gt;       }&lt;br /&gt;&lt;br /&gt;       return value();&lt;br /&gt;   }&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5628111703277687952?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5628111703277687952/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5628111703277687952' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5628111703277687952'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5628111703277687952'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2009/12/flash-media-server-json.html' title='Flash Media Server 加上 JSON 功能'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-9023928190802115125</id><published>2009-12-23T16:34:00.002+08:00</published><updated>2009-12-23T17:07:21.185+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='Cookie'/><title type='text'>Flash取得Cookie</title><content type='html'>當然還是得透過 JavaScript 才會取得, 不過可以偷懶不用寫 JavaScript:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&lt;br /&gt;var s:String = ExternalInterface.call("document.cookie.toString");&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;通常會處理一下&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&lt;br /&gt;var cookieStr:String = ExternalInterface.call("document.cookie.toString");&lt;br /&gt;var cookieObj:Object = {};&lt;br /&gt;cookieStr = cookieStr.split(' ').join('');&lt;br /&gt;var tmp:Array = cookieStr.split(';');&lt;br /&gt;for(var i in tmp) {&lt;br /&gt; var tmp2:Array = tmp[i].split('=');&lt;br /&gt; cookieObj[tmp2[0]] = unescape(tmp2[1]);&lt;br /&gt;}&lt;br /&gt;s_txt.text = cookieObj['PHPSESSID'];&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-9023928190802115125?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/9023928190802115125/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=9023928190802115125' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9023928190802115125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9023928190802115125'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2009/12/flashcookie.html' title='Flash取得Cookie'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8149332755569188972</id><published>2009-11-30T00:59:00.002+08:00</published><updated>2009-11-30T01:01:22.778+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unicode'/><title type='text'>中文字的 unicode 範圍</title><content type='html'>主要是 U+4E00 至 U+9FA5&lt;br /&gt;資料來源 &lt;a href="http://forum.cpatch.org/viewthread.php?tid=6126"&gt;請問一下 unicode 的編碼範圍問題&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8149332755569188972?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8149332755569188972/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8149332755569188972' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8149332755569188972'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8149332755569188972'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2009/11/unicode.html' title='中文字的 unicode 範圍'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-1922935328022430513</id><published>2009-08-10T12:14:00.005+08:00</published><updated>2009-08-10T12:26:58.967+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Apache'/><title type='text'>Apache VirtuslHost 偵聽不同埠</title><content type='html'>環境 Apache 2.2&lt;br /&gt;&lt;br /&gt;先在 httpd.conf 設定:&lt;br /&gt;&lt;br /&gt;→ Listen 8080&lt;br /&gt;&lt;br /&gt;→ Include conf/extra/httpd-vhosts.conf&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;接著在 conf/extra/httpd-vhosts.conf 設定:&lt;br /&gt;&lt;br /&gt;→ NameVirtualHost localhost:8080&lt;br /&gt;&lt;br /&gt;→ &amp;lt;VirtualHost localhost:8080&amp;gt;&lt;br /&gt;&lt;br /&gt;→  DocumentRoot "C:/wamp/www/web8080"&lt;br /&gt;&lt;br /&gt;→  ServerName localhost&lt;br /&gt;&lt;br /&gt;→  ErrorLog "logs/web8080-error.log"&lt;br /&gt;&lt;br /&gt;→  CustomLog "logs/web8080-access.log" common&lt;br /&gt;&lt;br /&gt;→ &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;若要在本機上能 access 到某個 host，需要在C:\WINDOWS\SYSTEM32\DRIVERS\ETC\HOSTS 加入一筆記錄&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-1922935328022430513?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/1922935328022430513/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=1922935328022430513' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1922935328022430513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/1922935328022430513'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2009/08/apache-virtuslhost.html' title='Apache VirtuslHost 偵聽不同埠'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2286456530539975097</id><published>2009-08-03T10:57:00.001+08:00</published><updated>2009-08-03T10:59:04.402+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><category scheme='http://www.blogger.com/atom/ns#' term='upload'/><title type='text'>PHP 的上傳設定</title><content type='html'>PHP 的上傳設定除了修改 upload_max_filesize 外&lt;br /&gt;memory_limit, max_execution_time, post_max_size 也要適當修改&lt;br /&gt;通常 memory_limit &gt; post_max_size &gt; upload_max_filesize&lt;br /&gt;&lt;br /&gt;另外, Apache 的上傳控制是 LimitRequestBody&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2286456530539975097?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2286456530539975097/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2286456530539975097' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2286456530539975097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2286456530539975097'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2009/08/php.html' title='PHP 的上傳設定'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6425008557002637911</id><published>2008-08-28T15:09:00.002+08:00</published><updated>2008-08-28T15:14:37.038+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>在 UIComponent 中加入 Bitmap</title><content type='html'>Flex UIComponent 的 addChild() 只能加入 UIComponent 物件，&lt;br /&gt;若要從 BitmapData 弄個 Bitmap 便無法加入。&lt;br /&gt;&lt;br /&gt;Flex3 的 SWFLoader 可以解決這個問題，例如：&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var bmp:BitmapData = new BitmapData(sw, sh);&lt;br /&gt;bmp.draw(global.application.t_canvas, matrix);&lt;br /&gt;var swf:SWFLoader = new SWFLoader();&lt;br /&gt;swf.source = new Bitmap(bmp);&lt;br /&gt;this.addChildAt(swf, 0);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6425008557002637911?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6425008557002637911/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6425008557002637911' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6425008557002637911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6425008557002637911'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/08/uicomponent-bitmap.html' title='在 UIComponent 中加入 Bitmap'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-9078003542721078672</id><published>2008-08-04T00:00:00.006+08:00</published><updated>2008-08-04T00:05:47.330+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Flex in a Week</title><content type='html'>&lt;a href="http://www.adobe.com/devnet/flex/videotraining/"&gt;Flex in a Week&lt;/a&gt;&lt;br /&gt;Adobe 官方影音教學, 應該要有 5 天的教學課程, 目前只有 3 天...&lt;br /&gt;真的一個星期就可以學會 Flex 嗎? 這要看「會」的定義是什麼...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-9078003542721078672?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/9078003542721078672/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=9078003542721078672' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9078003542721078672'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9078003542721078672'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/08/flex-in-week.html' title='Flex in a Week'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5852373751495677676</id><published>2008-06-24T16:34:00.001+08:00</published><updated>2008-06-24T16:35:53.652+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>動態改變 Flash Movie 的大小</title><content type='html'>原始網頁: &lt;a href="http://www.dncompute.com/blog/2008/06/23/browsercanvas-the-worlds-easiest-way-to-dynamically-resize-flash.html"&gt;BrowserCanvas&lt;/a&gt;. The World’s Easiest Way to Dynamically Resize Flash&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5852373751495677676?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5852373751495677676/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5852373751495677676' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5852373751495677676'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5852373751495677676'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/flash-movie.html' title='動態改變 Flash Movie 的大小'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3298059020610132344</id><published>2008-06-22T02:11:00.003+08:00</published><updated>2008-06-22T02:17:57.150+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><title type='text'>JavaScript Components</title><content type='html'>blueshoes.org 提供不少 &lt;a href="http://www.blueshoes.org/en/javascript/"&gt;JavaScript Components&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;另外, &lt;a href="http://calendar.swazz.org/"&gt;Swazz Calendar&lt;/a&gt; 是個滿讚的日期輸入月曆&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3298059020610132344?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3298059020610132344/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3298059020610132344' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3298059020610132344'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3298059020610132344'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/javascript-components.html' title='JavaScript Components'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4893545799740419816</id><published>2008-06-21T22:52:00.003+08:00</published><updated>2008-06-21T23:04:30.510+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>FileReference 上傳後得知檔案大小</title><content type='html'>上傳圖檔時, 同時上傳資料, 可以參考之前舊文: &lt;a href="http://qops.blogspot.com/2006/07/filereference.html"&gt;FileReference 上傳圖檔&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;利用偵聽 uploadCompleteData (DataEvent.UPLOAD_COMPLETE_DATA) 事件即可解決&lt;br /&gt;&lt;br /&gt;Frame Actions&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var uploadURL:String = "upload_test.php";&lt;br /&gt;var req:URLRequest = new URLRequest(uploadURL);&lt;br /&gt;var file:FileReference = new FileReference();&lt;br /&gt;&lt;br /&gt;// 設定偵聽器&lt;br /&gt;file.addEventListener(Event.SELECT, myFileSelect);&lt;br /&gt;file.addEventListener(DataEvent.UPLOAD_COMPLETE_DATA , myUploadCompleteData);&lt;br /&gt;&lt;br /&gt;// 瀏覽上傳的檔案&lt;br /&gt;file.browse([new FileFilter("Images", "*.jpg;*.gif;*.png")]);&lt;br /&gt;&lt;br /&gt;// 選擇所欲上傳的圖檔後&lt;br /&gt;function myFileSelect(e:Event):void{&lt;br /&gt;   file.upload(req);&lt;br /&gt;}&lt;br /&gt;// 上傳完成後&lt;br /&gt;function myUploadCompleteData(e:DataEvent):void{&lt;br /&gt;   var data:String = e.data as String;&lt;br /&gt;   trace(data);&lt;br /&gt;   var filename = data.split('::')[0];&lt;br /&gt;   // 載入圖片&lt;br /&gt;   var picReq:URLRequest = new URLRequest(filename);&lt;br /&gt;   var pic:Loader = new Loader();&lt;br /&gt;   pic.load(picReq);&lt;br /&gt;   pic.y = 20;&lt;br /&gt;   this.addChild(pic);&lt;br /&gt;   // 秀出回傳的字串&lt;br /&gt;   var tf:TextField = new TextField();&lt;br /&gt;   tf.autoSize = 'left';&lt;br /&gt;   tf.text = data;&lt;br /&gt;   this.addChild(tf);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;PHP&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;// 圖檔上傳後所欲存放的目錄&lt;br /&gt;$up_dir = "./imgs/";&lt;br /&gt;// 若目錄不存在, 則建立之&lt;br /&gt;if(!is_dir($up_dir))&lt;br /&gt;   mkdir($up_dir, 0755);&lt;br /&gt;// 取得上傳檔案的副檔名&lt;br /&gt;$pos = strrpos($_FILES["Filedata"]["name"], ".");&lt;br /&gt;if ($pos === false) {&lt;br /&gt;   $ext = "";&lt;br /&gt;}else{&lt;br /&gt;   $ext = substr($_FILES["Filedata"]["name"], $pos);&lt;br /&gt;}&lt;br /&gt;// 檔案大小 bytes&lt;br /&gt;$size = $_FILES['Filedata']['size'];&lt;br /&gt;// 以隨機的字串為檔名&lt;br /&gt;$uniq = md5(uniqid(rand(), true));&lt;br /&gt;$up_file = $up_dir . $uniq . $ext;&lt;br /&gt;// 將檔案放到設定的目錄內&lt;br /&gt;move_uploaded_file($_FILES["Filedata"]["tmp_name"], $up_file);&lt;br /&gt;chmod($up_file, 0777);&lt;br /&gt;&lt;br /&gt;echo $up_file . '::' . $size;&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4893545799740419816?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4893545799740419816/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4893545799740419816' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4893545799740419816'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4893545799740419816'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/filereference.html' title='FileReference 上傳後得知檔案大小'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2284396111191402053</id><published>2008-06-18T21:17:00.002+08:00</published><updated>2008-06-18T21:23:10.995+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PDF'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='AS2'/><title type='text'>透過 ActionScript 產生 PDF</title><content type='html'>Flash 8 / ActionScript 2 Version: &lt;a href="http://www.blazepdf.com/"&gt;blazePDF v2  component&lt;/a&gt; (要付費)&lt;br /&gt;&lt;br /&gt;ActionScript 3 Open-Source PDF Library: &lt;a href="http://www.alivepdf.org/"&gt;AlivePDF&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Neo's blog 整理的 &lt;a href="http://www.neo.com.tw/archives/000896.html"&gt;[PHP] 免費好用的 PDF Library 大搜集&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2284396111191402053?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2284396111191402053/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2284396111191402053' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2284396111191402053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2284396111191402053'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/actionscript-pdf.html' title='透過 ActionScript 產生 PDF'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2193243583680239902</id><published>2008-06-11T22:17:00.001+08:00</published><updated>2008-06-11T22:18:48.735+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='components'/><title type='text'>Liquid Components, Open Source 囉!</title><content type='html'>&lt;a href="http://www.bytearray.org/?p=137"&gt;Liquid Components, now Open Source !&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2193243583680239902?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2193243583680239902/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2193243583680239902' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2193243583680239902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2193243583680239902'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/liquid-components-open-source.html' title='Liquid Components, Open Source 囉!'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3101227204621726098</id><published>2008-06-10T22:48:00.001+08:00</published><updated>2008-06-10T22:51:48.010+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><title type='text'>台灣 Adobe/macromedia 使用者俱樂部論壇搬家中</title><content type='html'>這兩天無法上 mmug.com.tw&lt;br /&gt;問了一下 Willy，才知道原來在搬家中，可能還會暫停服務數天。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3101227204621726098?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3101227204621726098/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3101227204621726098' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3101227204621726098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3101227204621726098'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/adobemacromedia.html' title='台灣 Adobe/macromedia 使用者俱樂部論壇搬家中'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5573092697873557875</id><published>2008-06-09T22:24:00.002+08:00</published><updated>2008-06-09T22:29:13.423+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RIA'/><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><title type='text'>Marc 的教學: 建立類似 Visio 的 RIA</title><content type='html'>&lt;a href="http://www.rogue-development.com/blog2/2008/06/creating-a-simple-diagramming-application/"&gt;Creating a simple diagramming application&lt;/a&gt;&lt;br /&gt;除了原始檔, 還有影音教學, 讚啦 :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5573092697873557875?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5573092697873557875/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5573092697873557875' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5573092697873557875'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5573092697873557875'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/marc-visio-ria.html' title='Marc 的教學: 建立類似 Visio 的 RIA'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2464752073048552405</id><published>2008-06-06T10:01:00.003+08:00</published><updated>2008-06-06T10:06:31.808+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tutorials'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>flashandmath.com - ActionScript 3 Tutorials</title><content type='html'>&lt;a href="http://www.flashandmath.com/"&gt;flashandmath.com&lt;/a&gt; 滿讚的 AS3 教學網站。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2464752073048552405?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2464752073048552405/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2464752073048552405' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2464752073048552405'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2464752073048552405'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/flashandmathcom-actionscript-3.html' title='flashandmath.com - ActionScript 3 Tutorials'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7988699466173767873</id><published>2008-06-06T01:55:00.004+08:00</published><updated>2008-06-06T02:04:55.753+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Works and Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>以動態文字作為遮罩</title><content type='html'>&lt;a href="http://www.mmug.com.tw/forum/viewtopic.php?f=8&amp;t=12782"&gt;mmug上討論的問題&lt;/a&gt;&lt;br /&gt;在此我用之前的 &lt;a href="http://qops.blogspot.com/2008/05/bitmap.html"&gt;Substitute&lt;/a&gt; 類別來解決&lt;br /&gt;&lt;embed src="http://www.riarock.net/qopsblog/2008/dynamic_text_mask.swf" quality="high" bgcolor="#ffffff" width="200" height="200" name="dynamic_text_mask" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;Frame Actions:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;// 底&lt;br /&gt;var bmd:BitmapData = new BitmapData(200, 200, true, 0xFFCCCCCC);&lt;br /&gt;var seed:int = int(Math.random() * int.MAX_VALUE);&lt;br /&gt;var channels:uint = BitmapDataChannel.RED | BitmapDataChannel.BLUE;&lt;br /&gt;bmd.perlinNoise(100, 80, 12, seed, false, true, channels, false, null);&lt;br /&gt;var bm:Bitmap = new Bitmap(bmd);&lt;br /&gt;this.addChild(bm);&lt;br /&gt;&lt;br /&gt;// 動態文字&lt;br /&gt;var _txt:TextField = new TextField;&lt;br /&gt;_txt.autoSize = "left";&lt;br /&gt;var myTextFormat:TextFormat = new TextFormat(null, 30, 0, true);&lt;br /&gt;_txt.text = "動態文字";&lt;br /&gt;_txt.x = 50;&lt;br /&gt;_txt.setTextFormat(myTextFormat);&lt;br /&gt;this.addChild(_txt);&lt;br /&gt;&lt;br /&gt;// 建立替身&lt;br /&gt;import lin.shinder.display.Substitute;&lt;br /&gt;var s:Substitute = new Substitute(_txt).displace();&lt;br /&gt;s.rotation = 30;&lt;br /&gt;&lt;br /&gt;// 設定遮罩&lt;br /&gt;bm.cacheAsBitmap = true;&lt;br /&gt;s.cacheAsBitmap = true;&lt;br /&gt;bm.mask = s;&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/2008/dynamic_text_mask.zip"&gt;原始檔下載&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7988699466173767873?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7988699466173767873/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7988699466173767873' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7988699466173767873'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7988699466173767873'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/blog-post.html' title='以動態文字作為遮罩'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5028452752902843032</id><published>2008-06-05T15:47:00.001+08:00</published><updated>2008-06-05T15:58:49.703+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Works and Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash Remoting'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>取得 Domain Name (AS3 版)</title><content type='html'>&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;/**&lt;br /&gt; * author: shinder lin&lt;br /&gt; * email: shinder.lin@gmail.com&lt;br /&gt;*/&lt;br /&gt;package lin.shinder.net&lt;br /&gt;{&lt;br /&gt; import flash.display.DisplayObject;&lt;br /&gt; public class HttpDomain&lt;br /&gt; {&lt;br /&gt;  static public var defaultDomain:String = "http://localhost";&lt;br /&gt;  static public function getDomain(displayObj:DisplayObject)&lt;br /&gt;  {&lt;br /&gt;   var url_str:String = displayObj['stage'].loaderInfo.loaderURL;&lt;br /&gt;   if (url_str.indexOf("http://") == 0 || url_str.indexOf("https://") == 0) {&lt;br /&gt;    var s_index:int = url_str.indexOf("/", 10);&lt;br /&gt;    return url_str.substring(0, s_index);&lt;br /&gt;   } else {&lt;br /&gt;    return defaultDomain;&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://qops.blogspot.com/2007/06/url-domain-name-as2.html"&gt;由 URL 取得 Domain Name (AS2 版)&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5028452752902843032?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5028452752902843032/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5028452752902843032' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5028452752902843032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5028452752902843032'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/domain-name-as3.html' title='取得 Domain Name (AS3 版)'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6619513271610977434</id><published>2008-06-04T21:16:00.005+08:00</published><updated>2008-06-04T22:00:12.860+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='JSON'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>PHP 使用 JSON 和 AS3 溝通</title><content type='html'>JSON 常用在 AJAX 的資料交換上，其實也可以用在 SWF&lt;-&gt;PHP 上。&lt;br /&gt;PHP5有內建 JSON 的函式；PHP4沒有，但可以用 PEAR 的 &lt;a href="http://pear.php.net/pepr/pepr-proposal-show.php?id=198"&gt;JSON 類別&lt;/a&gt;。&lt;br /&gt;AS3 則可以用 as3corelib 裡的 JSON 類別。&lt;br /&gt;以下是將DB資料轉換成JSON的例子。&lt;br /&gt;mysql2json4.php&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&lt;?php&lt;br /&gt;/*** shinder.lin@gmail.com&lt;br /&gt;for PHP4&lt;br /&gt;*/&lt;br /&gt;require_once("JSON.php");&lt;br /&gt;function mysql2json4($sql) {&lt;br /&gt; if(is_string($sql)) {&lt;br /&gt;     $query = mysql_query($query) or die(mysql_error());&lt;br /&gt; } else {&lt;br /&gt;  $query = $sql;&lt;br /&gt; }&lt;br /&gt;           &lt;br /&gt;    $ar = array();&lt;br /&gt;    if($total = mysql_num_rows($query)) {&lt;br /&gt;        while($row = mysql_fetch_assoc($query)) {&lt;br /&gt;            $obj = array();&lt;br /&gt;            foreach($row as $key =&gt; $value) {&lt;br /&gt;    $obj[ $key ] = $value;&lt;br /&gt;            }&lt;br /&gt;   array_push($ar, $obj);&lt;br /&gt;        }&lt;br /&gt;        mysql_data_seek($query, 0); &lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt; $json = new Services_JSON();&lt;br /&gt; return $json-&gt;encode($ar);&lt;br /&gt;}&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;test_mysql2json4.php&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&lt;?php&lt;br /&gt;require("mysql2json4.php");&lt;br /&gt;&lt;br /&gt;mysql_connect("localhost", "root", "");&lt;br /&gt;mysql_select_db("test");&lt;br /&gt;mysql_query("SET NAMES 'utf8'");&lt;br /&gt;$q = mysql_query("select * from ctest");&lt;br /&gt;echo mysql2json4($q);&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;test_json.fla frame actions:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import  com.adobe.serialization.json.*;&lt;br /&gt;&lt;br /&gt;var ur:URLRequest = new URLRequest("http://localhost/json_test/test_mysql2json4.php");&lt;br /&gt;var ul:URLLoader = new URLLoader();&lt;br /&gt;ul.addEventListener(Event.COMPLETE, onComplete);&lt;br /&gt;ul.load(ur);&lt;br /&gt;&lt;br /&gt;function onComplete(evt:Event) {&lt;br /&gt; trace(ul.data);&lt;br /&gt; var o:Object = JSON.decode(ul.data);&lt;br /&gt; QopDump.echo(o);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;hr&gt;&lt;/hr&gt;&lt;br /&gt;資料傳給 PHP&lt;br /&gt;test_json_insert4.php&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&lt;?php&lt;br /&gt;require_once("JSON.php");&lt;br /&gt;&lt;br /&gt;$raw = $GLOBALS["HTTP_RAW_POST_DATA"];&lt;br /&gt;&lt;br /&gt;$json = new Services_JSON();&lt;br /&gt;$ar = (array) $json-&gt;decode($raw);&lt;br /&gt;&lt;br /&gt;mysql_connect("localhost", "root", "");&lt;br /&gt;&lt;br /&gt;mysql_select_db("test");&lt;br /&gt;mysql_query("SET NAMES 'utf8'");&lt;br /&gt;// watch out for sql injection&lt;br /&gt;$sql = sprintf("INSERT INTO `ctest` (`sno`, `name`, `phone`) VALUES (NULL, '%s', '%s')", $ar['name'], $ar['phone']);&lt;br /&gt;echo (bool) mysql_query($sql);&lt;br /&gt;?&gt;&lt;/pre&gt;&lt;br /&gt;test_json_submit.fla frame actions:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import  com.adobe.serialization.json.*;&lt;br /&gt;&lt;br /&gt;var ur:URLRequest = new URLRequest("http://localhost/json_test/test_json_insert4.php");&lt;br /&gt;ur.method = URLRequestMethod.POST;&lt;br /&gt;var ul:URLLoader = new URLLoader;&lt;br /&gt;&lt;br /&gt;submit_btn.addEventListener(MouseEvent.CLICK, onSubmit);&lt;br /&gt;&lt;br /&gt;function onSubmit(evt:MouseEvent):void {&lt;br /&gt; var obj:Object = {name:name_ti.text, phone:phone_ti.text};&lt;br /&gt; var str:String = JSON.encode(obj);&lt;br /&gt; ur.data = str;&lt;br /&gt; ur.contentType = "text/plain";&lt;br /&gt; ul.load(ur);&lt;br /&gt; // trace(str);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;ul.addEventListener(Event.COMPLETE, onComplete);&lt;br /&gt;&lt;br /&gt;function onComplete(evt:Event) {&lt;br /&gt; info_ta.text = ul.data;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/2008/json_test.zip"&gt;相關檔案下載&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6619513271610977434?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6619513271610977434/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6619513271610977434' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6619513271610977434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6619513271610977434'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/06/php-json-as3.html' title='PHP 使用 JSON 和 AS3 溝通'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3855686024275060793</id><published>2008-05-20T16:40:00.003+08:00</published><updated>2008-05-20T16:54:46.511+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Works and Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>建立 DisplayObject 物件 的 Bitmap 替身</title><content type='html'>包含動態文字的視覺物件常會因為旋轉而消失&lt;br /&gt;在此弄個類別用以建立替身, 由於是點陣資料, 故縮放的時候會比較醜&lt;br /&gt;測試的 Frame Actions :&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import lin.shinder.display.Substitute;&lt;br /&gt;&lt;br /&gt;var _txt:TextField = new TextField;&lt;br /&gt;_txt.text = "ABCDEF";&lt;br /&gt;this.addChild(_txt);&lt;br /&gt;&lt;br /&gt;var s:Substitute = new Substitute(_txt).displace();&lt;br /&gt;s.rotation = 30;&lt;br /&gt;&lt;br /&gt;var s_mc:Substitute = new Substitute(t_mc);&lt;br /&gt;s_mc.x = 200;&lt;br /&gt;s_mc.y = 200;&lt;br /&gt;this.addChild(s_mc);&lt;/pre&gt;&lt;br /&gt;類別檔 Substitute.as :&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;package lin.shinder.display&lt;br /&gt;{&lt;br /&gt; import flash.geom.Rectangle;&lt;br /&gt; import flash.geom.Matrix;&lt;br /&gt; import flash.display.DisplayObject;&lt;br /&gt; import flash.display.DisplayObjectContainer;&lt;br /&gt; import flash.display.Bitmap;&lt;br /&gt; import flash.display.BitmapData;&lt;br /&gt; import flash.display.Sprite;&lt;br /&gt; import flash.display.PixelSnapping;&lt;br /&gt; // 替身&lt;br /&gt; dynamic public class Substitute  extends Sprite&lt;br /&gt; {&lt;br /&gt;  private var bitmap:Bitmap;&lt;br /&gt;  public var bitmapData:BitmapData;&lt;br /&gt;  public var original:DisplayObject;&lt;br /&gt;  &lt;br /&gt;  public function Substitute(disp:DisplayObject)&lt;br /&gt;  {&lt;br /&gt;   original = disp;&lt;br /&gt;   bitmapData = new BitmapData(disp.width, disp.height, true, 0);&lt;br /&gt;   var rect:Rectangle = disp.getBounds(disp);&lt;br /&gt;   var matrix:Matrix = new Matrix;&lt;br /&gt;   matrix.translate(-rect.x, -rect.y);&lt;br /&gt;   bitmapData.draw(disp, matrix);&lt;br /&gt;   bitmap = new Bitmap(bitmapData, PixelSnapping.AUTO, true);&lt;br /&gt;   bitmap.x = rect.x;&lt;br /&gt;   bitmap.y = rect.y;&lt;br /&gt;   this.addChild(bitmap);&lt;br /&gt;   this.visible = original.visible;&lt;br /&gt;   this.x = original.x;&lt;br /&gt;   this.y = original.y;&lt;br /&gt;   this.scaleX = original.scaleX;&lt;br /&gt;   this.scaleY = original.scaleY;&lt;br /&gt;   this.rotation = original.rotation;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function displace():Substitute&lt;br /&gt;  {&lt;br /&gt;   if(! original.parent) {&lt;br /&gt;    trace('The original DisplayObject is not in display chains !');&lt;br /&gt;    return null;&lt;br /&gt;   }&lt;br /&gt;   var _parent:DisplayObjectContainer = original.parent as DisplayObjectContainer;&lt;br /&gt;   var depth:int = _parent.getChildIndex(original);&lt;br /&gt;   _parent.addChildAt(this, depth);&lt;br /&gt;&lt;br /&gt;   _parent.removeChild(original);&lt;br /&gt;   return this;&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/2008/test_substitute.fla"&gt;測試範例原始檔&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3855686024275060793?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3855686024275060793/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3855686024275060793' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3855686024275060793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3855686024275060793'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/05/bitmap.html' title='建立 DisplayObject 物件 的 Bitmap 替身'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-213912860727576500</id><published>2008-05-16T12:13:00.001+08:00</published><updated>2008-05-16T12:17:38.962+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Flash Player 10 beta, code-named "Astro"</title><content type='html'>新的 &lt;a href="http://labs.adobe.com/technologies/flashplayer10/"&gt;Flash Player 10&lt;/a&gt; 進入 beta 階段&lt;br /&gt;Developer 另一階段的苦難又要開始了 :P&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-213912860727576500?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/213912860727576500/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=213912860727576500' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/213912860727576500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/213912860727576500'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/05/flash-player-10-beta-code-named-astro.html' title='Flash Player 10 beta, code-named &quot;Astro&quot;'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3038256802436655691</id><published>2008-04-25T14:47:00.006+08:00</published><updated>2008-04-25T15:37:53.672+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IE Tab'/><category scheme='http://www.blogger.com/atom/ns#' term='Bug'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Firefox 2 的 IE Tab 外掛跑 Flash 會有怪問題</title><content type='html'>Flash CS3/AS3, stage.stageWidth 和 stage.stageHeight 在 FireFox 2 的 IE Tab 外掛會有 Bug, 一開始值為 0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3038256802436655691?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3038256802436655691/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3038256802436655691' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3038256802436655691'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3038256802436655691'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/04/stagestagewidth-stagestageheight-ie7.html' title='Firefox 2 的 IE Tab 外掛跑 Flash 會有怪問題'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6688443030609697963</id><published>2008-04-18T11:56:00.002+08:00</published><updated>2008-04-18T12:03:39.396+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>AS3 亂數排序的效能</title><content type='html'>利用三種方式來實作亂數排序的功能, 並比較效能&lt;br /&gt;A. 製作 Array.sort() 的排序函式&lt;br /&gt;B. 大風吹, 兩兩隨機交換位置&lt;br /&gt;C. 使用 splice() 隨機一個個切出來&lt;br /&gt;結果 B 效能最佳:&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;A: 2116&lt;br /&gt;B: 66&lt;br /&gt;C: 3828&lt;/pre&gt;&lt;br /&gt;Flash Frame Actions:&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;/*&lt;br /&gt;*******&lt;br /&gt;   A. 配合 Array.sort() 使用&lt;br /&gt;*******&lt;br /&gt;*/&lt;br /&gt;function shuffle_1(...args):int&lt;br /&gt;{&lt;br /&gt; return Math.floor(3 * Math.random()) - 1;&lt;br /&gt;}&lt;br /&gt;/*&lt;br /&gt;*******&lt;br /&gt;   B. 大風吹, 隨機交換位置&lt;br /&gt;*******&lt;br /&gt;*/&lt;br /&gt;function shuffle_2(ar:Array):void&lt;br /&gt;{&lt;br /&gt; var rnd:int;&lt;br /&gt; var tmp:Object;&lt;br /&gt; for (var i:int=0; i &lt; ar.length; i++) {&lt;br /&gt;  rnd = Math.floor(Math.random()*ar.length);&lt;br /&gt;  tmp = ar[i];&lt;br /&gt;  ar[i] = ar[rnd];&lt;br /&gt;  ar[rnd] = tmp;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;/*&lt;br /&gt;*******&lt;br /&gt;   C. 隨機一個一個取出, 推入新陣列&lt;br /&gt;*******&lt;br /&gt;*/&lt;br /&gt;function shuffle_3(ar:Array):Array&lt;br /&gt;{&lt;br /&gt; var br:Array = [];&lt;br /&gt; var rnd:int;&lt;br /&gt; var cr:Array;&lt;br /&gt; while (ar.length)&lt;br /&gt; {&lt;br /&gt;  rnd = Math.floor(Math.random()*ar.length);&lt;br /&gt;  //cr = ar.splice(rnd, 1);&lt;br /&gt;  br.push( ar.splice(rnd, 1)[0] );&lt;br /&gt;&lt;br /&gt; }&lt;br /&gt; return br;&lt;br /&gt;}&lt;br /&gt;/*****************************************/&lt;br /&gt;var ar:Array = [];&lt;br /&gt;for (var i:int=0; i &lt; 100000; i++) {&lt;br /&gt; ar.push(i);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var t:int = getTimer();&lt;br /&gt;ar.sort(shuffle_1);&lt;br /&gt;trace("A: "+ (getTimer()-t) );&lt;br /&gt;&lt;br /&gt;t = getTimer();&lt;br /&gt;shuffle_2(ar);&lt;br /&gt;trace("B: "+ (getTimer()-t) );&lt;br /&gt;&lt;br /&gt;t = getTimer();&lt;br /&gt;ar = shuffle_3(ar);&lt;br /&gt;trace("C: "+ (getTimer()-t) );&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6688443030609697963?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6688443030609697963/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6688443030609697963' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6688443030609697963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6688443030609697963'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/04/as3_18.html' title='AS3 亂數排序的效能'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8909478237872718675</id><published>2008-04-18T09:07:00.002+08:00</published><updated>2008-04-18T09:10:08.098+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>AS3 兩點求距離</title><content type='html'>AS3 求兩點間的距離不用記公式了&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var p1:Point = new Point(10, 8);&lt;br /&gt;var p2:Point = new Point(2, 17);&lt;br /&gt;trace( Point.distance(p1, p2));&lt;br /&gt;trace(p1.subtract(p2).length);&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8909478237872718675?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8909478237872718675/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8909478237872718675' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8909478237872718675'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8909478237872718675'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/04/as3.html' title='AS3 兩點求距離'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7260977320128308602</id><published>2008-04-17T23:22:00.005+08:00</published><updated>2008-04-17T23:48:07.771+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Works and Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='PopUp'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Popup Modal MovieClip for Flash/AS3</title><content type='html'>Flex 有 PopUpManager 可以 pop-up window 或 custom component&lt;br /&gt;Flash CS3/AS3 則沒有 :(&lt;br /&gt;若只是用個  PopUpManager, 以 Flex 發佈後實在有點肥大...&lt;br /&gt;&lt;br /&gt;我在網路上找了老半天, 只找到 Yahoo &lt;a href="http://developer.yahoo.com/flash/astra-flash/"&gt;ASTRA Flash Components&lt;/a&gt; 裡提供的 AlertManager. 不過功能實在太陽春, 想說做點客制化, 改著改著幾乎跟重寫差不多了. 版權 follow BSD.&lt;br /&gt;&lt;br /&gt;Demo:&lt;embed src="http://www.riarock.net/qopsblog/2008/test_ModalDisplayManager.swf" quality="high" bgcolor="#ffffff" name="test_ModalDisplayManager" allowscriptaccess="sameDomain" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" align="middle" height="400" width="550"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;ModalDisplayManager.as&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;/*&lt;br /&gt;Copyright (c) 2008 Yahoo! Inc.  All rights reserved.  &lt;br /&gt;The copyrights embodied in the content of this file are licensed under the BSD (revised) open source license&lt;br /&gt;&lt;br /&gt;shinder modified&lt;br /&gt;refer com.yahoo.astra.fl.managers.AlertManager&lt;br /&gt;&lt;br /&gt;shinder.lin@gmail.com&lt;br /&gt;http://qops.blogspot.com/&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;package lin.shinder.fl.managers&lt;br /&gt;{&lt;br /&gt; import flash.display.DisplayObject;&lt;br /&gt; import flash.display.MovieClip;&lt;br /&gt; import flash.display.Graphics;&lt;br /&gt; import flash.display.Stage;&lt;br /&gt; import flash.display.StageScaleMode;&lt;br /&gt; import flash.display.StageAlign;&lt;br /&gt; import flash.events.Event;&lt;br /&gt; import flash.events.MouseEvent;&lt;br /&gt; import flash.filters.BitmapFilterQuality;&lt;br /&gt; import flash.filters.BlurFilter;&lt;br /&gt; import flash.filters.BitmapFilter;&lt;br /&gt;&lt;br /&gt; public class ModalDisplayManager extends MovieClip&lt;br /&gt; {&lt;br /&gt;  private static  var _alertQueue:Array = [];&lt;br /&gt;  private static  var _alert:MovieClip;&lt;br /&gt;  private static  var _displayManager:ModalDisplayManager;&lt;br /&gt;  private static  var _stage:Stage;&lt;br /&gt;  public static  var overlayAlpha:Number = .16;&lt;br /&gt;  public static  var modalBackgroundBlur:int = 3;&lt;br /&gt;  private static  var _overlay:MovieClip;&lt;br /&gt;  protected var container:DisplayObject;&lt;br /&gt;  protected var parentFilters:Array;&lt;br /&gt;&lt;br /&gt;  public function ModalDisplayManager(container:DisplayObject)&lt;br /&gt;  {&lt;br /&gt;   if (! _displayManager) {&lt;br /&gt;    if (container != null) {&lt;br /&gt;     _stage = container.stage;&lt;br /&gt;    } else {&lt;br /&gt;     trace("ModalDisplayManager: the 1st parameter cannot be null !");&lt;br /&gt;    }&lt;br /&gt;    if ( _stage.scaleMode != StageScaleMode.NO_SCALE ) {&lt;br /&gt;     // trace("ModalDisplayManager prefers: stage.scaleMode = StageScaleMode.NO_SCALE !");&lt;br /&gt;    }&lt;br /&gt;    if ( _stage.align != StageAlign.TOP_LEFT ) {&lt;br /&gt;     trace("ModalDisplayManager prefers: stage.align = StageAlign.TOP_LEFT !");&lt;br /&gt;    }&lt;br /&gt;    _stage.addChild(this);&lt;br /&gt;    _stage.addEventListener(Event.RESIZE, stageResizeHandler);&lt;br /&gt;    _stage.addEventListener(Event.FULLSCREEN, stageResizeHandler);&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  public static function createModalDisplay(container:DisplayObject, &lt;br /&gt;     content:Class = null,&lt;br /&gt;     promp:Object = null):ModalDisplayManager&lt;br /&gt;  {&lt;br /&gt;   if (! _displayManager) {&lt;br /&gt;    _displayManager = new ModalDisplayManager(container);&lt;br /&gt;   }&lt;br /&gt;   _overlay = new MovieClip();&lt;br /&gt;   var g:Graphics = _overlay.graphics as Graphics;&lt;br /&gt;   g.beginFill(0xeeeeee, overlayAlpha);&lt;br /&gt;   g.moveTo(0,0);&lt;br /&gt;   g.lineTo(100, 0);&lt;br /&gt;   g.lineTo(100, 100);&lt;br /&gt;   g.lineTo(0, 100);&lt;br /&gt;   g.lineTo(0, 0);&lt;br /&gt;   g.endFill();&lt;br /&gt;   _displayManager.addChild(_overlay);&lt;br /&gt;&lt;br /&gt;   _overlay.stageResizeHandler = function() {&lt;br /&gt;    this.width = _stage.stageWidth;&lt;br /&gt;    this.height = _stage.stageHeight;&lt;br /&gt;    if (this._alert != null ) {&lt;br /&gt;     this._alert.x = (_stage.stageWidth-this._alert.width)/2;&lt;br /&gt;     this._alert.y = (_stage.stageHeight-this._alert.height)/2;&lt;br /&gt;    }&lt;br /&gt;   };&lt;br /&gt;&lt;br /&gt;   _alert = new content() as MovieClip;&lt;br /&gt;   _overlay._alert = _alert;&lt;br /&gt;   _overlay.stageResizeHandler();&lt;br /&gt;   if (_alert.init) {&lt;br /&gt;    _alert.init(promp);&lt;br /&gt;   } else {&lt;br /&gt;    // trace("ModalDisplayManager: the 2nd parameter should define a function named init(promp:Object) !");&lt;br /&gt;   }&lt;br /&gt;   _displayManager.addChild(_alert);&lt;br /&gt;   _displayManager.container = container;&lt;br /&gt;   var newFilters:Array = _displayManager.container.filters.concat();&lt;br /&gt;   var oldFilters:Array = _displayManager.container.filters.concat();&lt;br /&gt;   &lt;br /&gt;   if(_alertQueue.length == 0) {&lt;br /&gt;    newFilters.push(_displayManager.getBlurFilter());&lt;br /&gt;    _displayManager.container.filters = newFilters;&lt;br /&gt;   }&lt;br /&gt;   for(var i:int=0; i &lt; _alertQueue.length; i++) {&lt;br /&gt;    _alertQueue[i]['_alert'].filters = [_displayManager.getBlurFilter()];&lt;br /&gt;   }&lt;br /&gt;&lt;br /&gt;   var alertParams:Object = {&lt;br /&gt;    container:container,&lt;br /&gt;    content:content,&lt;br /&gt;    promp:promp,&lt;br /&gt;    _overlay:_overlay,&lt;br /&gt;    _alert:_alert,&lt;br /&gt;    _filters:oldFilters&lt;br /&gt;   };&lt;br /&gt;   _alertQueue.push(alertParams);&lt;br /&gt;   return _displayManager;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function manageQueue():void&lt;br /&gt;  {&lt;br /&gt;   if(_alertQueue.length == 0){&lt;br /&gt;    return;&lt;br /&gt;   }&lt;br /&gt;   var obj:Object = _alertQueue.pop();&lt;br /&gt;   obj.container.filters = obj._filters;&lt;br /&gt;   _displayManager.removeChild(obj._alert);&lt;br /&gt;   _displayManager.removeChild(obj._overlay);&lt;br /&gt;   if(_alertQueue.length&gt;0) {&lt;br /&gt;    _alertQueue[_alertQueue.length-1]['_alert'].filters = [];&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  public function getBlurFilter():BitmapFilter&lt;br /&gt;  {&lt;br /&gt;   var blurFilter:BlurFilter = new BlurFilter();&lt;br /&gt;   blurFilter.blurX = modalBackgroundBlur;&lt;br /&gt;   blurFilter.blurY = modalBackgroundBlur;&lt;br /&gt;   blurFilter.quality = BitmapFilterQuality.HIGH;&lt;br /&gt;   return blurFilter;&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;  private function stageResizeHandler(evt:Event):void&lt;br /&gt;  {&lt;br /&gt;   for each(var o:Object in _alertQueue) {&lt;br /&gt;    o._overlay.stageResizeHandler();&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;Frame Actions:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import lin.shinder.fl.managers.ModalDisplayManager;&lt;br /&gt;stage.align = StageAlign.TOP_LEFT;&lt;br /&gt;b_btn.addEventListener(MouseEvent.CLICK, onClick);&lt;br /&gt;y_btn.addEventListener(MouseEvent.CLICK, onClick);&lt;br /&gt;function onClick(evt:MouseEvent):void&lt;br /&gt;{&lt;br /&gt; if (evt.currentTarget==b_btn) {&lt;br /&gt;  ModalDisplayManager.createModalDisplay(this, mc_gear);&lt;br /&gt; } else {&lt;br /&gt;  ModalDisplayManager.createModalDisplay(this, mc_gear2, {a:"abc"});&lt;br /&gt;  ModalDisplayManager.createModalDisplay(this, mc_gear3);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;a href="http://www.riarock.net/qopsblog/2008/ModalDisplayManager.zip"&gt;測試範例原始檔&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7260977320128308602?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7260977320128308602/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7260977320128308602' title='3 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7260977320128308602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7260977320128308602'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/04/popup-modal-movieclip-for-flashas3.html' title='Popup Modal MovieClip for Flash/AS3'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2564497199638055258</id><published>2008-04-14T16:03:00.003+08:00</published><updated>2008-04-14T16:10:39.463+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Security'/><title type='text'>關掉 USB 碟的自動播放吧</title><content type='html'>朋友給資料時的 USB 碟幾乎每支都有木馬, 而且共用的電腦也常中木馬&lt;br /&gt;在此建議關掉 autorun 功能, 資料來源 &lt;a href="http://forum.icst.org.tw/phpBB2/viewtopic.php?t=8587&amp;"&gt;資安論壇&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;執行 regedit，至&lt;br /&gt;[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explor&lt;br /&gt;er]&lt;br /&gt;加入(修改) dword&lt;br /&gt;名稱=NoDriveTypeAutoRun&lt;br /&gt;值=000000ff&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2564497199638055258?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2564497199638055258/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2564497199638055258' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2564497199638055258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2564497199638055258'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/04/usb.html' title='關掉 USB 碟的自動播放吧'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5405424718905308313</id><published>2008-04-11T00:28:00.002+08:00</published><updated>2008-04-11T00:34:44.625+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free resource'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>Open Flash Chart - 免費的 flash 各式圖表</title><content type='html'>官網: &lt;a href="http://teethgrinder.co.uk/open-flash-chart/"&gt;Open Flash Chart&lt;/a&gt;&lt;br /&gt;&lt;a href="http://ofc.homelinux.net/"&gt;好心人士翻譯的中文網站&lt;/a&gt;&lt;br /&gt;支援多種後台程式語言技術&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5405424718905308313?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5405424718905308313/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5405424718905308313' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5405424718905308313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5405424718905308313'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/04/open-flash-chart-flash.html' title='Open Flash Chart - 免費的 flash 各式圖表'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8496601665719476683</id><published>2008-03-22T00:16:00.004+08:00</published><updated>2008-03-23T01:51:43.582+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>使用 Flash CS3 製作 Flex 的組件</title><content type='html'>&lt;ol&gt;&lt;br /&gt;&lt;li&gt;到 &lt;a href="http://www.adobe.com/go/flex3_cs3_swfkit"&gt;http://www.adobe.com/go/flex3_cs3_swfkit&lt;/a&gt;   下載 Flex Component Kit for Flash CS3 (也可以一併下載 Flex Skin Design Extensions)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;使用 Extension Manager 安裝如這篇說明 &lt;a href="http://blog.flexexamples.com/2007/09/02/installing-the-flex-component-kit-for-flash-cs3/"&gt;Installing the Flex Component Kit for Flash CS3&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;nick velloff 的製作範例在 &lt;a href="http://www.velloff.com/?p=39"&gt;Flex Component Kit Examples, MAX 2007 Chicago Presentation&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8496601665719476683?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8496601665719476683/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8496601665719476683' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8496601665719476683'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8496601665719476683'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/03/flash-cs3-flex.html' title='使用 Flash CS3 製作 Flex 的組件'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7590213470032238500</id><published>2008-03-10T22:30:00.000+08:00</published><updated>2008-03-10T22:31:49.726+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><category scheme='http://www.blogger.com/atom/ns#' term='AMF'/><title type='text'>在 CodeIgniter 裡建立 SabreAMF 的 gateway</title><content type='html'>承上一篇 &lt;a href="http://qops.blogspot.com/2008/03/codeigniter-sabreamf.html"&gt;結合 CodeIgniter 和 SabreAMF&lt;/a&gt;&lt;br /&gt;接著是建立 gateway, 請參考 &lt;a href="http://www.adobe.com/devnet/flex/articles/remoteobject_sabreamf.html"&gt;Using Flex 2 RemoteObject and SabreAMF&lt;/a&gt; 和 &lt;a href="http://blogs.crammerz-inc.net/thunk/2007/12/31/getting_started_with_sabreamf"&gt;Getting started with SabreAMF 的作法。&lt;/a&gt;&lt;br /&gt;我們會將 gateway 放在 Controllers 裡。Server side remoting 程式則是放在 Models 裡。&lt;br /&gt;&lt;b&gt;在 ci_project/system/application/controllers/ 新增檔案 gateway.php&lt;/b&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;class Gateway extends Controller {&lt;br /&gt; function Gateway()&lt;br /&gt; {&lt;br /&gt;  parent::Controller();&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; function index()&lt;br /&gt; {&lt;br /&gt;  require_once('SabreAMF/CallbackServer.php');&lt;br /&gt;  try {&lt;br /&gt;   $callbackServer = new SabreAMF_CallbackServer();&lt;br /&gt;   $callbackServer-&gt;onInvokeService = array($this, 'invokeService');&lt;br /&gt;   $callbackServer-&gt;exec();&lt;br /&gt;  }catch(Exception $e){&lt;br /&gt;    echo $e-&gt;getMessage();&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; function invokeService($service, $method, $data) {&lt;br /&gt;            $modelPath = str_replace( '.', '/', $service);&lt;br /&gt;            $this-&gt;load-&gt;model($modelPath, 'amf_model');&lt;br /&gt;   return call_user_func_array( array( $this-&gt;amf_model, $method ), $data );&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;測試的 Models 放在 ci_project/system/application/models/test/test_model.php&lt;/b&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;class Test_model extends Model&lt;br /&gt;{&lt;br /&gt;    function Test_model()&lt;br /&gt;    {&lt;br /&gt;        parent::Model();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    function myMethod($d1, $d2)&lt;br /&gt;    {&lt;br /&gt;        $ret = array(&lt;br /&gt;                array( 'ID' =&gt; $d1, 'name' =&gt; 'okok', 'phone' =&gt; $d2 ),&lt;br /&gt;                array( 'ID' =&gt; '35712', 'name' =&gt; 'Esbd V. Mb', 'phone' =&gt; '235-4263' ),&lt;br /&gt;                array( 'ID' =&gt; '46823', 'name' =&gt; 'Ftce W. Nc', 'phone' =&gt; '346-5374' ),&lt;br /&gt;        );&lt;br /&gt;        return $ret;&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Flash CS3 AS3 的 client 測試&lt;/b&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import fl.data.DataProvider;&lt;br /&gt;var nc:NetConnection = new NetConnection();&lt;br /&gt;//nc.objectEncoding = ObjectEncoding.AMF3;&lt;br /&gt;&lt;br /&gt;var onResult:Function = function(result:Object) {&lt;br /&gt; QopDump.echo(result);&lt;br /&gt; dg.dataProvider = new DataProvider(result);&lt;br /&gt;};&lt;br /&gt;var onStatus:Function = function(info:Object) {&lt;br /&gt; QopDump.echo(info);&lt;br /&gt;};&lt;br /&gt;var responder:Responder = new Responder(onResult, onStatus);&lt;br /&gt;nc.connect("http://localhost/ci/?/gateway");&lt;br /&gt;&lt;br /&gt;nc.call("test.Test_model.myMethod", responder, ["888", "666"]);&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;Flex 的 client 測試&lt;/b&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;mx:Application xmlns:mx=&amp;quot;http://www.adobe.com/2006/mxml&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;mx:RemoteObject id=&amp;quot;ro&amp;quot;&lt;br /&gt;        destination=&amp;quot; &amp;quot;&lt;br /&gt;        endpoint=&amp;quot;http://localhost/ci/?/gateway&amp;quot;&lt;br /&gt;        source=&amp;quot;test.Test_model&amp;quot;&lt;br /&gt;        result=&amp;quot;resultHandler( event )&amp;quot;&lt;br /&gt;        fault=&amp;quot;faultHandler( event )&amp;quot;&amp;gt;&lt;br /&gt;    &amp;lt;/mx:RemoteObject&amp;gt;&lt;br /&gt;    &amp;lt;mx:Script&amp;gt;&lt;br /&gt;        &amp;lt;![CDATA[&lt;br /&gt;            import mx.rpc.events.*;&lt;br /&gt;            import mx.controls.Alert;&lt;br /&gt;            import mx.rpc.*;&lt;br /&gt;&lt;br /&gt;            private function load():void {&lt;br /&gt;                ro.myMethod('first','123-456789');&lt;br /&gt;            }&lt;br /&gt;            private function resultHandler( event:ResultEvent ):void {&lt;br /&gt;                Alert.show( QopDump.go(event.result) );&lt;br /&gt;                dg.dataProvider = event.result;&lt;br /&gt;            }&lt;br /&gt;            private function faultHandler( event:FaultEvent ):void {&lt;br /&gt;                Alert.show( event.toString() );&lt;br /&gt;            }&lt;br /&gt;        ]]&amp;gt;&lt;br /&gt;    &amp;lt;/mx:Script&amp;gt;&lt;br /&gt;    &amp;lt;mx:Button click=&amp;quot;load()&amp;quot; label=&amp;quot;Load&amp;quot; /&amp;gt;&lt;br /&gt;    &amp;lt;mx:DataGrid id=&amp;quot;dg&amp;quot; /&amp;gt;&lt;br /&gt;&amp;lt;/mx:Application&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7590213470032238500?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7590213470032238500/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7590213470032238500' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7590213470032238500'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7590213470032238500'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/03/codeigniter-sabreamf-gateway.html' title='在 CodeIgniter 裡建立 SabreAMF 的 gateway'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-9108342210740630650</id><published>2008-03-10T20:46:00.006+08:00</published><updated>2008-03-10T22:34:15.911+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeIgniter'/><category scheme='http://www.blogger.com/atom/ns#' term='AMF'/><title type='text'>結合 CodeIgniter 和 SabreAMF</title><content type='html'>參考這篇 &lt;a href="http://tzangms.com/blog/codeigniter/1006"&gt;將 Zend Framework 放進 CodeIgniter&lt;/a&gt;&lt;br /&gt;將符合 PEAR 規定的 library 掛上 CodeIgniter&lt;br /&gt;&lt;b&gt;1. 設定 config&lt;/b&gt;&lt;br /&gt;修改 ci_project/system/application/config/config.php&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;$config['enable_hooks'] = TRUE;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. 增加 hooks 設定&lt;/b&gt;&lt;br /&gt;於 ci_project/system/application/config/hooks.php 增加 &lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;$hook['pre_controller'][] = array(&lt;br /&gt;  'class'    =&gt; 'Pearroot',&lt;br /&gt;  'function' =&gt; 'index',&lt;br /&gt;  'filename' =&gt; 'pearroot.php',&lt;br /&gt;  'filepath' =&gt; 'hooks',&lt;br /&gt;);&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;3. 增加 hooks 程式&lt;/b&gt;&lt;br /&gt;於 ci_project/system/application/hooks/ 裡增加 pearroot.php &lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;if (!defined('BASEPATH')) exit('No direct script access allowed');  &lt;br /&gt;class Pearroot&lt;br /&gt;{  &lt;br /&gt; function index()&lt;br /&gt; {&lt;br /&gt;  set_include_path(get_include_path() . PATH_SEPARATOR . BASEPATH . 'pearroot/');&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;4. 放置 SabreAMF 目錄&lt;/b&gt;&lt;br /&gt;建立 ci_project/system/pearroot/ 目錄並將 SabreAMF/ 放置其底下, 就完成初步的設定。&lt;br /&gt;下一篇 &lt;a href="http://qops.blogspot.com/2008/03/codeigniter-sabreamf-gateway.html"&gt;在 CodeIgniter 裡建立 SabreAMF 的 gateway&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-9108342210740630650?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/9108342210740630650/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=9108342210740630650' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9108342210740630650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9108342210740630650'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/03/codeigniter-sabreamf.html' title='結合 CodeIgniter 和 SabreAMF'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6926171185839722098</id><published>2008-02-24T15:48:00.005+08:00</published><updated>2008-02-24T15:56:18.148+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IDE'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>設定 eclipse - PDT 檔案預設編碼</title><content type='html'>Preferences&lt;br /&gt;→ 點左側 Content Types&lt;br /&gt;→ 點右側 PHP Content Type&lt;br /&gt;→ 在右下的 Default encoding 欄填入編碼例如「utf-8」&lt;br /&gt;→ 點 Update&lt;br /&gt;→ 點 OK&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_x0Mqwpk8Pw8/R8Ehv8RLQNI/AAAAAAAAAG8/1TAzXh3NHmA/s1600-h/pdt_utf-8.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_x0Mqwpk8Pw8/R8Ehv8RLQNI/AAAAAAAAAG8/1TAzXh3NHmA/s400/pdt_utf-8.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5170450954713776338" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6926171185839722098?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6926171185839722098/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6926171185839722098' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6926171185839722098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6926171185839722098'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/02/eclipse-pdt.html' title='設定 eclipse - PDT 檔案預設編碼'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_x0Mqwpk8Pw8/R8Ehv8RLQNI/AAAAAAAAAG8/1TAzXh3NHmA/s72-c/pdt_utf-8.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7712272001870790882</id><published>2008-01-27T22:30:00.000+08:00</published><updated>2008-01-27T22:35:48.587+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>如何選擇 MySQL 的儲存引擎</title><content type='html'>&lt;a href="http://www.softwareprojects.com/resources/programming/t-mysql-storage-engines-1470.html"&gt;MySQL Storage Engines&lt;/a&gt; 值得細細品味!&lt;br /&gt;簡單的講, 要快要方便用 MyISAM, 要 Transaction-safe 用 innoDB。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7712272001870790882?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7712272001870790882/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7712272001870790882' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7712272001870790882'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7712272001870790882'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/mysql.html' title='如何選擇 MySQL 的儲存引擎'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6243804039198294502</id><published>2008-01-27T22:28:00.000+08:00</published><updated>2008-01-27T22:28:14.217+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><title type='text'>JavaScript 動態產生 radio 選項</title><content type='html'>&lt;a href="http://www.riarock.net/qopsblog/2008/dynamic_radio_test.html"&gt;例子&lt;/a&gt;&lt;br /&gt;如果沒有表單成員, 不可以直接使用 document.form1.radiog.value 去判斷, 否則會發生語法錯誤, 而應先以 document.form1.radiog 判斷。&lt;br /&gt;多個 radio button 會變成陣列, 判斷方式和單一個不同。&lt;br /&gt;另外, 上面的例子在 Firefox 2.0.0.11 會發生錯誤, 如果先在「單一選項」或「多個選項」選第一個項目再回到「沒有選項」並按「檢查」, 就可以看到問題 =.=&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6243804039198294502?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6243804039198294502/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6243804039198294502' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6243804039198294502'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6243804039198294502'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/javascript-radio.html' title='JavaScript 動態產生 radio 選項'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7294037439139549850</id><published>2008-01-26T22:58:00.000+08:00</published><updated>2008-01-26T23:00:48.082+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><title type='text'>Flash Media Server 3 發行囉</title><content type='html'>&lt;a href="http://www.adobe.com/products/flashmediaserver/"&gt;http://www.adobe.com/products/flashmediaserver/&lt;/a&gt;&lt;br /&gt;可以下載開發版了&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7294037439139549850?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7294037439139549850/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7294037439139549850' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7294037439139549850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7294037439139549850'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/flash-media-server-3.html' title='Flash Media Server 3 發行囉'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2523998892527702719</id><published>2008-01-24T00:20:00.000+08:00</published><updated>2008-01-24T13:18:49.493+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenSource'/><category scheme='http://www.blogger.com/atom/ns#' term='Library'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>AS3 翻頁效果 (使用現成類別)</title><content type='html'>&lt;a href="http://www.bytearray.org/?p=77"&gt;PageFlip class&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.foxaweb.com/"&gt;作者首頁&lt;/a&gt;&lt;br /&gt;測試範例&lt;br /&gt;&lt;embed src="http://www.riarock.net/qopsblog/2008/page_flip_test01.swf" quality="high" bgcolor="#ffffff" width="500" height="250" name="page_flip_test01" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;import com.foxaweb.pageflip.PageFlip;&lt;br /&gt;&lt;br /&gt;const PAGE_WIDTH = 240;&lt;br /&gt;const PAGE_HEIGHT = 180;&lt;br /&gt;&lt;br /&gt;var render:Shape=new Shape();&lt;br /&gt;var page0:BitmapData=new p0(PAGE_WIDTH, PAGE_HEIGHT);&lt;br /&gt;var page1:BitmapData=new p1(PAGE_WIDTH, PAGE_HEIGHT);&lt;br /&gt;&lt;br /&gt;render.x=250;&lt;br /&gt;render.y=35;&lt;br /&gt;addChild(render);&lt;br /&gt;this.addEventListener(Event.ENTER_FRAME, onEF);&lt;br /&gt;&lt;br /&gt;function onEF(e:Event){&lt;br /&gt; render.graphics.clear();&lt;br /&gt; // 計算翻頁的物件&lt;br /&gt; var o0:Object = PageFlip.computeFlip(&lt;br /&gt;  new Point(render.mouseX, render.mouseY), // 翻折位置&lt;br /&gt;  new Point(1,1),  // 右下角&lt;br /&gt;  PAGE_WIDTH, PAGE_HEIGHT, // 尺寸&lt;br /&gt;  true,  // 水平翻頁&lt;br /&gt;  1);&lt;br /&gt; PageFlip.drawBitmapSheet(o0, render, page0, page1);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/2008/page_flip_test01.fla"&gt;測試範例原始檔&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2523998892527702719?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2523998892527702719/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2523998892527702719' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2523998892527702719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2523998892527702719'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/as3.html' title='AS3 翻頁效果 (使用現成類別)'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4324136680137941252</id><published>2008-01-16T11:30:00.000+08:00</published><updated>2008-01-16T11:29:46.946+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><title type='text'>JavaScript 傳中文給 PHP</title><content type='html'>用 GET 送中文字時, 不同瀏覽器的行為不同&lt;br /&gt;所以先以 JS 轉換成 Unicode&lt;br /&gt;傳給 PHP 後, 再轉成 utf8&lt;br /&gt;資料來源: Neo's Blog &lt;a href="http://www.neo.com.tw/archives/000152.html"&gt;使用 PHP 解譯 javascript escape() 編碼過的字串&lt;/a&gt;&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;$search_value = uniDecode($search_value, 'utf8');&lt;br /&gt;&lt;br /&gt;function uniDecode($str,$charcode){&lt;br /&gt;  $text = preg_replace_callback("/%u[0-9A-Za-z]{4}/",toUtf8,$str);&lt;br /&gt;  return mb_convert_encoding($text, $charcode, 'utf-8');&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function toUtf8($ar){&lt;br /&gt;  foreach($ar as $val){&lt;br /&gt;    $val = intval(substr($val,2),16);&lt;br /&gt;    if($val &lt; 0x7F){        // 0000-007F&lt;br /&gt;        $c .= chr($val);&lt;br /&gt;    }elseif($val &lt; 0x800) { // 0080-0800&lt;br /&gt;        $c .= chr(0xC0 | ($val / 64));&lt;br /&gt;        $c .= chr(0x80 | ($val % 64));&lt;br /&gt;    }else{                // 0800-FFFF&lt;br /&gt;        $c .= chr(0xE0 | (($val / 64) / 64));&lt;br /&gt;        $c .= chr(0x80 | (($val / 64) % 64));&lt;br /&gt;        $c .= chr(0x80 | ($val % 64));&lt;br /&gt;    }&lt;br /&gt;  }&lt;br /&gt;  return $c;&lt;br /&gt;}&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4324136680137941252?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4324136680137941252/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4324136680137941252' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4324136680137941252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4324136680137941252'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/javascript-php.html' title='JavaScript 傳中文給 PHP'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3071325809874157852</id><published>2008-01-14T14:48:00.000+08:00</published><updated>2008-01-14T14:55:06.656+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='PHP'/><category scheme='http://www.blogger.com/atom/ns#' term='ini'/><title type='text'>無權設定 php.ini 時</title><content type='html'>可以使用 ini_set() 函式&lt;br /&gt;若只是設定 include path 可以使用 set_include_path()&lt;br /&gt;以下是官網的範例:&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;$path = '/usr/lib/pear';&lt;br /&gt;set_include_path(get_include_path() . PATH_SEPARATOR . $path);&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3071325809874157852?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3071325809874157852/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3071325809874157852' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3071325809874157852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3071325809874157852'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/phpini.html' title='無權設定 php.ini 時'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2048361283682590149</id><published>2008-01-11T01:08:00.000+08:00</published><updated>2008-01-11T01:22:59.030+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='MySQL'/><title type='text'>INNER JOIN 的效能 (SQL)</title><content type='html'>個人經驗是 JOIN 三張表以上, 效能明顯變慢。可以使用 sub select 來達到相同的目的。&lt;br /&gt;用一個資料表開得不好的例子來說明。&lt;br /&gt;第一種:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;SELECT a. * , ch.listname AS chl, cn.listname AS cnl, en.listname AS enl, jp.listname AS jpl, kr.listname AS krl&lt;br /&gt;FROM aa_mainmenu a&lt;br /&gt;INNER JOIN ch_mainmenu ch ON a.sno = ch.a_id&lt;br /&gt;INNER JOIN cn_mainmenu cn ON a.sno = cn.a_id&lt;br /&gt;INNER JOIN en_mainmenu en ON a.sno = en.a_id&lt;br /&gt;INNER JOIN jp_mainmenu jp ON a.sno = jp.a_id&lt;br /&gt;INNER JOIN kr_mainmenu kr ON a.sno = kr.a_id&lt;br /&gt;ORDER BY a.priority DESC&lt;/pre&gt;&lt;br /&gt;第二種:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;SELECT *&lt;br /&gt;FROM (&lt;br /&gt;&lt;br /&gt; SELECT a. * , b.listname AS kr&lt;br /&gt; FROM aa_mainmenu a&lt;br /&gt; INNER JOIN kr_mainmenu b ON a.sno = b.a_id&lt;br /&gt;)a&lt;br /&gt;INNER JOIN (&lt;br /&gt;&lt;br /&gt; SELECT a. * , b.en, b.jp&lt;br /&gt; FROM (&lt;br /&gt;&lt;br /&gt;  SELECT a.a_id, a.listname AS ch, b.listname AS cn&lt;br /&gt;  FROM ch_mainmenu a&lt;br /&gt;  INNER JOIN cn_mainmenu b ON a.a_id = b.a_id&lt;br /&gt; )a&lt;br /&gt; INNER JOIN (&lt;br /&gt;&lt;br /&gt;  SELECT a.a_id, a.listname AS en, b.listname AS jp&lt;br /&gt;  FROM en_mainmenu a&lt;br /&gt;  INNER JOIN jp_mainmenu b ON a.a_id = b.a_id&lt;br /&gt; )b ON a.a_id = b.a_id&lt;br /&gt;)b ON a.sno = b.a_id&lt;br /&gt;ORDER BY a.priority DESC&lt;/pre&gt;&lt;br /&gt;第二種看起來較複雜, 但執行效能通常比第一種好。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2048361283682590149?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2048361283682590149/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2048361283682590149' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2048361283682590149'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2048361283682590149'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2008/01/inner-join-sql.html' title='INNER JOIN 的效能 (SQL)'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6837605637823396021</id><published>2007-12-14T10:55:00.000+08:00</published><updated>2007-12-14T10:55:20.006+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AIR'/><category scheme='http://www.blogger.com/atom/ns#' term='LCDS ES'/><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='AMF'/><title type='text'>AIR beta3, Flex 3 beta 3, BlazeDS beta</title><content type='html'>&lt;a href="http://labs.adobe.com/"&gt;Adobe labs&lt;/a&gt; 昨天發佈的 beta&lt;br /&gt;&lt;br /&gt;Flex 3 beta 3 應該是正式版前最後的公開測試版&lt;br /&gt;&lt;br /&gt;BlazeDS 是新釋出的開源專案, 功能只包含部份的 LCDS(LiveCycleR Data Services) ES 功能。 AMF3 spec 也一併釋出了。&lt;br /&gt;LCDS ES 應該還是商業版, 又是開源版輔助商業版的策略。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6837605637823396021?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6837605637823396021/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6837605637823396021' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6837605637823396021'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6837605637823396021'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/air-beta3-flex-3-beta-3-blazeds-beta.html' title='AIR beta3, Flex 3 beta 3, BlazeDS beta'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4374741870452530655</id><published>2007-12-11T10:10:00.000+08:00</published><updated>2007-12-11T10:18:50.649+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SWF'/><category scheme='http://www.blogger.com/atom/ns#' term='Software'/><title type='text'>兩個 Flash 週邊軟體消息: Zinc 和 Swift 3D</title><content type='html'>Zinc 3.0: &lt;a href="http://www.jssmedia.com/?p=6"&gt;Zinc 3.0 GUI Exclusive Preview &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.erain.com/Products/swift3d/"&gt;Swift 3D V5&lt;/a&gt;&lt;br /&gt;with new Papervision3D export 應該是最受注目的產品特色&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4374741870452530655?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4374741870452530655/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4374741870452530655' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4374741870452530655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4374741870452530655'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/flash-zinc-swift-3d.html' title='兩個 Flash 週邊軟體消息: Zinc 和 Swift 3D'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3307727314073939224</id><published>2007-12-11T10:05:00.000+08:00</published><updated>2007-12-11T10:10:01.302+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Library'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>小巧的 Tween engine - Tny (含 Tween engines 速度比較)</title><content type='html'>資料來源: TroyWorks&lt;br /&gt;&lt;a href="http://troyworks.com/blog/2007/12/10/as3-how-low-can-you-go-tny-a-18kb-tweening-engine/"&gt;AS3: How low can you go? Tny, a 1.9KB Tweening engine for Banner Ads&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3307727314073939224?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3307727314073939224/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3307727314073939224' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3307727314073939224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3307727314073939224'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/tween-engine-tny-tween-engines.html' title='小巧的 Tween engine - Tny (含 Tween engines 速度比較)'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4063003662659286514</id><published>2007-12-09T22:16:00.000+08:00</published><updated>2007-12-09T22:20:29.429+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Free resource'/><category scheme='http://www.blogger.com/atom/ns#' term='CSS'/><title type='text'>Free CSS templates and pictures</title><content type='html'>資料來源: &lt;a href="http://www.lynchconsulting.com.au/blog/index.cfm/2007/12/8/Good-website-design-resources"&gt;Lynch Consulting Blog&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.freecsstemplates.org/"&gt;free CSS templates&lt;/a&gt;&lt;br /&gt;&lt;a href="http://pdphoto.org/"&gt;Free Public Domain Photo Database&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4063003662659286514?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4063003662659286514/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4063003662659286514' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4063003662659286514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4063003662659286514'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/free-css-templates-and-pictures.html' title='Free CSS templates and pictures'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2245049524704087217</id><published>2007-12-09T22:00:00.000+08:00</published><updated>2007-12-09T22:03:41.306+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='slides'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>AUG 2007 年底研討AS3 投影片</title><content type='html'>投影片和相關檔案在&lt;a href="http://riarock.net/qopsblog/aug200712_as3.zip"&gt;這裡&lt;/a&gt;&lt;br /&gt;index.swf 為投影片檔, 左右鍵為上一張下一張, 向上鍵為目錄頁&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2245049524704087217?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2245049524704087217/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2245049524704087217' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2245049524704087217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2245049524704087217'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/aug-2007-as3.html' title='AUG 2007 年底研討AS3 投影片'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3879441872809793750</id><published>2007-12-05T10:59:00.000+08:00</published><updated>2007-12-05T11:04:01.766+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='FMS'/><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><title type='text'>Flash Media Server 3 即將發行</title><content type='html'>FMS3 分成兩個版本囉&lt;br /&gt;資料來源: &lt;a href="http://www.sti-media.com/blog/archives/000261.html"&gt;STi Media&lt;/a&gt;&lt;br /&gt;相關連結:&lt;br /&gt;&lt;a href="http://www.adobe.com/aboutadobe/pressroom/pressreleases/200712/120407adobefms3.html"&gt;Press Release page&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/products/flashmediaserver/"&gt;Main product page&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.adobe.com/products/flashmediaserver/compare/"&gt;Product Comparing page&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flashcomguru.com/index.cfm/2007/12/3/FMS3-Announced-Massive-Price-Cut"&gt;Stefan's Flashcomguru post&lt;/a&gt;&lt;br /&gt;&lt;a href="http://casario.blogs.com/mmworld/2007/12/flash-media-ser.html"&gt;Marco Casario's blog post&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.flashmagazine.com/1472.htm"&gt;Flash Magazine's blog post&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3879441872809793750?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3879441872809793750/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3879441872809793750' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3879441872809793750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3879441872809793750'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/flash-media-server-3.html' title='Flash Media Server 3 即將發行'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6202705458207380478</id><published>2007-12-04T23:37:00.000+08:00</published><updated>2007-12-04T23:44:08.959+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='543'/><title type='text'>我終於明白</title><content type='html'>看到這一篇「&lt;a href="http://briian.com/?p=1376"&gt;黑暗界拍賣王：失森購物台&lt;/a&gt;」&lt;br /&gt;我終於明白, 為什麼我以前的書都不賣 ..... 原來沒有夜光封面 :P&lt;br /&gt;&lt;a href="http://www.wretch.cc/blog/Shadox"&gt;黑暗界拍賣王 blog&lt;/a&gt; 吃飯的時候最好別看&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6202705458207380478?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6202705458207380478/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6202705458207380478' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6202705458207380478'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6202705458207380478'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/blog-post.html' title='我終於明白'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6405067567595340910</id><published>2007-12-03T01:03:00.000+08:00</published><updated>2007-12-03T01:24:59.643+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Works and Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>將 JPG 檔案資料加入 SWF, 並讓 SWF  載入自己</title><content type='html'>Appending binary data of a JPG file to a swf file.&lt;br /&gt;我們可以將 SWF 檔後接一個圖檔資料 (別的格式當然也行),然後再利用 SWF 讀取自己, 把圖秀出來。這樣做的優點是, 可以動態組合不同內容的 SWF, 而且包成一個檔, 攜帶方便。&lt;br /&gt;找了 JPG 、 PNG 圖檔格式和 SWF 檔案格式, 如下:&lt;br /&gt;&lt;br /&gt;Jpeg 檔案格式:&lt;br /&gt;&lt;a href="http://www.obrador.com/essentialjpeg/headerinfo.htm"&gt;JPEG Header Information&lt;/a&gt;&lt;br /&gt;&lt;a href="http://blog.blueshop.com.tw/yowcheng/archive/2007/08/01/51961.aspx"&gt;JPG File Header Format&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;PNG 檔案格式:&lt;br /&gt;&lt;a href="http://angusdev.mysinablog.com/index.php?op=ViewArticle&amp;amp;articleId=287558"&gt;怎樣才是好的 File Format Header&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.fadden.com/techmisc/file-formats.htm"&gt;Designing File Formats&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;SWF 檔案格式:&lt;br /&gt;&lt;a href="http://sswf.sourceforge.net/SWFalexref.html"&gt;Alexis' SWF Reference&lt;/a&gt;&lt;br /&gt;&lt;a href="http://the-labs.com/MacromediaFlash/SWF-Spec/SWFfileformat.html"&gt;SWF File Format Specification&lt;/a&gt; (內容有點舊)&lt;br /&gt;&lt;a href="http://www.adobe.com/licensing/developer/"&gt;Adobe 官方資料&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;然而由於無法直接從 SWF 檔頭得知壓縮後的 SWF 大小, 所以放棄使用原有檔案格式的標記，改用自己增加設定。以下是合併檔案的 PHP 語法:&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;&amp;lt;?php&lt;br /&gt;$fw = fopen("merged.swf", "wb");&lt;br /&gt;$fn0 = "read_self.swf";&lt;br /&gt;$fn1 = "hippocampus.jpg";&lt;br /&gt;$fr0 = fopen($fn0, "rb");&lt;br /&gt;$fr1 = fopen($fn1, "rb");&lt;br /&gt;$content0 = fread($fr0, filesize($fn0));&lt;br /&gt;$content1 = fread($fr1, filesize($fn1));&lt;br /&gt;&lt;br /&gt;fwrite($fw, $content0);&lt;br /&gt;fwrite($fw, '-----');    // add a specific mark&lt;br /&gt;fwrite($fw, $content1);&lt;br /&gt;&lt;br /&gt;fclose($fr0);&lt;br /&gt;fclose($fr1);&lt;br /&gt;fclose($fw);&lt;br /&gt;?&amp;gt;&lt;/pre&gt;&lt;br /&gt;載入自己的那個 FLA frame actions:&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var MyUrl:String = new LoaderInfo().url;&lt;br /&gt;var lastSlash:int = MyUrl.lastIndexOf("/");&lt;br /&gt;var selfName:String = MyUrl.slice(lastSlash+1);&lt;br /&gt;&lt;br /&gt;var urlr:URLRequest = new URLRequest(selfName);&lt;br /&gt;var urll:URLLoader = new URLLoader;&lt;br /&gt;urll.dataFormat = URLLoaderDataFormat.BINARY;&lt;br /&gt;urll.load(urlr);&lt;br /&gt;urll.addEventListener(Event.COMPLETE, loadFinished);&lt;br /&gt;&lt;br /&gt;function loadFinished(e:Event):void {&lt;br /&gt; var ba:ByteArray = urll.data;&lt;br /&gt; while (true) {&lt;br /&gt;  if (ba.readByte() == 45) {&lt;br /&gt;   if (ba.readByte() == 45) {&lt;br /&gt;    if (ba.readByte() == 45) {&lt;br /&gt;     if (ba.readByte() == 45) {&lt;br /&gt;      if (ba.readByte() == 45) {&lt;br /&gt;       break;&lt;br /&gt;      }&lt;br /&gt;     }&lt;br /&gt;    }&lt;br /&gt;   }&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; var ldr:Loader = new Loader;&lt;br /&gt; var img_ba:ByteArray = new ByteArray;&lt;br /&gt; ba.readBytes(img_ba);&lt;br /&gt; this.addChild(ldr);&lt;br /&gt; ldr.loadBytes(img_ba);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/swf_readself.zip"&gt;相關檔案下載&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6405067567595340910?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6405067567595340910/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6405067567595340910' title='1 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6405067567595340910'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6405067567595340910'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/12/jpg-swf-swf.html' title='將 JPG 檔案資料加入 SWF, 並讓 SWF  載入自己'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-3172035169690524553</id><published>2007-11-30T13:57:00.000+08:00</published><updated>2007-11-30T14:03:13.583+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='AMF'/><title type='text'>AS3 AMF 基礎教學</title><content type='html'>&lt;a href="http://www.onflex.org/ted/2007/11/abcs-of-amf.php"&gt;The ABC's of AMF&lt;/a&gt; 簡單明瞭的說明範例。&lt;br /&gt;下個月可能會有 AMF 的大新聞。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-3172035169690524553?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/3172035169690524553/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=3172035169690524553' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3172035169690524553'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/3172035169690524553'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/as3-amf.html' title='AS3 AMF 基礎教學'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-9168284698000828617</id><published>2007-11-29T16:20:00.000+08:00</published><updated>2007-11-29T16:25:00.250+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mobile'/><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><title type='text'>Google 的 My Location 技術</title><content type='html'>有文有影片的報導&lt;br /&gt;&lt;a href="http://casario.blogs.com/mmworld/2007/11/never-lost-with.html"&gt;Never lost with Google Maps Mobile and My Location technology&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;看樣子將會有一堆 Google 的手機服務能把 G-phone 拱上天。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-9168284698000828617?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/9168284698000828617/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=9168284698000828617' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9168284698000828617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/9168284698000828617'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/google-my-location.html' title='Google 的 My Location 技術'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7118722991127922013</id><published>2007-11-29T15:52:00.000+08:00</published><updated>2007-11-29T15:58:55.945+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Works and Tests'/><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>「Flash CS3 ActionScript 3.0 應用程式設計」圖片對照</title><content type='html'>收到「Flash CS3 ActionScript 3.0 應用程式設計」版權書了, 不過發現裡面的圖都比較深色, 問企編得到的答案是「油墨加重, 而且紙張是象牙白, 所以視覺上會變得更黑」。&lt;br /&gt;&lt;br /&gt;其實有部份的圖應該印成彩色才適當, 不過因為售價及成本的關係, 又是偏程式書, 所以印成黑白書 (嘖! 定價520, &lt;a href="http://tlsj.tenlong.com.tw/WebModule/BookSearch/bookSearchViewAction.do?isbn=9789862010679&amp;sid=40287"&gt;天瓏才賣406&lt;/a&gt;, 不知道有沒有算錯)。&lt;br /&gt;&lt;br /&gt;為了讀者方便, 用&lt;a href="http://qops.blogspot.com/2007/11/as3-bulkloader.html"&gt;昨天介紹的 BulkLoader&lt;/a&gt; 和書中的範例, 兜一個小相本用以查看書中的範例圖 (不包含圖說)。由於使用國外便宜的空間所以速度較慢, 敬請見諒。&lt;br /&gt;&lt;br /&gt;→ &lt;a href="http://riarock.net/mybooks/ne20265/"&gt;「Flash CS3 ActionScript 3.0 應用程式設計」圖片對照&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://riarock.net/mybooks/ne20265/"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: none; cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_x0Mqwpk8Pw8/R05vf8PTZmI/AAAAAAAAAEs/rN2a870Lefo/s400/show_as3_book_img.png" border="1" alt=""id="BLOGGER_PHOTO_ID_5138166819413255778" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7118722991127922013?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7118722991127922013/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7118722991127922013' title='2 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7118722991127922013'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7118722991127922013'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/flash-cs3-actionscript-30_29.html' title='「Flash CS3 ActionScript 3.0 應用程式設計」圖片對照'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_x0Mqwpk8Pw8/R05vf8PTZmI/AAAAAAAAAEs/rN2a870Lefo/s72-c/show_as3_book_img.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-8014736376345000814</id><published>2007-11-28T20:40:00.000+08:00</published><updated>2007-11-28T21:01:54.281+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Library'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><title type='text'>AS3 BulkLoader 好用的載入工具</title><content type='html'>專案  &lt;a href="http://code.google.com/p/bulk-loader/"&gt;BulkLoader&lt;/a&gt; @ Google Code&lt;br /&gt;&lt;a href="http://drawlogic.com/2007/11/27/as3-bulkloader-useful-flash-asset-loading-kit-by-arthur-debert/"&gt;drawlogic 介紹 BulkLoader&lt;/a&gt;&lt;br /&gt;已具備的功能特色:&lt;br /&gt;1) Connection pooling.&lt;br /&gt;2) Unified interface for different loading types.&lt;br /&gt;3) Cache managing.&lt;br /&gt;4) Statistics about loading (latency, speed, average speed).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-8014736376345000814?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/8014736376345000814/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=8014736376345000814' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8014736376345000814'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/8014736376345000814'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/as3-bulkloader.html' title='AS3 BulkLoader 好用的載入工具'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5059121083171613328</id><published>2007-11-27T15:16:00.000+08:00</published><updated>2007-11-27T15:36:09.125+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Information'/><title type='text'>Adobe User Group TW (MMUG) 網聚</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://mmug.com.tw/forum/mmug_meet.php?m_id=43"&gt;&lt;img style="float:none; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 400px;" src="http://farm3.static.flickr.com/2162/2067887644_f769a1c9c0_o.gif" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mmug.com.tw/forum/viewtopic.php?p=46452"&gt;活動公告&lt;/a&gt;&lt;br /&gt;&lt;a href="http://mmug.com.tw/forum/mmug_meet.php?m_id=43"&gt;報名處&lt;/a&gt;&lt;br /&gt;qop 負責介紹 AS2 -&gt; AS3 所應注意的地方 (入門討論) :D&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5059121083171613328?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5059121083171613328/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5059121083171613328' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5059121083171613328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5059121083171613328'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/adobe-user-group-tw-mmug.html' title='Adobe User Group TW (MMUG) 網聚'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7807230210548509745</id><published>2007-11-26T12:33:00.000+08:00</published><updated>2007-11-26T12:47:06.327+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SWF'/><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>簡單保護SWF (AS3)</title><content type='html'>Protect your SWF files&lt;br /&gt;由上一篇可知, 我們可以把 SWF 切成幾個檔案, 弄亂檔案名稱編號, 再依序載入。除了切割檔案外, 也可以對分割後的檔案添油加醋, 做些處理, 載入後再去除。&lt;br /&gt;這種做法的主要前提是, AS3 反譯器還未出來之前可以用這樣的方式。&lt;br /&gt;以下是載入的語法參考:&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var files:Array = [4,5,6,7,0,1,2,3];&lt;br /&gt;var filename_head = "weather_info";&lt;br /&gt;var filename_tail = ".jpg";&lt;br /&gt;var urlr:Array = [];&lt;br /&gt;var urll:Array = [];&lt;br /&gt;for (var i:int=0; i &lt; files.length; i++) {&lt;br /&gt; urlr[i] = new URLRequest(filename_head+ files[i] +filename_tail);&lt;br /&gt; urll[i] = new URLLoader;&lt;br /&gt; urll[i].dataFormat = URLLoaderDataFormat.BINARY;&lt;br /&gt; urll[i].load(urlr[i]);&lt;br /&gt; urll[i].addEventListener(Event.COMPLETE, loadFinished);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;var loadCount:int = 0;&lt;br /&gt;function loadFinished(e:Event):void {&lt;br /&gt; loadCount++;&lt;br /&gt; if (loadCount == files.length) {&lt;br /&gt;  var ba:ByteArray = new ByteArray;&lt;br /&gt;  for(var i:int =0; i &lt; files.length; i++){&lt;br /&gt;   ba.writeBytes(urll[i].data);&lt;br /&gt;  }&lt;br /&gt;  var loader:Loader = new Loader;&lt;br /&gt;  this.addChild(loader);&lt;br /&gt;  loader.loadBytes(ba);&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Demo&lt;br /&gt;&lt;embed src="http://www.riarock.net/qopsblog/weather_info_loader.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="weather_info_loader" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/weather_info_loader.zip"&gt;相關檔案下載&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7807230210548509745?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7807230210548509745/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7807230210548509745' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7807230210548509745'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7807230210548509745'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/swf-as3_26.html' title='簡單保護SWF (AS3)'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-5401804919884674911</id><published>2007-11-26T10:50:00.000+08:00</published><updated>2007-11-26T10:49:31.879+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><title type='text'>載入部份SWF取得資料 (AS3)</title><content type='html'>Loading a fragment including header of the SWF file&lt;br /&gt;SWF 檔案結構是依照影格順序, 在被載入的 SWF 的第 1 影格定義一個陣列 ar, 然後使用璃樹無(http://luna.fc2.com/)將 SWF 分割成小檔案, 取第一個載入。&lt;br /&gt;利用下列程式就可以取得 ar 陣列的內容。&lt;br /&gt;&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;var urlr0:URLRequest = new URLRequest("file_000.jpg");&lt;br /&gt;var urll0:URLLoader = new URLLoader;&lt;br /&gt;urll0.dataFormat = URLLoaderDataFormat.BINARY;&lt;br /&gt;urll0.load(urlr0);&lt;br /&gt;urll0.addEventListener(Event.COMPLETE, loadFinished);&lt;br /&gt;&lt;br /&gt;var ldr:Loader = new Loader();&lt;br /&gt;function loadFinished(e:Event):void{&lt;br /&gt; ldr.loadBytes(urll0.data);&lt;br /&gt; ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,&lt;br /&gt;  function(e:Event){&lt;br /&gt;   trace( ldr.content['ar']);&lt;br /&gt; });&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/loading_fragment_swf.zip"&gt;相關檔案下載&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-5401804919884674911?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/5401804919884674911/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=5401804919884674911' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5401804919884674911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/5401804919884674911'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/swf-as3.html' title='載入部份SWF取得資料 (AS3)'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-7661882205293909474</id><published>2007-11-23T10:53:00.000+08:00</published><updated>2007-11-23T11:59:15.845+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='Tools'/><category scheme='http://www.blogger.com/atom/ns#' term='Tips'/><title type='text'>Aptana Studio 1.0 設定 UTF-8 編碼</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_x0Mqwpk8Pw8/R0ZPe8PTZlI/AAAAAAAAAEk/ZtrCoHLEHqI/s1600-h/aptana_set_utf8.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_x0Mqwpk8Pw8/R0ZPe8PTZlI/AAAAAAAAAEk/ZtrCoHLEHqI/s400/aptana_set_utf8.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5135879818047612498" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;1) 點選指令選單上 Window &gt; Preferences...&lt;br /&gt;2) 在面板左側點選 General &gt; Workspace&lt;br /&gt;3) 在右下方的 Text file encoding 點選 other, 設定為「UTF-8」即可。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-7661882205293909474?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/7661882205293909474/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=7661882205293909474' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7661882205293909474'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/7661882205293909474'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/aptana-studio-10-utf-8.html' title='Aptana Studio 1.0 設定 UTF-8 編碼'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_x0Mqwpk8Pw8/R0ZPe8PTZlI/AAAAAAAAAEk/ZtrCoHLEHqI/s72-c/aptana_set_utf8.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-2564054211696941701</id><published>2007-11-22T12:51:00.000+08:00</published><updated>2007-11-22T12:51:59.748+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flex'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='CNS11643'/><title type='text'>載入外部類別庫</title><content type='html'>承上篇, CNS2UCS4.as 對編輯器而言檔案實在太大, 不論使用 Flash IDE 或 Flex 去編輯都是不智的選擇。用 Flex 開啟 CNS2UCS4.as 會整個當在那兒, 除非再去調整啟動時 JVM 的設定。相對的, 可以使用 Notepad++ 之類的小巧文字編輯器。&lt;br /&gt;若每次使用都要用 Flash 或 Flex 編譯, 也是件痛苦的事情。可以用 command line 來編譯 (&lt;a href="http://livedocs.adobe.com/flex/201/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&amp;file=rsl_124_3.html#202467"&gt;參考&lt;/a&gt;) :&lt;br /&gt;C:\Program Files\Adobe\Flex Builder 2\Flex SDK 2\bin&gt;compc -source-path C:\AS3_classes -include-classes CNS2UCS4 -directory=true -debug=false -output C:\AS3_classes\CNS2UCS4&lt;br /&gt;-directory=true的設定可以不包成 swc, 在C:\AS3_classes\CNS2UCS4裡會有 library.swf 那正是我們要的。&lt;br /&gt;FLA 第一格:&lt;pre style="border: 1px solid rgb(204, 204, 204);"&gt;stop();&lt;br /&gt;var my_this = this;&lt;br /&gt;var CNS2UCS4:Class;&lt;br /&gt;var ldr:Loader = new Loader();&lt;br /&gt;var ldrContext:LoaderContext = new LoaderContext();&lt;br /&gt;ldrContext.applicationDomain = ApplicationDomain.currentDomain;&lt;br /&gt;ldr.load(new URLRequest("CNS2UCS4/library.swf"), ldrContext);&lt;br /&gt;ldr.contentLoaderInfo.addEventListener(Event.COMPLETE,onComplete);&lt;br /&gt;&lt;br /&gt;function onComplete(e:Event):void{&lt;br /&gt; CNS2UCS4 = getDefinitionByName('CNS2UCS4') as Class;&lt;br /&gt; gotoAndStop(2);&lt;br /&gt;}&lt;/pre&gt;&lt;a href="http://www.riarock.net/qopsblog/testCNS.zip"&gt;相關檔案下載&lt;/a&gt;&lt;br /&gt;&lt;embed src="http://www.riarock.net/qopsblog/testCNS_lib.swf" quality="high" bgcolor="#ffffff" width="550" height="400" name="testCNS_lib" align="middle" allowScriptAccess="sameDomain" allowFullScreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-2564054211696941701?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/2564054211696941701/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=2564054211696941701' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2564054211696941701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/2564054211696941701'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/blog-post_22.html' title='載入外部類別庫'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-4106938156620521210</id><published>2007-11-21T14:42:00.000+08:00</published><updated>2007-11-21T14:49:56.381+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='AS3'/><category scheme='http://www.blogger.com/atom/ns#' term='Flash'/><category scheme='http://www.blogger.com/atom/ns#' term='CNS11643'/><title type='text'>使用 CNS 11643 編碼排序</title><content type='html'>利用上一篇 CNS11643 和 UCS4 的對照表, 做成類別檔, 用以排序中文字。&lt;br /&gt;由於字碼很多, 只取三萬八千多對編碼, 發佈出來的檔案還是很大 =.=&lt;br /&gt;圖為範例檔執行情形&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_x0Mqwpk8Pw8/R0PUUcPTZjI/AAAAAAAAAEU/P4xIQHkRL9k/s1600-h/testCNS.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_x0Mqwpk8Pw8/R0PUUcPTZjI/AAAAAAAAAEU/P4xIQHkRL9k/s400/testCNS.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5135181447775348274" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.riarock.net/qopsblog/testCNS.zip"&gt;相關檔案下載&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-4106938156620521210?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/4106938156620521210/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=4106938156620521210' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4106938156620521210'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/4106938156620521210'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/cns-11643_21.html' title='使用 CNS 11643 編碼排序'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_x0Mqwpk8Pw8/R0PUUcPTZjI/AAAAAAAAAEU/P4xIQHkRL9k/s72-c/testCNS.gif' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-97055916877503749.post-6482418011922938754</id><published>2007-11-20T22:23:00.000+08:00</published><updated>2007-11-20T22:31:25.862+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CNS11643'/><title type='text'>正體中文 CNS 11643 中文碼</title><content type='html'>&lt;a href="http://www.cns11643.gov.tw/web/word.jsp"&gt;關於 CNS11643 國家標準中文交換碼&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.opendesktop.org.tw/modules/wmpdownloads/singlefile.php?cid=2&amp;lid=2 "&gt;CNS11643 與 UCS4 對照表&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;CNS11643目前除了公家單位之外，很少人使用。&lt;br /&gt;對我來說，其主要的優點是「先筆畫後部首排列順序編碼」和「依字之使用頻率編排於各字面」。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/97055916877503749-6482418011922938754?l=qops.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://qops.blogspot.com/feeds/6482418011922938754/comments/default' title='張貼意見'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=97055916877503749&amp;postID=6482418011922938754' title='0 個意見'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6482418011922938754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/97055916877503749/posts/default/6482418011922938754'/><link rel='alternate' type='text/html' href='http://qops.blogspot.com/2007/11/cns-11643.html' title='正體中文 CNS 11643 中文碼'/><author><name>qop</name><uri>http://www.blogger.com/profile/01402644260113429123</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_x0Mqwpk8Pw8/Rme5DNLMxuI/AAAAAAAAAAc/54UWdB4wpVc/s200/%E5%B0%8F%E5%BF%97%E5%AD%B8%E5%9D%90.jpg'/></author><thr:total>0</thr:total></entry></feed>
