時刻表取り込み

とあるHTMLを1ファイル取り込んで、列車別時刻表のDB用csvファイルを吐き出すPHPプログラムの作成がやっと終了した。500行くらいのそこそこ大きなプログラムになった。以下結果物のサンプル。
列車情報テーブル
路線名,列車番号,平日/休日,列車種類,直通先路線名,直通先列車名

小田急多摩線,3704,1,多摩急行,小田急小田原線,3704
小田急小田原線,3704,1,多摩急行,東京メトロ千代田線,985S
東京メトロ千代田線,985S,1,普通,常磐線各駅停車,985S
常磐線各駅停車,985S,1,普通,,

経路情報テーブル
路線名,列車番号,平日/休日,発駅,着駅,発時刻,着時刻

小田急多摩線,3704,1,唐木田,小田急多摩センター,09:57,09:59
小田急多摩線,3704,1,小田急多摩センター,小田急永山,10:00,10:02
小田急多摩線,3704,1,小田急永山,栗平,10:02,10:06
小田急多摩線,3704,1,栗平,新百合ヶ丘,10:06,10:09
小田急小田原線,3704,1,新百合ヶ丘,登戸,10:10,10:16
小田急小田原線,3704,1,登戸,成城学園前,10:16,10:20
小田急小田原線,3704,1,成城学園前,経堂,10:21,10:24
小田急小田原線,3704,1,経堂,下北沢,10:25,10:28
小田急小田原線,3704,1,下北沢,代々木上原,10:29,10:31
東京メトロ千代田線,985S,1,代々木上原,代々木公園,10:32,10:34
東京メトロ千代田線,985S,1,代々木公園,明治神宮前〈原宿〉,10:34,10:35
東京メトロ千代田線,985S,1,明治神宮前〈原宿〉,表参道,10:36,10:37
東京メトロ千代田線,985S,1,表参道,乃木坂,10:37,10:40
東京メトロ千代田線,985S,1,乃木坂,赤坂,10:40,10:42
東京メトロ千代田線,985S,1,赤坂,国会議事堂前,10:42,10:43
東京メトロ千代田線,985S,1,国会議事堂前,霞ケ関,10:43,10:45
東京メトロ千代田線,985S,1,霞ケ関,日比谷,10:45,10:47
東京メトロ千代田線,985S,1,日比谷,二重橋前,10:47,10:49
東京メトロ千代田線,985S,1,二重橋前,大手町,10:49,10:50
東京メトロ千代田線,985S,1,大手町,新御茶ノ水,10:50,10:53
東京メトロ千代田線,985S,1,新御茶ノ水,湯島,10:53,10:55
東京メトロ千代田線,985S,1,湯島,根津,10:55,10:57
東京メトロ千代田線,985S,1,根津,千駄木,10:57,10:59
東京メトロ千代田線,985S,1,千駄木,西日暮里,10:59,11:00
東京メトロ千代田線,985S,1,西日暮里,町屋,11:01,11:03
東京メトロ千代田線,985S,1,町屋,北千住,11:03,11:06
東京メトロ千代田線,985S,1,北千住,綾瀬,11:07,11:10
常磐線各駅停車,985S,1,綾瀬,亀有,11:11,11:13
常磐線各駅停車,985S,1,亀有,金町,11:13,11:16
常磐線各駅停車,985S,1,金町,松戸,11:16,11:20
常磐線各駅停車,985S,1,松戸,北松戸,11:20,11:23
常磐線各駅停車,985S,1,北松戸,馬橋,11:23,11:25
常磐線各駅停車,985S,1,馬橋,新松戸,11:25,11:27
常磐線各駅停車,985S,1,新松戸,北小金,11:27,11:29
常磐線各駅停車,985S,1,北小金,南柏,11:29,11:32
常磐線各駅停車,985S,1,南柏,柏,11:32,11:35
常磐線各駅停車,985S,1,柏,北柏,11:35,11:37
常磐線各駅停車,985S,1,北柏,我孫子,11:37,11:40

あとはこれをバッチ処理して、2つの大きなファイルにまとめれば下準備は終わりだ。できるだけ汎用的に作ったので、どこの地方の路線でもほぼ動作する、はず。


Tchaikovsky, Boston Symphony Orchestra(Orch), Seiji Ozawa(cond) – Swan Lake


