2011/12/2

身體只有一個

常常聽到有人說要做環保,因為地球只有一個

但從來沒有聽過身體只有一個這種說法

於是我想了一個問題

地球比較重要,還是身體比較重要?

應該是身體吧

那些想要好好愛護地球的人類們,更要好好愛護自己的身體唷

好好照顧自己 比做環保更重要

2011/12/1

背唐詩的快樂來源?

【校園】自由時報,讓我告訴你,我們為什麼「背唐詩」!這篇文章中

我對於其中一段文字很有意見

在此提出來討論一下

『我去年帶班的小二生,在上課敲鐘不久後,往往一個學生起了個頭,全班便琅琅背起李白「將進酒」,語調鏗鏘且充滿節奏感,他們覺得「將進酒」讀起來很美、很有意思,這種對詩句節奏之美的體會,小朋友沒有辦法用語言精準表達,他們只是自然而然的親身驗證這種來自古典文學的美感經驗。』

我覺得上面這句話前半段是對的,但後半段是錯的

『他們覺得「將進酒」讀起來很美、很有意思』這句話,和這句話之後是錯的

這位老師覺得小孩讀得很開心,但其實沒有

小孩只是為了把唐詩背起來而讀

我記得當時的快樂是這樣的:「耶!我背起來了!這麼難的東西我背起來了!」

而不是「哇這首詩好棒!多念幾遍!」

我在想是不是只有我這樣

也許真的有小孩子會覺得「哇這首詩好棒!多念幾遍!」

所以以下開放投票

1. 「耶!我背起來了!這麼難的東西我背起來了!」
2. 「哇這首詩好棒!多念幾遍!」



至於為什麼讀的語調鏗鏘且充滿節奏感,那是老師教的

當小孩不是那樣讀時,老師聽不慣讀法就會對學生作修正

2011/11/17

免費網路空間 - Dropbox



現代人哪有在帶隨身碟的?

安裝 Dropbox 後會得到一個資料夾

在資料夾下的檔案就等於在網路隨身碟內

家裡電腦和公司電腦都裝 Dropbox 就自動同步資料夾內的檔案


Dropbox 資料夾裡面有一個特別的資料夾 Public

如果把檔案放在這裡 就可以把檔案變成一個網址讓人下載

像這樣在檔案身上按右鍵 → Dropbox → Copy public link


現在我貼的圖片就是放在 Dropbox

另外還有多人共用資料夾的功能 這裡就不多說了

2011/11/10

A Few Thoughts on the Concept of Time

A Few Thoughts on the Concept of Time.

Thanks for translation by Jill and Lucky.

















時間観念

現代人の時間に対する概念

翻訳者のレキさんに感謝致します。

















2011/11/8

時間觀念

現代人的時間觀念









看不到圖的人 點這裡

為了國際化
日文版
英文版

2011/11/1

可愛小龜龜的實況

這是一個虛擬角色的實況

可愛小龜龜的實況

我還需要一些技術支援 :

1. 小龜龜的時間同步 → 在多台電腦取得相同的現在時間
2. 小龜龜的狀態同步 → 在多台電腦產生相同的亂數值
3. 即時聊天室 → 完全不知怎麼弄


解決1的方法:

http://www.earthtools.org/webservices.htm#timezone

在flash 連線時取得標準時間計算系統時間差值
在時間差值有大幅度變動時 重新取得標準時間

2011/10/31

event typeError

開個新的 fla 輸入以下的程式:

this.addEventListener(MouseEvent.CLICK, mouseClick);
function mouseClick(e:MouseEvent):void{
trace("test");
}
this.dispatchEvent(new Event("click"));



執行後會得到

TypeError: Error #1034: 強制轉型失敗: 無法將 flash.events::Event@aa93821 轉換成 flash.events.MouseEvent。
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at _fla::MainTimeline/frame1()


這個故事告訴我們
不同的eventType 使用相同的 eventName 會死
意思是當想要使用 this.dispatchEvent 之前
必須先了解 this 會丟出的 event 已經有哪些

2011/10/28

AS3 for the variable

