クラウドソーシング所感

ここ1ヶ月ほど、全く仕事とは関係無いところでゲーム開発をしています。
ゲームそのものを、というより、比較的大規模なモノ作りプロセスを自分で廻したくて(あわよくば仕事にフィードバックしようかと)実践しているのですが、その中の幾つかのプロセスでクラウドソーシングを試しておりまして、幾つか気がついたことがあったので所感を。

・クラウドソーシングの拡大

ゲーム内のキャラクターを幾つか用意するためにクラウドソーシングを利用したのですが、実際試してみて初めて、クラウドソーシングは今後大きく成長する市場になりうると実感しました。

とにかく発注金額が圧倒的に低い。海外のサービスも試しましたが、海外は更に低い。

特に、アウトプットの着地が分かりやすいものについては依頼しやすいので、クオリティを下げずに発注することができます。また個人対応が多いので、柔軟性のある対応を求めることもある程度可能です。
実際に金額をやや抑えて発注しても、かなりレベルの高いものを出してくるデザイナーが何人も出てくるし、後からの修正も(誰もがそうというわけではないでしようが)柔軟に応じていただけました。

・一方でクラウドソーシングの問題

こちらは3Dモデル発注をした際に感じたことですが、特に技術練度を要するような作業については、品質にモロに影響がでてしまいます。

あるセミプロレベルの方に発注した際は完全に失敗して、微妙なアウトプットが出てきてしまいました。

クラウドソーシングでは相手側が個人で請け負っている場合が多く、法人同士の付き合いでは当然行われる逐次のアウトプット確認などがしにくく、また、個人のスキルの問題なので、これ以上クオリティを上げてくれ、という依頼が出来ないため、再度別の方に依頼するなどのオペレーションが必要となってしまいました。

・クラウドソーシング内の市場

上記に関連しますが、クラウドソーシング内でも需要供給のバランスがあるのが興味深いです。

例えばイラスト作成は供給側が完全に過多になっていてバランスが崩れています。

120点のイラストが書ける一部の神レベルの作家は適正な価格での受注が維持できると思われるのですが、80点位の作家は見合った報酬を受け取るのはかなり難しいと思われます。

・クラウドソーシングでの海外発注

海外に3Dモデリングを海外に出した際に想定金額を思い切って下げたのですが、それでも請け負うデザイナーが世界中にいるのに驚きました。

実際には日本の相場の数分の一で、ウクライナ・マレーシア・ブルガリアなどから受注可能とメッセージが来ます。

ただ、実際に発注すると、日本と海外の違いは言語だけではなく「仕事への取り組み度合い」であることを痛感します。

まず、仕事に対するコミットが非常に緩い。普通に連絡が取れなくなる受注者が出る。出来高払いなので金額的な損失は無いのですが、別のデザイナーへの発注が遅れるので時間的損失が大きいです。

そのように考えると、プロレベルの仕事を発注するには、海外に出さず日本人に依頼するがまだ妥当だと思われます。
ちなみにアメリカ人は円安もあって日本よりもずっと高い見積もりでした。アウトプットは良さそうだったんですが。

引き続きゲーム開発で思った所感など書いていきます。

グリッドコントローラーで俺得外付けキーボードを作る

Adafruitでうっかりおかしな物を買ってしまいました。
Adafruit UNTZtrument! Open-Source 8×8 Grid Controller Kit – 8×8 White LEDs
要は、64個の光るボタンがついているエンクロージャーなのですが、これがあれば、Blenderのキテレツなショートカット達にも太刀打ちできます。ArudinoとHIDは最近ちょうど技術的にも身につけたところですし、外見もカッコイイ。それにArudinoなので、ロータリーエンコーダーの追加やソフトウェアでの諸々カスタマイズもできます。というわけで、最終的には結構いいお値段になりました。ニューヨークから一週間くらいで到着。
で届いたパーツたちがこちら
2014-12-23 11.49.09
アクリルの部分以外は普通にAdafruitで売られているパーツで、アクリル部分のエンクロージャーはdxfファイルが提供されてます。
今気がついたけど、エンクロージャー自作すれば相当安く作れますね。
で、パーツ合わせなどを行い、
2014-12-23 12.32.37
ハンダ付けなどしつつ、
2014-12-23 16.34.50
こうなりました。
ロータリーエンコーダーも追加で付けたので、外付けキーボードとしては超高性能です。
 

動画はMacのアプリ切り替えをロータリーエンコーダーで実現したもの。これはいろいろ捗ります。

実際はロータリーエンコーダーの1ピッチを1値に設定するのにソフトウェア的なコツがあるのですが、ソース公開するのでいろいろ察してください。

Moto360を手に入れ、そして手放した話。

