.netの最近の情報



ASP.NET 4.5新機能概説

(http://www.atmarkit.co.jp/ait/articles/1303/08/news072.html)

でも触れられている、SignalRという新しい技術についての記事が

あったので紹介します。

Webアプリケーションは元々コネクションレスのクライアントサイドからの

一方的な同期通信が基本となっていました。

※これはHTTP(Hyper Text Transfer Protocolの略からもわかるように)

プロトコルの元々が、インターネット上のサーバに配置された文書や画像を

タグ付けされた情報(HTML)として取得し閲覧するという目的から成って

います(因みにHTMLXMLの前身としてSGMLというものがあります)

その後、HTTPHTMLはホームページ、掲示板、チャットというように

動的なコンテンツを扱うようになり、さらにネットショッピング

や情報検索サイトなどシステムという形で利用されるようになり、

企業内のイントラネットでも一般的に使われるようになっているのが

現状です。

前置きが長くなりましたが...

技術的な部分ではコネクションレスのクライアントサイドからの

一方的な同期通信から、JavaScriptによる動的な画面制御、Ajax等による

非同期通信によりリッチなWebアプリケーションが開発できるようになり、

さらにはWebSocketをベースとし、Sochet.IOなど高レベルなAPIも提供され

本題のSignalRについてはWebSocketはもとより、RPCを使用した、Hub

という高レベルなコネクション型APIが提供されています。

今後はこれらの技術の進歩により、コネクション型で非同期通信を利用する

ことにより記事の中でもあるようにサーバサイドからのプッシュ型のアプリ

ケーション開発も簡単に構築できるようになり、Webアプリケーションの

可能性がさらに広がると思われます。

http://www.atmarkit.co.jp/ait/articles/1303/19/news099.html

20129月にリリースされたVisual Studio 2012

ASP.NET4.5の新機能解説の特集です。

Web関連の世界ではどんどん新しい技術が登場・進化していて

それらに幅広く対応している感じはします。特にモバイル関連

のアプリケーション開発に対応した部分は目まぐるしく技術が

変わっていっていると感じます。それ故に実装が中途半端で

あったり、選択肢の幅が広がりすぎてどの技術を選択して

システムを構築するべきかが難しくなっている印象を受けました。

混沌としている感じでしょうか...

私が普段関わっているところでは、ASP.NET MVCですが、

こちらはバージョン4になっています。WebAPI、モバイル関連の

機能追加・機能強化がどのようなものか気になります。

その他にも、WebSocketWebページ2HTML5/CSS3関連など、

気になる部分はいくつかありますが、どの技術の組み合わせで

システムを構築するのがスタンダードになるのか難しい気がします。

http://www.atmarkit.co.jp/ait/articles/1303/08/news072.html

編者:日経ソフトウェア

発行人:桔梗原 富夫

編集長:田島 篤

発行:日経BP社

178ページ

1,886円+税

 

内容

2010年10月2日にHTC Desire(X06HTII)が発売されました。

Android2.1搭載のスマートフォンで、iPhone4に次ぎ、評判は上々のようです。

さすがにiPhone4の勢いほどではないけど、アプリケーションの開発という点では、

より柔軟・オープンであり、今後に期待できます。

 

さらにHTC Desire(X06HTII)は、2010年10月8日には、Andoroid2.2へアップデート

可能で、加速度的にiPhoneを凌ぐ勢いとなりそうです。

 

さて、前置きが長くなりましたが、この書籍では、こういった状況を踏まえてかどうか、

アプリケーションの開発について、2大スマートフォン(もちろんIPhoneとAndroid)の

両方のプログラミングについて書かれた最新の書籍になります。

 

私の場合は、Mac環境、Apple製品を好んで利用しないため、必然的に、Javaでの

開発が手軽にできるAndroidとなった訳ですが、スマートフォンの開発については、

やはり、iPhone、Android両方の知識について理解する事も大切です。

 

この書籍ではタイトルのとおり、"入門"ではありますが、こうした2大スマートフォンの

アプリケーション開発について、両者を比較しながら、体系的に、手軽に学べるという

点では、とても有用なバイブルとなると思います。

 

日経ソフトウェアの過去の記事から作られているムック本ではありますが、

基本的な知識と、技術がしっかり学べると思います。

今の時代の、システムエンジニア、プログラマの基礎知識としても、

知っておくべき内容がたくさん詰まっていると言えます。

 

目次

 

第1章 作って楽しい!

  • Part1 iPhoneプログラミング入門 効率的に始めるための4大ポイント!
  • Part2 iPad専用のスプリットビューとポップオーバーでRSSリーダーを作る
  • Part3 Androidで作って楽しむ弾幕系シューティングゲーム
  • Part4 iPadプログラミング入門 高速動作と大画面を生かす!パーティクルによる電光掲示板アプリを作る
  • Part5 開発者が明かすニコニコ生放送のiPhoneアプリはこうして生まれた

 

第2章 Androidの基礎を極める!

  • Part1 最も重要な「Activity」を理解する
  • Part2 音声読み上げアプリケーションを作る
  • Part3 Intentで超簡単アプリケーション連携
  • Part4 実例で学ぶIntentの使い方
  • Part5 Androidの秘密兵器、Serviceを理解する
  • Part6 Serviceに独自のinterfaceを持たせる
  • Part7 データ共有に必須のContentProvider
  • Part8 アプリにContentProviderを実装する

 

第3章 達人への第一歩

  • Part1 16個のサンプルで一目瞭然高度な機能がすぐに使える!
  • Part2 最速で学ぶObjective-C メモリー管理をマスターすればObjective-Cがわかる!
  • Part3 最速で学ぶObjective-C GUIプログラム作成に必要な概念をマスターしよう
  • Part4 iPhone実践プログラミング 電子コンパスを使ったアプリを実機で動かそう
  • Part5 iPhone実践プログラミング MapKitで地図アプリを作ろう
  • Part6 Phone実践プログラミングGameKitを使ってBluetooth通信対戦ゲームを作ろう
  • Part7 Javaエンジニアから見たiPhone/Androidアプリ開発記

 

付録 開発環境のセットアップ

 

ポイント

2大スマートフォンのアプリ開発が同時にわかる!

世界的なブームとなっているiPhone/iPadとAndroidのプログラミングを同時に

学びましょう。iPhoneプログラミングの基本、Objective-C、iPadの画面サイズを

生かすアプリの作り方、Androidの4大構成要素(Activity,Intent、Service、

ContentProvider)、Androidで作る弾幕系シューティングゲームなど、多彩な内容

を詰め込みました。iPhone/iPadとAndroidの類似点と相違点を把握しながら学べ、

それぞれのOSに対する理解も深まります。

 

補足

iPhone/iPadの開発は、通常Mac上での開発となりますが、

C#環境でも開発することがが可能なようです(Mono環境)

これは、開発の生産性においても、Windowsプログラマにとっても、

とても可能性の広がる事だと思います。Appleの対応についても、

もっともっとオープンになればうれしいことです。

 

 

 

著者: 川俣 晶

発行社: 瀬川 弘司

発行: 日経BP社

発売: 日経BPマーケティング

発行日: 2010年7月26日

315ページ

2,800円+税

 

内容

ぜひ押さえたいC#開発のポイントが満載!

最新テクニックをマスターする35のテーマ

どこからでも読めてスキル倍増!!

 

ポイント

この本は、いわゆる入門書ではありません。

Visual Studio 2010 の登場とともに、.NETフレームワークが、

バージョン4.0となり、C#も、Visual C# 2010にバージョンアップした。

 

C#は、Visual Studio 2008(.NET 3.5)より、LINQをはじめ、言語仕様も

大きく強化されてきており、本書ではそういった新しくなった言語仕様の

解説はもちろん、新しい機能を使いこなすための、超・実践的なテクニックを

わかりやすく解説しています。

 

本書を理解することで、これまでのシステム開発での開発生産性、効率性の

向上はもとより、Visual Studio 2008(.NET 3.5)、Visual Studio 2010(.NET 4.0)

を利用することにより、これまでと違った新しいスタイルのプログラム開発への切換

えが可能になってくると思います。具体的には以下のような、テクニックについて

解説されています。

 

特に、C#4.0の新機能である、

  • 動的型付け変数
  • オプション引数・名前付き引数
  • ジェネリックの反変性・共変性

についての解説は必読ですし、利用価値の高い新機能であることは間違いありません。

 

目次

第1部 基本編

  • 第1章 言語の特性とパターン
  • 第2章 静的(static)なクラスとその意義
  • 第3章 さまざまな型変換(キャストの話)
  • 第4章 型について知ろう(decimalとdouble/floatの違い)
  • 第5章 フィールド (メンバー変数) とプロパティはここが違う
  • 第6章 引数の省略と理解性の高い引数(named/optional parameters)
  • 第7章 nullを受け入れるか? 排除するか? (null許容型とnull合体演算子)
  • 第8章 複数の値の返し方(参照渡しとパック)
  • 第9章 COMと64ビットへの対応
  • 第10章 型を書かなくても強い型付け(varとジェネリック)
  • 第11章 共変性(covariance)と反変性(contravariance)
  • 第12章 スレッドプールとWebアプリの問題

第2部 構造編

  • 第13章 属性(Attribute)の使用
  • 第14章 部分クラス(partial class)でクラスを分ける
  • 第15章 リフレクション(Reflection)を活用する
  • 第16章 動的にアセンブリをロードする
  • 第17章 モジュール(.netmodule)の意義
  • 第18章 名前空間とモジュールの分割(using、extern)
  • 第19章 privateメンバーを覗く方法

第3部 LINQ編

  • 第20章 LINQの基本を理解しよう(LINQという式/LINQというメソッド)
  • 第21章 ソースが2つあるクエリ式
  • 第22章 LINQ to SQL で楽々クエリ
  • 第23章 LINQ to XML で楽々XML文書処理
  • 第24章 ラムダ式とdelegate
  • 第25章 ラムダ式と"外の世界"とのやりとり
  • 第26章 C# における列挙型(enum)
  • 第27章 yeild returnとLINQ
  • 第28章 遅延実行とレイジー評価

第4部 ダイナミック編

  • 第29章 リフレクションの活用
  • 第30章 どっちが正解? 静的 対 動的(dynamicクラス)
  • 第31章 DynamicObject から継承した独自のdynamicクラス
  • 第32章 ExpandoObjectを使用した dynamic オブジェクト

第5部 パラレル編

  • 第33章 並列で行こう!(並列プログラミングの基礎)
  • 第34章 データ処理における並列プログラミング(並列LINQ、PLINQ)
  • 第35章 並列プログラミングのデバッグとプロファイリング

 

リリース版が出てから、しばらく経ってしまっていますがまとめてみます。

 

ASP.NET MVC2

2010年3月上旬リリースされた、ASP.NET MVC1の新バージョンです。

MVC1と互換性があり、.NETフレームワーク3.5、4.0に対応だそうです。

 

Visual Studio 2010 には、標準で含まれるそうです。

Visual Studio 2008 ユーザはダウンロードしてインストールしましょう!!

ASP.NET MVC 2 RTM

※因みにRTMとは、Release to Manufacturing version(正式リリース版)

 

サンプルアプリケーションと、ソースコード

ASP.NET MVC2をインストール後、プロジェクト生成のウィザードが利用

できるようになりますが、その際に、サンプルのアプリケーションも含める

プロジェクトを選択することができたり、テストプロジェクトを含めるかも選択

できたりします。

APS.NET MVCを初めて学ぶ方や、初めて動かしてみる方にとって、

サンプルのアプリケーションは助けになると思います。

 

サンプルのアプリケーションでは、基本的な画面遷移やページのテンプレート、

データベースを利用したユーザ認証機能、バリデーションの機能といった、

Webアプリケーションで中心となる機能が簡単ではあるけれど、ひととおり

盛り込まれてます。

このサンプルアプリケーションをベースに自分のアプリを構築していけば、

理解も早まると思います。

 

また、少し複雑なことをしようとしたときや、開発中に思った通りの動作をしない

場合には、ASP.NET MVC2 では、ソースコードも公開されているので、

まだまだ日本語のドキュメントも少ない状況なので、ソースコードを直接参照

できるのは安心感があります。

 

ASP.NET MVC2 新機能・強化点

さて、ASP.NET MVC2を、ASP.NET MVC1と比較した際の新機能について

ですが、以下にポイントだけまとめておきます。

 

  • 新しい強く型付けされたHTMLヘルパー
  • サーバおよびクライアントの両方で改善されたモデル検証のサポート
  • テンプレートのカスタマイズが可能な自動スキャフォールドUIヘルパー
  • 大きなアプリケーションを"エリア"に分割するサポート
  • 長時間起動するタスクの並列稼働を可能にする非同期コントローラをサポート
  • Html.RenderActionによるページ/サイトのサブセクションの描画をサポート
  • 多くの新しいヘルパー機能、ユーティリティ、APIの改善
  • 改善されたVisual Studioツールのサポート

 

大きな強化点として個人的に注目なのは、

Areasという、アプリケーションの分割機能と、型付けされたHTMLヘルパー、

非同期コントローラといったとこでしょうか?

 

先に書いたように、残念ながら日本語のドキュメントはまだまだ充実していない

感がありますが、ASP.NET MVC1 の開発手法が大きく変わることはないので

MVC1 の情報もまだまだ生かせると思います。

 

まず、書籍。

ASP.NET MVC実践プログラミング

ASP.NET MVC 唯一の和書だと思うのですが、基本がしっかり押さえられ、

フレームワーク利用のノウハウも充実しています。

 

リンク集

連載:ASP.NET MVC入門(@IT)

もう一つのASP.NET 「ASP.NET MVC」を知る・前編、後編)(CodeZone)

