2012年04月18日

[Windows Programming] ドキュメントの内容をクリップボードへ (MFC版)

SyntaxHighlighter を使って C++ のソースコードに色を付けてみる実験。

// MFC版
// ドキュメントの内容を:
// ・クリップボードへメタファイルと独自形式でコピー
// ・クリップボードから独自形式でペースト
// ※ MyDocument::Serialize と MyView::OnDraw でのドキュメントの描画を実装しておくこと

// MyView.h

class MyView : public CView
{
    DECLARE_DYNCREATE(MyView)
    DECLARE_MESSAGE_MAP()

    HGLOBAL globalMemoryHandle;

protected:
    MyView() : globalMemoryHandle(NULL)
    {}

    MyDocument* GetDocument() const
    { return reinterpret_cast<MyDocument*>(m_pDocument); }

    virtual void OnDraw(CDC* pDC)
    {
        if (GetDocument() != NULL)
            /* ドキュメントの描画 */ ;
    }

    afx_msg void OnEditCopy()
    {
        if (GetDocument() == NULL)
            return;

        // ドキュメントが空なら何もしない
        // 例.
        // if (GetDocument()->IsEmpty())
        //     return;

        // 拡張メタファイルの作成
        CClientDC   clientDC(this);
        CMetaFileDC metaDC;
        metaDC.CreateEnhanced(&clientDC, NULL, NULL, NULL);
        OnDraw(&metaDC);
        const HENHMETAFILE enhancedMetaFileHandle = metaDC.CloseEnhanced();

        // メモリへのシリアライズ
        CSharedFile sharedFile;
        {
            CArchive ar(&sharedFile, CArchive::store);
            GetDocument()->Serialize(ar);
        }
        globalMemoryHandle = sharedFile.Detach();

        // クリップボードへの書き込み
        if (OpenClipboard()) {
            ::EmptyClipboard();
            ::SetClipboardData(CF_ENHMETAFILE, CopyEnhMetaFile(enhancedMetaFileHandle, NULL));
            ::SetClipboardData(CF_PRIVATEFIRST, globalMemoryHandle);
            ::CloseClipboard();
        }

        ::DeleteEnhMetaFile(enhancedMetaFileHandle);
    }

    afx_msg void OnEditPaste()
    {
        if (GetDocument() == NULL)
            return;

        if (OpenClipboard()) {
            const HANDLE clipboardData = ::GetClipboardData(CF_PRIVATEFIRST);
            if (clipboardData != NULL) {
                CSharedFile sharedFile;
                sharedFile.SetHandle(clipboardData);
                {
                    CArchive ar(&sharedFile, CArchive::load);
                    GetDocument()->Serialize(ar);
                }
                sharedFile.Detach();
                GetDocument()->SetModifiedFlag();
                Invalidate();
            }
            ::CloseClipboard();
        }
    }

    afx_msg void OnDestroyClipboard()
    {
        CView::OnDestroyClipboard();

        // WM_DESTROYCLIPBOARD 時に CF_PRIVATEFIRST で確保したメモリを開放する必要がある
        if (globalMemoryHandle != NULL) {
            ::GlobalUnlock(globalMemoryHandle);
            ::GlobalFree  (globalMemoryHandle);
            globalMemoryHandle = NULL;
        }
    }
};

// MyView.cpp

#include "MyView.h"

IMPLEMENT_DYNCREATE(MyView, CView)

BEGIN_MESSAGE_MAP(MyView, CView)
    ON_COMMAND(ID_EDIT_COPY, OnEditCopy)
    ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
    ON_WM_DESTROYCLIPBOARD()
END_MESSAGE_MAP()

2012年04月10日

モンティ・ホール問題

モンティ・ホール問題 というのがある。 アメリカのゲームショー番組の中で行われた以下のようなゲームに関する問題である。

  1. 三つのドアのどれか一つの後ろに当たりの商品が隠されている。残りの二つはハズレだ。
  2. プレイヤーである番組参加者は、一つのドアを選ぶ。
  3. 番組司会者のモンティは、残り二つのドアのうちからハズレのドアを一つ開けて見せる。
  4. モンティはプレイヤーに「ドアを選びなおしても良い」と言う。
  5. プレイヤーはドアを選びなおすべきだろうか?
