Rails で作る AI vs AI Reversi - API仕様書0.1版

AI vs AI Reversi, Rails 1 Comment »

Rails で作る AI vs AI Reversi - ストーリー の続きです。勉強会のメンバーからの案を踏まえ、API仕様書0.1版を作りました。ひとまず公開します。

AI vs AI Reversi API仕様書0.1版

コメント等々いただければと思います。

モデルを再設計しなければぁ。

Rails で作る AI vs AI Reversi - ストーリー

AI vs AI Reversi, Rails No Comments »

昨日(Rails で作る AI vs AI Reversi - モデル設計)の続きです。今日はストーリー(ユースケース)について。

クライアントにあたる Reversi AI は、 おそらくバッチ的なプログラムになるでしょう。その場合、実際のリバーシのアルゴリズム以外に、どうやって対戦相手を見つけるか・前述の Game をどうやって生成するか、などが問題になります。プレイヤーにはアルゴリズムのプログラミングに集中してもらいたいため、「ゲームの生成・対戦相手を見つける・対戦結果を見る」などは、Webサイト上で提供しようと考えています。

それを踏まえた上で考えたストーリーです。

基本ストーリー

前準備

  1. 公開された API および仕様に沿った Reversi AI を作る。

Web サイトにて

  1. サインアップする。 => 認証キーをメモ
  2. 対戦相手を探して対戦を申し込む。もしくは、Game を生成して対戦相手を待つ。
  3. プレイヤーが揃う。 => Game の id をメモ

自分の PC にて

  1. 自分の認証キーと Game の id を設定する。(設定ファイルとか引数とか、お好みで)
  2. Reversi AI を実行する。 GET で盤の情報 etc を取得して、POST で石を打つ。
  3. (実装していれば)対戦結果を見る。

Web サイトにて

  1. 対戦結果を見る。

いかがでしょうか。最後に見たのは数年前だけど、「対戦相手を待つ」あたりは、ハンゲっぽいのをイメージしてます。

もし 8/9 間に合いそうになければのストーリー

自分の PC にて

  1. クライアントは、「相手は誰でもいいから紹介してー」という GET リクエストをゲームサーバに送り続ける。(ポーリング )
  2. サーバは、プレイヤーが組み合ったら、サーバ側で自動的に Game を生成して id を返す。
  3. クライアントは、受け取った Game の id をキーにして、対戦開始。

どうしよっかなぁ。(結構楽しんでる :-)

Rails で作る AI vs AI Reversi - モデル設計

AI vs AI Reversi, Rails No Comments »

昨日(Rails で作る AI vs AI Reversi - 経緯とコンセプト)の続きです。今日はモデル設計について。

いろいろ悩んだんですが今日時点では、こんな感じで考えてます。こんな感じと言っても、わけわかんないかもしれないので簡単に説明します。

2008/7/22  更新: 詳細に書いても変更になった時に困るのでポイントだけ書きます。

Board モデルが盤上の石の座標を二次元配列で持っています。

Log モデルが1手目から status(パスか黒が打ったか白が打ったか)と、打たれた座標、ひっくり返った石の座標の配列を持っています。

Log モデルは、Webサイト上でFlash などで視覚的に対戦状況を見ることができる、Reversiビューアのために作ったモデルです。

Logモデルを現在の手数+1をポーリングで監視して、更新があれば描画する、みたいな AS を書けばビューアは簡単に作れるんじゃないかなぁと思ってます。

以上。

Rails で作る AI vs AI Reversi - 経緯とコンセプト

AI vs AI Reversi, Rails No Comments »

OSC2008Nagoya に、我らが勉強会 CSNagoya が参加するのは決まってたんだけど、出し物として「Haskell で作る Twitter」って考えてたんですが、どうも「ふーん」で終わってしまいそうなので、「雑談で話していた AI Reversi をやりたいっす><」と自己主張したところ、「いいんじゃない、頑張って!」ということで、草案(発案者の方のアイデアをそのまま)投下。なんだか「gabu ちゃん一人で頑張ってw」的な空気が漂ってるんですが、いじめですかねw

AI vs AI Reversi とは

  • 自分の好きなプログラミング言語で Reversi AI を作る。
  • ゲームサーバで戦わせる。
  • 最強の Reversi AI プログラマは誰だ!?

というようなコンセプトです。

クライアントとゲームサーバは http 通信を基本として、できるだけ RESTful な API を公開することを考えています。(Restful な API って日本語あやしいな・・・)

つまり! http 通信できるなら、どんなプログラミング言語でも参加 OK!

その点が、OSC のオープンソースに引っかかるという名目で進みます。いいですよね?勉強会の皆様。

モデルとか必要そうなアクションとか考えてたんですが、眠いので、また明日。おやすみなさいませ。。。

PS. 「たまには普通の話とか子供の話とか書いてくださいよー」と言われてたのに、こんな話でごめんなさい><
いつか必ず書きます><

Rails ActiveRecord でランダムにレコードを取得する方法

Rails No Comments »

まぁ受け売りなんですが、備忘録としてメモ。

