2009年09月21日

ASCII.technologies 11月号に「AndroidとAR/VR技術の可能性」を寄稿しました

ASCII.technologies 11月号のAndroid特集の一記事として、「AndroidとAR/VR技術の可能性」を寄稿いたしました。

タイトルのとおり、AR/VRのミライの可能性について、技術視点で語るという内容になっております。

実は、本特集では、ARの話題も取り上げられており、ビジネスの視点からの記事もあります。そのため、こちらはそれらの対となる存在として本記事を寄稿いたしました。
合わせて読んでいただくとAR/VRのミライ像がつかめるのではないかなと思っております。
ちなみに、ミライと言いましても、10年以上先のようなことは語っておりません。2〜3年くらいの『今から立ち上げれば、ちょうど波に乗れる』ミライのお話です。



内容について、ちょっとだけ書いてしまいますと、

インフラ指向拡張知覚感(Infrastructure Oriented Augmented Sensibility)

という筆者が定義した造語の世界とはどういうものだろう?という説明からそれがもたらすミライについて話が展開されていきます。
具体的には、

最近のモバイル出来る端末(Androidなど)の進化により、いろいろなセンサーデバイスがついてきた。これにより、人間の五感を取り入れることが出来ようになったAR/VR技術は、人間の知覚(sense)のようなモノへと昇華し、拡張知覚感(Augmented Sensibility)という方向になっていくだろう。(こちらのエントリーの品も、この拡張知覚感(Augmented Sensibility)といえるモノ) さらに、クラウドやWebの進化により、時間や空間の概念をも取り入れた膨大な情報処理が可能となった。、これにより、情報はコンテクスト化されようとしている。 これらの進化の系譜から、AR/VRとインターネットは、人間の生活に深く根ざした、インフラ指向拡張知覚感(Infrastructure Oriented Augmented Sensibility)として、交わるミライがくるだろう。

という感じです。
そして、それを、まとめた図が下記となっており、これの解説に記事が収斂していく感じとなります。
この詳細は、ぜひ、本誌でご確認いただければと思います。

※本図は、アスキーさんのご厚意により、事前公開させていただきました。



また、今回の著者名は、「SIPropプロジェクト 執筆チーム」としております。
こちらは、私が代表を勤めさせてもらっているOSS開発プロジェクトで、実は、現在、この世界を目指すべく、

・『デバイス』や『センサー』の動作原理やそれらから得られるデータを処理するためのアルゴリズムの調査 ・『デバイス』や『センサー』を使い倒したARゲーム『雷電4号』の制作

に鋭意取り組んでおります。
(実は、本寄稿の前半部でふんだんに出てくる『デバイス』や『センサー』の話も、こちらへの布石でもあったりします。)

もし、この世界に興味をもたれましたら、お声がけいただければと思います。ぜひとも、一緒に開発したいという方も、募集しております。

2009年09月18日

クラウド実装合宿のお知らせ

これからのP2Pやクラウドに関する研究に必要だと思われる基盤ソフトウェアをみんなで合宿して作ろうというプロジェクトの開催が決定しました。

イメージとしては、温泉系イベント + Hackthon + 成果必須 というようなイベントです。




■参加条件

ただただ、ひたすらに、クラウド系の実装をしたいという欲望のある方

※勉強会ではなく、実装合宿ですので、『勉強に来ました』的なスタンスの方の参加はご遠慮ください。
※学生さんは、優遇いたします。多少自信がなくとも構いませんので、ご連絡ください。




■必要技術
あると良い技術。
ただし、最低でも一つには精通していないと、付いてこれないとは思います。

●P2P/DHT関連技術
 -Overlay Weaverに関連する技術
 -PIAX/VIAXに関連する技術
●AmazonEC2関連技術
 -Eucalyptusに関連する技術
 -Wakameに関連する技術
●Googleクラウド関連技術
 -MapReduce/Hadoop/Bigtable/hBase
 -GAEに関連する技術




■開催日程
下記は、第1回目の予定です。今後も1〜2ヶ月ごとに、数回予定しています。

●日時
 -10月中〜下旬
 -1〜2泊
●場所
 -筑波、熱海、そのあたり。
 -無料で借りられる施設を探している
●旅費
 -自腹