montyhallproblem0.png
当たりはどれか一つ。

この問題の正解は、「選びなおした方が良い。何故なら当たる確率が倍になるから」というものだ。

しかし、これを正解とするということに納得しない人が多いらしい。直感と異なるからだ。

教授レベルの数学者を含む多くの人が反論したらしい。

大きな論争となったこの問題は、結局コンピューター上でのシミュレーションで決着がついたそうだ。

とても興味深い題材なので、私も C# でシミュレーションをやってみた。

// モンティ・ホール問題 - Wikipedia
// http://ja.wikipedia.org/wiki/%E3%83%A2%E3%83%B3%E3%83%86%E3%82%A3%E3%83%BB%E3%83%9B%E3%83%BC%E3%83%AB%E5%95%8F%E9%A1%8C

using System;
using System.Linq;

namespace モンティ・ホール問題
{
    static class プログラム
    {
        static void Main(string[] コマンドライン引数)
        { シミュレーター.シミュレート(コマンドライン引数から繰り返し回数を得る(コマンドライン引数)); }

        static int コマンドライン引数から繰り返し回数を得る(string[] コマンドライン引数)
        {
            if (コマンドライン引数.Length < 0)
            {
                int 繰り返し回数;
                if (int.TryParse(コマンドライン引数[0], out 繰り返し回数))
                    return 繰り返し回数;
            }
            const int デフォルトの繰り返し回数 = 1000000;
            return デフォルトの繰り返し回数;
        }
    }

    static class シミュレーター
    {
        public static void シミュレート(int 試す回数)
        { 結果.表示(選びなおす場合に当たる確率: シミュレート(試す回数, 選びなおす: true),
            選びなおさない場合に当たる確率: シミュレート(試す回数, 選びなおす: false)); }

        static double シミュレート(int 試す回数, bool 選びなおす)
        {
            var 当たりの回数 = Enumerable.Range(1, 試す回数).Count(_ =< ゲーム.プレイする(選びなおす));
            var 当たる確率 = (double)当たりの回数 / 試す回数;
            結果.表示(選びなおす, 試す回数, 当たりの回数, 当たる確率);
            return 当たる確率;
        }

        static class 結果
        {
            public static void 表示(double 選びなおす場合に当たる確率, double 選びなおさない場合に当たる確率)
            { 表示(選びなおす場合と選びなおさない場合の当たる確率の比:
                選びなおす場合に当たる確率 / 選びなおさない場合に当たる確率); }

            public static void 表示(double 選びなおす場合と選びなおさない場合の当たる確率の比)
            { Console.WriteLine("・結論: 選びなおす場合は、選びなおさない場合に比べて、{0} 倍当たりやすい。",
                選びなおす場合と選びなおさない場合の当たる確率の比); }

            public static void 表示(bool 選びなおした, int 試した回数, int 当たった回数, double 当たる確率)
            { Console.WriteLine("・{0}場合は、当たりの回数は: {1} 回中 {2} 回で、当たる確率は {3}。",
                選びなおした ? "選びなおした" : "選びなおさなかった", 試した回数, 当たった回数, 当たる確率); }
        }
    }

    static class ゲーム
    {
        const int 全ドアの数 = 3;

        public static bool プレイする(bool 選びなおす)
        {
            var 当たりのドア = ランダムなドア();
            var プレイヤーが選択したドア = ランダムなドア();
            var モンティの開けたドア = 残りのドアから一つ(当たりのドア, プレイヤーが選択したドア);

            if (選びなおす)
                プレイヤーが選択したドア
                    = 残りのドアから一つ(プレイヤーが選択したドア, モンティの開けたドア);

            return プレイヤーが選択したドア == 当たりのドア;
        }

        static int 残りのドアから一つ(int 当たりのドア, int プレイヤーが選択したドア)
        {
            return 当たりのドア == プレイヤーが選択したドア
                   ? 残りのドアからランダムに一つ(除外するドア: 当たりのドア)
                   : 残りのドアからどれでも一つ(一つ目の除外するドア: 当たりのドア,
                                    二つ目の除外するドア: プレイヤーが選択したドア);
        }