モデル名 : Item として読んでくだしあ。

ランダムに 1 レコードを取得したい場合

発行する SQL は2回だけど DB 依存しないパターン(offset 使ってるから割と早そう)

offset = rand(Item.count :all)
Item.find :first, :offset => offset

発行する SQL は1回だけど DB 依存するパターン(MySQLの場合)

Item.find(:first, :order => 'RAND()')

ランダムに N レコードを取得したい場合(MySQLの場合)

Item.find(:all, :order => 'RAND()', :limit => 10)

ちなみに、’RAND()’ は DB に依存するコマンドなので要注意!他のDBの場合は、

  • Postgresql / SQLite : RANDOM()
  • Microsoft SQL Server : NEWID()
  • Oracle : dbms_random.value

参照 : SQL to Select a random row from a database table

※ SQLite と MySQL しか試してないです。ごめんなさい><

Rails ActiveRecord は、結局 :order で渡された文字列を SQL を生成するときに、 ORDER の後に繋げてるだけなので、書いたままの SQL が出来ると思えば好きなように書けるんですねぇ。

あと、当たり前だけどレコード数が多いと、きっと困ることになると思います。そもそもレコード数が多いテーブルからランダムに N レコード取得したいっていう要望が、そもそも間違ってる気もしますが。

詳細はこちら(英語)へ。性能の話や、DB に依存するのではなくて Ruby プログラムでランダムにする方法なんかも載ってます。それでは。

Ubuntu + NetBeans で日本語入力の不具合

NetBeans, Rails, Ubuntu 1 Comment »

最近はもっぱら Ubuntu Gutsy + NetBeans な環境で Rails 触ってるんですが、SVN へコミットするときのコミットメッセージに日本語を入力しようとするとキータッチするたびに確定されてしまうという悲惨な不具合にあいました。

何を思ったかそれまでは、NetBeansのSVN機能を信用していなかったのか、コマンドラインで「svn status」とか「svn ci」とか、やってたのさw

悲惨な不具合とは、こんな感じ。

「かってにかくていされる」→「勝手に確定される」と打とうとしてモガイテイル様子
commit-message.png

いろいろ調べた所、「SCIM」が悪いのではと。
http://www.netbeans.org/servlets/ReadMsg?list=nbdiscuss_ja&msgNo=576

さらに調査したところ、「1.4.7-3ubuntu6」というバージョンで、解決されたらしい。
https://bugs.launchpad.net/ubuntu/+source/scim/+bug/178742/comments/11

自分の「SCIM」のバージョンを確認してみる。

dpkg -p scim | grep Version
Version: 1.4.7-1ubuntu2

なるほど、ちと古いとな。

じゃあ久しぶりにアップデートしてみるかと、アップデートしてみたけど「SCIM」のバージョンは変わらず。よくよく調べると、次のバージョンの Ubuntu 8.04 Hardy で提供されるバージョンらしい。

そこから Gutsy に Hardy のパッケージをなんとか捻じ込めないかと調べたけど、依存するパッケージとか簡単に入れる方法が見つからず面倒くさくなってきたw

もう面倒くさいし Gutsy から Hardy にあげちゃうか。4月に出てしばらくたってるし、LTS(長期サポートという意味)だし、ということで「システム」→「システム管理」→「アップデート・マネージャ」から、前からちらちら見えていた、Gutsy へのアップデートボタンをぽちっとな♪

数十分のアップデートと再起動ののち、直りましたよ!コミットコメントで日本語使えるようになったよ!ビバ日本語!

結論 : Ubuntu で NetBeans 使うなら、とっとと Hardy にしよう!

PS. 絶対出る不具合の対策として、以下を紹介しておきます。
fmemo - Ubuntu を 7.10 から 8.04 にアップデートすると SCIM を [半角/全角] で ON/OFF できなくなった

Hardy にアップデートしたがための他の設定とかは、いろいろググってください><ごめんなさい><

最近、Rails 以外の Webフレームワークをいろいろ見て思ったこと。

Rails, Think 2 Comments »

結論:Rails しか見てないのは良くない。

自分がよくやるRailsアプリの作り方は、(仕事でバリバリやってないので、作り方、結構適当です。けど、こういう流れで作ってる人も多いのでは?)

  1. だいたいのコンセプトを決める。
  2. UI設計(ホワイトボード、紙、最悪の場合:脳内)
  3. DB設計(って、言っても必要そうなエンティティ(Railsで言うとModel)とリレーションを考える。)
  4. DB設計に従って、さくっとScaffold。きゃは。
  5. 不要なアクションを削る。必要なAction と View を作る。(もちろんControllerもね)
  6. UI設計に従って、装飾。(Viewをいじりながら、CSSいじる。)
  7. 機能追加。Scaffoldだけではさすがに終われない機能は、もちろん作りこみます。
  8. 作り込むまでもなく、plugin があれば勿論ありがたく入れる。DRY!

5. ~ 7. と、デバッグはぐるぐるループしますが、だいたいこんな感じで作ります。

