<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>アルゴリズム</title><link>http://blogs.wankuma.com/myugaru/category/1696.aspx</link><description>アルゴリズム</description><managingEditor>myugaru (myugaru@wankuma.com)</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>確率の変な話</title><link>http://blogs.wankuma.com/myugaru/archive/2008/04/05/131805.aspx</link><pubDate>Sat, 05 Apr 2008 16:24:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/04/05/131805.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/131805.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/04/05/131805.aspx#Feedback</comments><slash:comments>9</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/131805.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/131805.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT color=#0000ff&gt;（※最新情報：れいさんからの情報により以下は冗談ページであることが判明しました。とりあえずモヤモヤが晴れて良かったです＾＾。&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;れいさんありがとうございました）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ゲーム理論で色々検索していましたところ、とても興味深い怪しい話を見つけました。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;絶対何かおかしい&lt;/STRONG&gt;のですが、著者は妙に数学に詳しいとみえて説得力ある文になっていてどこに矛盾があるのか、理論に無理があるのか、が凡人な私には上手くそれを看破できないのであります。&lt;/P&gt;
&lt;P&gt;ちなみに書かれた時期が不明なので今この人に連絡つけたりできるホットな話題なのかどうかが不明です。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.asahi-net.or.jp/~RP9H-TKHS/kakuri01.htm" target=_blank&gt;●「その１．神はサイコロをもてあそぶか？」&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ここでは全世界のサイコロが平均すると出目が平均値になる、という事を神がかり的に説明しています。&lt;/P&gt;
&lt;P&gt;つまりある時点で６の目が出ると、次のサイコロを振ると６の目の出る確率が６分の１より若干減るのだ、と力説しています。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.asahi-net.or.jp/~RP9H-TKHS/kakuri02.htm" target=_blank&gt;●「その２．運は実力のうちか？」&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ここでは打率の話を持ってきて、ある人は確率を変動する能力を持っているのだ、ということを力説しています。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.asahi-net.or.jp/~RP9H-TKHS/kakuri03.htm" target=_blank&gt;●「その３．カメはうさぎに勝ったのか？」&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;#8221;その１&amp;#8221;に&amp;#8221;その２&amp;#8221;を当てはめると６の目を５分の１で出せる能力の人間だって居るって事になるという話になります。&lt;/P&gt;
&lt;P&gt;その矛盾点をも怪しい言葉のマジックでうまく丸め込もうとしています。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;私が少なくとも興味をもったのは&lt;/P&gt;
&lt;P&gt;１．この著者はここに書かれたことを本気で書いているのか？（ある意味変人？&lt;FONT color=#0000ff&gt;確信犯&lt;/FONT&gt;）&lt;/P&gt;
&lt;P&gt;２．この著者はここに書かれたことをウソと知って書いているのか？&lt;FONT color=#0000ff size=1&gt;（&lt;STRIKE&gt;確信犯&lt;/STRIKE&gt;）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;なのかです。&lt;/P&gt;
&lt;P&gt;どっちにしても私の周りに現実に居たら私はきっと避けて通りたい種族ではあります。&lt;/P&gt;
&lt;P&gt;避けて通れない場合には尋常じゃない被害を受けることも予想できます＞＜怖いです・・。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;先に書きましたとおりこの人にすぐ連絡したり、あるいは説得して論破するとかできるとは思えないです。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;ここでは出来れば私にこの人の書いた文章の正しい読み方？をお教えくださるコメントを希望しています＾＾；&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;（※確信犯の意味を私が間違って逆に理解していました。すみません凪瀬さんご指摘ありがとうございます）&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/131805.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>委譲というのは２通りあります～私の理解した答っぽいもの</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/24/129393.aspx</link><pubDate>Mon, 24 Mar 2008 18:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/24/129393.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/129393.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/24/129393.aspx#Feedback</comments><slash:comments>6</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/129393.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/129393.aspx</trackback:ping><description>&lt;P&gt;&lt;STRONG&gt;●前エントリー&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A id=_17a5446777f337e0_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl0_TitleUrl href="/myugaru/archive/2008/03/23/129186.aspx" addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;多重継承をコンポーネント技術で考える&lt;/FONT&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;A id=_17a5446777f337e0_HomePageDays_DaysList__ctl0_DayItem_DayList__ctl1_TitleUrl href="/myugaru/archive/2008/03/24/129263.aspx" addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;多重継承を前提に考えなければ・・・&lt;/FONT&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;●元ネタ&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://blogs.wankuma.com/nagise/archive/2008/03/21/129008.aspx" target=_blank addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;実装を委譲できる言語を作ればいいのかもしれない&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;●大元のネタ&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://d.hatena.ne.jp/m-hiyama/20080304/1204615775"&gt;http://d.hatena.ne.jp/m-hiyama/20080304/1204615775&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;（↑の檜山さんの方で何か動きがあるようです。明日以降にエントリーするとかしないとか・・・。楽しみですね）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;●まず委譲というのは２通りあります&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE class=syntax-highlight&gt;&lt;SPAN class=synType&gt;class&lt;/SPAN&gt; A
{
    &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; event EventHandler MouseClick;
    &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; OnMouseClick()
    {
        &lt;SPAN class=synStatement&gt;if&lt;/SPAN&gt; (MouseClick != null) {
            MouseClick(&lt;SPAN class=synStatement&gt;this&lt;/SPAN&gt;, &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; EventArgs());
        }
    }
}
    
&lt;SPAN class=synType&gt;class&lt;/SPAN&gt; B
{
    A a = &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; A();
    
    &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; B()
    {
        a.MouseClick += &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; EventHandler(MouseClick);
    }
    
    &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; MouseClick(object sender, EventArgs e)
    {
        Console.WriteLine(&lt;SPAN class=synConstant&gt;"マウスが押されました"&lt;/SPAN&gt;);
    }
}
    
&lt;SPAN class=synType&gt;class&lt;/SPAN&gt; C
{
    B b = &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; B();
    
    &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; MouseClick()
    {
        b.MouseClick(&lt;SPAN class=synStatement&gt;this&lt;/SPAN&gt;, &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; EventArgs());
    }
}
&lt;/PRE&gt;
&lt;P&gt;上のコードでクラスＡもクラスＣもクラスＢへ処理を委譲しています。&lt;BR&gt;処理を自分ではなく相手にゆだねるというのが委譲の仕組みです。&lt;BR&gt;インスタンスが必ず関与します。&lt;BR&gt;ただし含まれる方が委譲しているのか委譲されているのかというのは&lt;BR&gt;上記でわかるようにどちらも実現が可能です。&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;●凪瀬さんと私の会話での委譲&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;私は凪瀬さんはクラスＣを想定していると考えました。&lt;BR&gt;私はこのクラスＡの形を私はコンポーネントであると言いました。&lt;BR&gt;そして、よりＩＤＥにサポートされているクラスＡを推しました。&lt;BR&gt;この時点で実はコンポーネントが委譲であると気付いていませんでした。&lt;BR&gt;ついさっきふっと気が付きこのエントリーを書くに至りました。&lt;BR&gt;どちらも委譲であったために技術的に交換が可能だったわけです。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;●ダイアモンド継承&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ここでダイアモンド継承を考えます。&lt;/P&gt;&lt;PRE&gt;class A { Aの部分 }

　　
class B1 : A { Aの部分+B1の追加部分 }
　　

class B2 : A { Aの部分+B2の追加部分 }
　　

