お引越しのお知らせ

未分類 No Comments »

と言ってもブログの引っ越しです。いっかいWordpressを触ってみたかったので自鯖に立てて、しばらく運用してみたのですが満足したので、はてなに移ります。

http://d.hatena.ne.jp/gabuchan/

id:gabuchan が取れたのが、すごく嬉しいので、はてな大好きになりました。

「第3回 コンパイラを作ろう」に行ってきた。lexerの実装晒します。

csnagoya, gauche, scheme 1 Comment »

「コンパイラを作ろう」第3回にして初エントリーを書くとか、相当ブログばなれが進んでいるなぁと反省。

どうでもいいけど、Wordpressのビジュアルモードが激しくウザいので、はてダに乗り換えたいと考え中。

ってことで、知らない人のためにも書くと先月から、CSNAGOYAの「コンパイラを作ろう」という勉強会に参加しています。冨沢高明さんの「コンパイラ入門」という最高の参考書をもとに全員が好きな言語でコンパイラを作るという勉強会です。参考書がPascalのコンパイラを作るため僕らもPascalの構文を解析することになりました。

好きな言語でコンパイラを作る。ということで、かなり悩んだあげくSICPを読むためにSchemeを覚えたいなぁと思い、GaucheでPascalのコンパイラを作ることに。この組み合わせが何とも言えません。

ちなみに、どこまで勉強会が進んでいるかというと

  • 前回は、字句解析の実装。
  • 今回は、構文解析の前置き。(実装なし)
  • 次回は、パーサの実装(の予定?)

さて、前置きが長くなりましたが今日までの宿題になっていた、字句解析部分の実装を晒すことになっているんですが、Gauche を合計1週間も勉強していない人間が作ったソースコードだと思って読んでください。(言い訳)

main も、用意していないので lexer 関数に string を渡すと、それをTokenに分解して print する所までしか出来ていません。(print は本質的には必要ないんですがデバッグ用です。)


(use srfi-1)

(define-class  ()
  ((def  :init-keyword :def  :init-value “”)
   (str  :init-keyword :str  :init-value “”)
   (type :init-keyword :type :init-value “”)))

(define (make-token def str type)
  (make  :def def :str str :type type))

(define reserved
  (hash-table ’string=?
	      ‘(”MODULE” . 0)
	      ‘(”BEGIN” .0)
	      ‘(”END” .0)
	      ‘(”VAR” .0)
	      ‘(”INTEGER” .0)
	      ‘(”STRING” .0)
	      ‘(”IF” .0)
	      ‘(”THEN” .0)
	      ‘(”ELSE” .0)
	      ‘(”WHILE” .0)
	      ‘(”DO” .0)))

