The Root of .NET Framework/荒井 省三 Windowsダンプの極意/上原 祥市

本日発売らしいので、書店で探してきました。

なかなかブログの更新もままならない状態でしたが、やっと「The Root of .NET Framework」という書籍が完成しました。発売予定が12/25ということで、私の手元にも現物が届きました。
The Root of .NET Framework が発売になります(荒井省三のBlog)

The Root of .NET Framework

The Root of .NET Framework

まえがきによると、日本初の日本人による日本人のためのCLRの詳細が説明された書籍のようです。

COMが何かもわからず、Windowsフォームアプリケーションも作ったこともない状態で、ASP.NETからWindowsの世界に足を踏み入れた私にとっては、ずっと知りたかったことばかり。
調べてみたいと思っても調べ方もわからず、なんだかんだでうやむやなままできてしまった感があったので、なんとしてでも年末・年始に読みきりたい一冊です。(>_<)

  • Chapter 4 メモリとプロセス 4-1 CLR におけるメモリ管理

の一部がこちらで公開されているようです〜
http://www.microsoft.com/japan/msdn/vstudio/express/book/

というわけで、私も4章から読んでみようと思います。

と思った矢先に・・・

初心者向けではありませんが、
The Root of .NET Framework が発売になります(荒井省三のBlog)


( ̄○ ̄;)


でも、読む(>_<)

それと、この間、id:yoshiomsさんから「これ面白いよ〜」と教えてもらった

Windowsダンプの極意 エラーが発生したら、まずダンプ解析!

Windowsダンプの極意 エラーが発生したら、まずダンプ解析!

も見つけたので買ってきました。
両方に手を出している余裕はなさそうですけど。。。

わんくま同盟 東京勉強会 #27でライトニングトーク発表してきました。

先週、土曜日(20日)、わんくま同盟 東京勉強会 #27に参加して、お昼のライトニングトークで3回目のLTをしてきました。

使ってみたくなる!(かも。。。)RDS 2008 Express Edition -インストールからの1ヶ月間


今回は発表資料公開にSlideShareを使ってみました。
(ちょっと変換に失敗しており、見づらくて申し訳ないです。。。)
ダウンロードしてまで見てくれる人、どれくらいいるだろう。。。と思って、Fujiwoさんとかigaigaさんとかid:matarilloさんなんかがやってるのをみて前々から気になっていたSlideShareのアカウントをとってみました。

今までの3つ並べてみました。
上から順に

  • 2008年12月20日 わんくま勉強会
  • 2008年12月13日 Tech Fielders セミナー 東京
  • 2008年8月28日  TechEd

です。


【12/23 追記】
ネットワーク回線が悪いパソコンから見てみたら、待ち時間が長すぎて見れたものではありませんね。。。
(私は我慢できませんでした。。。)
というわけで、今回以外の2つはリンクに変更しました。
(Tech Fielders セミナー 東京 で発表した資料がアニメーション使用時のままになっていたので、やや見やすいように作り直しました。)

あと、やっぱりダウンロードしたpptファイルなりをローカルで見るほうがさくさくして個人的に好きなので前みたいにpptとpdf版もSkyDriveにアップしました。よろしければこちらも〜。
(TechEd2008とTech Fielders セミナーで発表したものには動画が含まれているのでzipファイルになってます。)

イベント名 Tech Ed 2008 Tech Fielders セミナー 東京 わんくま同盟 東京勉強会 #27
日時 2008/8/28 2008/12/13 2008/12/20
タイトル 6時間でどこまでできる?!Robotics Studioを用いてライントレースロボットにチャレンジ 使ってみよう!RDS 2008 Express Edition -1週間+αでできること 使ってみたくなる!(かも。。。)RDS 2008 Express Edition -インストールからの1ヶ月間
資料 SlideShare版 ppt版 pdf版 SlideShare版 ppt版 pdf版 SlideShare版 ppt版 pdf版


