Googleガジェット(+Dropbox)を使ってはてなダイアリーにhtmlを埋め込む

DropboxのPublicフォルダとGoogleガジェットを使って、はてなダイアリー上でのhtmlの公開のテスト。

まず、htmlを作成。

[hello.html]


hello, world

次にhello.htmlを表示するGoogleガジェットを作成。

[hello.xml]





hello.html,hello.xmlDropboxのPublicフォルダにコピー。
(今回はDropbox/Public/hatena/120602/以下にコピー。)
(追記:ModulePrefsのtitle_urlを省略すると表示されてるページにリンクされるようなので明示的に設定したほうがよさそう。)

hello.xmlを右クリックして[Dropbox]-[パプリックリンクのコピー]で公開アドレスを取得。

公開アドレスを反映させた、以下のタグを記事にペーストする。(はてなダイアリー側の制限かタグの内容をうかつに変えると表示されないみたい。)


<script src="http://www.gmodules.com/ig/ifr?url=http://dl.dropbox.com/u/78263145/hatena/120602/hello.xml&synd=open&w=256&h=48&title=hello&border=%23ffffff%7C0px%2C0px+solid+%23999999&output=js">

以上で表示された。以下、実際に試したもの。

UbuntuでSDL

emscriptenスタディしていたらSDLをサポートしてるっぽいので、とりあえずSDLスタディするためhello, world。環境はUbuntu12.04。

まずSDLをインストール。

$ sudo apt-get install libsdl1.2-dev

[hello.c]

#include 

int main()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_WM_SetCaption("hello, world", NULL);
SDL_SetVideoMode(256, 256, 32, SDL_SWSURFACE);
SDL_Event ev;
int bExit = 0;
while(bExit == 0)
{
while(SDL_PollEvent(&ev))
{
if(ev.type == SDL_QUIT)
{
bExit = 1;
break;
}
}
SDL_Delay(20);
}
SDL_Quit();

return 0;
}

ビルド・実行。

$ gcc -o hello hello.c -lSDL
$ ./hello

"hello, world"とキャプションのついたウインドウが表示された。

javascriptエンジンV8をビルド

Ubuntu10.10上でjavascriptエンジンV8のシェルd8をビルドする。
(Ubuntu12.04上でも確認)

$ sudo apt-get install subversion scons g++ libreadline-dev
$ svn co http://v8.googlecode.com/svn/trunk/ v8
$ cd v8
$ scons d8 console=readline

問題なくビルドできた。取得したリビジョンは11670。

[hello.js]

print("hello, world")

$ ./d8 hello.js

結果

hello, world

問題は特になし。
でもビルドの最後にGYPでのビルドに替えてくれって表示されてますね。

VMware Player3.1.5上にUbuntu12.04をインストール。

そろそろUbuntuも更新したいので、まずはVMware Player上にインストールする。

安全策のつもりがかなり嵌った。
VMwarePlayer4.0.3にしてみたらまともに使えなくなるくらい重くなる現象が出たり(Tools外すと解消されるみたいだけど)、
VMwareの簡易インストールを使うとUbuntuがうまくインストールできなかったり。
しかしPC環境が不調になると生活がおかしくなるくらい依存している状況はやばいと思いつつもどうにもこうにも。

というわけで、VMware Player3.1.5上(Windows7上)にUbuntu12.04をインストール。

まずは仮想マシンの構築。

VMware Playerを起動し「新規仮想マシンの作成」。
ウィザードで

  • 「後でOSをインストール」を選択。
  • ゲストOSを「Linux」「Ubuntu」を選択。
  • 仮想マシン名・格納場所を適当に設定。
  • ディスク容量はとりあえずデフォルトのまま(20GB)、仮想ディスクを単一ファイルとして格納を選択。
  • 「ハードウェアをカスタマイズ」ボタンを押し、適当に修正。(メモリ:768MB,プロセッサ:2,ネットワーク接続:ブリッジ)

これでいったん完了。

今回は、ここから
ubuntu-ja-12.04-desktop-i386.isoをダウンロード。

タウンロードしたisoを[仮想マシン]-[仮想マシンの設定]から、CD/DVD(IDE)を選んで指定する。

この状態で「仮想マシンの再生」をクリックして起動。

Ubuntu12.04のインストーラー画面が日本語で出るので「Ubuntuをインストール」ボタンを選択。
その後のウィザードはとりあえずすべてデフォルトでインストールを開始。
インストールが完了した旨のダイアログで再起動を促されるので再起動。

これでインストールができた模様。

(追記)
VMware Tools 8.8.2がインストール途中でビルドエラーを出してしまう問題は、ここのパッチvmware-tools-8.8.2_fix-vmxnet.c.patchを当てればビルドできるようになった。

Dropboxのアカウントを作成

簡易的なファイル共有手段としてDropboxのアカウントを作成する。

ここで登録

  • 氏名
  • メールアドレス
  • パスワード

を入力。これだけで登録完了。

続いてDropboxのツールがダウンロードされる。
Windowsで登録したときはDropbox1.4.0.exeが自動ダウンロードされた。
実行して指示通りにセットアップ。
これだけで使い始められる。便利。(今回はいつにも増して有益な情報がない。)

モンティ・ホール問題をシミュレーション

昔、一度書いた経験があるが手元にコードが見つからなかったのと、前判ったような気になっていたような気がするのだが思い出そうとしてみると思い出せないので、もう一度書いてみる。

