WindowsでCucumber/RSpec/Ruby on RailsのBDD開発

結論: 重すぎる・・・・・・

以下手順とハマりポイント

◆RubyのインストールにはRubyInstallerを使う
◆コマンドプロンプトはnyaosを使う
※nyaosにpik関係の問題あり

◆Windows/Ruby環境を作るにあたってあきらめなければならないこと

・Unicornは依存パッケージの関係上はいらないっぽい(kgioはunix only)
→http://locomotive.cl0.vanillaforums.com/discussion/3/windows-installation/p1

◆Ruby環境の整備にpikを使うケース

gem install pik
pik_install C:\RubyPik #パスを通しておくこと
pik config install_dir=C:\RubyPik #pikのインストールパスに半角スペースとか入れないように。
※pik_installの場所とinstall_dirは場所同じにしたけど、違う場所がいいかも。
pik install Ruby 1.9.3
pik use 193

○rvmと違うところで致命的に嫌だった所
・gemsetは使えない(ただし、環境ごとに名前を変えれば似たことは出来る)
・–defaultが設定できないので毎回useする

○知っておくといいこと
・Windows特有のパスディレクトリを含めない。RubyインストールパスはC直下あたりが望ましい。(半角スペースや全角文字のない場所)
・pik useを適切に行うためには、pikのパスにあるbatを読む必要がある。pik listとかは動いちゃうので注意!
・すでに環境がある場合はaddするほうが絶対いい
(gem install pikの時点でもうRuby環境あるじゃん! って話なので)

○nyaosでpik useを有効にする
_nyaに↓追加

### Pikの設定を追加する
pik{
pik_runner.exe pik.bat %*
if exist “%USERPROFILE%\.pik\pik.bat” then
source “%USERPROFILE%\.pik\pik.bat” 2> nul
endif
}
※pik.batの場所は%USERPROFILE%\.pik\pik.batになるもよう。

○nyaosでpik useのデフォルトを指定して弱点をカバー
_nyaに↑のあとに
pik use 193
環境の可視性を持たせるために
ruby -v
rails -v
を記述。
この_nyaファイルはカレントディレクトリにおき、nyaosをカレントディレクトリで起動するショートカットないしbatを用意する。

◆DevKitのインストール

(レガシーなやり方)
1. http://rubyinstaller.org/downloads/
ここから最新版のDevKit落とす

2. DevKit解凍(半角スペースや全角文字のない場所にすること)
(自己解凍書庫だがディレクトリを作らないので、ディレクトリを作ってその中に入れる)

3. DevKitのパスにもぐり、以下実行
ruby dk.rb init
#この際に最初にインストールしたRubyパスを読むので、別にpikでインストールした場合はそのパスに変える
ruby dk.rb install

◆mysql関係の落とし穴

libmysql.dllがないといわれる
http://exposed.egoism.jp/wordpress/?p=295

Rubyインストールパスに、
Mysqlインストールディレクトリのbinの中にあるlibmysql.dllをコピーする。
→ただし、私の環境ではこれでも駄目だった。

駄目だった場合は、MySQLのページ→Download→Connector→Connector/Cで落としてきたzipの中にあるdllファイルを突っ込む。
MySQLコネクタのバージョン>gemが使うコネクタのバージョン にすること!

◆guard(自動でRSpec実行してくれるやつ)の問題

○Cucumber関係のWARNINGを消す

・.rspecのカラー付けが出来ない
(You must gem install win32console to use colour on Windows)
gem install win32consoleをする。
(Pikではなく、Windows環境デフォルトのRubyに入れる?)

・WARNING: You must use ANSICON 1.31 or higher を消す
http://qastuffs.blogspot.jp/2011/02/how-to-install-ansicon-for-cucumber-to.html

○awkが無い
→Windows Services for UNIX を入れる。
http://www.microsoft.com/downloads/ja-jp/details.aspx?familyid=896C9688-601B-44F1-81A4-02878FF11778&displaylang=ja
gawkをごまかして使うことも考えたけどやめた。

カテゴリー: 未分類 | コメントをどうぞ

Q: ゲームをシンプルにするための二つの障壁。

 

A. その一つはルール、もう一つは達成感。

 

-Expression-

 

Step. ルールとは。

ルールとは、ゲームを構成する最低源の要素。

「ルールを構造化する」
・ルールを複雑にすることと、シンプルにすることは相反しない。

トレードオフ
「構造化された複雑さ」  ⬅  Which? ➡ 「単調化されたシステム」

スーツの理論では複雑性の土俵の上に「ゲームが成り立つ」とあるが、
これはハイソサエティな考え方にすぎない。

 

Case. 構造化された複雑さについての説明

例題)
「操作はボタン1つだけである」というルールでゲームを作るとする。
ここからは色々なルールが完成する余地がある。
が、しかし、完成したゲームそれらの何割をユーザーは受け入れることが出来るだろうか?

基本的に、ユーザーは無料の利益というものになれてはいない。
ボタンを押すと何かを失い何かを得ると判断しうる。
システム上「ただボタンを押すこと」で人と話し、冒険を行い、アイテムを入手し、町で買い物をし、仲間を集めるような仕組みを作ることは可能である。

しかし、ユーザはそれらの行動に対し、「対価」を無意識に考えるものだ。
仲間を雇うには交渉が必要、モンスターを倒すには十分な準備が必要、町で 買い物をするには金が必要……

