平日・休日ダイヤに対応、行先表示の省略に対応、DBの整備

六帖webアプリ
kickzone/TrainNavi2 · GitHub
DBを整備したら千代田線の行先表示の「代々木上原」の文字がでかくてそれがずっと動き回って怖いので、「代」の1文字だけ表示するモードを作成した。
次は拡大縮小とスクロール。仕事と並行して作業していたので2倍の労力が必要になった。もう疲れたので、平日はしばらく大きな更新はやめる。集中力もガタ落ち、勉強も身が入らずよくない。日曜日まで待とう。


Sonny Rollins – Saxophone Colossus(1956)


★★★★★
ジャズ100枚、の2枚目。
ふ、太いっ。。正にごんぶとのサキソフォン。名古屋のきしめん。ファンキーかつ幅広な音を出すソニー・ロリンズさんはきっとデブに違いない、と聞きながら思っていたけれど、実は仙人のような容貌なのでした。そして、このアルバムはドラムがめちゃめちゃ良い!もう1曲目 St.Thomas の冒頭のイントロから最高!ドラムソロも決まりすぎ!コンプレッサーを掛けてるわけじゃないのにこの音圧。頭をダイレクトに振動させるリズム感。マックス・ローチという人らしい。要チェックや(古い)。5曲とも素直でとっつきやすく、かつ隙のない暖かな演奏。1曲目、5曲目が特に優れています。


Beethoven, Friedrich Gulda(pf): Piano Sonata No. 30-32(CD12)


★★★★★∩(・ω・∩) (∩・ω・)∩
名曲しかない。。
まず切ない切ないメロディーで始まる30番。第1楽章、中盤からは曲調が変わり実質の2楽章目、いつものベートーヴェン節が大炸裂し、チャーラチャンチャンとダサさも完備。第2楽章は長大で10分超、しかも曲調がコロコロ変わる。しっとりとした前半から打って変わって後半は押し寄せる渓流奔流、まるで木曽川。7分半くらいでまた変わり、対位法堅苦しいゾーン+ダサゾーンを抜けて長大階段へ、、美しい。
31番は第1楽章がフラペチーノ、いやキャラメルマキアートか?というくらい甘い。後味を残したまま、またまた超ダサの第2楽章スケルツォ。マイムマイムみたい。繰り返しと謎のメロディー、激しいのかそうでないのか掴みきれない変わった曲。第3楽章は暗い歌風味のメロディーからフーガで盛り上がった後また歌、そして感動のラストへ。ラストがオケもびっくりの壮大さ。
32番は前評判通り、最高傑作といっていいと思う。第1楽章は原点回帰かと思うような激しい曲、俺たちのベートーヴェン的ダサメロ、無限回廊、激情、爆音、強烈テクニック、いままでのベートーヴェンの総結集といった曲になっている。そしてベートーヴェンが新世界の神となった第2楽章、なんとこの曲には、中盤にスウィングが登場する!!この曲ができたのは1821年なので、文字通り100年早い!しかも天にも昇るような完璧な曲で!信じられない。ウソだろって思った。マジであんたすげぇよ。スウィング地帯を抜けた後は、高音とトリルを主体とした気持ちの高揚をずーっと保つかのような流れが続いて、11分過ぎにトリルが途切れ、着地する。この着地した、と思われる感覚が、並じゃない。ラストの静寂にも驚く。この曲は、他のピアノソナタのどの曲とも違う。でも、ベートーヴェンの曲とすぐに分かる。
wikipediaを見たら参考文献に「『ジャズの起源はベートーベンにある』(田幸正邦 / 東京図書出版会 / ISBN-10: 4434020315 / ISBN-13: 978-4434020315 2002年)」って出てるし!!
グルダさんもずるいです。初期中期は、わざとなのか、爆音演奏を量産していたというのに、後期になったらタッチに憂いをもたせるのだもの。引き込まれるに決まっている。ピアノソナタを全部聞いてみて、ベストはこの、最後の1枚。時点で最後から2番目。とにかく後期の演奏が素晴らしい。前半はやや誇張しすぎなのではないかというくらい、派手でダイナミクスつけすぎだったけど、特に最後の3枚の演奏は意図的なのかバランスが取れておりしっくりくるし感動する演奏だった。
残りはピアノコンチェルト3枚。しかしこの演奏と量で3000円台ってのは出血大プライスだな。


