ゲームをやめます
ゲームをやめます。区切りの良いところまできたので、ゲームをやめようと思います。
今日、SUPER STREET FIGHTER IV ARCADE EDITION(以下、スパ4)の実績をすべて解除しました。過去に何度かこのブログにも書いている、このスパ4ですが、これで一応のクリアです。
最後に解除された実績は「真の格闘家」でした。解除の条件は「真の格闘家以外のすべての実績を解除すること」。すべてのキャラクターのランクをCランクにする実績「エラぐなった!」を解除し、「真の格闘家」の解除の条件を満たすことができました。
色々な実績がありました。ランクマッチで10連勝する実績や、難易度最高のコンピュータに勝つ実績などです。「エラぐなった!」は、時間こそかかりますが難易度としては低い実績でした。難易度の高さで言えば、先週の日曜日に解除した「頂点へ辿り着いた者」の「トライアルのすべての課題をクリアする」という条件の方が、ずっと難しいものでした。とにかく、たくさんの、58個の実績がありました。
スパ4は好きです。楽しいです。人により評価は違いますが、僕は好きです。
でも、ここをひとつの区切りにしてもいいかもしれないと思いました。具体的には、スパ4を、ゲームをやめてしまおうと思います。
やめようと思った理由は、最近よく「ゲームよりもすべきことがあるのではないか」と感じてしまうからです。ゲームをしているときは夢中で遊んでいますし、楽しいのですが、それを終えたときに「時間を失ってしまった」という気持ちになってしまうのです。
やりたいことを見つけてからやめるのが正しいのかもしれませんが、区切りの良いところまできたので、ここでひとつ、ゲームをやめてみたいと思います。
いままで対戦してくださった方々、ありがとうございました。また機会があれば、よろしくお願いします。
H2を.NETで使用する(ODBC編)
H2を.NETで使用する方法については過去に2度書いています。そこではH2Sharpを使用する方法について書きました。今回はそれらと異なる方法である「ODBCを使用する方法」について書きます。
はじめに書いておきますと、ODBC Driverの使用については、公式サイトに記述があります。当エントリはその内容とほぼ同様のものです。
きっかけ
H2Sharpを修正してDbProviderFactoryに対応させたり、ゼロから書き直してみたりと遊んでいたのですが、ふと思ったのです。「遠回りすぎる」と。
H2Sharpが行っているのは、H2のJARファイルをIKVMを使用してDLLファイルに変換することで.NETからJDBCを使用できるようにしておき、JDBC APIをADO.NET APIで使用できるようにラップすることです。遠回りな感じがしませんか。使用時にIKVMのDLLファイルが必要になるのも面倒です。
そこで、まったく別の方法をとることにしました。
ODBCを使用する方法
H2はODBCに対応しているようです。昔はODBC Driverに独自の実装により対応していたそうなのですが、現在はそれをやめ、PostgreSQL ODBC Driverと互換性を持たせることで動作させているようです。
ODBCでの接続では、速度や機能には制限がかかるでしょうが、Data Providerが標準提供されているのでアプリケーション側に追加のDLLは不要です。
ODBCおよびPostgreSQL ODBC Driverに依存してしまうため、機能的な制限がかかるほか、PostgreSQL ODBC Driverのバージョンアップにより動作しなくなる可能性があるため、「製品アプリケーションでは使用すべきでありません」と公式サイトに書かれています。今回は、僕の趣味なので、関係ありませんね。
目標の構成は次の通りです。「H2 ⇔ ODBC(PostgreSQL ODBC Driver) ⇔ ODBC .NET Data Provider」
PostgreSQL ODBC Driverのインストール
Windows版PostgreSQL ODBC Driverはhttp://www.postgresql.org/ftp/odbc/versions/msi/で配布されています。H2ではバージョン8.2以降に対応しているようです。64bitOSであっても32bitアプリケーションから使用する場合は32bit版を使用してください。
H2の起動
H2がPostgreSQL ODBC Driverに対応するためには、起動方法を変更する必要があります。
通常、起動時に使用する「h2.bat」の中では「org.h2.tools.Console」が使用されていますが、これを「org.h2.tools.Server」に変更しておきます。
ODBCの設定
次にODBCの設定を行います。
Windows7の場合は「管理ツール」 > 「データソース(ODBC)」から「ODBC データソース アドミニストレーター」を立ち上げます。
もし、32bitアプリケーションから使用する場合は「c:\windows\SysWOW64\odbcad32.exe」から「ODBC データソース アドミニストレーター」を立ち上げることで、32bit用のODBC Driverの設定ができます。
プロパティ | 意味 |
---|---|
データソース名 | 任意の名前 |
サーバー名 | localhost |
データベース名 | H2の接続先データベース名 |
ユーザー名 | H2の接続先データベースのユーザー名 |
パスワード | H2の接続先データベースのパスワード |
SSL | 無効(H2は対応していないそうです) |
ポート番号 | 5435(H2はこの番号で待ち受けしています) |
「サーバ側Prepare」をONにしておくと高速化を期待できます。
設定の際はH2 DB Engine インストール・設定 技術メモを参考にすると良いです。画像ありで説明されています。
ODBC .NET Data Providerから接続する
普段.NETからODBCを使用する際と同じ手順です。接続文字列については、http://msdn.microsoft.com/library/system.data.odbc.odbcconnection.connectionstringを参照するといいです。
DbProviderFactoryにも当然対応しています。
var factory = DbProviderFactories.GetFactory("System.Data.Odbc"); using (var connection = factory.CreateConnection()) { var dataSourceName = "H2Test"; var username = "sa"; var password = "password"; var csb = new StringBuilder(); csb.Append("DSN=").Append(dataSourceName).Append(";"); csb.Append("UID=").Append(username).Append(";"); csb.Append("PWD=").Append(password).Append(";"); connection.ConnectionString = csb.ToString(); connection.Open(); using (var command = connection.CreateCommand()) { command.CommandText = "CREATE TABLE tbl( id INT PRIMARY KEY, name CHAR(10) )"; command.ExecuteNonQuery(); } }
ね、簡単でしょ?
リンク
- H2公式(http://www.h2database.com/)
- H2Sharp公式(http://code.google.com/p/h2sharp/)
- 過去記事1『H2を.NETで使用する』 - bouzuya@hateda(http://d.hatena.ne.jp/bouzuya/20100919/1284877546)
- 過去記事2『H2SharpはDbProviderFactoryに対応していない』 - bouzuya@hateda(http://d.hatena.ne.jp/bouzuya/20100922/1285158019)
- 設定参考H2 DB Engine インストール・設定 技術メモ(http://homepage2.nifty.com/yoks/TechNote/H2/H2_ope4.htm)
- H2 Database Engine、独自のODBCドライバ開発を終了 - DB開発に注力 | エンタープライズ | マイコミジャーナル
『Scheme手習い』読書会まとめ
『Scheme手習い』読書会のまとめです。各エントリおよびその他のリンクをまとめたものです。
各回リンク
『Scheme手習い』読書会 第15回
『Scheme手習い』読書会の15回目です。範囲としては10章すべて(P176〜P193)です。
15回目と書きましたが、実は15回目と16回目を兼ねています。15回目では10章の大部分を読んだのですが、もう一度10章頭から見直したくなり、もう一度読み返すことにしたのです。最初に読んだときは書いてあることの意図がつかめず、わけが分からないままに進んでしまい、10章の終盤になって10章の意図・目的に気付いたのです。
10章の目的は関数valueの定義です。10章のすべてがこれに割かれています。valueは6章で登場した関数で、本文中では「式の自然な値を返す関数」と書かれています。6章の時点では数字を計算する程度の機能でした。10章ではこれを機能拡張し、関数を評価できるようにします。そのためのentry/table構造の作成があり、値ごとのタイプ(アクション)決定があるのです。
- 10章 このすべての値は何だ
- エントリ(entry):リストのペア。第一要素は集合(set)であり、第二要素は第一要素と同じ長さのリスト。.NETのDictionary、JavaのMapのようなデータ構造。
- 関数new-entryの定義:2つの引数を取り、エントリを作成する関数。第一引数がsetかどうかの検証なども行わない。ペアを作成する関数buildの別名として定義。
- 関数lookup-in-entryの定義:第一引数に検索する要素、第二引数に検索対象のエントリ、第三引数に見つからなかったときに呼び出される関数を渡す。
- テーブル(table):エントリのリスト。環境とも言うらしい。
- 関数lookup-in-tableの定義:テーブル版lookup-in-entry。lookup-in-entryを使用して定義。見つからなかったときに、次のエントリを対象に検索するようlookup-in-entryに関数を渡すところがポイント。
- 関数valueの再定義:処理結果を確認。
- タイプ(アクション):数や真偽値やcons,carなどは*const、quoteは*quote、変数は*identifier、lambdaは*lambda、condは*cond、その他の式は*application。
- 空リストが定義されていないのが、私には非常に気になったため、10章終了後に空リストを*constに割り当て、うまく動作するように修正した。
- 補助関数expression-to-actionの定義:式を受け取り、適切なアクションを返す。atomかどうかによって、atom-to-action,list-to-actionに処理を振り分ける。
- 補助関数atom-to-actionの定義:適切なアクション(atomの場合)を返す。
- 補助関数list-to-actionの定義:適切なアクション(listの場合)を返す。
- 関数valueの定義:補助関数meaningに式eと空テーブルtableを渡す。
- 補助関数meaningの定義:expression-to-actionでeの適切なアクションを返し、それに対して式eとテーブルtableを渡す。
- 関数(アクション)*constの定義:数、真偽値はそのまま返し、それ以外は(primitive 式e)を返す。
- 関数(アクション)*quoteの定義:式eの第二要素を返す。(quote a)ならaを返すということ。
- 関数(アクション)*identifierの定義:tableから式eに対応する要素を探して、返す。
- 関数(アクション)*lambdaの定義:(non-primitive テーブル 仮引数 関数本体)の形式で返す。
- 関数(アクション)*condの定義:補助関数evconに式eの2番目以降の要素とテーブルとを渡す。
- 補助関数evcondの定義:各行ごとにelseかどうかや条件を満たしているかを確認し、必要に応じて関数meaningを呼び出す。
- P187の*condの例が誤っているため、読者は混乱する。詳細は正誤表参照。
- 関数(アクション)*applicationの定義:補助関数evlisおよびapplyを使用し、任意の式を再帰的に展開していく。
- 補助関数evlisの定義:リストを評価し、展開していく。必要に応じて関数meaningを呼び出して、結果をconsしていくだけ。
- 補助関数applyの定義:補助関数primitive?および補助関数non-primitive?、補助関数apply-primitive、補助関数apply-closureを使用して、関数を適用する。
- 補助関数primitive/補助関数non-primitiveの定義:式が(primitive x)の形か(non-primitive x)の形かを見て#t/#fを返す。
- 補助関数apply-primitiveの定義:基本となる関数consやcarなどを実際に動作する関数(Schemeが元々持っているもの)を適用し結果を返す。
- 補助関数apply-closureの定義:テーブルを拡張し、仮引数に対応する値を持つエントリを追加し、meaningを使用して、関数を適用する。
- else はい。もう宴会の時間です。
さて、これで『Scheme手習い』の最終章が終わりました。誤字など困る部分もありましたが、Yコンビネータの定義や関数valueの定義など楽しめた部分もあり、括弧への抵抗も減り、Meadowもずいぶん使えるようになりました。良い企画だったと思います。
次は『Scheme修行』でしょうか。まだ分かりません。
最後にまとめエントリを作って、『Scheme手習い』読書会を終了したいと思います。
『Scheme手習い』読書会 第14回
『Scheme手習い』読書会の14回目です。範囲としては9章途中(P153)〜9章末(P175)です。実際には友人に合わせることと復習を兼ねて9章頭から読んでいます。
defineなしに再帰的定義を作成する過程はすごいです。Yコンビネーターという関数を作成します。
- 9章 ……もう一度、もう一度、もう一度、……(続き)
- 全関数は答えを返してくれる関数、部分関数は答えを返してくれない場合がある関数。
- 関数alignが全関数かの確認。関数length*,関数weight*を用いて実施。
- これは本当にこれで全関数かどうか確認できたのか、僕には理解できない。
- 関数shuffleが全関数かの確認。反例として、ゴールに向けて進展しない引数の例を見つけることで部分関数であることを確認。
- 関数Cが全関数かどうかの確認。確認が難しい(数学的に証明されていない)例。
- 「ローター・コラッツ」による、「コラッツの問題」や「コラッツの予想」と呼ばれるものらしい。詳細はWikipedia参照。
- ローター・コラッツ - Wikipedia(ja)
- Lothar Collatz - Wikipedia(en)
- コラッツの問題 - Wikipedia(ja)
- Collatz conjecture - Wikipedia(en)
- 関数Aは全関数だが、計算量が大きく、現実的な時間で答えを返してくれないという例。
- 「ヴィルヘルム・アッカーマン」による、「アッカーマン関数」と呼ばれるものらしい。詳細はWikipedia参照。
- ヴィルヘルム・アッカーマン - Wikipedia(ja)
- Wilhelm Ackermann - Wikipedia(en)
- アッカーマン関数 - Wikipedia(ja)
- Ackermann function - Wikipeida(en)
- 関数will-stop?の定義が可能かの確認。停止性を確認する関数の定義である。停止性を確認する関数は正確に動作するものを作れないことが証明されている。
- 「アラン・チューリング」による「停止性問題」、または「クルト・ゲーデル」による「不完全性定理」に関連するものらしい。詳細はWikipedia参照。
- アラン・チューリング - Wikipedia(ja)
- Alan Turing - Wikipedia(en)
- 停止性問題 - Wikipedia(ja)
- Halting problem - Wikipedia(en)
- クルト・ゲーデル - Wikipedia(ja)
- Kurt Gödel - Wikipedia(en)
- ゲーデルの不完全性定理 - Wikipedia(ja)
- Gödel's incompleteness theorems - Wikipedia(en)
- defineとは何か。再帰的定義とは何か。(以下9章終わりまで続く内容)
- 今までdefineで名前を付け、それにより再帰呼び出しを行い、繰り返しを行ってきたことを確認。
- 関数lengthをdefineなしで書く。
- (1)長さ0のリストのみ答えを返す関数length0を定義(再帰呼び出し部分には答えを返さない関数を設定)
- (2)長さ1以下のリストに答えを返す関数length<=1を定義(再帰呼び出し部分にlength0を設定)
- (3)同様に長さn以下のリストに答えを返す関数を書こうとすると、関数定義が延々と続くことを確認
- 再帰のためには場合によっては無限の関数定義を書かないといけない、ができない。よって繰り返しされている部分の抽出を実施していく
- (4)再帰呼び出し部分の関数を引数に取る形に書き換える。
- (5)「関数を引数に取り、次に呼び出す関数を返す関数」に対して、length0の動きをするように関数を渡す形に書き換える。
- (6)length部分がdefine使用時に近い形になるように書き換え。
- (7)length部分を外に抜き出し、汎用的なものにする。
- この汎用的な部分をYコンビネーターと呼ぶらしい。本文中にはないが、不動点コンビネーターというものの一種らしい。
- Yコンビネーターは関数を引数にとり、その関数を呼び出す。呼び出し時の引数として、その関数が次に呼び出す関数(Yコンビネーターが引数に取った関数と同様のもの)を設定する。
- 不動点コンビネータ - Wikipedia(ja)
- Fixed point combinator - Wikipedia(en)
『Scheme手習い』読書会 第13回
『Scheme手習い』読書会の13回目です。範囲としては9章頭(P150)〜9章途中(P153)です。
友人とのペースを合わせるため、あまり進んでいません。前回の収集子の箇所を復習していました。
- 9章 ……もう一度、もう一度、もう一度、……
母とカラオケに行きました
母とカラオケに行きました。
ざっと20年ぶりでしょうか。20年という数字も正しいかどうか分かりません。小学校に入るよりも前に一度だけカラオケに行ったことがあるような気がする、といった程度の記憶を元にした数字です。ほとんど初めてに近い形であることには違いありません。
母は機嫌が良ければ鼻歌を口ずさむので、母の歌を聞いたことがないわけではありません。ただ、わざわざカラオケに一緒に行って聞きたいかと言われると、そんなこともまずありません。今回、カラオケに行った理由は、母の歌が聞きたいからではありません。母がカラオケに行きたいと言ったからです。
母はずいぶんと前から「歌に自信がない」とか「カラオケではきっと歌えない」などと言っており、また、「他人と行くと恥ずかしくて歌えないから嫌だが、カラオケには行きたい」とも言っていました。そこで「一人でカラオケに行く人も多いから、気にせず行くといいよ」と教えてあげたのですが、なかなか行きそうになかったのです。そこで、きっかけを作るために僕が一緒に行くことにしました。
そうです、今回は母親のカラオケデビューを後押しするための企画なのです。
そもそも、20代男性の多くは母親とカラオケには行かないんだろうなと思います。友達とか女性とかと一緒に行くことが多いと思います。僕もそうです。きっと気恥ずかしいでしょう。僕もそうです。母親とカラオケに歩いていき、カウンターの人と「二名ですか?」「二人です」なんて会話をしたい人はそうそう居ないと思います。
僕は感覚がズレているところがあるのかもしれません。母親と何かをしても、比較的恥ずかしくありません。普段から何をしても恥ずかしい気持ちだからです。町を歩いていても、服装を、表情を、すれ違う人にあざ笑われているような気持ちになり、恥ずかしくなります。実際おかしいかもしれませんし、わざわざそう思うほどもおかしくないのかもしれませんが、僕は恥ずかしい気持ちです。でも、だからこそ母とカラオケに行っても比較的恥ずかしくありません。
僕と母はカラオケに行き、1時間半ほど歌い、家に帰りました。母の選ぶ古い曲や、僕の選ぶ懐かしい曲を、楽しく歌いました。途中からは妹もやってきて、一緒になって歌いました。母親とは20とすこし離れているので曲選びは難しかったのですが、楽しめました。
母は帰り道もご機嫌で鼻歌を口ずさんでいました。どうやら企画は成功のようです。