それらを無意識のうちで使用するような「ワンボタン、ミステイク」は、
ユーザビリティとしては考えづらいし、やり過ぎといえるだろう。

トレードオフ
どこまで操作を併合すればいい? ⬅ Which? ➡ どこまで操作に自由度を与えればいい?

成功例)
ミスタードリラーは、成功例の一つといえる。

複雑なブロックのルールを「掘る」というアクションでシンプルにし、
操作をほぼ「ワンボタン」(正確には、ユーザーの移動をしなくてはならないが)で行うことが出来る。

これは、シンプルにルールを融合した例の一つといえる。

 

Case. 単調化されたゲームについての説明

近年のソーシャルゲームの台頭。

めんどくさいと思える行動(様式美)を単調化することで、
ユーザビリティをあげるというもの。

基本的に、だれる行動をシンプルに纏めてしまうのはよい。
が、根底がパズルゲームだとした場合に、そのパズルの部分を最適化するのはどうだろうという課題がある。

単調化されたゲームに求められるのは、ユーザへのルールへの介入度だ。

例題)
「冒険をする」ことを基軸としたゲームを作れ。
とした場合に、まずは冒険の要素を洗いだすだろう。

1. 準備をする
1-1. 装備強化
1-2. ちょっと遊んでみたり……?

2. 徒歩/船/飛行船/車で目的地に行く
2-1. 道中でのイベント
……
2-2. 怪しい場所を発見
2-2-1. 探索
2-2-2. もしかしたらボスとかいるかも
……

3. 宝を探す
3-1. 原生動物との戦闘
3-1-1. 攻撃!
3-1-2. スキル!
3-1-3. くびをはねられた!
……
3-2. 目的地での休息
3-2-1. 寝床の作成
……

4. 宝の分配、持ち帰り
4-1. 宝は全部私のものだ!
4-1-1. 持ち運ぶには船が必要だな……
4-2. 仲良く分けようか……
4-2-1. わけまえを均等に配分するかどうかは問題だ
……

さて、要素を深く掘り下げ、そこにルールを定義し遊びを生み出すことは可能だが、
はたしてどこまでが必要だろうか?

ユーザは宝を持ち帰るのが目的であるなら、
道中の「めんどくさい工程」はある程度どうでもいいのかもしれない。

あるいは、ユーザはその工程の全部、ないし一部を楽しみたいのかもしれない。
(おそらく、冒険の都度全部の要素を楽しもうとするユーザーはマイノリティとなるだろう!)

成功例)

ドラゴンコレクションや探検ドリランドなど。

基本的にユーザーが行うアクションの様式を全て取り外し、生活にとけ込むまでにゲームを圧縮することに成功している。
ゲームが生活にとけ込めない「悪しき点」の一つは、様式をプレイすることに集中しなければならないために、ユーザーからある程度まとまった時間を奪ってしまうということだ。

JRPGは「戦闘が面白い」とよくいわれてはいるが、ブラウザベースのソーシャルゲームで「戦闘が面白い」と感じたものは一つもない。
多数派のユーザは「戦闘の細部に関する様式」よりも、「戦闘をしたことに対する結果」を重視するのだ。

トレードオフ
どのくらい様式を省けばいい? ⬅ Which? ➡ どのくらい様式を盛り込めばいい?

 

Step. 達成感とは?

ゲームをやっていて、結果として何も残らない/何も起きない、
その時間を無為に感じることはないだろうか。
また、行動的には無為なものをやっていると自覚していても、
自分の中で「ある一定の目標」を作成し、それを達成しようとしてないだろうか。

それを自然に行うことの出来る要素が、達成感である。
これは、ゲームの演出や難易度をどのように調整するかで表現できる要素だろう。

 

Case. 何を残すか

「ゲームとは無為なものだ」とほざいたのはホイジンガだったか。

ユーザになにがしかの形で残り、なおそれがうれしいものとなる要素は、
なにも社会的にプラスになるものばかりではない。
ゲームを遊んだ記憶そのものや、友人とともに行動した環境、
そういった、ゲームのシステムとは完全に隔離された関係ない……関係ないと思っている要素!
それが「後に残るもの」である。

これは、言い換えると「昔」を楽しむことになり、
未来の自分へ楽しさをシェアすることに繋がる要素となり得る。

しかし、何も残らないゲームもある。
音楽に合わせてリズムを刻むなどして、「おもしろかった!」と一言残すことが出来るゲームは
それそのものを遊んだ時間を「有為的なもの」にする。

これは、言い換えると「今」を楽しむことになり、
それ以外の社会的要素に何も影響しない、気楽なものとして遊ぶことが出来るだろう。

トレードオフ
「今」を楽しめ! ⬅ Which? ➡ 「昔」を楽しめ!

 

Case. 何を起こすか

ひきがねをひけば弾が出る。それは銃にとって当たり前のことだろうか。
いいや、弾が込められていなければ、その撃鉄はただ音を鳴らすだけだ。

ふつう、マニアックに時間をつぶす意外の用途では、
弾の込められていない銃を撃ちたくはないものだ。

ましてや、それがゾンビや野生動物がうろついているような環境では、
ユーザは無為に「カチカチ音を鳴らすだけの行動」をやるはずがない。