●機材
 -自分で持ち込み




■作成後のソフトウェアの扱い
・某研究室のクレジットにて、OSSとして公開・メンテナンスさせていただきます。
 -作成していただいたモジュール単位などで、別途制作者のクレジットが付加します。
・ライセンスは、Apache License 2.0 or BSD




■学生向け支援策
SIProp育英基金より、旅費が負担されます。




■申し込み
・コメント欄にでもメッセージをお願いします。




■現在の主な参加者
・Interop Tokyo 2009で開催された「クラウドコンピューティングコンペティション」関係
・P2P SIP勉強会 and SIProp勉強会関係(上とほぼ一緒ジャンというツッコミは受け付けておりません)

クラウド実装合宿のお知らせの続きを読む

2009年09月14日

Academic Collaboration Program(ACP) 開始しました

OESFにて、Academic Collaboration Program を開始しました。


●目的


Academic Collaboration Program(以下ACPとする)は企業ベースで取り組めない課題への挑戦、最新テクノロジーの応用、新たな発想/独創性のあるアイデアを持ってAndroidに関わる研究/開発等を目的とした教育機関の活動を、OESF会員企業と協力体制を組み、その実現や実用化向けて支援を行ってまいります。
Androidは全てのソースコードがオープンソースとして無償公開されており、多くの分野でその利用が期待されています。大学等の研究室が持つアイデアやテーマを、全世界のOESF会員とともに具現化し、社会に新たなるテクノロジや市場を提供すると同時に、若きソフトウェアエンジニアの育成を目指す新たなる取組です。このプログラムは日本、台湾、韓国、中国で同時にスタートいたします。また、成果は世界に広く公開し、特に東アジア経済圏の組込みソフトウェア技術の発展に寄与することを目的としています。

ということで、教育機関向けの支援プログラムとなります。
こちらのエントリーのお話を、具現化したモノです。
コツコツと進めてまいりまして、このたび、正式に開始となりました。


参加メリットとしては、当然、研究のための道具や資金を得られることのほかに、

●参加特典(より、抜粋)


4. OESF参加の展示会への出展
6. OESF主催のカンファレンス、発表会等での発表、報告

といった、発表の場の提供も考えております。
現在までのヒヤリングの結果、なかなか、対外向けに発表する機会が少ないとの要望をいただいており、このような場の提供を考えております。




参加料は、一切無料ですので、ちょっと、組み込み向けに何かしてやろうか!っていう元気な学生さんがいましたら、ぜひとも、申し込みしていただければともいます。
もちろん、組み込み向けだけでなく、ハイビジョンTV向けの新しいUIデザインなどのソフト面での提案などもお待ちしております。

お申し込みは、こちらよりお願いいたします。

2009年09月10日

OESF Progress Conference 2009 Q3 開催します

早くも2度目となるOESF Progress Conference 2009 Q3を開催いたします。
今回は、各支部(台湾、韓国、中国)による海外勢の発表を多めに予定しており、海外の生のAndroidビジネス事情を入手していただくチャンスとなっております。
会員以外の方でも参加可能ですので、Androidによるビジネスに興味のある方は、ぜひとも、ご参加いただければと思います。


●開催挨拶

Open Embedded Software Foundationは、9月末で設立6か月となります。活動を開始してわずか半年ですが、日本を中心に、台湾、韓国、中国への支部の展開をはじめ、11 月には世界で初めての組込み市場向けパッケージのリリースを予定するに至っております。これまでの活動報告そして今後の活動計画、東アジア各支部の活動報告のコンファレンスを開催いたします。また、ゲストスピーカーによるAndroid関連の発表会も開催いたします。



●プログラム

第2部(会員外へも公開)
14:50 : OESFでビジネスを拡大(OESFの活動のすべてをご紹介)
      OESFビジネスマッチングサービス、トレーニングフランチャイズプログラム、大学等教育機関向けコラボレーションプログラム、そして11月に公開する組込み向けDistributon(プロジェクトコード:BlueberryCupcake)をご紹介します。
      Marketing Education WG コーディネータ
     
15:20 : Sigma Designs社のAndroid戦略 SigmaDesigns社
15:40 : 調整中 
16:00 : ARMのAndroid戦略
      Androidの標準CPUともいえるARM社のAndroid戦略を解説していただきます。