ASP.NET MVC 入門 (1)~(3)

ASP.NET MVC 2(スライド)

ASP.NET MVCフレームワークの概要を理解する

 

 

 

業務アプリに限らず、いろいろなプログラム作成を経験していると、

タスクトレイ(通常画面右下の時計が表示される場所)へアプリケーションを

常駐させて(タスクバーに出さずに他の作業の邪魔にならないように)動かしたい

事は必ず1度や2度はあるのではないかと思う。

 

C#(.Net Framework)では、タスクトレイへアプリケーションを格納するための

クラスが標準で備わっている。それが、タイトルにもある、NotifyIconである。

使い方はいたって簡単であり、タスクトレイへの常駐だけでなく、アイコンの設定、

バルーン表示機能(吹き出しのようなメッセージが一定時間表示される機能)や、

ヒントメッセージ、コンテキストメニューの設定がとても簡単にできるが、

細かい動きを気にすると、少しテクニックが必要になるので書いておきます。

※細かい動きと言っても、常駐アプリケーションを使用する場合には大抵必要になる

だろう動きだと思うので、調べると結構同様の対応策が検索できる。

 

まずは、NotifyIconの使い方も含め、

1.NotifyIconをフォームに張り付ける。

2.NotifyIconのVisibleプロパティをtrueにし、Iconプロパティに表示したいアイコンを
  指定すると、これだけでアプリケーション実行時にタスクトレイにアイコンが表示

  される。また、タスクバーにアプリケーションのタスクを表示させないためには、

  ShowInTaskbarプロパティをflaseに設定します。