以前からAndroid Wear は気になっていたのですが、Moto360の円形ディスプレイに惚れて、入手するまでずっと我慢していました。
だが、9月の中旬にようやく個人輸入で手に入れることができたにもかかわらず、開封して30分で手放そうと決め、そして今もう既に手元にはありません。今日はその話を。

勘違いしてほしくないのは、Moto360は間違いなく今までの腕時計型ガジェットの中で最高峰だと私は思っています。Androidとの連携もスムースだったし、操作に迷うこともなく、美しいディスプレイや革バンドに至るまで良く出来ています。

ただ、私は、思ったよりも「腕時計」にこだわりがあったようで、持ち上げただけで即座に時間が確認できる腕時計に比べて、加速度で認識するとはいえMoto360は腕を上げてからディスプレイが点灯するまでのコンマ数秒にフラストレーションを感じました。どんなに、これは腕時計ではなくガジェットだ、と頭のなかでは意識しても、どうしてもこの差は埋まりませんでした。スマートフォンの通知を転送してくれるのも楽かもしれませんが、日常的にそれほど通知を気にすることも実はなく、結局のところMoto360で新しい体験はできるかもしれないが、私の日常を良い方向に上書きするほどではなかった、と気がついたのでした。

この差は多分電子書籍リーダーの体験と同じで、私自身一度は電子書籍にトライしたものの紙の本に戻ってます。生まれてから紙の書籍を体験していなければ違和感を感じないものの、紙の本の経験が長かったのでその経験を上書きできないのです。電子書籍だと読む喜びや残る知識が半減してしまい、最近は実用書でも本で買うようにしています。
(面白いのは、マンガだと電子書籍自体に全く違和感はないのです。読んだあとの余韻も変わりません。体験の違いから来るのかもしれないですが。)

話を戻すと、
結論として、少なくともスマートフォンとの連携無しで稼働するようになるまでは、腕時計型ガジェットには手を出さないことにしました。エンジニアとして出遅れるかもしれないが、そのリソースは他に振り分けることにします。

最後にMoto360のファームアップデート前の起動アニメーションを。18秒くらいから始まるアニメーションがMoto360の開発コンセプトをよく表していると思います。

 

Google Maps Android API v2 の ズームレベルとは何を指すか

Google Mapsを取り込んだAndroidアプリを作っていた際に、

「画面の1/4程度を動かすとデータリロードさせたい」

という要望が上がりまして、その実現方法を検討したことがありました。

通常 Mapの移動については、MapオブジェクトにsetOnCameraChangeListenerを設定して、
カメラの移動を取ればよいのですが、取れるのはLatLonであり、そのときのMapのズームレベルによって「画面上どれだけ動いたか」が変わることになります。

そこで、LatLonとズームレベル・それから画面上の実移動についての相関をアバウトに取れる仕組みをアプリに入れました。そのロジックをご紹介します。

Google Maps Android APIではズームレベル自体は2〜21まで設定できるのですが、
ズームレベル2を設定した場合、Google Mapは世界地図の概ね1/4を表示していましたので、
実際には、0を起点とした下記のような仮説を立てました。

スマートフォンの画面に表示される地図の幅(Km)
= 地球の円周(Km) / (2 ^ ズームレベル )

つまり、地球の円周≒40075km とすると、
ズームレベル 2 の場合は 40075km / (2 ^ 2) = 約10018km
がスマートフォンの画面幅に合わせて表示されます。

逆に駅から徒歩10分の周辺を表示したい場合は、
徒歩所要時間 = 80m / 1分だとして、大体1.6km四方が見られれば良いので、

40075 / 2 ^ x = 1.6(km)
x ≒ 14.6

となり、ズームレベルは14.6が適切、ということになります。

 

MacでSamsung SSD 840 EVOのTRIM有効化

毎年年賀状の季節になるとWindowsを使う必要があり、Mac mini上のVMware Fusion上で作業していたのですが、OSがMavericsになってからどうにも遅く、耐えられずにSSDに換装してしまいました。

導入したSSDはSamsung SSD 840 Evoです。換装作業自体はすんなりいったのですが、移行アシスタントが正常に動作しないという事態が発生。そちらは諦めて新規インストールとコピーで済ませ、最後に様々なサイトにある通りTRIM機能を有効にしようとすると、Trim Enablerでは有効になりませんでした。

そこで下記のサイトを発見。

http://www.mactrast.com/2011/07/how-to-enable-trim-support-for-all-ssds-in-os-x-lion/

記事の中でCHAMELEON SSD OPTIMIZERを勧められており、こちらで実施したところうまくいきました。(実行には1分くらい掛かったので多少焦ったのですが)

ということで換装が終わり、スピードテストをしたところ、ATAドライバがついてこれないのかSSDのフルスペックの1/4くらいのスピードしか出ません。それでもHDDよりはReadで5倍、Writeで3倍のスピードではあるんですが…。なんだか残念な気持ちに。

