<?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>HIRASE CONNECTION WK</title><link>http://blogs.wankuma.com/hirase/</link><description>programming collection</description><managingEditor>T.Hirase</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>T.Hirase</dc:creator><title>[C#] スタティックなメンバは、そのクラスが始めて使われるときに初期化されるという誤解でハマった８月のある日</title><link>http://blogs.wankuma.com/hirase/archive/2008/10/02/158019.aspx</link><pubDate>Thu, 02 Oct 2008 22:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/10/02/158019.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/158019.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/10/02/158019.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/158019.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/158019.aspx</trackback:ping><description>&lt;p&gt;C# にて、「スタティックなメンバは、そのクラスが始めて使われるときに初期化されるという誤解」をしていたという、ある自分のある８月の話。&lt;/p&gt;
&lt;p&gt;次のようなコードで、不思議なことが起こります。&lt;/p&gt;
&lt;pre class="csharp" xml:space="preserve" name="sourceCode"&gt;
using System;
using System.Windows.Forms;

public class MyForm : Form
{
    private MyForm()
    {
        MessageBox.Show("Called \"MyForm.MyForm()\"");
    }

    static MyForm defaultForm = new MyForm();
    public static MyForm Default
    {
        get { return defaultForm; }
    }
}

static class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        MessageBox.Show("Do \"Application.Run(MyForm.Default);\"");
        Application.Run(MyForm.Default);
    }
}
&lt;/pre&gt;
&lt;h4&gt;スタティックなメンバの初期化タイミングに関する罠&lt;/h4&gt;
&lt;p&gt;上記のコードで、Program.Main() 中の Application.SetCompatibleTextRenderingDefault(false); ですが、このメソッドは、Form の初期化前に呼ぶ必要があります。Form を初期化してから呼び出すと、以下のような例外が起こります。&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;System.InvalidOperationException はハンドルされませんでした。
  Message="最初の IWin32Window オブジェクトがアプリケーションで作成される前に、SetCompatibleTextRenderingDefault が呼び出されなければなりません。"
  Source="System.Windows.Forms"
  StackTrace:
       場所 System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(Boolean defaultValue)
       場所 Program.Main() 場所 D:\CodeGagdet\TestStaticClass\TestStaticClass\Program.cs:行 25
       場所 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       場所 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       場所 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       場所 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       場所 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       場所 System.Threading.ThreadHelper.ThreadStart()
  InnerException: 
&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;上記のコードでも、きちんとこの順番を守って呼び出している「つもり」です。&lt;/p&gt;
&lt;p&gt;しかし、よく見ると、MyForm は自身のインスタンスをスタティックメンバー defaultForm として持っています。&lt;/p&gt;
&lt;p&gt;この defaultForm の初期化は、「MyForm が初めて使用される Application.Run() 時に行われる」ものだと思っていたら痛い目にあいました。。&lt;/p&gt;
&lt;h4&gt;実行条件によって変わるスタティックメンバーの初期化タイミング&lt;/h4&gt;
&lt;p&gt;実は、スタティックなメンバーの初期化タイミングは、実行条件によって変わっていました。&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Debugビルド + デバッグあり実行&lt;/dt&gt;&lt;dd&gt;初めて MyForm が使用される MyForm.Defaul プロパティの呼び出し直前。&lt;/dd&gt;
&lt;dt&gt;Debugビルド + デバッグなし実行&lt;/dt&gt;&lt;dd&gt;同上&lt;/dd&gt;
&lt;dt&gt;Releaseビルド + デバッグあり実行&lt;/dt&gt;&lt;dd&gt;同上&lt;/dd&gt;
&lt;dt&gt;Releaseビルド + デバッグなし実行&lt;/dt&gt;&lt;dd&gt;Program.Main関数に入ったとき。あるいは、その直前。&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;４つ目のケース「Releaseビルド + デバッグなし実行」では、defaultForm が Application.SetCompatibleTextRenderingDefault() より手前で初期化されます。&lt;/p&gt;
&lt;p&gt;これでは、先に挙げた例外 InvalidOperationException が発生します。&lt;/p&gt;
&lt;p&gt;もちろん、上手くいく系もあるでしょうし、逆に Debug モードでだって上手くいかない系もあるかと思います。&lt;/p&gt;
&lt;h4&gt;解決穂法（追記＠2008-10-03）&lt;/h4&gt;
&lt;pre class="csharp:firstline[11]" xml:space="preserve" name="sourceCode"&gt;    static MyForm defaultForm;
    public static MyForm Default
    {
        get
        {
            if (defaultForm == null)
                defaultForm = new MyForm();
            return defaultForm;
        }
    }