行先表示

六帖webアプリ
kickzone/TrainNavi2 · GitHub
祝日なのでゆっくり仕事しながらちょこちょこと行先表示を実装、と思ったら、夜に仕事がどっと来て涙目。行先表示まで実装はできた。これで、ある程度見た目がよくなった。
列車の行先名を普通の順序で並べる(相模大野)か、逆順で並べる(野大模相)かの境目を、線路が右下45度の直線より下になるかどうか、にした。
野大模相\相模大野
文字は逆に、右上45度の直線より下になるかどうかが分かれ目。実装をけちって、駅停車時の状態の2駅間の表示を基準に、線路上はその中間になるようにしたら、藤沢や片瀬江ノ島あたりの線路がちょうどそのくらいの角度だったので、意図せず駅名が反転アニメーションするようになった。これはこれで面白いかも。
ところどころ連絡する列車の参照が取れてないのかDBが間違ってるのか、行先表示が間違っているところがある。次回はこのデバッグからか。


デバッグと今後の予定

六帖webアプリ
kickzone/TrainNavi2 · GitHub
用事を済ませてからデバッグ。一応、動作するようになった。今回のデバッグで、よーく覚えておかなければいけないことは、
・EaselJSでテキストオブジェクトを扱う際は、オブジェクト自体の大きさに気を付けること。点と点を結んだ直線と比べると、同じ座標にオブジェクトを置いても、getMeasuredWidth()/2, getMeasuredHeight()/2の分だけ、右下にずれる。これは、四角形などのShapeにも言えること。
・さらに、右下、ということに気が付いてなかった。そう、パソコンのXY軸は、ふつーの数学で使うXY座標軸とは違う。Y軸が180度反転している。ここでハマった。左90度回転のベクトルを作ろうと思ったら、通常の座標系でいう、右90度回転と同じ計算をしなければいけない。ベクトルの計算例で作成したコードを載せておきます。

//ベクトルの長さを計算
function norm(p){
return Math.sqrt(Math.pow(p.x, 2) + Math.pow(p.y, 2));
}
//p1p2, p3p2の角の二等分線を単位ベクトルで得る
function calcBisectUnitVector(p1, p2, p3)
{
//単位ベクトル同士を足すと出来上がり
var p1p2 = {x: p2.x - p1.x, y: p2.y - p1.y};
var nrmp1p2 = norm(p1p2);
var p3p2 = {x: p2.x - p3.x, y: p2.y - p3.y};
var nrmp3p2 = norm(p3p2);
var bisect = {x: p1p2.x/nrmp1p2 + p3p2.x/nrmp3p2, y: p1p2.y/nrmp1p2 + p3p2.y/nrmp3p2};
if(bisect.x == 0 && bisect.y == 0){
//1直線上に3点があった場合、打ち消しあって0になってしまう
//このときはp1p2の法線をリターン
return calcNormalUnitVector(p1, p2);
}
var nrmBisect = norm(bisect);
bisect.x /= nrmBisect;
bisect.y /= nrmBisect;
//p1p2の左側に二等分線が来るようにしたい
//p1p2と外積をとって、正なら反転させる
var cp = p1p2.x * bisect.y - p1p2.y * bisect.x;
if(cp > 0){
bisect.x = -bisect.x;
bisect.y = -bisect.y;
}
return bisect;
}
//p1p2の法線単位ベクトルを得る
//左90度回転
function calcNormalUnitVector(p1, p2)
{
//(x, y)の左90度回転ベクトルは(-y, x)
//しかしながら、PCの座標系はyが反転しているので、(y, -x)にしないといけない
var normalVec = {x: p2.y - p1.y, y: p1.x - p2.x};
var nrmNormal = norm(normalVec);
normalVec.x /= nrmNormal;
normalVec.y /= nrmNormal;
return normalVec;
}

