2008年10月15日

[開発] 分散バージョン管理を使ってみている その3 Mercurial編

Mercurial TortoiseHg

前回に引き続き、分散バージョン管理ソフトについてのお話です。

Mercurial という Python 製の分散バージョン管理ソフトもあります。
大きなプロジェクトでは Mozzila のバージョン管理に使われています。

Mercurial雑感

こちらは、今のところ日本語文字コードの対応など
Windowsでも比較的安心して使えるようです。

何故、Mercurial = hg なのかっていうと、コマンド名が hg だからです。

TortoiseHgというエクスプローラー統合の GUI ツールもあります。
上記画像はTortoiseHgのものです。

ただし、付属のdiffツールが文字化けたりするので、
小物ツールを別途用意する必要があります。
また、「ファイル名の変更」などGUIでは足りないコマンドがあるので、
コマンドラインも使えるようになっておくことが必要です。

GUIの充実はまだこれからと言ったところですね。

とはいえ、コマンドラインでは十分使えるようですので、
今から触っておいて損はないと思います。

コマンドライン版の入門には、下記のページが参考になりました。
(まだ読んでいる途中)
『特集:Mercurialではじめる分散構成管理|gihyo.jp … 技術評論社』

自分はコマンドラインは毛嫌いしていたのですが、
gitで使ってみたりして大丈夫になりました。

また、Tortoiseなんとか、みたいなGUIツールも結局は
コマンドライン版をラップしたような形なので、
憶えておくと GUIツールの方も機能対応がわかり、
非常に使いやすくなります。

Subversionとの相互運用ですが、現時点では hg convertという
変換機能はあるみたいですが、まだまだ微妙な動きのようです。
hg svnみたいな外部ツール(プラグインやスクリプト)もあるみたいですが、
まだどうも相互運用には厳しいようです。

これは相互運用は過去の資産をいかせるという意味からも
すごくよい機能なので、今後に期待したいです。
(この辺のことを重視している git はさすがという感じ)

Mercurialのことは、wikiに少しずつまとめています

Mercurialのリポジトリホスティング

gitに対するgithubのように、
Mercurialに対応したリポジトリホスティングもいくつかあるようです。

例えば、

などがあります。

そういや、gitのリポジトリホスティングもgithub以外にけっこうでてきたみたいですね。

さて次回は、Bazaarと行きたいところですが、
まだMercurialを使いこなせてないので、
もう少し使ってみてからにします。

最後に、ぜひ、みなさんも
分散バージョン管理ソフトを使ってみては?と思います。
それでは!

参考リンク

[ 開発 ]

2008年10月12日

[開発] 分散バージョン管理を使ってみている その2 git編

gitk

前回に引き続き、分散バージョン管理ソフトの話です。

最初は Linux の Kernel ソースのバージョン管理にも使われている git を使ってみました。
Ruby界隈で流行っているみたいで、Ruby on Railsのバージョン管理にも使われているようです。