16:30 : ライトニングセッション
      会場でのデモや新たなるTopicsをお伝えします。
      .船Д涯ο孫颪砲けるIT産業 チェコ共和国大使館/チェコインベスト Ondrej Votruba様
      OPhoneによるコンテンツ配信事業 Bohan-net 椿野様



●開催概要

日時:2009年9月30日 14:30受付開始 14:50開始(第2部からの場合)
場所:五反田 ゆうぽうと



●申し込み
お申し込みは、こちらからお願いいたします。
会場スペースの都合上、申し込みされない方は、入場をおことわりさせていただきます。

2009年09月05日

Android NDKのデバッグ手法

前回のエントリー

●高度なデバッグ方法
組み込みプレスVol.16によくまとまっておりますので、こちらを参考にしてください。

を、Android NDK&Windows向けに解説してくれ、との要望がありましたので、作ってみました。
詳細は、上記の組み込みプレスVol.16を確認していただくとして、その差分を掲載させていただきます。
(とは言っても、このエントリーだけも構築はできると思いますが、何をやっているかの詳細は本書をご確認ください。。)



●Android.mkで実行ファイルを作る
まず、デバッグするために実行ファイルを作らなくてはなりません。
sharedライブラリのままでは、実行出来ませんからね。

Android上で実行可能なファイルは、Android.mkで作成可能です。
具体的には、main関数を作成の上、Android.mk内を下記のように変更するだけです。

include $(BUILD_SHARED_LIBRARY) ⇒ include $(BUILD_EXECUTABLE)



●Eclipse CDTを準備する
Eclipse CDTから、ダウンロードしてください。
Androidの開発用Eclipse に、追加インストールしても問題ありませんが、プラグインを増やすとどんどんとEclipseが重くなっていきますので、別に用意するのも手です。




●Cygwinの準備を整える
Android NDKがインストール済みであれば、下記の作業をするだけです。

・C:\cygwin\bin\cygwin1.dll を C:\Windows\System32 にコピーする
・C:\cygwin\binを、Windows の環境変数 PATH に含める




●Default Launcherを設定する
下記の通りにメニューを追って、変更してください。

Window
Preferences
Run/Debug
Launching
Default Lanchers
内の

C/C++ Application [Debug]
Preferred Launcher
を、

Standard Create Process Launcher

にする




●コンパイル用スクリプトを設定する
・「build.bat」を作成する
ただたんに、makeしただけでは、Android NDKをコンパイルすることは出来ません。Android NDKディレクトリに移動した上で、makeする必要があります。
そこで、それを行うスクリプトを作成します。
今回は、「build.bat」という名前で作成します。

set PROG=%1

cd [Android NDKへのpath]

make APP=%PROG%




・「build.bat」をEclipseに設定する
下記の通りにメニューを追って、変更してください。

Project
Properties
C/C++ Build
内の

Builder Settingsタブ
Build command

に独自バッチファイル「build.bat」を指定する。



「build.bat」は、引数として、Android.mkのモジュール名を要求しますので、それを指定します。

Behaviourタブ

Build on resource save(Auto Build)
Build(Incremental build)

に、Android.mkのモジュール名を入力する。
※ここでは、「ecTest」としてあります。



●Android NDK用のIncludeファイルがあるディレクトリを指定する
要は、bionicのIncludeファイルを指定します。

Project
Properties
C/C++ General
Paths and Symbols
内の

Includes
に、Android NDK用のIncludeファイルがあるディレクトリを「それぞれ」指定します。
android-ndk-x.x\build\platforms\android-1.5\arch-arm\usr\include
android-ndk-x.x\build\platforms\android-1.5\common\include

を追加。

Add to all configurations
Add to all languages
Is a workspace path
は、必要に応じてチェックします。
意味がわからないなら、付けてしまいましょう。




●実行用スクリプトを設定する
・「launch.bat」を作成する
Android NDKで作成した実行ファイルをAndroidエミュレータや実機で動作させるには、ちょっとした仕掛けが必要です。
そこで、実行用のスクリプトを作成します。

set PROG=%1

cd [Android NDKへのpath]