如何用一個迴圈把目前 class 的變數名稱都列出來?

import flash.utils.describeType;
for each(var varName: String in describeType(this).variable.@name)
trace(varName);

2011/10/26

行車紀錄器 + GPS = 街景車

核心概念:
行車紀錄器 + GPS = 街景車

假設行車紀錄器公司

提供一項新服務讓行車紀錄器的影片可以免費存到網路上

但是影片要開放給公司使用

公司就得到超多台免費的街景車了

2011/7/10

我認為的股價規則

紀律
1. 買進之前設定目標價、賣出條件(停損規則和停利規則)
2. 遵守停損價格,如果不停損,判斷錯誤一次就畢業
3. 昨天的收盤價是今天的成本價

基本面買法
1. 長期投資
2. 向下攤平

技術面買法
1. 順從趨勢
2. 小跌停損

股價的移動方向
基本面
1. 目標價是由基本面估計而來
2. 股價會朝向目標價移動
3. 你的目標價不等於我的目標價
技術面
1. 股價有慣性,下跌趨勢會超跌,上漲趨勢會超漲
2. 均線有引力,股價離均線越遠,均線的吸引力越強
3. 法人和主力會炒作和改變短期趨勢


可能存在的潛規則?
1. 星期一或星期五特別會漲跌?

2011/7/8

初入股市心得

買股票的原始目的是為了拿股利
股利一年會發一次,但如果公司沒賺錢就不會發股利(有些公司賺了錢也不發股利)

如果說用存款作比喻
錢存到銀行會有利息
錢存到股票就會有股利
股價是本金,股利是利息,其利率就是殖利率

殖利率 = 股利/股價

存錢的話,當然關心利率了
在這裡有殖利率排行
有一篇文章
殖利率>10%的股票是值得買進的
殖利率<4%的股票是不值得買進的

假設存在一間每年穩定發放3元現金股利的公司
分別代入殖利率10%和殖利率4% 去看他的股價應該落在哪裡

0.1 = 3 / 最低股價
0.04 = 3 / 最高股價

得出

最低股價 = 30
最高股價 = 75

假設我們今天運氣很好30元買進
那我們每年可得到10%的利息
但若股價已經漲到75
則必須考慮現有股價
每年只得到4%的利息

雖然賠了利差,但賺了價差
如果我們在最低股價時買進 最高股價時賣出就會得到價差利潤

利差 = 最高股價 / 最低股價 - 100%
利差 = 75 / 30 = 150%

利差 = 最高殖利率 / 最低殖利率 - 100%
利差 = 0.1 / 0.04 = 150%


如果每年賺10%利息,要幾年才可以賺到這個利差值呢?大約9年多
因此我們發現
買股票的原始目的從拿股利,變成賺利差
如果賺不到利差,再求其次

我們不一定要買在殖利率10%,賣在殖利率4%
我們可以買在殖利率8%,賣在殖利率6%
這並不難

利差 = 0.08 / 0.06 - 1 = 33%

但這其中有些變數,在前提的假設中變成常數
1.公司不一定會每年穩定發放定值的股利,這跟產業別有關,同時也說明為何有些產業別會大漲大跌
2.最高殖利率和最低殖利率應該設為多少,依照每年的景氣而不同,應該考慮的是相對高和相對低的殖利率
3.公司的每股盈餘不一定全部變成股利
4.由於股利發放是在隔年,所以今年的每股盈餘影響的是明年的股價

2011/7/1

debug技巧

Q:如果想要知道某個函數被那些人(Class)呼叫過,是在第幾行被呼叫的?

A:幫函數多加一個必填的參數,造成呼叫時會產生error
  於是編譯時就可以看到所有呼叫他的人都會Error: Incorrect number of arguments,而且會顯示第幾行

2011/6/24

今天想到的衍生性金融商品 - 演唱會的票

如果有家證券行販賣演唱會的票 ( 或者是其他限量人數的活動的票 )
票在演唱會開唱前到期
到期後才可兌換實體票券