プレイヤーとユーザーは弾が切れたら自主的に弾をリロードし、次に備える行動をすると
心の中で同期している。していたいと思うのだ。
ゾンビが視界にいる状態では「銃の引き金を引いたら、弾が出てあいつが倒れる!」といった
心の同期が必要だと思う心があるはずなのだ。
(もっとも、現実で次に備える行動を実際に行うか、というのは別の問題)

別の例を出そう。RPGだ。次にいく場所が分からない。迷ってしまった。
が、町の人はスクリプトで打ち込まれた文章を返すだけで何も教えてはくれない。
「何かヒントを教えろよ!」と思うことは良くあるだろう。
無意味に昔の町に戻ったりしなかっただろうか。

しかし、次の町へたどり着くことがひとつの「推理的パズル」なのだとすれば

それをぺらぺら喋るNPCというのは野暮ったいとは思わないか?
「自分の知りたい要素」をなかなか教えてはくれないパズルゲームなどでは
回答にたどり着いたときの「やった!」という快感を味わうことがあると思う。

これは心の同期をしていてはたどり着けない領域にあるもので、
かつ、ユーザの「ここにちがいない!」という同期心を完全に無視した想定をしなくてはならない。

ユーザーの心を無視する(ある程度のストレスを与える)必要があるのだ。

トレードオフ
心を同期する ⬅ Which? ➡ 心を無視する

 

Case. 何がしたいのか

目標というものがなければ、物事などただの苦痛にしか感じない。
しかし、現実でもゲームでも、時に苦痛を強いられるときがあるだろう。

・RPGで、完全にルーチン化した戦闘を繰り返しているとき
・何度も繰り返されるストーリーを、スキップできずにみているとき
・広すぎるフィールドにただ1人、いきなり放り出されたとき

人間は目標を立てて、それに添って動く生き物だと思っている。
であれば、まずはプレイする上で「目標」が必要なのだ。
しかし、目標というものは自分で考えるものであって、
人に決めてもらうものではないはずだ。

しかし、最初から最後まで自分で目標を決めてまでゲームという「苦行」をやる人はそういない。
「これはゲームなのだから」と

ある程度は、与えられた目標通りに動くことがほとんどであるだろう。
このゲームで何をすれば、自分は面白いと感じるだろうか。

ゲームで何がしたいのか。ゲームで何を表現したいのか。

トレードオフ
自主的な目標 ⬅ Which? ➡ 与えられた目標

 

-summary-

Point. 全てはトレードオフの関係にある。

何が正解で、何が間違っているかなんてわからない。わかりっこない。
この記事が正解かさえもわからない。

しかし、全てにおいて、自分が納得のいくバランスを見つけたなら
すくなくとも、自分と同じ天秤を持つ人には、それが理解されうるのではないだろうか。

カテゴリー: 未分類 | コメントをどうぞ

ゲームを”ほんとうに”始めてもらうために

スーツ曰く「何か競争事を行う際に、より難解な手段をもって挑むことは、より遊びを楽しもうとする現れ、遊びに対する心掛けにあたる」らしい。
無論、その「難解なルール」を認めさせることが必要ではあるのだが、
なるほど”遊びの心得”というものは考えていなかった。

つまり、このデザインを無視する形でゲームを構築することは、
「ユーザーを遊ばせようとしない」ということであり
なお、ユーザーが心得を自覚していないとすれば
ユーザーも開発者も、ゲームという物を「遊ぶ」段階に至らしめていない、ということが言える。

無論、これは暴論である。
しかし、これはゲームをプレイする前段階として
つまり集客やその他の要素、あるいはゲームという概念そのものの要素として考えねばならない点、ということは確かである。

ゲームを本当に遊んでもらうためには。
そのためにどうすればよいか、そのデザインを幾つか上げてみようと思う。
1. 難解なルールを誇示させない

なにはともあれ、これに尽きる。
難解なルールとは、たとえば格闘ゲームに類するところがある。
格闘ゲームといえば、難解な技の読み合いとフレーム単位での手先の器用さの攻防、反射神経の要素………など古参ゲームにして戦略性と技巧性を備えたデザインである。
が、その中身の要素に至る前に、格闘ゲームには特筆すべき点がある。
レバーとボタンを用いて、「不自由な環境で、不自由な入力法を用いて、相手を攻撃する」という点だ。
これは、シューティングゲームなどとは異なり「自己の能力を機械によって制限された状態」といえる。

この状態は、ゲームを始めるプレイヤーにとって、取り付きやすい環境であろうか?
無論、はなからゲームにそれを望むプレイヤーであれば、このような心得の壁は取り払われるものなのだが。
多くのプレイヤーは、おそらくそうではない。
格闘ゲームを難解なゲームだと一瞥して、「ほかに簡単そうに見えるゲームがあれば」それをプレイするだろう。
この心得の壁は、衰退の一因を握っていると考えられるし、また容易に取り除くことはできない要素足りえる。

つまり、どのようにすれば良いか。
ルールを簡単に見せつけ、「ユーザーを無意識的に不利な状況へといざなう」のである。
一例として「マリオカート」のデザインを上げる。

マリオカートでは、順位が低いほど加速度とアイテムの質が向上し
ユーザーの順位のバランスを調整するという処理を行なっている。
これは、「不利な状態から逆転する」というエンターテイメント要素(そして、これはスーツの理論に合致している)を持ち、なおかつユーザーに気づかせないレベルでゲームを進行させる、二面のメリットを持つ。
任天堂のほかのゲームにもこの要素は多く含まれており、
それが人気を誇る要素の一員足り得るとも考えられる。

 