&lt;/pre&gt;
&lt;p&gt;スタティックなメンバーのインスタンス生成を自分が意図したタイミングまで引き伸ばしますことで解決しました。&lt;/p&gt;
&lt;p&gt;コメント欄にもあるように、スタティックなコンストラクタを用意することでも解決するようですが、これもタイミングが本当に一定なのかがわからないという意味で、やめた方が良いでしょう。&lt;/p&gt;
&lt;h4&gt;まとめ&lt;/h4&gt;
&lt;p&gt;スタティックなメンバーの初期化は、いつ行われるかわかりません。&lt;/p&gt;
&lt;p&gt;少なくとも初めてそのクラスが使われるまでには初期化されますが、今回のようなケースだとだいぶ痛い目に合います。&lt;/p&gt;
&lt;p&gt;そんなこんなで、気をつけましょうね、という日記でした。&lt;/p&gt;

&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/158019.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] fread/feof</title><link>http://blogs.wankuma.com/hirase/archive/2008/09/18/156857.aspx</link><pubDate>Thu, 18 Sep 2008 00:25:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/09/18/156857.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/156857.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/09/18/156857.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/156857.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/156857.aspx</trackback:ping><description>&lt;p&gt;師走のような8月が過ぎましたので、再開。&lt;/p&gt;
&lt;p&gt;fopen直後のfreadで、引数に指定するサイズ（要素サイズとその個数の積が）が、ちょうどファイルサイズに一致しているとき、freadを呼んだ後の feofの戻り値として、正しいものはどれか？&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;==0&lt;/li&gt;
&lt;li&gt;!=0&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;サンプル&lt;/h3&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;#include &amp;lt;stdio.h&amp;gt;

int main(void)
{
    FILE* fp = fopen("10byte.dat", "rb");
    char buf[10];
    fread(buf, sizeof(char), sizeof(buf)/sizeof(char), fp);
    printf("%d\n", feof(fp));

    return 0;
}
&lt;/pre&gt;