那麼就會有幾種好處
1. 不會有黃牛票 或者說所有的票都是黃牛票
2. 不會有購票系統當機或使用困難的問題
3. 票價會真實反應出歌手的價值
4. 證券行又多賺一筆 超爽

2011/6/22

關於念書

因為人類只會挑自己有興趣的書來念

而這些書裡面寫的內容 通常也跟自己的想法接近

書裡面有提到但不認同的部分 也會被選擇性遺忘

看完書之後 會更確定自己的方向 得到自我認同

所以讀書是一種正向循環的行為

2011/6/20

社群服務業

今天在 plurk 上面看到這個連結
介紹文
http://blog.yam.com/ir123456789/article/30974652
價格
http://www.escapeartist.com.tw/EscapeArtist/Price.html

這是介紹一間店的連結
這間店提供顏料、畫筆、畫布,也提供食物,只要付錢就可以進去畫畫
同時也可以看到其他人在畫畫

看到這間店之後我想到的是
其實所有服務業都可以做這樣的事情
「每個人付錢後進店裡面只做一種特定的休閒」

我第一個想到的是網咖
第二個想到的是球場
第三個想到的是賭場
第四個想到的是漫畫書店
上面說的這些店都不稀奇

為什麼這間店會讓我有一種新奇的感覺呢?
我認為他多做了一件事情
那就是讓人認識人的機會變高
如果這間畫室是每個人獨立隔間 那就爆了

這間實體店面是以類似網路論壇的概念存在
專業論壇可以吸引專業人群聚集

如果以這個方向去想就會得到一個結論
有些社群服務可以做成實體店面
「只要設計一套規則讓店裡的客人 容易認識人」

打個比喻
如果說社群服務網站是虛擬實境
那麼社群服務的實體店面就是擴增實境
而擴增實境確實是比虛擬實境有吸引力的

因為人類還是比較喜歡活在現實呀

2011/6/15

[問題] 使用 Class 類別動態建立物件的建構式參數

我想要一個物件產生器的類別
目標是以下的程式可以動

var cb:ClassBuilder = new ClassBuilder(Point, [10, 20]);
var p:Point = cb.build();

注意:Point 類別是不可修改的
也就是說我不能透過其他函數去設定建構式函數的初始值

所以我這樣寫

public class ClassBuilder
{
 var c:Class;
 var p:Array;
 public function ClassBuilder(c:Class, p:Array)
 {
  this.c = c;
  this.p = p;
 }
 public function build():c{
  c.這裡要寫什麼
 }
}

有兩個問題

1.build函數傳回型態問題

我不能限制 build 傳回型態是 c
不過這不要緊 可以傳回Object再轉型 或是用*


2.建構式參數傳遞問題

因為我的參數 p 是陣列
如果建構式是一個 Function 類別的函數
那麼我就可以用

  var f:Function = c的建構式;
  var o:Object = f.apply(null, p);

的方式去傳建構式參數

== 嘗試 1 ==

我嘗試了以下這行程式

var f:Function = Function(c);

結果得到錯誤訊息
  [Fault] exception, information=EvalError: Error #1066: 不支援表單 function('function body')。

== 嘗試 2 ==

如果直接寫

  c.apply(null, p);

會得到沒有 apply 這個方法



我沒梗了 這問題有解嗎?
我現在是使用這樣的方式替代
public class ClassBuilder
{
 private var c:Class;
 private var p:Object;
 public function ClassBuilder(c:Class, p:Object)
 {
  this.c = c;
  this.p = p;
 }
 public function build():*{
  var o:* = new c();
  for (var attr:String in p)
   o[attr] = p[attr];
  return o;
 }
}

不過並不是所有建構式的參數都是 public var
所以還是會有問題
其實只要讓建構式能吃陣列型態的參數就能解決了
但是不知道要怎麼寫

2011/6/9

flash mask test 遮罩測試



附上測試原始碼

上面是遮罩
左邊是被遮物
交集是結果
程式碼是寫 「左邊.mask = 上面;」