        static int 残りのドアからランダムに一つ(int 除外するドア)
        { return 或るドアから数えてX番目のドア(除外するドア,
                    そのドアから数えてX番目: ランダム.一から或る数までの乱数(全ドアの数 - 1)); }

        static int 或るドアから数えてX番目のドア(int 或るドア, int そのドアから数えてX番目)
        { return (或るドア + そのドアから数えてX番目) % 全ドアの数; }

        static int 残りのドアからどれでも一つ(int 一つ目の除外するドア, int 二つ目の除外するドア)
        { return Enumerable.Range(0, 全ドアの数)
                    .First(ドア =< ドア != 一つ目の除外するドア && ドア != 二つ目の除外するドア); }

        static int ランダムなドア()
        { return ランダム.零から或る数までの乱数(全ドアの数); }
    }

    static class ランダム
    {
        static readonly Random 乱数 = new Random();

        public static int 零から或る数までの乱数(int 或る数)
        { return 乱数.Next(或る数); }

        public static int 一から或る数までの乱数(int 或る数)
        { return 乱数.Next(或る数) + 1; }
    }
}

以下のように正解の通りの結果となった。

  • 選びなおした場合は、当たりの回数は: 1000000 回中 666662 回で、当たる確率は 0.666662。
  • 選びなおさなかった場合は、当たりの回数は: 1000000 回中 333802 回で、当たる確率は 0.333802。
  • 結論: 選びなおす場合は、選びなおさない場合に比べて、1.99717796777731 倍当たりやすい。

実は、プログラムを書いていく過程で、問題が整理されていったため、途中から実行する迄もなく結果は明白なように感じていた。

以下のように考えたのだ。

  1. 最初にプレイヤーがドアを選んだ時点で、そのドアが当たりである確率は、1/3 だ。
  2. そのとき、プレイヤーが選ばなかった残りの二つのドアが当たりである確率も、それぞれ 1/3 だ。
  3. 即ち、残りの二つのドアのどちらかが当たりである確率は 2/3。
  4. つまり、「残りの二つのドアのどちらかが当たりである確率」は「プレイヤーが最初に選んだドアが当たりである確率」の倍。
  5. ところが、モンティは、「残り二つのドアのどちらがハズレか」を必ず教えてくれる。
  6. 残りの二つのドアのどちらかが当たりである確率は 2/3 だが、残りの二つのドアのうちモンティが開けて見せた方が当たりである確率は 0 で、残りの二つのドアのうちモンティが開けなかった方が当たりである確率は 2/3。
  7. 残りの二つのドアのうちモンティが開けなかった方を選びなおした方が、当たる確率が倍、ということだ。
montyhallproblem.png

続きを読む "モンティ・ホール問題" »

2012年04月04日

[Event] Windows Developer Days

開発者の皆様へ ~ Windows 8 のアプリケーション開発を始めませんか。 | Windows Developer Days
Windows Developer Days
日時 2012年4月24日(火)~25日(水) 10:00-18:00
会場 ザ・プリンスパークタワー東京
参加費 ¥84,000 (早期割引 4月18日 16:59 迄 税込¥63,000)
詳細/参加登録 Windows Developer Days

2012年03月31日

2012 MVP Global Summit

mvp2012_0053.JPG

2012 MVP Global Summit (2012/02/28-03/02) に参加してきた。


参加レポート: 2012 MVP Global Summit 参加レポート - slideshare


「10年後も世界で通じるエンジニアであるために」 at Developers Summit 2012

Developers Summit 2012 でライトニング トークスをやってきた。

資料: 2012/02/16 Developers Summit 2012 【16-B-7】 LT「10年後も世界で通じるエンジニアであるために」 - slideshare

2012年03月29日

[Event] Windows Phone Hackathon 2012 in Fukui 開催予定 (2012-04-14, 21)

福井で Windows Phoneハッカソンが開催される。

14日はアイデアソンで、Windows Phone 開発の概要説明やアイディアの出し合いなどが行われる。21日は、開発し、実際にマーケットに登録。

Windows Phone Hackathon 2012 in Fukui
日時 2012年4月14日(土) 10:00~夕方、 4月21日 10:00~18:00
会場 福井県産業情報センター システム設計室 (福井県坂井市丸岡町熊堂第3号7番地1-16)
参加費用 4月14日: 500円、4月21日: 500円 (会場費)
主催 Hokuriku.NET
詳細/申し込み http://atnd.org/events/26574