3.Titleプロパティの内容が、ヒントメッセージになり、BalloonTip?プロパティを設定

  し、ShowBalloonTipメソッドでバルーンを一定時間表示できます。

4.ここまでは、簡単な設定だけでうまくいくのですが、アプリケーションのウィンドウは

  最小化するとタスクバーには表示されないのですが、デスクトップ領域に表示されて

  しまいます。また、閉じるボタンを押した際にアプリケーションが終了するのではなく、

  画面は消えるが、タスクトレイには常駐されたままにしたいというのが一般的な機能

  でしょう。

5.結論から言うと、WndProc というメッセージの処理をつかさどるメソッドをオーバ

  ライドすると自由にアプリケーションの動作を制御することが可能なので、

  この方法がベストでしょう。ただ今回は、極力簡単で分かりやすい方法で

  できないかを探しており、少し動作的に微妙な点はあるが、メッセージを使用せず、

  WindowStateプロパティを制御するだけでもうまく動かすことはできた。

6.WndProcの制御も覚えれば簡単なので、ハードルは高くないと思われるが、今回は

  せっかくなので両方の方法のサンプルを書いておきます。

 

コードサンプル


前提条件

・フォームにNotifyIcoonコントロールを張り付ける

・NotifiIconのVisibleをtrue、ShowInTaskbarプロパティをfalse、Iconプロパティを設定

 