Amazon EC2でMozc for Android(オープンソース版Google日本語入力)をコンパイルしてみる

IMEを作っている(そして放置している)ものとして、Google日本語入力が出た時点で「こっちでいいじゃん」的な気持ちになっていたのですが、とりあえずMozc for Android(オープンソース版Google日本語入力)でも弄ってみようと思ってはや1年近く。ようやく時間ができたので試してみました。それなりに悪戦苦闘しそうだと思ってはいたのですが、割とすんなりできたので手順を公開します。

本来の手順自体はこちらにあります。
https://code.google.com/p/mozc/wiki/AndroidBuildInstructions

まずはEC2でインスタンスを作ります。t1.microでは途中でCPUパワーが足りずにBuildが進まなくなるため、最初からm1.smallで設定したほうが良いでしょう。tokyoリージョンなのは趣味です。

スクリーンショット 2014-01-01 11.33.41

この時点でEBSを16GiBにしておく必要があります。これもデフォルトの8GiBではコンパイル中に容量が足りなくなるためです。
また、今のところUbuntuでないとコンパイルが保証されていないので、Ubuntu Server 12.04.3 LTS 64bitを選択してますが、後から32bitライブラリを足たりしているので、もしかしたら最初から32bitが良かったのかもしれません。

ログインしたらまず足りないものをインストール

% sudo apt-get install ant g++ make python subversion openjdk-6-jdk

Unzip / Subversion / make / gcc / pkg-config も入れておきます。

% sudo apt-get install unzip
% sudo apt-get install subversion
% sudo apt-get install make
% sudo apt-get install gcc
% sudo apt-get install pkg-config

32bitライブラリを入れておきます。

% sudo apt-get install ia32-libs

一度インストールしたら、

% sudo apt-get update

も実行してください。

AndroidSDKとAndroidNDKもダウンロードして展開。

% wget http://dl.google.com/android/adt/adt-bundle-linux-x86_64-20131030.zip
% wget http://dl.google.com/android/ndk/android-ndk-r9c-linux-x86_64.tar.bz2
% unzip adt-bundle-linux-x86_64-20131030.zip
% tar jxfv android-ndk-r9c-linux-x86_64.tar.bz2

いよいよコードをダウンロード

% cd ~/
% svn co http://src.chromium.org/svn/trunk/tools/depot_tools
% export PATH=”$PATH”:`pwd`/depot_tools
% mkdir -p ~/src/mozc
% cd ~/src/mozc
% gclient config http://mozc.googlecode.com/svn/trunk/src
% gclient sync

周辺ライブラリzinnia(手書き文字認識エンジン)が足りないのでダウンロード・インストールしておく

% cd ~/
% wget http://downloads.sourceforge.net/project/zinnia/zinnia/0.06/zinnia-0.06.tar.gz
% tar zxvf zinnia-0.06.tar.gz
% cd zinnia-0.06/
% ./configure
% make
% sudo make install

再度 gclient syncから

% cd ~/src/mozc
% gclient sync

パスを通す

% export PATH=~/android-ndk-r9c:~/adt-bundle-linux-x86_64-20131030/sdk/tools:~/adt-bundle-linux-x86_64-20131030/sdk/platform-tools:”$PATH”
% which ndk-build android adb

さらにJava をインストールし、SDKをアップデートしておきます

% sudo add-apt-repository ppa:webupd8team/java
% sudo apt-get update
% sudo apt-get install oracle-java7-installer
% android update sdk -u -t platform,tool,platform-tool,extra-android-support

コンパイルを開始します

% cd ~/src/mozc/src
% python build_mozc.py gyp –target_platform=Android

(WPでは見えませんが、target_platform の前のハイフンは2つです)

% python build_mozc.py build_tools -c Release
% python build_mozc.py build android/android.gyp:android_manifest

local.propertiesを作成

% android update project -s -p android –target android-17

そしてBuildします

% python build_mozc.py build android/android.gyp:apk -c Debug_Android

これでDebugバージョンのapkが
/home/ubuntu/src/mozc/src/android/bin/MozcForAndroid-debug.apk
に出来ます。

 

以下補足です。

エラーが出る場合 1:

make: *** [out_android/Debug_Android/obj/gen/data_manager/oss/system.dictionary] Error 137
make: *** Waiting for unfinished jobs….

こんな感じのエラーはCPUパワーが足りてません。
t1.microではCPUパワーが足らないので、m1.small以上で起動しなおしましょう。

エラーが出る場合 2:

