ゲームをやめます

ゲームをやめます。区切りの良いところまできたので、ゲームをやめようと思います。

今日、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 APIADO.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のインストール

WindowsPostgreSQL 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();
    }
}

ね、簡単でしょ?

『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コンビネーターという関数を作成します。

追記:『Scheme手習い』読書会 第15回

『Scheme手習い』読書会 第13回

Scheme手習い』読書会の13回目です。範囲としては9章頭(P150)〜9章途中(P153)です。

友人とのペースを合わせるため、あまり進んでいません。前回の収集子の箇所を復習していました。

  • 9章 ……もう一度、もう一度、もう一度、……
    • 関数lookingの定義:関数keep-lookingを補助関数として定義。keep-looking中では、指定位置の要素が検索している要素と同じかを確認し、必要なら次の要素をkeep-lookingに渡す。
    • 「不自然な」再帰、訳がおかしいのか、よく意味が分からない。「latの一部分に対して再帰しているのではないところです。」が不自然らしい。
    • lookingのような関数を部分関数と呼ぶ、これまでのような関数を全関数と呼ぶ。どういう特徴を指して言っているのか不明瞭。
    • ゴールに到達しない関数(無限ループになる)の定義。これは最も部分的な関数らしい。

追記:『Scheme手習い』読書会 第14回

母とカラオケに行きました

母とカラオケに行きました。

ざっと20年ぶりでしょうか。20年という数字も正しいかどうか分かりません。小学校に入るよりも前に一度だけカラオケに行ったことがあるような気がする、といった程度の記憶を元にした数字です。ほとんど初めてに近い形であることには違いありません。

母は機嫌が良ければ鼻歌を口ずさむので、母の歌を聞いたことがないわけではありません。ただ、わざわざカラオケに一緒に行って聞きたいかと言われると、そんなこともまずありません。今回、カラオケに行った理由は、母の歌が聞きたいからではありません。母がカラオケに行きたいと言ったからです。

母はずいぶんと前から「歌に自信がない」とか「カラオケではきっと歌えない」などと言っており、また、「他人と行くと恥ずかしくて歌えないから嫌だが、カラオケには行きたい」とも言っていました。そこで「一人でカラオケに行く人も多いから、気にせず行くといいよ」と教えてあげたのですが、なかなか行きそうになかったのです。そこで、きっかけを作るために僕が一緒に行くことにしました。

そうです、今回は母親のカラオケデビューを後押しするための企画なのです。

そもそも、20代男性の多くは母親とカラオケには行かないんだろうなと思います。友達とか女性とかと一緒に行くことが多いと思います。僕もそうです。きっと気恥ずかしいでしょう。僕もそうです。母親とカラオケに歩いていき、カウンターの人と「二名ですか?」「二人です」なんて会話をしたい人はそうそう居ないと思います。

僕は感覚がズレているところがあるのかもしれません。母親と何かをしても、比較的恥ずかしくありません。普段から何をしても恥ずかしい気持ちだからです。町を歩いていても、服装を、表情を、すれ違う人にあざ笑われているような気持ちになり、恥ずかしくなります。実際おかしいかもしれませんし、わざわざそう思うほどもおかしくないのかもしれませんが、僕は恥ずかしい気持ちです。でも、だからこそ母とカラオケに行っても比較的恥ずかしくありません。

僕と母はカラオケに行き、1時間半ほど歌い、家に帰りました。母の選ぶ古い曲や、僕の選ぶ懐かしい曲を、楽しく歌いました。途中からは妹もやってきて、一緒になって歌いました。母親とは20とすこし離れているので曲選びは難しかったのですが、楽しめました。

母は帰り道もご機嫌で鼻歌を口ずさんでいました。どうやら企画は成功のようです。