2014年8月31日日曜日

タイム差の連鎖で比較する方法の検証(2)

タイム差の連鎖で比較する方法の検証で書いたつづき。
予想がどれぐらいいいのかは、的中率と回収率で評価するしかない。しかし、オッズというのが非常によく出来ているというか、「みんなの意見」は案外正しい (角川文庫) というか、的中率が上がると回収率が下がり、的中率が下がると回収率が上がるみたいな結果になりがちだ。で、両方あげようとすると、フィルタリングをかけるのか、何らかの手段を講じないといけないだろう。

とりあえずは、この予想方法で、最も速いと予想された馬が何番人気だったのか、という結果を調べてみた。

1番人気 11856レース
2番人気  6681レース
3番人気  4298レース
4番人気  3082レース
5番人気  2290レース
6番人気  1813レース
7番人気  1384レース
8番人気  1255レース
9番人気  1032レース
10番人気  873レース
11番人気  735レース
12番人気  668レース
13番人気  561レース
14番人気  439レース
15番人気  358レース
16番人気  282レース
17番人気  67レース
18番人気  47レース

もっと、人気馬が選出されていると思っていた。いくらなんでも、この予想方法で18番人気の馬が選出されることがあるのは、少ないとはいえ、理解しがたい。もちろん、18番人気の馬が勝つ確率はある。上記のデータと同じ(2001年から2013年のレースでデータが80%以上そろっていたもの)レースで18番人気の馬は2回勝っているようだ。しかし、予想については、タイム差を使っているのだから、基本的にタイムが速い馬が選出されているはずである。人が予想する場合もタイムを見ているはずで、ある程度上位に来ないとおかしいのではないか。詳細を調べてみたい。

2014年8月30日土曜日

タイム差の連鎖で比較する方法の検証

タイム差の連鎖で比較するの考え方で書いた方法で計算をしてみた。馬の連鎖は3連鎖までとした。単純に言えば、AとBの馬の差を計算するときに、AとB直接対決した場合か、A-C(AとCが出たレースの差)-B(CとBが出たレースの差)のように、間に別の馬を1頭のみ挟んだ場合、同様にして2頭挟んだ場合を計算する。Aの強さは、A-Bのタイム差(複数ある場合は平均)、A-Cのタイム差、...、と計算したタイム差を平均したものとする。データがそろわないものは予想から外さないと行けないので、80%以上出走馬のタイム差が出た場合のみにした。予想は2001年から2013年の13年分。で、結果は、以下。

的中率 19.7% 回収率 83.1%

うーむ、なんと悪いことよ。ところで、同じレースの1番人気の的中率と回収率は、以下。

的中率 32.3% 回収率 76.1%

回収率は1番人気よりましだが、的中率はかなり悪い。だいたい予想アプリを作るとこういう傾向になる。

2014年8月28日木曜日

書評: カイジ「命より重い!」お金の話

経済学の基礎的な内容で、お金にまつわる話が書かれている。ところどころに漫画のカイジの1ページが差し込まれている。カイジの陥っている状況などを題材として、説明していく。

カイジが書かれていることで興味がひかれるような人を対象に書かれているわけで、そんなに難しい話をしてもしかたないからだろう。原則的な内容で、経済学の基礎はわかっている人なら知っているレベルのことのみで書かれている。たとえば、給料の決まり方は、資本論、つまり、必要経費で決まるという説明で書かれている。実際はさまざまな条件が絡むため、そのままというわけではないので、実感がうまくあてはまらず、逆に知らない人はこれだけ読んでも、わからないのではないだろうか。

最低賃金をあげたらどうなるか、という回答も、最低賃金で働いている人ような人が、まず、職を失う、という内容である。単純にはそう考えられるが、状況次第でそうではない。たとえば、少し前の日本のようにデフレーションで苦しんでいる時期であれば、インフレーションにうまくつながり、景気がよくなるなど、いいスパイラルにつながるかもしれない。そのような場合は、職を失うという結果にはならない。

この本はお金に対する考え方の本で、借金をしてしまうような人向けなのであるが、そういう人が読もうとするかどうかはよくわからないところだ。とりあえず、この本を読むと、カイジを読みたくなってくるのは確かだ。

2014年8月24日日曜日

タイム差の連鎖で比較するの考え方