(define symbols
  (hash-table ’string=?
	      ‘(”+” . “PLUS”)
	      ‘(”-” . “MINUS”)
	      ‘(”*” . “MULT”)
	      ‘(”/” . “DIV”)
	      ‘(”=” . “EQ”)
	      ‘(”< " . "LT")
	      '("<=" . "LE")
	      '(">” . “GT”)
	      ‘(”>=” . “GE”)
	      ‘(”<>” . “NE”)
	      ‘(”:=” . “ASSIGN”)
	      ‘(”;” . “COLON”)
	      ‘(”:” . “SEMICOLON”)
	      ‘(”,” . “COMMA”)
	      ‘(”(” . “OPEN”)
	      ‘(”)” . “CLOSE”)
	      ‘(”.” . “PIRIOD”)))

(define (add lis e)
  (append lis (list e)))

(define (print-token-list lis)
  (map (lambda (e) (print #`”DEF[,(ref e ‘def)]ttSTR[,(ref e ’str)]”)) lis))

(define (lexer str)
  (print-token-list (scanner (string->list str) ‘())))
;;  (d (scanner (string->list str) ‘())))

(define (scanner char-list token-list)
  (if (null? char-list)
      token-list
      (let ((c (car char-list))
	    (cs (cdr char-list)))
	(cond [(char-whitespace? c) (scanner cs token-list)]
	      [(char-alphabetic? c)
	       (pred-scanner cs
			     token-list
			     (list c)
			     (lambda (char) (or (char-alphabetic? char) (char-numeric? char)))
			     (lambda (char-list)
			       (let* ((str (list->string char-list))
				      (def (if (hash-table-exists? reserved str)
					       str
					       “IDENT”)))
				 (make-token def str “”))))]
	      [(char-numeric? c)
	       (pred-scanner cs
			     token-list
			     (list c)
			     (lambda (char) (char-numeric? char))
			     (lambda (char-list)
			       (make-token “NUMBER” (list->string char-list) “”)))]
	      [(char-numeric? c) (scan-of-pred cs (list c) token-list char-numeric?)]
	      [(or (equal? c #=)
		   (equal? c #+)
		   (equal? c #-)
		   (equal? c #*)
		   (equal? c #/)
		   (equal? c #;)
		   (equal? c #,)
		   (equal? c #()
		   (equal? c #))
		   (equal? c #.))
	       (let ((str (make-string 1 c)))
		 (scanner cs (add token-list (make-token (hash-table-get symbols str) str “”))))]
	      [(or (equal? c #< )
		   (equal? c #>)
		   (equal? c #:))
	       (let ((pred (cond [(equal? c #< )
				  (lambda (e) (or (equal? e #=)
						  (equal? e #>)))]
				 [(equal? c #>)
				  (lambda (e) (equal? e #=))]
				 [(equal? c #:)
				  (lambda (e) (equal? e #=))])))
		 (pred-scanner cs
			     token-list
			     (list c)
			     pred
			     (lambda (char-list)
			       (let ((str (list->string char-list)))
				 (make-token (hash-table-get symbols str) str “”)))))]
	      [(equal? c #\”)
	       (let ((index (list-index (lambda (c) (equal? c #\”)) cs)))
		 (scanner (drop cs (+ 1 index)) (add token-list (make-token “STR” (take cs index) “”))))]
	      ))))

(define (pred-scanner char-list token-list buffered-char-list pred maker)
  (if (null? char-list)
      (scanner char-list (add token-list (maker buffered-char-list)))
      (let ((c (car char-list))
	    (cs (cdr char-list)))
	(cond [(pred c) (pred-scanner cs token-list (add buffered-char-list c) pred maker)]
	      [else (scanner (cons c cs) (add token-list (maker buffered-char-list)))]))))

こんなソースコード生んで本当にすみません。

でも、綺麗にしたいんです><コメントお願いします><

[Haskell]フィボナッチベンチ、その頃 Haskell は・・・。

Haskell 2 Comments »

恒例のフィボナッチベンチで V8 と Smalltalk、Ruby、Python、Scheme とを戦わせてみるにHaskellがいないではないか!ってことで、やってみた。(やってからブログ書く暇がなくて、かなり乗り遅れてるけど)

gabu@ubuntu-vm:~/haskell/fib$ time ./fib 39
63245986

real	0m0.019s
user	0m0.000s
sys	0m0.012s

0.019秒きたーーー。

ソースはこちら。

import System

fibonacci = 1:1:zipWith (+) fibonacci (tail fibonacci)

main = do
  args <- getArgs
  print $ fibonacci !! ((read $ head args) - 1)

List の index の関係で マイナス1してるのがださいけど、こんなもんですかねぇ。

フィボナッチ数列の作り方は、フィボナッチ数列 - Haskell はスケるよから頂きました。読んでも意味が分かりません。。。誰か解説プリーズ。

INTOI というデジタルホワイトボード

これはすごい 2 Comments »

Imagine Cup 2008 のニュース で初めて Imagine Cup という存在を知ったんですが、Microsoft の Imagine Cup の公式サイト でヒアリングの練習がてらプレゼン動画を見ていたら 2007 年大会の インターフェイス デザイン部門で1位になった「INTOI」というデジタルホワイトボードが凄いよく出来ていて感動したので紹介します。

とにかくデモ動画をどうぞ!

INTOI 公式サイト欲しい!欲しすぎる。

  • 左手に持つパレットが画家気分を演出
  • Image や Movie をホワイトボードに貼れるとか、デジタルならでは
  • 全体をドラッグできるのでホワイトボードが広々使える<これ重要
  • もちろん Save & Load できる

でも僕の英語力ではこれが製品として売られてるのか、売られているなら日本で買えるのかが分かりません。個人で買うのも何かアレだし><

日本に似たような製品ってあるんですかね?

雑感

こういう純粋にダイレクトに「すげー」とか「便利ー」とか言われる製品を作ってみたいです。これいったいどうやって出来てるんだ。。。キニナル。

力を抜いて生きたい。(前向きな意味で)

Think 2 Comments »
あなたの考えは、すべての出来事、存在をあるがままに、前向きに肯定し、受け入れることです。それによって人間は重苦しい陰の世界から解放され、軽やかに なり、また時間は前後関係を断ち放たれて、その時その場が異様に明るく感じられます。この考えをあなたは見事に一言で言い表しています。すなわち『これで いいのだ』と。

赤塚不二夫さん葬儀 タモリさんの弔辞全文(産経新聞) - Yahoo!ニュース

滝に打たれて来ました。

雑記 8 Comments »

taki.JPG

死ぬかと思いました。

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

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