前回のTrainNaviと比べると、JSONをやめて、サーバーとの通信の冗長性をひたすらなくしたことで、ローカルでさえ10秒ほどかかっていたローディングが、無料サーバー経由でもほんの1秒ほどで済むようになった。自分でもびっくり。一方、描画はのろい。行先表示もまだ未実装だというのに、15fpsでもCPU使用率が20%台をキープしている。非常に簡単なオブジェクトしか描画してないんだから、もっと軽くできるはずだ。例えば列車はテキストじゃなくてShapeにした方がいいかも。キャッシュ機能も使うべきかもしれない。

今後の予定:(優先順)

  • 行先表示
  • 拡大縮小、スクロール
  • DB拡充
  • 駅名表示(どこに表示するかが問題)
  • パッケージファイルの読み込み
  • 動作速度の改善

追加したい機能(優先順)

  • スクロールに合わせた画面表示をする。画面にないオブジェクトを削除して動作を軽くする。スクロールして画面内に入ってきたところではじめて表示する。
  • 通過点のエディット機能、ベジェ曲線で完璧な線路を引くためのGUI作成。ベジェ曲線 – diary 六帖
  • GoogleMapと連携する。地図上を列車が走る。
  • スキン機能。あらゆる路線図を作れるようにする。
  • ターゲットとなる列車を決めて、強調表示する。今どのあたりを走っているかが分かる。
  • 駅をクリックしたら情報を表示する。あと何分で電車が来るとか、目的地を決めたらそこまでかかる時間とか。
  • 列車をクリックしたら情報を表示する。現在速度とか表定速度とか、次はどこに止まるかとか。
  • 運賃を表示できるようにする。FareMap(自作)の機能を全部移植する。
  • 時刻表を自動生成する。
  • この際、NAVITIMEみたいな最短経路・最安経路生成機能も付けてしまう。

列車が動いた

六帖webアプリ
kickzone/TrainNavi2 · GitHub
非常に不審な動き。まだまだバグだらけのようだ。
まず全ての列車が線路の東側しか走ってない。さらに、ベクトルの計算式がおかしいのか、駅によって場所が激しくずれる。新宿近辺は特にカクカクしている。列車の読み込み機能にもバグがあるようで、しばらくすると列車がいなくなる。バグつぶしは仕事だけでたくさんだ。半日以上かかってもあまり進まなかったなぁ。つかれた。
さて、Ajaxで非同期処理をする際、処理の終了を待って先に進みたいこともある。このような場合はsetIntervalを使って、次のように書けばよいことが分かった。

DB.readTrains(startTime, dbReadTime, trains, AddTrains); //Ajax処理 終わったらonInitのフラグがなくなる
var wait = setInterval(function() {
if (!onInit) {
//初期化が終わったのでIntervalを削除。
clearInterval(wait);
//イベント登録、開始
createjs.Ticker.addEventListener("tick", OnTickMain);
createjs.Ticker.setFPS(fps);
}
}, 100); //100msごとにフラグを確認

Beethoven, Friedrich Gulda(pf): Piano Sonata No.28-29(CD11)