タイム差の連鎖で比較するで、書いたようにタイム差を使った予想アプリを作成する。
考え方は単純だ。たとえば、2014年の宝塚記念を考えてみる。1着 ジャスタウェイはゴールドシップだが、メイショウマンボを除いて、他の馬とは過去に一緒のレースに出たことがある。なので、それから、タイム差が求められる。たとえば、2着 カレンミロティックとのタイム差は、
有馬記念(2013年)
3着 ゴールドシップ 2.33.8
6着 カレンミロティック2.34.3
をもとに、0.5秒差と算出できる。しかし、直接対決をしていない場合であっても、他の馬経由で算出できる。
ヴィクトリアマイル(2014年)
1着 ヴィルシーナ 1.32.3
2着 メイショウマンボ 1.32.4
ジャパンカップ(2013年)
7着 ヴィルシーナ 2.26.3
15着 ゴールドシップ 2.27.5
つまり、ゴールドシップとヴィルシーナのタイム差は-1.2秒差、ヴィルシーナとメイショウマンボのタイム差は0.1秒差、で合わせて、-1.1秒差というのが他の馬経由でのタイム差である。このタイム差は宝塚記念で実際には勝ったゴールドシップのほうが遅いということだが、たまたま大負けしたジャパンカップが算出用のレースになったのだからしかたない。このようにある馬経由で算出できるタイム差はたくさんあるはずで、それらを平均すれば、それなりに正しいタイム差が出せるのはないかというのが、考え方。
いくつも馬を連鎖すれば、誤差が蓄積されているだろうし、その組み合わせを算出するために計算量が大きくなる時間がかかるだろうから、ある程度連鎖の数はしぼるのがいいのだろう。そして、タイム差は距離によって重みが違うだろうから、単純に-1.2+0.1=-1.1ではなく、-1.2/(2.27.5秒) + 0.1/(1.32.3秒)ように走破タイムで重みを変えることにする。

2014年8月20日水曜日

高校野球

高校野球「大量リードで盗塁」、何が悪い 夏の甲子園に「大リーグ不文律」は意味なしにあるが、大量リードでの盗塁を問題する人がいるようだ。これは、高校野球の位置づけの微妙間がもたらす問題と言えるだろう。

メジャーやプロ野球にはそういう不文律があるわけだが、結局のところ、こういう不文律は「観客が見て面白くないから」、に尽きる。野球はピッチャーの不調などで最初のほうで一気に試合が決まってしまうことがある。でも、雨でも降らない限り、9回まで試合はやることになる。バラエティ番組と違い、差が開いたからといって、この回は何と得点は3倍とか、するわけにはいかないわけで、試合終了までやるしかない。プロである限りは、ショーである部分が大きいわけで、ある程度勝っている側を制限したりするのは、演出の範囲であろう。一方で、大差がついていても、勝ってる側のピッチャーが乱調になれば、一気に追いつくこともあり得るのが、野球とも言えるので、勝つことだけを考えれば、おかしいのだが、それこそショーとして面白くなるのでいいのだ。

高校野球は微妙だ。本来は高校の部活動のはずなのに、ショーの側面が大きい。もう大昔の話だが、思い出されるのは、松井秀喜の5打席連続敬遠だ。勝つためには、最善の策と考えてしたことのはずだが、批判も多かった。ショーと考えれば、これはありえない作戦だ。多くの人は松井のホームランを楽しみに見てるんだから。大量の客が入って、全試合テレビ中継があり、ニュースや新聞で取り上げられる。プロと同じ状態。だからこそ、いろんなチーム・選手の内実をドラマ仕立てにして、盛り上げたりする。おにぎり2万個の件が議論になるのも、ショーなのか、部活なのかの微妙さから来るのだろう。ショー化して、どんどん消費していく。連投して故障する投手もショーの中で消費されたと言えるのだろうな。

2014年8月19日火曜日

ラングリッチ(3)

最近、よくレッスンを受けていた先生が辞めたり、予約がいっぱいすぎてとれなかったりで、新しい先生の開拓が必要だ。選ぶにあたっては、写真と自己紹介文、発音練習みたいな動画、自己紹介のビデオがある。あとはお気に入りに登録されている人数。しゃべりを聞いたところで、あんまりわからないし、新しく入った先生はまだなかったりする。自己紹介文については、なぜか日本語でも紹介されている先生もいたりして謎だ。長い・短いで何か違いがあるわけでもない。結局、適当に選ぶしかないとも言える。