&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/156857.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>色付いた型を見せるのは、重い。</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/19/149724.aspx</link><pubDate>Sat, 19 Jul 2008 15:42:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/19/149724.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/149724.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/19/149724.aspx#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/149724.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/149724.aspx</trackback:ping><description>&lt;ul&gt;
&lt;li&gt;SyntaxHighligherで、 .NET Framework で Public な型（クラスと構造体、デリゲート、インタフェース）を全部色づけしたい。。。と思った。&lt;/li&gt;
&lt;li&gt;とりあえず、varとかのコンテキストキーワードも対応したかったので、ここから始める。結構イケた。&lt;/li&gt;
&lt;li&gt;次に、ちくちくと、フレームワークの型を追記・・・・・・、やってられない。&lt;/li&gt;
&lt;li&gt;すべての型を列挙するプログラムを書く。（参照先がすごいことになる）&lt;/li&gt;
&lt;li&gt;プログラムをデバッグ実行・・・・。うんうん、順調。&lt;/li&gt;
&lt;li&gt;インタフェースが232個、クラスが1569個（デリゲート含む）、列挙型が349個、構造体が85個。（System系のみ。Microsoft系はなし。）&lt;/li&gt;
&lt;li&gt;よし、Console.Write() で出力して、リダイレクトでファイルに落とすぞ・・・っと。&lt;/li&gt;
&lt;li&gt;んーーー？？？　少ない。少ない。全然、さっきの個数と違う。&lt;/li&gt;
&lt;li&gt;デバッグ実行のときはいけるのに、何でだ？！&lt;/li&gt;
&lt;li&gt;あ！　コマンドプロンプトからは、読み込んでるアセンブリが、mscorlibぐらいしかねぇ。&lt;/li&gt;
&lt;li&gt;仕様がない、Visual Studioからのデバッグ実行時にファイルに落とすか。&lt;/li&gt;
&lt;li&gt;よしよし。わんくまにアップロード。。テキストファイルで26キロ・・、。&lt;/li&gt;
&lt;li&gt;重いなぁ。お、そだ。「_」から始まるインタフェースとか消して、Attributeで終わるクラスの「Attribute」を消そう。&lt;/li&gt;
&lt;li&gt;よし、21キロ&lt;/li&gt;
&lt;li&gt;実験。&lt;/li&gt;
&lt;li&gt;う、重い&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.julienlecomte.net/yuicompressor/"&gt;YUI Compressor&lt;/a&gt;で圧縮してみる。&lt;/li&gt;
&lt;li&gt;う、重い　←今ここ&lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/149724.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[HTML/CSS] もっとシンプルに定義リストdt ddを横並び</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/19/149672.aspx</link><pubDate>Sat, 19 Jul 2008 00:28:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/19/149672.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/149672.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/19/149672.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/149672.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/149672.aspx</trackback:ping><description>&lt;p&gt;HTMLとCSSだけで、定義リスト（dt/dd）を横並びに表示するのは、結構面倒です。&lt;/p&gt;
&lt;p&gt;定義（dd）の方が固定長である必要があったりします。&lt;/p&gt;
&lt;p&gt;そんなこんなで、CSS2から追加された「display: table」を使ったシンプルな横並びの方法を実現してみました。&lt;/p&gt;
&lt;p&gt;&lt;ins&gt;下記のコードを参照される際は、必ずコメント欄もご参照ください。&lt;/ins&gt;&lt;/p&gt;
&lt;pre class="html" xml:space="preserve" name="sourceCode"&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;UTF-8&amp;quot; ?&amp;gt;
&amp;lt;!DOCTYPE html PUBLIC &amp;quot;-//W3C//DTD XHTML 1.0 Strict//EN&amp;quot; &amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&amp;quot;&amp;gt;
&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot; lang=&amp;quot;ja&amp;quot; xml:lang=&amp;quot;ja&amp;quot;&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Simple Definition List&amp;lt;/title&amp;gt;
    &amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
	dl        { display: table; }
	dl dt.row { display: table-row; }
	dl dt     { display: table-cell; padding-right: 0.4em; }
	dl dd     { display: table-cell; }
	&amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;dl&amp;gt;
        &amp;lt;dt class=&amp;quot;row&amp;quot; /&amp;gt;
        &amp;lt;dt&amp;gt;要勤務日数&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;20日&amp;lt;/dd&amp;gt;
        &amp;lt;dt class=&amp;quot;row&amp;quot; /&amp;gt;
        &amp;lt;dt&amp;gt;勤務時間&amp;lt;/dt&amp;gt;&amp;lt;dd&amp;gt;480時間&amp;lt;/dd&amp;gt;
    &amp;lt;/dl&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
&lt;p&gt;対応ブラウザは、IE8、Firefox3、Saferi3 です。たぶん、Opera も行けます。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/149672.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++/C#] インタフェースっていったい・・・？</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/14/148849.aspx</link><pubDate>Mon, 14 Jul 2008 22:00:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/14/148849.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/148849.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/14/148849.aspx#Feedback</comments><slash:comments>8</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/148849.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/148849.aspx</trackback:ping><description>&lt;h4&gt;C++0xのコンセプトの話&lt;/h4&gt;
&lt;p&gt;&lt;a href="http://d.hatena.ne.jp/faith_and_brave/"&gt;アキラさん&lt;/a&gt;のC++0xの資料を拝見して、コンセプトって、なんでインタフェースっていう名前にならなかったのか疑問に思ったのは自分だけ？&lt;/p&gt;
&lt;p&gt;だって、インタフェースと機能は同じで、しばりが少ないってだけな印象なのに。。同じダックタイピングなのに。&lt;/p&gt;
&lt;p&gt;いうなれば、コンセプトがインタフェースらしく振舞うのであれば、それは最早インタフェースだと思う。&lt;/p&gt;
&lt;h4&gt;C#のインタフェースの話&lt;/h4&gt;
&lt;p&gt;なんで継承/実装していないとキャストできないのか不思議。明示的に継承していない場合でも、関係なしにダウンキャストできていいと思うのですが。。&lt;/p&gt;
&lt;p&gt;こんな感じ↓&lt;/p&gt;
&lt;pre class="csharp" xml:space="preserve" name="sourceCode"&gt;
using System;
interface IMyMeMine
{
    void Hello();
}

class SayHello
{
    public void Hello() { Console.WriteLine("Hello"); }
}