結局、言いたいことって夏のTechEdからほとんど変わってないんですよね。。。タイトルも似たり寄ったりだし。。。
8月にここまでもっていきたかったな〜という思いも。。。
自分でやっておきながらなんですけど、今思うと6時間でなんとかしようなんて、ほんとありえないことをしていたな。。。なんて。σ(^-^;)



前回のTech Fielders セミナー 東京の時はデモができなかったので、今回はそこばかり気にしたら、デモが終わったとたん力が抜けてしまい、まとめをしようとしたら残り数秒。。。(ρ_-)o
最後にこのはてなの紹介をしようとスライドを作ってみたのですが、結局そこまで話せませんでした(;_;)
一つやると一つ忘れる。。。まだまだ先は長そうです。。。


えムナウさんがお呼びしたそうで、午後からスペシャルゲストにジニアス平井さんがお見えになりました。いつもと反対側からお二人が並んで座っている光景を見るのはなんとも不思議な感じ。。。



私が初めて参加したわんくま勉強会は、2007年11月のわんくま同盟 東京勉強会 #14・オブジェクト指向分科会#2だったのですが、まさか約一年後、このテンプレートを使って、発表側にたつことになるとは思っていませんでした。


何の時だったか忘れてしまいましたが、秋ぐらい(?)に中さんにどう?と声をかけてもらったのがきっかけで今回のライトニングトークをすることになりました。

やることが決まったのはいいものの、何を話そうか悩みながらも時は過ぎ。。。
そんな時、運よく(?)Microsoft Robotics Developer Studio(RDS)2008 Express Editionがリリースされたので、これでいってみようと思いました。
そしてインストールからのスタートをしたのがちょうど発表日の1ヶ月前です。


その1週間後、急遽、Tech Fielders セミナーのLTにも応募してしまった為、かなりあたふたしてしまいましたが、終わってしまえばやってよかったなと。

私が初めてLTというものを知ったのが、2007年夏に開催されたLL魂というイベントに参加した時です。
今までに見たことのないスタイルでその時は面白いな〜と思っただけでした。その後2007年12月、オブジェクト倶楽部クリスマスイベント2007に参加した時にigaigaさんの情報発信の重要性をテーマにしたLTを見て、とても感動しました。
年が明けて、2008年2月のデブサミで見たFujiwoさんのLTはなんて面白いんだろうと思いました。
いつか自分でもやってみたいと思っていたことがちょっと方向性は異なりますけど、こうして実現することができてとても嬉しいです。(出来具合はおいといて。。。)



一応、これでLTは区切りがついたので、RoboticsStudioは一旦おいておき、次は今週末に控えているMCP受験に向けて頭を切り替えます(>_<)
(5日で間に合うか心配ですが、もうやるしかありません。。。)

あ、それから、勉強会ではid:udongeinさんと約1年ぶり(?)にお話できて楽しかったです〜
ありがとうございました〜
かばんにペンははいっていなくても六角レンチがはいっているあたり素敵だな〜と思いました(笑)

Visual Studio 2008からRDSサービスを作成(4)(成功編)

前回(Visual Studio 2008からRDSサービスを作成(4)(失敗編3)
)からの続きです。


解決しました。(≧▽≦)


なんのことはない、単なる私の勘違いでした。。。σ(^-^;)
お恥ずかしいので前のエントリ、全部消しちゃいたいくらいなのですが、
もしかしたらおんなじところではまる人がい(ないだろうな。。。)るかもしれないので
どこを間違えてたか、さらに恥の上塗りしてみます。。。


  • 間違えてた箇所

【1箇所目】

  1. Replaceクラスの作成

プロジェクト名Type.csにReplaceクラスを追加します。

    /// <summary>
    /// AddPortTest Replace operation
    /// </summary>
    public class Replace : Replace<GetRequestType, PortSet<AddPortTestState, Fault>>
    {
    }

正しくは

    /// <summary>
    /// AddPortTest Replace operation
    /// </summary>
    public class Replace : Replace<AddPortTestState, PortSet<DefaultReplaceResponseType, Fault>>
    {
    }