class C : B1, B2 { Aの部分+B1の追加部分+B2の追加部分 }
&lt;/PRE&gt;
&lt;P&gt;ここで示したダイアモンド継承のクラスＣの中にＡの部分は１つしかありません。&lt;BR&gt;私は前エントリーでこのクラスＣの中にAの部分が２つ含まれると勘違いしました。&lt;BR&gt;それは委譲で表現するという事から考えたためでした。&lt;BR&gt;委譲というのは先に言ったように２通り書けますが、どちらもかならずインスタンスを介する技術だからです。&lt;BR&gt;この場合ですとＢ１とＢ２のインスタンスが必要になり、どちらのインスタンスにもＡの部分は含まれます。 &lt;BR&gt;本来のダイアモンド継承はインスタンスを介さない&lt;STRONG&gt;継承でしか作り得ない技術なのです。&lt;/STRONG&gt; &lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;●凪瀬さんの考える委譲とは&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;それでも凪瀬さんが委譲でなんとかできるという理由がなんとなくわかりました。&lt;BR&gt;凪瀬さんはさらにこのダイアモンド継承の図の最後のクラスから外向けのインターフェースを&lt;BR&gt;指して委譲で実現できるとおっしゃっているように思いました。 &lt;BR&gt;すなわち&lt;/P&gt;&lt;PRE&gt;class C : B1, B2
{
    B1 b1;
    B2 b2;
    
    public FuncA()
    {
        b1.FuncA();
    }
}&lt;/PRE&gt;
&lt;P&gt;ここでFuncAはクラスAに含まれるメソッドです。&lt;BR&gt;ここではb1とb2という２つのインスタンスがありメモリ上のＡの部分は両方に存在します。&lt;BR&gt;しかしＣというクラスを外から見るとクラスＣのpublicなFuncAというメソッドは一つです。&lt;BR&gt;そしてこのFuncAがb1かb2のどちらのFuncAを呼び出すかは自由だと言うことだと思いました。&lt;BR&gt;&lt;STRONG&gt;メモリイメージが２つあるというのは論点ではなく、Ｃから外向きインターフェース上のAの部分が一つになるように委譲でも表現可能であるという意味&lt;/STRONG&gt;だと捉えました。&lt;/P&gt;
&lt;P&gt;凪瀬さんこれで正解でしょうか？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/129393.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>多重継承をコンポーネント技術で考える</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/23/129186.aspx</link><pubDate>Sun, 23 Mar 2008 09:43:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/23/129186.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/129186.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/23/129186.aspx#Feedback</comments><slash:comments>744</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/129186.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/129186.aspx</trackback:ping><description>&lt;P&gt;最近&lt;A href="http://d.hatena.ne.jp/myugaru/20080322/1206157848" target=_blank&gt;モチベダウンのmyugaru&lt;/A&gt;です。おはようございます。&lt;/P&gt;
&lt;P&gt;気分転換に凪瀬さんとかずきさんにトラックバックしてみようと思います。&lt;/P&gt;
&lt;P&gt;凪瀬さんの &lt;A href="http://blogs.wankuma.com/nagise/archive/2008/03/21/129008.aspx" target=_blank&gt;実装を委譲できる言語を作ればいいのかもしれない&lt;/A&gt; より&lt;BR&gt;&lt;EM&gt;「檜山正幸のキマイラ飼育記なんで多重継承はそんなに嫌われるのか？ ちょっくら分析してみるかあたりからの着想&lt;BR&gt;多重継承が～という話題は継承をインターフェースの継承だけにした上で、実装を委譲する機能を言語に持たせれば解決するかもしれない。」&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;引用されている「多重継承が～」という話を読んでみました。&lt;BR&gt;多重継承を必要とするケースは世の中にあると私も思いました。&lt;BR&gt;そして多重継承を使わずにどう解決しているか？に目を向けてみました。&lt;/P&gt;
&lt;P&gt;まず現実問題として。&lt;BR&gt;C#で考えるとインターフェースの多重実装は可能ですがクラスの多重継承はできません。&lt;BR&gt;C#で委譲が優遇されていないことはかずきさんが確認されたとおりです。（&lt;A href="http://blogs.wankuma.com/kazuki/archive/2008/03/23/129171.aspx" target=_blank&gt;[Ruby][Java][C#]丸投げ委譲&lt;/A&gt;）&lt;/P&gt;
&lt;P&gt;では多重継承はC#では不要なのかというと話は違うと思います。&lt;BR&gt;先に書きましたが、それを必要とするケースは世の中にあると思うのです。&lt;BR&gt;少し考えてきて私はそれはコンポーネント技術で置き換えられないか？と発想してみました。&lt;/P&gt;
&lt;P&gt;次のフォームを見ると、&lt;BR&gt;２つのボタンは２つのタブに乗っています。&lt;BR&gt;それら２つのタブがフォームへさらに乗っています。&lt;BR&gt;これを&lt;STRONG&gt;&lt;STRIKE&gt;&lt;FONT color=#ff0000&gt;ボタンのダイアモンド継承&lt;/FONT&gt;&lt;/STRIKE&gt;&lt;FONT color=#0000ff&gt;基底クラスが同じ場合の多重継承&lt;/FONT&gt;&lt;/STRONG&gt;を表すと考えてみます。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;（11:50：↑επιστημηさんの本を読んだはずなのに・・・シャノンさんの御指摘により修正しました。以降も同様の修正あり）&lt;/FONT&gt;&lt;/P&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080323_1.png"&gt; 
&lt;P&gt;継承・委譲というとボタンだったら継承・委譲後もボタンになるべきでしょう。&lt;BR&gt;上の図で言えばタブはタブのままでありボタンを継承や委譲してると言えません。&lt;BR&gt;しかし機能の量に注目しますとタブはボタンを貼り付けたおかげでボタンの機能が増えました。&lt;BR&gt;&lt;FONT color=#ff0000&gt;たとえばこれが&lt;/FONT&gt;継承・委譲だったら継承したボタンは元のボタンの機能に新しい機能を追加し&lt;FONT color=#ff0000&gt;&lt;STRIKE&gt;ます。&lt;/STRIKE&gt;ているでしょう。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;（11:19：シャノンさんのご指摘により上の赤字部分を修正しました。紛らわしくてすみません。御指摘ありがとうございました）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;どちらも機能量は元のボタンの機能＋αとなります。&lt;BR&gt;なので&lt;STRONG&gt;両者は機能面で同等の問題を解決できる手段になりうる&lt;/STRONG&gt;と考えても間違いじゃないと思います。&lt;/P&gt;
&lt;P&gt;凪瀬さんが書いている&lt;FONT color=#ff0000&gt;&lt;STRIKE&gt;ダイアモンド継承&lt;/STRIKE&gt;&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;基底クラスが同じ場合の多重継承&lt;/FONT&gt;でのどちらの親の実装を使うべきか問題は、&lt;BR&gt;ここに見えるどちらのボタンを押すべきか？という問題に置き換えられるかと思います。&lt;BR&gt;両方見せておいてユーザーが必要な方のボタンを押します。&lt;BR&gt;実際には両者の内容を識別できるようなラベルが書いてあるべきでしょう。&lt;/P&gt;
&lt;P&gt;多重継承をコンポーネント技術の話に全て置き換えられるか？&lt;BR&gt;と問い詰められるともう少し踏み込みが必要でしょう。&lt;BR&gt;私がコンポーネント技術を推すのはIDEによって多くの恩恵が受けられるメリットや、&lt;BR&gt;そもそもC#などの言語で多重継承がなくなった経緯に関係があるのでは？&lt;BR&gt;など色々と考えての勝手な推論です。&lt;/P&gt;
&lt;P&gt;継承・委譲・コンポーネント技術の違いを入力の流れで書きます。&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;継承・委譲の入力は子から親へ伝わります。&lt;BR&gt;&lt;/STRONG&gt;&lt;/EM&gt;　ユーザーからの入力は子が受けます。&lt;BR&gt;　親へはbase呼び出しなどで処理を中継して伝えていきます。&lt;BR&gt;　追加機能は中継時に前処理や後処理で記述します。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;コンポーネントの入力は親から子へ伝わります。&lt;BR&gt;&lt;/EM&gt;&lt;/STRONG&gt;　ユーザーからの入力は親にあたるコンポーネントに入ります。&lt;BR&gt;　子であるコンテナにはイベントによって処理を中継します。&lt;BR&gt;　追加機能は後処理や前処理に該当するイベントハンドラーを作って記述します。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●具体的にコードを提示してみます&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;これはかずきさんが例とされていたものと同等です。&lt;BR&gt;+=を書くとイベントハンドラーが自動実装されます。&lt;BR&gt;先に書いたとおりイベントのサポートにはどの言語のIDEも多大に力が注がれているでしょう。&lt;BR&gt;VSでもコード入力の手間はeclipseでの委譲実装並みだと思いますがどうでしょうか？&lt;BR&gt;実際私はほとんど頭文字＋tabとかで入力ができました。&lt;BR&gt;ここでは後処理のハンドラーを実装してみました。&lt;BR&gt;PiyoからhogeへアクセスするHogeプロパティもあわせて実装しています。&lt;/P&gt;&lt;PRE class=syntax-highlight&gt;&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System;
&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System.Collections.Generic;
&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System.Linq;
&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System.Text;
    
