2010年12月9日 星期四

[廣告] 米蘭創意種子(實習生)招募中!!


實習不只為了學分,更為了灌溉自己
這次的實習生招募,不限於寒暑假,希望是更深入的培育

米蘭期待找到這樣的種子↓
數位向陽性;
內含許多有趣的idea成分;
對新事物能產生一連串化學變化;
並有努力想成長茁壯的積極熱血。


1.實習需求

創意企劃實習 1~2名

內容說明: 
米蘭的創意企劃工作範疇,著重在創意發展,也講究細節規劃
如果你很積極,你可以學習到
如何發展一個網路廣告或病毒影片的腳本
如何規劃一個網站或網路活動的玩法、單元內容、頁面文案撰寫、動線思考…
如何思考一個數位行銷的創意
甚至 更多!!

評估依據 
創意 (30%):作品的策略思考、創意概念、文案與畫面的整體表現
認知 (30%):平常對於網路生態、廣告傳播的觀察和了解
熱忱 (30% ) :對創意與數位的熱忱
反應能力(10%):臨場表現和清楚的表達能力

聯絡與收件窗口:Carol 電話:27390000轉131
carol@mail.medialand.com.tw 
信件主旨:[應徵米蘭創意種子-企劃實習,我是<<你的姓名>>]

設計實習 1~2名

內容說明: 
米蘭設計師工作範疇,著重在設計執行及視覺創意表現
如果你很積極,你可以學習到
如何完成一個高質感與創意兼具的作品
如何執行一個完整專案從創意發想、動線思考、單元頁面到完成上線
如何整合設計資源做最有效的發揮
甚至 更多!!

評估依據 
技術 (30%) :軟體熟悉度及呈現的質感
創意 (30%) :個人作品呈現的方式與內容
熱忱 (30% ):對於設計的用心與堅持
表現度(10% ): 臨場表現,應對之間表現的談吐及態度

聯絡與收件窗口:Cheney  電話:27390000轉162
cheney@mail.medialand.com.tw 
信件主旨:[應徵米蘭創意種子-設計實習,我是<<你的姓名>>]

2.報名期間: 11/25(四)~01/17(一) 24:00止
3.面試期間: 01/18(二)~01/26(三),錄取通知:1/27(四)
4.實習時間: 02/14 Start,預計至6月底結束,每周至少來三天
5.應徵文件:參與應徵者請務必提供以下內容
A.個人基本資料 
姓名、生日、聯絡方式、學經歷、待修學分list、並附上近期清晰照片乙張
B.我的網路履歷表 
i.使用網路的年資
ii.使用或造訪過哪些網站,其中最喜歡哪個網站?為什麼?
iii.你的個人平台連結與介紹 (例如:Blog、Plurk、twitter、FunP、facebook、flickr、delicious、黑米…)
iv.你在虛擬的網路中,有哪些傲人的身分或成績?
(例如:線上遊戲團長或幹部、巴哈姆特Lv3等級以上、噗浪的Karma超高、擔任過批踢踢小天使或版主、在youtube或blog上的作品曾經被廣為傳閱…)
C.個人作品集(或作品網站、部落格)
D.我的熱情宣言

i. 你所認知的米蘭,以及想來米蘭實習的原因
ii. 你最喜歡米蘭的作品及原因

本次的實習期間屬於學期中實習,也請報名者先考量課業loading喔 ^^

2010年11月3日 星期三

HTML5 Canvas初試玩心得


前一陣子試玩了一下HTML5的Canvas,有一點心得。



基本上Canvas讓我感覺有點像flash的graphic加上matrix的配合畫出一張bitmapdata,Canvas的東西畫上去就是畫上去了,沒辦法只單獨針對裡面的某個物件進行控制,也就是說如果Canvas裡有個東西的座標或狀態改變的話,需要整張Canvas清空再重繪一次。
而且因為Canvas裡的東西是『畫上去的』,所以不像flash的display tree一樣可以給予裡面物件一些事件(ex:滑鼠事件),因此如果需要跟user互動的話,可能需要隨時算出該物件理論上該存在的座標,然後在Canvas上面疊一個透明的dom上去充當按鈕感應區吧!? 不確定,不過這是我目前想到的solution。