a)WndProcを使用する方法

    public partial class Form1 : Form
    {
        private int    WM_SYSCOMMAND = 0x112;
        private IntPtr SC_MINIMIZE   = (IntPtr)0xF020;

        public Form1()
        {
            InitializeComponent();
        }

        protected override void WndProc(ref Message m)
        {
            //最小化されたときにフォームを非表示にする
            if ((m.Msg == WM_SYSCOMMAND) && (m.WParam == SC_MINIMIZE))
            {
                this.Hide();
            }
            //上記以外はデフォルトの処理をおこなう
            else
            {
                base.WndProc(ref m);
            }
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            //タスクトレイのアイコンダブルクリックでフォームを表示、アクティブ化
            this.Show();
            this.Activate();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //フォームを閉じる時、タスクトレイに表示されている場合は閉じずに非表示
            if (notifyIcon1.Visible)
            {
                e.Cancel = true;
                this.Hide();
            }
        }

        //NotifyIconのコンテキストメニューに追加した「閉じる」メニュークリックイベント        
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //NotifyIconのコンテキストメニューで閉じるメニューを実行した場合
            //NotifyIconを非表示にしてアプリケーションを終了する
            notifyIcon1.Visible = false;
            Application.Exit();
        }
    }

 

b)WindowStateプロパティを使用する方法