&lt;SPAN class=synType&gt;namespace&lt;/SPAN&gt; Com.Wankuma.Kazuki.Deleg
{
    &lt;SPAN class=synType&gt;class&lt;/SPAN&gt; Program
    {
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; Main(string[] args)
        {
        }
    }
    
    &lt;SPAN class=synType&gt;class&lt;/SPAN&gt; Hoge
    {
        &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; event Action AfterFoo;
        &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; event Action AfterBoo;
    
        &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; Foo()
        {
            Console.WriteLine(&lt;SPAN class=synConstant&gt;"Hoge#Foo"&lt;/SPAN&gt;);
            AfterFoo();
        }
        &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; Boo()
        {
            Console.WriteLine(&lt;SPAN class=synConstant&gt;"Hoge#Boo"&lt;/SPAN&gt;);
            AfterBoo();
        }
    }
    
    &lt;SPAN class=synType&gt;class&lt;/SPAN&gt; Piyo
    {
        &lt;SPAN class=synStatement&gt;private&lt;/SPAN&gt; Hoge hoge = &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; Hoge();
        &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; Hoge Hoge { get { &lt;SPAN class=synStatement&gt;return&lt;/SPAN&gt; hoge; } }
    
        &lt;SPAN class=synStatement&gt;public&lt;/SPAN&gt; Piyo()
        {
            hoge.AfterFoo += &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; Action(hoge_AfterFoo);
            hoge.AfterBoo += &lt;SPAN class=synStatement&gt;new&lt;/SPAN&gt; Action(hoge_AfterBoo);
        }
    
        &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; hoge_AfterBoo()
        {
        }
    
        &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; hoge_AfterFoo()
        {
        }
    }
}
&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●問題点&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;たぶん継承・委譲よりもイベントによる処理は重いと考えられます。&lt;BR&gt;でもC#に限って言えば多重継承は実質不可能ですので&lt;BR&gt;可読性を落とすような裏技的なコーディングスタイルをとるよりは&lt;BR&gt;素直にコンポーネントに頼った方がよさそうに思います。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/129186.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>Pixel-to-Pixel速度比較（観点が不明確だった）</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/15/127869.aspx</link><pubDate>Sat, 15 Mar 2008 19:55:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/15/127869.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/127869.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/15/127869.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/127869.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/127869.aspx</trackback:ping><description>&lt;P&gt;今日は「&lt;A id=_e01f1b52f8963ce0_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl0_TitleUrl href="/myugaru/archive/2008/03/13/127590.aspx" addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;Pixel-to-Pixel速度比較&lt;/FONT&gt;&lt;/A&gt; 」のまとめをしたかったのですが、&lt;/P&gt;
&lt;P&gt;うっかり大変なことを忘れておりました。&lt;/P&gt;
&lt;P&gt;家族でちょっとしたイベントのある夜だったのです。&lt;/P&gt;
&lt;P&gt;・・・ということであまり綺麗にまとめる時間がなくなってしまいました。&lt;/P&gt;
&lt;P&gt;でもざっくり書いてみます。（あとで修正するかもしれません）&lt;/P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;25:00追記&lt;/FONT&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;前回&lt;STRONG&gt;「ある条件」&lt;/STRONG&gt;って書いてたのでそれに即して書き記します。&lt;/P&gt;
&lt;P&gt;私が目的にしていることはDirectXで背景画をリアルタイムで書き換える手段の検討でした。&lt;/P&gt;
&lt;P&gt;目的から考えれば手段としてはGDI+に頼ること自体が方向性として微妙だったなと途中で気付いたのです。&lt;/P&gt;
&lt;P&gt;つまり&lt;STRONG&gt;「私がやりたいことはライブラリImageUtilsで処理を書く必要があるかどうか」&lt;/STRONG&gt;という条件だったわけです。&lt;/P&gt;
&lt;P&gt;流れる星などのエフェクト効果はピクセルで描画できたら実装できそうに思いました。そこからGDI+へ考えを進めるのではなくて&lt;STRONG&gt;DirectXのピクセルレンダリングのパスへそういうピクセル単位でのドットON/OFFを設定できるのか&lt;/STRONG&gt;という方向へ話をもっていくべきでした。この話の方向はいづれ考えてみようと思います。&lt;/P&gt;
&lt;P&gt;そういうわけですが。&lt;/P&gt;
&lt;P&gt;たとえ微妙方向性だとしても乗りかかってしまった船なので、とりあえずこのエントリーは決着は付けようと思っています。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;●ColorMatrixが速いのはおかしい&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;私は実は計測する前からLockBits/UnlockBitsの方が速いと予想していました。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;（追記：前回納得できていない、と書いたのは、上の追記に書いたとおり話が微妙だってたことに気付いたのもありますが、予想が外れていて納得できないという意味もありました）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;前回ColorMatrixが速くなったような結論が出たのは、&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;速度重視思想だけでは無いImageUtilsを使用したため&lt;/STRONG&gt;だと考えれば納得できます。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●作者junkiさんの記事&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://junki.lix.jp/csgr/002ColorDataAccess1.htm"&gt;Bitmap の内部色データにアクセスする (1)&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;「このコードは、前回の配列コピーの場合より、さらに４倍以上速い。この方法は &lt;B&gt;unsafe{}&lt;/B&gt; ブロックを含むが、もっとも高速なので以後はこの方法を使うことにする。」&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;この時点ではライブラリでunsafeを使用する事を考えていらっしゃいました。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://junki.lix.jp/csgr/005ColorDataAccess3.htm"&gt;&lt;FONT color=#002c99&gt;Bitmap の内部色データにアクセスする (3)&lt;/FONT&gt;&lt;/A&gt; &lt;/P&gt;
&lt;P&gt;&lt;EM&gt;「図は、今回つくったクラスをつかって画像のすべてのピクセルの &lt;B&gt;R&lt;/B&gt; 成分と &lt;B&gt;G&lt;/B&gt; 成分を入れ換えたものである。&lt;/EM&gt;&lt;A href="http://code.junki.main.jp/?eid=270324" target=_blank&gt;&lt;FONT color=#002c99&gt;&lt;EM&gt;ここ&lt;/EM&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;EM&gt;でテストしたように、&lt;/EM&gt;&lt;A href="http://junki.lix.jp/csgr/004ColorDataAccess2.htm" target=_blank&gt;&lt;FONT color=#002c99&gt;&lt;EM&gt;前回&lt;/EM&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;EM&gt;の &lt;B&gt;unsafe&lt;/B&gt; コードに比べると ３－４割時間がかかって遅くなるが、なによりポインタをあらわに使わないで済むことは重要である。」&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;しかしunsafeを使用するデメリットなどをjunkiさんなりに考慮された上で最終的には時間がかかってもunsafe未使用方式を採用に到っておられます。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;●まとめ&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;ライブラリImageUtilsの思想は「GDI+の描画処理で加工できないBitmap（具体的には８ビットのカラーパレット式ビットマップなど）を加工できる」という事を可能とするライブラリでした。&lt;/P&gt;
&lt;P&gt;私が&lt;FONT color=#ff0000&gt;そのImageUtilsを使って処理を書きたい&lt;/FONT&gt;のであれば&lt;FONT color=#ff0000&gt;ColorMatrixでは処理を書けない&lt;/FONT&gt;ということになります。&lt;/P&gt;
&lt;P&gt;私が&lt;FONT color=#ff0000&gt;扱う画像がGDI+で加工する事をしたい＆unsafeは使いたくない&lt;/FONT&gt;のであれば&lt;FONT color=#ff0000&gt;ColorMatrixを使えばよい&lt;/FONT&gt;ということになります。&lt;/P&gt;
&lt;P&gt;私が&lt;FONT color=#ff0000&gt;扱う画像がGDI+で加工する事をしたい＆unsafeを使っても速くしたい&lt;/FONT&gt;のであれば&lt;FONT color=#ff0000&gt;Lockbits/UnlockBits&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;を使えばよい&lt;/FONT&gt;ということになります。&lt;/P&gt;
&lt;P&gt;つまり&lt;STRONG&gt;何の速度差を知りたかったのか&lt;/STRONG&gt;を明確にしなければ議論することができない話だったとわかりました。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●次回？&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;ということでもうちょっと観点を明確にしてちゃんと実測してみたいと思います。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/127869.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>Pixel-to-Pixel速度比較</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/13/127590.aspx</link><pubDate>Thu, 13 Mar 2008 22:19:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/13/127590.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/127590.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/13/127590.aspx#Feedback</comments><slash:comments>129</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/127590.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/127590.aspx</trackback:ping><description>&lt;P&gt;&lt;A id=_dfa1f0ff10b46b6f_HomePageDays_DaysList__ctl7_DayItem_DayList__ctl2_TitleUrl href="/myugaru/archive/2008/03/06/126503.aspx" addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;&lt;EM&gt;リフレクション&lt;/EM&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;EM&gt; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;A id=_dfa1f0ff10b46b6f_HomePageDays_DaysList__ctl4_DayItem_DayList__ctl2_TitleUrl href="/myugaru/archive/2008/03/09/126920.aspx" addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;&lt;EM&gt;[C#,VB.NET]Graphics.DrawImage(image,0,0)の落とし穴&lt;/EM&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;EM&gt; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;A id=_dfa1f0ff10b46b6f_HomePageDays_DaysList__ctl1_DayItem_DayList__ctl1_TitleUrl href="/myugaru/archive/2008/03/12/127332.aspx" addEventLogcatcher="true"&gt;&lt;FONT color=#000080&gt;&lt;EM&gt;VC#Express2008で.NET Frameworkのライブラリ・ソースへステップイン&lt;/EM&gt;&lt;/FONT&gt;&lt;/A&gt;&lt;EM&gt; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;これらのエントリーは実はちょっと確認したいことがあった流れで書いてました。&lt;BR&gt;確認したかったのはGDI+の処理速度です。&lt;BR&gt;具体的には&lt;STRONG&gt;「同じ結果を導く異なる描画方法の処理速度差」&lt;/STRONG&gt;になると思います。&lt;BR&gt;もちろん速い方を選びたいのが人情でしょう。&lt;BR&gt;今日は上の流れで見つけたある２つの同じ結果を導く違う描画方法の比較をしようと思います。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;HR id=null&gt;
●比較対象処理&lt;BR&gt;&lt;/FONT&gt;Pixel-to-Pixel処理&lt;/STRONG&gt;の一種であるグレースケール化です。&lt;BR&gt;方式１：Bitmap.LockBits/Bitmap.UnlockBitsで画像の画素情報に直接アクセス&lt;BR&gt;方式２：System.Drawing.Imaging.ColorMatrixによる色の行列変換 
&lt;P&gt;&lt;/P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;●テストプログラム詳細&lt;/P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;
&lt;P&gt;&lt;A href="http://myugaru.wankuma.com/GrayScaleSpeedTest.zip" target=_blank&gt;ダウンロード：C# - GrayScaleSpeedTest.zip&lt;/A&gt;&lt;/P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;P&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;FONT color=#0000ff&gt;共通部分&lt;BR&gt;&lt;/FONT&gt;・画像はjpg画像に限定し24bitピクセルフォーマットでの比較を行う。&lt;BR&gt;・まずファイルオープンダイアログでjpgを選択&lt;BR&gt;・フォームクラスのローカル変数originalBmpに画像を保管&lt;BR&gt;・各方式はメニューで選択&lt;BR&gt;・選択された方式にoriginalBmpを引き渡しピクチャボックスへ結果を描画させる&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;方式１部分&lt;BR&gt;&lt;/FONT&gt;・junki氏の画像処理ライブラリ「ImageUtils」&lt;FONT color=#ff0000&gt;（※１）&lt;/FONT&gt;のGrayScale24()を使用（このメソッドは内部でBitmap.LockBits/Bitmap.UnlockBitsを使用してグレースケール化を行う）&lt;BR&gt;・引数にBitmapの参照を渡し返値は参照に上書きして返ってくるので、方式１開始部分で一旦originalBmpのクローンを作ってGrayScale24()で処理し返値をピクチャボックスへ設定する。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;※１：Image Processing Utilities for C#2.0 (VC# 2005) Copyright junki, Jan, 2006 -&lt;BR&gt;junki氏 HP：&lt;/FONT&gt;&lt;A href="http://junki.lix.jp/"&gt;&lt;FONT color=#ff0000&gt;http://junki.lix.jp/&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#ff0000&gt;　ImageUtils：&lt;/FONT&gt;&lt;A href="http://junki.lix.jp/archives2/ImageUtils.lzh"&gt;&lt;FONT color=#ff0000&gt;http://junki.lix.jp/archives2/ImageUtils.lzh&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;方式２部分&lt;BR&gt;&lt;/FONT&gt;・ColorMatrixに次の行列を設定&lt;BR&gt;&lt;PRE&gt;[ 0.299, 0.299, 0.299, 0.0, 0.0 ]
[ 0.587, 0.587, 0.587, 0.0, 0.0 ]
[ 0.114, 0.114, 0.114, 0.0, 0.0 ]
[   0.0,   0.0,   0.0, 1.0, 0.0 ]
[   0.0,   0.0,   0.0, 0.0, 1.0 ]&lt;/PRE&gt;・ImageAttributesを作成し行列を設定&lt;BR&gt;・変換用にoriginalBmpと同サイズ、24bitピクセルフォーマットのビットマップ作成&lt;BR&gt;・Graphics.DrawImageにImageAttributesを渡し変換用ビットマップに対してグレースケールで描画を行う。&lt;BR&gt;・変換用ビットマップをピクチャボックスへ設定する。
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;●結果&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;フリー写真素材&lt;FONT color=#ff0000&gt;（※２）&lt;/FONT&gt;をお借りして方式１と方式２でそれぞれ１００回ずつ変換を行った。&lt;BR&gt;以下はそれぞれの方式のかかった時間を５回ずつ表示させています&lt;/P&gt;
&lt;P&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080313_2.png"&gt; &lt;/P&gt;
&lt;P&gt;ColorMatrixを用いた方が速いという結果になりました。&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;※２：ren氏HP：&lt;/FONT&gt;&lt;A href="http://sk-d.a-thera.jp/"&gt;&lt;FONT color=#ff0000&gt;http://sk-d.a-thera.jp/&lt;/FONT&gt;&lt;/A&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;ダウンロード：&lt;/FONT&gt;&lt;A href="http://www.photolibrary.jp/profile/artist_244_1.html"&gt;&lt;FONT color=#ff0000&gt;http://www.photolibrary.jp/profile/artist_244_1.html&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;
&lt;P&gt;●実は納得していなかった&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;私はこのテストでは&lt;FONT color=#a52a2a&gt;ColorMatrixの優位を証明できていない&lt;/FONT&gt;と思っています。&lt;BR&gt;jpgが悪いとか誤字とか行列の値が違ってるとかループ回数が少ないとか多いとかではありません。&lt;BR&gt;このテストでも&lt;STRONG&gt;ある条件下&lt;/STRONG&gt;では私も十分に納得すると思います。&lt;BR&gt;でも今回は&lt;STRONG&gt;その条件ではない&lt;/STRONG&gt;ので納得していないわけです。&lt;/P&gt;
&lt;P&gt;ではある条件とは一体何のことでしょう？&lt;BR&gt;＃うーーん。実は引っ張るほど大した話じゃないかもですが・・・&lt;/P&gt;
&lt;P&gt;この続きは明日か・・・明後日かもです。&lt;BR&gt;色々と考えて楽しみにしててください。 &lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;＃聞くと本当に大した事じゃないので怒らないでくださいね。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/127590.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>コルーチンのyieldはDoEventsです</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/11/127239.aspx</link><pubDate>Tue, 11 Mar 2008 14:35:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/11/127239.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/127239.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/11/127239.aspx#Feedback</comments><slash:comments>7</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/127239.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/127239.aspx</trackback:ping><description>&lt;P&gt;前エントリー：&lt;A href="http://blogs.wankuma.com/myugaru/archive/2008/03/10/127092.aspx"&gt;http://blogs.wankuma.com/myugaru/archive/2008/03/10/127092.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;siokoshouさんのコメントを拝見しまして私の説明力・説得力の無さを痛感しました。&lt;BR&gt;ちょっと悔しいので今日は別の切り口で説明のリベンジをしたいと思います。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;（また失敗に終わる予感もしますが・・・）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;話はWindowsプログラミングです。&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;ボタン１をクリックすると画面の中央に&lt;BR&gt;「ボタン１が押されました」&lt;BR&gt;という文字が0.5秒間隔で点滅し、&lt;BR&gt;ボタン２を押すとそれが消える&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;と仮定してください。&lt;/P&gt;
&lt;P&gt;以下のようにプログラムを作ったとします。&lt;/P&gt;&lt;PRE&gt;ボタン１クリック()
{
　while (ボタン２フラグ == OFF) {
　　while (0.5秒間)
　　　「ボタン１が押されました」表示
　　while (0.5秒間)
　　　//何もしない
　}
}
　
ボタン２クリック()
{
　ボタン２フラグ = ON
}&lt;/PRE&gt;
&lt;P&gt;一見仕様は満たされています。しかし上のプログラムは上手く動作しません。&lt;BR&gt;ボタン１をクリックしてしまうと画面が真っ白になってしまうことでしょう。&lt;BR&gt;誰でも一度くらいは経験があるフリーズという状態です。&lt;BR&gt;タスクの切替が考慮されていないために起こる現象です。&lt;/P&gt;
&lt;P&gt;改良したボタン１クリックが次のプログラムです。&lt;/P&gt;&lt;PRE&gt;ボタン１クリック()
{
　while (ボタン２フラグ == OFF) {
　　while (0.5秒間) {
　　　「ボタン１が押されました」表示
　　　DoEvents();
　　}
　　while (0.5秒間) {
　　　DoEvents();
　　}
　}
}&lt;/PRE&gt;
&lt;P&gt;DoEventsはここではWindowsへ制御を渡す役割をする関数と思ってください。&lt;BR&gt;・・・長く説明すると馬鹿にしてるとお叱りを受けますからここでやめます（苦笑&lt;/P&gt;
&lt;P&gt;コルーチンで同じことを考えましょう。&lt;BR&gt;ボタン１クリックは次のように書けます。&lt;/P&gt;&lt;PRE&gt;ボタン１クリック()
{
　while (ボタン２フラグ == OFF) {
　　while (0.5秒間) {
　　　「ボタン１が押されました」表示
　　　yield return 適当;
　　}
　　while (0.5秒間) {
　　　yield return 適当;
　　}
　}
}&lt;/PRE&gt;
&lt;P&gt;コルーチンのyieldは状態をレジュームしメインループに制御を戻します。&lt;BR&gt;次回の呼び出し時はyieldの次から再開されます。&lt;BR&gt;DoEventsと全く同じですね。&lt;FONT color=#ff0000&gt;ここは大丈夫ですよね？&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;さてまたWindowsへ戻ります。&lt;BR&gt;このボタン１クリックを呼び出しているのはWindowsならばWinProcに当ります。&lt;BR&gt;そこにメインループが書かれています。&lt;/P&gt;&lt;PRE&gt;WinProc()
{
　while (true) {
　　switch (イベント) {
　　　case ボタン１:
　　　　ボタン１クリック();
　　　　break;
　　　case ボタン２：
　　　　ボタン２クリック();
　　　　break;
　　}
　}
}&lt;/PRE&gt;
&lt;P&gt;上のコードには実は隠された処理が多く存在しています。&lt;BR&gt;たとえばDoEventでの処理中断再開の機構が見えません。&lt;BR&gt;しかしここで全て書くにはあまりに膨大です。&lt;BR&gt;それにWindowsも一般的になってきたので省略します。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000&gt;余談ですが。昔々&lt;STRIKE&gt;Windows98がまだ健在だった時代。&lt;/STRIKE&gt;&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;今も健在だとお叱り受けますね＾＾；；&lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;BR&gt;自分の会社が初めて業務でWindowsを扱うことになった頃に上のような処理で、&lt;BR&gt;「ボタン１の処理中にどうしてボタン２へ飛んでいけるのか」&lt;BR&gt;を何日も何日も何日もかけて上司に説明した事を思い出しています（笑&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;話を戻します。私が実装を予定しているゲームメインはこうなります。&lt;BR&gt;WinProcでは隠されていたと説明した部分もここでは露見します。&lt;/P&gt;&lt;PRE&gt;GameLoop()
{
　IEnumerator ボタン１タスク = ボタン１クリック();
　IEnumerator ボタン２タスク = ボタン２クリック();
　List &lt;IENUMERATOR&gt;タスクリスト
　タスクリスト.Add(ボタン１タスク)
　タスクリスト.Add(ボタン２タスク)
　while (true) {
　　　&lt;FONT color=#a52a2a&gt;foreach (タスク in タスクリスト)&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;（★１）&lt;/FONT&gt;
　　　　if (!タスク.MoveNext()) {
　　　　　//終了したタスクを除外
　　　　　タスクリスト.Remove(タスク)
　　　　}
　　}
　}
}&lt;/PRE&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;★１：（15:40追記）実際には私の独自実装をほどこしたLinkedListを用います。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;説明の本質から外れるので便宜上foreachを用いましたが現実のC#言語のforeachはノードを削除することはできません。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;削除を考慮した独自のLinkedList拡張→&lt;A href="http://blogs.wankuma.com/myugaru/archive/2008/03/06/126581.aspx"&gt;http://blogs.wankuma.com/myugaru/archive/2008/03/06/126581.aspx&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Windowsでの実装とコルーチンでの実装をご覧いただきました。&lt;BR&gt;両者は&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;「処理を一旦中断し別タスクへ処理のチャンスを渡す」&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;という全く同じ基本思想で成り立っています。&lt;/P&gt;
&lt;P&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;●では再度お尋ねします。コルーチンのyieldは何を返すのでしょうか？&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;コルーチンのyieldが返す値についてもう一度だけ考えてみてほしいと思います。&lt;BR&gt;列挙のyieldではありません。コルーチンのyieldです。&lt;/P&gt;
&lt;P&gt;WindowsのDoEventsととらえてこれを再考するといかがでしょうか？&lt;BR&gt;例題を見てもらうと両者の位置付けは全く同一です。&lt;BR&gt;果たして&lt;STRONG&gt;DoEventsは何を返すべき&lt;/STRONG&gt;でしょう？&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;ボタン１クリックの返値ではありませんよ。&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;yield returnがCurrentを返すと考えると上記での&lt;STRONG&gt;DoEventsにとってのCurrentに該当するもの&lt;/STRONG&gt;は一体なんなのでしょうか？&lt;BR&gt;ボタン１の所属する・・この場合はFormになるのでしょうか？&lt;BR&gt;そうでなければ何であれば適当ですか？&lt;/P&gt;
&lt;P&gt;またコルーチンを列挙とどうしてもとらえたいという方にはボタン１クリック()というハンドラーを列挙と捕らえることにどういう意味があるかを再考いただければと思います。&lt;/P&gt;
&lt;P&gt;前エントリーから私の意見は&lt;STRONG&gt;「コルーチンのyieldの返値は無意味であり不要である」&lt;/STRONG&gt;です。&lt;BR&gt;DoEventsだって返値は現実にありませんものね。&lt;/P&gt;
&lt;P&gt;お時間ありましたら再度皆さんのご感想などいただけたらうれしく思います。&lt;/P&gt;
&lt;P&gt;ここまで読んでお付き合いくださった方に感謝いたします。ありがとうございます。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/127239.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>C#のyieldに対する誤解と私の見解</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127092.aspx</link><pubDate>Mon, 10 Mar 2008 20:26:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127092.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/127092.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127092.aspx#Feedback</comments><slash:comments>21</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/127092.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/127092.aspx</trackback:ping><description>&lt;P&gt;コルーチンの話を進める上でどうしてもC#のyieldを理解してもらわなくてはいけません。&lt;/P&gt;
&lt;P&gt;凪瀬さんも少し誤解されているように感じました。&lt;/P&gt;
&lt;P&gt;ここで少し解説したいと思います。&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;STRONG&gt;&lt;FONT size=4&gt;●実は何も返してないyield return&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;ご存じなければ驚くかもしれませんが&lt;FONT color=#ff0000&gt;yield returnは正確には何も返していません&lt;/FONT&gt;。&lt;BR&gt;まずMoveNextの返値ではありません。&lt;BR&gt;MoveNextの返値はMoveNextの成功可否をboolで返します。&lt;BR&gt;つまり列挙が継続可能かを返します。&lt;BR&gt;ではyield returnは何を返しているかというと、&lt;BR&gt;IEnumeratorインターフェースのCurrentプロパティの内容を更新しています。&lt;BR&gt;&lt;FONT color=#ff0000&gt;言語構文上returnという単語を用いているだけなのです。&lt;/FONT&gt;&lt;BR&gt;なので「何か返している」という誤解が生じているように思います。 
&lt;P&gt;&lt;/P&gt;&lt;PRE class=syntax-highlight&gt;&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System;
&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System.Collections;
&lt;SPAN class=synType&gt;namespace&lt;/SPAN&gt; CoRoutine
{
    &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; &lt;SPAN class=synType&gt;class&lt;/SPAN&gt; Program
    {
        [STAThread]
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; Main(string[] args)
        {
            IEnumerator e = TaskA();
            &lt;SPAN class=synStatement&gt;for&lt;/SPAN&gt; (&lt;SPAN class=synType&gt;int&lt;/SPAN&gt; i = &lt;SPAN class=synConstant&gt;0&lt;/SPAN&gt;; i &lt; &lt;SPAN class=synConstant&gt;10&lt;/SPAN&gt;; i++) {
                &lt;SPAN class=synType&gt;bool&lt;/SPAN&gt; b = e.MoveNext();
                Console.WriteLine(e.Current);
            }
        }
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; IEnumerator TaskA()
        {
            &lt;SPAN class=synStatement&gt;while&lt;/SPAN&gt; (&lt;SPAN class=synConstant&gt;true&lt;/SPAN&gt;) {
                &lt;SPAN class=synStatement&gt;for&lt;/SPAN&gt; (&lt;SPAN class=synType&gt;int&lt;/SPAN&gt; i = &lt;SPAN class=synConstant&gt;1&lt;/SPAN&gt;; i &lt;= &lt;SPAN class=synConstant&gt;3&lt;/SPAN&gt;; i++) {
                    yield &lt;SPAN class=synStatement&gt;return&lt;/SPAN&gt; i;
                }
            }
        }
    }
}
&lt;/PRE&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080310_2.png"&gt; 
&lt;P&gt;&lt;BR&gt;&lt;FONT size=4&gt;&lt;STRONG&gt;
&lt;HR id=null&gt;
●Currentで表現できる状態変化&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;具体的なゲームの話をしましょう。&lt;BR&gt;「男の子がまばたきしている」&lt;BR&gt;ことを考えます。&lt;BR&gt;Boyには状態を変化させるUpdateメソッドと&lt;BR&gt;現状を画面へ表示するRenderメソッドがあります。 &lt;PRE&gt;Boy boy = new Boy();
while (boy.生きている間)
{
    boy.Update();
    boy.Render();
}&lt;/PRE&gt;
&lt;P&gt;Updateメソッドの実装は次のようになるでしょう。&lt;BR&gt;３項演算を使えばもっとシンプル化も可能です。&lt;/P&gt;&lt;PRE&gt;void Update()
{
    if (this.eye == CLOSE)
       this.eye = OPEN;
    else
       this.eye = CLOSE;
}&lt;/PRE&gt;
&lt;P&gt;ここでは目というプロパティに値を代入することで&lt;BR&gt;状態変化を表現しています。&lt;BR&gt;これはyield構文を使うとこのように書けるでしょう。&lt;/P&gt;&lt;PRE&gt;class Boy
{
    IEnumerator enumerator;
    public Boy()
    {
        enumerator = GetEnumerator();
    }
    void Update()
    {
        enumerator.MoveNext();
        eye = enumerator.Current;
    }
    IEnumerator GetEnumerator()
    {
        while (true) {
            yield return OPEN;
            yield return CLOSE;
        }
    }
}&lt;/PRE&gt;
&lt;P&gt;
&lt;HR id=null&gt;
&lt;STRONG&gt;&lt;FONT size=4&gt;●Currentでは表現できないケース&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;さて別の実装を考えます。&lt;BR&gt;「女の子が携帯メールを打ちながら笑いながら歩いている」&lt;BR&gt;ことを考えます&lt;BR&gt;GirlはBoyと同じく状態を変化させるUpdateメソッドと&lt;BR&gt;現状を画面へ表示するRenderメソッドがあります。&lt;BR&gt;メインループはBoyと同じなので省略します。&lt;BR&gt;yieldを使わない場合、今回のUpdateメソッドはこのように&lt;BR&gt;なっているとします。&lt;/P&gt;&lt;PRE&gt;void Update()
{
    // メール内容を追加する
    string s = GetNextMailSentence();
    this.phone.Add(s);
    // 歩く
    MoveStep();
}&lt;/PRE&gt;
&lt;P&gt;状態変化はすべてメソッドによって実装されています。&lt;BR&gt;この場合、反論はあるかも知れませんが私はyieldの実装はこのようにするのを理想と考えています。&lt;/P&gt;&lt;PRE&gt;class Girl
{
    IEnumerator enumerator;
    public Girl()
    {
        enumerator = GetEnumerator();
    }
    void Update()
    {
        enumerator.MoveNext();
    }
    IEnumerator GetEnumerator()
    {
        while (true) {
            // メール内容を追加する
            string s = GetNextMailSentence();
            this.phone.Add(s);
            // 歩く
            MoveStep();
            yield return 0;
        }
    }
}&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;HR id=null&gt;
●私の見解&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;状態変化が１つのプロパティの代入による場合、&lt;BR&gt;yield returnの返値としてそれを表現することができます。&lt;BR&gt;しかし現実には&lt;BR&gt;・複数のプロパティによって表現された状態&lt;BR&gt;・代入で表現できない状態変化&lt;BR&gt;などは多くありますので一般論的にみるとyield returnによる一つの値の上書きには意味を持たせる必然性は全くないと私は考えます。&lt;/P&gt;
&lt;P&gt;むしろyieldを思想として列挙を考えていない別言語のyieldになぞらえて使用しているのである、という意思表示のためにもコルーチンとしてのyieldは無意味な値を返すべきだと考えます。&lt;BR&gt;それはコルーチン向けの言語で返値が存在していない理由の一つだとこじつけられそうにも思います。&lt;BR&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/127092.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>コルーチンはマイクロスレッドでありファイバーである</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127059.aspx</link><pubDate>Mon, 10 Mar 2008 17:09:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127059.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/127059.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127059.aspx#Feedback</comments><slash:comments>297</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/127059.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/127059.aspx</trackback:ping><description>&lt;P&gt;（前エントリー：&lt;A href="http://blogs.wankuma.com/myugaru/archive/2008/03/10/127005.aspx"&gt;http://blogs.wankuma.com/myugaru/archive/2008/03/10/127005.aspx&lt;/A&gt;）&lt;/P&gt;
&lt;P&gt;前エントリーのコルーチンという概念は様々な人が独立して発見しているようです。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;（人間って素晴らしいですね！）&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;なので色々な単語で表現されているようです。&lt;/P&gt;
&lt;P&gt;そのなかでも&lt;STRONG&gt;マイクロスレッド&lt;/STRONG&gt;や&lt;STRONG&gt;ファイバー&lt;/STRONG&gt;が有名みたいです。&lt;/P&gt;
&lt;P&gt;（あと今回は&lt;STRIKE&gt;面倒なので&lt;/STRIKE&gt;言及してませんがtry～catch構文とか&lt;BR&gt;C言語のlongjump()とか古いBASICのON ERRORからのRESUMEなんかでも&lt;BR&gt;同一概念を表現する手段としてひょっとしたら使い道がありそうです。）&lt;/P&gt;
&lt;P&gt;&lt;FONT size=5&gt;&lt;/FONT&gt;?&lt;/P&gt;
&lt;P&gt;&lt;FONT size=5&gt;●&lt;/FONT&gt;まずマイクロスレッドの紹介です。全くコルーチンと同じ内容です。&lt;/P&gt;
&lt;P&gt;前エントリーで凪瀬さんが返値を使っていないのがキショクワルイとの指摘でしたが、&lt;/P&gt;
&lt;P&gt;このマイクロスレッドの参照ＵＲＬにかかれている例をみてもらうと返値を使っていないという&lt;/P&gt;
&lt;P&gt;例にもなっています。そして&lt;FONT color=#ff0000&gt;&lt;STRONG&gt;とても完成度が高いドキュメント&lt;/STRONG&gt;&lt;/FONT&gt;です。（ゲームも完成度は相当高いです）&lt;/P&gt;
&lt;P&gt;＃この仕様はさっそくそのまま模倣させてもらおうかとｗｗ&lt;/P&gt;
&lt;P&gt;&lt;A href="http://f27.aaa.livedoor.jp/~thdmhul/pukiwiki/pukiwiki.php?%A5%DE%A5%A4%A5%AF%A5%ED%A5%B9%A5%EC%A5%C3%A5%C9%B9%D6%BA%C2"&gt;マイクロスレッド講座 - 弾幕風Wiki&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.geocities.co.jp/SiliconValley-Oakland/9951/products/th_dnh.html"&gt;東方弾幕風 - と～ほ～GC&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;?&lt;/P&gt;
&lt;P&gt;&lt;FONT size=5&gt;●&lt;/FONT&gt;つぎにファイバーの紹介です。&lt;/P&gt;
&lt;P&gt;と思ったのですがゲーム的な説明ページを見つけられませんでした。&lt;/P&gt;
&lt;P&gt;ファイバーというのはRuby言語にそのものずばりのクラスが存在しています。&lt;/P&gt;
&lt;P&gt;ここは、&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;&lt;FONT color=#ff0000&gt;Ruby言語にお詳しい方にエントリーを書いていただいて&lt;/FONT&gt;&lt;FONT color=#ff0000&gt;トラックバック&lt;/FONT&gt;&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;いただけるととても嬉しいです（タリキホンガンといいますｗｗ）&lt;/P&gt;
&lt;P&gt;&lt;A href="http://doc.loveruby.net/refm/api/view/class/Fiber"&gt;class Fiber - Rubyリファレンスマニュアル刷新計画&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;?&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#008000&gt;17:50追記&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#008000&gt;シャノンさんよりWIN32APIにCreateFiber()なるものがあるとのご指摘をいただきました。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#008000&gt;なのでこちらについてもお詳しい方からのトラバを（ｒｙ&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#008000&gt;シャノンさん、ありがとうございました。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/127059.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>コルーチンと運命の出会い</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127005.aspx</link><pubDate>Mon, 10 Mar 2008 11:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127005.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/127005.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/10/127005.aspx#Feedback</comments><slash:comments>363</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/127005.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/127005.aspx</trackback:ping><description>&lt;P&gt;ああ、とうとう出会ってしまいました。たぶんちょっとゲームに詳しい人ならば「myugaruはいつこれに気付くのだろう？」とか思っていたのではないでしょうか？&lt;/P&gt;
&lt;P&gt;かれこれ３ヶ月くらいかかってやっと出会いました。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff size=5&gt;コ　ル　ー　チ　ン&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;今かなり笑われてる気がするけど気にせず感動に浸っておきます。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#0000ff size=5&gt;なんて素敵なコルーチン。&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;おかげで私が考えていた「ややこしいタスクシステム構想」はほとんど０に帰しましたｗ&lt;/P&gt;
&lt;P&gt;じゃあこっから真面目にコルーチンについて語ります。&lt;/P&gt;
&lt;P&gt;
&lt;HR id=null&gt;