【2箇所目】

  1. ハンドラの追加

プロジェクト名.csにReplaceのハンドラを追加します。

ビルドをしたら

  • エラーメッセージ
    • 73行目(_state = replace.Body;の部分)

型'Microsoft.Dss.ServiceModel.Dssp.GetRequestType'を型'AddPortTest.AddPortTestState'に暗黙的に変換できません。

    • 74行目(replace.ResponsePort(DefaultReplaceResponseType.Instance);の部分)

実行不可能なメンバ
'Microsoft.Dss.ServiceModel.Dssp.DsspOperation>.ResponsePort'をメソッドのように使用することはできません。

こんなエラーが出たので、いろいろコメントアウトしたり余計なことをしてましたが、最初の状態が正解です。
余計な手を加えたほう

        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.ResponsePort;
            //replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }

正しくは

        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.Body;
            replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }

【3・4箇所目】
そして、[DataMember]の追加と初期化を忘れてました。

  /// <summary>
    /// AddPortTest state
    /// </summary>
    [DataContract]
    public class AddPortTestState
    {
        [DataMember]
        public double ChangeValue
        { get; set; }
    }
        /// <summary>
        /// Service constructor
        /// </summary>
        public AddPortTestService(DsspServiceCreationPort creationPort)
            : base(creationPort)
        {
            _state.ChangeValue = 0.0;
        }

これらが指定されていなくてもビルド時にエラーはでないので実行できてしまうのですが、書き換えたいデータ自体を宣言(?)していないので欲しい実行結果が得られません。



再度、ソリューションのビルドをして、VPL図を作り直します。

今回、何がしたかったかというと、

「AddPortTest」ブロックを使ってChangeValueを「Data」ブロックに入力した値で書き換える。

です。

実行すると最初のDataブロックで指定した「0.5」という値に書き換わっていることが確認できます。



参考URL

Visual Studio 2008からRDSサービスを作成(4)(失敗編3)

まだ、解決しておりません。。。
よって、これも失敗例です。
「Visual Studio 2008からRDSサービスを作成(4)(失敗編2)」からの続きです。




  • AddPortTest.csに追加したReplaceのハンドラ(修正前)
        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.ResponsePort;
            replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }
    • 74行目(replace.ResponsePort(DefaultReplaceResponseType.Instance);の部分)

実行不可能なメンバ
'Microsoft.Dss.ServiceModel.Dssp.DsspOperation>.ResponsePort'をメソッドのように使用することはできません。

ResponsePortをメソッドのように使用することはできません。

なるほど。そういえば、一行上で

_state = replace.ResponsePort;

と指定しているのだから、もしかして不要なのかな。。。
コメントアウトしてみることにしました。

  • 修正後
        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.ResponsePort;
            //replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }

するとめでたくビルドの正常終了(≧▽≦)

ですが、喜ぶのはまだ早く。。。
この作成した「AddPortTest」をVPLから呼び出します。
今回、実験したかったことは・・・

「AddPortTest」ブロックを使ってValueを「Data」ブロックに入力した値で書き換える。

です。

1.「Data」ブロックをドラックアンドドロップし、Doubleg型に指定して、中央テキストボックスには「0.5」と入力します。
2.次に上記で作成した「AddPortTest」ブロックをドラックアンドドロップします。
3.「Data」ブロックと、AddPortTest」ブロックをつないでやるとConnectionsダイアログが表示され、To欄Getの下に上記でポートの追加を行った「Replace」が選択可能となっています。

  • From:DataValue
  • To:Replace

と指定し、OKボタンを押します。

つないだあとはこのような図になります。

4.次に、「AddPortTest」ブロックをもう一つ、ドラックアンドドロップし1個目の「AddPortTest」ブロックと

  • From:Replace-Success
  • To:Get

と指定し、OKボタンを押して接続します。

5.そして、「log」ブロックをドラックアンドドロップし、2個目の「AddPortTest」ブロックと

  • From:Get-Success
  • To:LogInfo

と指定し、OKボタンを押して接続します。