如果沒有寫成類別的話,要純粹用Canvas來玩一些東西其實還挺累的哩…。


2010年9月16日 星期四

FlashPlayer10 SampleDataEvent的音調及音色


大家都知道FlashPlayer10開始可以利用SampleDataEvent事件來產生8-bit的聲音。
雖然我相信真的會去發出8-bit聲音的機會很低(因為真的很難聽),但還是記錄一下如何抓取音程及改變音色。

大略講一下聲音跟波的概念。
基本上音調的高低是由聲音的頻率所決定的,即使是不同的東西振盪空氣造成不同的聲波,只要它們的頻率是一樣的,那麼聽起來也許音色不同,但會是同一個音調,頻率越大音調就越高越尖,頻率越短則音調就越低越沉。
而聲音的大小則是由振幅所決定的,振幅越大聲音就越大聲。
至於聲音的音色則是由波形來決定的。
以一個正弦波來講的話,X軸的部份當波形再次重覆時這段距離是波長,頻率基本上跟波長是倒數,頻率越大波長越短,Y軸的大小就是振幅,它的形狀就是它的波形。


2010年8月30日 星期一

[廣告]米蘭數位科技上海分公司徵才


職務名稱:      Flash actionscript 互動設計師(上海)
需求人數:     1人
職務類別:     多媒體動畫設計師、Internet程式設計師
職務說明:     如果你:
1. 對於互動技術有強烈熱情,追求技術與創意完美結合
2. 具有遠大的抱負與開疆闢土的野心
3. 有志前往上海,進入國際大舞台
請立刻加入上海米蘭(米狄兰营销策划上海有限公司)!


我們需要的是:
1. 需熟悉ActionScript3及物件導向,能熟練常見網站行銷用途的class,能獨立完成互動專案
2. 不需要會視覺設計,不需要懂Server端語言或資料庫, 但要有概念。
3. 實作過Flash任一種3D引擎,AR類別庫,VR效果者優先。
4. 喜歡與團隊合作的默契,我們喜歡打群架不要定孤支。
5. 具有克服問題,協調溝通的能力。
6. 樂天且積極的態度 - 工作中不忘記笑聲,閒下來時仍不時想要充實自己。
7. 自認對於異地工作能適應者。


應徵流程:
1. 履歷中必須能附上作品或是能展示能力的任何東西
2. 書面審核通過後需接受電話訪談
3. 待遇結構面議

應徵方式
職務聯絡人:林鴻儒先生
聯絡e-mail:rainey@mail.medialand.com.tw ; welson@mail.medialand.com.tw


也可以寄給我jason@mail.medialand.com.tw



2010年8月19日 星期四

控制Facebook FB.ui跳出的對話框大小


Facebook Graph的js api有一個很好用的東西,那就是FB.ui。
FB.ui基本上就是叫出一個對話框,裡面可以塞入很多你想塞進去的東西,最常用到的就是把stream.publish給塞進去,或者是跳一些alert訊息。
要塞到FB.ui裡的東西主要是以FBML為主,目前為止我實驗了一下,只有like button我怎麼塞都塞不進去,其他的好像大置上都ok。

FB.ui有另一個可以解決長久以來flash在wmode=transparent之下輸入中文的問題,因為FB.ui可以強迫該對話框是要以「iframe」的形式或是「popup」的形式呈現,預設是iframe。iframe的話就是一般facebook的對話框直接疊在畫面上,但是一但flash的wmode=transparent的話,該對話框會因為flash的關係而變得破碎甚至有些東西不能點,因此我們可以指定對話框改用popup的方式出現,這樣一來對話框就會變成另外的跳出視窗。

但是如果把FB.ui的對話框指定成popup的話,雖然大部份的時候都很正常,但是還是會遇到一些問題:
1. 一定要有滑鼠的點擊事件觸發才可以叫出對話框,否則會被瀏覽器擋下來。
2. 如果是stream.publish的話,在某些電腦的IE8上會被視為是cross-site script attack,沒辦法正常呈現發佈頁面。
3. Bookmark的功能被放到popup裡會出現程式錯誤(不知道facebook修好了沒)
4. 即使帶入寬高的變數,它仍然不理你。