そして、多くの人は写真で選んでいるような気がする。理由は単純だ。お気に入りに登録されている人数順に先生一覧を見ることが出来る。それで見て行くと、写真写りのいい先生が上位のように見えるからだ。先生によって、午前だけだったり、土日だけだったり、といろいろなパターンがあるので、やっぱ多くの人が受けられる時間にレッスンをしている先生が上位にくるような気はするが。でも、現在トップのZee先生はAM5時から9時までのようだが、358もの登録がある。どうなってんだ。日に8コマしかレッスンがない。ということは1週間40コマなのに、358名の登録。平均すると2ヶ月に1コマぐらいしか受けられんぞ。受けたことない人もお気に入りにしてんじゃないのかとすら思える。
[修正]Zee先生のクラスは、午前に加えて20:30-25:00までの9コマもさらにあるようだ。長時間労働だな。とすると平均して1ヶ月に1コマぐらいか。それでも、やっぱり、めったにとれないよな。

2014年8月18日月曜日

ラングリッチ(2)

ラングリッチは始めてから何ヶ月か経つと、4日分の予約を取ることが出来るようになる。そのため、明々後日の予約をとることになるのだが、先生によっては全然とれない。いつ予約してるんだ他の人たちは。朝の7時ぐらいに見ても、すでに全部の時間帯埋まっている先生もざらだ。よく話していた先生が、全然とれなくなってしまうのが残念なところだが、これはしかたない。その時間、他の人がすでに予約したというだけで他に先生はいるので、レッスンは受けることが出来る。先生を選ばなければ、全くとれないことはまずない。 また、結構先生が辞める。辞める前に教えてくれる先生もいる。フィリピンでは転職はよくあることのようなので、しかたない。まだ学生でバイトとして先生をしている人もいるので、就職したりもあるようだ。なので、いろいろな先生を試して行くしかない。 何ヶ月か前から、お気に入りの先生を登録できるようになった。そして、お気に入りに登録している人の人数を見ることが出来る。つまり、その先生の人気を見ることが出来る。じゃあ、人気の先生がいい先生なのか、というとこれがよくわからない。大人気の先生も誰かがキャンセルしたのか、とれることもある。で、とって試してみても、何が違うのかよくわからなかったりもする。なので、あまり人気に左右されてもしかたない。でも、先生は人気によって評価されたりするのだろうか、気になるところだな。

2014年8月17日日曜日

ラングリッチ

英会話の勉強に、オンライン英会話のラングリッチをやっている。Skypeで話すわけだが、毎日25分。今は6000円に値上がりしたが、入った時期の問題で1ヶ月あたり4980円。1日1回受けなければ損になってしまうので、基本的に毎日21時から受けるようにしているので、それに合わせて、会社を出て帰ってきている。始めた頃は、英会話をするということに対して、敷居が高く感じていたのだが、さすがに半年以上経つと何も気にならなくなった。 オンラインのテキストがいくつか用意されているので、それを使う。僕はVOAという英語のネイティブでない人向けの英語放送を文字にしたものを基本的に使っている。新しい記事が増えて行くので、毎日やっていても、ちょうどいい感じで進めて行ける。不得意な分野の記事だと会話するのも大変だが、得意な分野だと結構しゃべりやすい。が、逆に、言いたいことがどうしても英語で言い表せず歯がゆく感じたりもする。フリートークも可能だが、そもそも、知らない人との日本語会話がそれほど得意でないのに、25分しゃべるのはきつく感じる。先生がいろいろ質問してくるので、それに答えるだけで、25分ぐらいすぐすぎてしまうので、特に問題はないものの、テキストをやったほうが楽しめる気がする。 どちらにしろ、いきなりテキストに入るのではなく、今日何があった、みたいなトークから入るので、話をする。しかし、ウイークデイに聞かれたところで、毎日仕事に行ったぐらいしか言うことがない。仕事で何かしゃべりやすいイベントがあれば別だがいつも大したことないので、何を話すのが少し悩ましい。それでも、僕は家で仕事の話をしないので、先生に対してのほうが話していることになる。実質20分ぐらいなので、VOAの記事1つが終わらない。VOAの記事は長さがいろいろあるので、長いものだと4回ぐらいかかることもある。先生によっても、レッスンの進め方が変わるので、すぐ進んでしまうこともあれば、全然進まないのもある。いろいろ質問をしてくれる先生のほうが好きなので、進め方が遅い先生を選ぶようにしている。