まず、ぐぐってWikipediaでルールを確認する。
モンティ・ホール問題 - Wikipedia
ページが結構長くなっていてびっくりだが、全部読むのも面倒なのでルールだけ読む。

モンティ・ホール問題

「プレイヤーの前に3つのドアがあって、1つのドアの後ろには景品の新車が、2つのドアの後ろにはヤギ(はずれを意味する)がいる。プレイヤーは新車のドアを当てると新車がもらえる。プレイヤーが1つのドアを選択した後、モンティが残りのドアの内ヤギがいるドアを開けてヤギを見せる。

ここでプレイヤーは最初に選んだドアを、残っている開けられていないドアに変更しても良いと言われる。プレイヤーはドアを変更すべきだろうか?」

ゲームのルール。

(1) 3つのドア (A, B, C) に(景品、ヤギ、ヤギ)がランダムに入っている。
(2) プレイヤーはドアを1つ選ぶ。
(3) モンティは残りのドアのうち1つを必ず開ける。
(4) モンティの開けるドアは、必ずヤギの入っているドアである。
(5) モンティはプレーヤーにドアを選びなおしてよいと必ず言う。

大事なのは

プレイヤーはドアを変更すべきだろうか?

これをコーディングしてみて気づいたことは、コードを書いた段階で答えが出てしまっているということだ。

以下、コーディングを振り返ってみた。

  • まず、モンティ・ホール問題をすべて乱数で再現し、それを多数繰り返して結果を出そうと考える。(これは簡単なゲーム作成やモンテカルロ法での経験からの発想だと思う。意識的な思考過程すらない疑問もないぼんやりしたイメージ。)
  • これを実現しようと考えると(1)ドアの中身の配置と(2)プレイヤーが最初に選ぶドアは乱数でいいだろうと考える。
  • (3)(4)(5)は保留してシミュレーション全体像を考える。
  • プレイヤーがドアを選びなおす行為をどうすべきかはいまいちイメージできていない。
  • ここで、すべて「変えない」ときの景品獲得率を試行回数100回で計算することで算出する、と決める。(すべて「変える」ときの景品獲得率は"1.0-すべて「変えない」ときの景品獲得率"でいいだろうと考える。また、これで目的は達せられるだろうと考える。)
  • (3)(4)をコード化する(以下のコードではget_opendoor())
  • (5)は「変えない」だけでのコード化なので省略する。

これで完成
私の環境では29と答えが出た。コードは「100回のドアを変えない試行」だからドアを変えるときの景品獲得回数は71回となる。




個人的なポイントは、get_opendoor()がなくてもnochange_challenge()は成立することだ。(3)(4)(5)をnochange_challenge()でコード化しようとしている段階で気づいている。
つまり、

	int		cardoor = rand() % 3;
int firstdoor = rand() % 3;
return (firstdoor == cardoor);
だけとなり、プログラマーとしては考えるまでも実行するまでもなく33%と考えることとなる。(実際にはいろいろ考えなければダメですが)
get_opendoor()はモンティーの(3)(4)を模したコード。そしてコードを書いている時点での自分は、このコーディングの前からドアは変えたほうが有利だと思っているが、get_opendoor()相当の処理(関数化のイメージはまだない)は書くべきだと思っていた。

これがどういうことかということはまた今度考えますw。
(そして初出時に明らかなバグがあったことも告白しておきます。)

以下、書いたコード。


#include
#include

static int get_opendoor( int cardoor, int firstdoor )
{
int opendoor;
if( firstdoor == cardoor )
{
int openside = rand() % 2;
for(opendoor = 0; opendoor < 3; opendoor++)
{
if( opendoor != firstdoor )
{
if( openside <= 0 )
{
break;
}
openside--;
}
}
}
else
{
for(opendoor = 0; opendoor < 3; opendoor++)
{
if( (opendoor != firstdoor) && (opendoor != cardoor) )
{ // 必ずヤギのはず
break;
}
}
}

return opendoor;
}

static bool nochange_challenge()
{
int cardoor = rand() % 3;
int firstdoor = rand() % 3;
int opendoor = get_opendoor( cardoor, firstdoor );

return (firstdoor == cardoor);
}

int main()
{
int count = 0;

for(int loop = 0; loop < 100; loop++)
{
if( nochange_challenge() )
{
count++;
}
printf("%f\n", (float)count/(float)(loop+1));
}

return 0;
}

"Real-Time Fluid Dynamics for Games"

今回は唐突にこれをビルド。(ここからのリンク。ドキュメント。)

zipを展開すると、Palm/,PocketPC2002/などのディレクトリがあり時代を感じさせる。
README.txtを見ると

code/
contains solver.c and demo.c
solver.c is the basic fluid solver in two dimensions and code.c is a prototype that uses the
code. It uses OpenGL and GLUT for its interface and should run on many different platforms.
とあり、GLUTがあればビルドできるようだ。コードはsolver.c と demo.cだけ。

例によってPremake4+VC2008Expressでビルドする。
GLUTは手抜いてBullet2.79にあったものを使う。(最新は2.80らしい)

[premake4.lua]

solution "fluid"
configurations {"Release"}

project "fluid"
kind "ConsoleApp"
language "C"
files {"demo.c","solver.c"}
includedirs {"C:/bullet-2.79/Glut"}
libdirs {"C:/bullet-2.79/Glut"}
links {"glut32"}

コマンドプロンプトから

>premake4 vs2008

としてfluid.sln、fluid.vcprojを作成。
solver.c と demo.cをカレントにコピーしてfluid.slnを開いてビルド。
できたfluid.exeを実行。

いやぁなんか感動。