嗯,這篇就是要解決第四個問題。

原理很簡單,有點tricky。其實就是直接去改變js api裡面FB.ui對話框的大小預設值,然後呼叫FB.ui跳出視窗,然後再馬上把預設值還原,以免影響其它FB.ui的正常大小。
以下的code我是把邀請朋友的畫面塞到popup裡:



2010年8月17日 星期二

使用ByteArray做一些基本的檔案保護


這一篇的概念很簡單,應該也已經有許多人都這樣在用了。基本上只是一種做心安的保護動作。

不知道為什麼只要遇到bytearray的東西我都覺得很有興趣,雖然這東西說穿了就是直接改binary,沒什麼太大的學問,但是我總覺得光改binary就可以玩很多東西。例如AS3Swf、LivePDF、FZip等等的東西,都是用bytearray玩出來的。

以上說的那些都需要詳讀相關的specification,才能知道哪一種檔要在binary的哪一個地方塞入什麼值,要自己去寫一個的話是很耗時跟耗工的,感謝國外的強者們。

這一篇要說的相反,要保護一個檔案,最簡單的方法就是把它binary搞亂,亂到電腦看不懂,其它人就很難直接把你的檔案拿去用。
因為把binary搞亂了,自然無法直接在電腦上跑,因此如果flash裡要使用的話,就還得先把檔案讀進來重新還原到原本的狀態才可以使用,這是比較麻煩的部份,因為寫code時就要多加一道decode的程序。一般來說會這樣搞的機率不大,swf也都有現成的軟體可以加密保護,但是像mp3這種東西就沒有了。
之前遇到的案子是客戶希望在網站上播放的音樂要保護起來,但是又沒錢買FMS,那怎麼辦?
那就只好把mp3的binary搞亂了。

點下面這裡看範例:
Demo
原始檔下載:
Source


在Encode的地方選檔案並另存後,可以試播看看,基本上會是聽不到什麼的,用其它player播放即使聽得到聲音也只會是一些怪聲音。
在Decode的地方選擇剛剛編碼過的檔案後再另存,就可以發現檔案已經回覆到原來的狀況可以直接播放。
我這個範例裡只是純粹的將mp3每100個binary互相倒置,把binary的順序搞亂而已。
如果要用更複雜的編碼也是可以,同樣的道理而已。

這種方法只是做心安的,只要被人crack到原本的編碼方式,對方又會寫程式的話,也是會被還原回來的。
但我想這樣已經可以擋掉大多數的網路使用者用現成的工具抓取mp3回去聽了。



2010年8月12日 星期四

Facebook取得某個網頁被按了多少次「讚」及有誰按「讚」


之前因為沒特別有這個需求,因此就沒去測,今天測了一下,發現有點有趣。
拿我blog裡其中一篇文章來測的話,這篇:http://blog.iamjason.com/2010/07/aniclip.html

基本上要取得讚的東西應該都是直接走FQL了,所以我先去object_url這個table取得對映到這個網址的object_url:
Select id from object_url where url='http://blog.iamjason.com/2010/07/aniclip.html'

跑出來的結果得到這個網址的object_id=410602097134。
然後再去like這個table撈一下有哪些人按過讚:
Select user_id from like where object_id=410602097134

出來的筆數有三筆,可是facebook的social plugin顯示的是四筆,查到的三個人裡面有兩個是我的朋友,另一不是,我猜最後那個「失蹤」的使用者可能隱私權設得比較高吧?
因此看樣子不能直接從這裡得到按了讚的總人數,因為可能會有誤差。

所以如果要得到按讚的總人數,就只好透過link_stat這個table了:
Select like_count from link_stat where url='http://blog.iamjason.com/2010/07/aniclip.html'

這樣出來的結果就正確了。