→この方法の場合は、あくまで最小化の処理が発生していることになるので、

最小化のアニメーションが表示されてしまう、再表示する場合に、フォームの状態を

再設定するため、画面がちらつく場合があるなど微妙に動作が気になる部分も残る。

    public partial class Form1 : Form
    {
        //ウィンドウの状態を保存するためのフィールド
        private FormWindowState windowState;

        public Form1()
        {
            InitializeComponent();
            windowState = WindowState;
        }

        private void MainForm_ClientSizeChanged(object sender, EventArgs e)
        {
            //ウィンドウが最小化された場合はフォームを非表示
            if (this.WindowState == FormWindowState.Minimized)  
            {  
                this.Hide();
            }
            //最小化以外の場合はウィンドウの状態を保存しておく
            else
            {
                windowState = WindowState;
            }
        }

        private void notifyIcon1_DoubleClick(object sender, EventArgs e)
        {
            //ウィンドウを表示、保存しておいた状態に戻し、アクティブ化する
            this.Show();
            this.WindowState = windowState;
            this.Activate();
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            //フォームを閉じる時、タスクトレイに表示されている場合は閉じずに非表示
            if (notifyIcon1.Visible)
            {
                e.Cancel = true;
                this.Hide();
            }
        }

        //NotifyIconのコンテキストメニューに追加した「閉じる」メニュークリックイベント       
        private void toolStripMenuItem1_Click(object sender, EventArgs e)
        {
            //NotifyIconのコンテキストメニューで閉じるメニューを実行した場合
            //NotifyIconを非表示にしてアプリケーションを終了する
            notifyIcon1.Visible = false;
            Application.Exit();
        }
    }

オブジェクト指向と言いつつ、クラスをインスタンス化させたくない場面は

よくあることです。

 

私の経験上では主に2つ。

 

  1. ユーティリティクラス
    他の色々なクラスから共通で利用されるメソッドを実装する。
    共通関数群のような使い方をするが、そのたびにクラスを
    インスタンス化して利用するのはコードもわかりにくくなるし、
    そもそもオブジェクトとして利用する意味がない。

    この場合、Java等でも同様だと思うが、staticなメソッドを定義し
    インスタンス化せずに手軽に共通メソッドを利用できるようにする。
    その際、インスタンス化自体が無意味なので、コンストラクタを
    private で宣言するのが一般的です。


    public class StringUtil
    {
        private StringUtil
        {
            //インスタンス化不可
        }

        public static Find(string source, string search)
        {
            return ...
        }
    }


  2. シングルトンクラス(シングルトンパターン)
    オブジェクトをシングルトンにしたい場合に使用する。
    シングルトンとはアプリケーション内であるクラスのインスタンスは
    唯一であることを保証するクラスのこと(例:プリンタスプーラなど)

    クラスが内部的にそのクラスのオブジェクトをひとつだけインスタンス化し、
    インスタンスが必要な場合にかならず、唯一のオブジェクトへの参照を
    返すという仕組みである。

    public class Singleton
    {
        private static obj = new Singleton();

        private Singleton
        {
            //インスタンスの取得は、GetInstanceメソッドで
        }

      public static Singleton GetInstance
        {
            return obj;
        }
    }


C#2.0からは、上記のように、無理やりコンストラクタを、privateにして

インスタンス化できないようにするという、よく考えると無理やりな手法

ではなく以下のようにスマートに記述できるようになった。

class定義の前に、staticを付加すると、そのクラスは自動的に静的な