6.Data Connectionsダイアログが表示されるので、Target欄のMessage、Gategoryをvalueに指定します。


7.最終的なVPL図は以下のようになります。

この状態で実行し、Dataブロックに入力した値「0.5」がlogに表示されれば成功なのですが、タイムアウトエラーが発生してしまいました。

DsspForwarder:OutboundFailureHandler.Exception:操作がタイムアウトしました。
Action:http://schemas.microsoft.com/xw/2004/10/dssp.html:ReplaceRequest
Body Type:Microsoft.Dss.ServiceModel.Dssp.GetRequestType
Target Service:dssp.tcp://asa-xp:50001/addporttest/**********
Source Service:dssp.tcp://asa-xp:50001/model/addporttest

次回へ続く。。。
そろそろ成功編を書きたいな(;_;)

Visual Studio 2008からRDSサービスを作成(4)(失敗編2)

前回の「Visual Studio 2008からRDSサービスを作成(4)(失敗編)」からの続きです。
これも失敗例ですので、ご注意下さい。


  • AddPortTest.csに追加したReplaceのハンドラ(修正前)
        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.Body;
            replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }
    • 73行目(_state = replace.Body;の部分)

型'Microsoft.Dss.ServiceModel.Dssp.GetRequestType'を型'AddPortTest.AddPortTestState'に暗黙的に変換できません。

    • 74行目(replace.ResponsePort(DefaultReplaceResponseType.Instance);の部分)

実行不可能なメンバ
'Microsoft.Dss.ServiceModel.Dssp.DsspOperation>.ResponsePort'をメソッドのように使用することはできません。

73行目は型変換に問題があるようだったので、まずはreplace.Bodyの型を調べてみました。

  • GetRequestType DsspOperation>.Body

とGetRequestType型のようです。

そこで、AddPortTestState型のものがないか探してみたところ、

  • PortSet DssOperation>.ResponsePort

ResponsePortが一番近そうだったので、以下のように書き換えてみました。

  • 修正後
        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.ResponsePort;
            replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }


そして、再度ソリューションのビルドをしてみたところ、73行目のエラーが消えました。

が、まだ74行目が残ってます。。。

    • 74行目(replace.ResponsePort(DefaultReplaceResponseType.Instance);の部分)

実行不可能なメンバ
'Microsoft.Dss.ServiceModel.Dssp.DsspOperation>.ResponsePort'をメソッドのように使用することはできません。

次回へ続く。。。

Visual Studio 2008からRDSサービスを作成(4)(失敗編)

前回の「Visual Studio 2008からRDSサービスを作成(3)」ではプロジェクトの新規作成時に指定したテンプレート『DSS Service(2.0)』にあらかじめ準備されていた「Get」メッセージを使用してみました。
今回はテンプレートに含まれてはいませんが、RDSに定義されているReplaceという値を置き換えるメッセージをプログラム上に追加する方法をやってみます。
これにはポートの追加という手順が必要になってきます。

現在、試行錯誤の状態なので、これは失敗した例をのせている点にご注意下さい。

  • 事前準備

プロジェクトの新規作成からマイテンプレートで『DSS Service(2.0)』を選択してプロジェクト名を入力後、OKボタンを押すと

  1. プロジェクト名Types.cs
  2. プロジェクト名.cs
  3. プロジェクト名.manifest.xml

の3種類のファイルが作成されます。
今回は「AddPortTest」というプロジェクト名にしました。

  1. PortSetの追加

プロジェクト名Type.csの中の「プロジェクト名Operations関数」を以下のように書き換えます。

  • 修正前
    /// <summary>
    /// AddPortTest main operations port
    /// </summary>
    [ServicePort]
    public class AddPortTestOperations : PortSet<DsspDefaultLookup, DsspDefaultDrop, Get, Subscribe>
    {
    }
  • 修正後
    /// <summary>
    /// AddPortTest main operations port
    /// </summary>
    [ServicePort]
    public class AddPortTestOperations : PortSet<DsspDefaultLookup, DsspDefaultDrop, Get, Subscribe, Replace>
    {
    }
  1. Replaceクラスの作成

