<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
   <channel>
      <title>第一種臨界不測日記</title>
      <link>http://tobysoft.net/diary/</link>
      <description>TOBYSOFT代表のTOBYによるプログラミングと投資とうつのlog
[PR]PC用アクションゲーム『GuNMeN』好評販売中[PR]
[PR]PC用シューティングゲーム『GAN GAN GAN』開発中断中(´･ω･`)[PR]</description>
      <language>ja</language>
      <copyright>Copyright 2008</copyright>
      <lastBuildDate>Wed, 15 Oct 2008 07:51:54 +0900</lastBuildDate>
      <generator>http://www.sixapart.com/movabletype/</generator>
      <docs>http://blogs.law.harvard.edu/tech/rss</docs> 

            <item>
         <title>[ 開発 ]  分散バージョン管理を使ってみている その3 Mercurial編</title>
         <description><![CDATA[<p>
<img alt="Mercurial TortoiseHg" src="http://tobysoft.net/diary/images/Mercurial-TortoiseHg.jpg" width="340" height="315" />
</p>
<p>
<a target="_self" href="http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-2-git.html">前回に引き続き</a>、分散バージョン管理ソフトについてのお話です。
<br />
</p>
<p>
Mercurial という Python 製の分散バージョン管理ソフトもあります。
<br />
大きなプロジェクトでは Mozzila のバージョン管理に使われています。
<br />
</p>
<p>
</p>
<h3><a href="#id_Mercuriale99b91e6849f" name="id_Mercuriale99b91e6849f" id="id_Mercuriale99b91e6849f">&#9632;</a>Mercurial雑感</h3>
<p>
こちらは、今のところ日本語文字コードの対応など
<br />
Windowsでも比較的安心して使えるようです。
<br />
</p>
<p>
何故、Mercurial = hg なのかっていうと、コマンド名が hg だからです。
<br />
</p>
<p>
</p>
<p>
<a target="_self" href="http://tortoisehg.sourceforge.net/">TortoiseHg</a>というエクスプローラー統合の GUI ツールもあります。
<br />
上記画像はTortoiseHgのものです。
<br />
</p>
<p>
ただし、付属のdiffツールが文字化けたりするので、
<br />
小物ツールを別途用意する必要があります。
<br />
また、「ファイル名の変更」などGUIでは足りないコマンドがあるので、
<br />
コマンドラインも使えるようになっておくことが必要です。
<br />
</p>
<p>
GUIの充実はまだこれからと言ったところですね。
<br />
</p>
<p>
</p>
<p>
とはいえ、コマンドラインでは十分使えるようですので、
<br />
今から触っておいて損はないと思います。
<br />
</p>
<p>
コマンドライン版の入門には、下記のページが参考になりました。
<br />
（まだ読んでいる途中）
<br />
<a target="_self" href="http://gihyo.jp/dev/feature/01/mercurial">『特集：Mercurialではじめる分散構成管理｜gihyo.jp … 技術評論社』</a>
<br />
</p>
<p>
自分はコマンドラインは毛嫌いしていたのですが、
<br />
gitで使ってみたりして大丈夫になりました。
<br />
</p>
<p>
また、Tortoiseなんとか、みたいなGUIツールも結局は
<br />
コマンドライン版をラップしたような形なので、
<br />
憶えておくと GUIツールの方も機能対応がわかり、
<br />
非常に使いやすくなります。
<br />
</p>
<p>
</p>
<p>
Subversionとの相互運用ですが、現時点では hg convertという
<br />
変換機能はあるみたいですが、まだまだ微妙な動きのようです。
<br />
hg svnみたいな外部ツール(プラグインやスクリプト)もあるみたいですが、
<br />
まだどうも相互運用には厳しいようです。
<br />
</p>
<p>
これは相互運用は過去の資産をいかせるという意味からも
<br />
すごくよい機能なので、今後に期待したいです。
<br />
(この辺のことを重視している git はさすがという感じ)
<br />
</p>
<p>
</p>
<p>
Mercurialのことは、<a target="_self" href="http://tobysoft.net/wiki/index.php?Mercurial">wikiに少しずつまとめています</a>。
<br />
</p>
<p>
</p>
<h3><a href="#id_Mercuriale381aee383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0" name="id_Mercuriale381aee383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0" id="id_Mercuriale381aee383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0">&#9632;</a>Mercurialのリポジトリホスティング</h3>
<p>
gitに対するgithubのように、
<br />
Mercurialに対応したリポジトリホスティングもいくつかあるようです。
<br />
</p>
<p>
例えば、
<br />
<!-- xxx -->
</p>
<!-- xxx -->
<ul>
<li>
<a target="_self" href="http://www.bitbucket.org/">bitbucket.org</a>
</li>
<li>
<a target="_self" href="http://kenai.com/">Project Kenai</a>
</li>
<li>
<a target="_self" href="http://www.assembla.com/">Assembla</a>
</li>
</ul>
<p>
などがあります。
<br />
</p>
<p>
そういや、gitのリポジトリホスティングもgithub以外にけっこうでてきたみたいですね。
<br />
</p>
<p>
</p>
<p>
さて次回は、Bazaarと行きたいところですが、
<br />
まだMercurialを使いこなせてないので、
<br />
もう少し使ってみてからにします。
<br />
</p>
<p>
</p>
<p>
最後に、ぜひ、みなさんも
<br />
分散バージョン管理ソフトを使ってみては？と思います。
<br />
それでは！
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://google-opensource.blogspot.com/2008/05/develop-with-git-on-google-code-project.html">Google Open Source Blog: Develop with Git on a Google Code Project</a>
<br />
Google Code Project で gitを使う方法
</li>
<li>
<a target="_self" href="http://tortoisehg.sourceforge.net/">TortoiseHG</a>
<br />
MercurialのGUIツール
</li>
<li>
<a target="_self" href="http://tobysoft.net/wiki/index.php?Mercurial">Mercurial - TOBY SOFT wiki</a>
<br />
wikiにまとめているところ
</li>
<li>
<a target="_self" href="http://gihyo.jp/dev/feature/01/mercurial">特集：Mercurialではじめる分散構成管理｜gihyo.jp … 技術評論社</a>
<br />
Mercurial入門によい
</li>
<li>
<a target="_self" href="http://www.bitbucket.org/">Mercurial hosting — bitbucket.org</a>
<br />
Mercurialリポジトリホスティング。
</li>
<li>
<a target="_self" href="http://kenai.com/">Project Kenai -- We're More Than Just a Forge</a>
<br />
ここも、Mercurialリポジトリホスティング。フォーラム、ML、wiki、バグトラックつき
</li>
<li>
<a target="_self" href="http://www.assembla.com/">Accelerating Software Development | Assembla</a>
<br />
svn,git,Mercurialにも対応しているリポジトリホスティング
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-3-mercurial.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-3-mercurial.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Mercurial</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">バージョン管理</category>
        
         <pubDate>Wed, 15 Oct 2008 07:51:54 +0900</pubDate>
      </item>
            <item>
         <title>[ 開発 ]  分散バージョン管理を使ってみている その2 git編</title>
         <description><![CDATA[<p>
<img alt="gitk" src="http://tobysoft.net/diary/images/git-gitk.jpg" width="340" height="278" />
</p>
<p>
<a target="_self" href="http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-1-benefit.html">前回に引き続き</a>、分散バージョン管理ソフトの話です。
<br />
</p>
<p>
最初は Linux の Kernel ソースのバージョン管理にも使われている git を使ってみました。
<br />
Ruby界隈で流行っているみたいで、Ruby on Railsのバージョン管理にも使われているようです。
<br />
</p>
<p>
ちょっと使ってみたところ、
<br />
git は Windows 環境だとなかなか厳しい感じです('A`)
<br />
</p>
<ul>
<li>
CRLFの扱いが変(diffとか)
</li>
<li>
cygwin版での文字コードがらみ(日本語ファイル名が×)
</li>
<li>
TortoiseSVNみたいなGUIツールがないので人に勧めにくい
</li>
</ul>
<p>
などなど、細かいところは大分解決できましたが
<br />
本番環境で使うにはかなり問題があります。
<br />
</p>
<p>
GUIで履歴表示する gitk とかは結構、見やすいんですけどね。
<br />
(記事上の画像はgitkです)
<br />
</p>
<p>
</p>
<p>
gitのすごくよい点としては 
<br />
<strong>Subversion からの変換や相互運用の簡単さ</strong>みたいで
<br />
git svn なんてコマンドが用意されてます。
<br />
</p>
<p>
<a target="_self" href="http://google-opensource.blogspot.com/2008/05/develop-with-git-on-google-code-project.html">Subversion対応しかないGoogle Code Projectでgitを使おう、なんていう記事</a>もありました。
<br />
</p>
<p>
まーつまり、Subversionのリポジトリ（ソースコードの倉庫）から 
<br />
git に引っ張ってきて(pull相当)、
<br />
git で編集して(コミット)、
<br />
また Subversion のリポジトリにもどす！(push相当)
<br />
みたいなことが簡単にできるようです。
<br />
</p>
<p>
</p>
<p>
gitに関するトラブルやTipsなどは、<a target="_self" href="http://tobysoft.net/wiki/index.php?git">wikiにまとめておきました</a>。
<br />
でも今はMercurialに移行中なので、あまり更新されないかも ^^;
<br />
</p>
<p>
Unixで使うにはすごくよさそうなツールなんですけどねえ。
<br />
</p>
<h3><a href="#id_e383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0github" name="id_e383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0github" id="id_e383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0github">&#9632;</a>リポジトリホスティングgithub</h3>
<p>
実はgitには、 <a target="_self" href="https://github.com/">github</a>
<br />
なんていうリポジトリを貸してくれるサービスがあります。
<br />
オープンソースプロジェクトのような公開プロジェクトの場合、
<br />
現在は100MBまで無料で利用できます。
<br />
</p>
<p>
これがどうも界隈で git の火付け役になっているみたいです。
<br />
Ruby界隈その他ではかなり使われているみたい。
<br />
</p>
<p>
</p>
<p>
また、githubの面白い試みに、<a target="_self" href="http://gist.github.com/">Gist</a>
<br />
というソースコード貼り付けサービスがあります。
<br />
単一のソースコードを貼り付けられる系のwebサービスで、
<br />
それをgitでバージョン管理してくれるというものです。
<br />
webサービスですが、コマンドラインからでも管理できるとか……。
<br />
</p>
<p>
<a target="_self" href="http://gist.github.com/14739">gistに貼り付けてみたサンプルはこちら</a>
<br />
gitstに貼り付けたコードをblogなどに埋め込むこともできるとか。
<br />
</p>
<p>
</p>
<p>
実は自分もgithubを、<a target="_self" href="http://github.com/toooooooby">ちょこちょこと使ってみています</a>。
<br />
</p>
<p>
Delphiのexeをバンバンコミットしてpushしていると、
<br />
100MBだとすぐに一杯になりそうに感じました ^^;;
<br />
</p>
<h3><a href="#id_e4bb96e381abe38282gite381aee383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0e381afe38182e3828be38288" name="id_e4bb96e381abe38282gite381aee383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0e381afe38182e3828be38288" id="id_e4bb96e381abe38282gite381aee383aae3839de382b8e38388e383aae3839be382b9e38386e382a3e383b3e382b0e381afe38182e3828be38288">&#9632;</a>他にもgitのリポジトリホスティングはあるよ</h3>
<p>
githubの他にもgitのホスティングサービスはあるようです。
<br />
</p>
<ul>
<li>
<a target="_self" href="http://www.assembla.com/">Assembla</a>
<br />
プロジェクト数無制限。200MB。svn,Mercurialにも対応。Trac,wikiつき。
</li>
<li>
<a target="_self" href="http://unfuddle.com/">Unfuddle</a>
<br />
プロジェクト数1つ。200MB。svnにも対応。
</li>
<li>
<a target="_self" href="https://rubyforge.org/">Rubyforge</a>
<br />
※Ruby用です。最近 git 対応になった。
</li>
</ul>
<p>
githubの影響かいろいろなところがgit対応になってきてますね。
<br />
sourceforgeもそのうち対応するんじゃないんだろうか？
<br />
</p>
<h3><a href="#id_e6aca1e59b9ee381afe280a6e280a6" name="id_e6aca1e59b9ee381afe280a6e280a6" id="id_e6aca1e59b9ee381afe280a6e280a6">&#9632;</a>次回は……</h3>
<p>
次回は、別の分散バージョン管理ソフト、
<br />
その３ Mercurial編です。 
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://git.or.cz/">Git - Fast Version Control System</a>
<br />
git公式サイト
</li>
<li>
<a target="_self" href="http://ja.wikipedia.org/wiki/Git">Git - Wikipedia</a>
<br />
Wikipediaで歴史などを参照できます。
</li>
<li>
<a target="_self" href="http://tobysoft.net/wiki/index.php?git">git - TOBY SOFT wiki</a>
<br />
Windows上で自分の遭遇したgitのトラブル、Tips等をまとめています。
</li>
<li>
<a target="_self" href="https://github.com/">Your Dashboard — GitHub</a>
<br />
gitリポジトリのホスティング・サービス
</li>
<li>
<a target="_self" href="http://gist.github.com/">Gist — GitHub</a>
<br />
ソースコピペ・サービス
</li>
<li>
<a target="_self" href="http://www.assembla.com/">Accelerating Software Development | Assembla</a>
<br />
プロジェクト数無制限。200MB。svn,Mercurialにも対応。Trac,wikiつき。
</li>
<li>
<a target="_self" href="http://unfuddle.com/">Unfuddle: Subversion Hosting, Git Hosting, Bug and Issue Tracking</a>
<br />
プロジェクト数1つ。200MB。svnにも対応。
</li>
<li>
<a target="_self" href="http://rubyforge.org/">RubyForge: Welcome</a>
<br />
Ruby用のホスティングサービス。最近 git 対応になった。
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-2-git.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-2-git.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">git</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">バージョン管理</category>
        
         <pubDate>Sun, 12 Oct 2008 07:14:18 +0900</pubDate>
      </item>
            <item>
         <title>[ 開発 ]  分散バージョン管理を使ってみている その1 利点編</title>
         <description><![CDATA[<p>
最近、ソースコードやドキュメントの管理に
<br />
分散バージョン管理ソフトを試してみています。
<br />
</p>
<p>
具体的には gitとMercurial(hg)を使ってみています。
<br />
</p>
<h3><a href="#id_e588a9e782b9e381a8e3818b" name="id_e588a9e782b9e381a8e3818b" id="id_e588a9e782b9e381a8e3818b">&#9632;</a>利点とか</h3>
<p>
それら分散バージョン管理ソフトを使ってみて感じた利点は以下の通り。
<br />
</p>
<ul>
<li>
中央集権的でない使い方が可能
</li>
<li>
<strong>サーバーにつながっていない時も使える</strong>（！！）
</li>
<li>
分散＝<strong>分散バックアップ</strong>にもなる
</li>
<li>
<strong>ブランチ(枝分かれ)が簡単</strong>
</li>
<li>
複数人でかなり作業がしやすそう
</li>
</ul>
<p>
などがあると感じました。
<br />
</p>
<h3><a href="#id_e58886e695a3e59e8be381aee588a9e782b9" name="id_e58886e695a3e59e8be381aee588a9e782b9" id="id_e58886e695a3e59e8be381aee588a9e782b9">&#9632;</a>分散型の利点</h3>
<p>
以前使っていた、cvs や Subversionは、
<br />
中央集権型のため、
<br />
ひとつのリポジトリ（ソースコード置き場）に対して、
<br />
コミット（変更の反映）したりしていました。
<br />
例えばそのリポジトリはサーバーなんかに置いていました。
<br />
</p>
<p>
で、サーバーと繋がっていないと、
<br />
ちょっとした変更もコミット、反映できなくて困ったりしました。
<br />
（社内サーバーとかだとよくある）
<br />
</p>
<p>
ところが分散管理だと、
<br />
他のリポジトリから clone（リポジトリの複製）すると
<br />
まず手元にリポジトリそのものを持ってきます。
<br />
</p>
<p>
この時点ですでに<strong>バックアップ</strong>にもなっています。
<br />
</p>
<p>
その後は、ソースを編集したら
<br />
手元のリポジトリにコミット（変更の反映）しつつ、
<br />
サーバーに push (リモートのリポジトリに反映)します。
<br />
</p>
<p>
手元で<strong>コミットするだけならサーバーはいりません！</strong>
<br />
つまり、<strong>会社を休んでスタバでプログラミングしつつ、その場でコミットしたりバージョン管理ができます！！</strong>
<br />
（マクドでも可）
<br />
</p>
<p>
素晴らしくないですか？
<br />
</p>
<p>
</p>
<p>
誰かがサーバー側に push した場合など、
<br />
サーバーに上がった変更を持ってくる時は pull します。
<br />
</p>
<p>
</p>
<h3><a href="#id_e38396e383a9e383b3e38381e4bd9ce6a5ade381aee38197e38284e38199e38195" name="id_e38396e383a9e383b3e38381e4bd9ce6a5ade381aee38197e38284e38199e38195" id="id_e38396e383a9e383b3e38381e4bd9ce6a5ade381aee38197e38284e38199e38195">&#9632;</a>ブランチ作業のしやすさ</h3>
<p>
また、これらの作業、つまり
<br />
<strong>リポジトリのclone、push、pullはサーバーがなくても手元のリポジトリ同士でもできます</strong>。
<br />
</p>
<p>
これを使うと<strong>簡単にブランチ(枝分かれ)が作れます。</strong>
<br />
</p>
<p>
例えば、サーバーから clone してきた、
<br />
もしくは pull してきたリポジトリとソース一式があります。
<br />
この手元のリポジトリは絶賛開発中なのですが、
<br />
クライアントや上からの要望でちょっとした変更を
<br />
試したいと思いました。
<br />
</p>
<p>
この時は、開発中のリポジトリとは別に
<br />
新機能用のディレクトリに cloneします。
<br />
新機能用リポジトリができますので、
<br />
それに新機能を足して編集してコミット。
<br />
</p>
<p>
あとは、新機能が実装できたら全部コミットして、
<br />
元の開発中のリポジトリに push します。
<br />
</p>
<p>
もし、新機能がいらないやと思ったら、
<br />
ディレクトリごとポイッと削除してしまえばいいです。
<br />
</p>
<p>
開発中のと新機能のと、
<br />
ソースコードの結合、衝突の回避(merge作業)など、
<br />
後の作業はあるのですが、
<br />
何がすごいかというと、これが全部サーバーなしで
<br />
手元で簡単に低コストでできてしまうことです。
<br />
</p>
<p>
</p>
<p>
これは分散バージョン管理を使わざるを得ないのではないか！？
<br />
と思った次第です。
<br />
</p>
<h3><a href="#id_e6aca1e59b9ee381afe280a6e280a6" name="id_e6aca1e59b9ee381afe280a6e280a6" id="id_e6aca1e59b9ee381afe280a6e280a6">&#9632;</a>次回は……</h3>
<p>
さて、次回は、実際のソフトを使ってみた雑感をお伝えします。
<br />
その2 git編です。
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%82%B8%E3%83%A7%E3%83%B3%E7%AE%A1%E7%90%86%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0">バージョン管理システム - Wikipedia</a>
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-1-benefit.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/10/distributed-revision-control-1-benefit.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">software</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">バージョン管理</category>
        
         <pubDate>Thu, 09 Oct 2008 10:23:27 +0900</pubDate>
      </item>
            <item>
         <title>[ 雑記 ]  当日記で不快だと思われる記事を再編集しました</title>
         <description><![CDATA[<p>
いくつか他のサイトで取り上げていただいき波紋を呼んだ記事ですが、
<br />
時間がたつにつれ
<br />
</p>
<ul>
<li>
客観的に見て、十分に不快だと思う
</li>
<li>
自分にも非があると認めざるを得ない
</li>
<li>
あえて、他人を貶める必要はない
</li>
<li>
他を攻撃することは建設的ではない
</li>
</ul>
<p>
などと思うようになり、上記の理由により再編集させていただきました。
<br />
</p>
<p>
</p>
<p>
具体的には
<br />
</p>
<ul>
<li>
エントリーに謝罪文の掲示
</li>
<li>
詳細として、当エントリーへのリンクの付加
</li>
<li>
該当記事エントリーを style=&quot;display:none;&quot; により非表示に
</li>
</ul>
<p>
という処理を行いました。
<br />
</p>
<p>
</p>
<p>
エントリーごと削除しないのは
<br />
</p>
<ul>
<li>
都合の悪い記事を消すだけというのはフェアじゃない
</li>
<li>
リンクから来た人がページがないと奇妙に思う
</li>
<li>
リンク切れ自体が不快感に繋がる(これは個人的な感覚です)
</li>
</ul>
<p>
と考えているためです。
<br />
</p>
<p>
</p>
<p>
一部の人に不快感を与えてしまい申し訳ありませんでした。
<br />
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/10/redit-nasty-entry.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/10/redit-nasty-entry.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">雑記</category>
        
        
         <pubDate>Wed, 08 Oct 2008 08:43:35 +0900</pubDate>
      </item>
            <item>
         <title>[ Delphi ]  class helperが使えない件</title>
         <description><![CDATA[<p>
いろいろ実験していたのですが、
<br />
Delphi8辺りから導入された class helperが結局のところ使えない件。
<br />
（今更ですけどｗ）
<br />
</p>
<p>
簡単に言うと、2つ以上の class helper が同時に適用できない。
<br />
</p>
<p>
コード：
<br />
<textarea name="code" class="delphi:nogutter" cols="60" rows="61">
program test;
{$APPTYPE CONSOLE}
uses
  SysUtils, Classes;
type
  // class helper No.1
  TAspectClassHelper = class helper for TStringList
    function Add(const S: string): Integer;
  end;

// When string adds, write logs
function TAspectClassHelper.Add(const S: string): Integer;
begin
  Writeln('start - TStringList.Add(' + S + ')');
  Result := inherited Add(S);
  Writeln('end - TStringList.Add');
end;

type
  // class helper No.2
  TListTestClassHelper = class helper for TStringList
    function Add(const S: string): Integer;
    function ToString: string;
  end;

// When string adds, add message  
function TListTestClassHelper.Add(const S: string): Integer;
begin
  Result := inherited Add(s + ' in test');
end;

// convert items to string
function TListTestClassHelper.ToString: string;
var
  s: string;
begin
  Result := '';
  for s in Self do
    Result := Result + s + ', ';
end;

procedure Main;
var s: TStringList;
begin
  s := TStringList.Create;
  try
    s.Add('Hoge');
    s.Add('Moge');
    s.Add('Mage');
    Writeln('Count = ', s.Count);
    Writeln('All = ', s.ToString);
    Writeln;
  finally
    s.Free
  end;
end;

begin
  Main;
  Writeln('Hit RETURN key!!'); Readln;
end.
</textarea>
</p>
<p>
実行結果：
<br />
<!-- xxx -->
</p>
<!-- xxx -->
<pre>
Count = 3
All = Hoge in test, Moge in test, Mage in test,

Hit RETURN key!!
</pre>
<p>
上記のコードの場合、
<br />
TListTestClassHelper だけが適用され、
<br />
TAspectClassHelper が適用されない。
<br />
</p>
<p>
class helperをそれぞれ各ユニットに分けた場合、
<br />
usesした順序でどれが適用されるかが決定されます。
<br />
</p>
<p>
う、うーむ。
<br />
いざと言うときに困る仕様だなー。
<br />
まあ、当初から言われていた不都合だけども。
<br />
</p>
<p>
もし複数class helper適用が可能ならば、
<br />
Ruby並みの mixin が可能な柔軟性を秘めるのですが……。
<br />
</p>
<p>
</p>
<p>
</p>
<p>
……でも、実は、
<br />
すでに似たようなことはできるんです！
<br />
</p>
<p>
<span style="font-size:2em">必殺型キャスト!</span>
<br />
</p>
<p>
<textarea name="code" class="delphi:nogutter" cols="60" rows="58">
program test;

{$APPTYPE CONSOLE}
uses
  SysUtils, Classes;

type
  TAspectListHelper = class(TStringList)
    function Add(const S: string): Integer; reintroduce;
  end;

function TAspectListHelper.Add(const S: string): Integer;
begin
  Writeln('start - TStringList.Add(' + S + ')');
  Result := inherited Add(S);
  Writeln('end - TStringList.Add');
end;

type
  TListTestHelper = class(TStringList)
    function Add(const S: string): Integer; reintroduce;
    function ToString: string;
  end;

function TListTestHelper.Add(const S: string): Integer;
begin
  Result := inherited Add(s + ' in test');
end;

function TListTestHelper.ToString: string;
var
  s: string;
begin
  Result := '';
  for s in Self do
    Result := Result + s + ', ';
end;

procedure Main;
var s: TStringList;
begin
  s := TStringList.Create;
  try
    TAspectListHelper(s).Add('Hoge'); // !
    TAspectListHelper(s).Add('Moge'); // !!
    TListTestHelper(s).Add('Mage');   // !?
    Writeln('Count = ', s.Count);
    Writeln('All = ', TListTestHelper(s).ToString); // !?
    Writeln;
  finally
    s.Free
  end;
end;

begin
  Main;
  Writeln('Hit RETURN key?'); Readln;
end.
</textarea>
</p>
<p>
実行結果：
<br />
<!-- xxx -->
</p>
<!-- xxx -->
<pre>
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?
</pre>
<p>
</p>
<p>
……できてない('A`) 
<br />
</p>
<p>
型指定していてダックタイピングぽくなってないし、
<br />
こんなの mixin とか言ったら怒られる。
<br />
それに同じメソッド(add();)を拡張しようとしても、
<br />
2つ同時に適用はできてない。
<br />
(そもそも、型安全じゃない件)
<br />
</p>
<p>
全然ダメダメなオチだなあ。
<br />
</p>
<p>
</p>
<p>
次回は、そろそろ Delphi2009 について語ってみたいところだけど……。
<br />
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/09/class_helper_1.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/09/class_helper_1.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">Delphi</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">Delphi</category>
        
         <pubDate>Thu, 25 Sep 2008 12:34:27 +0900</pubDate>
      </item>
            <item>
         <title>[ 雑記 ]  Perl信者に成功者はいないということはない</title>
         <description><![CDATA[<h3><a href="#id_e3818ae8a9abe381b3" name="id_e3818ae8a9abe381b3" id="id_e3818ae8a9abe381b3">&#9632;</a>お詫び</h3>
<p>
一部の方々に不快感を与えて申し訳ありませんでした。
<br />
エントリー記事の一部を非表示にさせていただきました。
<br />
ことの詳細に関しては、<a target="_self" href="http://tobysoft.net/diary/archives/2008/10/redit-nasty-entry.html">『当日記で不快だと思われる記事を再編集しました』</a>をご覧下さい。
<br />
</p>
<p>
<div class="fukai" style="display:none;">
</p>
<p>
<img alt="success.jpg" src="http://tobysoft.net/diary/images/success.jpg" width="320" height="240" />
</p>
<p>
</p>
<h3><a href="#id_e38193e381a8e381aee7b58ce7b7af" name="id_e38193e381a8e381aee7b58ce7b7af" id="id_e38193e381a8e381aee7b58ce7b7af">&#9632;</a>ことの経緯</h3>
<p>
先日、この日記が以下のエントリーで取り上げられた。
<br />
『<a target="_self" href="http://d.hatena.ne.jp/k-z-h/20080920/p1">いい加減Ruby信者がうざい件 - id:k-z-h</a>』
<br />
<a target="_self" href="http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/k-z-h/20080920/p1">はてなブックマークでもかなりの賑わい</a>を見せている。
<br />
</p>
<p>
アクセス解析などを見るにかなりのところからリンクを貼られたせいもあり、
<br />
誹謗中傷や個人攻撃のようなコメント、メールまで寄せられた。
<br />
</p>
<p>
</p>
<p>
対抗して先日書いた以下のエントリーもあるが、これはもしかしたら、ネタと思われたかもしれない。
<br />
その真意は、あなたの判断にまかそう。
<br />
（ネタだと思われたならそう思ってくださって結構である）
<br />
<a target="_self" href="http://tobysoft.net/diary/archives/2008/09/believers_of_c-sharp_are_uzai.html">『[C#, Delphi] いい加減 C# 信者がうざい件 (第一種臨界不測日記)』</a>
<br />
</p>
<p>
</p>
<p>
</p>
<p>
しかし、以下のこのエントリーだけはかなりの本音である。
<br />
真剣に書いていることをわかってほしい。
<br />
（ネタを書かれたから、ネタで、などど思わないこと！）
<br />
</p>
<h3><a href="#id_e8a19de69283e381aee4ba8be5ae9f" name="id_e8a19de69283e381aee4ba8be5ae9f" id="id_e8a19de69283e381aee4ba8be5ae9f">&#9632;</a>衝撃の事実</h3>
<p>
さて、本題である。
<br />
ここで、Perl好きなあなたに衝撃の事実を伝えなくてはならないかもしれない。
<br />
</p>
<p>
</p>
<p>
<span style="font-size:2em">Perl信者に成功者はいない</span>
<br />
ということである。
<br />
</p>
<p>
</p>
<p>
ここでの成功者というのは、自分定義で、
<br />
</p>
<ul>
<li>
億万長者である
</li>
<li>
経済的に自立している（仕事しなくても食っていける）
</li>
</ul>
<p>
ということである。
<br />
</p>
<p>
</p>
<p>
自分はある程度の年月の中で、
<br />
プログラミングの本や自己啓発、成功法則の本を数多く読んできた。
<br />
</p>
<p>
その中に、成功者には、
<br />
<!-- xxx -->
</p>
<!-- xxx -->
<ul>
<li>
<strong>投資家はいた</strong>。(バフェット他、『マーケットの魔術師』も参照)
</li>
<li>
<strong>トレーダー(投機家、スペキュレーター)はいた</strong>。（同上）
</li>
<li>
<strong>IT起業家(アントレプレナー)はいた</strong>。(ビル・ゲイツ、三木谷浩史他)
</li>
<li>
<strong>不動産家はいた。</strong>(ＫＰ・シン、バフェットもだな、ロバート・アレンも？他)
</li>
<li>
<strong>マーケッターはいた。</strong>(ダン・S・ケネディ、神田昌典もか？、他)
</li>
<li>
<strong>金融業関係者はいた。</strong>(神内良一、福田吉孝他、他)
</li>
</ul>
<p>
　：
<br />
</p>
<p>
しかし、その中で、Perl信者は見つけることができなかった……。
<br />
</p>
<p>
</p>
<h3><a href="#id_e381afe3819fe38197e381a6e996a2e4bf82e3818ce38182e3828be381aee3818befbc9f" name="id_e381afe3819fe38197e381a6e996a2e4bf82e3818ce38182e3828be381aee3818befbc9f" id="id_e381afe3819fe38197e381a6e996a2e4bf82e3818ce38182e3828be381aee3818befbc9f">&#9632;</a>はたして関係があるのか？</h3>
<p>
「Perl信者」と「成功」と何が関係があることか？と思ったあなた、
<br />
そこは大間違いである。
<br />
あなたの取った（ている）行動で、あなたの将来が決まるのである。
<br />
あなたの今取っている行動、立場は「成功」にむすびつくと思いますか？
<br />
</p>
<p>
「はい。成功できる。」といえるあなたは、その行動を続ければよいと思う。
<br />
だが、「成功できないかもしれない」と思ったならば、それはやめなくてはならないのかもしれないのである。
<br />
</p>
<p>
</p>
<h3><a href="#id_e381a4e381bee3828ae280a6e280a6" name="id_e381a4e381bee3828ae280a6e280a6" id="id_e381a4e381bee3828ae280a6e280a6">&#9632;</a>つまり……</h3>
<p>
もし、あなたが『成功者』になりたかったら、
<br />
もし、お金に苦しまない一生を送りたいのであったら、
<br />
もし、おだやかに引退したいのであったら、
<br />
もし、自分の好きな趣味だけをして暮らして生きたいのであったら、
<br />
</p>
<p>
　：
<br />
</p>
<p>
Perl信者はやめた方がよいのかもしれない。
<br />
</p>
<p>
</p>
<p>
</p>
<p>
※お願い
<br />
自分の知識はかなり偏っている。
<br />
もし、あなたの知っている Perl信者で『成功者』がいたら教えてほしい。
<br />
ここで、ぜひ取り上げたいと思う。
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
『<a target="_self" href="http://d.hatena.ne.jp/k-z-h/20080920/p1">いい加減Ruby信者がうざい件 - id:k-z-h</a>』
</li>
<li>
<a target="_self" href="http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/k-z-h/20080920/p1">上記のはてなブックマーク</a>
</li>
<li>
<a target="_self" href="http://tobysoft.net/diary/archives/2008/09/believers_of_c-sharp_are_uzai.html">『[C#, Delphi] いい加減 C# 信者がうざい件 (第一種臨界不測日記)』</a>
</li>
</ul>
<p>
</div>
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/09/perl.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/09/perl.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">雑記</category>
        
        
         <pubDate>Sun, 21 Sep 2008 18:41:24 +0900</pubDate>
      </item>
            <item>
         <title>[ Delphi ]  C# 信者は特にうざくありません</title>
         <description><![CDATA[<h3><a href="#id_e3818ae8a9abe381b3" name="id_e3818ae8a9abe381b3" id="id_e3818ae8a9abe381b3">&#9632;</a>お詫び</h3>
<p>
一部の方々に不快感を与えて申し訳ありませんでした。
<br />
エントリー記事の一部を非表示にさせていただきました。
<br />
ことの詳細に関しては、<a target="_self" href="http://tobysoft.net/diary/archives/2008/10/redit-nasty-entry.html">『当日記で不快だと思われる記事を再編集しました』</a>をご覧下さい。
<br />
</p>
<p>
<div class="fukai" style="display:none;">
</p>
<p>
C# 信者の特徴
<br />
</p>
<ul>
<li>
Hejlsberg は神であり神による実装である C# こそが唯一絶対の言語である 
</li>
<li>
他の言語（特に DelphiとJava）は存在自体が悪である 
</li>
<li>
他の言語を使っているのは C# を知らないからである 
</li>
<li>
C# を布教することでそのような不幸な子羊たちを救済することこそが正義である 
</li>
</ul>
<p>
どこかの世界宗教のようですね。
<br />
</p>
<p>
</p>
<p>
</p>
<blockquote>
<a target="_self" href="http://tobysoft.net/wiki/index.php?Delphi">「Delphiまとめwiki」</a> を読んでふと「C# 使えばいいのに」と思った - World Wide Walker
<br />
</blockquote>
<p>
DMWより先に、Delphiを選択する時点で、C# よりも Delphi を使いたいという前提があることを考えて欲しい。
<br />
</p>
<p>
その上で Delphi をよりよく（という言い方もあまり好きじゃないけど、ほかにいい言い方が思い浮かばない）運用する方法がDMWなんだろ。
<br />
</p>
<p>
それに対して「それ C#（略」っていう発言は場違いであると思わない？
<br />
</p>
<p>
</p>
<p>
</p>
<p>
</p>
<blockquote>
Delphi の The best way is only one. と言う考え方は好きだけど、実際には one of them だったり、後から小声で But, there are many ways to do it. だなんて言われそうな気がするのがなぁ、と思ってしまう。
<br />
</blockquote>
<p>
当然 only one だろ。
<br />
</p>
<p>
その only one だから more better なものを選ぶ必要がない言語を選択するのがエンジニアとしては当然なんじゃねーの？
<br />
</p>
<p>
あと many ways なんて言語は存在価値はないよ。
<br />
</p>
<p>
</p>
<p>
</p>
<blockquote>
IsValid や HasFound など真偽値にちなんだ名前にする。
<br />

<br />
foo.IsValid や bar.HasFound と書ければ一目瞭然。
<br />
</blockquote>
<p>
そうでもない。関数名にCamelCaseが来るという時点でまず C# 使わない人間から見ると異常。
<br />
</p>
<p>
あとこの例だと bar.HasFound は HasFound という意味より IsFound という意味に俺は取ってしまったんだが。
<br />
</p>
<p>
省略するのはいいけど、省略しすぎて情報が落ちてないか？
<br />
</p>
<p>
</p>
<p>
</p>
<p>
</p>
<blockquote>
必要なときはforwardによるプロトタイプ宣言を使う。
<br />

<br />
なぜプロトタイプ宣言やinterface節での宣言がいるんですかね(もちろん過去互換性のためだろうけど)。
<br />
</blockquote>
<p>
プロトタイプ宣言なしだと関数やメソッド名などをtypoしたときに 爆速コンパイルの 1 pass 時点でエラーにならないからだろＪＫ。
<br />
</p>
<p>
</p>
<p>
</p>
<blockquote>
ループで配列やハッシュのインデックスを使わない。配列を直接ループさせる。
<br />

<br />
そもそも、Delphiはまともな Hash ライブラリすらないからな。TStringListのValuesプロパティは遅いから THashedStringList を使うなんてのは Bad Know-how 以外の何者でもないな。C# なら System.Collections.Generic.Dictionary で明瞭にかける。
<br />
</blockquote>
<p>
インデックス回して書いた方が人間が見てわかりやすいならそう書くべき。
<br />
</p>
<p>
その上で必要ならチューニングする。
<br />
</p>
<p>
DMWもこれ書いてる人が考えるBestなだけで、実際にこれがBestだと決まってるわけじゃない。
<br />
</p>
<p>
</p>
<p>
</p>
<blockquote>
<a target="_self" href="http://tobysoft.net/diary/">[Ruby] C# &gt;&gt;&gt;(越えられない壁)&gt;&gt;&gt; Delphi (第一種臨界不測日記)</a>
<br />
</blockquote>
<p>
このような開けた場所で不等号を並べて越えられない壁とか臆面もなく書けるあたり尊敬します。
<br />
</p>
<p>
</p>
<p>
</p>
<blockquote>
しかし、Webの記事とか、googleで上の方に出てくるのとか、 
<br />

<br />
その辺、全然考慮してなかったりするんだよヽ(`Д´)ノ ウワァァン！！ 
<br />
</blockquote>
<p>
Delphi のコードは Google などで検索するとレガシーなコードの方が多くHITしてしまいます。
<br />
</p>
<p>
これは Delphi は C# に比べると歴史が長いため、レガシーなコードほど多く蓄積されてしまっているからじゃないかと考えています。
<br />
</p>
<p>
良質なコードを摂取したいというのならば最近更新されていて、よく使われている評価の高いCode Central のコンポーネントのソースを読むことをオススメします。
<br />
</p>
<p>
</p>
<p>
</p>
<blockquote>
 使っている人もgeekな人が多いせいか、 
<br />
</blockquote>
<p>
C#を使っている人＝geek＝自分は geek ということですね。
<br />
</p>
<p>
自分で自分のことをgeekと言う人ほど信用できないものはないと思います。
<br />
</p>
<p>
最後に
<br />
自分の考えをまとめると、Delphiが全てのエンジニアにとって使いやすい言語ではないのと同じように、C#も全てのエンジニアにとって使いやすい言語ではないということです。
<br />
</p>
<p>
別にC#という言語やそのコミュニティが嫌いだというわけではなく、このことを忘れて（あるいは考えず）、他の言語をDISってC#をプッシュしてくる信者が大変鬱陶しいということ。
<br />
</p>
<p>
GUIといえばDelphi/VCLだった時を考えてください。
<br />
</p>
<p>
この時代にあなたが生まれていたとしたら、Win32の世界に入りましたか？
<br />
</p>
<p>
答えはYESですよね？それは嬉しいことじゃないですか？
<br />
</p>
<p>
色々な言語がクラアントサイドの言語として使われることで、幅広い層のエンジニアがリッチクラアントの世界に足を踏み入れるわけです。
<br />
</p>
<p>
それによってそれぞれの言語のコミュニティが活発化して、お互いに影響しあって成長していくんじゃないですか？
<br />
</p>
<p>
言語がどうこうなんて小さいことじゃなくて、もっと大きな視点を持つべきなんじゃないですか？
<br />
</p>
<p>
元ネタ：<a target="_self" href="http://d.hatena.ne.jp/k-z-h/20080920/p1">いい加減Ruby信者がうざい件 - id:k-z-h</a>
<br />
</p>
<p>
</div>
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/09/believers_of_c-sharp_are_uzai.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/09/believers_of_c-sharp_are_uzai.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">C#</category>
                  <category domain="http://www.sixapart.com/ns/types#category">Delphi</category>
        
        
         <pubDate>Sat, 20 Sep 2008 17:34:25 +0900</pubDate>
      </item>
            <item>
         <title>[ webサービス ]  タスクの時間管理によさそうなwebサービス「SlimTimer」</title>
         <description><![CDATA[<p>
<img alt="slimtimer.jpg" src="http://tobysoft.net/diary/images/slimtimer.jpg" width="215" height="252" />
</p>
<p>
以前はタスク管理に「<a target="_self" href="http://www.rememberthemilk.com">Remember the milk</a>」を使っていたのですが、
<br />
タスクの時間を測定する、ということを覚えてからというも、
<br />
webベースだとイマイチ使いにくい＆時間の記録ができない、
<br />
ということで、さっくり使える Excel に移行気味です。
<br />
</p>
<p>
今は、Excel + ストップウォッチ + タイマーを組み合わせて、
<br />
使っています。
<br />
</p>
<p>
ただこういうのに特化したwebサービスがないのかなあ？と。
<br />
以前<a target="_self" href="http://q.hatena.ne.jp/1218183489">「はてな」でも質問したのですが回答が得られませんでした</a>。
<br />
その後<a target="_self" href="http://www.amazon.co.jp/dp/4534041837/toby-22">「スピードハックス」という本</a>で知ったのですが、
<br />
「<a target="_self" href="http://www.slimtimer.com/">SlimTimer</a>」というwebサービスがあるみたいでした。
<br />
</p>
<p>
「<a target="_self" href="http://www.slimtimer.com/">SlimTimer</a>」は、
<br />
タスクごとに時間を計って、
<br />
レポートも作ってくれるようなサービスです。
<br />
</p>
<p>
webサービスなので、
<br />
ブラウザ落ちたらどうすんだ！という対策には、
<br />
<a target="_self" href="http://bubbleshq.com/">Bubbles</a>という
<br />
webサービスをクラアントアプリ化するソフトを使うとよいようです。
<br />
（言ってしまうと個々のwebサービス用の専用ブラウザを作るソフトです。<a target="_self" href="https://wiki.mozilla.org/WebRunner">Mozilla Prism</a>みたいなの)
<br />
</p>
<p>
　：
<br />
</p>
<p>
と思っていろいろ試してみていたのですけども、
<br />
残念ながら<strong>「予測時間」の記録や比較できない</strong>模様。
<br />
</p>
<p>
<strong>タスクの見積もりをするのに、予測時間の記録、記述は必ず必要</strong>になります。
<br />
残念ながら使えないかも……。
<br />
（作業記録としてコメントが残せたり、タグ付けやレポート出力はすごくいいのだけどもー）
<br />
</p>
<p>
一応要望にestimate timeうんぬんという投票があったので、
<br />
voteしておきました。
<br />
</p>
<p>
</p>
<p>
Excelに戻ります λ...
<br />
</p>
<p>
（関係ないけど、webサービスはクライアントアプリには勝てない側面はあるよなあ、と最近よく思う）
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://www.rememberthemilk.com">Remember the milk</a>
<br />
タスク管理サービス。慣れたのにイマイチ使いにくい(´･ω･`)
</li>
<li>
<a target="_self" href="http://www.slimtimer.com/">SlimTimer - Time Tracking without the Timesheet</a>
<br />
時間トラッキング、タスク管理サービス。
</li>
<li>
<a target="_self" href="http://bubbleshq.com/">BubblesHQ ≫ Home for Bubbles, the Site Specific Browser for Windows</a>
<br />
webサービスを個別アプリみたいにするソフト。タスクトレイにも収納できる。
</li>
<li>
[本]<a target="_self" href="http://www.amazon.co.jp/dp/4534041837/toby-22">スピードハックス 仕事のスピードをいきなり3倍にする技術: 大橋 悦夫, 佐々木 正悟</a>
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/08/webservice_slimtimer.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/08/webservice_slimtimer.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">webサービス</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">TODO</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">webサービス</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">本</category>
        
         <pubDate>Sat, 16 Aug 2008 10:59:13 +0900</pubDate>
      </item>
            <item>
         <title>[ ダイエット ]  ふはは！6ヵ月目でちょうど10kg減。ダイエット成功！</title>
         <description><![CDATA[<p>
<img alt="diet_2008-08-09.jpg" src="http://tobysoft.net/diary/images/diet_2008-08-09.jpg" width="340" height="285" />
</p>
<p>
先日、<a target="_self" href="http://tobysoft.net/diary/archives/2008/07/diet.html">『[雑記] ダイエット成功？5ヶ月で 約9kg減』</a>
<br />
なんて記事を書きました。
<br />
</p>
<p>
そして先週の記録でちょうど、
<br />
今年2月からダイエットを初めてから、
<br />
ちょうど -10kgに成功しました。
<br />
</p>
<p>
2月 76.0kg→ 8月 66.0kg (<strong>-10kg</strong>)
<br />
</p>
<p>
ヽ(`Д´)ノ やったよーー！！
<br />
</p>
<p>
<strong>無理なく楽に続けた結果がこれだよ！！</strong>
<br />
実際、昼、夜の食事はふつーにとってこれだよ！！
<br />
（もともと朝食抜き派）
<br />
</p>
<p>
ちなみに、<strong>1年で -10kgという目標を立てて取り組んでいたのですが、半分の半年で達成しました！</strong>
<br />
</p>
<p>
ただ、BMIがまだ 25切ったばかり
<br />
（つまり、デブからようやくふつーの体型になってきた）
<br />
なので、まだまだ気を抜かないようにしないといけないです。
<br />
</p>
<p>
</p>
<p>
</p>
<p>
また、前にも書きましたが、
<br />
基礎代謝(1日に何もしなくても消費するカロリー)が
<br />
下がりまくっているので、
<br />
基礎代謝をいかに高める（保持する）かが今後の課題です。
<br />
</p>
<p>
ちなみに基礎代謝の推移、
<br />
</p>
<p>
2月 1674kcal → 8月 1539kcal(-135kcal)
<br />
</p>
<p>
</p>
<p>
1日に135kcal分といったら、
<br />
コカ・コーラ 350ml 1本よりちょっと低いくらい。
<br />
</p>
<p>
つまり、<strong>1日にコカ・コーラ 350ml 1本分止めたくらいでは、同じようには痩せないようになった</strong>というわけ。
<br />
</p>
<p>
1ヵ月換算だと、4185kcal で<strong>約0.58kg分痩せにくい！</strong>
<br />
</p>
<p>
そりゃ、後半は痩せにくくなるわｗｗ
<br />
</p>
<p>
</p>
<p>
</p>
<p>
次の目標は 6ヶ月で60kgを切る！(-6kg減)と
<br />
行きたいところで、カロリー計算をすると、
<br />
1日230kcalの削減でOKとなりますが……。
<br />
</p>
<p>
しかし、正直なところ、今の「食事はふつーにとる」戦略では
<br />
基礎代謝の低下を考慮に入れてカロリー計算をすると、
<br />
あと半年で 60kg を切る(-6kg)のは難しい(´д｀)。
<br />
</p>
<p>
今やっている「ダンベル体操」が地味に基礎代謝に効いてくればあるいわ……。
<br />
</p>
<p>
</p>
<p>
というわけで、難しいながらも挑戦するぞ、ということで、
<br />
</p>
<p>
　<strong>次の目標は、あと半年で6kg減になりました！</strong>
<br />
</p>
<p>
もちろん、合言葉は <strong>無理なく楽に痩せる</strong>です。
<br />
</p>
<p>
※カテゴリに「ダイエット」を追加してみた。
<br />
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/08/diet-10kg.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/08/diet-10kg.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">ダイエット</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">diet</category>
        
         <pubDate>Sat, 09 Aug 2008 15:03:29 +0900</pubDate>
      </item>
            <item>
         <title>[ 雑記 ]  韓国ドラマ「商道（サンド）」見終わりました</title>
         <description><![CDATA[<p>
最近、TVドラマで自分がハマっていた、
<br />
<a target="_self" href="http://www.bs-asahi.co.jp/sando/index.html">BS朝日で放送していた「商道（サンド）」</a>が先日ようやく完結しました。
<br />
</p>
<p>
</p>
<p>
時代劇でしかも商人のドラマ、というと非常に珍しい感じがして見始めました。
<br />
</p>
<p>
実は、「チャングムの誓い」、「ホジュン(男の医師の物語。チャングムの前身とも言うべきドラマ)」の演出家がスタッフにいるドラマ、ということで期待していたのですが、これが大当たりでした。
<br />
</p>
<p>
「ホジュン」もそうなんだけど、
<br />
韓国ドラマは時代劇がかなりおもしろいのでは？と思ってしまう。
<br />
</p>
<p>
</p>
<p>
</p>
<p>
さて、「サンド」は、商人で朝鮮一の大富豪になった「イム・サンオク」の生涯を描いた史実に基づいたドラマです。
<br />
</p>
<p>
このドラマの見所は、
<br />
「チャングムの誓い」よろしく、
<br />
謀略につぐ、謀略、一難さってまた一難、
<br />
敵の陰謀を潜り抜けていく主人公達を見られるところ。
<br />
</p>
<p>
</p>
<p>
中盤から終盤にかけて、ライバルの商団との対決になるのですが、
<br />
もう、あの手、この手で主人公の商団を、<strong>人民もろとも</strong>蹴落としにかかってきます。
<br />
</p>
<ul>
<li>
朝鮮人参を栽培中のところを山賊を使って襲い、農夫達を惨殺。
</li>
<li>
輸送船を焼き討ち
</li>
<li>
優秀な人材を引き抜き（結局、引き抜かれた人物がラスボスになるんだがｗ）
</li>
<li>
主人公達が仕入れようとする商品の原料を買占めて、損害
</li>
<li>
戦争が起きるとデマを流し（かなりの犯罪級）、損害
</li>
<li>
主人公達が配送を請け負った市民に配る配給米に砂混ぜて台無しに
</li>
<li>
裏金、裏金、とにかく裏金
</li>
<li>
高利貸しに手を出す→市民から吸血
</li>
<li>
しまいには、口封じに主人公の商団の長までをも殺しにかかる
</li>
<li>
最後には、お金の偽造
</li>
<li>
etc...
</li>
</ul>
<p>
お前らには人の血が流れていないのか……と(つд｀;)
<br />
</p>
<p>
</p>
<p>
一度は、商団を崩壊にまで追い込まれますが、
<br />
なんとか巻き返し再建しようとする主人公達。
<br />
</p>
<p>
涙ぐましい努力を見せてくれます( ´д｀)
<br />
</p>
<p>
</p>
<p>
このドラマで何度も出てくる言葉（というかテーマ）
<br />
</p>
<p>
　<strong>「商売とはお金を残すものではない。商売とは人を残すものだ」</strong>
<br />
</p>
<p>
いい言葉ですわ。
<br />
</p>
<p>
</p>
<p>
ちょっとしたところでは、
<br />
役者が個性的なのもよいところですね。
<br />
</p>
<p>
とにかく、ヤバイ人が多い。
<br />
なんていうか、頭悪い役の人がみなウマイんですｗｗｗ
<br />
掲示板なんかで、本作はDQN（頭がヤバイ人）が本当にヒドイと言っていた人がいましたけど、まさにそう。
<br />
</p>
<p>
</p>
<p>
</p>
<p>
今回のドラマは、チャングムのスタッフ系では珍しく？ハッピーエンドちっくな終わり方をしたので、すっきり寝られます。
<br />
</p>
<p>
</p>
<p>
「チャングムの誓い」おもすれー、
<br />
韓国の時代劇おもすれー、
<br />
などと思っている人は、間違いなくハマるので、
<br />
機会があればこのドラマも見て見られては？と思います。
<br />
</p>
<p>
gdgdな感想ですが、この辺で。
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://www.koretame.com/sando/">韓国ドラマ『商道 -サンド-』公式サイト</a>
<br />
トレイラーなどもこちらから。
</li>
<li>
<a target="_self" href="http://www.bs-asahi.co.jp/sando/index.html">商道（サンド）｜BS朝日</a>
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/07/sando.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/07/sando.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">雑記</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">ドラマ</category>
        
         <pubDate>Thu, 31 Jul 2008 06:58:57 +0900</pubDate>
      </item>
            <item>
         <title>[ ダイエット ]  ダイエット成功？5ヶ月で 約9kg減</title>
         <description><![CDATA[<p>
<img alt="ダイエット" src="http://tobysoft.net/diary/images/diet.jpg" width="320" height="240" />
</p>
<p>
ダイエット開始してから 5ヵ月経過しました。
<br />
途中経過報告です。
<br />
</p>
<p>
左の元の数値は、去年の5月に偶々残っていた
<br />
（かなり太っていたころの）記録です。
<br />
</p>
<p>
体重：76.5kg → 67.3kg(<strong>-9.2kg</strong>)
<br />
体脂肪率：30.7% → 20.8%(<strong>-9.9%</strong>)
<br />
BMI： 28.8 → 25.3(<strong>-3.5</strong>)
<br />
体年齢：48歳 → 37歳(<strong>-11歳</strong>)
<br />
ウエスト：104cm → 89.7cm (<strong>-14.3cm</strong>)
<br />
</p>
<p>
ゆっくり無理なく痩せた結果がこれだよ！
<br />
</p>
<p>
目標は1年で 10kg 減というスローダイエットでしたが、
<br />
余裕で達成できそうです。
<br />
</p>
<p>
</p>
<p>
それにしても、
<br />
さまざまなダイエット法をチャレンジし続け、
<br />
今まで何一つとしてまともに続けなかったのに、
<br />
今回は続いて結果が出ていてびっくり！
<br />
</p>
<p>
</p>
<p>
それはそうと、
<br />
はけなくなって新調したばかりのズボンが、
<br />
ブカブカ になってそれもびっくり！だよ。
<br />
</p>
<p>
</p>
<p>
とはいえ、まだまだ体年齢が実年齢より 10歳近く高い ｗ
<br />
ウエストや体重も、
<br />
運動をしていたころと比べると
<br />
まだデブデブなのでこれからといった感じです。
<br />
</p>
<p>
</p>
<p>
</p>
<p>
現在は基礎代謝がかなり減ってきていて、
<br />
燃焼効率が悪く、痩せにくくなってきたので、
<br />
基礎代謝を上げるようなトレーニング
<br />
(というか体操)
<br />
を1日15分程度少し取り入れてみています。
<br />
</p>
<p>
こちらは、3ヶ月くらいしてから結果が出てくる（気が長いｗ）、
<br />
ということなので、ゆっくりやっていきます。
<br />
</p>
<p>
まああせらないのがコツですね。
<br />
</p>
<p>
</p>
<p>
また、しばらくしたら報告します。
<br />
</p>
<p>
※あれ？前のダイエット開始時の記事消しちゃったかな……？
<br />
</p>
<p>
[2008/07/20]
<br />
※上の元の値は去年の記録なので、厳密には「5ヶ月で9.2kg減」ではないですね。タイトル変更しました。
<br />
※ダイエット開始時、今年の2月中ごろは 76kgなので厳密には「5ヶ月で8.7kg減」ですな。
<br />
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/07/diet.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/07/diet.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">ダイエット</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">diet</category>
        
         <pubDate>Sun, 20 Jul 2008 09:43:44 +0900</pubDate>
      </item>
            <item>
         <title>[ 開発 ]  ＜警告！＞まだあなたのゲームにリプレイ機能を実装してはいけません！なぜなら……(後編)</title>
         <description><![CDATA[<p>
<strong>この記事を読まずに、あなたのゲームにリプレイ機能を実装するのはあまりに危険です……。</strong>
<br />
</p>
<p>
<strong>なぜなら……。</strong>
<br />
</p>
<p>
</p>
<p>
<img alt="gamedev02.jpg" src="http://tobysoft.net/diary/images/gamedev02.jpg" width="320" height="240" />
</p>
<p>
<a target="_self" href="http://tobysoft.net/diary/archives/2008/07/replay01.html">前回のゲームにおけるリプレイの実装方法</a>の続き、後編です。
<br />
</p>
<p>
お読みでない方はまずは<a target="_self" href="http://tobysoft.net/diary/archives/2008/07/replay01.html">前回</a>からどうぞ。
<br />
</p>
<p>
</p>
<h4><a href="#id_e4b9b1e695b0e381aee587a6e79086" name="id_e4b9b1e695b0e381aee587a6e79086" id="id_e4b9b1e695b0e381aee587a6e79086">&#9632;</a>乱数の処理</h4>
<p>
<strong>乱数は再現可能なもの</strong>を使います。
<br />
最初に使っていたのは線形合同法でした。
<br />
</p>
<p>
GuNMeNのときは何を思ったか、
<br />
あらかじめ線形合同法で生成しておいた65536個の乱数テーブルを使ってました。
<br />
まあ、これはあまり意味ないです。
<br />
（たぶん、家庭用ゲームみたいなことがやりたかったのかと）
<br />
</p>
<p>
</p>
<p>
今は、乱数生成ルーチンには <a target="_self" href="http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/mt.html">Mersenne Twister</a> を使っています。
<br />
<strong>Mersenne Twisterも再現性があります</strong>。
<br />
</p>
<p>
</p>
<p>
ちなみに乱数種（シード）の自分で初期化をする場合は、
<br />
そのシード値も記録する必要があります。
<br />
</p>
<p>
さらっと書きましたが、最初にまずハマるところですので注意を。
<br />
</p>
<p>
</p>
<p>
面倒くさいので最近は、乱数種の変更すらしてませんｗ
<br />
つまり、乱数種固定で初期化ｗｗｗｗ
<br />
</p>
<p>
</p>
<p>
また、これは重要な点なのですが、
<br />
自分の場合は乱数オブジェクトを複数持っています。
<br />
今のプロジェクトだと主にメインの更新処理で使うもの用と、エフェクト用と、描画用を持っています。
<br />
</p>
<p>
乱数オブジェクトを複数持つ利点は、
<br />
ちょっとした変更に強いことです。
<br />
つまり、ちょっとした変更をしてもリプレイをずらさないようにすることができるのです。
<br />
</p>
<p>
エフェクト弄りたいなーってときは、
<br />
エフェクト用の乱数オブジェクトのインスタンスを別に持っていて、
<br />
ゲーム進行に影響を与えないようにしておけば、
<br />
エフェクトを弄っても、リプレイに影響がでません！！
<br />
（逆に、あくまでエフェクトがメインのゲーム進行に影響を与えない前提です。エフェクトの上にキャラクターが乗れる、とかいう仕様では無理です。まあ、そうなったとしても、それをエフェクト以外に割り当てるだけですが）
<br />
</p>
<p>
</p>
<h4><a href="#id_e68f8fe794bbe38292e9a39be381b0e38199e5a0b4e59088e381afe38081e9a39be381b0e38197e381a6e38184e38184e38282e381aee381a0e38191e38292e69bb8e38184e381a6e3818ae3818f" name="id_e68f8fe794bbe38292e9a39be381b0e38199e5a0b4e59088e381afe38081e9a39be381b0e38197e381a6e38184e38184e38282e381aee381a0e38191e38292e69bb8e38184e381a6e3818ae3818f" id="id_e68f8fe794bbe38292e9a39be381b0e38199e5a0b4e59088e381afe38081e9a39be381b0e38197e381a6e38184e38184e38282e381aee381a0e38191e38292e69bb8e38184e381a6e3818ae3818f">&#9632;</a>描画を飛ばす場合は、飛ばしていいものだけを書いておく</h4>
<p>
更新処理が固定フレームレートベースで、
<br />
描画をスキップするような実装をする場合、
<br />
<strong>前提として、描画処理と更新処理をわけます</strong>。
<br />
</p>
<p>
そうなると、絶対に<strong>実行される更新処理の方（キャラクターの移動とか）は、描画の方に入れないようにする</strong>必要があります。
<br />
</p>
<p>
逆に言うと、描画の方には飛ばしちゃいけないものを入れないようにしないといけません。
<br />
</p>
<p>
例えば、こんな感じ。
<br />
</p>
<p>
<textarea name="code" class="delphi:nogutter" cols="60" rows="21">
// 更新処理
procedure TSceneManager.Update;
begin
  // キー状態取得
  Input.UpdateKeyState;
  // 各エンティティの更新処理
  MyCharcter.Update;
  Enemies.Update;
  Effects.Update;
  // 判定処理
  CollisionManager.CheckAll;
end;

// 描画処理
procedure TSceneManager.Render;
beign
  // 描画処理のみにする！
  MyCharcter.Render;
  Enemies.Render;
  Effects.Render;
end;
</textarea>
</p>
<p>
</p>
<p>
自分の場合、描画処理でも乱数を使いたくなるので、
<br />
描画処理用にも乱数オブジェクトを 1つもってます。
<br />
そうすると描画が飛ばされたりしても、
<br />
更新処理用の乱数には影響がでません。
<br />
</p>
<h4><a href="#id_e3838fe383bce38389e382a6e382a7e382a2e381afe5a489e38188e381aae38184e38193e381a8" name="id_e3838fe383bce38389e382a6e382a7e382a2e381afe5a489e38188e381aae38184e38193e381a8" id="id_e3838fe383bce38389e382a6e382a7e382a2e381afe5a489e38188e381aae38184e38193e381a8">&#9632;</a>ハードウェアは変えないこと</h4>
<p>
ハードウェアが再生環境と同じアーキテクチャでないとダメだと思われます。
<br />
ようするに、<strong>リプレイを記録した環境と同じような計算をするハードウェア環境で再生しないとダメ</strong>です。
<br />
</p>
<p>
これに関しては今は大丈夫ですが、将来どうなるかわかりません。
<br />
10年後は再生できる環境が残っているものでしょうか？
<br />
</p>
<p>
極端な例ですが、Intel社のCPUとモトローラー社(以前のMacの)のCPUとでは、
<br />
エンディアンが異なりますよね？
<br />
考慮していない場合は、同じように再生できません。
<br />
（もちろん、浮動小数などそれ以外にも考慮しないといけないものがありますが……。）
<br />
</p>
<h4><a href="#id_e383aae38397e383ace382a4e69982e381abe382ade383bce6938de4bd9c" name="id_e383aae38397e383ace382a4e69982e381abe382ade383bce6938de4bd9c" id="id_e383aae38397e383ace382a4e69982e381abe382ade383bce6938de4bd9c">&#9632;</a>リプレイ時にキー操作</h4>
<p>
リプレイを再生中に、早送りとか、ポーズとか、終了したりとか。
<br />
あれ？キー判定どうすんの？
<br />
</p>
<p>
簡単ですよ！
<br />
<strong>メインで使っている（再生で使っている）キー入力オブジェクトとは別にリプレイ中のキー操作オブジェクトを生成して使うだけです。</strong>
<br />
</p>
<p>
だけです、さらっと書きましたが、キー入力周りをそういう風に組んどけってことですｗ
<br />
</p>
<p>
</p>
<p>
↓こんな感じ。
<br />
</p>
<p>
記録中は以下のような感じだとすると、
<br />
</p>
<ul>
<li>
Player Aのキー入力オブジェクト(記録中）
</li>
<li>
Player Bのキー入力オブジェクト(記録中)
</li>
</ul>
<p>
再生中は以下のような感じ。
<br />
</p>
<ul>
<li>
Player Aのキー入力オブジェクト(記録から再生してるだけ)
</li>
<li>
Player Bのキー入力オブジェクト(記録から再生してるだけ)
</li>
<li>
リプレイ画面のキー入力オブジェクト(記録はもちろんしてない)
</li>
</ul>
<p>
再生中のフラグが立ってるときだけ、「リプレイ画面のキー入力オブジェクト」を処理する。
<br />
（記録中は生成すらしない）
<br />
</p>
<p>
リプレイ画面のキー入力オブジェクトは、Player A(B)のキー入力オブジェクトのクラスを使いまわしてます（インスタンスでなくてあくまでクラス）。
<br />
</p>
<p>
<strong>あらかじめキー入力をクラス化しておけば、こんなのはサックリできます</strong>よ。
<br />
</p>
<h4><a href="#id_e38390e383bce382b8e383a7e383b3e382a2e38383e38397e38197e381a6e38282e5a4a7e4b888e5a4abe381aae38288e38186e381abe5a0b4e59088e3828fe38191e38199e3828b" name="id_e38390e383bce382b8e383a7e383b3e382a2e38383e38397e38197e381a6e38282e5a4a7e4b888e5a4abe381aae38288e38186e381abe5a0b4e59088e3828fe38191e38199e3828b" id="id_e38390e383bce382b8e383a7e383b3e382a2e38383e38397e38197e381a6e38282e5a4a7e4b888e5a4abe381aae38288e38186e381abe5a0b4e59088e3828fe38191e38199e3828b">&#9632;</a>バージョンアップしても大丈夫なように場合わけする</h4>
<p>
バグ報告をもらってバグ修正したり、
<br />
バージョンアップしたりして、
<br />
前のリプレイが再生できなくなったりすると、
<br />
かなり萎えますよね？
<br />
</p>
<p>
そこでこの方法をとります。
<br />
</p>
<p>
ひそかに、前述の WireBattler や GuNMeN は、
<br />
（リリースした範囲の）昔のバージョンのリプレイも再生できます。
<br />
</p>
<p>
これは、<strong>リプレイのデータファイルにバージョン番号を埋め込んでおいて、再生時に古いバージョン番号の場合には、古いルーチンを動かしている</strong>のです。
<br />
ですので、昔のリプレイも同じように再生できます。
<br />
</p>
<p>
例えば、GuNMeNは最初にコミケでリリースしたバージョンより、
<br />
現在のリリースバージョンの方がバランス調整がしてあり、
<br />
キーボードでもプレイしやすくなっています。
<br />
なんと、その新しいバージョンでも、
<br />
昔のコミケの時のリプレイデータが普通に再生できるのです！
<br />
（現に、タイトル画面を放っておく事で見られるデモプレイは、昔のバージョンのリプレイをそのままつかっているのです）
<br />
</p>
<p>
その代わり、バグって落ちるリプレイとかは、
<br />
バグ報告をもらって直しても、依然、落ちるままですｗｗｗ
<br />
（今はそうそうないですが、未熟な時代に（WireBattlerを作っていたくらいの時）頻発しました）
<br />
</p>
<p>
</p>
<p>
ただ、パラメータなどを外部に出している時はちょっと処理が増えるので面倒ですが、やる価値はありますよ。
<br />
</p>
<p>
</p>
<p>
ていうか、このこと初めてかいたよ！
<br />
<strong>ユーザーの視点から立つとリプレイデータが使えなくなる、ということは避けるべきは当たり前</strong>なのですが、やっている人どれだけいるのかなあ。
<br />
</p>
<p>
</p>
<p>
大体、リプレイ実装の際の注意点はこんな感じですね。
<br />
</p>
<p>
</p>
<h3><a href="#id_e382b3e383a9e383a0efbc9ae6b48be382b2e383bce996a2e4bf82e381aee383aae38397e383ace382a4e381abe381a4e38184e381a6" name="id_e382b3e383a9e383a0efbc9ae6b48be382b2e383bce996a2e4bf82e381aee383aae38397e383ace382a4e381abe381a4e38184e381a6" id="id_e382b3e383a9e383a0efbc9ae6b48be382b2e383bce996a2e4bf82e381aee383aae38397e383ace382a4e381abe381a4e38184e381a6">&#9632;</a>コラム：洋ゲー関係のリプレイについて</h3>
<p>
個人的には、市販のFPS、RTS類のリプレイが気になっているところです。
<br />
</p>
<p>
昔から FPS、RTSなどは大概可変フレームレートですし、
<br />
どう同期をとっているものやら、と。
<br />
</p>
<p>
自分が一時期プレイしてた Tribes 2 なんかは<strong>途中から記録して、そこから再生も可能</strong>でした。
<br />
<strong>ネットワークゲームですが、記録するマシンのネットワークが遅くてもばっちり対応</strong>できてました。
<br />
（Tribes2のネットコードの優秀さは定評があったのをさしおいても）
<br />
</p>
<p>
もちろん、可変フレームレートでも、他機種でも再生可能でした。
<br />
</p>
<p>
</p>
<p>
あとは、RTSもきちんとできますよね。
<br />
自分がよくリプレイを見ていた Rise of Nations や Command &amp; Conquer Generals あたりもかなりリプレイはきちんと動いていました。
<br />
</p>
<p>
ただ、ほとんどのRTSはバージョンアップしたら、
<br />
前のバージョンのものが再生できなかったり、
<br />
再生できても途中からずれるという、けっこう適当なんだけれども……。
<br />
（パラメータやプログラムなどのバージョンわけの仕組みはずさんな模様）
<br />
</p>
<p>
まあ、この辺の洋ゲーマジックは一度暴いておきたいところです。
<br />
</p>
<p>
参考になるのは Quake3 のソースとか、
<br />
Torque Engine(Tribes2用ゲームエンジン)とかかな？
<br />
</p>
<h3><a href="#id_e381bee381a8e38281" name="id_e381bee381a8e38281" id="id_e381bee381a8e38281">&#9632;</a>まとめ</h3>
<p>
以上のような形でリプレイ実装の記事を書いてみましたが、参考になったでしょうか？
<br />
</p>
<p>
</p>
<p>
ちなみに、<strong>今回の記事で紹介した実際にリプレイが動いている自作ゲーム「WireBattler」、「GuNMeN」、「GanGanGan 体験版」の全てのソースファイル(Delphi用)は<a target="_self" href="http://tobysoft.net/GuNMeNPackage.html">「GuNMeNパッケージ版」</a>に収録されています。</strong>
<br />
</p>
<p>
<strong>実際にリプレイが実装されて動いているゲームとそのソースファイルが見てみたい方は、お手に取ってみて下さい。参考になるのではないかと思います。</strong>
<br />
(各ゲームのソースコードは CDの /omake/source ディレクトリに .zipファイルで入っています )
<br />
</p>
<p>
</p>
<p>
ぜひ、あたなも自作ゲームにリプレイを実装してみてください。
<br />
ゲームの提供の幅が広がるはずです。
<br />
</p>
<p>
</p>
<p>
では、今回はこの辺で終わりにします。
<br />
ありがとうございました。
<br />
</p>
<p>
[2008/07/20] 誤字脱字修正。
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://tobysoft.net/WireBattler.html">WireBattler:自作2D格闘ゲーム</a> 
</li>
<li>
<a target="_self" href="http://tobysoft.net/GuNMeNI.html">GuNMeN:自作2D固定画面アクション</a>
</li>
<li>
<a target="_self" href="http://tobysoft.net/gangangan/">Gan Gan Gan体験版:自作2Dシューティングゲーム</a>
</li>
<li>
<a target="_self" href="http://tobysoft.net/GuNMeNPackage.html">GuNMeNパッケージ版:上記3つセットのパッケージ版。ソース付き</a>
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/07/replay02.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/07/replay02.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">gamedev</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">GanGanGan</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">GuNMeN</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">replay</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">WireBattler</category>
        
         <pubDate>Tue, 15 Jul 2008 06:30:29 +0900</pubDate>
      </item>
            <item>
         <title>[ 開発 ]  ＜警告！＞まだあなたのゲームにリプレイ機能を実装してはいけません！なぜなら……(前編)</title>
         <description><![CDATA[<p>
<strong>この記事を読まずに、あなたのゲームにリプレイ機能を実装するのはあまりに危険です……。</strong>
<br />
</p>
<p>
<strong>なぜなら……。</strong>
<br />
</p>
<p>
<img alt="gamedev01.jpg" src="http://tobysoft.net/diary/images/gamedev01.jpg" width="320" height="240" />
</p>
<p>
</p>
<p>
</p>
<p>
さて、ちょっと前の話題ですが、
<br />
リプレイに関する話題が流行っていました。
<br />
</p>
<ul>
<li>
<a target="_self" href="http://d.hatena.ne.jp/ABA/20080120#p2">リプレイバグフリーは実現可能か - ABA の日誌</a>
</li>
<li>
<a target="_self" href="http://www.murasame.com/source/wlog0801.htm">リプレイ - PlatineDispositif</a>
</li>
<li>
<a target="_self" href="http://heppoko-net.jp/blog/heppoko/2008/01/_7.html">リプレイバグを潰すための七つの方法 (へっぽこさんメモ)</a>
</li>
</ul>
<p>
</p>
<p>
そのことについてうちでの実装方法を書いてみようと思います。
<br />
</p>
<p>
</p>
<p>
うちの場合は、基本的に入力情報を全部記録して、
<br />
再生時に与えてやるという感じです。
<br />
いわゆる<strong>キー入力記録タイプ</strong>。
<br />
</p>
<p>
面倒くさい気がしますが、入力情報を取得するAPIやライブラリにラッパーをかませてやれば簡単です。
<br />
</p>
<p>
大概、WireBattlerとか GuNMeNのときに悩みまくったので、
<br />
それ以降、このタイプの記録方式ではそんなに苦労していないですね。
<br />
</p>
<h3><a href="#id_e887aae58886e381aee383aae38397e383ace382a4e5ae9fe8a385e381aee5ae9fe7b8be" name="id_e887aae58886e381aee383aae38397e383ace382a4e5ae9fe8a385e381aee5ae9fe7b8be" id="id_e887aae58886e381aee383aae38397e383ace382a4e5ae9fe8a385e381aee5ae9fe7b8be">&#9632;</a>自分のリプレイ実装の実績</h3>
<ul>
<li>
<strong><a target="_self" href="http://tobysoft.net/WireBattler.html">WireBattler:2D格闘ゲーム</a></strong>
<br />
リプレイの他に、もっとも連続技をつなげたところから再生する機能もあり
<br />
固定フレームレート
</li>
<li>
<strong><a target="_self" href="http://tobysoft.net/GuNMeNI.html">GuNMeN:2D固定画面アクション</a></strong>
<br />
インターネットランキング対応で、他人のリプレイをダウンロードして再生することもできる。
<br />
固定フレームレート。
</li>
<li>
<strong><a target="_self" href="http://tobysoft.net/gangangan/">Gan Gan Gan:2Dシューティングゲーム</a></strong>
<br />
今のところ体験版のみのリリース。
<br />
ステージごとに再生が可能。
<br />
可変フレームレート（但しベースは60FPS）
</li>
</ul>
<h3><a href="#id_e585a5e58a9be68385e5a0b1e8a898e98cb2e382bfe382a4e38397e381a7e6b097e38292e381a4e38191e3828be38193e381a8e38292e38184e3818fe381a4e3818b" name="id_e585a5e58a9be68385e5a0b1e8a898e98cb2e382bfe382a4e38397e381a7e6b097e38292e381a4e38191e3828be38193e381a8e38292e38184e3818fe381a4e3818b" id="id_e585a5e58a9be68385e5a0b1e8a898e98cb2e382bfe382a4e38397e381a7e6b097e38292e381a4e38191e3828be38193e381a8e38292e38184e3818fe381a4e3818b">&#9632;</a>入力情報記録タイプで気をつけることをいくつか</h3>
<p>
実績を見てわかるように、この記事では、基本ベースフレームレートが固定のものに使えるリプレイのテクニック及び注意点を解説しています。
<br />
</p>
<p>
ぜひゲーム作りにお役立てください。
<br />
</p>
<h4><a href="#id_e98094e4b8ade381a7e3819ae3828ce3819fe38289e382aae383afe383aaefbcbc28efbcbeoefbcbe29efbc8f" name="id_e98094e4b8ade381a7e3819ae3828ce3819fe38289e382aae383afe383aaefbcbc28efbcbeoefbcbe29efbc8f" id="id_e98094e4b8ade381a7e3819ae3828ce3819fe38289e382aae383afe383aaefbcbc28efbcbeoefbcbe29efbc8f">&#9632;</a>途中でずれたらオワリ＼(＾o＾)／</h4>
<p>
この入力情報を記録するタイプでは、
<br />
最初から再生して、途中でずれたらそこで失敗になります。
<br />
<strong>一度ずれたら、その後ずーっとずれっぱなし</strong>になるためです。
<br />
</p>
<p>
なので、かなり厳密に作る必要があります。
<br />
</p>
<h4><a href="#id_e382ade383bce585a5e58a9be381aee8a898e98cb2" name="id_e382ade383bce585a5e58a9be381aee8a898e98cb2" id="id_e382ade383bce585a5e58a9be381aee8a898e98cb2">&#9632;</a>キー入力の記録</h4>
<p>
まず、この方法の基本は<strong>APIから取得したキー入力を全部記録</strong>しておくことです。
<br />
</p>
<p>
かなりメモリーを食うのでは？とか思った人います？
<br />
大丈夫です、安心してください。
<br />
まあ計算すればすぐにわかりますがたいした容量ではありません。
<br />
</p>
<p>
カーソル4方向 + 4ボタンなら 8bits=1byteです。
<br />
60FPSとしたら、30分記録するのに、
<br />
</p>
<pre>
1 * 60 * 60 * 30 = 105 kbytes
</pre>
<p>
2人プレイなら2倍、ボタンが2倍ならさらに2倍になるだけです。
<br />
</p>
<p>
全然大丈夫ですよね？
<br />
</p>
<p>
というか、10年以上前から オンメモリーで全部記録していましたが問題はなかったです。
<br />
もし精神的に嫌なら、zlibのストリームにでも突っ込んでいけばよいのではないでしょうか？
<br />
(WireBattlerのころは一応、自前でリアルタイムにランレングス圧縮をかけてました。今は素でオンメモリーストリームに突っ込んでいるだけです)
<br />
</p>
<p>
記録と再現の仕方ですが、ラッパーを作ってやるとよいです。
<br />
つまり、記録時に実際に入力したキー情報をラッパーを通した段階で記録し、再現時には実際のキーは無視してそのラッパーから記録したものを出力してやるだけです。
<br />
</p>
<p>
そうすれば、キー入力を処理する外側からは、
<br />
まったく同じように見える（＝同じようにプログラムを組める）よね？
<br />
</p>
<h4><a href="#id_e585a8e983a8e5889de69c9fe58c96e38199e3828be38193e381a8" name="id_e585a8e983a8e5889de69c9fe58c96e38199e3828be38193e381a8" id="id_e585a8e983a8e5889de69c9fe58c96e38199e3828be38193e381a8">&#9632;</a>全部初期化すること</h4>
<p>
基本的にプレイ開始時に全部初期化することです。
<br />
初期化を忘れて、前のプレイの状態変数なんかが残っているとずれます。
<br />
</p>
<p>
<strong>一番簡単なのは、オブジェクトのインスタンス確保で、データがすべて初期化されるように最初から組んでしまうこと。</strong>
<br />
</p>
<p>
そうすれば、プレイが始まったらインスタンス確保、
<br />
プレイが終わったらインスタンス開放。
<br />
</p>
<p>
つまり、メモリも一旦全部開放してすっきりさわやかにしてしまうのです。
<br />
</p>
<h4><a href="#id_e6b5aee58b95e5b08fe695b0e782b9e3818ce38289e381bf" name="id_e6b5aee58b95e5b08fe695b0e782b9e3818ce38289e381bf" id="id_e6b5aee58b95e5b08fe695b0e782b9e3818ce38289e381bf">&#9632;</a>浮動小数点がらみ</h4>
<p>
これが実はあまり再現ができてなくてよくわかってないのですが、
<br />
<strong>浮動小数点の丸めモードの違いがあると、計算結果がずれる</strong>んです。
<br />
</p>
<p>
それがどうも他のアプリケーションの影響などで、突然変わることがあるらしいとか。
<br />
（不確定すぎてすいません）
<br />
</p>
<p>
で、かなーり昔から(10年くらい前から)なんですが、
<br />
浮動小数の算術関数に <strong>FINIT でコントロールワードのリセットを入れまくる</strong>っていう方法を使ってました。
<br />
</p>
<p>
例えばこんな感じです。
<br />
</p>
<p>
<textarea name="code" class="delphi:nogutter" cols="60" rows="18">
//****************************************
//  Sinのコントロールワード初期化版
//****************************************
function O3Sin(const X: Real): Real;
var ControlWord: WORD;
begin
  // コントロールワードの退避とリセット
  asm
    FNSTCW ControlWord
    FINIT
  end;
  Result := System.Sin(X);
  // Set8087CW(ControlWord) :)
  asm
    FNCLEX    // 例外抑制
    FLDCW ControlWord
  end;
end;
</textarea>
</p>
<p>
で、Sinは直接呼ばずにこれを通すと。
<br />
</p>
<p>
ただ、この現象については不確実なので責任が持てませんｗ
<br />
</p>
<h4><a href="#id_CPUe381abe38288e3828ae6bc94e7ae97e7b590e69e9ce3818ce5a489e3828fe3828be383a9e382a4e38396e383a9e383aae3818ce38182e3828b" name="id_CPUe381abe38288e3828ae6bc94e7ae97e7b590e69e9ce3818ce5a489e3828fe3828be383a9e382a4e38396e383a9e383aae3818ce38182e3828b" id="id_CPUe381abe38288e3828ae6bc94e7ae97e7b590e69e9ce3818ce5a489e3828fe3828be383a9e382a4e38396e383a9e383aae3818ce38182e3828b">&#9632;</a>CPUにより演算結果が変わるライブラリがある</h4>
<p>
Direct3DのサポートライブラリのD3DXとか使うと、場合わけして勝手に最適化したルーチンが呼ばれるために<strong>CPUによって演算結果が変わる</strong>ようです。
<br />
（主に浮動小数点。またか）
<br />
</p>
<p>
けっこういろいろなゲームの作者さんが「リプレイがずれる」という報告を受けているようなのですが、ほとんどが、これか、前述の浮動小数の誤差だと思います
<br />
</p>
<p>
<a target="_self" href="http://www.01step.net/tobitsuki/bbs/test/read.php/tobi_bbs/1116256631/18">いろいろ解決策はある</a>ようですが、
<br />
自分の場合は、自前実装で回避でした。
<br />
</p>
<p>
というか、Direct3Dまともに使ったことねえｗｗｗ
<br />
(DirectDraw派→CPU描画派→OpenGL派（いまここ）)
<br />
</p>
<p>
</p>
<h3><a href="#id_e382b3e383a9e383a0efbc9aWireBattler20e381aee98094e4b8ade5868de7949fe6a99fe883bd" name="id_e382b3e383a9e383a0efbc9aWireBattler20e381aee98094e4b8ade5868de7949fe6a99fe883bd" id="id_e382b3e383a9e383a0efbc9aWireBattler20e381aee98094e4b8ade5868de7949fe6a99fe883bd">&#9632;</a>コラム：WireBattler の途中再生機能</h3>
<p>
ちなみに、対戦格闘ゲーム「WireBattler」の最も多くつなげた連続技を見られる機能、つまり、途中から再生する機能は、記録時にある地点（地面にダウンしたとき）にフラグを立てておいて、リプレイ時にそこまで<strong>描画を全部すっとばして早送り</strong>しているだけなのです。
<br />
</p>
<p>
なのでCPUが遅いとけっこう時間がかかってしまいます。
<br />
</p>
<h3><a href="#id_e6aca1e59b9ee381abe7b69ae3818f" name="id_e6aca1e59b9ee381abe7b69ae3818f" id="id_e6aca1e59b9ee381abe7b69ae3818f">&#9632;</a>次回に続く</h3>
<p>
長くなりすぎたので続きは次回に！
<br />
</p>
<p>
<a target="_self" href="http://tobysoft.net/diary/archives/2008/07/replay02.html">後編書きました。</a>
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://tobysoft.net/WireBattler.html">WireBattler:自作2D格闘ゲーム</a> 
</li>
<li>
<a target="_self" href="http://tobysoft.net/GuNMeNI.html">GuNMeN:自作2D固定画面アクション</a>
</li>
<li>
<a target="_self" href="http://tobysoft.net/gangangan/">Gan Gan Gan体験版:自作2Dシューティングゲーム</a>
</li>
<li>
<a target="_self" href="http://tobysoft.net/GuNMeNPackage.html">GuNMeNパッケージ版:上記3つセットのパッケージ版。ソース付き</a>
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/07/replay01.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/07/replay01.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">開発</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">gamedev</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">GanGanGan</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">GuNMeN</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">replay</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">WireBattler</category>
        
         <pubDate>Sun, 13 Jul 2008 07:39:38 +0900</pubDate>
      </item>
            <item>
         <title>[ 投機 ]  去年のenSPA読んでた(FX関連)</title>
         <description><![CDATA[<p>
<img alt="trading02.jpg" src="http://tobysoft.net/diary/images/trading02.jpg" width="320" height="240" />
</p>
<p>
最近、投機対象を Forex(FX、為替)に移しています。
<br />
</p>
<p>
それで 情報集めに Forex の雑誌ってないのかなーと
<br />
本屋をうろついていると、
<br />
enSPA(エンスパ) という季刊誌が目に留まり
<br />
予想以上におもしろかった（ネタ的に）ので、
<br />
去年からのバックナンバーを取ってみてました。
<br />
</p>
<p>
</p>
<p>
この雑誌のファーストインプレッションは……
<br />
</p>
<p>
　<strong>ネットで叩かれている人、出すぎｗｗｗｗ</strong>
<br />
</p>
<p>
名前を出すと失礼なので出せないのですが、
<br />
（というか、わかる人は一発でわかる）
<br />
2chとか掲示板でやたら叩かれている人が、
<br />
成功者として出ていたり、アドバイザーとして
<br />
コメントを出していたりして、
<br />
笑ってしまった。
<br />
</p>
<p>
それ以外の有名ブロガーなんかも出ていて、
<br />
興味深い雑誌になっている。
<br />
</p>
<p>
</p>
<p>
内容としては、
<br />
FX関連は、毎回、主に初心者向けの講座と
<br />
成功者、失敗者の特集。
<br />
毎回ですｗ
<br />
</p>
<p>
システムトレードに関する話題も載っていた号も
<br />
あったけれど、これもさわりだけ。
<br />
</p>
<p>
</p>
<p>
あと、サププライムローン前と後で
<br />
ガラリと内容が変わっていて、これは笑……えない。
<br />
</p>
<p>
円高前：キャピタルゲイン派とスワップ派が同じ割合で紹介
<br />
円高後：スワップ派死亡の体験談半数以上
<br />
</p>
<p>
体験談よむだけで、歴史が追体験できる。
<br />
この雑誌のいいところは、失敗談も同じか成功の話以上に載っていることかもしれないなあ。
<br />
</p>
<p>
</p>
<p>
いまから為替に参戦するとしても、
<br />
歴史的イベントを体験できていないというのは不利だろうから、
<br />
こういう雑誌で少しでも知っておくのはよいかもしれない。
<br />
</p>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/07/enspafx.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/07/enspafx.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">投機</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">FX</category>
        
         <pubDate>Thu, 03 Jul 2008 07:13:59 +0900</pubDate>
      </item>
            <item>
         <title>[ webサービス ]  「ねむログ」でどれだけ生活が改善したか</title>
         <description><![CDATA[<p>
<a target="_self" href="http://tobysoft.net/diary/archives/2008/06/post_260.html">先日のエントリー</a>にて、
<br />
</p>
<blockquote>
おかげ様で、不規則な生活は少なくなり、睡眠の傾向はかなり改善されてきました。
<br />
当初はかなりガタガタの生活スタイルでしたから。
<br />
</blockquote>
<p>
なんて書いたのですが、
<br />
睡眠時間の記録サイト<a target="_self" href="http://www.nemulog.jp/">「ねむログ」</a>でどれだけ生活が変わったか？
<br />
実際に見比べてびっくり！！
<br />
</p>
<p>
早速、ごらんに入れましょう。
<br />
</p>
<p>
</p>
<p>
まずは、睡眠時間だけのグラフ。
<br />
</p>
<p>
画像：「ねむログ」付け初めのころの記録（2007年1月、ちょうど1年半前）
<br />
</p>
<p>
<img alt="「ねむログ」昨年の睡眠時間グラフ" src="http://tobysoft.net/diary/images/nemulog_2008_06_20_kyonen_yoko_graph.jpg" width="320" height="332" />
</p>
<p>
画像：今月の記録（2008年6月）
<br />
</p>
<p>
<img alt="「ねむログ」今月の睡眠時間グラフ" src="http://tobysoft.net/diary/images/nemulog_2008_06_20_kotoshi_yoko_graph.jpg" width="320" height="333" />
</p>
<p>
まあ、睡眠時間はそんなに変わらないですよね？（どちらも寝すぎだけど）
<br />
</p>
<p>
</p>
<p>
</p>
<p>
さて、では、<a target="_self" href="http://nemulog.typepad.jp/blog/2008/06/post-113a.html">先日実装された新機能</a>「期間タイプ」のグラフで就寝、起床時間を24時間のタイムスケールで表示してみると……。
<br />
</p>
<p>
</p>
<p>
画像：「ねむログ」付け初めのころの記録（2007年1月、ちょうど1年半前）
<br />
</p>
<p>
<img alt="「ねむログ」昨年の期間タイプグラフ" src="http://tobysoft.net/diary/images/nemulog_2008_06_20_kyonen_kikantype_graph.jpg" width="320" height="331" />
</p>
<p>
リズムガタガタでしたな(´д｀)
<br />
</p>
<p>
</p>
<p>
画像：今月の記録（2008年6月）
<br />
</p>
<p>
<img alt="「ねむログ」今月の期間タイプグラフ" src="http://tobysoft.net/diary/images/nemulog_2008_06_20_kotoshi_kikantype_graph.jpg" width="320" height="331" />
</p>
<p>
リズムがしっかりしてきている！！(｀･ω･´) 
<br />
</p>
<p>
</p>
<p>
　　<span style="font-size:2em">こ、これはすごい！</span>
<br />
</p>
<p>
正直な話、すごいと言わざるをえないｗｗｗｗ
<br />
こりゃ「ねむログ」の開発者様に足を向けて寝られませんなｗ
<br />
（しかも、さっそく新機能が役にたちましたなあ）
<br />
</p>
<p>
ここ一年で、持病のうつ病傾向の改善がかなりあるし、睡眠時間とも相互的な関係もあるだろうし。
<br />
これはよいことだなあ。
<br />
</p>
<p>
この調子で続けていきたいと思う。
<br />
</p>
<p>
※後記[2008/09/25]
<br />
今年のグラフが途中までだったので、6月分全部のグラフに差し替えました。
<br />
</p>
<h3><a href="#id_e58f82e88083e383aae383b3e382af" name="id_e58f82e88083e383aae383b3e382af" id="id_e58f82e88083e383aae383b3e382af">&#9632;</a>参考リンク</h3>
<ul>
<li>
<a target="_self" href="http://www.nemulog.jp/">睡眠時間を記録するサイト | ねむログ</a>
</li>
<li>
<a target="_self" href="http://nemulog.typepad.jp/blog/2008/06/post-113a.html">ねむログ日記～睡眠時間が気になる！: 睡眠グラフが新しくなりました！（起床・就寝グラフ追加）</a>
</li>
</ul>
<div style="margin:0px;clear:both;line-height:0%;"></div>]]></description>
         <link>http://tobysoft.net/diary/archives/2008/06/post_270.html</link>
         <guid>http://tobysoft.net/diary/archives/2008/06/post_270.html</guid>
                  <category domain="http://www.sixapart.com/ns/types#category">webサービス</category>
        
                  <category domain="http://www.sixapart.com/ns/types#tag">lifehack</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">webサービス</category>
                  <category domain="http://www.sixapart.com/ns/types#tag">ねむログ</category>
        
         <pubDate>Fri, 20 Jun 2008 08:49:20 +0900</pubDate>
      </item>
      
   </channel>
</rss>