&lt;P&gt;&lt;/P&gt;&lt;A href="http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%AB%E3%83%BC%E3%83%81%E3%83%B3"&gt;コルーチン - Wikipedia&lt;/A&gt; 
&lt;P&gt;この構造をゲーム関連の情報集めをしている際に見つけた。&lt;BR&gt;なるほどこれは確かにすごい発想だと思う。&lt;BR&gt;そしてC#のyieldは正にこの機能を実現するためにあると思った。&lt;BR&gt;色々やってみると２つの利点が見えた。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;HR id=null&gt;
第１の利点．ゲームでのタスクシステムに利用できる&lt;/FONT&gt;&lt;/STRONG&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;もちろん一番はっきりとした利点はこれである。&lt;BR&gt;簡単に説明すると例えば並列動作する２つのゲームタスクを考える。&lt;BR&gt;タスクＡは３つの状態を繰り返しタスクＢは２つの状態を繰り返すと仮定する。&lt;BR&gt;実際には足踏みをするキャラだったり煙突から上がる煙だったりするかも知れない。&lt;BR&gt;コルーチンによる驚異的明瞭コードはこうなる。&lt;/P&gt;&lt;PRE class=syntax-highlight&gt;&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System;
&lt;SPAN class=synStatement&gt;using&lt;/SPAN&gt; System.Collections;
    