2014年8月14日木曜日

いつ車を買い替えるか(2)

いつ車を買い替えるかの続き。

今は買い替える目的がない。特に今の車で満足しているからだ。何回か、ぶつけたり、ぶつけられたり、こすったりしたが、修理して問題なく走れている。

そして、ハイブリッド、電気自動車、燃料電池自動車、と技術の切り替わりが来ている。

ハイブリッドは好きではない。2系統あるのが、壊れやすさと価格の高さにつながるように思う。価格の高さについては、戦略と政治によりそれほどでもないが。しかし、嫌いは嫌いだ。2つ抱えている無駄は気に入らない。

電気自動車の時代はいつ来るのか。電気自動車はいい。車通りの多い道路の近くにたつ新築一戸建て、数年経つと結構黒くなる。こういうのが電気自動車になるとなくなるとするとすごいことだ。また、音も静か、ということは、大通りの近くであっても、騒音に悩まされなくなるということだ。そう考えると、土地の値段を変えてしまうかもしれないインパクトを持つ。しかし、走行距離と充電にかかる時間はいかんともしがたい。いつ、解決する技術が出るのか、その予測は難しい。どちらにしろ、研究レベルで技術が出来て、それから実用化するには、安全が重要な車では数年はかかるだろう。そう考えると、まだ、遥か先のような気もする。バッテリの進化にみなが期待するところであり、去年はバテナイスで一時期、一部の人たちが(というか投資家?)盛り上がっていた。しかし、日経エレクトロニクスの記事を見ると、
なぜなら、同電池の場合、電極当たりのエネルギー密度の点で高性能なリチウムイオン二次電池に劣っている上、技術的なブレークスルーがなければエネルギー密度を大幅に向上させることは難しそうだからだ。

とある。長所だけ見ると、期待させられるのだが、きっちり見ると、やはり簡単に置き換えられない問題がある。ブレークスルーはいつ起きるのか。田舎の海岸線を走っていると、気持ち良さそうなオープンカー。渋滞の首都高で見ると、何かの修行ですか、と思う。こういうのも、電気自動車になると、快適になるのだろうな。

2014年8月13日水曜日

書評: これがメンタリズムです

メンタリストDaiGoが書いた本。テレビ等でやっていたことの種明かしの本になるのだろう。

まずは、フォーク曲げの話。単に力で曲げているだけと言うことだ。なので、種も何もあったものではないが、3点押さえてテコの原理で曲げているので、曲げている流れをよく見ると、その瞬間があるらしい。何度も何度も練習して、非常に滑らかに見えるようにしている。こっちのほうは、なるほどね、と思える話ではある。それは最初のさわりであり、本論はメンタリズムの話。

結局のところ、いろいろな仕草で、ある物を印象に残るようにして、選ばせるようにする。さらに、目の動きや筋肉の動き等よく観察して人の考えていることを読む。そして、失敗したら、うまくごまかす。単純に言えば、そういうことのよう。選ばせるためのテクニックも紹介している。3を選ばせようと思ったら、

○○さん(3)ですね。これから参加型のメンタリズムを行います
って言うとか、選んでもらいたい、というときに、パッと3本指を出したり、頭の中で数字を描いてください、というときに、空中で3を書く、とか、で刷り込んでいくという。

うーん、納得しがたい。でも、この本は本当のことを書いているのだろう。テレビでは失敗したこともあることも書いてある。笑っていいとも、では悲惨な状態だったらしい。


2014年8月12日火曜日

いつ車を買い替えるか

7年の車検が終わり、車検証とシールが送られてきた。早速、シールをフロントガラスに貼った。次の車検はまた2年後。そろそろ車は買い替えるべきなのか。車検等のメンテナンスをしてもらっているトヨタカローラの人に聞くと、当然、いつも買い替え時期である。聞くと、そのときが買い替え時期。聞かなくても、あの手この手で買い替え時期。当たり前だ、売るのが仕事なのだから。ポジショントークをそのまま聞いてもしかたない。