adb push [Android NDKへのpath]\out\apps\%PROG%\android-1.5-arm\%PROG% /data
adb shell chmod 777 /data/%PROG%
adb shell /data/%PROG% "$@"
※ /data は、Android上のディレクトリとなります。必要に応じて変更してください。 ※ Androidエミュレータや実機が接続されていないと、使用出来ません。


・「launch.bat」を使用するように、Eclipseを設定する
下記の通りにメニューを追って、変更してください。

Run
External Tools
External Tools Configurations

選択します。

Program
に新規追加します。

独自スクリプト「launch.bat」を追加します。

Arguments

に、Android.mkのモジュール名を入力します。



●デバッグ用スクリプトを設定する
・「prepare.bat」を作成する
デバッグを行うには、gdbserver を起動する必要があります。
そこで、それを自動的に行うためのスクリプトを作成します。

set PROG=%1

cd [Android NDKへのpath]
adb push [Android NDKへのpath]\out\apps\%PROG%\android-1.5-arm\%PROG% /data
adb shell chmod 777 /data/%PROG%
adb forward tcp:5039 tcp:5039
adb shell gdbserver tcp:5039 /data/%PROG% "$@"
※ /data は、Android上のディレクトリとなります。必要に応じて変更してください。 ※ 5039ポートは、待ち受けポートとなります。必要に応じて変更してください。 ※ Androidエミュレータや実機が接続されていないと、使用出来ません。




・「prepare.bat」を使用するように、Eclipseを設定する
下記の通りにメニューを追って、変更してください。

Run
External Tools
External Tools Configurations

選択します。

Program
に新規追加します。

独自スクリプト「prepare.bat」を追加します。

Arguments

に、Android.mkのモジュール名を入力します。



●gdbserverを設定する
Eclipseが利用するデバッガとして、gdbserverを利用するための設定を行います。
タブが何個かネストしておりますので、わかりにくいかもしれませんが、がんばって設定してください。




・mainの設定

Run
Run Configurations

を選択します。

C/C++ Application
に新規追加します。

Mainタブ

C/C++ Application
に「[Android NDKへのpath]\out\apps\[Android NDKモジュール名]\android-1.5-arm\[Android NDKモジュール名]」を追加します。




・Debuggerの設定

Debuggerタブ

Debugger
の設定を

gdbserver Debugger
に変更します。
Dubugger Options
の GDB debugger
に「[Android NDKへのpath]\build\prebuilt\windows\arm-eabi-4.2.1\bin\arm-eabi-gdb.exe」を追加します。




・Shared Librariesの設定

Shared Librariesタブ

に「[Android NDKへのpath]\out\apps\[Android NDKモジュール名]\android-1.5-arm」を追加します。




・Connectionの設定

Connectionタブ

Type
の設定を
TCP
に変更します。

Port number
の設定を 5039
に変更します。




●デバッグ用スクリプトをEcliseで実行可能なように設定する
いままで作ってきた各種実行用スクリプトをEclipseから実行出来るようにします。




・Eclipseのスクリプト設定画面を開く


Run

Run Configurations

選択します。



Launch Group

に、後述する2つのモノを新規追加します。



・実行用Launch Groupを登録する

[Eclipse用実行用スクリプト] mode:run
を新規追加します。



・デバッグ用Launch Groupを登録する

[Eclipse用デバッグ用スクリプト] mode:run
[Eclipse用GDB設定] mode:debug
を新規追加します。





●起動
これで、あとは、Androidのエミュレータなり、実機なりを起動して、実行すればOKです。
下記のように、main関数で停止した状態で起動します。


2009年09月04日

Android NDKの一歩進んだ使い方

こちらのエントリーこちらのエントリーで得られた、本気でAndroid NDKを使う場合に、引っかかるであろうポイントを一挙公開です。

基本事項に関しては、こちらの木南さんによる解説を参考にしてください。



■Android NDK用 make file編
Android NDKのmake fileというべき、

Android.mk

についてのテクニック紹介編です。
ファイル自体は、下記にあります。

/android-ndk-x.x/sources/[プロジェクト名]/




●includeファイルの登録
・自分がいるディレクトリを変数に入れる
下記のようにして、$(LOCAL_PATH)にいまいるディレクトリが登録します。

LOCAL_PATH:= $(call my-dir)