&lt;SPAN class=synType&gt;namespace&lt;/SPAN&gt; CoRoutine
{
    &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; &lt;SPAN class=synType&gt;class&lt;/SPAN&gt; Program
    {
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; &lt;SPAN class=synType&gt;int&lt;/SPAN&gt; stateA, stateB;
    
        [STAThread]
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; &lt;SPAN class=synType&gt;void&lt;/SPAN&gt; Main(string[] args)
        {
            var a = TaskA();
            var b = TaskB();
            &lt;SPAN class=synStatement&gt;for&lt;/SPAN&gt; (&lt;SPAN class=synType&gt;int&lt;/SPAN&gt; i = &lt;SPAN class=synConstant&gt;0&lt;/SPAN&gt;; i &lt; &lt;SPAN class=synConstant&gt;10&lt;/SPAN&gt;; i++) {
                a.MoveNext();
                b.MoveNext();
                Console.WriteLine(&lt;SPAN class=synConstant&gt;"A{0} B{1}"&lt;/SPAN&gt;, stateA, stateB);
            }
            Console.ReadLine();
        }
    
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; IEnumerator TaskA()
        {
            &lt;SPAN class=synStatement&gt;while&lt;/SPAN&gt; (&lt;SPAN class=synConstant&gt;true&lt;/SPAN&gt;) {
                &lt;SPAN class=synStatement&gt;for&lt;/SPAN&gt; (stateA = &lt;SPAN class=synConstant&gt;1&lt;/SPAN&gt;; stateA &lt;= &lt;SPAN class=synConstant&gt;3&lt;/SPAN&gt;; stateA++) {
                    yield &lt;SPAN class=synStatement&gt;return&lt;/SPAN&gt; &lt;SPAN class=synConstant&gt;0&lt;/SPAN&gt;;
                }
            }
        }
    
        &lt;SPAN class=synType&gt;static&lt;/SPAN&gt; IEnumerator TaskB()
        {
            &lt;SPAN class=synStatement&gt;while&lt;/SPAN&gt; (&lt;SPAN class=synConstant&gt;true&lt;/SPAN&gt;) {
                &lt;SPAN class=synStatement&gt;for&lt;/SPAN&gt; (stateB = &lt;SPAN class=synConstant&gt;1&lt;/SPAN&gt;; stateB &lt;= &lt;SPAN class=synConstant&gt;2&lt;/SPAN&gt;; stateB++) {
                    yield &lt;SPAN class=synStatement&gt;return&lt;/SPAN&gt; &lt;SPAN class=synConstant&gt;0&lt;/SPAN&gt;;
                }
            }
        }
    }
}
&lt;/PRE&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080310_1.png"&gt; 
&lt;P&gt;&lt;BR&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;
&lt;HR id=null&gt;
第２の利点．リバースエンジニアリングを阻止できる&lt;/FONT&gt;&lt;/STRONG&gt; 
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;先日リバースエンジニアリングの話題を出した。&lt;BR&gt;&lt;A href="http://blogs.wankuma.com/myugaru/archive/2008/03/06/126503.aspx"&gt;http://blogs.wankuma.com/myugaru/archive/2008/03/06/126503.aspx&lt;/A&gt;&lt;BR&gt;内容は私が他人のプログラムを解析する話になっていたが、&lt;BR&gt;これが逆に&lt;FONT color=#800080&gt;私のプログラムを誰かに解析されるって事になると、&lt;BR&gt;ずいぶんと勝手な言い分だけどあまり嬉しくはない。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;だがここで朗報はyieldによるコルーチンは少なくとも&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;現バージョンのReflectorでは元のソースに復元が出来ない&lt;/STRONG&gt;&lt;/FONT&gt;のだ。&lt;/P&gt;
&lt;P&gt;更に好都合なのは&lt;STRONG&gt;&lt;FONT color=#0000ff size=4&gt;コルーチンにこそゲームの核となるビジネスロジックの大半が記述される&lt;/FONT&gt;&lt;/STRONG&gt;のである。&lt;/P&gt;
&lt;P&gt;試しに上のソースをReflectorにかけてみた。結果は上のたったあれだけのソースがgotoの応酬でとんでもない事になっている。&lt;FONT color=#ff0000&gt;（応酬ってほど多くは無かったね＾＾；；）&lt;/FONT&gt;興味のある方はリンク先をご覧いただきたい。&lt;/P&gt;
&lt;P&gt;上のソースのReflectorの出力結果→&lt;A href="http://myugaru.wankuma.com/20080310CoRoutine.txt"&gt;http://myugaru.wankuma.com/20080310CoRoutine.txt&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;?Ｐ．Ｓ．もしyield returnに対応したリバースエンジニアツールをご存知ならご一報くださいね＾＾；；；&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/127005.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>myugaru (myugaru@wankuma.com)</dc:creator><title>[C#,VB.NET]Graphics.DrawImage(image,0,0)の落とし穴</title><link>http://blogs.wankuma.com/myugaru/archive/2008/03/09/126920.aspx</link><pubDate>Sun, 09 Mar 2008 10:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/myugaru/archive/2008/03/09/126920.aspx</guid><wfw:comment>http://blogs.wankuma.com/myugaru/comments/126920.aspx</wfw:comment><comments>http://blogs.wankuma.com/myugaru/archive/2008/03/09/126920.aspx#Feedback</comments><slash:comments>59</slash:comments><wfw:commentRss>http://blogs.wankuma.com/myugaru/comments/commentRss/126920.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/myugaru/services/trackbacks/126920.aspx</trackback:ping><description>&lt;P&gt;&lt;FONT color=#008000 size=4&gt;&lt;STRONG&gt;[C#,VB.NET]Graphics.DrawImage(image,0,0)の落とし穴&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#008000 size=1&gt;&lt;STRONG&gt;サブタイトル：単に女の子の画像を張りたかっ(ry&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT color=#ff0000&gt;12:00 すみません若干認識がずれていたようですので赤で修正しました&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Graphics.DrawImage(image,0,0)は等倍表示を意味します。しかしこの等倍表示には２通りの意味があります。&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●確認プログラム&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;確認のために以下のプログラムをダウンロードして実行してください。&lt;/P&gt;
&lt;P&gt;これはDrawImage(image,0,0)で実装された単なる画像ビュアーです。&lt;/P&gt;
&lt;P&gt;C#とVB.NETを用意してます。&lt;BR&gt;&lt;A href="http://myugaru.wankuma.com/DrawImageCheck_src.zip"&gt;http://myugaru.wankuma.com/DrawImageCheck_src.zip&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;実行形式も用意しました。実行には.Net Framework3.5が必要です。&lt;BR&gt;&lt;A href="http://myugaru.wankuma.com/DrawImageCheck_bin.zip"&gt;http://myugaru.wankuma.com/DrawImageCheck_bin.zip&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●確認手順&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;プログラムを実行すると単なるフォームが表示されます。↓の画像をドラッグ＆ドロップしてみてください。 &lt;BR&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080309_50.bmp"&gt; &lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;(c)elouai.com - Candybar 4 Doll Maker &lt;/FONT&gt;&lt;A href="http://elouai.com/candybar4/dollmakergirl.php"&gt;&lt;FONT size=1&gt;http://elouai.com/candybar4/dollmakergirl.php&lt;/FONT&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;ブラウザで表示されているものより拡大されましたか？手持ちの画像でもこの確認プログラムとブラウザにドラッグ＆ドロップして確認してみてください。両者で見た目のサイズが違っているものはありませんか？&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●原因&lt;BR&gt;&lt;/FONT&gt;&lt;/STRONG&gt;DrawImage(イメージ, 0, 0)は「物理サイズで等倍表示する」事を意味しています。&lt;BR&gt;ですから「論理サイズでの等倍表示」を期待する人にとっては等倍と見えません。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;すなわち&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;確認プログラムは「物理サイズ等倍表示」&lt;/FONT&gt;&lt;BR&gt;&lt;FONT color=#ff0000&gt;ブラウザなどは「論理サイズ等倍表示」だという違いがこの現象を起こしています。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●解説&lt;BR&gt;&lt;/FONT&gt;１．解像度&lt;BR&gt;&lt;/STRONG&gt;イメージには解像度と呼ばれるプロパティが存在しています。&lt;BR&gt;水平方向の解像度＝イメージ.HorizontalResolution&lt;BR&gt;垂直方向の解像度＝イメージ.VerticalResolution&lt;BR&gt;ディスプレイにも解像度があります。例えば私の17インチディスプレイで&lt;STRIKE&gt;&lt;FONT color=#ff0000&gt;1024&amp;#215;768表示時には&lt;/FONT&gt;&lt;/STRIKE&gt;解像度96dpiになっています。&lt;FONT color=#ff0000&gt;解像度は1024&amp;#215;768などを800&amp;#215;600に変えても変わるものではなくディスプレイそのものの能力値として機能しているようです。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;２．画像に解像度が設定されるタイミング&lt;BR&gt;&lt;/STRONG&gt;画像の解像度の決まるタイミングは&lt;FONT color=#ff0000&gt;ブラウザのような画像解像度を無視するアプリによって&lt;/FONT&gt;画像ストリームとしてファイルに保存される瞬間です。&lt;BR&gt;ほとんどの場合は使っているディスプレイの解像度がその画像に設定されます。&lt;/P&gt;
&lt;P&gt;以下のリンクを右クリックから「対象をファイルに保存」でPCへ保存してください。&lt;BR&gt;&lt;A href="http://myugaru.wankuma.com/image/20080309_50.bmp"&gt;http://myugaru.wankuma.com/image/20080309_50.bmp&lt;/A&gt;&lt;BR&gt;この場合は画像ではなく単にファイルとして保存されるので本来の画像に設定された解像度が維持されます。&lt;BR&gt;保存した画像ファイルをExplorer上で右クリックしてプロパティを確認してみてください。&lt;BR&gt;この画像が解像度50dpiで作成されているのだというのが確認できます。 &lt;BR&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080309_1.png"&gt; 
&lt;P&gt;
&lt;P&gt;次に先ほどの女の子の画像上を右クリックして&lt;FONT color=#ff0000&gt;「名前を付けて画像を保存」&lt;/FONT&gt;でPCへ保存してみてください。&lt;BR&gt;お使いのディスプレイに合わせてその解像度が設定されるかと思います。&lt;BR&gt;先ほど同様に保存した画像ファイルのプロパティを確認してみてください。&lt;BR&gt;（ブラウザによっては50dpiのままのものもあるかもしれません。IEはディスプレイ解像度に変わりました）&lt;BR&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080309_2.png"&gt; 
&lt;P&gt;※ディスプレイ解像度はコントロールパネルの画面などから確認ができます。&lt;BR&gt;&lt;IMG src="http://myugaru.wankuma.com/image/20080309_3.png"&gt;&amp;nbsp; 
&lt;P&gt;&lt;STRONG&gt;２．物理サイズでの等倍&lt;BR&gt;&lt;/STRONG&gt;物理サイズというのは画像のインチ数でのサイズの事を指します。&lt;/P&gt;
&lt;P&gt;上の確認プログラムの動作はこの物理サイズを等倍とするプログラムになっています。&lt;/P&gt;
&lt;P&gt;先ほどの女の子の画像の論理サイズ（ピクセルサイズ）は横150&amp;#215;縦290です。&lt;/P&gt;
&lt;P&gt;物理サイズ横＝150&amp;#247;50＝3インチ&lt;BR&gt;物理サイズ縦＝290&amp;#247;50＝5.8インチ&lt;/P&gt;
&lt;P&gt;の画像だといえます。&lt;/P&gt;
&lt;P&gt;それを96dpiのディスプレイに物理サイズで等倍表示するとどういう事が起こるかというと、&lt;/P&gt;
&lt;P&gt;横ピクセル＝3&amp;#215;96＝288&lt;BR&gt;縦ピクセル＝5.8&amp;#215;96＝556.8&lt;/P&gt;
&lt;P&gt;つまりディスプレイ上で288&amp;#215;556ピクセルで表示される事を意味します。&lt;BR&gt;これは論理サイズでは拡大表示となります。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;&lt;STRIKE&gt;物理サイズでの等倍のシンプルな確認方法はディスプレイ&lt;/STRIKE&gt;&lt;STRIKE&gt;解像度を変えてみる事です。&lt;BR&gt;試しにディスプレイを1024&amp;#215;768や800&amp;#215;600などに変えてみてください。&lt;BR&gt;物理サイズでの等倍を行うプログラムではその見た目のサイズは変わりません。&lt;/STRIKE&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;ディスプレイの能力によって96dpiが決まるので1024&amp;#215;768を800&amp;#215;600にする行為はこの能力の変更には直結していません。したがってこの場合見た目のサイズも変わってしまうという結果になります。確認が不足しておりました。すみません。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;３．論理サイズでの等倍&lt;BR&gt;&lt;/STRONG&gt;論理サイズというのは画像のピクセル数でのサイズの事を指します。&lt;BR&gt;ブラウザの動作は論理サイズを等倍とするプログラムになっています。&lt;BR&gt;DrawImageのサイズ指定バージョンは画像の解像度を無視しディスプレイ解像度で表示することを意味しています。&lt;BR&gt;DrawImage(image,0,0,image.Width,image.Height)は論理サイズでの等倍に利用できます。（可能な人は先ほどのプログラムを修正して確認してください）&lt;BR&gt;論理サイズでの等倍の場合はディスプレイ解像度で表示されるわけですから、当然ディスプレイの解像度を1024&amp;#215;768や800&amp;#215;600に変えるとその物理サイズであるインチ数でのサイズは変わる事になります。&lt;FONT color=#ff0000&gt;これは前述の通り論理サイズ等倍だけの話ではありませんでした。すみません。&lt;/FONT&gt;&lt;BR&gt;先の画像のように意図的に50dpiを設定している画像だったなら50dpiのディスプレイというのは見かけませんので、ほとんどの場合は製作者の意図したサイズで表示されていないという事を意味しています。&lt;FONT color=#0000ff&gt;この意味は多少あっていると思われます。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size=4&gt;●対策&lt;BR&gt;&lt;/FONT&gt;１．画像の解像度を変更する方法&lt;BR&gt;&lt;/STRONG&gt;残念ながら通常のWindows付属ペイントだとこれは出来ません。&lt;BR&gt;画像解像度を簡単に変えることが出来るフリーのペイントツールがあります。&lt;BR&gt;&lt;A href="http://www.getpaint.net/"&gt;http://www.getpaint.net/&lt;/A&gt;&lt;BR&gt;以下のように解像度のみ修正できます。&lt;BR&gt;・[イメージ]→[キャンバスサイズ]の解像度の数値をかえる&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;２．とりあえず論理サイズの方が一般的？&lt;BR&gt;&lt;/STRONG&gt;一般に普及しているブラウザやペイントツールの動作を見てもディスプレイへの表示時はほとんどが画像の解像度を無視しているようです。&lt;BR&gt;なので画像を単純にブラウジングするような場合にはDrawImage(image,0,0,image.Width,image.Height)とサイズ指定して論理サイズ等倍を意識したつくりにする方が良いように思います。&lt;/P&gt;
&lt;P&gt;あまり需要は無いのかもですが、何かのプログラムでディスプレイ解像度に依存しない（つまり物理サイズが必要な）局面が出てきた場合にはこのエントリーの事を思い出して欲しいと思います。&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#ff0000&gt;物理サイズ等倍というのは見た目での等倍実現に寄与していないようです。現在のディスプレイの能力に見合ったサイズとしてそのサイズを表現するという意味合いで使われているように思います。不確かな記述をしてしまい申し訳ありませんでした。&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size=1&gt;最後に・・・ここまで書いてからふっと見ると・・・ほとんどここに書いてました。ヘルプも空気も嫁てません。。→&lt;/FONT&gt;&lt;A href="http://msdn2.microsoft.com/ja-jp/library/558kfzex(VS.80).aspx"&gt;&lt;FONT size=1&gt;http://msdn2.microsoft.com/ja-jp/library/558kfzex(VS.80).aspx&lt;/FONT&gt;&lt;/A&gt; &lt;BR&gt;&lt;FONT size=1&gt;・・・開き直って私なりにまとめたのはこれで良しとしときます。&lt;/FONT&gt;&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/myugaru/aggbug/126920.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>