2.  ルールを現実から遠ざける

それは、例えばパズルゲームである。
パズルゲームの要素は、日常的に生活する上でまったく役に立つことはない。
(たまには役に立つパズルもあるかもしれないが、それは除外する)

例えば、テトリスを例に上げる。

テトリスの基本ルールである「一列揃えると消える」は、
その要素が日常的に全く起き得ない、非現実的な要素である。

この要素が現実からかけ離れているからこそ、
人間はそれを「正常な価値観で認識することができず」に、
簡単に受け入れてしまうのである。
これは、不気味の谷の理論に似たものを感じる。
現実的に「寄り過ぎた」ルールやパタンほど、
人間は不気味さや生々しさを感じて、逆に忌避してしまうのである。

 

3. ごほうび

これは、最近多い要素の一つ足りえる。
「対評価」によるデザインである。

たとえば、
「超難関大学の模試」を受ける場合と
「ふつうの学校のテスト」を受ける場合
において、その得点数で比較をする場合
点数が同じ、または高い場合、当然ながら前者が評価されるが
得点数の差で見た場合、後者が評価される事は多い。
この状況をゲームとしておくと、プレイされるのは堅実たる後者であろう。

では、
「超難関大学の模試」での得点数×100点
「ふつうの学校のテスト」での得点数×30点
で比較をするとどうだろう。

より難解なものに関してボーナスをつけることでレベリングを行い、
ユーザーを「より難しい状況へといざなう」デザイン。
また、難解なものに対するリターンをより豪華にすることで
よりユーザーを煽る。ただし、そのバランスによっては、状況が一瞬でひっくり返ることもあり得る。
ギャンブルの要素は、多くの場合がこれに該当する。

 

以上三点をあげた。
ゲームに応じて、それぞれの項の導入度合いに気づくもの気づかないものがあると思うが、
「その危うい平等さのうえに」なりたつものがゲームであり、
ルールを無視するもの、ユーザーをなめてるものは、
ゲームとして環境が構築されておらず、
「ゲームを円の外側から鑑賞する行為(エキシビジョン)」でありうる。

それはエンターテインメントではあり得るが、ゲームたりえるのだろうか。

カテゴリー: ゲーム | タグ: | コメントをどうぞ

The Billion Method Age -十億関数時代-

ふと、このままCPUが分散化のみに注力され
GPUの恩恵が十二分に得られる時代が訪れたとき
それを、単純演算資源としてではなく
汎用的演算資源として活用できる時代が来るとしたら。
そのような未来を想像してみた。

そんな、すぐにでも訪れそうな未来。
オブジェクト指向なんてぬるい理想のままでは生きて行けないだろう。
それを切り開く活路、「十億関数時代」というものを夢想した。

十億関数とは、一秒に投げられる関数の数の指標のこと
つまり、一秒間に10億個の関数が処理されなければならない時代だ。
仮として、CPU/GPUの資源をGF114の384コアの約3倍、1000を基準に試算すると
百万関数/1コアまで拡張が可能であると試算できるので
平均して1マイクロ秒で1関数の処理が完結していればいい。

このベストパフォーマンスを得るには
データの衝突やI/O限界の解消とは別に
「すべてのオブジェクトが関数として機能していること」がまず前提となる。

1. ラムダクラスタリング
クロージャの集合を、データスレッドごとに分散して、同じパターンのスレッドにチェインしていくもの。
この際、並列化が可能であれば並列化すること。
関数は共有メモリ上にある程度ハッシュ化されているはず。

この構造は
・分子コンピュータの領域では比較的親和性が高いと思われる。
・量子コンピュータの領域では親和性は低いように思われる。

2. クリティカル・パスの並列走行
クリティカルセクション(ロック機構)はボトルネックをつくる。
これは前時代からのマルチスレッドコンピューティングの基本であり最大の難関であった。
しかしデータグラムを分散、ラベリングすることでは
「クリティカルが競合しないもの」は多々存在すると言える。
それらを並列走行させること
あるいは仮にそれが全体で単一に走るべきオブジェクトだとしても
競合するオブジェクト自体は離別できるので

