ブラジル・シンドローム(Google Earth)

Google Maps版の続き。

Google Earthプラグインは操作環境の制約が厳しいという問題があります。たとえば、iPadでは動きません。

Google Earth
フクシマの反対側は海

ピンをクリックすると、地球の反対側に移動するようになっています。地球が完全な球では無いことは考慮していませんが、WolframAlphaの結果とだいたい同じなので、とりあえずよしとしましょう。

Googleのサンプルがありましたか(私のFirefoxはいつも固まってしまうけど)。

追記:Mathematicaでやるのが簡単です。

ブラジル・シンドローム(Google Maps)

メルトダウンと聞いて「何をいまさら」と思うのは、体制にとって都合のいい反応なのでしょう。

それはともかく、「メルトダウンした燃料がどんどん下に落ちていって、ついには地球の反対側つまりブラジルを汚染する」という話があって、ブラジルの人たちが逃げ惑っているそうです(嘘)。

地球儀を使えば、フクシマの反対側が陸地ではないことはわかるのですが、Google Mapsで確認しておきましょう。ブラジルでパニックや風評被害があってもいけませんし(WolframAlphaで確認する方法を先日紹介しました)。

Google Maps
フクシマの反対側は海

地球が完全な球では無いことは考慮していませんが、WolframAlphaの結果とだいたい同じなので、とりあえずよしとしましょう。

お約束ですが、Google Mapsを使ってオリジナルのウェブページをつくる方法は、拙著『Webアプリケーション構築入門』で紹介しています。