BUILD FAILED
/home/ubuntu/src/mozc/src/android/custom_rules.xml:42: The following error occurred while executing this line:
/home/ubuntu/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:601: The following error occurred while executing this line:
/home/ubuntu/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:653: The following error occurred while executing this line:
/home/ubuntu/adt-bundle-linux-x86_64-20131030/sdk/tools/ant/build.xml:698: Execute failed: java.io.IOException: Cannot run program “/home/ubuntu/adt-bundle-linux-x86_64-20131030/sdk/build-tools/android-4.4/aapt” (in directory “/home/ubuntu/src/mozc/src/android/protobuf”): error=2, No such file or directory

これは32bitライブラリが足りていないときです。このコマンドからia32を導入してください。

% sudo apt-get install ia32-libs

エラーが出る場合 3:

INFO: Running: make -j2 MAKE_JOBS=2 BUILDTYPE=Debug_Android builddir_name=out_android apk
ACTION android_android_gyp_assets_touch_stat_data_target_assets_touch_stat_data android/dummy_touch_stat_data
make: *** [android/dummy_touch_stat_data] Error 1
Traceback (most recent call last):
File “build_mozc.py“, line 1437, in <module>
main()
File “build_mozc.py“, line 1425, in main
BuildMain(cmd_opts, cmd_args, original_directory_name)
File “build_mozc.py“, line 1038, in BuildMain
BuildOnLinux(options, targets, original_directory_name)
File “build_mozc.py“, line 992, in BuildOnLinux
RunOrDie([make_command] + build_args + target_names)
File “/home/ubuntu/src/mozc/src/build_tools/util.py”, line 97, in RunOrDie
‘==========’]))
build_tools.util.RunOrDieError:
==========
ERROR: make -j2 MAKE_JOBS=2 BUILDTYPE=Debug_Android builddir_name=out_android apk
==========

なんらかの理由でコンパイルが失敗しているので、一度cleanして実施すると上手くいく可能性があります。

% python build_mozc.py clean –target_platform=Android

エラーが出る場合 4:

/home/ubuntu/android-ndk-r9c/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86_64/bin/arm-linux-androideabi-ar: android/obj/local/armeabi/libclient.a: No space left on device

EBSボリュームが足りていません。EBSボリュームを拡張しましょう。詳しくは
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-expand-volume.html
でご確認ください。

さらに補足:
aaptのパスが通らなかった場合がありましたので、その場合は下記を投入してください。

% export PATH=/home/ubuntu/adt-bundle-linux-x86_64-20131030/sdk/build-tools/android-4.4/:”$PATH”

 

【書評】アート・オブ・プロジェクトマネジメント

ソフトウェアの開発工程管理は80年代からの蓄積から洗練されており、アジャイル開発などの比較的新しい手法でも多くの成功例を見ることができるが、それでもソフトウェア開発プロジェクトが何事も無く予定通りに終わることは非常に稀である。

何故か。ソフトウェアという括り自体が非常に多岐にわたる産業にまたがっており、飛行機の管制管理とちょっと便利なAndroidアプリの開発では要求条件も手法も何もかもが異なるからである。同じようなソフトウェアでも日進月歩の技術を取り込んで改良を重ねるうちにそれは複雑性を増し、やがて全く違うものになるのに、作り方だけ変わらないわけにはいかない。

こうしてデスマーチが生まれるのだが、英会話のレッスンで先生に We call such a terrible project “death march”. と言ったらこれは海外では通じないらしい。では海外ではデスマーチは無いのかと言ったらそんなことはなかった。

前のプロジェクトでプロジェクトマネージャーをするにあたり、知識を再構成しようと手にとった本だが、読み終わる前にプロジェクトが終わってしまった。その終焉は想像にお任せするが、少なくとも読んでいる間もこの本のお陰でプロジェクト運用の問題に対していくつかヒントを得ることが出来た良書である。ビジョン・スケジュールといったプロジェクトマネジメントでおなじみのものから、テストの観点、コーディングのパイプライン、レビューミーティングから果ては政治力についてまで、今後プロジェクトマネジメントに係る際に参考となる実用的な書籍である。副題にマイクロソフトとあるが、巨大プロジェクトのノウハウは、結局はマイクロマネジメントの集合とも考えられるので、プロジェクトの大きさにかかわらず応用することが可能である。プロジェクトに関与する全ての人におすすめ。

Unable to build: the file dx.jar was not loaded from the SDK folder!

環境はMacOSX / Eclipse3.6 。新しいプロジェクトでタイトルのエラーが出てコンパイルできない問題が。

 

結論としては、Android SDK Managerを起動して、環境設定からキャッシュをクリアしたら、Android SDK Tools Ver21が正常にアップデート出来るようになりました。(それまでどうやってもVer20までしか出て来なかった)

http://stackoverflow.com/questions/13392617/in-eclipse-android-4-2-unable-to-build-the-file-dx-jar-was-not-loaded-from-the

先人に感謝。