プロジェクト名Type.csにReplaceクラスを追加します。

    /// <summary>
    /// AddPortTest Replace operation
    /// </summary>
    public class Replace : Replace<GetRequestType, PortSet<AddPortTestState, Fault>>
    {
    }
  1. ハンドラの追加

プロジェクト名.csにReplaceのハンドラを追加します。

        /// <summary>
        /// Replace Handler
        /// </summary>
        /// <param name ="replace"></param>
        /// <reteuns></returns>
        [ServiceHandler(ServiceHandlerBehavior.Exclusive)]
        public virtual IEnumerator<ITask> ReplaceHandler(Replace replace) 
        {
            _state = replace.Body;
            replace.ResponsePort(DefaultReplaceResponseType.Instance);
            yield break;
        }

そしてビルドが正常終了したら、VPLを起動して上記で作成したサービス(今回はAddPortTest)をService欄から呼び出し、Dataブロックと接続してみる予定だったのですが、ここでコンパイルエラーの発生です。。。


  • エラーメッセージ
    • 73行目(_state = replace.Body;の部分)

型'Microsoft.Dss.ServiceModel.Dssp.GetRequestType'を型'AddPortTest.AddPortTestState'に暗黙的に変換できません。

    • 74行目(replace.ResponsePort(DefaultReplaceResponseType.Instance);の部分)

実行不可能なメンバ
'Microsoft.Dss.ServiceModel.Dssp.DsspOperation>.ResponsePort'をメソッドのように使用することはできません。

これから原因、追究します。

Visual Studio 2008からRDSサービスを作成(3)

前回の「Visual Studio 2008からRDSサービスを作成(1)」からの続きで、今回は自作したサービスをVPLから呼び出し、設定した"Hello, Robotics Studio!!"という文字列をLogに表示させます。



プロジェクトの新規作成からマイテンプレートで『DSS Service(2.0)』を選択してプロジェクト名を入力後、OKボタンを押すと

  1. プロジェクト名Types.cs
  2. プロジェクト名.cs
  3. プロジェクト名.manifest.xml

の3種類のファイルが作成されます。

プロジェクト名Type.csの中の「プロジェクト名State関数」を以下のように書き換えます。

  • 修正前
    /// <summary>
    /// DSSService1 state
    /// </summary>
    [DataContract]
    public class DSSService1State
    {
    }
  • 修正後
    /// <summary>
    /// DSSService1 state
    /// </summary>
    [DataContract]
    public class DSSService1State
    {
        [DataMember]
        public string Name
        {get;set;}
    }


次にプロジェクト名.csの中の「プロジェクト名Service関数」を以下のように書き換え、ビルドします。

  • 修正前
  /// <summary>
  /// Service constructor
  /// </summary>
  public DSSService1Servic(DsspServiceCreationPort creationPort)
       : base(creationPort)
   {
   }
  • 修正後
  /// <summary>
  /// Service constructor
  /// </summary>
  public DSSService1Servic(DsspServiceCreationPort creationPort)
       : base(creationPort)
   {
       _state.Name = "Hello,RoboticsStudio!!";
   }

ビルドが正常終了したら、VPLを起動して上記で作成したサービス(今回はDSSService1)をService欄から呼び出し、Logブロックと接続します。

Connectionsダイアログが表示されるので、

  • From:Get-Success
  • To:LogInfo

と指定し、OKボタンを押します。

DataConnectionsダイアログでは、Valueで「Name」を指定します。
プロジェクト名Type.csの「プロジェクト名State関数」で定義したプロパティがここに表示されます。

自作したサービス(DSSService1)とLogブロックを接続したあとはこのような表示になります。

実行すると、Logにプロジェクト名.csの中の「プロジェクト名Service関数」で

_state.Name = "Hello,RoboticsStudio!!";

と設定した「Hello,RoboticsStudio!!」という状態が表示されます。