Mathematicaでやるのが一番簡単と思いつつ、Google Earthで確認する方法を後で書きます。(追記:書きました。

音符の回文と楽譜の表示と演奏のためのJavaScriptライブラリabcjs

ホフスタッター『ゲーデル、エッシャー、バッハ』を読むまで知らなかったことはたくさんありますが、前から読んでも後ろから読んでも同じになる曲「逆行カノン」が、バッハの「音楽の捧げもの」の中にあるということもそのひとつです。対称になるように音符を並べるだけなら誰でもできますが、それが音楽として成立するというのはバッハの天才のなせる技でしょう。

『ゲーデル、エッシャー、バッハ』では、これに対応するエッシャーの作品「蟹のカノン」(図42)と、アキレスと亀の対話「蟹のカノン」、形式システム「TNT」が紹介されています。エッシャーの「蟹のカノン」書籍中ではグレースケールですが、「escher crab」で検索すれば、カラーのものが見つかります。対話とTNTについては書籍を参照してください(一家に一冊です)。

エッシャーの作品や対話の対称性は、注意して見たり聴いたりしなくてもわかります。形式システムの対称性はちょっと難しいです。しかし、音楽の対称性に気づくのは、桁違いに難しいと思います。楽譜を見たり思い浮かべたりせずに、この対称性に気づく人っているのでしょうか。リヒターレオンハルトの演奏でこの曲には親しんでいましたが、楽譜を見るまではまったくわかりませんでした。

CRAB CANON

というわけで、楽譜を見せたいわけですが、市販のものをスキャンして・・・というわけにもいきませんから、自分でどうにかしなければなりません。そこで、abcjsです。このJavaScriptのライブラリを使うと、テキストを楽譜に変換して描画できます。QuickTimeのプラグインが入っていれば、その場で再生もできます。下に実行例を掲載しますが、生成される楽譜はとてもきれいです。

ライブラリのロードと音情報の記述が必要です。

ライブラリのロードはこんな感じです。

<script src="http://abcjs.googlecode.com/files/abcjs_plugin_1.0.5-min.js" type="text/javascript"></script>

音情報はこんな感じで記述します(逆行カノン)。

<pre>
X: 1
T: Musikalisches Opfer (BWV 1079)
T: No. 3 Canones diversi (Realisation)
C: J. S. Bach
K: Eb
V: 1
C4E4|G4A4|=B,4z2G2-|G2^F4=F2-|=F2=E4_E2-|_E2=D2_D2C2|
V: 2
C2E2G2c2|=Bcde fedc|dGdf edc=B|=A=Bce dc=B=A|GAB_d cBAG|FGAB AGFE|
V: 1
=B,2G,2C2F2|E4D4|C4E4|GFGc GEDE|FG=A=B cEFG|ADEF GFED|
V: 2
DEFG FEDA|GFEc =B=AGF|EDEG cGFG|E4C4|D4E4|F2C2G,2=B,2|
V: 1
EFGA BAGF|GABc _dBAG|=A=Bcd ec=B=A|=Bcde fdGd|cdef edc=B|c2G2E2C2:|
V: 2
C2_D2=D2_E2|-_E2=E4=F2|-=F2^F4G2|-G2z2=B,4|A4G4|E4C4:|
</pre>

ページを表示させると、下のような画像が表示されます。『ゲーデル、エッシャー、バッハ』の図44よりも記号が冗長なのは、楽譜を対称にするためです。(画像のリンク先では視聴することもできますが、いつものように、IEはサポートしていません。)

逆行カノン

JSONに関しては、例えば、PHPを避ける

ここで紹介している問題は、PHP 5.4で解決されました。

JavaScriptのための記法であるJSONですが、最近はさまざまなプログラミング言語でサポートされています。たとえば、PHP 5には、JSON文字列をオブジェクトに変換するための関数、json_decode()が用意されています。

<?php
var_dump(json_decode('{"id":12345}'));
&#91;/php&#93;

<p>この実装はなかなか親切で、<a href="http://codepad.org/XT2fs3S5">実行結果</a>を見るとわかるように、データが数値なら、数値として取り出してくれます。</p>

<p>しかし、最近ではTwitterのつぶやきのIDがintの範囲を超えたりしているので、ちょっと不安です。下の例では、$idaと$idbの値は異なることが期待されますが、<a href="http://codepad.org/BoGUJERQ">実行結果</a>を見るとわかるように、intの範囲を超えた場合は自動的にfloatになるので、期待は裏切られます。</p>

[php]
<?php
$a = json_decode('{"id":10000000000000000}');
$b = json_decode('{"id":10000000000000001}');

$ida = $a->id;
$idb = $b->id;

var_dump($a);
var_dump($b);

if ($ida==$idb) {
  echo 'a==b';
}

ですから、JSONを書くときには、数値であっても文字列として(引用符で囲って)書くようにするといいでしょう()。つまり、データを数値として扱うことの責任は、アプリケーション側に持ってもらうしかないでしょう。

PHPの他にも、Perlやawk、JavaScriptなどは、整数がintの範囲を超えたときは、自動的にfloatになる仕様なので、気をつけないと悲惨なことになるでしょう。この機能、フェルマーの最終定理の「反例」などと冗談を言う以外に使い道ってあるんですかね。

PHPのマニュアルによれば、次のように書くことで、データを数値ではなく文字列として取り出せるようになるらしいのですが、この仕様は正式版にはまだ取り入れられてはいません。

<?php
var_dump(json_decode('{"id":12345}, false, 512, JSON_BIGINT_AS_STRING));
&#91;/php&#93;

<p>JSONに関しては、例えば、PHPを避ける</p>

<p>と言いたいところですが、JavaScriptのほうがもっと深刻ですね。jQuery.getJSON()もだめですね。</p>

<p>こういうだめな言語を使わざるを得ない開発者をサポートするために、TwitterはJSON文字列にid_strという文字列属性を含めるようになったので、Twitterの場合はこれでなんとかなります<del datetime="2013-03-05T08:15:19+00:00">(それでもPHPならXMLのほうがいいかもしれません)</del>。</p>

<p>どうしてもPHPでJSONを使いたいときは、次のようにデコードの前にJSON文字列を修正するのが簡単でしょうか(「id」で終わるものすべてを文字列にする例です)。</p>

[php]
$json = preg_replace( '/id":(\d+)/', 'id":"\1"', $json);

どうしてもPHPでJSONを使いたいときは、標準のjson_decode()ではなく、PEARのServices_JSON(すでに開発は終了している)のコードを修正するのが簡単でしょうか。

511c511
<                         : (float)$str;
---
>                         : $str;

JavaScriptではどうするのが正解なのでしょう。

HootSuiteが快適に使えるディスプレイを探す前に

画面をゆったり使う本家Twitterもたまにはいいけれど、たいていの場合は、見やすさを損なわない範囲で最大限のTweetsを1画面に表示したい。そのような要求への一つの解答が、TweetDeckやHootSuiteのような、複数カラムでTweetsを表示するクライアントだ。

OAuthとの兼ね合いで、安全性ならTweetDeckなのかもしれないが、表示フォントを選べないという欠点故に、私はHootSuiteを試している。

HootSuiteには、カラムの幅を変えられないという欠点があり、そのせいで画面の使い方に若干ゆとりがあるように思っていたら、Twitterクライアント「HootSuite」が快適に使えるディスプレイを探すなどという記事を見つけた。横幅が1920pxあるディスプレイなら、HooSuiteで6列表示ができるとのこと。

ディスプレイを大きくすればその分だけ多くのTweetsを表示できるのはあたりまえなのだが、そこまでしなくても、カラムの幅を変えるだけでずいぶんよくなるのではないだろうか。

そのためのスクリプト(Fix HootSuite Ext)はすでに存在するのだが、このスクリプトはChrome専用なので、Chromeをメインに使ってはいない私には、残念なことに使えない。

そうすると自分で作らなければならないのだが、ここまでだらだら書いてきた割に、結論は簡単だったりする。

HootSuiteのカラムを狭くする」 このリンクをブックマークにドラッグして登録、クリックすればHootSuiteのカラムを狭くして、横幅が1440pxのディスプレイでも6列表示ができるようになる。内容は以下の通り

javascript:void($('.stream').css('width','234px'));

もちろん、カラムの横幅が小さくなれば、縦方向に表示できるTweetsの数は減るのだが、このほうが画面の利用効率はよい気がする。

カラムの幅を調整したいときは、ブックマークレットのコードを変更すればよい。