[Bilbo]そこそこ動くようになった
職場の作業ログ、以前はtDiary、春まではBitChannelを改造して使っていた。 今回はいい機会なので自作ブログシステムのBilboを導入してみた。 もうだいたい動く状態だったんだけど、多少手を入れてまずまず使えるようになった。現在コアは81行だったかな。100行以内という縛りは守られている。
少しだけ手を入たけど、コアの実装はだいぶ安定している。
必要な機能のほとんどはプラグインによって実装するというコンセプト。ちっちゃくてシンプルなコアがあって、ほしい機能は自分でさくっと付け足す。例えばエントリの頭に日付を表示したければ次のようなプラグインを書く。
# showdate.rb require 'date' class Entry def date if m = /\A(\d\d\d\d)(\d\d)(\d\d)/.match(label) Date.new(m[1].to_i, m[2].to_i, m[3].to_i) end end end Plugin.add_hook(:before_entry) {|entry| %Q!<div class="date">#{ entry.date }</div>! }
Entryは記事を抽象化したクラス。labelは記事の名前を示す"20070727"のような文字列。Plugin.add_hookはいくつかのエントリポイントにhtmlの断片を挿入する。
パーマリンクを追加する例。
# permalink.rb class Controller def show @entry = Entry.find(params[:date], :limit => 1, :complete_label => true).first render(:show) end end Plugin.add_hook(:after_entry) {|entry| %Q!<span class="permalink">#{ link_to 'permalink', :action => :show, :date => entry.label }</span>! }
コントローラにアクションをひとつのエントリを描画するshowアクションを追加しちゃう。 書き方がRailsに似てるけどRailsじゃないよ。cgi.rbで動かしているけどでもコアはcgi.rbに依存していない。
- Entry.findはコアで定義しているメソッドで記事を返す
- render(:show)はviews/show.rhtmlを呼び出す
- link_toもRails風に定義したものを用意しているだけ
cgiに依存してないってのはこんなindex.cgiをコアとは別に用意して動かしてるから。
#!/usr/bin/env ruby require 'cgi' def params @params ||= CGI.new.params.keys.inject({}) {|t, k| t[k.to_sym] = CGI.new.params[k][0]; t } end def cgi_out CGI.new.out do begin yield rescue Exception $!.to_html end end end cgi_out do load './bilborc' setup_environment bilbo_context() end
実装を小さくするのは設計とアイデアだなと思う。あと局所的なRubyのテクニックも必要かな。いくら時間をかけてもうまく出来るもんじゃない。集中してよく考えて、あとプリントアウトしたソースをいつも持ち歩いてペンで添削を繰り返す(A4用紙の印刷するのには100行がぴったり)。そんな中から設計のアイデアが生まれてくる。最近はもっぱらこんな開発スタイル。
ヘレン・ケラー (ポプラ社文庫—伝記文庫)(山口 正重)
子供用に購入。が、面白くて自分が一気に読んでしまった。
生まれてまもなく病気で視力と聴力を失ってしまうヘレン。苦難を乗り越えやがてはハーバード大の厳しい入試への挑戦……。人間の底力を感じさせ、そして考えさせられる。
200分の1の法則
今朝電車の中で考えていたことを思い出しました。 「セレンディピティ」とはちょっと違うかも知れないけど、今朝も奇妙な偶然について考えていました。
こんな話を聞いたことがあります。
- 車を運転していて200回ヒヤっとする目にあうと1回は事故になる
- 自分の意見をインターネットで公開すると200人に1人くらいの人が感想をくれる
電車の中でいろいろ思いをめぐらしているうちに、別々のところで聞いたこの2つの話がつながりました。
これは「200分の1の法則」だ!と。 日常で特にアクションを起こさずにいれば、一生出会うことがないかもしれないことも、 意識的に行動を起こすことによって機会を増やせば、それなりに狙い通りの結果を得られるんじゃないかと。 (もちろん「セレンディピティ」も期待できます。) 200回くらいならがんばれば何とかできそうですよね。
たとえば200人の異性と知り合うチャンスがあれば、 その中の1人くらいは自分のことをものすごく気に入ってくんじゃないかと期待できるのでは。 出会いのチャンスを増やすことになら具体的な作戦を立てれますよね。
Rubyゲーム本(2) 「セレンディピティ」
http://heydays.org/archives/2006/08/_by_22.html
essaさんのブログで「セレンディピティ」という言葉を知りました。
私はこの「セレンディピティ」が大好きです。 この言葉を知って改めて「セレンディピティ」というものを積極的に生活に取り入れてようとしている自分に気がつきました。
たとえば各種勉強会に参加する主な動機がこれです。 勉強会に行くと必ず新たな発見があります。 行く前はいつも特に勉強したい具体的な事柄もないし、めんどくさいなーと思ってしまうのですが、 実際参加してみると毎回まったく予期していなかった新たな収穫があるのです。 それは、知らない技術だったり、新しい出会いだったり。
Ruby関係の各種イベントに積極的に参加したいと思うのも、この予期せぬ幸運を求めているからです。 私の場合、具体的にはこんなことです。
Rubyを良く知らないけど、なんかすごそうだからとにかくイベントに参加しよう ↓ るびまの話を小耳にはさみ、デザインで立ち上げに参加 ↓ ドサクサにまぎれてかねてから書きたかった初心者向け記事を書く(←金星) ↓ 記事を書いたことをブログのトップに張ってアピール ↓ Rubyゲーム本の執筆依頼が来る ↓ 書籍の執筆実績をさりげなく目に付くところに(←いまここ) ↓ 新たな可能性!?
これらアクションは「セレンディピティ」というのを意識するからこそチャレンジしてきたものです。 チャレンジがまた予期せぬ新たな展開をおびき寄せてくれるのです。 こうして考えてみると、この件に限らず私はいろんな分野で「セレンディピティ」が高くなるように行動しているようです。
あわせてやりたい
これとあわせて意識していることは、めぐってきたチャンスを決して逃さないということです。 これもセレンディピティと同じくらい強く意識しています。 どんなに大きな壁でもいったん乗り越えてしまえば、不思議なことにそれが自分になってしまいます。
時をかける少女(アニメ)の感想(Amazonレビュー風)
先日TVで初めて見ました。原作その他は見たことがありません。 見始めたらぐいぐい引き込まれて、あっという間にラストシーンに。
ひょんなことから時間をリセットする力を手に入れてしまった少女。 誰にでもある学校での些細な問題も本人にしてみれば大問題。 自分の都合のいいように時間をリセットし続けた結果、少女の周囲には人間関係の歪が生じてしまう……。
ありふれた日常と時間を飛び越える特殊能力がもたらす不思議な感じ。 壮大な物語があるわけじゃないんだけど、爽快な主人公のなんともいえない心地よさと切なさがあります。
映像のクオリティの高さ、時間軸がめちゃくちゃ飛ぶのにわかりやすくてテンポ良く展開する子気味よさ。 そして好感の持てる元気で前向きな主人公。
個人的に胸を張って「好き」といえる作品です。
Rubyゲーム本について
まだまだ自分の中で消化し切れないので思うところを7回シリーズで書いてゆきます。
--
Ruby/SDLは高速な描画能力と安定性を持っていて十分実用的であることは以前から知っていた。 これはRuby/SDLを直接触った人なら気づいていたことだと思う。 現代のパソコンならスピードだってたいした問題にならない。 グラフィカルなゲームの場合、ほとんどの負荷は映像描画にあるので Rubyレベルの負荷は心配するほど問題にならない。 だからちゃんとしたものを作ればそれなりのものができるだろうし、やればいつでもできるさ、 と思っていた。
というわけで実際にやってみた。 プロのデザイナにお願いして見栄えのいいグラフィックデータを描いてもらい、 オーソドックスなサンプルゲームを4つ実装した。
特に難しいことは何もやっていない。 Rubyの表現力を持ってすれば、従来の言語とは比べものにならないほど シンプルなサンプルソースを書けるという自信があったけど、 それはその通り実現できたと思う。
やればできるというのを実際にやってみた。 ただそれだけなんだけど、今考えてみると、 潜在的なRubyの可能性をちゃんとわかりやすい形で示すことには意味があるかもしれないね。
[MyGame]「異様なぐらい楽」
http://d.hatena.ne.jp/mahm/20070707/1183821896
ジュンク堂で偶然見つけて立ち読みしていたのだけど、Ruby/SDLに加えて MyGameというライブラリを使うことで異様なぐらい楽にゲームを作れると いう例が載っていて、とても面白かった。
いろんなところで感想が出ていますが今のところ大変好評なようです。
[開発][Rails]viewでできることはviewでやる
すごーく、すごーくゆっくりなんだけど、微妙に開発が前進している。 一日ちょっとだけ実装したりしなかったり。こんな調子でもRubyとRailsのパワーのおかげで数行書いただけでも前進している感が得られるから楽しくやってゆける。
最近のマイブームはcontrollerを使わずにできるだけviewで完結させてしまうこと。このやり方はゲームデザインというかUIを決める段階ではかなり有効みたい。contorllerにアクションを実装するのはDBを書き換えるときくらい。
こうするとviewにロジックが入って複雑になってしまうのでは?と心配になるかもしれないけど、今のところはそんなことなくって、やっぱActiveRecordだと、メソッドを2,3チェインすればほとんどのものが取ってこれて、これをviewに書いちゃってもたいした問題にならない。
例えばアイテムショップだと、「買う」が選択されてDBの書き換えられる(アイテムの追加とお金の減少)前まではどのアイテムを選ぶかというUIの問題なのでここをviewだけで完結させてしまう。
- 「いらっしゃませー♪」と商品リスト …… view(rhtml) のみ
- 「はがねの剣なら1500Gになります!→買う, 買わない」 …… view(rhtml) のみ
- DB書き換え→ショップの先頭にリダイレクト …… ItemController#buy
悩む部分はUIだから頻繁に書き換える部分がviewに集中してくれるとすごく楽。デザイナーとの分業とかそういうのやらないわけだし、ガンガンviewに書いちゃう(といってもたいした処理ではない)方法でしばらく進めてみようと思う。最適化なんてのは必要になったときにやればいいしね!
[開発][アイデア]ミニマムな完結した世界
本ブログでただ[開発]とか[アイデア]というときは Jewel-mmo に関する話。 この手の話はなんの脈絡もなく始まります。
UIデザインを中心に先日から実装を開始している(何度目のプロトタイプだ……)。だいぶ形になっているのだけど公開にするのに必要な最小構成はどんなだろう。最低限ゲームとして成り立たせるには何が必要か。
- キャラを集めてPTを編成できる
- モンスターと闘える
- 目的や報酬がある
- モンスターを倒す→アイテム、カード、お金
- わかりやすい目的
- →ゴーストクエスト
- →中ボス→固定キャラ、ランダム出現のとあるモンスター
- →ゴーストの転生カウンター
- →?階到達
レベルデザインも最小構成からスタート。
- クラスはノービスだけ
- カードの最低枚数 → 1
- モンスターの最低種類数 → 1
- アイテムの最低種類数 → 1
[MyGame]MyGame 0.9.1 をリリース
MyGame 0.9.1 をリリースをリリースしました。
http://dgames.jp/ja/projects/mygame/
MyGame は Ruby で簡単にゲームを作るためのライブラリです。自分のゲーム開発の経験をもとにゲームプログラミングに必要な処理を簡単な API にまとめています。とにかく簡単に書けることを目標にしています。
MyGame 本体は小さな Ruby スクリプトにすぎません。 MyGame の中で Ruby/SDL を使っています。 MyGame は Ruby/SDL が動作する環境で動作します(テストはWindows上で行っています)。
[Ruby][Rails][Bilbo]シンプルなブログシステムを開発中
前からの希望だったり、とある事情があったりで3つの構想が進行中。
- Bilbo …… cgi.rbを使った小さなブログシステム(コアを100行以内で実装するのがコンセプト)。将来はここのシステムになる予定。一応プロトタイプが動いている。コアは75行!
- Ent …… ERBをテンプレートとして静的なHTMLを生成するシステム。シンプルでわかりやすい実装がコンセプト
- Pipin …… Railsによる超シンプルなブログ実装
Bilboはデザインをちゃんとすればもう一応使える状態になっている(と思う)。でも機能がほとんどないのでここのシステムに置き換えるにはいくつかのプラグインを開発しないとね。