★★★★☆(一部★★★★★)
興奮冷めやらぬままCDを聞いた。白鳥の湖は組曲版で演奏されることが多い。バレエ用の完全版は演奏される機会が少なく、CDもあまりない。それは全曲通しで演奏すると2時間超と長いことと、演奏が難しい曲が多いためと考えられる。しかし一度完全版を聞いてしまうと、もう組曲版は聞けない。この作品の恐ろしいところは、一部の曲ではなく、すべての曲が名曲であることだ。チャイコフスキーのメロディーメイカーっぷりを2時間超にわたって味わうことができる。
指揮は最近体調が心配な小澤征爾さん。小澤さんのことは勝手に「ゆらぎの小澤」と呼んでいる。テンポの変化、ダイナミクスの変化が秀逸なのだ。このCDも非常に小さい音量で始まるが、フォルテッシモのときは音量全開となる。リタルダンドも過剰なくらいやる。短い曲でも最強に盛り上がって終わることが多いこれらの楽曲では、演奏後に拍手してしまいたくなる曲もいくつかある。
しかしこの録音には、最近聞いていたCDに共通する欠点がある。ズレだ。CD全体にわたって激しくずれる。特に打楽器や金管のずれがひどい。演奏は小澤ゆらぎが十二分に発揮されほぼ完璧だ。燃える萌える。なのにこのずれのせいでその熱狂が若干殺がれてしまう。本当に残念!やっぱりアメリカのオケだからなのか!?彼らの個性が一つにまとまることを許さないわけ!?
中にはずれてない曲もある。2枚目に収録されている、ヴァイオリンソロが特徴的な「ロシアの踊り」はチャイコフスキーのスラブ魂が込められた超名曲。今ならソロを樫本大進さんに弾いてもらいたい。オケ全員と小澤さんの呼吸が一致し、音が連鎖反応で爆発して奇跡のような1曲になっている。風呂場で聞いていて、ブラボーと叫びそうになってしまった。


Swan Lake @ 東急シアターオーブ

8年?ぶりにマシューボーンの白鳥の湖を観に行った。これで2回目。
シアターオーブや渋谷ヒカリエには初めて入った。非常に新しいホールで、作りも洗練されているように見えるが、前の人の頭が邪魔で見づらい、音響が今一つ、など設計にやや問題がある。今までに訪れたホールの中で最も良いのはここ。マイナーすぎるなので、まともな公演がないのが最大の欠点だけれど。
とはいえ、久々に劇場に入るとその雰囲気にドキドキした。巨大な幕と、大量の席。高ーい天井、通路、パンフレット売り場、異様に並んでるトイレ。劇場っていいよね!
日本ではなんと2003年から4度目という超ロングラン公演。最初の公演では子供の姿も多かったそうだが、回数を重ねたリピーターが多いと思われ、子供の数はほぼ0。年配の女性が多い。男女比1:9くらいだった。
幕が開く前に1ベルが鳴るともう観客が静かになった。5分後、照明がフェードアウトするとあの有名なイントロが流れる(リンク先は「通常版」の白鳥の湖です)。正直、一度あの舞台を見た後だと、イントロだけで胸が高まる。幕が開くと巨大なベッドに王子が寝ていて、悪夢を見ている。そこに白鳥が出てくるのだがここの音楽がすごすぎる!チャイコフスキーは偉大だ!
バレエが本格化するのはこの後、執事や使用人らが大量に出てきてから。あーどうしてこんなに体が動くんだろうね、あんな風に跳べたらなあ。途中、劇中劇でクラシックバレエを明らかに茶化しているようなシーンも挟みながら、前半の山場、打ちひしがれた王子の前に現れる大量の白鳥たち。14人の上半身裸でムキムキの白鳥たちが汗まみれになりながらそこら中飛び跳ねまわる姿は圧倒の一言。初めて見た人は普通度肝を抜かれる。今回、今までで一番近くで見られたのでもうそれは美しかった。しかも極めて動物的、クチバシは出すし無表情で首をぐるんぐるんしてキモかわい。白鳥のリーダーは今回、ジョナサン・オリヴィエという方だった。妖艶さはないが、背がとても高く端正な顔で明らかに他の人とは違うオーラを感じ取れた。不気味で魅力的というのではなく、頼れるかっこいいお兄さんという感じだった。素は絶対いい人だこれ。でも舞台上では表情が(意図的に)なさすぎてこわい。
後半、ストレンジャーとして登場した白鳥はちゃんとワルやってた。魅力的だけど、でもどことなくぎこちなさも感じた。ちょっと作ってるような感じ。ガールフレンド役の人が前半に引き続き非常に目立ってました。キャリー・ジョンソンさんというらしいです。とても上手。
ラスト、頭を壊された王子のところに集まる白鳥たちの迫真のシーンは、白鳥たちもすごいが音楽が超弩級に素晴らしい。最後に貼る参考リンクでいうとpartIIの53分17秒あたりから夢かと思うような美しい洪水に流されてしまいます。ここで涙が出た。その後はメインテーマがなんとメジャー調に変わって、もう後は終了まで一直線。王子を抱きかかえるザ・スワンの姿に涙しつつ、カーテンコールはお客さんがみんなスタンディングオベーション!!舞台はいいよね。バレエも素晴らしい。
参考リンク
Classical Ballet – Matthew Bourne – Swan Lake (1996) – part I (※クラシックじゃないだろ?)
http://www.youtube.com/watch?v=q4LDNlc_AQI
Classical Ballet – Matthew Bourne – Swan Lake (1996) – part II
http://www.youtube.com/watch?v=0tV6RfqSgYc
これのDVD持ってます。アダムクーパーはイっちゃってる。後半ストレンジャーとして登場してからは、全員を完全に食ってしまっている。