2012年02月20日

Developers Summit 2012 と codeseek & C# ユーザー会勉強会

以下に参加してきた。

Developers Summit 2012
会期 2012年2月16日(木) - 17日(金)
会場 目黒雅叙園 (東京・目黒)
主催 翔泳社
デブサミの会場に到着。 @ 目黒雅叙園
参加受付を済ませた。 @ 目黒雅叙園

2月16日(木)

【16-A-1】 見る前に翔べ ~ギークの工夫で社会を変えよう~ 及川 卓也 氏

  • グーグルの及川卓也さんのセッション中。 @ 目黒雅叙園
  • 及川さんセッション。製品開発の考え方。プロダクトアウトのみならずマーケットインにも欠陥がある理由のお話。
  • 及川さんセッション。ローンチ&イテレート。プロダクトアウトの後マーケットインを取り入れる。アジャイルだ。
  • 「マーケットを作ろうとするとするときに、マーケット リサーチに引っ張られ過ぎないように。明日のユーザーの為に開発。ローンチ&イテレート。」
  • 「ローンチ&イテレートは、仮説と実証を繰り返す科学のやり方と同じ。」
  • 「これからのシステムの欠点を云うが今までのシステムの欠点を云わない人ばっかり。これからのことを考えよう。」
  • 「自分の快適ゾーンからあえて一歩不快ゾーンに踏み出して行こう。」
100人のプロが選んだソフトウェア開発の名著」会場先行販売で購入。
休憩中の会場の様子。
会場では書籍の販売も。
100人のプロが選んだソフトウェア開発の名著」の100冊が展示されている。
百冊本のサイン会中。
日本XPユーザグループのOpen Jam。

【16-B-4】 アジャイル開発の10年と今後を語ろう。 平鍋 健児 氏

  • 平鍋さんの「アジャイル開発の10年と今後を語ろう。」この10年は本当に語るべきことが沢山ある。

【Open Jam】 codeseek

  • codeseek の Open Jam 中。Windows 8 の新たな API の WinRT のお話 by 岩永さん。数々の疑問点がすっきり氷解。

【16-B-7】 デブサミオフィシャルコミュニティから選出のLT大会2012

100冊本の著者サイン、今日は29人分集めた。
雅叙園からの帰りのエスカレーターが出来てた。

2月17日(金)

会場に到着。 @ 目黒雅叙園
二日目。 @ 目黒雅叙園
二日目。 @ 目黒雅叙園

【17-D-1】 Kinectが創る未来 中村 薫 氏

  • 「Kinect が創る未来」中村薫さん。Kinect でプレゼン。
  • Xtion という Kinect そっくりのデバイスと Kinect の違い等の説明中。OpenNI の話も。
  • Kinect for Windows SDK と OpenNI の比較等。
  • Kinect で次から次へとデモ。作るのが楽しい、とのこと。素晴らしい。
  • 100冊本へのサイン、現在36人。
会場に展示されている「100人のプロが選んだソフトウェア開発の名著」の現物。その一。
会場に展示されている「100人のプロが選んだソフトウェア開発の名著」の現物。そのニ。

【17-B-3】 言語の世界 まつもと ゆきひろ 氏

  • まつもとゆきひろさんの「言語の世界」。
  • 「27年前のクレイ社のスーパーコンピュータと iPhone 4 の MIPS 数が同じ」
  • 「FORTRAN vs. LISP の勝者は Algol。」
  • 「優れた言語のアイディアは1970年代 (言語のカンブリア爆発期) に出揃ってる。」

【17-D-4】 どうなる?Windows 8時代の業務アプリ開発 八巻 雄哉 氏

  • 八巻さんの Windows 8 セッション中。
  • タッチ対応していない Windows 7 用アプリでタッチ対応できる部分と無理がある部分のお話中。
  • 100冊本のサイン、現在38人分。

ライブコーディング

  • Kinect ライブコーディングの発表会中。
10周年コンボパーティ会場に来た。

関連記事