這次的遮罩測試
主要是測試什麼東西可以當遮罩 什麼東西不能當遮罩
這是因為線段不能當遮罩的關係
點陣圖在有些時候會變成有上色的部分才是遮罩
有些時候是整張都遮罩
測試項目有
(L) 線段shape
(F) 填滿shape
(b) 外圍有留一圈空白的點陣圖
(B) 整張填滿的點陣圖
(C) 加上快取成點陣圖 cacheAsBitmap
(S) 包一層 sprite

有很多種變化
CL 表示被快取成點陣圖的線段
SL 表示一個線段shape被sprite包一層
CSCL 表示sprite有快取, shape也有快取


從結果可以看出
1. 線段不能當遮罩 即使加了快取成點陣圖也不能 除非兩張圖都加快取
2. 如果兩張圖都加了快取 就會有半透明遮罩的效果
3. 並不是 Bitmap 就可以不用加 cacheAsBitmap
4. cacheAsBitmap 只認最外面那層,在容器裡面寫 cacheAsBitmap 是沒用的

2011/6/7

屬於我的表達方式

延續之前的文章

很高興的是今天跟朋友聊天後得到一個結論

屬於我的表達方式是測驗和遊戲

因為我把一些我想要知道的問題

包裝成測驗和遊戲了

2011/6/3

iPhone & Android

以下文章完全是我憑感覺猜的
因為我根本沒用過 iphone 和 android

主要使用者分析
 不會寫程式的人
  購買原因
   iPhone : 使用者介面 + i don't care.
   android: 硬體數據 + 反Apple
  購買app意願
   iPhone : 高
   android: 高

 會寫程式的人
  購買項目:原因
   iPhone : 開發機
   android: 開發機
  購買app意願
   iPhone : 低
   android: 低

使用者分布
 不會寫程式的人數
   iPhone: 多
   android:少

 會寫程式的人數
   iPhone: 少
   android:多

結論:
 我認為在 iPhone 上面賣付費app 會比 android 好賣
 理由:會買 iPhone 的人根本不會 care 幾美元的 app 價格

 不過說是這樣說但app開發商還是會兩個通路都吃

2011/6/2

2011/5/27

職業路線

商人:
成本估計
利潤估計
利潤分配
獲利方式:買低賣高


名人:
寫文
出書
演講
上課
獲利方式:知識和品牌形象

2011/5/23

避免 flash 跑大型迴圈造成畫面 lag 的方法

如果想要執行看看的人請下載這個檔,內含有cs4版本的fla
壓縮檔下載

只想看code的人可以點開這個
For.as
ForTest.as

我作了一個 class
用來避免大型迴圈造成畫面 lag 的方法
我沒有作完全的最佳化(覺得不夠最佳化的人自己改code哦)

最基本的用法是
new For(n,function(i){
  //迴圈裡面的程式
});


ForTest 是主程式,需要搭配 forTest.fla 才能執行
用來 demo For 類別的效果

執行後會在畫面上看到兩個在跑的小球
和兩個按鈕 test1 和 test2
test1 是使用一般的for去跑1000次
test2 是使用For類別去跑1000次

如果發生 lag 情況
上面的球就會跑得比下面的球慢
可以試著連續按test2按鈕
觀察lag的情形

當同時存在很多個 for 在執行時,會採取 round-robin 的機制執行

2011/5/18

[心得] ByteArray.compress 壓縮函數

這篇文章描述了使用 compress 並不會減少實際記憶體使用量

以及解決方法

========================= 問題描述 =========================


我有一個 ByteArray 為了節省記憶體 所以要壓縮
var byteArray:ByteArray = 某個很大的ByteArray;


我先觀察一下資料量
var length1:int = byteArray.length;


之後使用壓縮函數
byteArray.compress();

再次觀察
var length2:int = byteArray.length;


看一下壓縮比
trace((1-length2/length1) * 100 + "%");
印出來是 99.xxx%


但是觀察記憶體使用量卻沒有下降



========================== 解決方法 ====================

複製一份 byteArray
var byteArray2 :ByteArray = new ByteArray();
byteArray2.writeBytes(byteArray);


然後把舊的替換掉
byteArray.clear();
byteArray = byteArray2;