前に買い替えたときは、わかりやすい時期だった。それは、子供が生まれたから。それまで乗っていた車ヴィッツには、後部座席のドアをつけていなかった。後ろに乗る人はいないので、無駄だと思い、つけなかった。しかし、チャイルドシートというのは、普通、後部座席に付けるものである。どちらにしろ、人数が増えれば、後部座席を使うしかない。そこで、買い替えた。すでに、8年間乗っていた車だったので、ちょうどいい機会でもあった。

ではどういう車を選ぶか、というのもそれほど悩まなかった。赤ん坊を抱きかかえて乗り込むことを考えると、スライドドア。少し大きくなってきて自分でドアを開けられるようになっても、ドアがバッと開いてしまうことを考えると、スライドドアが安全だろう。後は、荷台の大きさが欲しかった。ヴィッツの荷台では買い物のとき、せまく感じでいた。後部座席を使わない間は、後部座席にも荷物が十分におけたが、それがなくなると考えると、ある程度の広さが必要である。で、3列シートの車をいくつか車を見てみたが、どれもでかい。でかすぎて、狭い道が多い周辺を運転できそうな気がしない。まわりの人はそれでも運転しているんだけれども、自分には無理。そのバランスで、最終的にシエンタにした。

7年経ったということは、あと1年で前の車と同じ期間乗ったことになる。さて。

2014年8月11日月曜日

タイム差の連鎖で比較する

スピード指数は前の記事で書いたように難しい。そこで違う方法を考えてみる。

競馬新聞から競馬を予想するとき、過去のレース結果からその馬の強さを予想する。過去のレースの格や順位、タイムなどいろいろな情報を使う。スピード指数はその中でもタイムに注目して、そのタイムがレースごとの馬場の状態や展開によって差が出ることから、その調整を入れる。でも、その調整という部分が技術の必要な部分であり、予想ソフトなりの特徴になってくる。

しかし、調整というのは結局のところ、馬の強さに合わせることであり、遅いはずの馬のタイムは遅くして、速いはずの馬のタイムは速くするということになる。それにより、そのレースに出る馬の過去のタイムを比較しやすくする。しかし、そもそも過去のタイムを比較しやすくするためであれば、調整したタイムではなく、直接的に比較すればいいのではないか。

たとえば、Aという馬とBという馬があって、前走でも、AとBが直接対決していれば、そのままのタイム差(T(A)-T(B))を使えばいいし、直接対決していなくても、AとC、BとCが対決しているレースがあれば、AとBのタイム差は(T(A)-T(C))+(T(C)-T(B))を使えばいいのではないか。おそらくこのように他の馬を介して計算するタイム差はいくつもあるだろうが、それらを平均すればいい。このタイム差の計算方法は、いくつの馬を介せば、あるレースの全頭の時間差を出せるのかが気になるところではある。しかし、同じクラスの馬は、他の馬を1頭か2頭介せばつながるのではないか。一方で、クラスが上がったばかりの馬については、つながりにくくなる可能性はある。しかし、他にもよく似た時期に同じようにクラスを上がった馬もあるはずで、それほど気にする必要はないかもしれない。それに、クラスの壁と言われるタイムだけではわからない差をこの方法だと見ることができるかもしれない。また、芝もしくはダートが初挑戦のような馬もつながりにくいだろう。これは、そもそも予想が難しい部分でこの方法に限らない問題であり、それほど気にする必要はないだろう。

2014年8月10日日曜日

スピード指数の難しさ

スピード指数を出すには、場所と距離ごとの標準タイムが必要だ。しかし、距離による時間差距離による時間差(2)などで書いてきたが、500万以下、1000万以下クラスで同じ距離のレースが何度も行われているわけではないし、雨が降ると一気に走破タイムが変わる。それに、この記事に書いたようにオープンしかないようなレースもある。スピード指数系の予想ソフトを作る人は、ここをどのように適切にするのか、それがポイントになるだろう。逆に言えば、ここに恣意的な操作を施すことによって、それなりの結果を得られるようにすることもできると考えられる。また、開催日ごとの馬場の差を計算に入れるための馬場指数についても同じようなことが言える。馬場指数は、その日に行われたレースのタムから決めることになるだろうが、結局のところ、馬場の状態だけでなく、ペースなどいろいろな要因から変わってくるため、調整するしかない。ここも恣意的な操作が入る部分である。ここの目利きが、その予想ソフトの強さに影響する。