codeseek & C# ユーザー会勉強会 「Windows で Kinectを使ってみる@新宿」
会期 2012年2月16日(木) 20:00~23:00
会場 新宿の居酒屋
主催 日本C#ユーザー会codeseek
共催 tk-engineeringこみゅぷらすeパウダ~.Net/C# Group
codeseek & C# ユーザー会勉強会参加中。

2011年12月13日

iPad/iPhone のスタイラスを自作してみた

最近は勉強会などに参加する際は、PC よりも iPad を持ち歩くことが多くなったのだが、7notes での手書き入力やお絵かきアプリ等で使用するためのスタイラスが欲しくなった。

※ ちなみに 7notes に関しては以下の記事が参考になる。

探してみたところ、7notes の開発者が作ったという Su-Pen というのが評判が良いらしい。ところが、これは人気の為か入手困難のようだ。更に探してみると、スタイラスを自作している人が多い、ということが分かった。結構簡単そうだ。自作してみることにした。

用意したのは導電スポンジと金属製の鉛筆ホルダーと銅線。

導電スポンジというのは、LSI や IC 等を差すためのスポンジで、導電性のため、静電気による破損を防ぐことができる。

iPad や iPhone のタッチパネルは静電容量式という指の静電気で操作するようになっているため、電気を通す鉛筆ホルダーと電気を通すスポンジを使うことでスタイラスが作れるのだ。

  1. こちらが STAEDTLER のペンシルホルダー。
    そしてこれが鉛筆の補助軸として100円ショップ等で売られているもの。
  2. Amazon で入手した導電スポンジを鋏で十字型に切り抜く。
  3. それに 100円ショップで売られていた銅線を巻く。
  4. ペンホルダーの先に詰めたところ。
    同様にして全部で三本作成。とても簡単だ。導電スポンジも銅線もまだまだ余っている。補助軸を買いたせば、数十本は作れそう。
  5. 7notes で手書き入力してみる。中々快適だ。

2011年10月26日

多体問題シミュレーション by HTML5 3D版

nbody3d.png

# 「多体問題シミュレーション by HTML5」の続き。

HTML5 による多体問題シミュレーションの 3D 版を作成した。

詳しくはソースを参照のこと。

使い方等:

  • 物体は球体として表現し、見掛け上の半径は各質量の3分の1乗の比になるようにした。 但し、衝突は考慮していない。
  • 3D アニメーションを見るためには「交差法」で立体視を行う。
  • クリックでスケールの変更。
  • クエリー文字列:
    • number で、物体の数の設定 (nbody.html?number=8 で 8 個。1-10個、デフォルト 5 個)
    • size で、物体を表示する大きさの変更 (nbody.html?size=100 で 100%。1-800%、デフォルト 50%)
  • HTML が 1 ファイルだけで他ファイルへの依存なし (オフラインでも OK)
  • Internet Explorer、Firefox、Safari、Google Chrome、Opera の現時点での最新版で動作
  • iPhone、Android フォン等スマートフォンで動作

参考:

2011年10月20日

多体問題シミュレーション by HTML5

nbody.png

# 「Lightningtalks Timer by HTML5」の続き。

HTML5 で多体問題 (N‐body problem)のシミュレーションを作成した。

4次のルンゲ=クッタ法を使用。

詳しくはソースを参照のこと。

  • 物体は球体として表現し、見掛け上の半径は各質量の3分の1乗の比になるようにした。 但し、衝突は考慮していない。

使い方等:

  • クリックでスケールの変更。
  • クエリー文字列:
    • number で、物体の数の設定 (nbody.html?number=8 で 8 個。1-10個、デフォルト 5 個)
    • size で、物体を表示する大きさの変更 (nbody.html?size=100 で 100%。1-800%、デフォルト 50%)
  • HTML が 1 ファイルだけで他ファイルへの依存なし (オフラインでも OK)
  • Internet Explorer、Firefox、Safari、Google Chrome、Opera の現時点での最新版で動作
  • iPhone、Android フォン等スマートフォンで動作
Web アプリケーションを簡単編集できる無償ツール WebMatrix ダウンロードはこちら
2012年04月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

最近のコメント

最近のトラックバック

関連IT用語 by e-Words

UNIQLOCK

にほんブログ村

にほんブログ村 IT技術ブログへ
Powered by
Movable Type 3.35