就可以看到記憶體確實下降了

2011/4/29

為什麼價值觀會影響行為

因為人類會往「好」的方向發展

而價值觀定義了什麼是「好」

所以人類就變成往價值觀好的方向發展

我們可以把價值觀視為一個評價函數,或者是一個評鑑、評量標準


一個錯誤且具有公信力的評價函數,會有很大的影響力

比方說

我們使用GDP來評價國家時,國家的政策就會往增加GDP的方向發展

我們使用論文數量來評價學校和評價教授時,教授就會發大量論文


我的價值觀決定了我的行為,也決定了別人的行為

在此同時我也被社會的價值觀所制約了

比方說

我怎麼幫異性打分數,就決定了我會喜歡誰

相反,當我知道我喜歡的異性是怎麼幫我打分數,就決定了我的行為

2011/4/28

人的現值公式

公式:
人的現值 = 年薪 / 年投資獲利率

舉例說明:
人可以賺錢
錢可以滾錢

假設我的年薪是 10 萬
那麼根據錢滾錢,我的價值就是能投資一年獲利 10 萬的錢

這關係到投資獲利率
假設是5%好了

因為200萬的 5% = 10萬
所以我的現值是200萬

因為擁有200萬和擁有我,都能得到相同的年收入 10 萬
所以我的現值是200萬

2011/4/20

兩條2次貝茲曲線模擬一條3次貝茲曲線

html:http://cgm.cs.ntust.edu.tw/etrex/curve/curve.html
fla :http://cgm.cs.ntust.edu.tw/etrex/curve/curve.fla
那些圈圈可以拖曳

因為2次貝茲曲線的接合處是無法保證平滑的
但是3次貝茲曲線可以保證平滑

可惜的是 flash 只支援2次貝茲曲線
如果能用2次貝茲曲線模擬出3次貝茲曲線的平滑效果
那麼就可以畫出漂亮的曲線

但是模擬過程中
為了要接合處平滑 反而有bug產生 0.0

2011/4/18

OOP-對介面作設計

眾人認為的介面

但是不是要講這種介面


PPT online
PPT download

現場錄影

2011/4/10

Pixel阿




Pixel2x2阿:http://webetrex.appspot.com/colorTest/Pixel2x2Ah.html
Pixel3x3阿:http://webetrex.appspot.com/colorTest/PixelAh.html
Pixel5x5阿:http://webetrex.appspot.com/colorTest/Pixel5x5Ah.html

Pixel阿練習:http://webetrex.appspot.com/colorTest/PixelAhPractice.html

遊戲介紹:
 基本上是一個訓練記憶力的遊戲
 訓練方式是記住題目
 然後回答剛剛看到的題目是什麼
 特色是回答第 n 題之前要先回答第 1 到第 n-1 題

2011/4/8

AS3 Strategy Pattern

Strategy 是以 class 包裝狀態行為的 pattern

它的特性是會產生許多的 Class

我認為class數量越多越不好管理

所以我寫了這樣的一個 Strategy

http://paste.plurk.com/show/416988/

讓狀態的行為可以動態決定 而只需要一個class

2011/3/21

FLASH - 精準的Timer

我們知道 flash 裡面內建的 Timer 是不精準的(有痛苦過的就知道)
為此我用 EnterFrame 事件和 new Date() 取得系統時間
做了一個精準的Timer (比較吃效能是當然的)

當然也可以用一個高速的 Timer 去取代 EnterFrame
不過原理是一樣的,就是儲存 Timer 產生的誤差

以下是程式碼
http://paste.plurk.com/show/403072/

這個就是以系統時間為基礎的精準的Timer


如果今天我們想要讓flash動畫和音樂同步
那麼就應該做一個 SoundTimer 是以 SoundChannel.position 的值為基礎
而不是以系統時間為基礎

那麼他的建構式大概就會長這樣 new SoundTimer(soundChannel:SoundChannel)
然後我們就可以用這個 SoundTimer 來做音樂遊戲了

plurk api test