クラスとなり、以下のような特徴を持つようになる。

 

  • 静的メンバのみを含みます。
  • インスタンス化できません。
  • シールされます。
  • インスタンスコンストラクタを含むことができません

コンストラクタを記述しても言語レベルでエラーが検出され、

コンパイルすることができなくなります。

このクラスを利用し、静的フィールド、静的メソッドだけを使用した

ユーティリティクラスやシングルトンの仕組みも簡単に実装できます。

絶対現場主義Visual C#実践講座

 

著者:丸岡 孝司 

発行日:2007年7月25日

発行者:黒田 康夫

発行所:株式会社ラトルズ

411ページ

2,600円+税

 

内容

開発の現場から生まれた実践テクニック&TIPS集。

"Visual C# プログラミング"という大海原をひとりゆくプログラマのために。

  • Chapter1 .NET FrameworkとC#プログラミング
    Visual Studioの使い方、C#コーディング方法、C#のデータ型、制御構造
    などの言語仕様に関するテクニックやTIPSを収録。

  • Chapter2 Windowsアプリケーション
    Windowsフォームやコントロールを使用した、Windowsアプリケーション
    作成のテクニックやTIPSを収録。

  • Chapter3 データベース処理
    .NET Frameworkにおけるデータベース処理に関するテクニックやTIPS
    を収録。

  • Chapter4 Webとネットワーク
    .NET Frameworkにおけるネットワーク処理について簡単に紹介。

 

ポイント

職場で一緒に仕事している人からのお勧めの一冊。借りました。

現在、C#のプロジェクトを一から作り始めて進行中なので、フレームワーク

作りの参考にしました。

 

タイトル "絶対現場主義" にもあるように、実際に現場で開発をする人たち

にとって役立つ内容となっています。

 

特に、C#プロジェクトはまだあまり経験がないけど、こんな感じでいいのかなぁ

とか、Javaのプロジェクトは経験したけど、C#ではどうするべきか・・・(悩)とか、

昔ながらのVBスタイルのプログラムは書けるけど、C#ってオブジェクト指向が

ベースだし、クラスとか、継承とか、カプセル化もいまいち良くわかんないよなぁ

とか・・そんな悩める人たちの手助けになると思います。

 

書き方も、従来の単純な解説書やリファレンス、TIPS集などとは違い、いちいち

現場目線での解説(こういう背景だからこんな疑問が発生し、こう解決すれば

良いのでは?スタイルでの記述)がされており非常に読みやすくなっています。

例示されているシーンも、一度は誰もが悩んできたであろう内容で納得できます。

(その分、普通のTIPS集では1ページで書かれている内容が3?5ページかけて

解説されていたりしますが・・)

 

特に、Windowsアプリケーションでは、開発のフレームワークをどうするべきかや、

コントロールの拡張方法、共通化などについても詳しく書かれていますので、

実際のプロジェクトの参考にできると思います。

 

最後に、Webアプリケーションの事については紹介として少しだけ解説されて

いますが、つい先日、この書籍の、"Webアプリケーション編"が出版されたよう

ですので、紹介だけしておきます。※私は.NETだと、APS.NET MVCの方に

興味があるため、こちらの書籍(MVCについては触れられていなさそう?)

なので購入するかどうかは今のところ未定です。

 

 絶対現場主義Visual C#実践講座(Webアプリケーション編)

 

  

最近仕事でC#をメインで使うようになってきたので。

新しいこともいろいろと習得中です。

 

業務アプリケーションにデータベース処理はつきもので、

さらにデータベース処理には、トランザクションがつきもので、

またまたトランザクション処理にはコミットと、ロールバックが・・・

 

今まではどんな言語を使うにしろ、トランザクション処理では、

トランザクションの開始と、コミット、そして例外時にはロールバックと

明示的に記述していた。

 

C#で、SqlTransactionを利用した従来の書き方

using (SqlTransaction tran = con.Begin.Transaction())

{

    try {

        //SQLによるデータベース更新処理

        :

        //コミット

        tran.Commit();

    }

    catch {

        //ロールバック

        tran.Rollback();

    }

}

 

しかし.NET Framework2.0ではもう少し簡単に書けるようになった、

System.Transaction.TransactionScopeクラスが用意されている。

TransactionScope.Complete()メソッドが呼ばれるとコミットされ、

TransactionScope.Dispose()メソッドが呼ばれるとロールバック

される仕組みとのこと。

なので、usingステートメントと組み合わせて、以下のように書ける。

