anlifeについて(2)
パート1のつづき
感じたことをつらつら書いています。個人的な話です。
大学院も卒業し、やはり人工知能的なモノを世に生み出すべくネット企業に。なんとかそっち方向に自分の仕事を持っていけるよう動く。結局はデータ分析というところで自分の持ち味を活かせて、周りからも少しは評価してもらえるようになったのだが、やはり人工知能的なモノを作り出していないことに、日々思いは募っていった。
それを発散すべく、趣味で画像認識エンジンを作っていた。そんな中、社内でサービスモックアップのコンテスト開催されるということで、チームでその技術を使ったサービスを作った。その結果からか、暫くの間サンフランシスコのRocketSpaceというスタートアップを支援するアクセラレータに滞在して、新しいビジネスを模索するよう司令が下った。こっにくるのは2人だけだ。
サンフランシスコで、新しいビジネスを模索して、色んな人にサービスのモックを見てもらったり、画像認識のデモンストレーションをしていて、それはそれなりに手応えを感じる。今まで研究所が高値で出していた技術を、僕らはタダで提供するかわりに違うところから対価をもらう。それとは別に、日々の課題を人工知能的なヤツが解決するようなサービスを作ってもいるのだが、どうも、これらのデモンストレーションよりも、anlifeの動画のほうがウケがいい。ふーん、という反応の人ももちろんいるのだけど、ツボにハマったようにすごく面白がってくれる人がいるのだ。
そんなことで、今まで目を背けていたanlifeを真面目に考えるようになっや。ニコニコ動画では37万再生、anlifeをシミュレーションした面白結果の報告動画が20個以上挙げられて、それらの再生数は計41万。そして申し訳ないことに、今になって初めてその報告動画をちゃんととみた。感動した。作者である自分よりも深く観察して考察している動画もあったり、想定しない使い方をしておかしな生物を作り上げている人もいた。なんていうか、ユーザが予想外のものをジェネレートしていくのが、まるで生命の進化における意外性を感じさせ、"興奮"を感じた。
中学の時にオセロのAIを作り、AIが強くなってきて自分がそれに勝てなくなったこと。自分の作ったのもが自分を超えてしう。そのときに感じた"興奮"
大学の時に4足ロボットのシミュレータを作り、普通にテクテク歩くよりも高速に移動できる「でんぐり返し歩行」を勝手に覚えたこと。自分の作ったのもが自分の想像を超えてしう。そのときに感じた"興奮"
そして今回の、自分の作ったソフトを配ることで、ユーザは自分の想像を超えたものを作ってしまうこと。そのときに感じた"興奮"
どれも電気が走るような衝撃的な感覚だった。
つづく
anlifeについて(1)
今回は、非常に個人的な中二病的な思いをつらつら書きます。(パート1)
この宇宙の仕組みがビミョウに違うことで、世界に生じるはずだった生命・生態系がある。
その"生命的なもの生態系"をどうしてもコンピュータ内に作りたくて、2009年大学院生のころ、anlifeという仮想生物シミュレーションソフトを開発していた。院生の初年度は研究そっちのけで全情熱を傾けていた。
Windows用シミュレータをネットに公開し、ニコニコ動画に紹介動画をアップロード。そしたら数日の間に20万人が動画をみてくれた。自分の好きなことを追求していただけなのに、みんな面白がってくれるんだなと手応えを感じる。しかし、このまま自分1人で開発していても工数的な理由から、ソフトが全然スケールしないことに危機感を持っていた。それを解決すべく、共同開発者をネットで募ったところ、10人ほど集まってくれた。
でも、顔も合わせたことのないみんなが、それぞれの思いで集まった集団だ。自分の思い描いているコンセプトを実現したい中で、各人の思いや自発的な動きを、当時の自分は残念ながらまとめることはできなかった。そしてこの試みは失敗した。集まってくれたみんな、本当にごめんなさい。これ以来、このソフトを思い出すのも嫌になり、ネットで"anlife"と検索することができない時期が数年続いた。
つづく
地震調査委員会の地震発生確率の計算
地震が起こるたびに気になっていた地震予測の確率計算を調べた。
文部科学省の地震調査委員会の「長期的な地震発生確率の評価手法について」
2001年の資料になるけど計算方法の概要が書いてあって、ざっと読んだだけなので間違っているかもしれないけど、理解したことを書いておく。
過去3回以上活動があった断層では、地震発生の確率の計算は、
- パラメトリックなモデルであるBPT分布を仮定し、該当する断層の過去の地震データからパラメタを最尤推定(BPT分布のあるパラメタについては、ほかの地震のデータも用いて補正をかけているみたい)
- 地震の発生確率は、「今後A年での発生する確率はX」という形で出したいので、先ほど求めたBPT分布を所望の期間で積分して求める
としているようだ。3回に満たないものはもう少し工夫しているみたいだけど、そこまで読み切れていない。
この記事がわかりやすい。
ただこの方法だと、パラメタを最尤推定で求めるので、過去数回のサンプルしか存在しない断層に関しては信頼できない値になっていそうだ。例えば、まれに人が単独で参拝に来る山奥の神社があったとして、そこに訪れた過去3人から、次の参拝者がいつ来るかを予測しないといけない。たまたまその3人の間隔が狭ければその影響が予測にそのままでてしまう。そうではなく、パラメタに分布をもたせ、物理的な制約や事前知識を事前分布として入れこんで求めれば(かつその事前分布は似たようなメカニズムの地震に関する知識と過去データを入れこめるので)予測精度は向上するのではないだろうかと思った。
たしかに、東海地震の確率計算については、過去の地震サンプルをどこまで東海地震と認定するかによって、発生確率は大きく左右されているっぽい。
過去の統計だけだと地震の予測精度向上は望めないから、物理モデルをどこまで入れこめるかの勝負になってくるのかな。
あと、下の記事タイトルにあるように70-80%という幅を持たせた表現だけど、確率はXX%と一つの数値で表現できるのだから、なんで範囲をもたせているのだろう。大人の事情でこう表現せざるを得なかったのか。そこまでは調べきれてない。
Installing VirtualBox Guest Additions on Ubuntu12.10
sudo apt-get install -y dkms build-essential linux-headers-generic cd /media/username/VBOXADDITIONS_4.1.23_80858 ./VBoxLinuxAdditions.run
reference:
http://en.ig.ma/notebook/2012/virtualbox-guest-additions-on-ubuntu-server
Jubatusのインストールめも(MinimalInstall)
Jubatusはリアルタイムに大規模分散上で各種機械学習手法を実行するフレームワークとのことです。詳しくはJubatusを公開しました | Preferred Researchを参照してください。
今更ですがインストールしてみます。Ubuntuの12.04で、jubatus-0.2.2です。
下記の公式ページを参考にまずは最小構成でインストールしたメモになります。
http://jubat.us/quickstart.html#minimal-install
Jubatusの最小構成でのコンパイルには
- MessagePack:serialization library for cross-language
- pficommon:PFIさんが開発しているC++の汎用ライブラリ
- libevent-dev:非同期イベント通知ライブラリ
- google-glog:application-level logging
が必要なので、これらをインストール。
MessagePackは
$ sudo aptitude install libmsgpack-dev
でインストール完了し、ibevent-devは
$ sudo aptitude install libevent-dev
でインストール完了し、google-glogも
$ sudo aptitude install libgoogle-glog-dev Couldn't find any package whose name or description matched "libgoogle-glog-dev" Couldn't find any package whose name or description matched "libgoogle-glog-dev" No packages will be installed, upgraded, or removed. 0 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded. Need to get 0 B of archives. After unpacking 0 B will be used.
でインストール完了し、、、いや、パッケージがないから失敗してる。
そこで探してみるも
$ aptitude search libgoogle p libgoogle-collections-java - suite of collections and related goodies for Java p libgoogle-perftools-dev - libraries for CPU and heap analysis, plus an effic p libgoogle-perftools0 - libraries for CPU and heap analysis, plus an effic p libgoogle-perftools0-dbg - libraries for CPU and heap analysis, plus an effic p libgooglecharts-ruby - Ruby library to create sexy charts using the Googl p libgooglecharts-ruby1.8 - Ruby library to create sexy charts using the Googl v libgooglepinyin - v libgooglepinyin-dev - p libgooglepinyin0 - Pinyin engine fork from Google Pinyin on Android p libgooglepinyin0-dbg - Pinyin engine fork from Google Pinyin on Android - p libgooglepinyin0-dev - Pinyin engine fork from Google Pinyin on Android -
該当するパッケージが見当たらない。UbuntuUpdates.orgのlibgoogle-glog-devパッケージのChangeLogにはDeleteと残されていたので、ソースからコンパイルすることにする。
$ wget http://google-glog.googlecode.com/files/glog-0.3.2.tar.gz $ tar -zxvf glog-0.3.2.tar.gz $ cd glog-0.3.2/ $ ./configure $ make $ sudo make install
でインストール。同様にpficommonは公式ページにあるように、
$ git clone git://github.com/pfi/pficommon.git
$ cd pficommon
$ ./waf configure
$ ./waf build
$ sudo ./waf install
でインストール。これで最小環境に必要なものはそろったので、
$ git clone git://github.com/jubatus/jubatus.git $ cd jubatus $ ./waf configure --disable-re2 $ ./waf build # sudo ./waf install
とコンパイルして、いざ実行
$ jubaclassifier
jubaclassifier: error while loading shared libraries: libjubatus_framework.so: cannot open shared object file: No such file or directory
とライブラリが読み込めていないので
LD_LIBRARY_PATH=/usr/local/lib export LD_LIBRARY_PATH
と実行して(設定用シェルスクリプトに追記して)
$ jubaclassifier -v jubatus-0.2.2 (jubaclassifier)
とすると実行できたみたいです。
次は周辺パッケージを含めてインストールして、何かサンプルを作るところまではやっておきたいなと。
前々からやりたかったのですが、Linuxスキルが弱かったためいつもインストールでこけて断念していました。
間違い等ありましたらコメント頂けると幸いです。
MachineLearningの各種手法のうち、オンライン型に変形できる手法はどんどん実装していくこととなれば、リアルタイム性を兼ね備えたインテリジェンスな仕組みを構築する障壁が一気に下がるということで、今後が楽しみですね。
MacでローカルにLAMP環境構築
OSのVersionはちょっと古いのですが10.6.8です。
Linux,UNIXの仕組みを理解するためにも、ターミナルから実行してみますが、今回はデフォルトでインストールされているパッケージを利用していきます。
Apacheの起動
デフォルトでされているので、起動スクリプトで起動します。
$ sudo /usr/sbin/apachectl start
正常起動しても標準出力にメッセージは表示されないようです。
スクリプトを読んでみるとスクリプトの終了コードをみれば正常動作なのかわかるっぽいので
$ echo $?
とシェルの特殊変数を調べ、これが0であることを確認。起動したっぽい。
$ httpd -v Server version: Apache/2.2.17 (Unix) Server built: Dec 1 2010 09:58:15
と入力し起動していることを確認。2.2系であることを頭の隅においておく。
ここで、ブラウザを起動して、URLに"http://localhost/"と入力すると
It works!
と表示されました。HTMLソースを覗いてみると
<html><body><h1>It works!</h1></body></html>
とすごく簡潔でなんていうか無駄がない。
あ、ターミナルから実行するという方針を忘れてブラウザ使っていたので、
$ curl http://localhost/ <html><body><h1>It works!</h1></body></html>
となりました。めでたしめでたし。
次に、DocumentRootのパスを調べたいので、
$ grep DocumentRoot /etc/apache2/httpd.conf # DocumentRoot: The directory out of which you will serve your DocumentRoot "/Library/WebServer/Documents" # This should be changed to whatever you set DocumentRoot to. # access content that does not live under the DocumentRoot.
と/Library/WebServer/Documentsっぽい。
$ ls /Library/WebServer/Documents
PoweredByMacOSX.gif PoweredByMacOSXLarge.gif index.html.en
あれ、index.html.enってファイルなのか。多言語対応がデフォルトで有効になっているのか?
気になるけど今回は、DocumentRootのパスが分かったので、CGIの方に進みます。
CGIの実行
で、次にCGIを実行させていく。
まず、confファイル内をcgiという単語で調べる
$ grep cgi /etc/apache2/httpd.conf LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so LoadModule cgi_module libexec/apache2/mod_cgi.so #LoadModule fastcgi_module libexec/apache2/mod_fastcgi.so ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1" <IfModule cgid_module> # socket used to communicate with the CGI daemon of mod_cgid. #Scriptsock /private/var/run/cgisock #AddHandler cgi-script .cgi #ErrorDocument 404 "/cgi-bin/missing_handler.pl"
cgiのディレクトリが出てくると思ったんだけど、これかな。
ScriptAliasMatchというコマンドが何を意味しているのかわからないけど、とりあえず、これにあたりを付けてみる。
/Library/WebServer/CGI-Executables/
$ echo -e '#!/usr/bin/perl \nprint "Content-Type: text/plain\\n"; \nprint "\\n";\nprint "Hello World!"' > /Library/WebServer/CGI-Executables/hello.cgi $ chmod u+x /Library/WebServer/CGI-Executables/hello.cgi # ←補足:これだと動きません
echo の -e は改行を改行文字で出よくしてもらうため。で、http://localhost/hello.cgiにブラウザでアクセスしてみる
$ curl http://localhost/cgi-bin/hello.cgi <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> <html><head> <title>500 Internal Server Error</title> </head><body> <h1>Internal Server Error</h1> <p>The server encountered an internal error or misconfiguration and was unable to complete your request.</p> <p>Please contact the server administrator, you@example.com and inform them of the time the error occurred, and anything you might have done that may have caused the error.</p> <p>More information about this error may be available in the server error log.</p> </body></html>
アスセスはできたもののinternal errorだとさ。internalErrorってことは、さっき作ったhello.cgiが実行されているはず。
ってことで、エラーメッセージをみるために、Apacheのログを確認。
$ tail -n 4 /var/log/apache2/error_log [Thu May 24 00:07:09 2012] [error] [client 127.0.0.1] File does not exist: /Library/WebServer/Documents/favicon.ico [Thu May 24 00:07:10 2012] [error] [client 127.0.0.1] File does not exist: /Library/WebServer/Documents/favicon.ico [Thu May 24 00:32:42 2012] [error] [client 127.0.0.1] (13)Permission denied: exec of '/Library/WebServer/CGI-Executables/hello.cgi' failed [Thu May 24 00:32:42 2012] [error] [client 127.0.0.1] Premature end of script headers: hello.cgi
ふむ。パーミッションがおかしいと。
Apacheのプロセスからcgiって起動させられるんだっけ(要確認)
ってことは
$ chmod g+x /Library/WebServer/CGI-Executables/hello.cgi
でいけるのではないでしょうか。
$ curl http://localhost/cgi-bin/hello.cgi Hello World!
いけた。
MySQL
DMGからパッケージをインストールしてしまいます。下記の記事を参考に実行しました。
Mac OSX で MySQLを動かすまでのメモ
その他寄り道メモ
スクリプトを読んでみる
/usr/sbin/apachectl 内で
if [ $UID != 0 ]; then echo This operation requires root. exit 1 fi
とあったのだけど、こうやってroot userを判別するのが一般的なのね。
あと、スクリプトの引数ってこうやって分けるやり方も、サクッと軽量のスクリプトを作る場合は楽なのかな。
一般的なコマンドのような引数機能を持たせたい場合は、getoptsが使えるみたい。
case $ARGV in start) run_launchctl load -w $LAUNCHD_JOB ERROR=$? ;; stop|graceful-stop) run_launchctl unload -w $LAUNCHD_JOB ERROR=$? ;; restart|graceful) run_launchctl unload -w $LAUNCHD_JOB 2> /dev/null run_launchctl load -w $LAUNCHD_JOB ERROR=$? ;; startssl|sslstart|start-SSL) echo The startssl option is no longer supported. echo Please edit httpd.conf to include the SSL configuration settings echo and then use "apachectl start". ERROR=2 ;; configtest) $HTTPD -t ERROR=$? ;; status|fullstatus) echo Go to $STATUSURL in the web browser of your choice. echo Note that mod_status must be enabled for this to work. ;; *) $HTTPD $ARGV ERROR=$? esac