http://cgm.cs.ntust.edu.tw/etrex/etrexJs/plurk/plurkjsonpdemo.html

2011/3/17

[企劃] MMORPG 裝備合成 強化 鑲嵌 煉丹模組

基於大部分遊戲都是提供一個介面

讓使用者點選要合成的武器和要消耗的道具

選好之後按下OK 最後根據機率決定結果

我認為這樣對玩家來說是枯燥的 或者說是不寫實

無法感受到創造物品的感覺


從小說改編成線上遊戲的例子很多

但是關於小說裡面描述煉丹的過程是很有趣的

在遊戲中玩家卻得不到煉丹的樂趣


而有些小遊戲 有做到這個部分

比方說廚師遊戲之類的

所以說如果把遊戲中的生產行為

變成是以小遊戲的形式進行

一樣是同一個介面 但是按下合成後進行小遊戲

根據小遊戲的分數 可以影響成功的機率值和結果的品質


如此一來

就會有真正的煉丹大師玩家

而不只是人人有錢人人可以做大師


小遊戲也可以是音樂節奏遊戲

比方說鍛造要有節奏地敲打什麼的


如果有這種的中文版線上遊戲 我一定會玩的

2011/3/16

程式語言的熟練度分級

新手級:
有google, 有文件的情況下 使用IDE還是擠不出幾行程式

進階級:
有google, 有文件的情況下 使用IDE正確無誤地寫出程式

大師級:
無google, 無文件的情況下 使用記事本正確無誤地寫出程式

2011/3/14

ㄚ服被盜帳號



程式語言的奧妙之處在於提出重複程式碼

提出重複的程式碼段落,或者說提出需求變更
透過class method 的包裝後,就可以變成相同型態的變數

一般人可能都懂新手程度的提出重複程式碼

但是這種程度的提出程式碼就不一定

以上是 Command Pattern 正規的作法,但是這種做法喪失了語言特性(一般物件導向程式沒有 Function Class)

這種善用語言特性的這種作法,是可以考慮的,不必按照教科書上的方式走

2011/3/10

Design Pattern & 重構筆記

==重構==
目的:
1.提出需求變更,增加彈性
2.增加程式碼可讀性

缺點:
1.class 數量增加
2.目的1和目的2有時候是衝突

作法:
提出需求變更



==Design Pattern==
Strategy Pattern
作法:
將狀態變數從 Enum 或 String 改為 Class
使得狀態身上可以攜帶方法



Null Pattern
作法:
建立 Null 狀態 Class
使得 Null 狀態身上可以攜帶空白方法
可避免 if ( status == null) 等程式

2011/3/3

google search api

http://searchetrex.appspot.com/?q=關鍵字&callback=函數名稱&start=(頁碼-1)*10

範例:http://searchetrex.appspot.com/?q=科科&callback=alert

第二頁:http://searchetrex.appspot.com/?q=科科&callback=alert&start=10

原始程式碼:http://paste.plurk.com/show/387610/

google dictionary api

http://www.google.com/dictionary/json?callback=parseObject&q=phone&sl=en&tl=en&restrict=pr,de&client=te

2011/2/24

公司制度與設計模式

物件導向程式是定義一堆類別(Class)
執行時會 new Class() 得到一堆實體(Instance)

我說公司裡的每一個員工就像是一個Instance
Class是他們的職稱
Class裡code是他們的工作內容

或者更嚴謹一點地說
Interface是他們的職稱
每個人都有一個自己的Class去實作職稱
而且每個Class都是Singleton (但是這樣講就太複雜了)

上面所說的,是在建立一間公司的物件導向模型


我們寫物件導向程式為什麼會需要使用設計模式
就是因為設計模是能夠讓程式更好維護和有彈性
而且是經過許多專案和時間的驗證

對公司來說,設計模式可以說是公司制度
好的公司有好的公司制度,如果我們將這些制度抽離出來
那就是公司的設計模式

從這個角度看就可以說明一間公司有良好的制度
會使得公司在環境改變下求生存的機率提升(因為有彈性和好維護)
也可以說明一間公司制度設計得太複雜(過度設計 (Over Engineering))
就會造成效率低落,因為員工把大部分的時間都拿去維護制度了