PHPの配列の参照渡し

また一つつまづいたところを書きます。PHPの配列を関数に渡すと、デフォルトでは参照渡しではなく、なんと値渡しになってしまう。

<?php
$array = array('i', 'have', 'black', 'hair');
SetHage($array);
print_r($array); //Array ( [0] => i [1] => have [2] => black [3] => hair )
function SetHage($array)
{
$array[2] = 'no';
}
?>

ハゲにならない。SetHage関数には、$arrayの内容がまるまるコピーされて、$array[2]を変更しても元の関数に何の影響も与えてない。PHPで配列とはリテラルそのもの、ということなのか?これもC言語使いやJavaScriptからしても不思議な挙動で、ふつう配列はポインタが関数に渡されるものだ、という感覚でコードを書いてしまう。マニュアルによれば、配列の内容を書き換えたかったら明示的に参照渡しを使え、ということだそうだ。でかい配列をたくさん作ったのなら、それを使う関数は参照渡しにしておかないとオーバーヘッドかかってしょうがないことになりそうだ。

<?php
$array = array('i', 'have', 'black', 'hair');
SetHage($array);
print_r($array); //Array ( [0] => i [1] => have [2] => no [3] => hair )
function SetHage(&$array)
{
$array[2] = 'no';
}
?>

これでめでたくハゲになりました。


PHPの配列

PHPの配列はハッシュだけでできているので、ふつーの数値インデックスの配列と違って、要素の削除が面倒だ。unsetで要素を削除すると、歯抜けの配列になってしまう。

<?php
//0 =>"foo", 1 =>"bar", 2 =>"hello", 3 =>"world"
$array = array("foo", "bar", "hello", "world");
unset($array[1]); ///1番目の要素"bar"を消す
var_dump($array);
?>

array (size=3)
0 => string 'foo' (length=3)
2 => string 'hello' (length=5)
3 => string 'world' (length=5)

番号0,2,3の歯抜け配列になってしまった。これをforループすれば、当然エラーになる。私のようなC++のvector, C#のListばっかり使っている人間には直感的にすぐに理解できないが、C#のDictionaryと挙動は同じだ。でも、数値が連続していることが前提でないと、プログラムを組みずらい。
いろいろ調べてみると、array_spliceを使えばいいらしい。

<?php
$array = array("foo", "bar", "hello", "world");
array_splice($array, 1, 1);//1番の要素から1つ分、つまり"bar"を消す
var_dump($array);
?>

array (size=3)
0 => string 'foo' (length=3)
1 => string 'hello' (length=5)
2 => string 'world' (length=5)

面倒じゃのう。何でもハッシュだと思ってやった方が楽かもしれないね。


DB構造再編