class Program
{
    static void Main(String[] args)
    {
        Hello(new SayHello());
    }

    static void Hello&amp;lt;T&amp;gt;(T t) where T:IMyMeMine
    {
        t.Hello();
    }
}
&lt;/pre&gt;
&lt;p&gt;たとえばシステムのクラスをジェネリックに扱いたい場合に、ときどきやりたい。&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/148849.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C#] Google Protocol Buffers Serializer</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/09/148170.aspx</link><pubDate>Wed, 09 Jul 2008 16:10:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/09/148170.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/148170.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/09/148170.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/148170.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/148170.aspx</trackback:ping><description>&lt;p&gt;&lt;a href="http://code.google.com/apis/protocolbuffers/"&gt;Google Protocol Buffers&lt;/a&gt;が公開されたとのことで、C#版のシリアライザ（仕様の確認はまた今度）を作ってみました。&lt;/p&gt;
&lt;pre class="csharp" xml:space="preserve" name="sourceCode"&gt;
namespace ProtocolBuffers
{
    using System;
    using System.IO;
    using System.Text;

    public class Serializer
    {
        #region Serialize
        public static void Serialize&amp;lt;TSerialize&amp;gt;(StreamWriter writer, TSerialize instance)
        {
            SerializeInternal(writer, instance.GetType(), instance, 0);
        }

        public static void Serialize(StreamWriter writer, Type type, Object instance)
        {
            SerializeInternal(writer, type, instance, 0);
        }

        private static void SerializeInternal(StreamWriter writer, Type type, Object instance, Int32 depth)
        {
            if (writer == null) throw new System.ArgumentNullException(&amp;quot;writer&amp;quot;);
            if (type == null) throw new System.ArgumentNullException(&amp;quot;type&amp;quot;);
            if (instance == null) throw new System.ArgumentNullException(&amp;quot;instance&amp;quot;);

            WriteIndent(writer, depth);
            writer.Write(type.Name);
            writer.WriteLine(&amp;quot;{&amp;quot;);
            foreach (var propertyInfo in type.GetProperties())
            {
                if (!propertyInfo.CanRead) continue;

                var propertyType = propertyInfo.PropertyType;
                var propertyName = propertyInfo.Name;
                var propertyValue = propertyInfo.GetValue(instance, null) ?? String.Empty;
                if (IsSystemType(propertyType))
                {
                    WriteIndent(writer, depth + 1);
                    writer.WriteLine(&amp;quot;{0} : \&amp;quot;{1}\&amp;quot;&amp;quot;, propertyName, propertyValue.ToString().Replace(&amp;quot;\&amp;quot;&amp;quot;, &amp;quot;\\\&amp;quot;&amp;quot;));
                }
                else
                {
                    SerializeInternal(writer, propertyType, propertyValue, depth + 1);
                }
            }
            WriteIndent(writer, depth);
            writer.WriteLine(&amp;quot;}&amp;quot;);
        }
        private static void WriteIndent(StreamWriter writer, Int32 depth)
        {
            StringBuilder sb = new StringBuilder();
            sb.Append(' ', depth);
            writer.Write(sb.ToString());
        }
        #endregion
        #region Utility
        private static Boolean IsSystemType(Type type)
        {
            return type.Namespace.StartsWith(&amp;quot;System&amp;quot;);
        }
        #endregion
    }
}
&lt;/pre&gt;
&lt;p&gt;使い方は、以下&lt;/p&gt;
&lt;pre class="csharp" xml:space="preserve" name="sourceCode"&gt;
namespace ProtocolBuffers
{
    using System;
    using System.IO;

    public class Test
    {
        public String Name { get; set; }
        public String EMail { get; set; }
    }

    public class Test2
    {
        public Test Test { get; set; }
        public Int32 Hash { get { return this.GetHashCode(); } }
        public DateTime DateTime { get { return DateTime.Now; } }
    }