using (TransactionScope tran = new TransactionScope()) {

    //SQLによるデータベース更新処理

    :

    //コミット

    tran.Complete();

}

※例外が発生したり、Complete()メソッドを呼び出さずに、

usingステートメントを抜けると自動的にロールバックされる。

 

また、TransactionScope クラスには自動的にコネクションや、

SqlCommandクラスを検出する機能があるため、今までのように

明示的にコネクションやSqlCommandのインスタンスとトランザクション

のインスタンスを結びつける必要が無くなっているのもポイント。

 

 

前回は、twitterの最新のつぶやきを表示する、

簡単なアプリケーションを作成してみました。

 

ロジックとしては、twitterで指定されたAPIを呼び出し、

XML形式のデータを取得し、XPathでXMLデータを解析して

表示するといった内容でした。

 

今回は、Webの世界ではXMLより手軽に扱えるとされている、

JSON形式のデータを扱うことにします。twitterのAPIでも標準で

JSON形式のデータに対応されています。

 

今回も、C#.netを使用してアプリケーションを作成してみました。

(プログラムの機能は前回と同じです)

 

ダウンロード

20090914.jpg

※実行にはJson.NETのライブラリも必要です(ダウンロード

 

JSON形式のデータをC#で定義したクラスにマッピングすることで、

マッピング後のデータの操作が簡単・柔軟になります。

 

ソース(TwitterForm.cs)

using System;
using System.Collections.Generic;
using System.Windows.Forms;
using System.Net;
using System.IO;
using Newtonsoft.Json;

namespace TwitterApplication
{
    public partial class TwitterForm : Form
    {
        public TwitterForm()
        {
            InitializeComponent();
            lstItems.Items.Clear();
        }

        private String GetTweet(String URL)
        {
            //Request
            HttpWebRequest Request = (HttpWebRequest)WebRequest.Create(URL);
            Request.Method = "GET";
            WebResponse Response = Request.GetResponse();
           
            //Read
            StreamReader Readar = new StreamReader(Response.GetResponseStream());
            String Results = Readar.ReadToEnd();

            //Return
            Readar.Close();
            Response.Close();
            return Results;
        }

        private void btnTimeLine_Click(object sender, EventArgs e)
        {
            String URL = "http://twitter.com/statuses/user_timeline/" + txtUser.Text + ".json?count=50";
            String JSON = GetTweet(URL);
            List<Status> StatusList = (List<Status>)JsonConvert.DeserializeObject(JSON, typeof(List<Status>));
           
            lstItems.Items.Clear();
            lstItems.HorizontalScrollbar = false;
            foreach (Status StatusObject in StatusList)
            {
                lstItems.Items.Add(StatusObject.Text);
            }
            //ScrollBarSetting
            lstItems.HorizontalScrollbar = true;
        }
    }
}

 

ソース(Twitter.cs)

namespace TwitterApplication
{
    public sealed class Status
    {
        public string In_reply_to_status_id { get; set; }

        public bool Favorited { get; set; }

        public string In_reply_to_user_id { get; set; }

        public string Source { get; set; }

        public string Created_at { get; set; }

        public string In_reply_to_screen_name { get; set; }

        public User User { get; set; }

        public string Id { get; set; }

        public bool Truncated { get; set; }

        public string Text { get; set; }
    }

    public sealed class User
    {
        public string Profile_sidebar_border_color { get; set; }

        public string Description { get; set; }

        public string Url { get; set; }

        public string Screen_name { get; set; }

        public string Following { get; set; }
           
        public bool Verified { get; set; }

        public string Profile_text_color { get; set; }

        public int Followers_count { get; set; }

        public string Profile_background_image_url { get; set; }

        public string Created_at { get; set; }
       
        public string Notifications { get; set; }

        public int Friends_count { get; set; }

        public string Profile_link_color { get; set; }

        public bool Profile_background_tile { get; set; }
       
        public int Favourites_count { get; set; }

        public string Profile_background_color { get; set; }

        public bool Protected { get; set; }

        public string Time_zone { get; set; }
       
        public string Location { get; set; }

        public string Name { get; set; }

        public string Profile_sidebar_fill_color { get; set; }
       
        public string Id { get; set; }

        public int Statuses_count { get; set; }
       
        public int Utc_offset { get; set; }

        public string Profile_image_url { get; set; }
    }
}