と、説明したところで、最近「UI」についてイロイロ考えてたのでまとめてみます。たまたまみつけた「はぶさんのRailsやChuraのいけてないところ(2006年のエントリー)」がきっかけになりました。

1.UIを設計する
2.UI設計の成果物を元に、DB設計をする
3.DB設計の成果物を元に、UI実装を自動生成する

RailsやChuraってのは、3.のところをやってくれるんだけどさ、手順全体を見たらださいじゃん。「1.の成果物(が想定しているUI実装) イコール 3.の成果物」に本当に出来るの? ちゃうでしょ。凝ったUIだったら駄目じゃん。CSSで頑張る? それで済む程度のシステムだったらいいんだけどね。
~~~
1.の成果物をストレートにUI実装に使えるほうがいいじゃん。

例えば、「1.UIを設計する」 のところで、HTMLモックを作ったとしてそれが実装として使えないんですよね。Rails Viewにコピペ(だけじゃなくてタグ化とかも)だし、ループ制御やIF制御なんか追加すると、結局みんなが昔忌み嫌ったJSPとほとんど変わらないVIEWが出来ると思う。ここ進化してない。

ちなみに、Rails界隈でみんな大好き 37signals の開発手法(物語が多いけど) Getting Real によると

紙スケッチ
-
スケッチは素早く、殴り書きで、お手軽でできるもの;それ以上は必要ありません。書きましょう。走り書きでいいんです。四角や丸や直線なんかのシンプルなものでいいんです。アイディアを頭から紙に写します。目的は、頭の中のコンセプトをラフなインターフェースのデザインに変えるところです。ここはまだ実験段階です。正しい・間違いといったことはないのです。
-
HTMLを作る
-
先ほどのスケッチの特徴(または、セクションやフロー)を元にHTMLを記述してみます。実際に形にすることで、皆がスクリーン上で見ることができるのです。
「Basecamp」では、我々はまず、「メッセージを書く」スクリーンを作り、次に「メッセージを編集する」スクリーン…徐々に開発を進めていきました。
まだプログラミング・コードに手を出してはいけません。あくまでHTMLとCSSの、現実に近い模型を作るのです。完成品にするのは後の段階です。
-
コードにする
-
実験的に作ったものがうまくいって、必要な機能を満たしたのなら、実際にプログラミング・コードを記述していきます。

と、あるんだけど「あくまでHTMLとCSSの、現実に近い模型を作るのです。」は最終的にVIEWにせっせこ書き直してるのかな。 じゃあ最初からHTMLモック(模型)をERB形式でってのは「デザイナと分業!」ってのが難しくなるという、なんともはや。個人的にデザイナと!って形式で仕事したことないので実際どうかは分かりませんが。

それで、いっきに話は飛ぶんですが見つけましたよ!プレーンなHTMLを(ほぼ)そのままVIEW層で使えるWebフレームワーク 。Java界隈の人は気付いてると思いますが。

Wicket (日本語サイト: Wicket-ja )です。もう一気に惚れました。ありがとうJava。ただいまJava。かくいう私も、就職してから4年間はJava(主にStruts)を業務でやってたのでJavaは好きなんですよ。なにが惚れたって、このくだり。

Wicketの最大の目標は、ウェブ・アプリケーション開発にオブジェクト指向を取り戻すことです。

ちなみにこのページに書いてあること全部かっこいい><

さらに脱線するんですが、UIだけさらに特化した話をすると尊敬するS氏から教えてもらったGWT-Extとかね、もうね、どうしろと>< ああ、そういえば、知る人は知っているからいまさら言いふらさなくていいって言われてたんだけど書いちゃった。

なんというか、最近、Railsから離れた目で巡回してたらJavaの底力を見たというか。

大分古いけどエンタープライズで(お仕事で) Rails使って炎上って話
Rails炎上|傲慢SE日記 ~30歳からの挑戦~
Railsについて思うこと
を読んでると、またJavaに戻ってきたりして。炎上ってのは言語やフレームワークとは全然違うレイヤー(生産性が10倍!なんて幻想に惑わされた営業や上層部や管理者etc)が問題なんだろうけどぉ。

Rails とか Java とか言ってる自分は C# な仕事してるんですけどねw

結局、1エンジニアが生涯で携わるプロジェクトの数ってそう多くないだろう(何十個や何百個ではないの意)から、業界の流れが自分にどれだけ影響するんだろうって気もするけど。流れっつってもBlog読み読みしてるだけなんだけどね :-) なんにしても言いたかったのは流行りに流されないように自分の目を持っていたいね。(って自分に言ってる)

===

気になるフレームワーク(というより連携?w)自分用まとめ

  • Wicket + Guice + ActiveObjects (Guiceはあえて使わなくても良いかも)
  • GWT-Ext on GAE (GWTで吐かれたJS/HTMLをアップすればGAEでも動くらしい元ネタ本当かな?Extについては言及されてないっぽい)

問題は何作るかだな。。。

WP Theme & Icons by N.Design Studio
Entries RSS Comments RSS ログイン