つまり、標準タイムと馬場指数は過去のレースからの計算のみで算出することはできない。過去のレース結果を参考にして、そこから経験等をもとに調整することが必要だ。だからこそ、この部分が売り物になるのだろう。西田式スピード指数のサイトでは、標準タイムと馬場指数が有料で手に入れられる。もう少し、自動的な計算のみで指数を出せないものか。

2014年8月9日土曜日

データベースを使う(4)

データを取り出すのは簡単だ。SQLのselectを使えばいいだけ。下のような形で、馬名で指定する馬の一定期間内のデータを取得することが出来る。

public List<HorseData> select(String horsename, Date mindate, Date maxdate) {
try {
PreparedStatement ps = conn.prepareStatement("select * from Horse where name = ? and date < ? and date >= ? order by date DESC");
ps.setString(1, horsename);
ps.setDate(2, new java.sql.Date(maxdate.getTime()));
ps.setDate(3, new java.sql.Date(mindate.getTime()));
ResultSet rs = ps.executeQuery();
return readResultSet(rs);
} catch (SQLException se) {
for (SQLException e = se; e != null; e = e.getNextException()) {
TLog.e("%s: %s%n", e.getSQLState(), e.getMessage());
}
}
return null;

}
private List<HorseData> readResultSet(ResultSet rs) {
List<HorseData> list = new ArrayList<HorseData>();
try {
while (rs.next()) {
HorseData hd = new HorseData();
hd.name = rs.getString("name");
hd.term = rs.getInt("term");
hd.place = rs.getInt("place");
hd.day = rs.getInt("day");
hd.rnum = rs.getInt("rnum");
hd.date = new Date(rs.getDate("date").getTime());
hd.frame = rs.getInt("frame");
hd.number = rs.getInt("number");
hd.order = rs.getInt("ordernumber");
hd.time = rs.getInt("time");
hd.popularity = rs.getInt("popularity");
hd.weight = rs.getInt("weight");
hd.loadweight = rs.getFloat("loadweight");
hd.threefurlong = rs.getFloat("threefurlong");
hd.odds = rs.getFloat("odds");
hd.setPassorder(rs.getString("passorder"));
list.add(hd);
}
} catch (SQLException se) {
for (SQLException e = se; e != null; e = e.getNextException()) {
TLog.e("%s: %s%n", e.getSQLState(), e.getMessage());
}
}
return list;
}

2014年8月8日金曜日

書評: ある奴隷少女に起こった出来事

奴隷だった著者による自伝。著者のハリエットは1813年生まれ。リンカーンが奴隷解放宣言をしたのが1862年なので、49歳の頃ということになる。アメリカの南部で奴隷があったことは知識として知っていても、具体的にどういうものなのか知らない人は多いだろう。僕もそうだった。

著者が、奴隷として使えていた家から抜け出し、自由を得るまでの話であるが、それまでの紆余曲折が書かれている。その時々に最善を考えて行動しているのだろうが、論理的にそう思えないところが数々あるため、小説として読んでしまうと少し辛いかもしれない。著者の実質的な所有者であるドクターフリントがストーカー気質で精神的な嫌がらせはしつくすのに、力尽くでということはしないという不思議な性格。また、著者が、祖母の家の屋根裏で7年間過ごすというのはすさまじい。実際にあったことということに驚くしかない。

奴隷の売買や相続による所有者の変更や、母が奴隷の場合は子供も奴隷になるという法律、自由州に逃げたとしても連れ戻される法律、いろいろな形で絡まり合い、読みどころの多い本である。

2014年8月6日水曜日

データベースを使う(3)

データベースを使う(1)で作ったテーブルに、馬のデータを差し込んで行く。普通にSQLのinsertを使えばいいだけ。executeUpdate()を使えば、Primary Keyが同じ場合はエラーでなく、上書きされる。これをYahoo競馬から取得したデータをすべてデータベースに登録し直し。これで、使いやすくなったはず。