所以一個好的公司領導人應該要會的是設計良好的制度,比方說建立SOP等等
還要讓員工和員工之間低耦合,這樣有人要離職的時候才不會很慘 = =
或者我們可以用OOAD的概念去設計公司制度

最後,一人公司就是神之物件的代表

2011/2/22

PureMVC 心得

一個應用程式由三種東西組成:Model、View、Controller
Model 是資料模型
View 是顯示畫面
Controller 是程式流程


PureMVC架構下是由一個 Facade 管理 Model、View 和 Controller
根據PureMVC說明文件Facade pattern的定義
Model class、View class 和 Controller class是確實存在的
但是我們看不到,因為已經被 Facade 包裝起來了


我們能寫的部分是Proxy、Mediator 和 Command
然後註冊給 Facade
理論上,Facade 應該會:
將 Proxy 交給 Model 管理
將 Mediator 交給 View 管理
將 Command 交給 Controller 管理
但因為Facade已經將MVC架構包裝好了,所以我們並不需要管這些東西


就我的觀點來看
每個 Mediator 會負責管理一個像是flash內建 "組件" 的那種東西
只有這個 Mediator 有權力存取這個組件
組件則是在畫面上的控制項,組件本身應該要提供和使用者互動的能力
而在PureMVC,將組件稱為viewComponent


在 Mediator 裡,我們應該會寫兩種東西
1. 註冊 "什麼時機(Notification)" 要去存取 viewComponent
2. 當使用者對 viewComponent 作互動時,丟出 Notification


我認為一個TextField加上一個Sprite不能說是viewComponent
因為他沒有經過包裝,提供存取的方法


我在某些人的範例中有看到 Mediator 會包含一些 viewComponent 本身的存取方法
但如果Mediator 跟 viewComponent 切不開,那麼組件就無法在其他專案重用
或者說重用 viewComponent 的時候你就會發現你的 Mediator 有些 code 會重複


每個 Proxy 會負責和內部或外部資料作存取
在這裡指的內部,是指存在 flash player 記憶體中的變數資料
外部應該是後端的 web service server 或是某個外部檔案,總之不是在記憶體內的變數資料
我們會在 Proxy 裡面寫好存取內外部資料的程式,和丟出資料變更的事件


最後我們會在 Command 決定何時該去存取 Proxy


其中 code 可以在其他專案重用的部分有 viewComponent 和 Proxy
Mediator 和 Command 應該是很少機會能重用


以上全是猜測,因為我沒寫過PureMVC專案,我只看過文件和幾個範例和參加第1次AS讀書會


如果要用我上次畫的精美圖片來解釋 javascript 版本的 web programing


那就是用 Mediator 去包裝 3、4
用 Proxy 去包裝 2、5
用 Command 串接 2 → 3 和 4 → 5

不過我現在重看這張圖我好像數字寫錯了,執行順序應該是 4 → 5 → 6 → 1 → 2 → 3

2011/2/21

辨色力分數統計分布

辨色力測驗Alpha
遊戲連結
分數統計 (分數代表誤差 越低越好)

RGB調色力一分鐘版Alpha
遊戲連結
分數統計 (分數越高越好)

CMYK調色力一分鐘版Alpha
遊戲連結
分數統計 (分數越高越好)

即時運算的圖表太吃效能,改為定期更新的圖表

2011/2/19

CMYK調色力一分鐘版alpha

測驗連結:http://webetrex.appspot.com/colorTest/CMYKfitAlpha.html

測驗方式:

 題目由亂數產生

 請使用CMYK選色器選出與題目最相近的顏色

 選好之後按下OK 到下一題

 測驗時間共一分鐘

 分數是依據答題數和顏色的精準度

RGB調色力一分鐘版alpha

測驗連結:http://webetrex.appspot.com/colorTest/RGBfitAlpha.html

測驗方式:

 題目由亂數產生

 請使用RGB選色器選出與題目最相近的顏色

 選好之後按下OK 到下一題

 測驗時間共一分鐘

 分數是依據答題數和顏色的精準度