//データコンバイザ的なほげ関数
//ついき:くそながい
function void hoge(Element elm)
{
elm.critical_str += “これ競合してる”;
elm.value….
うんたらかんたら
elm.critical_str += “これ競合(ry”;
return elm;
}
↓これをこうする↓
//データコンバイザ的なほげ関数
//ついき:分割した。ってか昔懐かしい?
function void hoge1(Element elm)
{
elm.critical_str += “これ他と競合してる”;
chain hoge2;
return elm;
}
function void hoge2(Element elm)
{
elm.value….
うんたらかんたら
chain hoge3;
return elm;
}
function hoge3(Element elm)
{
elm.critical_str += “これ競合(ry”;
return elm;
}

概念的には、ステートメントを保持するという感覚分コルーチンに近い。
しかし、当然ながらこの間elmにアクセスされたくない場合は有るはず。

3. フェイジング・マージ
elmの内容自体(Cでいえばそのポインタの中身に該当する部分)を書き換えられたくない場合。
その場合には、これをFadingオブジェクトとして宣言して使う。
このオブジェクトは、確定可能な計算時(コミットメント)に実存として表現されるオブジェクト・キャッシュで
関数によって割り当てられた割り当てられた優先度順にチェインされたもの計算を1スレッドを使用して行い、基礎範囲外の演算結果(それが許容範囲外アクセスであるとかの処理を含めて)、適切に演算する。
これはマージの概念に近く、演算は適切な優先度を持ち得ることでコンフリクトしない。
優先度を用いて適切とする場合は、掛け算や割り算など順番の変わるものに関して気をつけること。特に掛け算と割り算は執り行う前後が逆転しただけでも演算が狂うことがあるので。

ex. いくつかの実例的コード
統合的概念は関数型言語そのものである。

単純な処理例として、functionAで5*8+3、functionBでA*0.8、functionCでB/2という計算を行うとして
慣れやすい感じで視覚化するとこうなる。
ret = functionC(Int functionB(Int functionA(){ return (5*8+3); } As A){ return (A*0.8); } As B){ return (B/2); };

Haskellのような何かと、LISPレベルの型付け。
http://ja.wikipedia.org/wiki/LISP
http://ja.wikipedia.org/wiki/Haskell
ただ両者ともやはり(慣れなければ)分かりづらいので、JavaないしCの関数レベルで分解し引数の場所にプロトタイプ宣言が書けるような形で取り繕えれば。

4. I/Oアクセス
I/Oに関連するものだけに関しては、その際SSDをフルに活用するという言い訳を置いておいて割愛。

i. 問題点そのいち
どの段階で「関数」を「分別」するの?
・問題として、動的でなければならないもの(順番が変動するもの、数が流動的な物、存在が不確かな物が該当)と、静的なものがあり、上記の例のような関数式は静的コンパイルが可能で、動的式(Zオーダーされたポリゴンの座標変換式や、人間の操作系による影響)は、コンパイルがJITとなる。
・その分別に対するツリーボットやクローラーはいつ動く? あるいはそういったものはそもそも必要なのか? ツリーボットやクローラーはGCと同じようにタイミングを見なければ非効率的になるものでは。

とりあえず後日追記

カテゴリー: 未分類 | コメントをどうぞ

◇Amadeus
・完成できるか?

◇Kleio
・時間はなさそう。

◇Harware
・時間はなさそう。

◇Working
・分岐点にいる。
TA的要素をもっと磨かなければ?

◇Private
・今年はもっと遊びたいな。
遊び方を覚える年でありたい。

◇Total
今年も早く終わりそうなので、早いうちから手を打つこと。
昨年度は手遅れになりがちだった。
気をつけよう。

カテゴリー: 未分類 | コメントをどうぞ

ODP: RulingFactory

ODP: Original Design Pattern

ルーリングによる管理メソッド。このルーリングパタンの概要は以下。
・共通化されたルーチンと外部ルールによるFactoryパターン
・ルールはハッシュ化された辞書。

これはIMEなどの言語処理、またスクリプティブな/仕様がよく変更される場合においてのデータ処理に役に立つ。

 

外部設計

・ルーリングは、主にKey-Valueの関係で動作する。

実装のモデルは以下のようになる。

ルーリング辞書シングルトン
↑↓  ルールのやりとり
ルーリングコンパイルクラス
↑データ       解答↓
実装クラス 

(※後で図にでもしよう)

 

内部設計

◇ルーリング辞書クラス
・シングルトンで動作する。ルールは単一化されるべきである。
・ルールデータを管理し、シリアライズ/デシリアライズするなどして可視状態にする。

ルーリングデータはDictionary<String,Dictionary<String,Token>>などで作成される。
最初のDictionaryはルールのヘッダ
二番目のDictionaryは各トークンに対する「キー」ヘッダである。

◇Token
・Tokenは、各ルールを解釈するために扱う単位クラスであり、コンパイルはこのTokenを用いて情報を解釈する。

Tokenは「単一の処理に対する」コンパイラ・クラスであり、ルール情報を持つ。
このクラスの変数設計はシリアライズされるため過度に変えるべきではない。
また、目的に応じて動的に処理を作成する必要がある。

以下はスクリプトコンパイラにおける処理の一例。
public class EventToken
{
        public String header; //処理のヘッダ名
        public String initParam; //デフォルトとなる初期値
        public String data; //データ
        public String Type; //データのタイプ
        public Boolean key = false; //この情報がスクリプトに必要なキーであるかどうか
        public List<String> SetParam = new List<string>(); //
}
public class EventDef
{
        public String header;
        public String tag;
        public List<Token> token = new List<Token>();
        //外部からTokenを設定
        public void SetTagData(String _tname, String data)
        {
            foreach( Token _a in token )
            {
                if( _a.name.Equals(_tname) )
                {
                    _a.data = data;
                }
            }
        }
        //トークン情報をカウントする
        public int TagDefCount()
        {
            return this.token.Count;
        }
        //トークンのキーの数をカウントする
        public int KeyDefNums()
        {
            int c = 0;
            foreach ( Token _a in token )
            {
                if (_a.key)
                {
                    ++c;
                }
            }
            return c;
        }
        //トークンを使って展開する
        public String ExpendTagDef()
        {
            String str=”[“;
            str += tag;
            foreach( Token _a in token )
            {
                str += ” “;
                str += _a.name;
                str += “=\””;
                str += _a.data;
                str += “\””;
            }
            str += “]”;//\n”;
            return str;
        }
    }
}
ルーリングコンパイルクラス
(コンパイラの実装部分のみ)
ScriptCode = “”;
EventDef t = new EventDef();
if ((t = GetTagData(tag)) != null)
{
  foreach (Token tk in t.token)
  {
    try
    {
      if (tk.key)
      {
        if (this.token[tk.name] != null && this.token[tk.name] != “”)
        {
          t.SetTagData(tk.name, this.token[tk.name]);
        }
        else
        {
          if (tk.key)
          {
            //このパラメタはキーであった。
            //スクリプトコードの出力をクリアして中止する。
            ScriptCode = “”;
             //エラーメッセージ
             Logger.Log(“キープロパティが設定されていませんでした”);
             return -1;
           }
         }
       }
     }
     catch
     {
        //エラーメッセージ
        Logger.Log(“不正なキープロパティが設定されています”);
      }
    }
    ScriptCode = t.ExpendTagDef();
}

ルールに使う「tag」ヘッダを用いて、コンパイラから処理の区分けを受け取り
コンパイラのトークンに「data」値を流し込み、展開を行う。

このコンパイラは上位の処理でコンパイルデータ・クラスを作っていたため
汎用性のある部分のみを抜粋した。
→あとで追記する。

 

[設計上の注意]

・汎用設計上好ましいのは、「すべてのデータタイプに対応する」であるが、やりすぎると可読性と処理速度の低下を招くので、分けたほうがわかりやすいのであれば、データの種別ごとにルール化するのが望ましい。
・よくわからん場合、「辞書を引いて翻訳する」という表現をすると理解しやすい。このコードって何?って聞かれたらそう説明するといい。
・Tokenにデータを流し込まず、Token自体にCompileメソッドを作るのもいい。

 

[あとがき]
・ざっくり書いたのでソース部分を後でまとめなおす。
・Wordpress初投稿。正直Liveのほうが好きかも。

カテゴリー: 未分類 | コメントをどうぞ

The Law of Simplicity 1/10

見つけたのでちょっとずつ超訳。

1. REDUCE

シンプリシティを達成する最も簡単な方法は、
"よく考えられた削減"です。

> 「Simplicity Law」より一部抜粋
システムをシンプルにする最も簡単な方法は、機能を取り除くことです。
例えば、今日のDVDプレイヤーを例に上げましょう。
あなたは映画が見たいだけだとします。
「見たいという目的のため」だけにしては、あまりに多くのボタンがありすぎますよね?
その機能をシンプルにするためにはどうすればよいか?
解決策として(最も簡単なの)は、再生ボタン以外の余計なものを取り除くことです。
巻き戻し、早送り、取り出しなどのボタンを取って取って取って………

しかし、好きな場面を繰り返し見たい場合はどうでしょうか?
トイレが我慢できないときは、映画を停止したくありませんか?

基本的な質問です。
簡単さと複雑さの間のバランスはどうすればいいでしょうか?

どれくらい簡単にできる?←→どのくらい複雑であればいい?

人はある一方で、製品かサービスは使い易くあるべきだと思っています。
しかし、そのまた一方では人ができるあらゆるすべてのことを肩代わりして欲しいとも思っています。
「理想的なシンプリシティ」に達する過程は、本当に複雑な事もあります。
できうる限りで、簡素にしましょう。
シンプリシティを達成する最も簡単な方法が、"思慮深い"削減です。
疑問が浮かぶものなら、とりあえずそれは取ってみましょう。
しかし、取り除く際には重々注意してください。

カテゴリー: 未分類 | 1件のコメント

にゃにゃんにゃにゃーん

にゃにゃにゃーにゃにゃーにゃにゃにゃんーん
にゃにゃにゃにゃにゃーーにゃにゃーにゃーんーん
にゃにゃにゃにゃにゃーーにゃーーにゃにゃんーん
にゃにゃにゃにゃにゃーーにゃーーにゃにゃんーん
にゃにゃにゃにゃにゃーーにゃーーーーんーん
にゃにゃにゃにゃにゃーにゃにゃにゃにゃにゃんーん
にゃにゃにゃにゃにゃーにゃーにゃーーーんーん
にゃにゃにゃにゃにゃーーにゃーーーーんーん
にゃにゃにゃにゃにゃーーーにゃにゃーにゃんーん
にゃにゃにゃにゃにゃーーにゃーーにゃにゃんーん
にゃにゃにゃにゃにゃーーにゃにゃーにゃにゃんーん
にゃにゃにゃにゃにゃにゃにゃにゃーにゃーにゃんーん
にゃにゃん
カテゴリー: ぷるぐらむ | コメントをどうぞ

初期ロットは不良品☆

 http://www.codinghorror.com/blog/archives/001313.html
 これはまじであるある

 

私は今までにリリースした、あらゆるソフトウェアに対して何かしこりをのこしています。
その原因の一端として、私が多くのソフトウェア開発者のように完全主義者だからでしょう。

まあ、それは置いとくにしても。
また、別に、その、"必然的"な・・・・・・・・・・

「やべえ」
・スケジュールは、アグレッシヴ過ぎて、かつ短過ぎました。もっと時間が必要です!
・予期しない技術的な問題に出くわし、やむを得ず不安な応急処置を施す必要に迫られました。
・間違ったデザインを使ったがために、開発の途中でそれを変える必要がありました。
・私たちのチームは、私たちが予期しなかったチームメンバーの間のイザコザを経験しました。
・顧客はおっさんではありません。
・デザイナーと、開発者と、プロジェクト・チームとのコミュニケーションは思ってたほど効率的ではありませんでした。
・生産性より好奇心に負けてしまったのでした。(どうしたら新技術を吸収できるかに注力しました)

まだまだあるよ!

ソフトウェア・プロジェクトが失敗する理由は、実にいろいろあります。
開発サイクルとは
はじまりにあなたが思い描いていたソフトウェア工学においての栄光の記念碑に対し、
その輝かしさの見る影も無いソフトウェアとなって終焉を迎えるものです。

それは、あなたを降参させるべく誘惑するでしょう。
───ソフトウェアを出荷する前に、見直す余裕が持てるほどに
より多くの時間をスケジュールに追加するために。
結局のところ、本当の開発者が乗ってくるので。

 

そうじゃないよ!と言うためだけに、私はここにいます。

そう、あなたはこのプロジェクトで超たくさんの間違いをしました。
しかしながら、あなたはその超たくさんの間違いにほとんど気づいていません。
そして、あなたがこのバージョンを出荷して、
ユーザと顧客の正面でそれを得るまでそれらのものが何であるかを見つける他の方法は全くありません。
私は、ドナルド・ラムズフェルドがそれを最もよく置いたと思います:

 

As we know,
There are known knowns.
There are things we know we know.
We also know
There are known unknowns.
That is to say
We know there are some things
We do not know.
But there are also unknown unknowns,
The ones we don’t know
We don’t know.

私たちが知るということは
みんな知っているということだ
それを理解することも知っている。
また、私たちはたぶん知っている
未知のものがあるということも。
すなわち
私たちが知る情報は少なく、私たちは無知であるということだ
しかし、彼らは無知であることを自覚せず自分勝手である。
私らは、みなばかなのだ

 

必然のプロジェクトの終わりの修羅場
───妥協、明らかに修正の余地がある手当て、および部分的なソリューションが、充満している環境
に直面して

あなたは、うずくまって傷の手当てをするくらいはできました。
あなたは、それをリリースする前に
このバージョンを修理、再編成するために数カ月を費やすことができました。
あなたは、世界でソフトウェアのさらに別のバギーの、
そして、不完全な塊を解き放つ前に工学を正しく得るという困難な電話をかけるために
自分に関して気持ちよくさえあるかもしれません。 ※1

残念ながら、これは失敗するバージョンを出荷するよりさらに大きい間違いです。

無菌の、そして、孤立している研究室でこのバージョンを修理するのに3カ月を費やすことの代わりに、
あなたはあなたのソフトウェアの全くライブで
神にとって正直で、迷惑な熱心なユーザからフィードバックを聞くのに
その3カ月の同じ期間を費やすことができました。

ソフトウェアとして想定するのは違います。
ユーザーとして、あなたは本当の世界に存在している彼らを想定するべきです。 ※2
あなたは振り向くことができます、
そして、それが指示した使用は、困難な用法であなたのユーザからデータを叙述しました。
(バージョン1のすべてのいやな部分を固定するだけではなく、
より効率的にあなたの全体の開発予算を費やすための本当の世界フィードバック)

今、クソバージョンでリリースしようとするなら、私はあなたのことを言っていません。
私を信じてください。私たちは完全論者のはずですです。
しかし、本当の世界は残酷で、私たち完全論者にとって、容赦ない場所であるかもしれません。
あなたのソフトウェアが本当の世界の磯でダウンするとき、失望が必然であると行ってわかるのは、より気が確かです…
しかし、定着性!
初期リリースの大部分は重要なものではりません。
なにものもv1.0を当惑させていないなら
あなたは、それを十分早くにリリースしなかったと言えます。

しかし、(問題は)ソフトウェアをリリースした後のあなたの行動。

ユーザフィードバックへのあなたのチームの速度と反応性は
どんなただ一つのリリースもかつてそうすることができたよりあなたのソフトウェアのためのトーン、
はるかに多くを設定するでしょう。
それは上達するべきあなたが、必要があることです。
神話的で、完全なソフトウェアを出荷するプラトニックな理想ではなく、
あなたのユーザ、あなたの顧客にとって敏感で、絶えずあなたのソフトウェアを改良して洗練する行為で
それを示している存在が彼らのフィードバックを基礎づけました。
それで、あなたが近く完全なソフトウェアリリースのために最適化しているという範囲に、
あなたは間違ったもののために最適化しています。
どういった時間予算があるかに関してあなたが実際に可能で、
次に、費やすのと同じくらい早く急速に本当の世界フィードバックに基づく
あなたの時間の繰り返しの残りをリリースすることによって、より良いソフトウェアで終わるという疑問が全くありません。
それで、これで私を信じてください:

バージョン1がどんなにクソでも、とにかくそれを出荷することです。

 

/*

後半はだるくなったので手抜き。。。

ゲームではまだこの手法は叩かれるよなあ・・・・・・・・・・
コンシューマがいよいよなくなってくれば、メーカーとして箱のやり方が主流になるとは言えるけど
レベルデザイナーが最初からきちんと仕事をしないゲームは、たぶんVerUPしてもゴミだと思う。

*/

カテゴリー: 未分類 | 2件のコメント

ブロークナイズ・コールド・カプセル

 チーム開発における、多重継承の可能性。
 委譲のほうが問題なく良いが。

 

チーム開発上、グローバルアクセスをさせたくはないが
それと同じレベルでのグローバルレベルのアクセス権を持たせたいオブジェクトがある。

そういったもの、他者との関連性を積極的にもたせる設計として。
カプセル化とはまったく違った概念を貫く開発の際
何が一番効率的か考えた結果、なんと「多重継承」に行き着いた。

基底クラスのマージモジュールが、ある程度のレベルでしっかりしているのなら
委譲のほうがセキュリティ上問題ないのだろうが。

そうでない場合。
単純に他者の「作らているはずの」関数に関して、アクセスを頻繁に行わせる場合
あるいは、他者が書くコードの遷移先が特定の画面に積極的に効果を及ぼす場合に関して
それがカプセル化された設計であればあるほど、手続きが非常にめんどくさい。
よって、アクセスを自己完結させがちだから、UIも何もかもが単調になりがちだ。

この現象を、いまから「コールド・カプセル」と命名することにする。

なので、他者を完全に信頼しきった設計にすることで、この冷たい空気を取り払おうというのが主な趣旨だ。
(他者に壊されないように、という発想ではなく、「そんなことはするはずがない」という信頼関係を持つこと。)
ゲームの根本原理と同じだ。
「こうされるとユーザーがやり直しになってきつくて死んじゃうから、救済アイテムを置いておこうね」
 く そ っ た れ が !

こういった要らない親切さから、さっさと切り捨てるべきものなのだ。
これを取り込む際、開発者視点としては
明らかにいじくると壊れるとわかっているパーツと壊れないパーツの区別がつかないほどの
つまりは、コーディングセンスのない人間は、この際要らないのだと宣言することになる。
それでいいんじゃないか?
ゲームの例であげるなら、ゆるゲーマーは去れってことになる。

現代の開発手法として、カプセル化とかの概念はややゆがんでいて
クラス・コンポーネントを「単品」として考えがちだ。
その設計にあうようにほかの部分を作っているもんだから、結果的に再利用性が微妙な代物が出来上がる。
再利用性を高めるための仕様なのに、あとで使いまわす際にいちいち改造するのは手間だ。
それってコピペと何が違うのかといわれると、はっきり言って回答の仕様がない。
なにより、そこまで考えてコーディングできている環境なんて少ないだろう?
日本は再利用性があるものを作っても、それを社外に持ち出さない。
あるいは(何かを)売ることしか考えていない人材しかいない。
オープンソースとかそういう独善偽善レベルでの問題で解決できるレベルではなく
もっと、平和的な設計が必要だ。

次世代的なモノとして、他者のオブジェクトに積極的にアクセスするという手法は取り入れられるはずだ。
またゲームの例を挙げるが
人物Aがメインフローを担っていて、既に基礎を(ある程度動くとされるレベル)組んでおくとする。
そのうえで、新米BとCがそれぞれタイトルとコンフィグ画面を作っているとする。
Bが作ったタイトルと、Cが作ったコンフィグは、Aが作ったメインフローのクラスを継承し、ダイレクトに関数と変数にアクセスできる。
最近はSubversionなんてフリーのものもあるから、クラスの更新管理も楽チンでよい。

そして問題の例を挙げる。
Cが作ったコンフィグが、Aの作ったタイトル画面のあるパーツをリンクさせたいと言い出した。

ここで、カプセル化された手法であれば、問題が発生するだろう。
なぜなら、カプセルかされているはずの各パッケージが、他クラスにアクセスするためには
一度親を介さなければならないからだ。
まず、ここに障壁が存在する。熱意が小さいものであれば、それは簡単に打ち消されてしまうだろう。
そして究極的なトドメが存在する。
親をアクセスするということは、ここでAの許可を得なければならないということだ。
Aの許可が必要ということ、すなわち親に手間をかけさせるということを、日本人は特に固執して嫌う。
上司であることが多いからなおさらで、個人解決できる手法を見つけようとするうちに熱意はすっかり冷めてしまうだろう。
Aがそれを認めないという可能性すら出てくる。

ここで多重継承の出番だ。多重継承した場合、BとCのクラスは、立場的には並列とされる。
さらに、変数および関数ですらAの派生クラスとしてマージされるので
結果的に、BとCは互いのクラスを相互参照できることになる。
これは、チームで開発する上で多大なメリットになりうる。
継承先に公開できるメンバは、BとCがそれぞれ選べるし
なにより立場的に同じBとCであれば、「非公開メンバへのアクセス許可」のお願いもすんなり受け入れられるだろう。
(立場的に違う人間が同じレベルのモジュールを作っている場合は、それは組織的に問題がある気がする。)
Subversionでの更新一発でその夢のクラスは完成できる。
作りたいものを作っていけばいくほどに、その夢が広がっていく可能性もある。

「閉鎖的に」は、問題を解決はするが未来を完全に遮断する。

その開発コンセプトが間違っているとはいえない。
銀行のシステムにこの多重継承システムが使われたら、俺はきっと発狂するだろう。
閉鎖的に閉鎖的に行うほうがよいプロジェクトはほかにも多数存在するはずだ。

しかし、大多数のエンターテインメント的なものはそうじゃない。そうであるべきではない。
エンターテイナーになるには、相互的な会話が必要だ。
開発趣向自体から一方通行の会話をしていて、どうして面白いものが作れようか。

耳と目を閉じ口をつぐんだ人間が他人を楽しませようとするなら、すべては破綻する。
まずは基礎から考え直す必要があるんじゃないか?

 I thought when I’d not know ever, they’d pretend they was one of those deaf-mutes.

カテゴリー: 未分類 | 1件のコメント