    class TestProgram
    {
        static void Main(string[] args)
        {
            var testObject = new Test { Name = "Hirase", EMail = "hirase@example.com" };
            var test2Object = new Test2 { Test = testObject };
            using (var writer = new StreamWriter(@"test.pb"))
            {
                Serializer.Serialize&amp;lt;Test2&amp;gt;(writer, test2Object);
            }
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;結果は以下&lt;/p&gt;
&lt;pre&gt;
Test2{
 Test{
  Name : &amp;quot;Hirase&amp;quot;
  EMail : &amp;quot;hirase@example.com&amp;quot;
 }
 Hash : &amp;quot;54267293&amp;quot;
 DateTime : &amp;quot;2008/07/09 14:37:08&amp;quot;
}
&lt;/pre&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/148170.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C#] SplitContainer/SplitterPanel 使いにくい！</title><link>http://blogs.wankuma.com/hirase/archive/2008/07/02/146647.aspx</link><pubDate>Wed, 02 Jul 2008 01:20:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/07/02/146647.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/146647.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/07/02/146647.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/146647.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/146647.aspx</trackback:ping><description>&lt;p&gt;つぶやき、ですが・・・&lt;/p&gt;
&lt;p&gt;.NET Framework 2.0 から追加されました SplitContainer/SplitterPanel が異常に使いにくい。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SplitContainer.Panel1Collapsed / Panel2Collapsed プロパティでパネルの開閉するって、どうかしてるよ。&lt;/li&gt;
&lt;li&gt;SplitterPanel が sealed クラスなのは、どうかしてるよ。&lt;/li&gt;
&lt;li&gt;SplitterContainer.Panel1 / Panel2 からしか各パネルにアクセスできないって、どうかしてるよ。&lt;/li&gt;
&lt;li&gt;SplitContainer の両方のパネルを閉じられないって、どうかしてるよ。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;順を追ってみていきます。&lt;/p&gt;
&lt;h4&gt;SplitContainer.Panel1Collapsed / Panel2Collapsed プロパティでパネルの開閉するって、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;「メソッドでヤラせろよ。」とか、「SplitterPanel.Collapsed プロパティ（internal）を使わせろ。」とか、そういう話。というか、どうして、「Panels」がないんだ！　信じられない！&lt;/p&gt;
&lt;h4&gt;SplitterPanel が sealed クラスなのは、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;あぁ、もう最悪。継承できない。（SplitContainer を継承して、無駄なものを作ることは可能）&lt;/p&gt;
&lt;h4&gt;SplitterContainer.Panel1 / Panel2 からしか各パネルにアクセスできないって、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;我求ム「Panels」。ま、内部的には「Controls」に「Panel1」と「Panel2」が入っているのは知っているけど、いちいちキャストせにゃならんじゃん。いうか、パネル２つしかないのってもったいないよ！&lt;/p&gt;
&lt;h4&gt;SplitContainer の両方のパネルを閉じられないって、どうかしてるよ。&lt;/h4&gt;
&lt;p&gt;これ、ちょっと特殊だけど、両方のパネルを閉じたときには、その SplitContainer の親要素が SplitterPanel であれば、その SplitterPanel を閉じて欲しいのよね（そうじゃないときは、例外発生か、閉じられないか）。&lt;/p&gt;
&lt;p&gt;以上&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/146647.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++/CLI] RootNamespaceが狂っていると、System.Resources.MissingManifestResourceExceptionが発生します。</title><link>http://blogs.wankuma.com/hirase/archive/2008/06/10/142642.aspx</link><pubDate>Tue, 10 Jun 2008 15:07:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/06/10/142642.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/142642.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/06/10/142642.aspx#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/142642.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/142642.aspx</trackback:ping><description>&lt;p&gt;C++/CLIアプリを作成して、ローカライズ（L10N or I18N) します。このとき、もし自分で名前空間を変えているなら、実行時に「System.Resources.MissingManifestResourceException」例外が発生します。&lt;/p&gt;
&lt;h3&gt;詳細&lt;/h3&gt;
&lt;p&gt;どうもアセンブリリソースを埋め込む際に、ルート名前空間を見て名前を修飾して埋めているらしく、ローカライズしたフォーム（ApplyResourceを呼びだしている）クラスの名前空間がルート名前空間とずれていると、実行時に適切なリソースを見つけられなくて、「System.Resources.MissingManifestResourceException」例外が発生するようです。&lt;/p&gt;
&lt;p&gt;対処方法は2つ。（ま、結局2つともに同じことなんですけど）&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;フォームクラスの名前空間を、ルート名前空間に合わせる。&lt;/li&gt;
&lt;li&gt;ルート名前空間を、フォームクラスの名前空間に合わせる。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;ルート名前空間は、プロジェクトのプロパティウィンドウ（プロパティページでもプロパティマネージャでもないですよ！）の、ルート名前空間で変更するか、プロジェクトをいったんソリューションエクスプローラからアンロードして、右クリックで編集するなどします。&lt;/p&gt;
&lt;p&gt;あぁ、つらい。&lt;/p&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/142642.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C++/CLI] アンマネージのコールバックにマネージのメソッドを登録する。</title><link>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx</link><pubDate>Mon, 09 Jun 2008 21:34:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/142430.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/06/09/142430.aspx#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/142430.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/142430.aspx</trackback:ping><description>&lt;p&gt;こんな方法は・・・・・・・&lt;/p&gt;
&lt;pre class="cpp" xml:space="preserve" name="sourceCode"&gt;using namespace System;

#pragma unmanaged
// コールバック関数の型
typedef int (__stdcall *CallbackFuncType)(int, float);

// コールバック関数
static CallbackFuncType g_func;

// コールバック関数の登録
void SetCallback(CallbackFuncType f)
{
    g_func = f;
}

// コールバック関数の呼び出し。
int Run()
{
    return g_func(10, 0.5f);
}
#pragma managed

int __stdcall MyFunc(int i, float f)
{
    Console::WriteLine(i.ToString());
    return static_cast&amp;lt;int&amp;gt;(i * f);
}

int main(array&amp;lt;System::String ^&amp;gt; ^args)
{
    // Callback登録（マネージ関数を登録・・）
    SetCallback(MyFunc);

    // GCしても大丈夫かを確認（登録した関数ポインタがGCされる・・ない）
    GC::Collect(2, GCCollectionMode::Forced);

    // コールバックをネイティブ関数に呼び出してもらう（GCされてたら死亡）
    Int32 ret = Run();
    Console::WriteLine(ret.ToString());

    return 0;
}
&lt;/pre&gt;
&lt;p&gt;これって、どうなんだろう。実行は問題ないんだけど。。&lt;/p&gt;
&lt;p&gt;MSDN「&lt;a href="http://msdn.microsoft.com/library/367eeye0.aspx"&gt;方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする&lt;/a&gt;」とは違う方法で、&lt;a href="http://msdn.microsoft.com/library/system.runtime.interopservices.marshal.getfunctionpointerfordelegate.aspx"&gt;Marshal::GetFunctionPointerForDelegate()&lt;/a&gt; も使わないんだけど・・・。&lt;/p&gt;
&lt;p&gt;何かご存じの方、、ヘルプミー。&lt;/p&gt;
&lt;h3&gt;See Also&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=36275&amp;forum=7"&gt;[C#] デリゲートをGCの対象から外す方法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/ja-JP/library/367eeye0.aspx"&gt;方法 : C++ Interop を使用してコールバックおよびデリゲートをマーシャリングする&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/367eeye0.aspx"&gt;How to: Marshal Callbacks and Delegates Using C++ Interop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/142430.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>T.Hirase</dc:creator><title>[C] wchar_tって・・・。</title><link>http://blogs.wankuma.com/hirase/archive/2008/05/27/139688.aspx</link><pubDate>Tue, 27 May 2008 22:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/hirase/archive/2008/05/27/139688.aspx</guid><wfw:comment>http://blogs.wankuma.com/hirase/comments/139688.aspx</wfw:comment><comments>http://blogs.wankuma.com/hirase/archive/2008/05/27/139688.aspx#Feedback</comments><slash:comments>5</slash:comments><wfw:commentRss>http://blogs.wankuma.com/hirase/comments/commentRss/139688.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/hirase/services/trackbacks/139688.aspx</trackback:ping><description>&lt;p&gt;VC2008で、ソースファイルのプロパティで&lt;br&gt;
「詳細」の「コンパイル言語の選択」を「Cコードとしてコンパイル (/TC)」として、&lt;br&gt;
「言語」の「wchar_t をビルトイン型として扱う (/Zc:wchar_t」を「はい」にすると、&lt;br&gt;
wchar_t が組み込み型として使えそうなのに、使えないんですね・・・。&lt;br&gt;
&lt;br&gt;
# wchar.hをincludeすれば使えますけど、unsigned short扱いだし、&lt;br&gt;
# CRTを使いたくないのに、wchar.h から crtdefs.h を読み込んじゃうし・・・&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
C で書くなと？？&lt;br&gt;
&lt;/p&gt;&lt;img src ="http://blogs.wankuma.com/hirase/aggbug/139688.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>