2011/2/18

Web Programing

2011/2/16

辨色力測驗alpha

測驗連結:http://webetrex.appspot.com/colorTest/gameAlpha.html

測驗方式:
題目共五題由亂數產生
請使用RGB選色器選出與題目最相近的顏色
選好之後按下OK 到下一題

五題結束後就可以看到分數和花掉的時間

測驗結果統計:
抽樣:PTT little-games版上 172 人次鄉民
google doc

統計結果:
 分數平均 70.21
 時間平均 3分45秒

分數分布圖:

2011/1/29

jsonp proxy using python and google app engine

API用法:
http://proxyetrex.appspot.com/?callback=函數名稱&url=網址

範例:
假設我們想要連線到http://www.useragentstring.com/?getJSON=all取得json

作一個 alert 的 jsonp
http://proxyetrex.appspot.com/?callback=alert&url=http://www.useragentstring.com/?getJSON=all


python 實作的程式碼

2011/1/15

jsonp proxy

我們知道 jsonp 是需要 server side 支援才有可能辦到
比方說userAgentString.com不支援 jsonp
API介紹
用法

所以我們需要另一台 server 去讀取上面的 json 然後支援 jsonp
正好已經有webetrex.appspot.com幫我們作這件事了
API介紹
用法

所以我們可以實驗一下效果
Parse JavaScript Object Online
import 這個 jsonp
就會看到正確的完成任務

正式介紹 Parse JavaScript Object Online

Parse JavaScript Object Online
是一個用來爬 Object 物件結構
以自動完成和 treeview 來顯示
來達到觀察別人 code 的功能

網址 : http://cgm.cs.ntust.edu.tw/etrex/etrexJs/ObjectTreeview/InteractiveTreeview.html


目前支援的功能:
 1. 外部匯入js
 2. treeview
 3. 自動完成
 4. deeplinking


使用方法:
 當你在文字方塊內輸入的字有意義時,就會執行功能 2 3 4
 當你點下 treeview 身上的節點時,就會執行功能 2 3 4
 當你覺得你要看的 js 沒在裡面時可以使用功能 1
 因為 deeplinking 的關係,所以可以這樣用
  #YAHOO.lang.trim
  #$.trim
  #dojo.trim


使用範例:
輸入物件名稱
  #etrex
  #jQuery
  #window
  #document
輸入運算式
  #new Array("T","E","S","T")
  #2*Math.PI
  typeof navigator.mimeTypes
  $.isFunction(parseObject)



我是作者

如果有什麼問題或意見可以提出

2011/1/12

Javascript Detect Device and Browser

根據這個網頁在每個瀏覽器開出來的結果

我寫了以下的程式,可以用來判斷client端的設備和瀏覽器

etrex.Util.GetDevice = function(){
var detectArray = ["iPad","iPod","iPhone","Windows","Macintosh"];
var str = "";
for(var index in detectArray)
if(navigator.userAgent.indexOf(detectArray[index])!= -1)
return detectArray[index];
return "unknown";
}
etrex.Util.GetBrowser = function(){
var detectArray = ["Chrome","Firefox","MSIE 8.0","MSIE 7.0","MSIE 6.0","Opera","Safari"];
var str = "";
for(var index in detectArray)
if(navigator.userAgent.indexOf(detectArray[index])!= -1)
return detectArray[index];
return "unknown";
}


和一個實際的 Demo,看不到demo結果的人可能是昨天已經快取到etrex.js這個檔案,需要清除一下快取。

如果看到結果是 unknown,那就表示我沒有把你的設備或瀏覽器加到 detectArray,這時候就可以看一下這篇的第一句話上面的兩個連結,然後把該加的字串加到detectArray裡面。

2011/1/11

Parse JavaScript Object Online

為了快快樂樂學習js而作的一個函數

功能是把js Object轉成jQuery Treeview所需的html碼

可以用來觀察 js object 結構

以下是結果 有興趣的人可以看一下原始碼

Parse JavaScript Object Online