至於能不能不透過social plugin就可以按讚(例如在flash裡)?
目前似乎沒有開放,但是既然都是透過http在傳資料,很多東西都是有跡可循的,以下這篇(http://labs.byhook.com/2010/08/03/facebook-like-button-in-flash/)就是觀察按了讚之後送出的資料來反推,再去判斷從flash裡要送出哪些參數,但是作者也說了,他很多參數不知道是代表什麼意思,只是盡量讓它能work而已。
所以我暫時不打算去試,就看facebook到時會不會開放了。
不開放就再做打算…><。





2010年8月5日 星期四

讀取相片的Exif資訊 - Exif library for AS3



要讀取Exif資訊其實不會很難,直接用bytearray去拆解就可以,但是很費工,今天偶爾看到這個,有人已經寫好現成的類別了,那就省事多了,照片裡有經緯度的話也讀得到,所以直接標在地圖上也是很ok的。
(只不過它的授權是限非商業用途…使用時請注意~)

Demo網頁:
http://shichiseki.jp/as3/exif_info.html

Google Code:
http://code.google.com/p/exif-as3/

有興趣自己寫拆解Exif資料的朋友,下面這個是Exif的格式:
http://park2.wakwak.com/~tsuruzoh/Computer/Digicams/exif-e.html




2010年7月24日 星期六

改善向量動畫造成的效能問題 - AniClip類別


這並不是什麼新概念也不是新東西,而且大家也都知道點陣圖對cup造成的負擔比向量圖來得少。
簡單的說,就是將MovieClip裡每一個影格的畫面都事先用bitmapdata畫起來,再依序播放,這樣雖然吃記憶體,但是很多時候可以減輕cpu的loading,讓整個網站跑起來不會卡卡的。


最早之前是看到bytearray部落格上發表的Banana Slice元件(http://www.bytearray.org/?p=117),真的很久了,兩年前了。當時由於自己本身十分不喜歡用元件的關係,所以想說有空自己再來寫一個類別。結果,人嘛…惰性,時間久了,工作上遇到相關的問題時,也都想辦法先用別的方式解決掉,就一直沒有要把它寫一個真正的類別檔出來。

2010年6月30日 星期三

Facebook OpenGraph的js及Flash AS3類別庫編寫完成 + 心得筆記


Facebook OpenGraph的js及Flash AS3類別庫編寫完成 + 心得筆記

由於Facebook說他們要開始使用New Data Model的Deadline是六月三十號(連結在這http://developers.facebook.com/blog/post/392),因此一些之前已經寫好並且正在線上的iframe、connect app的使用者權限方式要做改變,否則將會發生要什麼資料就沒什麼資料的冏境。雖然說New Data Model仍然可以使用舊的Facebook Connect的permissionDialog來額外讓使用者同意New Data Model的一些新permission,但是我總覺得麻煩,而且希望畢其工於一役,要改就一次改,免得之後又來個什麼東東的deadline,就又要焦頭爛額的去改。

2010年5月26日 星期三

[徵才廣告] 米蘭數位徵才


米蘭就是我現在待的公司,要徵人~ 有興趣的或有認識的朋友想轉跑道的歡迎來試試啊~
兩個職務:

=============================================
ActionScript3互動技術程式設計師

如果你:
1. 對互動技術或RIA具有莫名的熱情與執著
2. 希望與強力的互動團隊一起討論及開發日新月異的新技術,並樂此不疲深陷其中
3. 尋求一個舞台可以將你的技術與創意完美結合
請立刻加入我們!


我們需要的是:
1. 需熟悉ActionScript3及物件導向
2. 不需要懂Server端語言或資料庫, 但要有概念
3. 樂天且積極的態度 - 工作中不忘記笑聲,閒下來時仍不時想要充實自己
4. 喜歡與團隊合作的默契 - 米蘭是個大家庭,團隊之間互相協助幫忙讓工作更不像是工作
5. 具有克服問題的能力 - 工作上一定會遇到難題,要如何克服問題而不是被問題卡住,即使舉手尋求幫助也是克服問題的一種方法
6. 履歷中希望能附上作品或是能展示能力的任何東西

履歷請寄: jason@mail.medialand.com.tw

想瞭解米蘭數位:
米蘭數位官網 - http://www.medialand.com.tw/
米蘭數位Blog - http://medialand.com.tw/blog/


=============================================
資深Internet程式設計師

1.具程式開發能力3年以上
2.熟悉ASP、ASP.NET、VB.NET、C#
3.熟悉ADO.NET Entity Framework 或 LINQ
4.熟悉SQL Server資料庫設計及維護能力
5.了解AJAX、jQuery、Javascript、CSS
6.了解MS平台架構,具備伺服器架構及管理經驗
7.擅長Web Base系統開發架構規劃設計及需求分析
8.具溝通協調能力、熟悉Team Work開發模式
9.責任制,視專案狀況需配合加班

履歷請寄:
tang@mail.medialand.com.tw
或jason@mail.medialand.com.tw皆可

2010年5月17日 星期一

Facebook Open Graph的登入授權方式


上一篇有說過,Open Graph的登入授權已經不像是以前Facebook Connect一樣。在Connect的時候,我們需要取得session_key以及動態的secret,而現在Open Graph則主要只需要一個key值,他們叫它access_token。
老實說我不知道這樣會不會比較安全,但是既然Facebook這樣做,我們靠它吃飯的也只好跟著做,不過至少,Open Graph取得access_token的方式可說是十分簡易呢,不用像Connect時代一樣傷透腦筋。

就像剛說的,要取得access_token很簡單。官方文件寫很多,但是歸納起來就是兩種方法而已,一個是透過網頁導向授權取得,另一種則是透過JS Api來取得。最常使用的當然是用JS Api,但是一定有某些因素Facebook才會提供導向式的方式取得授權,也許是某些application需要使用者一開始就是登入狀態,或是一些Desktop application無法使用JS Api… etc。


2010年5月10日 星期一

Facebook Open Graph試玩心得




Facebook前一陣子宣佈了Open Graph這東西,說實在反應很兩極化,多半都是跟隱私權有關係,另一個部份就是跟使用者行為的精準度分析有關,一但讓Facebook的手滲透入大部份使用者的網站或Blog之後,Facebook所能得到的資料可是非常值錢的東西啊…。


不過這種邪惡的趨勢及商業行為的東西不是今天這篇要聊的。



今天試玩了一下Open Graph,所以就來寫寫心得。


2010年4月28日 星期三

AS3裡出現不Single的Singleton


簡單的來說,就是有時候明明是使用Singleton.getInstance()但取得的instance就偏偏不是同一個。
一樣是一個開發上常會遇到的問題,今天我又遇到了,一下子以為是程式哪裡有bug,後來再看一下發現原來自己忘了會有這種情況發生,所以這次要記得寫下來放在blog上,免得以後自己又犯。

這問題會在這樣的結構下發生:
假設有一個載體A.swf,它會載入B.swfC.swf,然後有一個Singleton Class,就叫Singleton好了。
其中,B.swfC.swf都會使用Singleton.getInstance()來取得實體進行資料交換的動作,但是如果A.swf沒有先進行Singleton.getInstance()的話,B.swfC.swf所取得的實體會是不一樣的,這樣就一點都不single了。



解決方法一種就像剛剛講的,先在A.swf去取得Singleton的實體,但是這樣一來A.swf就永遠沒辦法跟B.swfC.swf進行鬆綁,是挺爛的一個解決方法。

另一個比較標準的解決方法就是在載入B.swfC.swf時順便把LoaderContextapplicationDomain設成ApplicationDomain.currentDomain就好了。

2010年3月4日 星期四

試作TTS (Text-To-Speech) for Flash


今天有朋友分享一個Flash的Text-To-Speech服務,網址在這
http://www.flashrealtime.com/real-text-to-speech-for-your-flash-apps/



這讓我突然想起來,之前因為專案的需求,曾經找過類似的資料,當時由於忙別的東西,所以就停了下來沒把這TTS寫出來。
其實這種TTS的服務有一個遠在天邊近在眼前,那就是Google。

Google並沒有真的「公開」的提供TTS的api給大家用,但是它卻有一個服務是有TTS功能的,而且TTS因為是聲音檔的關係,所以並不需要crossdomain policy就可以播放(當然,如果你要把它丟進mixer裡就是另一回事了)。因此這個服務即使Google沒有置放crossdomain.xml,也可以「不要太明目張膽」的使用。(如果要商業上使用請小心啊... 最好不要亂用...)
喔對,這個服務就是「Google翻譯」。

不過不管是上面那個FlashRealtime的TTS或是Google翻譯TTS,都.不.支.援.中.文!!

但我還是寫了一下powered by Google的TTS。

swf在這裡

整個程式十分簡單,就是直接new一個Sound類別去load一串網址而已:
http://translate.google.com.tw/translate_tts?tl=en&q=whatever you want to speek

就結束了。

因為之前有寫好了mp3切割及串接的類別檔,想說既然是可以直接用Sound類別讀進來,那應該就是mp3格式了吧?
於是順便的Google丟出來的東西丟到我的類別檔裡,但是結果卻發現它不是正確的mp3格式!?
這個問題目前還是無解,挺怪。

另外一個奇怪的問題,在本機寫這個TTS的時候,我送出request一直收到IOError,但是一擺到瀏覽器裡去看就ok!?
我猜Google應該是有做了什麼手腳限定一定要用瀏覽器才給資料吧?

總之就是這樣。

2010年3月1日 星期一

令人眼睛一亮的BingMaps


今天把玩了一下SilverLight版本的BingMaps,覺得它很威。
微軟很久以前就有個計劃叫PhotoSynth,現在透過BingMaps終於看到實體應用了,不過GoogleMap之前就已經擁有類似PhotoSynth的功能,所以相對的在BingMaps上看到就比較不這麼讓人驚豔,但是微軟在Demo時有demo到「live video」的synth,就很讓人想要鼓掌了。
Video在這邊:


PhotoSynth:


點Overhead View之後,會發現它把所有附近的圖片都依照地理位置湊起來了,有的點甚至多到可以看出大概地貌,很威。(我記得這也是當初PhotoSynth的終極目標)



除了PhotoSynth以外,我還很喜歡BingMaps的Bird’s Eye模式,這一點也是GoogleMap缺乏的,Bird’s Eye可以很清楚的看到當地的建築物高度位置,比衛星空照圖要人性化多了。


而且還可以旋轉,哈哈!


挺好玩的,另外一部份比較讓我感到驚訝的是SilverLight的發展速度,不久之前還挺陽春的,現在已經搞這麼完整了。嘖嘖。
是該時候再注意一下SilverLight的狀況了。

2010年2月24日 星期三

FlashSURF - AS3的圖像辨識


應該是有點累格了,不過是我這幾天看到的東西。
這東西發展起來的話應用範圍會很廣,跟一般的AR不一樣,雖然無法做到3D定位,但是優點是可以隨時選擇想要判斷的圖像,效能上感覺起來也不會太差,在目前flash上的AR都需要marker的情況之下,這一套markerless的技術應該可以產生另外一種玩法。

Demo影片:

Playing with flashSURF from Eugene Zatepyakin on Vimeo.

作者Blog:
http://blog.inspirit.ru/?p=343

AS3的MP3音樂編輯器!?


很久以前剛開始碰byteArray類別時,覺得很多東西可以用byteArray來玩,就曾經去找過mp3的檔案結構來看,然後寫了一個可以把mp3切來切去組來組去的類別檔。
但是後來發現雖然可以切割組合,但是卻遇到了兩個問題:
1. 無法混音,因為mp3裡的音樂資料都是被編碼過的,以AS3的效能來看,即使有codec,AS3也跑不動。
2. Sound類別無法直接讀取byteArray來播放mp3。(這邊指的byteArray是用URLStream或FileReference所讀入的mp3的byteArray,而不是FP 10之後Sound類別透過SampleDataEvent發聲的那種byteArray。)既然無法直接將mp3 的byteArray丟到Sound裡,那麼這個將mp3拆解組合的類別基本上就是一個很雞肋的東西了。
由於遇到這兩個問題,因此我很久就沒再去想起這個類別。

但是最近在查資料的時候,卻意外的發現上述第二點有解法了!這個解法是由Christopher Martin-Sperry這個人所寫的(http://www.flexiblefactory.co.uk/flexible/?p=46),他主要的原理是先在記憶體裡產生一個swf bytecode,再將mp3的資料「注射」到這個swf裡,接著用loadBytes的方式實體化swf,再用getDefinition的方式取出Sound類別,有興趣的可以自己點上面的聯結過去,那個頁面裡有他的類別可以下載,基本上如果我們如果純粹只是要將mp3的byteArray轉成Sound的話,只會用到ByteArraySegment.as、MP3Parser.as及SoundClassSwfByteCode.as這三個類別而已。
發現了這個solution之後,我這兩天就又把之前我自己搞的那個類別拿出來玩了,即使沒辦法混音,想說這樣至少還可以線上切割組合mp3之後馬上播放來聽,而且可以在mp3裡加入一些防君子不防小人的版權保護的東西,於是很手癢的就動手寫了起來。
只不過該怎麼說呢,應該說沒有每天在過年的,我遇到了另一個問題,努力了兩天之後目前無解,情況如下:
現在拆解切割組合以及播放都很ok,歸功於FP10,組好的檔還可以直接存在本機端。但是不管我怎麼修改找問題,切出來的那一塊部份,總是跟我原本想切的那一塊有一點點的時間差,曲子越長誤差越大,可以誤差到約一秒多的時間。

flash點這裡
有興趣的可以自己點過去玩玩看(需要Flash Player10),上傳一個mp3(別太大,因為我又有跑Sound.extract(),所以mp3太大的話記憶體會很耗),拉一個區塊,點「播放被選取的」聽聽看,再點「另存新檔」,再聽聽實體檔,就知道我在說什麼了。

我後來想一想,會不會是我在拆解mp3的byteArray時查找frame header時出了問題?
一般header的格式是4個bytes,以binary的來看的話其格式會是像這樣『AAAAAAAA』『AAABBCCD』 『EEEEFFGH』『IIJJKLMM』的格式,每個字母代表一個意義,而且每個frame的header不一定會一樣,我卻是偷懶直接取header的前兩個bytes來當辨識元,只要符合0xFF 0xFB的我就把它視為是header,我知道光用兩個bytes就來判斷是否是header的做法很冒險,而且運氣差一點的話有些header的第二個byte搞不好根本不是0xFB。
但如果真的是frame header出了問題,我目前說真的還沒想到要怎樣很有效率的依序找出每一個frame的header。

算了,也許這個問題我就只好先擺著了。
如果路過的有高手知道我可能犯錯的問題在哪的話,還請幫忙解答一下~~
感謝!

2010年1月4日 星期一

Facebook Flash Application開發心得(5) - 新版的streamPublish


Facebook的api在之前偷偷的有更新過了一次,但是flash的swc似乎仍然沒有變動,基本上影響不大。
其中發佈到個人塗鴉牆的部份,Facebook打算捨棄原本的template,從原本FB.Connect.showFeedDialog改成FB.Connect.streamPublish,這樣也好,不然每次要弄一個新的format就要去註冊一個新的template,這樣真的很麻煩。由於舊方法目前還可以繼續使用,但是為了將來著想,最好還是將舊有的程式改寫成新方法會比較好。
說是對flash影響不大的原因,因為雖然flash api裡原本就有com.facebook.commands.feed.PublishTemplatizedAction這個類別來處理發佈到塗鴉牆的工作,但是如果使用者沒有去允許這個app擁有完整publish_stream的權限的話(一般來說使用者很少主動允許這個權限),從flash發佈出去的東西是不會主動呈現在使用者的塗鴉牆上的,需要使用者回到自己的塗鴉牆再去點選一次才會真的出現,因此實用性並不大,我也是通常都使用javascript來處理發佈的動作。

因此在這裡記錄一下streamPublish該怎麼處理好了。
新版的發佈動作是藉由javascript api裡的FB.Connect.streamPublish來進行的。
streamPublish(String user_message, Object attachment, Object action_links, String target_id, String user_message_prompt, Function callback, Boolean auto_publish, String actor_id)
這些參數的意義分別為:
1. user_message:要講的話,通常是空的,由使用者自己填寫。
2. attachment:這是一個Object,就是原本的template,用來制定塗鴉牆上顯示的格式,attachment的寫法是重點,待會再提。
3. action_links:塗鴉牆上的連結,一樣是Object型態,通常是[{ "text": "點這邊!!", "href": "http://www.yourdomain.com/xxx.html"}];
4. target_id:要發佈到誰的塗鴉牆上,如果是要發佈到使用者自己的塗鴉牆的話,這個值就要帶空值。
5. user_message_prompt:會出現在user_message之前的一個開頭語,例如『正在想』、『覺得』…etc這些東西。
6. callback:對話窗關閉後會回call的function,如果不打算接受這個事件就不用管。
7. auto_publish:如果使用者已經同意publish_stream的權限且auto_publish是帶true的話,那麼使用者將不會看到有對話窗跳出來,訊息會直接出現在塗鴉牆上。(個人十分討厭這種作法)
8. actor_id:這好像是粉絲頁面用的,可以選擇直接發佈到粉絲頁,但前提是這個使用者是該粉絲頁的管理者。


看起來是很簡單明瞭了。
所以主要的重點還是在attachment。其實attachment跟以前的template差別不大,分別只在於以前的template先制定好了『格式』,現在的attachment則是隨時可以帶入不同的Object,比較活。
官方wiki對於attachment的解說請參考這個網址
http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29

通常attachment會具有以下幾個properties:
1. name:就是主旨。
2. href:主旨點下去會連結的網址,通常是app或是某活動、官網的網址。
3. caption:跟name不一樣,也跟下面的description不一樣,這個caption通常會寫出誰誰誰做了什麼事,在caption裡加上{*actor*}的話這一串字串就會自動被取代成使用者的名稱,例如:『{*actor*}剛剛做了心理測驗』,出來的結果就會是『Jason剛剛做了心理測驗』
4. description:嗯,這個就是一大堆文字了,可以當成作文去寫,通常facebook裡那些心理測驗在解釋測驗結果的那一大堆話就是塞在這個屬性裡。
5. properties:這屬性我還沒實作過,功能還不明,跳過。
6. media:除了description以外最多人用也最有興趣的就是這個屬性了,這是一個陣列,定義了所有會出現的圖或flash或聲音,全都塞在這個陣列裡,陣列裡放的是Object,每一個Object會有三個屬性:type,src,href。type定義是什麼媒體,有image、flash及mp3三種,src則是這個媒體所在的網址,href就是點了之後會連到哪。所以media應該會是類似這樣的型態:[{'type': 'image', 'src': 'http://icanhascheezburger.files.wordpress.com/2009/03/funny-pictures-kitten-finished-his-milk-and-wants-a-cookie.jpg', 'href': 'http://icanhascheezburger.com/2009/03/30/funny-pictures-awlll-gone-cookie-now/'}, {'type': 'image', 'src': 'http://photos.icanhascheezburger.com/completestore/2009/1/18/128768048603560273.jpg', 'href': 'http://ihasahotdog.com/upcoming/?pid=20869'}]
7. 剩下的像comments_xid及自定義屬性,好像都是要用再更深入的機制上才會用到的,目前我也沒實作過,因此一樣跳過。
基本上attachment最常被使用到的就是這幾個屬性了,差不多瞭解了之後就可以很快的發佈屬於自己的塗鴉牆。


接下來,如何從Flash去呼叫FB.Connect.streamPublish,不用說一定是透過ExternalInterface,需要注意的是,因為attachment是一個Object,我試過直接用Flash丟Object出來給js,結果是失敗的,雖然js也是收到一個Object,但是其實這個Object已經不是原本的Object了,所以要嘛就是把要發佈的attachment先在js裡寫好,但是這麼一來整個code又變得很不活,也無法類別化,所以我都會改採另外一種方式:JSON。
在Flash裡,先產生相對映的Object,然後藉由Adobe as3corelib裡面com.adobe.serialization.json的package,JSONEncoder類別將Object轉換成JSON的字串後,用字串的方式傳遞給js,js裡再還原成Object就可以了,js裡字串還原成JSON的方法可以直接用eval,或是使用JSON.js來做parsing的動作(JSON.js可在此下載http://www.json.org/js.html)。
這樣做的好處是可以在flash裡動態的隨時產生不同的attachment,視不同的狀況發佈不同的塗鴉牆,比較靈活,js也不需要因為每個專案而再重新編寫。