The dawn of modern programmers

現代プログラマーの朝焼け

Filco Majestouch Tenkeyless

HHKB Lite2 日本語配列かな無刻印 」から正式に乗り換えるキーボードとして「Majestouch Tenkeyless 「マジェスタッチ テンキーレス」Nキーロールオーバー・茶軸・かななし」を購入。

使用感は以下の通りです。

  • 重量感
    • とにかく重い!(980gある)のでものすごく安定してる
  • キータッチ
    • ストロークは深めだが、HHKB Lite2 に比べると軽め
    • スイッチ音がかなり大きい(打つたびに「シャコン!」という独特の音が出ます)
  • デザイン
    • 「かななし」なので見た目がすっきり
    • テンキーレスで省スペース、かつ無駄のないデザイン

 

キー配列は日本語108キーボードからテンキーを省いた91キーということで、「HHKB Lite2 日本語配列」のようなクセはないです。
日本語キーボードに慣れた人には非常に良いキーボードだと思います。ただ、結構なタイプ音がしますので隣の人からクレームがつくかもしれませんが。。。

個人的には非常に満足のいく仕様のキーボードです。
これで配列が 「HHKB Lite2 英語配列」と同じ ASCII 配列があれば最高です。

aiNote RC 1 リリース!

弊社で開発中のマインドマップ機能を搭載したソフトウェアファクトリ(ソフトウェア開発を自動化するための取り組み)支援ツールである aiNote のリリース候補版をリリースいたしました!
このリリースは2008年下期に予定しております、正式版の機能をすべて含んでおります。
各種ユニークな機能を新規に搭載しておりますので是非おためしください!

http://www.archway.co.jp/Home/aiNote.aspx

aiNote Standard Edition RC 1(2008/09版)の新機能

■図の挿入■
各トピックに 1つ図を挿入することが可能です。図はテキストの上下左右に配置することが可能です。

■マーカー■
トピックにマーカーというアイコンを配置することができます。再クリックに値を変更可能なマーカーや、サブトピックや親トピックと連携して自動的に値が変化する自動マーカーなどを使用可能です。

ハイパーリンク
各トピックに1つハイパーリンクを設定することが可能です。

■ノート■
トピックにメモやコメント、注意書きなどを記述することができます。

lock ステートメント

C# の lock ステートメントは System.Threading.Monitor クラスの Enter(object)/Exsit(object) メソッドと try - finally ステートメントに展開される。

lock(requestQueue)
{
	requestQueue.Enqueue("WorkItem");
}

は展開されると以下のようになる。

Monitor.Enter(requestQueue);
try
{
	requestQueue.Enqueue("WorkItem");
}
finally
{
	Monitor.Exit(requestQueue);
}

ちなみに MSDN の Monitor.Exit(object) メソッドに気になる記述が。。。

ロックが解放されて、他のスレッドがオブジェクトの実行待ちキューに入ると、それらのスレッドの 1 つがロックを取得します。ロックを取得するために待機キュー内で待機している他のスレッドは、ロックの所有者が Exit を呼び出しても、実行待ちキューに自動で移動しません。1 つ以上の待機中のスレッドを実行待ちキューに移動するには、Exit を呼び出す前に、Pulse または PulseAll を呼び出します。

What's? マジですか?
今抱えている問題もどうやらあたりが原因で起きているのかも。。。

今週も朝焼け

非常に中途半端な時間に大阪に到着してしまった。
現在ペリエを飲みがてら .NET における MultiThreaded Programing のメモを書いておく。
このあたりに関しての記述は少ない(のきなみ英語になる)上に、問題発生時のデバッグだ大変なので苦労する。
きっともっと基本的な MultiThreaded Programing が必要そうなのでとりあえず書籍をチェックしておこう。

今日は LINQ 勉強会 第2回

本当に朝焼けを見ることになってしまいましたが本日はNagile勉強会です。

時間が少ないことに比例して資料が少なくなってしまったので今日は説明を随時入れていきます。

今日は飲んだらシャットダウンしそうで心配です。。。。

配列コピーのパフォーマンス比較

通常のエンタープライズアプリケーションではまずないことですが、現在配列の操作を多用しています。
その中でも配列のコピーをよく使用するのですがアルゴリズムで煮詰まってきたのでパフォーマンス検証を行いました。
検証した配列コピーの方法は以下の通りです。

  • Array.Copy() メソッドによる配列のコピー
  • for 文による配列のコピー
  • unsafe ステートメント内でのポインタによる配列のコピー

以下が検証で使用したコードです。

using System;
using System.Diagnostics;

namespace ArrayCopyPerformance
{
    class Program
    {
        static void Main(string[] args)
        {
            // 8KB
            int size = 1024 * 8;

            Console.WriteLine("TEST START...");

            MeasurePerformanceOfArrayCopyByMethod(size);
            MeasurePerformanceOfArrayCopyByForLoop(size);
            MeasurePerformanceOfArrayCopyByFixed(size);

            Console.WriteLine("TEST END.");
            Console.ReadLine();
        }

        static void MeasurePerformanceOfArrayCopyByMethod(int size)
        {
            byte[] source = new byte[size];
            byte[] dest = new byte[size];

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            Array.Copy(source, dest, size);

            stopWatch.Stop();

            Console.WriteLine("  BY 'Array.Copy' METHOD\t: TIME={0} ticks", stopWatch.ElapsedTicks);
        }

        static void MeasurePerformanceOfArrayCopyByForLoop(int size)
        {
            byte[] source = new byte[size];
            byte[] dest = new byte[size];

            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            for (int i = 0; i < size; i++)
            {
                dest[i] = source[i];
            }

            stopWatch.Stop();

            Console.WriteLine("  BY 'for' LOOP STATEMENT\t: TIME={0} ticks", stopWatch.ElapsedTicks);

        }

        static unsafe void MeasurePerformanceOfArrayCopyByFixed(int size)
        {
            Stopwatch stopWatch = new Stopwatch();
            stopWatch.Start();

            fixed (byte* source = new byte[size])
            {
                fixed (byte* dest = new byte[size])
                {
                    byte* pSource = source;
                    byte* pDest = dest;
                    for (int i = 0; i < size; i++)
                    {
                        *pDest++ = *pSource++;
                    }
                }
            }

            stopWatch.Stop();

            Console.WriteLine("  BY 'fixed' UNSAFE STATEMENT\t: TIME={0} ticks", stopWatch.ElapsedTicks);
        }
    }
}

結果は以下の通り

TEST START...
BY 'Array.Copy' METHOD : TIME=16856 ticks
BY 'for' LOOP STATEMENT : TIME=120276 ticks
BY 'fixed' UNSAFE STATEMENT : TIME=191368 ticks
TEST END.

パフォーマンスを考慮しないといけない局面では「できるだけ Array.Copy() メソッドを使う」というソリューションが出ました。
Array.Copy() メソッドの処理が高速なのはランタイムに実装されたメソッドを使用しているためです。
(IL DASM で System.Runtime.ConstrainedExecution.ReliabilityContractAttribute が宣言されていることを確認しました。)