旧TrainNaviでは路線や駅に番号を振っていたが、これは拡張性を妨げるので、やめる。例えば、数年後に山手線新駅が完成する。このとき、駅を挿入するためには駅番号をずらさなければいけない。するとあちこちのDBも同時に直さねばいかず、必ず漏れが出てデバッグが大変になる。
路線番号はもっと拘束が大きい。簡単にインポート・エクスポートなどを行うためには、邪魔でしかない。インポート時に手元のものと衝突するから路線番号を変えなければいけない、なんてことになるとすごく手間だ。
路線番号や駅番号は廃止しよう!路線名や駅名で直接selectするのでよし。PHPもJavaScriptにも連想配列があるから、むしろ文字列の方が楽だ。
今回は正確な緯度経度を基にして駅を配置するから、駅と駅の間を直線で結ぶだけでは、特に駅間距離が長いときに不恰好になってしまう。それに、常磐線と常磐快速線のように停車駅が異なるとき、経由する線路が同じなのに描画すると線路がずれる、なんてダサいことも起こりうる。なので、駅と駅の間に、任意に経由地を挿入できるようにするべきだ。そうすれば、キレイな路線が書ける。いっそのこと曲線も書けるようにした方がいいかもしれない。電車のオブジェクトを動かすのが大変だけれど。
と色々と想像は膨らむけれどこれを全部実装するのは相当な手間だな。

暫定のDB構造

  • tnline 路線テーブル
    • linename 路線名
    • linecolor 路線の色
  • tnstation 駅テーブル
    • linename 路線名
    • stationname 駅名(空欄にすると経由地を表す)
    • kilo 営業キロ
    • latitude 緯度
    • longitude 経度
  • tntrain 列車テーブル
    • linename 路線名
    • trainname 列車名(列車番号)
    • service 平日か土日か
    • trainkind 列車種類(急行とか各停とか)
    • nextlinename 直通先路線名
    • nexttrainname 直通先列車名
  • tnroute 経路テーブル
    • linename 路線名
    • trainname 列車名
    • service 平日か土日か
    • startstation 発駅
    • endstation 着駅
    • starttime 発車時間
    • endtime 到着時間

Artur Rubinstein(piano), Symphony of the Air(orch), Alfred Wallenstein(cond) – Saint-Saëns: Concerto No. 2 / Franck: Symphonic Variations / Liszt: Concerto No. 1(RCA Living Stereo CD56)


★★★☆☆
ポーランド出身のユダヤ人、アルトゥール・ルービンシュタインのピアノ協奏曲が3曲も入っているこのアルバム、やや録音が古く、しかも後半の2曲は恒例のオケの音ずれが頻発します。アメリカの楽団は元気はいいんだけど荒っぽい。。20世紀に活躍した大演奏家はみんなユダヤ人だ。なんで?
フランス音楽といえばいわゆるエスプリに富んだ、一歩引いて訳分かるような分からないような謎和音を繰り出しまくるのが特徴ですが、サンサーンスのピアノ協奏曲第2番はこの法則に当てはまらず直球です。特に第一楽章。マイナーでドジャーンと攻めるド演歌とベートーヴェンを混ぜたような波がやってくる。ピアノ爆速の第三楽章も聞きごたえがあります。
ダサカッコいい系譜の強肩打者、リスト様の協奏曲は冒頭の旋律がいつも通りの激ダサで、胸に響きます。終盤に再び現れるメインテーマも安定のダサさ。これを強烈に荘厳に演奏してくれるといいのだけれどピアノ以外はいまいち。木管が浮いてるし全体的にずれてる。ピアノは見事です。明らかに規格外のキチガイ譜面なのに超絶かっこいいです。オケがもうちょっと上手だったらなあ、残念。他のCDでもう一度聞いてみたい。


おととい見た夢