・includeファイルの登録
$(LOCAL_PATH)を基準に、「../」などを駆使して、目的のincludeファイルのあるディレクトリを指定します。
ただし、Android NDKからは、LOCAL_C_INCLUDESが呼び出せないようなので、下記のような小細工をします。

LOCAL_C_INCLUDES := $(LOCAL_PATH)/cv/src $(LOCAL_PATH)/cv/include
LOCAL_CFLAGS += $(LOCAL_C_INCLUDES:%=-I%)




●ldの登録
現在のAndroid NDKでは、バグがあるようで、Android.mkにおいて下記のライブラリをロードしておかないとエラーとなります。

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl




●階層つきディレクトリのコンパイル
「includeファイルの登録」と基本的には、同じです。
$(LOCAL_PATH)を基準に、「../」などを駆使して、目的のソースファイルを指定します。

LOCAL_SRC_FILES := cxcore/src/WLNonFileByteStream.cpp cv/src/cvjni.cpp




●複数ライブラリの統合
staticライブラリであれば、いくつでも追加可能です。


・Application.mk のモジュールへの複数登録
/android-ndk-x.x/apps/[プロジェクト名]/ にある、Application.mk の APP_MODULES に統合したい分だけ、モジュール名を列挙します。
モジュール名とは、Android.mkで「LOCAL_MODULE := opencv」と宣言しているモノです。

APP_MODULES := cxcore cv cvaux cvml cvhighgui opencv


・staticライブラリをコンパイルする
staticライブラリをソースから同時に作成した場合は、「Android.mk」内で「include $(BUILD_STATIC_LIBRARY)」と宣言することにより、作成可能です。
※もちろん、統合だけであれば、作成済みのモノでもOKです。

LOCAL_MODULE := cxcore
LOCAL_SRC_FILES := cxcore/src/cxalloc.cpp cxcore/src/cxarithm.cpp

include $(BUILD_STATIC_LIBRARY)

・出力先 out
上記のコンパイルされたオブジェクトやstaticライブラリは、下記の出力されます。

/android-ndk-x.x/out/apps/[プロジェクト名]/


・staticライブラリの統合
「LOCAL_STATIC_LIBRARIES」に、「include $(BUILD_STATIC_LIBRARY)」して作ったstaticライブラリのモジュール名を登録しただけでは、staticライブラリ内から他のstaticライブラリを呼ぶコードがある場合、エラーとなってしまいます。
そこで、「LOCAL_LDLIBS」に、「出力先 out」などを参考に必要なstaticライブラリを登録してください。

LOCAL_MODULE := opencv
LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -ldl -llog -L$(LOCAL_PATH)/../../out/apps/opencv/android-1.5-arm/ -lcxcore -lcv -lcvaux

LOCAL_SRC_FILES := cvjni.cpp

LOCAL_STATIC_LIBRARIES := cxcore cv cvaux cvml cvhighgui

include $(BUILD_SHARED_LIBRARY)
※リンクするライブラリのヘッダファイルをincludeすることも忘れないようにしましょう。




■Android NDK 開発編
●extern "C"
C++と混ぜるなら、JNI用の関数に対しては、「extern "C"」が必要です。
そのため、プロトタイプ宣言で下記のようにすると良いようです。

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT
jbooleanArray
JNICALL
Java_org_siprop_opencv_OpenCV_findContours(JNIEnv* env, jobject thiz, jintArray photo_data, jint width, jint height);

#ifdef __cplusplus
}
#endif




●ファイルの読み書き
Android NDK(C言語)側とAndroid側でファイルを共有するには、下記のディレクトリを利用するのがよいようです。
ここにあるものは、FILE系関数で読み書き可能となります。

/data/data/[パッケージ名]/files/

「/tmp」なども使えますが、ここを使うとAndroid側のContext#openFileOutput(String)と連携しやすいので、ここを使うことをお奨めします。




●高度なデバッグ方法
組み込みプレスVol.16によくまとまっておりますので、こちらを参考にしてください。



■JNI編
基本的には、JNIの使い方です。
そこの中で、Android連携として引っかかりそうな部分だけピックアップして記述します。



●型

C言語上の型   unsigned char[]
JNI上の型     jbooleanArray
Java上の型    byte[]

