Flashオープンソースプロジェクトとライセンス
Wikipediaを見て調べたので大嘘があるかもしれません。Wikipediaの文章には即しているつもりです。
GPL
コピーレフト(使用等に関する制限が派生物に一生つきまとう)。配布する場合は、改変できるように必要なものを全て配布する必要があり、また複製・改変したものを再配布する場合も同様にGPLに関わるもの全てを開示しなくてはいけない。GPLを含む商用アプリケーションを配布する場合は面倒くさいかも。TVゲームのICOでGPL違反があったとかでニュースになっていたのが記憶に新しい。著作者の表示とかは不要。
代表的なもの:
amfphp
FLARToolKit - Spark project
参考:
GNU General Public License - Wikipedia
Mozilla Public License (MPL)
コピーレフト。基本はGPLと同じ。ただし再配布物のライセンスをMPL, GPL, LGPL(Lesser GPL。GPLより制限の緩いもの)から選択可能な点が異なる。一旦ライセンスを変更した派生物はそのライセンスに従う必要がある。例えばMPLのものを改変しGPLで再配布したらその派生物のライセンスは以降GPLとなる。下記のThunderBoltはコンソール本体のソースを公開していないのでプロジェクト全体としてはMPLの基準を満たしていない。
代表的なもの:
flash-thunderbolt - Google Code
Flex SDK - Adobe open source
参考:
Mozilla Public License - Wikipedia
MIT License
非コピーレフト。問題が生じても一切責任は負わないという条件が特徴(免責事項を記載しなくてよい)。好き勝手使ってよい。著作者と使用許諾(どちらも決まったフォーマット有。詳しくはlicenses/MIT_license - Open Source Group Japan Wiki)を全ての配布物、または重要な箇所に記載しておく必要がある(開示の必要性があるかどうかは不明)。Flashのオープンソースプロジェクトはこのライセンスのものが多い。
代表的なもの:
papervision3d - Google Code
tweener - Google Code
rubyamf - Google Code
BSD License
非コピーレフト。上記MITライセンスと似ていて無保証と著作権表示を守れば改変・再配布OK。さらに配布物の開示も不要。現在は著作権表示すら不要のNew BSD Lisenceが主流。たぶんもっとも扱いが簡単なライセンス。
代表的なもの:
as3flexunitlib - Google Code
as3corelib - Google Code
Cairngorm - Adobe open source
Apache License
非コピーレフト。著作権と免責事項の表示が必要(テンプレート有)。改変したものを配布する場合は、改変箇所の明記が必要。配布時には別途Apacheライセンスの条文コピー(LISENCE)と使用ライブラリに関する詳細(NOTICE)を記述したファイルを添付する必要がある。
代表的なもの:
away3d - Google Code
ICODecoder - Spark project
参考:
Apache License - Wikipedia
Apache License, Version 2.0 - The Apache Software Foundation
[ActionScript] privateクラスとprotectedクラス
Tags: ActionScript
publicとinternalはクラスに修飾できるので、それ以外のprivate(自分のみアクセス可能なコンストラクタ)とprotected(継承したクラスのみアクセス可能なコンストラクタ)を作ってみる。注意する点があって、ここで言うprotectは継承クラスのアクセスは可能で自分のアクセスは不可。というのも親玉クラスをAbstractクラスとして扱いたいという理由があったからです(サブクラスのみnew可能にしたかった)。
privateクラス
privateにしたいクラス(TestPrivate)ファイル内のパッケージ外部にダミークラスを作成し、TestPrivateクラスのコンストラクタの引数にする。DummyクラスはTestPrivateクラスファイル内ではアクセス可能だが、その他からはアクセス不可能でnewしようとするとコンパイルエラーになる。実際にインスタンスを使用する場合はTestPrivateクラス内のメソッド経由(ここではgetInstance)で作成するしかない。少し改良を加えるとsingletonインスタンスを作るときに使える。
//TestPrivate.as package com.borealkiss{ public class TestPrivate { private _instance:TestPrivate; //Constructor public function TestPrivate(dummy:PrivateClass){ } public static function getInstance():TestPrivate{ _instance = new TestPrivate(new Dummy()); return _instance; } } } //Dummy class outside the package but still in the same file. class Dummy{ //Constructor public function Dummy(){ } }
protectedクラス
protectedにしたいクラス内にそのクラス名を記述したコンスタントを作成しておく。コンストラクタ内でnewされようとしているクラス名と比較し、合致したらエラーを吐かせる。TestProtectedクラスをnewするとエラーが表示されるが、TestProtectedクラスのサブクラスの場合、getQualifiedClassname(this)の内容が変化するのでnew可能。Abstractクラス(サブクラスのみnew可能)として利用できる。
//TestProtected.as package com.borealkiss{ import flash.errors.IllegalOperationError; import flash.utils.getQualifiedClassName; public class TestProtected { private static const THIS_CLASS_NAME:String = "com.borealkiss:TestProtected"; //Constructor public function TestProtected(){ if (getQualifiedClassName(this) == THIS_CLASS_NAME){ throw new IllegalOperationError("Must be subclassed to use."); } } } }
[AIR] Adobe AIR Update Framework
Tags: AIR
Adobe Labsが提供しているAIRアプリケーションの自動更新機能と専用のUIを含んだ便利パッケージについて。実際の使用方法はAdobe AIR Update Frameworkを使ってみる - kwLogがわかりやすい。
長所
- 更新情報のキャッシュが効く。ApplicationUpdaterUI.delayというプロパティ(defaultは1日)で最新アプリケーション情報を記述したファイルへのアクセス頻度をコントロールできる(ボタン連打されても無問題)。更新状況はSharedObjectに保存されている。Macだと以下。
/Users/USERNAME/Library/Preferences/app_name/Local Store/ApplicationUpdater
- 他言語に対応したリリースノートを定義できる。以下のように更新情報を定義しておくと、言語環境に応じてアップデート詳細の表示が変わる。
<update xmlns="http://ns.adobe.com/air/framework/update/description/1.0"> <version>2.0</version> <url>http://example.com/app_name.air</url> <description> <!–Release notes–> <text xml:lang="en"> <![CDATA[ English description is here. ]]> </text> <text xml:lang="ja"> <![CDATA[ 日本語の更新情報はこちら。 ]]> </text> </description> </update>
- Adobeが提供しているだけあって見た目がAIR(のインストーラー)っぽい。
短所
- UIのファイルサイズが結構でかい(~350kb)。元々ファイルサイズ2Mのアプリケーションなら気にならないかもしれないけど、550kbのアプリケーションが自動更新機能付けて900kbになるのは結構萎える。UI無しの選択肢もあることはある。
- ダウンロードした最新版アプリケーションが上記SharedObject保存先に居座りっぱなし。
結論
導入する/しないのcriteriaは元のアプリケーションファイルサイズかなあ。UIにこだわらず作る気があれば完全に自作でもよいと思う。他言語対応は便利かも。
[AIR] SimpleLoggerアップデート
- mxパッケージ専用のクライアントSimpleLoggerMx.asを追加。
- オートアップデート機能を追加。
Alertのデザイン変更ではまった。どうもAlert内部のボタンのデザインはAlertのプロパティbuttonStyleNameを変更してやらないといけないらしい(デフォルトはbuttonStyleName=”alertButtonStyle”)。上記の場合だと
/* alert_desin.css */
Alert{
buttonStyleName: "alertButton";
fontWeight: normal;
color: #FFFFFF;
backgroundColor: #101010;
borderStyle: solid;
cornerRadius: 4;
}
.alertButton{
textRollOverColor: #00FF00;
color: #FFFFFF;
themeColor: #00FF00;
fillColors: #101010, #101010;
borderColor : #101010;
highlightAlphas: 0.0, 0.0;
cornerRadius: 4;
fontWeight: normal;
}
という設定にしてやってmxmlに埋め込んである。
<mx:Style source="alert_design.css" />
コンポーネントのCSSデザインはadobe - Flex 2 Style Explorerを使った。コンポーネントのデザインを動的に変更でき、変更したスタイル情報がその場にCSSとして表示されるので便利。
[AIR] AIR用オートアップデートライブラリ
Tags: ActionScript, AIR
追記 2008/09/13
もう少し読みやすい文章(図付き)はこちら
追記 2008/09/16
すでにAdobe AIR Update Framework なんてものがあるじゃないか。。。仕組み的には同じっぽいのでまあ安心した。使い方は自動Update part2 (shin1)が詳しいのかな。
追記 2008/09/17
[AIR] Adobe AIR Update Frameworkを使ってみた - blog Boreal Kiss
___________________________
AIRアプリケーションのアップデート機能は汎用性が高いと思われたので専用のActionScriptライブラリを作った。このライブラリは、(このライブラリをインポート済みの)古いAIRアプリケーションから最新バージョン情報の有無をチェックして、もし最新バージョンがあるようならその場でアップデートを行う。ライブラリ以外に必要なのは以下の2ファイルで、それぞれweb上にアップロードしてあることが前提。
- アプリケーションの最新バージョン
- アプリケーション最新バージョンの設置先URLとそのバージョン情報を記述したXMLファイル
以下では上記の準備(1, 2)を行ってからライブラリの使い方(3)について説明している。
1. アプリケーション最新バージョンを作る
例えば最新バージョンのアプリケーション(latest_app.air, バージョン2.0と仮定)を以下のURLにアップロードしたと仮定。
http://example.com/latest_app.air
2. 最新バージョンチェック用のXMLファイルを作る
最新アプリケーションバージョンとそのファイル設置場所に関する情報を記述した以下のようなXMLファイル(update.xml)
<?xml version="1.0" encoding="UTF-8"?> <application> <version>2.0</version> <download_url>http://example.com/latest_app.air</download_url> </application>
を以下のURLにアップロードしたと仮定。
http://example.com/update.xml
3. ライブラリを使う
- ライブラリのダウンロード
- 古いAIRアプリケーション(例としてバージョン1.0)内にインポートしてAirUpdaterのインスタンスを作成。
import com.borealkiss.fl.utils.AirUpdater; var updater:AirUpdater; updater = AirUpdater.getInstance("1.0", "http://example.com/update.xml", "version", "download_url");
- 上記引数は全てStringで一番前から順番に、(1)現在のアプリケーションバージョン、(2)バージョンチェック用XMLファイルのURL、(3)XMLファイル中の最新バージョンを記述しているノード名(<version>)、(4)XMLファイル中の最新バージョンのURLを記述しているノード名(<download_url>)、となっている。バージョンチェック用XMLファイル内のノード名は好き勝手つけれるが、必ずgetInstance()の引数名と一致させる必要がある。
- AirUpdater.check()でバージョンチェック開始。update.xmlの内容を解析して、現在のバージョンとXMLファイルに記述されたバージョンの数値の大小を比較して、(1)最新バージョンがある、(2)最新バージョンはない、(3)送信エラー(アクセス先URLにXMLファイルがない等)、の3通りの場合に対してイベントを返す。それぞれにイベントリスナーを設置。
updater.check(); //最新バージョンが存在する updater.addEventListener(AirUpdater.LATEST_VERSION_FOUND,onFound); //最新バージョンは存在しない(現在のものが最新) updater.addEventListener(AirUpdater.LATEST_VERSION_NOT_FOUND,onFound); //通信エラー updater.addEventListener(IOErrorEvent.IO_ERROR,onFound);
- あとは最新バージョンがある場合はAirUpdater.downloadUpdate()を行う。これで最新バージョンのアプリケーションをデスクトップにダウンロードし、現在立ち上げているアプリケーションを最新バージョンに書き換える。
private function onFound(e:Event):void{ switch(e.type){ case AirUpdater.LATEST_VERSION_FOUND: updater.downloadUpdate(); break; case AirUpdater.LATEST_VERSION_NOT_FOUND: trace("No newer version found"); break; default: trace("Error"); } }
その他注意点
- 単純に数値の大きいものを最新バージョンと見なす。例えば上記の例の場合、1.0より2.0の方が最新ということになる。AirUpdaterに渡すバージョン情報とXMLファイル中のバージョン情報に数値以外が入っていると解析不能(例えばv2.5)。
- アプリケーションの実際のバージョン情報を参照するわけではない。AirUpdaterに渡すバージョン数値とXMLファイル中のバージョン数値の大小を比較してアップデートを行う。
- 最新バージョンをリリースするたびにバージョンチェック用のXMLファイルも修正する必要がある。
- 同じアプリケーションID同士でないとアップデートできない。