Amazon.co.jp: Ludwig van Beethoven, Horst Stein, Wiener Philharmoniker, Friedrich Gulda : Beethoven: Piano Sonata No. 1-32, Piano Concertos No. 1-5 – 音楽
★★★★★(σ゚∀゚)σ
まず28番。静かな第1楽章に続き、付点リズムでずーと踊ってる第2楽章が印象的だが、第3楽章が久しぶりに中盤の神がかったメロディー&付点付き超ダサメロディー&強烈な盛り上がり、とこれまでのベートーヴェン風味を凝縮したような濃い曲になっていて、しかも物寂しげなスパイスまでついているというこれまたすごい一曲。
そして29番ハンマークラヴィーア。これは最高傑作といっていいと思います。第1楽章は爆音ド派手派手、そしてひたすら手数が多いピアニスト泣かせの曲。箱根駅伝でいうと2区。第2楽章は何故かこの曲だけ短いスケルツォで、短いといえども中盤〜終盤にかけて意味不明ゾーンがあり気が抜けません。第3楽章はプログレもびっくりの約14分の超大曲。弾く人によっては20分にもなるらしい。これのどこが緩衝曲なんじゃと思うような押し殺した感情が延々と続きます。疲れます。終盤では押し殺しきれず時々激情がほとばしってます。箱根駅伝でいうと4区。
最後の第4楽章がやばい。やばすぎる。グルダさんこの曲だけ弾けてない。人間がやるもんじゃない。まさに山登りの5区。序盤の静謐で引いて引いてこちらが待ちきれなくなったところで、対位法の右から左からの旋律、執拗なトリル、頻発するオクターブまたぎ、あちこちから音が10分間にわたって責めてくる新感覚ピアノ曲でした。無限回廊、無限階段。どこまでいっても階段。それが精密機械よりも完璧に組み立てられている、キングオブわけわからんピアノ曲。普通の人間が弾いたらブレーキ間違いなし。なぜ駅伝に例えたかというと、はじめて、ピアノ曲を聞いただけでマラソンを走ったみたいに疲れるという経験をしたから。
しかし、wikipediaには
>現実には、作曲後20数年でクララ・シューマンやフランツ・リストがレパートリー化して、各地で演奏した。
って書いてあるんだよなぁ。人間ってすごい。


Beethoven, Friedrich Gulda(pf): Piano Sonata No.23-27(CD10)

Amazon.co.jp: Ludwig van Beethoven, Horst Stein, Wiener Philharmoniker, Friedrich Gulda : Beethoven: Piano Sonata No. 1-32, Piano Concertos No. 1-5 – 音楽
★★★★★
ピアノソナタも終盤戦、あと3枚。いきなり23番「熱情」で始まる。素晴らしい演奏です。右から左から奔流が走る、ちょっと早すぎるかも。特に最終第3楽章のシメの16分和音連打ゾーンは今聞いても衝撃だ。24番からは一変して非常に優しい雰囲気の曲に変わる。グルダさんダイナミクスつけすぎなくらいですね。25番は第3楽章が短いながらも躍動感があって好きです。
26番も有名な曲らしい。「告別」と自分でタイトルを付けたそうだ。第1楽章のオクターブ+下降のところが神メロディーでめちゃんこ心にしみる。第2楽章は単なる踏み台でそのまま超軽快な第3楽章へ。2分前と3分半くらいのところの右手オクターブのフォルテッシモからピアノ?に代わって跳ね回るところがすげぇです。この曲はピアノなのにドーパミンが出まくる。すごい。
27番もマイナーながら第1楽章は異様に激しいわ第2楽章は大きく包み込むようでいて中身の熱さが見え隠れする名曲。


JavaScript→PHPに多次元配列を渡す

PHPにデータを渡すために、POSTを使うが、POSTは一次元配列しか渡せない。この制限を回避するために、いろいろな方法があるようだ。
参考リンク:
jQueryのAjaxで多次元配列をPOST – ゆっくり*ゆっくり
JSで作った多次元配列をPOSTでPHPに渡す方法 | MiLKySHADe * ミルキーシェイド
ハッシュを使わないなら、JSONに一度変換して、PHP側でデコードするのが一番楽そうだと分かった。
JavaScript側

var ary = [
[92, 88, 64, 86],
[78, 92, 96, 81],
[68, 56, 84, 70]
];
var aryJSON = JSON.stringify(ary);
$.ajax({
async: true,
type: "POST",
url: "ajax.php",
data: { Ary : aryJSON }
}).done(function( msg ) {
//なんか処理
});

PHP側

$ary = json_decode($_POST['Ary']);
for($i=0; $i<count($ary); $i++)
{
	for($j=0; $j<count($ary[i]); $j++)
	{
		//$ary[i][j]を利用してなんか処理
	}
}

こんな風にできた。オブジェクトを渡したり、連想配列を渡したりした場合は、まだどうなるか不明。