« 2011年7月 | トップページ | 2011年9月 »

2011年8月の記事

2011年8月24日 (水)

はちゅね追記

昨日の記事に対してさっそく突っ込みをいただきましたので紹介します。

ソースのForm1.csの中にglContrl1_SizeChangedというイベントハンドラがあります。このイベントハンドラは、glControl1(OpenTKが提供する、OpenGLで描画できるコントロール)の初期化が終わらないうちに呼ばれてしまうようで、初期の版ではGLメソッドの呼び出しでNullReferenceExceptionが起きていました。

何か変だと思いつつ、しかたがないので昨日のプログラムでは、Hatyuneインスタンスが作成済みかどうかをチェックするという気持ち悪い方法で回避しているのですが、

実は、GLControlのSizeChangedイベントが、GLの初期化が行われる前に呼び出されるというのはGLControlの仕様なのだそうです。それで、SizeChangedイベントハンドラでは、必ずGLControl.IsHandleCreatedというプロパティを見て、falseなら何もしないで戻るように書くものなのだそうです。

ドキュメントは一通り読んでいるつもりが、そういう記述の記憶はなかったので、どこに書いてあるのと聞いたら「OpenTKのソース中にコメントで書いてある」って…。どうしてそれが仕様ということになるかな。わけがわからないよ

2011年8月23日 (火)

C# でも「はちゅね」

1年半くらい前に「はちゅね」をWindows/Linuxで動かすってのを書きました。あのときは C + GLUT で作っていたのですが。

最近、C# + OpenTK (の OpenGL 部分) というのをいじっていまして、ふと思い出して「はちゅね」を書いてみました。「移植」というより、「参考にして書き直した」感じです。

いつもの通り、SkyDriveのごちゃごちゃっとしたところに置きました。Hatyunes-20110823.zipです。ソース一式とコンパイル済みバイナリが、実行に必要なOpenTKのDLLと一緒に入っています。

.NET というか CLR なので、この zip に入っている Hatyune.exe は、Linux + mono などでもそのまま動いてしまいます。うーむ、すごい。

2011年8月18日 (木)

LINQ

なんだか急にLINQに目覚めました。で、こんなの書いてます。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace ConsoleApplication1
{
    static class Program
    {
        public static IEnumerable<string> AsLines(this TextReader rd)
        {
            for (string line; (line = rd.ReadLine()) != null; )
            {
                yield return line;
            }
        }

        static void Main(string[] args)
        {
            using (var rd = new StreamReader(args[1]))
            {
                foreach (var s in rd.AsLines().Where(s => s.Contains(args[0])))
                {
                    Console.Out.WriteLine(s);
                }
            }
        }
    }
}

LINQですよね、これ…

2011年8月 4日 (木)

UserChoice\Progid

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.EXT\UserChoice というレジストリキーの下にProgidという名前の値があると、その値の内容が拡張子.EXTに対するProgIDとみなされるらしい。HKEY_CLASSES_ROOT\.EXTの@よりも優先して。

ここには、おなじみのEXT_auto_fileというProgIDの他に、Application\program.exeという文字列が設定されることもある様子。こんな\を含んだ文字列は、COMのProgIDとして許されないはずなのだが。

また、このUserChoiceというキーは、ユーザーがエクスプローラーのGUIでデフォルトアプリケーションを変更したときにできるらしいことがわかったが、変更しても常にできるわけでもなさそう。このキーが作られる条件は不明。謎が多い。

MSDNのどこにも、そんなこと書いてない(と思う。ずいぶん探したけど)。googleで探しても、このレジストリキーに関して大勢の人が混乱している様子はわかったが、ちゃんとした説明はみつからない。

ってか、問題になるレジストリキーで探すというのは、答えがわかったからできることで、トラブルの原因を探してるときにはそんな検索は不可能だし。

ってことで、結局、これに起因するバグの解決に2ヶ月以上かかったのでした。

あーあ。

MobiHandlerを試してくれたけど、うまく動いていない人(特に、.azw/.mobiに対応するビューアープログラムを複数種類インストールしていて、デフォルトアプリを切り替えている人)は、いつものSkyDriveのページから、バージョン1.1.1268をダウンロードしてお試しください。上の現象の対策が入っています。

2011年8月 2日 (火)

くださいコピーして登録ウィンドウにキーの下を貼り付けます

いやー、なんというか。こういう壊れた日本語メッセージを見るのは久しぶりというか。SLだったらともかく (coldsweats01) マイクロソフトだというのが驚き。

(画像クリックで拡大)

Register
Visual C# 2010 Expressというものをダウンロード・インストールしてユーザー登録しただけなんですが。(実際には、黒ベタの部分に登録キーが書いてある。)おそらく正解は「下のキーをコピーして[登録]ウィンドウに貼り付けてください」でしょうね。

つい先日、VC++ Express 2010 も登録したのだが、そのときはこんなメッセージじゃなかったような。

いったいどうしちゃったんだろうか。

« 2011年7月 | トップページ | 2011年9月 »