大きなホールでマイクを仕掛けてコンサートの様子を録っている。アーティストはなぜかゴールデンボンバーのようなビジュアル系だ。私はMCに付き合わされたり、歌わせられたりしている。
私が舞台を離れると演奏が始まる。私は誰かを探しに行く。一緒に演奏を聴きに来た誰かを。誰なのかはわからない。途中に母がいる。「よくこの会場まで来れたねぇ」と言われる。私は急いでいるので無視して会場を出る。マイクのことが気になる。ホールを出て図書館を抜け、地下階まで移動した後、母の言動にむかっ腹が立ったので一度ぶん殴ろうと、またホールを目指す。しかしなかなか到着できない。どれだけ歩いてもデパートの商品売り場だ。演奏が聞こえてくるが、何故かオーケストラに変わっている。
やっとのことでホールに続く道標の看板を見つけて、ロビーに入ると演奏は終わってしまっていて、弦楽器を抱えた数人の集団が階段を下りてきていた。チェロを抱えて私と同じくらいの年の女性が手招きで挨拶する。私はそれが誰か分からないのだが分かったふりをして挨拶するも、数秒でいたたまれなくなり「誰だっけ?」と言うとその女性は謎のポーズとセリフを発するのだが私はそれで何故か演劇部のAさんと分かる。「チェロは前からやってたのよ」と言って去っていく。
私は客席に行くも結局誰も見つからない。ここで目が覚める。


TrainNaviリファクタリング準備

LanguageTrainerがある程度完成したので、次はTrainNaviをもっと実用的なものにしたい。具体的にやらなければいけないことは次の通り(優先度順)。

  • 時刻表・列車データの充実
    • いま小田急・京王・JR中央線しかないのでさらに追加、できれば首都圏全域まで拡大したい
    • そのためには、入力の手間(すっごい面倒)のスクリプト化による大幅な省力化が必要
    • データベース形式も見直すべき
  • 画面刷新
    • 位置情報を駅に付加して地図のような画面表示をする(いまは縦一列にしか並んでいない)
    • 総武線+中央線や京王線+京王新線など、複数路線並列の場合の対処が必要
  • 描画処理の高速化
    • 特定の路線、特定の列車種類だけの表示
  • 時刻表データのファイル出力、入力
  • ターゲット列車、もしくは経路を指定して強調表示
  • 駅をクリックしたら時刻表を表示

画面表示についてはかなり大幅なリファクタリングが必要になりそうだ。初めてだからしょうがないが、ビューをもっと厳格に分離して簡単に首を挿げ替えられるようにしておくべきだった。
描画処理の高速化については、駅や路線については一切再描画が必要ないので、こいつらに対してobject.cacheを使えば相当の高速化が見込まれる。列車本体もほとんど再描画しないのでこいつにも適用するべきだ。


Steven Wilson – The Raven That Refused To Sing (2013)


★★★★★
21世紀のプログレを聞いてみたい、と思い、事前知識何もなしで、こちらのTop 2013 albumsの1位のアルバムを試しに聞いてみた。
これは。。良いです!UKロック、ジャズ、少々のクラシック、エフェクト、古いプログレ、ビートルズなどの良いところを全部持ってきながら、芯の部分はスタンダードなUKロックを貫き通している、という、現代ならではの楽曲たちだった。6曲すべてに相当気合が入っているのがわかる。ヴォーカルも若さで飛ばしている。さすが21世紀だけあって、録音技術、マスタリングは完璧だ。そして、本当にたまたまなんだけど、キングクリムゾンがいつも使っていたメロトロンの音が!驚いた。
Steven Wilsonについて調べてみると、若さで飛ばしていたと思っていたのに、46歳だった。でも顔はめちゃ若い。なぜあんな澄んだ声が出せるのか。。そしてやはりというべきかイギリス出身のプロデューサー兼ミュージシャン。クリムゾンの魂を受け継ぐ者ということか。
日本人、特にファミコン・スーファミ世代にプログレは親しみ深い。ゲームミュージックでよく使われる曲調だから、だ。おそらくこの時代のゲーム作曲者がみなプログレファンだったんだろうな。特に3曲目The Holy Drinkerなんか、クロノトリガーやFF6をやりこんだ人にはグッとくるのではないか。
そして特筆すべきはドラムスだ。Marco Minnemann という人らしい。異常に上手い。普通のリズムを叩いているかと思うと時々あり得ないようなリフを繰り出す。力をためておいて攻撃力2倍という感じだ。この人も要チェックだな。
ジオンはあと10年は戦えると言いつつ2か月で敗北してしまったけれど、プログレはまだまだ戦えそうだ。ポップな要素も取り入れつつ次のステージに向かうのでしょう。