と、C言語、JNI、Javaの層全部型名が違うパターンが存在します。
そのため、コード的には下記のような感じとなります。返り値などがC言語側とJava側で変化しているのがわかるかと思います。

・C言語側
JNIEXPORT
jbooleanArray
JNICALL
Java_org_siprop_opencv_OpenCV_findContours(JNIEnv* env, jobject thiz)

  unsigned char ucharArray[128];
  jbooleanArray res_array = env->NewBooleanArray(128);
  env->SetBooleanArrayRegion(res_array, 0, 128, (jboolean*)ucharArray);

  return res_array;
}

・Java側
  public native byte[] findContours();



ちなみに、jni.hでは、下記のように定義されています。

#ifdef HAVE_INTTYPES_H
# include /* C99 */
typedef uint8_t jboolean; /* unsigned 8 bits */
typedef int8_t jbyte; /* signed 8 bits */
typedef uint16_t jchar; /* unsigned 16 bits */
typedef int16_t jshort; /* signed 16 bits */
typedef int32_t jint; /* signed 32 bits */
typedef int64_t jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
#else
typedef unsigned char jboolean; /* unsigned 8 bits */
typedef signed char jbyte; /* signed 8 bits */
typedef unsigned short jchar; /* unsigned 16 bits */
typedef short jshort; /* signed 16 bits */
typedef int jint; /* signed 32 bits */
typedef long long jlong; /* signed 64 bits */
typedef float jfloat; /* 32-bit IEEE 754 */
typedef double jdouble; /* 64-bit IEEE 754 */
#endif

2009年09月03日

第十四回P2P SIP勉強会の告知

第十四回P2P SIP勉強会の、告知です。
今回は、血の雨が降りそうな悪寒です。><

*案内
-日程
--9月13日(日)
-時間
--14:00〜
-参加費
--なし
-懇親会
--あり
-会場
--東工大 西7号館
---info あっとまーく siprop.org
---にお問い合わせください。

*プログラム
-驟雨さんによる『Overlay Weaver? ぼっこぼっこにしてやんよ』
--ニコニコ動画のP2Pによる、キャッシュ共有ソフトであるgenkidamaで利用されているOW(Overlay Weaver)に焦点を当てて、実際に利用してみたノウハウなどを『開発者の首藤先生の前』で解説していただきます。
-佐藤さんによる「CEDECのちょっといい話」
--BitTorrentの運用事例紹介です。

2009年09月02日

OpenCV Ver.1.1 For Android NDK

OpenCV Ver.1.1 を、とりあえず、 Android NDKで動くようにしてみました。
本当にとりあえずで、全然、テストしていません。人柱になりたい方どうぞ。


●非対応ライブラリ
 -3次元トラッキング
 -K近傍法

C++標準ライブラリ不足により、削除しました。
あまり、使用しないと思われましたので。




●独自ライブラリ
 -show系(表示系)
 -キャプチャ系

UIまわりが大きく違うため、Android独自の実装となっています。




●実装JNI
JNIは全く用意していません。
唯一あるものは、「OpenCV プログラミングブック 第2版 OpenCV 1.1対応」に出てくる輪郭検出のサンプルアプリのみです。
それ以外は、自分でJNIを書くか、Android NDK層で実装する必要があります。

ですが、OpenCVは基本的には、この形であまり問題がないと考えています。
OpenCVは、ライブラリ性が強いため、独立しているが組み合わせることにより威力を増す関数が多いためです。
そのため、下手にJNI化して、細かい単位でJava←→C間を行ったり来たりするより(しかも、たいていの場合は、巨大な画像データもやり取りする必要があり)、Android NDK層ならAndroid NDK層で実現したい機能を実装してしまう方が、よいと思われるからです。
現に、輪郭検出のサンプルアプリでも、6個以上の関数を利用して実現されており、単体の関数としてこのような機能が提供されているわけではありません。

どうしても必要な場合は、Processing向けのJNI実装がありますので、それを利用するのがよいと思われます。




●ダウンロード
 -OpenCVForAndroidNDK-0.1-src.zip

ソース一式です。BSDライセンスにしています。




●サンクス
 -Puppyチーム

に、お手伝いいただきました。ありがとうございました!><

Creative Commons License
This weblog is licensed under a Creative Commons License.