ちょっと使ってみたところ、
git は Windows 環境だとなかなか厳しい感じです('A`)

  • CRLFの扱いが変(diffとか)
  • cygwin版での文字コードがらみ(日本語ファイル名が×)
  • TortoiseSVNみたいなGUIツールがないので人に勧めにくい

などなど、細かいところは大分解決できましたが
本番環境で使うにはかなり問題があります。

GUIで履歴表示する gitk とかは結構、見やすいんですけどね。
(記事上の画像はgitkです)

gitのすごくよい点としては
Subversion からの変換や相互運用の簡単さみたいで
git svn なんてコマンドが用意されてます。

Subversion対応しかないGoogle Code Projectでgitを使おう、なんていう記事もありました。

まーつまり、Subversionのリポジトリ(ソースコードの倉庫)から
git に引っ張ってきて(pull相当)、
git で編集して(コミット)、
また Subversion のリポジトリにもどす!(push相当)
みたいなことが簡単にできるようです。

gitに関するトラブルやTipsなどは、wikiにまとめておきました
でも今はMercurialに移行中なので、あまり更新されないかも ^^;

Unixで使うにはすごくよさそうなツールなんですけどねえ。

リポジトリホスティングgithub

実はgitには、 github
なんていうリポジトリを貸してくれるサービスがあります。
オープンソースプロジェクトのような公開プロジェクトの場合、
現在は100MBまで無料で利用できます。

これがどうも界隈で git の火付け役になっているみたいです。
Ruby界隈その他ではかなり使われているみたい。

また、githubの面白い試みに、Gist
というソースコード貼り付けサービスがあります。
単一のソースコードを貼り付けられる系のwebサービスで、
それをgitでバージョン管理してくれるというものです。
webサービスですが、コマンドラインからでも管理できるとか……。

gistに貼り付けてみたサンプルはこちら
gitstに貼り付けたコードをblogなどに埋め込むこともできるとか。

実は自分もgithubを、ちょこちょこと使ってみています

Delphiのexeをバンバンコミットしてpushしていると、
100MBだとすぐに一杯になりそうに感じました ^^;;

他にもgitのリポジトリホスティングはあるよ

githubの他にもgitのホスティングサービスはあるようです。

  • Assembla
    プロジェクト数無制限。200MB。svn,Mercurialにも対応。Trac,wikiつき。
  • Unfuddle
    プロジェクト数1つ。200MB。svnにも対応。
  • Rubyforge
    ※Ruby用です。最近 git 対応になった。

githubの影響かいろいろなところがgit対応になってきてますね。
sourceforgeもそのうち対応するんじゃないんだろうか?

次回は……

次回は、別の分散バージョン管理ソフト、
その3 Mercurial編です。

参考リンク

[ 開発 ]

2008年10月09日

[開発] 分散バージョン管理を使ってみている その1 利点編

最近、ソースコードやドキュメントの管理に
分散バージョン管理ソフトを試してみています。

具体的には gitとMercurial(hg)を使ってみています。

利点とか

それら分散バージョン管理ソフトを使ってみて感じた利点は以下の通り。

  • 中央集権的でない使い方が可能
  • サーバーにつながっていない時も使える(!!)
  • 分散=分散バックアップにもなる
  • ブランチ(枝分かれ)が簡単
  • 複数人でかなり作業がしやすそう

などがあると感じました。

分散型の利点

以前使っていた、cvs や Subversionは、
中央集権型のため、
ひとつのリポジトリ(ソースコード置き場)に対して、
コミット(変更の反映)したりしていました。
例えばそのリポジトリはサーバーなんかに置いていました。

で、サーバーと繋がっていないと、
ちょっとした変更もコミット、反映できなくて困ったりしました。
(社内サーバーとかだとよくある)

ところが分散管理だと、
他のリポジトリから clone(リポジトリの複製)すると
まず手元にリポジトリそのものを持ってきます。

この時点ですでにバックアップにもなっています。

その後は、ソースを編集したら
手元のリポジトリにコミット(変更の反映)しつつ、
サーバーに push (リモートのリポジトリに反映)します。

手元でコミットするだけならサーバーはいりません!
つまり、会社を休んでスタバでプログラミングしつつ、その場でコミットしたりバージョン管理ができます!!
(マクドでも可)

素晴らしくないですか?

誰かがサーバー側に push した場合など、
サーバーに上がった変更を持ってくる時は pull します。

ブランチ作業のしやすさ

また、これらの作業、つまり
リポジトリのclone、push、pullはサーバーがなくても手元のリポジトリ同士でもできます

これを使うと簡単にブランチ(枝分かれ)が作れます。

例えば、サーバーから clone してきた、
もしくは pull してきたリポジトリとソース一式があります。
この手元のリポジトリは絶賛開発中なのですが、
クライアントや上からの要望でちょっとした変更を
試したいと思いました。

この時は、開発中のリポジトリとは別に
新機能用のディレクトリに cloneします。
新機能用リポジトリができますので、
それに新機能を足して編集してコミット。

あとは、新機能が実装できたら全部コミットして、
元の開発中のリポジトリに push します。

もし、新機能がいらないやと思ったら、
ディレクトリごとポイッと削除してしまえばいいです。

開発中のと新機能のと、
ソースコードの結合、衝突の回避(merge作業)など、
後の作業はあるのですが、
何がすごいかというと、これが全部サーバーなしで
手元で簡単に低コストでできてしまうことです。

これは分散バージョン管理を使わざるを得ないのではないか!?
と思った次第です。

次回は……

さて、次回は、実際のソフトを使ってみた雑感をお伝えします。
その2 git編です。

参考リンク

[ 開発 ]

2008年10月08日

[雑記] 当日記で不快だと思われる記事を再編集しました

いくつか他のサイトで取り上げていただいき波紋を呼んだ記事ですが、
時間がたつにつれ

  • 客観的に見て、十分に不快だと思う
  • 自分にも非があると認めざるを得ない
  • あえて、他人を貶める必要はない
  • 他を攻撃することは建設的ではない

などと思うようになり、上記の理由により再編集させていただきました。

具体的には

  • エントリーに謝罪文の掲示
  • 詳細として、当エントリーへのリンクの付加
  • 該当記事エントリーを style="display:none;" により非表示に

という処理を行いました。

エントリーごと削除しないのは

  • 都合の悪い記事を消すだけというのはフェアじゃない
  • リンクから来た人がページがないと奇妙に思う
  • リンク切れ自体が不快感に繋がる(これは個人的な感覚です)

と考えているためです。

一部の人に不快感を与えてしまい申し訳ありませんでした。

[ 雑記 ]

2008年09月25日

[Delphi] class helperが使えない件

いろいろ実験していたのですが、
Delphi8辺りから導入された class helperが結局のところ使えない件。
(今更ですけどw)

簡単に言うと、2つ以上の class helper が同時に適用できない。

コード:

実行結果:

Count = 3
All = Hoge in test, Moge in test, Mage in test,

Hit RETURN key!!

上記のコードの場合、
TListTestClassHelper だけが適用され、
TAspectClassHelper が適用されない。

class helperをそれぞれ各ユニットに分けた場合、
usesした順序でどれが適用されるかが決定されます。

う、うーむ。
いざと言うときに困る仕様だなー。
まあ、当初から言われていた不都合だけども。

もし複数class helper適用が可能ならば、
Ruby並みの mixin が可能な柔軟性を秘めるのですが……。

……でも、実は、
すでに似たようなことはできるんです!

必殺型キャスト!

実行結果:

start - TStringList.Add(Hoge)
end - TStringList.Add
start - TStringList.Add(Moge)
end - TStringList.Add
Count = 3
All = Hoge, Moge, Mage in test,
 
Hit RETURN key?

……できてない('A`)

型指定していてダックタイピングぽくなってないし、
こんなの mixin とか言ったら怒られる。
それに同じメソッド(add();)を拡張しようとしても、
2つ同時に適用はできてない。
(そもそも、型安全じゃない件)

全然ダメダメなオチだなあ。

次回は、そろそろ Delphi2009 について語ってみたいところだけど……。

[ Delphi ]

2008年09月21日

[雑記] Perl信者に成功者はいないということはない

お詫び

一部の方々に不快感を与えて申し訳ありませんでした。
エントリー記事の一部を非表示にさせていただきました。
ことの詳細に関しては、『当日記で不快だと思われる記事を再編集しました』をご覧下さい。

[ 雑記 ]

2008年09月20日

[C#, Delphi] C# 信者は特にうざくありません

お詫び

一部の方々に不快感を与えて申し訳ありませんでした。
エントリー記事の一部を非表示にさせていただきました。
ことの詳細に関しては、『当日記で不快だと思われる記事を再編集しました』をご覧下さい。

[ C# , Delphi ]

2008年08月16日

[webサービス] タスクの時間管理によさそうなwebサービス「SlimTimer」

slimtimer.jpg

以前はタスク管理に「Remember the milk」を使っていたのですが、
タスクの時間を測定する、ということを覚えてからというも、
webベースだとイマイチ使いにくい&時間の記録ができない、
ということで、さっくり使える Excel に移行気味です。

今は、Excel + ストップウォッチ + タイマーを組み合わせて、
使っています。

ただこういうのに特化したwebサービスがないのかなあ?と。
以前「はてな」でも質問したのですが回答が得られませんでした
その後「スピードハックス」という本で知ったのですが、
SlimTimer」というwebサービスがあるみたいでした。

SlimTimer」は、
タスクごとに時間を計って、
レポートも作ってくれるようなサービスです。

webサービスなので、
ブラウザ落ちたらどうすんだ!という対策には、
Bubblesという
webサービスをクラアントアプリ化するソフトを使うとよいようです。
(言ってしまうと個々のwebサービス用の専用ブラウザを作るソフトです。Mozilla Prismみたいなの)

 :

と思っていろいろ試してみていたのですけども、
残念ながら「予測時間」の記録や比較できない模様。

タスクの見積もりをするのに、予測時間の記録、記述は必ず必要になります。
残念ながら使えないかも……。
(作業記録としてコメントが残せたり、タグ付けやレポート出力はすごくいいのだけどもー)

一応要望にestimate timeうんぬんという投票があったので、
voteしておきました。

Excelに戻ります λ...

(関係ないけど、webサービスはクライアントアプリには勝てない側面はあるよなあ、と最近よく思う)

参考リンク

[ webサービス ]

2008年08月09日

[ダイエット] ふはは!6ヵ月目でちょうど10kg減。ダイエット成功!

diet_2008-08-09.jpg

先日、『[雑記] ダイエット成功?5ヶ月で 約9kg減』
なんて記事を書きました。

そして先週の記録でちょうど、
今年2月からダイエットを初めてから、
ちょうど -10kgに成功しました。

2月 76.0kg→ 8月 66.0kg (-10kg)

ヽ(`Д´)ノ やったよーー!!

無理なく楽に続けた結果がこれだよ!!
実際、昼、夜の食事はふつーにとってこれだよ!!
(もともと朝食抜き派)

ちなみに、1年で -10kgという目標を立てて取り組んでいたのですが、半分の半年で達成しました!

ただ、BMIがまだ 25切ったばかり
(つまり、デブからようやくふつーの体型になってきた)
なので、まだまだ気を抜かないようにしないといけないです。

また、前にも書きましたが、
基礎代謝(1日に何もしなくても消費するカロリー)が
下がりまくっているので、
基礎代謝をいかに高める(保持する)かが今後の課題です。

ちなみに基礎代謝の推移、

2月 1674kcal → 8月 1539kcal(-135kcal)

1日に135kcal分といったら、
コカ・コーラ 350ml 1本よりちょっと低いくらい。

つまり、1日にコカ・コーラ 350ml 1本分止めたくらいでは、同じようには痩せないようになったというわけ。

1ヵ月換算だと、4185kcal で約0.58kg分痩せにくい!

そりゃ、後半は痩せにくくなるわww

次の目標は 6ヶ月で60kgを切る!(-6kg減)と
行きたいところで、カロリー計算をすると、
1日230kcalの削減でOKとなりますが……。

しかし、正直なところ、今の「食事はふつーにとる」戦略では
基礎代謝の低下を考慮に入れてカロリー計算をすると、
あと半年で 60kg を切る(-6kg)のは難しい(´д`)。

今やっている「ダンベル体操」が地味に基礎代謝に効いてくればあるいわ……。

というわけで、難しいながらも挑戦するぞ、ということで、

 次の目標は、あと半年で6kg減になりました!

もちろん、合言葉は 無理なく楽に痩せるです。

※カテゴリに「ダイエット」を追加してみた。

[ ダイエット ]

2008年07月31日

[雑記] 韓国ドラマ「商道(サンド)」見終わりました

最近、TVドラマで自分がハマっていた、
BS朝日で放送していた「商道(サンド)」が先日ようやく完結しました。

時代劇でしかも商人のドラマ、というと非常に珍しい感じがして見始めました。

実は、「チャングムの誓い」、「ホジュン(男の医師の物語。チャングムの前身とも言うべきドラマ)」の演出家がスタッフにいるドラマ、ということで期待していたのですが、これが大当たりでした。

「ホジュン」もそうなんだけど、
韓国ドラマは時代劇がかなりおもしろいのでは?と思ってしまう。

さて、「サンド」は、商人で朝鮮一の大富豪になった「イム・サンオク」の生涯を描いた史実に基づいたドラマです。

このドラマの見所は、
「チャングムの誓い」よろしく、
謀略につぐ、謀略、一難さってまた一難、
敵の陰謀を潜り抜けていく主人公達を見られるところ。

中盤から終盤にかけて、ライバルの商団との対決になるのですが、
もう、あの手、この手で主人公の商団を、人民もろとも蹴落としにかかってきます。

  • 朝鮮人参を栽培中のところを山賊を使って襲い、農夫達を惨殺。
  • 輸送船を焼き討ち
  • 優秀な人材を引き抜き(結局、引き抜かれた人物がラスボスになるんだがw)
  • 主人公達が仕入れようとする商品の原料を買占めて、損害
  • 戦争が起きるとデマを流し(かなりの犯罪級)、損害
  • 主人公達が配送を請け負った市民に配る配給米に砂混ぜて台無しに
  • 裏金、裏金、とにかく裏金
  • 高利貸しに手を出す→市民から吸血
  • しまいには、口封じに主人公の商団の長までをも殺しにかかる
  • 最後には、お金の偽造
  • etc...

お前らには人の血が流れていないのか……と(つд`;)

一度は、商団を崩壊にまで追い込まれますが、
なんとか巻き返し再建しようとする主人公達。

涙ぐましい努力を見せてくれます( ´д`)

このドラマで何度も出てくる言葉(というかテーマ)

 「商売とはお金を残すものではない。商売とは人を残すものだ」

いい言葉ですわ。

ちょっとしたところでは、
役者が個性的なのもよいところですね。

とにかく、ヤバイ人が多い。
なんていうか、頭悪い役の人がみなウマイんですwww
掲示板なんかで、本作はDQN(頭がヤバイ人)が本当にヒドイと言っていた人がいましたけど、まさにそう。

今回のドラマは、チャングムのスタッフ系では珍しく?ハッピーエンドちっくな終わり方をしたので、すっきり寝られます。

「チャングムの誓い」おもすれー、
韓国の時代劇おもすれー、
などと思っている人は、間違いなくハマるので、
機会があればこのドラマも見て見られては?と思います。

gdgdな感想ですが、この辺で。

参考リンク

[ 雑記 ]

2008年07月20日

[ダイエット] ダイエット成功?5ヶ月で 約9kg減

ダイエット

ダイエット開始してから 5ヵ月経過しました。
途中経過報告です。

左の元の数値は、去年の5月に偶々残っていた
(かなり太っていたころの)記録です。

体重:76.5kg → 67.3kg(-9.2kg)
体脂肪率:30.7% → 20.8%(-9.9%)
BMI: 28.8 → 25.3(-3.5)
体年齢:48歳 → 37歳(-11歳)
ウエスト:104cm → 89.7cm (-14.3cm)

ゆっくり無理なく痩せた結果がこれだよ!

目標は1年で 10kg 減というスローダイエットでしたが、
余裕で達成できそうです。

それにしても、
さまざまなダイエット法をチャレンジし続け、
今まで何一つとしてまともに続けなかったのに、
今回は続いて結果が出ていてびっくり!

それはそうと、
はけなくなって新調したばかりのズボンが、
ブカブカ になってそれもびっくり!だよ。

とはいえ、まだまだ体年齢が実年齢より 10歳近く高い w
ウエストや体重も、
運動をしていたころと比べると
まだデブデブなのでこれからといった感じです。

現在は基礎代謝がかなり減ってきていて、
燃焼効率が悪く、痩せにくくなってきたので、
基礎代謝を上げるようなトレーニング
(というか体操)
を1日15分程度少し取り入れてみています。

こちらは、3ヶ月くらいしてから結果が出てくる(気が長いw)、
ということなので、ゆっくりやっていきます。

まああせらないのがコツですね。

また、しばらくしたら報告します。

※あれ?前のダイエット開始時の記事消しちゃったかな……?

[2008/07/20]
※上の元の値は去年の記録なので、厳密には「5ヶ月で9.2kg減」ではないですね。タイトル変更しました。
※ダイエット開始時、今年の2月中ごろは 76kgなので厳密には「5ヶ月で8.7kg減」ですな。

[ ダイエット ]

2008年07月15日

[開発] <警告!>まだあなたのゲームにリプレイ機能を実装してはいけません!なぜなら……(後編)

この記事を読まずに、あなたのゲームにリプレイ機能を実装するのはあまりに危険です……。

なぜなら……。

gamedev02.jpg

前回のゲームにおけるリプレイの実装方法の続き、後編です。

お読みでない方はまずは前回からどうぞ。

乱数の処理

乱数は再現可能なものを使います。
最初に使っていたのは線形合同法でした。

GuNMeNのときは何を思ったか、
あらかじめ線形合同法で生成しておいた65536個の乱数テーブルを使ってました。
まあ、これはあまり意味ないです。
(たぶん、家庭用ゲームみたいなことがやりたかったのかと)

今は、乱数生成ルーチンには Mersenne Twister を使っています。
Mersenne Twisterも再現性があります

ちなみに乱数種(シード)の自分で初期化をする場合は、
そのシード値も記録する必要があります。

さらっと書きましたが、最初にまずハマるところですので注意を。

面倒くさいので最近は、乱数種の変更すらしてませんw
つまり、乱数種固定で初期化wwww

また、これは重要な点なのですが、
自分の場合は乱数オブジェクトを複数持っています。
今のプロジェクトだと主にメインの更新処理で使うもの用と、エフェクト用と、描画用を持っています。

乱数オブジェクトを複数持つ利点は、
ちょっとした変更に強いことです。
つまり、ちょっとした変更をしてもリプレイをずらさないようにすることができるのです。

エフェクト弄りたいなーってときは、
エフェクト用の乱数オブジェクトのインスタンスを別に持っていて、
ゲーム進行に影響を与えないようにしておけば、
エフェクトを弄っても、リプレイに影響がでません!!
(逆に、あくまでエフェクトがメインのゲーム進行に影響を与えない前提です。エフェクトの上にキャラクターが乗れる、とかいう仕様では無理です。まあ、そうなったとしても、それをエフェクト以外に割り当てるだけですが)

描画を飛ばす場合は、飛ばしていいものだけを書いておく

更新処理が固定フレームレートベースで、
描画をスキップするような実装をする場合、
前提として、描画処理と更新処理をわけます

そうなると、絶対に実行される更新処理の方(キャラクターの移動とか)は、描画の方に入れないようにする必要があります。

逆に言うと、描画の方には飛ばしちゃいけないものを入れないようにしないといけません。

例えば、こんな感じ。

自分の場合、描画処理でも乱数を使いたくなるので、
描画処理用にも乱数オブジェクトを 1つもってます。
そうすると描画が飛ばされたりしても、
更新処理用の乱数には影響がでません。

ハードウェアは変えないこと

ハードウェアが再生環境と同じアーキテクチャでないとダメだと思われます。
ようするに、リプレイを記録した環境と同じような計算をするハードウェア環境で再生しないとダメです。

これに関しては今は大丈夫ですが、将来どうなるかわかりません。
10年後は再生できる環境が残っているものでしょうか?

極端な例ですが、Intel社のCPUとモトローラー社(以前のMacの)のCPUとでは、
エンディアンが異なりますよね?
考慮していない場合は、同じように再生できません。
(もちろん、浮動小数などそれ以外にも考慮しないといけないものがありますが……。)

リプレイ時にキー操作

リプレイを再生中に、早送りとか、ポーズとか、終了したりとか。
あれ?キー判定どうすんの?

簡単ですよ!
メインで使っている(再生で使っている)キー入力オブジェクトとは別にリプレイ中のキー操作オブジェクトを生成して使うだけです。

だけです、さらっと書きましたが、キー入力周りをそういう風に組んどけってことですw

↓こんな感じ。

記録中は以下のような感じだとすると、

  • Player Aのキー入力オブジェクト(記録中)
  • Player Bのキー入力オブジェクト(記録中)

再生中は以下のような感じ。

  • Player Aのキー入力オブジェクト(記録から再生してるだけ)
  • Player Bのキー入力オブジェクト(記録から再生してるだけ)
  • リプレイ画面のキー入力オブジェクト(記録はもちろんしてない)

再生中のフラグが立ってるときだけ、「リプレイ画面のキー入力オブジェクト」を処理する。
(記録中は生成すらしない)

リプレイ画面のキー入力オブジェクトは、Player A(B)のキー入力オブジェクトのクラスを使いまわしてます(インスタンスでなくてあくまでクラス)。

あらかじめキー入力をクラス化しておけば、こんなのはサックリできますよ。

バージョンアップしても大丈夫なように場合わけする

バグ報告をもらってバグ修正したり、
バージョンアップしたりして、
前のリプレイが再生できなくなったりすると、
かなり萎えますよね?

そこでこの方法をとります。

ひそかに、前述の WireBattler や GuNMeN は、
(リリースした範囲の)昔のバージョンのリプレイも再生できます。

これは、リプレイのデータファイルにバージョン番号を埋め込んでおいて、再生時に古いバージョン番号の場合には、古いルーチンを動かしているのです。
ですので、昔のリプレイも同じように再生できます。

例えば、GuNMeNは最初にコミケでリリースしたバージョンより、
現在のリリースバージョンの方がバランス調整がしてあり、
キーボードでもプレイしやすくなっています。
なんと、その新しいバージョンでも、
昔のコミケの時のリプレイデータが普通に再生できるのです!
(現に、タイトル画面を放っておく事で見られるデモプレイは、昔のバージョンのリプレイをそのままつかっているのです)

その代わり、バグって落ちるリプレイとかは、
バグ報告をもらって直しても、依然、落ちるままですwww
(今はそうそうないですが、未熟な時代に(WireBattlerを作っていたくらいの時)頻発しました)

ただ、パラメータなどを外部に出している時はちょっと処理が増えるので面倒ですが、やる価値はありますよ。

ていうか、このこと初めてかいたよ!
ユーザーの視点から立つとリプレイデータが使えなくなる、ということは避けるべきは当たり前なのですが、やっている人どれだけいるのかなあ。

大体、リプレイ実装の際の注意点はこんな感じですね。

コラム:洋ゲー関係のリプレイについて

個人的には、市販のFPS、RTS類のリプレイが気になっているところです。

昔から FPS、RTSなどは大概可変フレームレートですし、
どう同期をとっているものやら、と。

自分が一時期プレイしてた Tribes 2 なんかは途中から記録して、そこから再生も可能でした。
ネットワークゲームですが、記録するマシンのネットワークが遅くてもばっちり対応できてました。
(Tribes2のネットコードの優秀さは定評があったのをさしおいても)

もちろん、可変フレームレートでも、他機種でも再生可能でした。

あとは、RTSもきちんとできますよね。
自分がよくリプレイを見ていた Rise of Nations や Command & Conquer Generals あたりもかなりリプレイはきちんと動いていました。

ただ、ほとんどのRTSはバージョンアップしたら、
前のバージョンのものが再生できなかったり、
再生できても途中からずれるという、けっこう適当なんだけれども……。
(パラメータやプログラムなどのバージョンわけの仕組みはずさんな模様)

まあ、この辺の洋ゲーマジックは一度暴いておきたいところです。

参考になるのは Quake3 のソースとか、
Torque Engine(Tribes2用ゲームエンジン)とかかな?

まとめ

以上のような形でリプレイ実装の記事を書いてみましたが、参考になったでしょうか?

ちなみに、今回の記事で紹介した実際にリプレイが動いている自作ゲーム「WireBattler」、「GuNMeN」、「GanGanGan 体験版」の全てのソースファイル(Delphi用)は「GuNMeNパッケージ版」に収録されています。

実際にリプレイが実装されて動いているゲームとそのソースファイルが見てみたい方は、お手に取ってみて下さい。参考になるのではないかと思います。
(各ゲームのソースコードは CDの /omake/source ディレクトリに .zipファイルで入っています )

ぜひ、あたなも自作ゲームにリプレイを実装してみてください。
ゲームの提供の幅が広がるはずです。

では、今回はこの辺で終わりにします。
ありがとうございました。

[2008/07/20] 誤字脱字修正。

参考リンク

[ 開発 ]

2008年07月13日

[開発] <警告!>まだあなたのゲームにリプレイ機能を実装してはいけません!なぜなら……(前編)

この記事を読まずに、あなたのゲームにリプレイ機能を実装するのはあまりに危険です……。

なぜなら……。

gamedev01.jpg

さて、ちょっと前の話題ですが、
リプレイに関する話題が流行っていました。

そのことについてうちでの実装方法を書いてみようと思います。

うちの場合は、基本的に入力情報を全部記録して、
再生時に与えてやるという感じです。
いわゆるキー入力記録タイプ

面倒くさい気がしますが、入力情報を取得するAPIやライブラリにラッパーをかませてやれば簡単です。

大概、WireBattlerとか GuNMeNのときに悩みまくったので、
それ以降、このタイプの記録方式ではそんなに苦労していないですね。

自分のリプレイ実装の実績

  • WireBattler:2D格闘ゲーム
    リプレイの他に、もっとも連続技をつなげたところから再生する機能もあり
    固定フレームレート
  • GuNMeN:2D固定画面アクション
    インターネットランキング対応で、他人のリプレイをダウンロードして再生することもできる。
    固定フレームレート。
  • Gan Gan Gan:2Dシューティングゲーム
    今のところ体験版のみのリリース。
    ステージごとに再生が可能。
    可変フレームレート(但しベースは60FPS)

入力情報記録タイプで気をつけることをいくつか

実績を見てわかるように、この記事では、基本ベースフレームレートが固定のものに使えるリプレイのテクニック及び注意点を解説しています。

ぜひゲーム作りにお役立てください。

途中でずれたらオワリ\(^o^)/

この入力情報を記録するタイプでは、
最初から再生して、途中でずれたらそこで失敗になります。
一度ずれたら、その後ずーっとずれっぱなしになるためです。

なので、かなり厳密に作る必要があります。

キー入力の記録

まず、この方法の基本はAPIから取得したキー入力を全部記録しておくことです。

かなりメモリーを食うのでは?とか思った人います?
大丈夫です、安心してください。
まあ計算すればすぐにわかりますがたいした容量ではありません。

カーソル4方向 + 4ボタンなら 8bits=1byteです。
60FPSとしたら、30分記録するのに、

1 * 60 * 60 * 30 = 105 kbytes

2人プレイなら2倍、ボタンが2倍ならさらに2倍になるだけです。

全然大丈夫ですよね?

というか、10年以上前から オンメモリーで全部記録していましたが問題はなかったです。
もし精神的に嫌なら、zlibのストリームにでも突っ込んでいけばよいのではないでしょうか?
(WireBattlerのころは一応、自前でリアルタイムにランレングス圧縮をかけてました。今は素でオンメモリーストリームに突っ込んでいるだけです)

記録と再現の仕方ですが、ラッパーを作ってやるとよいです。
つまり、記録時に実際に入力したキー情報をラッパーを通した段階で記録し、再現時には実際のキーは無視してそのラッパーから記録したものを出力してやるだけです。

そうすれば、キー入力を処理する外側からは、
まったく同じように見える(=同じようにプログラムを組める)よね?

全部初期化すること

基本的にプレイ開始時に全部初期化することです。
初期化を忘れて、前のプレイの状態変数なんかが残っているとずれます。

一番簡単なのは、オブジェクトのインスタンス確保で、データがすべて初期化されるように最初から組んでしまうこと。

そうすれば、プレイが始まったらインスタンス確保、
プレイが終わったらインスタンス開放。

つまり、メモリも一旦全部開放してすっきりさわやかにしてしまうのです。

浮動小数点がらみ

これが実はあまり再現ができてなくてよくわかってないのですが、
浮動小数点の丸めモードの違いがあると、計算結果がずれるんです。

それがどうも他のアプリケーションの影響などで、突然変わることがあるらしいとか。
(不確定すぎてすいません)

で、かなーり昔から(10年くらい前から)なんですが、
浮動小数の算術関数に FINIT でコントロールワードのリセットを入れまくるっていう方法を使ってました。

例えばこんな感じです。

で、Sinは直接呼ばずにこれを通すと。

ただ、この現象については不確実なので責任が持てませんw

CPUにより演算結果が変わるライブラリがある

Direct3DのサポートライブラリのD3DXとか使うと、場合わけして勝手に最適化したルーチンが呼ばれるためにCPUによって演算結果が変わるようです。
(主に浮動小数点。またか)

けっこういろいろなゲームの作者さんが「リプレイがずれる」という報告を受けているようなのですが、ほとんどが、これか、前述の浮動小数の誤差だと思います

いろいろ解決策はあるようですが、
自分の場合は、自前実装で回避でした。

というか、Direct3Dまともに使ったことねえwww
(DirectDraw派→CPU描画派→OpenGL派(いまここ))

コラム:WireBattler の途中再生機能

ちなみに、対戦格闘ゲーム「WireBattler」の最も多くつなげた連続技を見られる機能、つまり、途中から再生する機能は、記録時にある地点(地面にダウンしたとき)にフラグを立てておいて、リプレイ時にそこまで描画を全部すっとばして早送りしているだけなのです。

なのでCPUが遅いとけっこう時間がかかってしまいます。

次回に続く

長くなりすぎたので続きは次回に!

後編書きました。

参考リンク

[ 開発 ]

2008年07月03日

[投機] 去年のenSPA読んでた(FX関連)

trading02.jpg

最近、投機対象を Forex(FX、為替)に移しています。

それで 情報集めに Forex の雑誌ってないのかなーと
本屋をうろついていると、
enSPA(エンスパ) という季刊誌が目に留まり
予想以上におもしろかった(ネタ的に)ので、
去年からのバックナンバーを取ってみてました。

この雑誌のファーストインプレッションは……

 ネットで叩かれている人、出すぎwwww

名前を出すと失礼なので出せないのですが、
(というか、わかる人は一発でわかる)
2chとか掲示板でやたら叩かれている人が、
成功者として出ていたり、アドバイザーとして
コメントを出していたりして、
笑ってしまった。

それ以外の有名ブロガーなんかも出ていて、
興味深い雑誌になっている。

内容としては、
FX関連は、毎回、主に初心者向けの講座と
成功者、失敗者の特集。
毎回ですw

システムトレードに関する話題も載っていた号も
あったけれど、これもさわりだけ。

あと、サププライムローン前と後で
ガラリと内容が変わっていて、これは笑……えない。

円高前:キャピタルゲイン派とスワップ派が同じ割合で紹介
円高後:スワップ派死亡の体験談半数以上

体験談よむだけで、歴史が追体験できる。
この雑誌のいいところは、失敗談も同じか成功の話以上に載っていることかもしれないなあ。

いまから為替に参戦するとしても、
歴史的イベントを体験できていないというのは不利だろうから、
こういう雑誌で少しでも知っておくのはよいかもしれない。

[ 投機 ]

2008年06月20日

[webサービス] 「ねむログ」でどれだけ生活が改善したか

先日のエントリーにて、

おかげ様で、不規則な生活は少なくなり、睡眠の傾向はかなり改善されてきました。
当初はかなりガタガタの生活スタイルでしたから。

なんて書いたのですが、
睡眠時間の記録サイト「ねむログ」でどれだけ生活が変わったか?
実際に見比べてびっくり!!

早速、ごらんに入れましょう。

まずは、睡眠時間だけのグラフ。

画像:「ねむログ」付け初めのころの記録(2007年1月、ちょうど1年半前)

「ねむログ」昨年の睡眠時間グラフ

画像:今月の記録(2008年6月)

「ねむログ」今月の睡眠時間グラフ

まあ、睡眠時間はそんなに変わらないですよね?(どちらも寝すぎだけど)

さて、では、先日実装された新機能「期間タイプ」のグラフで就寝、起床時間を24時間のタイムスケールで表示してみると……。

画像:「ねむログ」付け初めのころの記録(2007年1月、ちょうど1年半前)

「ねむログ」昨年の期間タイプグラフ

リズムガタガタでしたな(´д`)

画像:今月の記録(2008年6月)

「ねむログ」今月の期間タイプグラフ

リズムがしっかりしてきている!!(`・ω・´)

  こ、これはすごい!

正直な話、すごいと言わざるをえないwwww
こりゃ「ねむログ」の開発者様に足を向けて寝られませんなw
(しかも、さっそく新機能が役にたちましたなあ)

ここ一年で、持病のうつ病傾向の改善がかなりあるし、睡眠時間とも相互的な関係もあるだろうし。
これはよいことだなあ。

この調子で続けていきたいと思う。

※後記[2008/09/25]
今年のグラフが途中までだったので、6月分全部のグラフに差し替えました。

参考リンク

[ webサービス ]

2008年06月17日

[webサービス] 睡眠時間の記録サイト「ねむログ」がパワーアップ!

新しい「ねむログ」

以前に紹介した生活習慣改善のため、睡眠時間の記録に使わせていただいているサイト「ねむログ」が新機能を搭載し、パワーアップしていました
パワーアップ箇所は以下。

  • 睡眠時間グラフの改良
    • 夜寝と昼寝が区別して分かるように
    • 祝日、祭日がわかりやすくなった
    • 目標睡眠時間、目標就寝、起床時間に線が入れられるようになった
    • 縦グラフの他に、横グラフも選べるように
    • パッと1日いつ寝て起きたかがわかる「期間タイプ」グラフの追加
  • 就寝・起床グラフの追加
  • 「眠りの状態」「今日の気分」など記入できる項目が増えた

画像:縦グラフ

「ねむログ」新機能 縦グラフ

画像:横グラフ

「ねむログ」新機能 横グラフ

画像:「期間タイプ」グラフ

「ねむログ」新機能 期間タイプグラフ

画像:就寝起床グラフ

折れ線

「ねむログ」新機能 就寝起床グラフ(折れ線)

横タイプ(分布図?)

「ねむログ」新機能 就寝起床グラフ(横タイプ)

省略しましたが、就寝・起床グラフは就寝のみ起床のみもそれぞれ見られます。

前より良くなったと感じたところ

  • 昼寝した分もすぐにわかる
    以前は昼寝と夜寝と一本のグラフになっていたのですが、今はしっかりわかるようになりました。
  • 「期間タイプ」グラフでいつ寝たか、起きたかが一目でわかる!
    ただ「15時間、多めに寝た」というのだけでなく、「こんな真昼間から寝てる!」というのがすぐにわかるようにw

自分の場合、主治医の健康管理の一貫として、
グラフを提出しているので、違った角度からの分析がしやすく
本当に助かります。

微妙なところ

微妙になったところもいくつか。

  • 記入が項目が増えた。
    記録がおっくうになるかも?と、思いましたけど記録必須ではないみたいなので問題なし?かな。
    (たくさんの記入項目を見て、初めて来た人が抵抗感あるかも?余計なお世話かww 今までどおりなシンプルなモードがあるとよいのかなあ)
     
    自分としては「簡単で単機能」というのがよかったと思っているので、追加要素は記録しないだろうなあ、という気はします。
  • 日付を選んだ時に、自動でページ遷移しなくなった。
    便利だったのに何故か「移動」ボタンを押さなくてはいけなくなった(´д`)
  • グラフが JavaScript 描画になった?ので、「コピペ」できなくなった。
    グラフをコピーして、画像編集ソフトで編集したりしてたので、ちょっとだけ面倒に。
    ただ、今のすばらしいグラフ描画には代えれない!
    (しかし、JavaScriptであんなきれいなグラフを作ることができるのに驚いた。サーバーに負担かけないし、よい技術だなあ)
     
    グラフの「コピペ」は、SleipnirのSnapCabプラグイン(スクリーンショットを便利に取るプラグイン)を使うと楽なことに気づいた。あまり問題ないかも。

改善してほしいなあと思うようなところ

ついでなので、思いつく要望も書いてみますヽ(`Д´)ノ

  • 睡眠時間を1日に1度記録していたら、自動で「追加」モードになってほしい。
    昼寝を記録しようとして、いつも「変更」モードになっていることに気づかず、間違って既存の睡眠時間を上書き変更してしまうことが多い orz
  • 就寝時間の記録がもっとすぐに(簡単に)できないか?
    グラフが大きくなったり、グラフ選択ボタンがついたり、説明が増えたり、記録要素が増えたために、就寝時間の記録がしにくくなった。
    具体的には、
    • 記録画面までのスクロール量が増えた
    • 「記録する」ボタンがずーーと下の方にいっちゃた orz
      など。
      (基本的にグラフのない「睡眠時間記録・編集」専用のページをつかえということなのかも?)
  • 日付を選んだ時に自動でページ遷移してほしい
    改悪されちゃった気がするw

勝手なこと言ってすいませんw

みんなが、みんなそう思っているわけではないと思うので、
ユーザースタイルシートか、スクリプト(Sleipnir使いだから Seahorse だけど)か何か、書いてみようかと思う。

謝辞

ダウンロードできるcsvのデータを見ていたら、
「ねむログ」は1年半もつかっていることに気付きました。
飽き性なのによく続いたもんです。

おかげ様で、不規則な生活は少なくなり、睡眠の傾向はかなり改善されてきました。
当初はかなりガタガタの生活スタイルでしたから。

今後も、使わせていただきたいと思います。
よろしくお願いします。

次回は、どの程度生活が改善されたか、を記事にしてみたいと思います。

↓次回書きました。
『[webサービス] 「ねむログ」でどれだけ生活が改善したか』

参考リンク

[ webサービス ]

Twitter(今何してる?)

プロフィール

あわせて読みたい

あわせて読みたいブログパーツ

人気エントリー

アーカイブ