public boolean insert(Horse horse, int term, int place, int day, int rnum, Date date) {
try {
final String sql = "insert into Horse values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
final PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, horse.name);
ps.setInt(2, term);
ps.setInt(3, place);
ps.setInt(4, day);
ps.setInt(5, rnum);
ps.setDate(6, new java.sql.Date(date.getTime()));
ps.setInt(7, horse.frame);
ps.setInt(8, horse.number);
ps.setInt(9, horse.order);
ps.setInt(10, horse.time);
ps.setInt(11, horse.popularity);
ps.setInt(12, horse.weight);
ps.setFloat(13, horse.loadweight);
ps.setFloat(14, horse.threefurlong);
ps.setFloat(15, horse.odds);
ps.setString(16, horse.getPassorder());
ps.executeUpdate();
} catch (SQLException se) {
for (SQLException e = se; e != null; e = e.getNextException()) {
TLog.e("%s: %s%n", e.getSQLState(), e.getMessage());
}
}
return true;

}

2014年8月4日月曜日

データベースを使う(2)

テーブルを作るかどうかを判定するには、データを取ってみたらいいようだ。
ResultSet rs = null;
try {
final Statement s = conn.createStatement();
rs = s.executeQuery("select count(1) from Horse");
} catch (SQLException se) {
final String state = se.getSQLState();
if (state.equals("42X05")) {
makeTable(conn);
} else {
for (SQLException e = se; e != null; e = e.getNextException()) {
TLog.e("%s: %s%n", e.getSQLState(), e.getMessage());
}
}
} finally {
if (rs != null) try {rs.close();} catch (Exception e) {};

}

makeTableの先は、データベースを使うで書いたcreate tableを呼び出している。

2014年8月3日日曜日

データベースを使う

すべてオンメモリで動かせば、データベースを使う必要はないだろう。と、思ったが、結構でかい。全部読み込んだらエラーが出る。ヒープ領域を大きくすればいいのかもしれないが、すべてをメモリに読み込むのは止めることにした。それにあたり、Json形式でファイルを保存することにしていたが、読み込み時にデータをしぼることを考えれば、やはりデータベースを使うほうがいいだろう。なお、PCではなく、Google Appを使うことを考えたら、BigTableに置き換えることを想定したほうがいいのだが、普通にSQLを使う。JavaではDerbyを使うのがいいようだ。で、ライブラリに、ダウンロードしたderby.jarを追加した。
String CREATEHORSETABLE
"create table Horse "
"(name varchar(20) NOT NULL, term smallint NOT NULL, "
"place smallint NOT NULL, day smallint NOT NULL, "
"rnum smallint NOT NULL, date date NOT NULL, frame smallint, "
"number smallint, ordernumber smallint, time smallint, "
"popularity smallint, weight smallint, loadweight real, "
"threefurlong real, odds real, passorder char(20), "
"PRIMARY KEY(name, date))";
Connection conn = DriverManager.getConnection("jdbc:derby:/Users/tkydevelop/Documents/workspace/HorseRaceAnalyzer/db;create=true");
Statement s = conn.createStatement();
s.execute(CREATEHORSETABLE);
のようにしてテーブルを作成した。

2014年8月2日土曜日

Jsonで書き込みと読み出し

Yahoo競馬から取得したデータをjson形式でファイルに保存することにした。jsonのライブラリとして、jacksonを使った。Annotations, Streaming API, DataBindのライブラリを追加した。
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.FIELD, Visibility.ANY)
.setVisibility(PropertyAccessor.CREATOR, Visibility.NONE)
.setVisibility(PropertyAccessor.SETTER, Visibility.NONE)
.setVisibility(PropertyAccessor.GETTER, Visibility.NONE)
.setVisibility(PropertyAccessor.IS_GETTER, Visibility.NONE);
om.writeValue(file, list);
writeValueを使うとオブジェクトの属性値がそのまま書き出される。加えて、たとえば、getXXXX的な名前の関数の値も書き出されてしまう。そのため、setVisibilityを使って、それらを書き出さないように変更した。
一方で読み込みをしようとしても、うまくオブジェクトに読み込むことができなかった。仕方ないので、
JsonNode rootNode;
rootNode = om.readTree(new File(filename));
for (JsonNode node: rootNode) {
Race race = new Race();
race.date = new Date(node.get("date").longValue());
のような形で、リストを繰り返しながら読み込んだ。