C#

2011年05月06日

C#らしいC#始めました

惑不まではまだ遠い



 GWも終盤に突入。
 個人的には一週間先取りして京都旅行(兼勉強会参加)してきたので、じっくりC#の書籍に目を通していました。

 ポリシーとして「可読性のために言語に特化した記述はなるべく使わない」というのがあったのですが、

 一個ぐらい特化した言語を持った方が良いよね

 と趣旨を翻し、その言語としてC#を選択。

前半は書籍に目を通して・・・



 後半は手を動かすことにして、手始めに書籍を読み始めたのですが、
 まだまだ力不足、知らない概念やじっくり読まないと理解できないことが多くて、
 本日ようやく読書終了(これからも広い読みして理解を深める必要ありですが)。

 というわけで、読んだ本を紹介。

 プログラミングC# 第5版

 定番ですかね。網羅的にC#を扱っているので、わからないことがあったら、この本を引くと便利。
 広く扱っているので、LINQなどテーマに沿って深く学びたい場合は別の文献をあたるとよさそうです。
 (C#3.0対応なのでC#4.0について知りたい方も別の書籍を)

 


 Effective C# 4.0

 個人的には難易度的に非常に良い本でした。
 作法からパフォーマンスまで、C#4.0のDynamicやPLINQも扱っておりためになりました。

 勉強になったと同時に、勉強不足を痛感した一冊でした。




 [完全版] 究極のC#プログラミング ~新スタイルによる実践的コーディング

 以前に購入した本でしたが、再読。
 前回は理解不十分な所も今回で大分カバーできました。



Windows Phone 7開発者の一人前は遠い・・・



 C#をマスターして、Silverlightを学んで、Windows Phone 7のデバイスや拡張を知る。
 一人前の開発者への道は遠いですねぇ。

 さぁ、GW後半戦は手を動かして行こう!!

2010年07月25日

Silverlight:Accordionコントロールを利用する(その3)

 久しぶりのAccordionコントロールの進捗報告。

 FxUGの全国ツアー、Hokuriku.NET vol4、TechEdのライトニングトーク作成(落選しちゃいましたけど…)と立て続けにスライド作成が続いていたので、今週末は久々に腰を据えてプログラミング。

 Accordionコントロールのデモはこちら

 過去の記事:その1その2

 前回からあまり変わってないように見えますが、前回まではSilverlightでデータを生成してAccordionを表示していましたが、今回はサーバーサイドのPHPと通信してデータを表示するようにしてあります。

 今回はこの辺の「サーバーサイド」も絡めて紹介します。

 ちなみにローカルの開発環境は

 OS:Windows7
 サーバー:Apache2
 プログラム言語:PHP5
 データベース:MySQL5

 のWAMP構成です。
 (別に閉じたネットワーク上にLinuxサーバーがありますが話が長くなるのでパス)

CakePHPフレームワーク



 サーバー側のPHPですが、CakePHPフレームワークを利用します。
 今後規模を拡大してサイト化したいという展望のためにフレームワークを導入したのですが、O/Rマッピング、キャッシュ、テストがはじめやすいなどのメリットと、CakePHPの導入の容易さもあいまって非常に利便性が高いフレームワークです。


SimpleTest



 CakePHPでのユニットテストはSimpleTestを用います。
 サイトからDLしたファイルをCakePHPのvendorsディレクトリに配置するだけで最初の準備は完了です。

 screen1

 (クリックで拡大)

 CakePHP1.2からユニットテストが非常に便利になって、

 ・テスト実行時は本番環境と別のテスト用DBを利用してテストを行う
 ・fixture機能で自動的にテスト用ダミーデータを生成する

 という本番データにやさしい機能がついています。
 テスト用DBはdatabase.phpで$testを指定するか、指定が無い場合は自動でDBを生成してテストを実行します。

 テストについてはこのページ前後の記事を参考にしてください。
 それ以外についても上記サイトで調べると詳細を得ることができます。

 fixtureの設定を間違えるとダミーデータが入らない場合があるので、その場合MySQLのクエリログを吐き出すようにしておくと便利です。でなくてもクエリログの出し方を知っておくと便利。(もちろん本番環境ではログはオフで)

 MySQLのクエリログを取得する方法(Windowsの場合my.iniですね)

DebugKit



 CakePHPで開発する場合DebugKitをインストールしていると非常に便利です。
 Viewに渡されたデータ、実行されたSQLクエリ、セッションデーター等々をvar_dumpなどを使わずに確認することができます。

 screen2

 (クリックで拡大)

キャッシュを利用



 リアルタイム性の無いデータの場合、毎回データベースに問い合わせるのではなくキャッシュを利用してデータベースへの問い合わせ無にデータを返すことで負荷を軽減できることがあります。

 CakePHP1.2からはファイルやメモリを使ったファイルキャッシュがサポートされ(メモリはmemcach等のインストールが必要ですが)たので非常に簡単にキャッシュを利用することができます。

 実際にキャッシュを利用している部分を抜粋。

Cache::set(array('duration' => '+360 seconds'));
if( ($return_data = Cache::read('getAllHeaderInfo-index') ) === false ){

$condition = array('order_number != 0');
$fields = array('name', 'order_number', 'url', 'description', 'eng_name');

$return_data = $this->findAll($condition, $fields);

Cache::set(array('duration' => '+360 seconds'));
Cache::write('getAllHeaderInfo-index' , $return_data);
}

return $return_data;


 一度データを取得したら6分間はファイルとして保存されたデータを返します。逆にデータが変更されたとしても6分間は以前に取得したデータを返すということですね。

 キャッシュが利用されているかどうかはDebugKitを利用すると簡単に確認できます。下が上記画像のページでキャッシュが効いている場合のログです。

 screen3


 個人的に意見が分かれるところではありますが、自分はモデルの中でキャッシュを利用するコードを書きます。
 役割的にはコントーローラーで書く方が良いかもしれませんね。


ようやくSilverlightの出番だ!!

 

 開発環境でSilverlightとサーバーサイドとの通信アプリを作成して最初に引っかかるのはセキュリティエラーですね。

 System.Security.SecurityException: セキュリティ エラーです。

 こんなメッセージが出ましたら、あわてずさわがず、clientaccesspolicy.xmlを設置してさくっと次へ進みましょう。

 セキュリティエラーをクリアしたらサーバーからデータを取得できるようになります。

 今回の利用データ(xml形式)

 上記リンク先のようなデータを受け取った後の処理が以下です。
 (一部抜粋、大体の流れをイメージしてください)

// XMLとして扱うためにパースする
XElement xml = XElement.Parse(e.Result);

var header_list = from tmp_header in xml.Descendants("header")
orderby (int)tmp_header.Element("order")
select tmp_header;

var collection = new ObservableCollection();

foreach (var header in header_list)
{
var content_list = from tmp_content in header.Descendants("content")
orderby (int)tmp_content.Element("content_order")
select tmp_content;

var contenst = new ObservableCollection();

foreach (var content in content_list)
{
contenst.Add(
new AccordionContentItemData() {
content_title = (string)content.Element("content_name"),
content_url = (string)content.Element("content_url")
}
);
}

collection.Add(
new AccordionViewItemData() {
header = (string)header.Element("name"),
title = (string)header.Element("name"),
contents = contenst,
num = (string)header.Element("order")
}
);
}

var request_event = new SideNaviDataRequestEvent();
request_event.collection = collection;

// dispatch
this.completed(this, request_event);


 (ソースコードをうまく表示する方法あるんですかね。
 はてなダイアリーだと素直に整形されて表示されるんですが…)

 LINQを2回に分けて実行していますが、凄腕C#プログラマーなら一発で処理しちゃうんですかねぇ。
 まだまだLINQを使ってうまく書けるレベルではありません。

 最後の

 this.completed(this, request_event);

 はObserverパターン(C#的にはデリゲート)で別クラスに通知します。

  public delegate void downloadComplete(object request, SideNaviDataRequestEvent e);
public event downloadComplete completed;


 コードがAccordionのコントロールに依存しているのも今後の改善の課題ですね。

 なんだか、PHPの解説が多くなった気がしますが、なんとなく完成が見えてきた気がします。

coelacanth_blog at 22:49 この記事をクリップ!

2010年07月09日

C#:[完全版]究極のC#プログラミングがWebで読めちゃっていいの!!

 LINQの本を探していたときにTwitterでonosさんに教えていただいたのですが[完全版]究極のC#プログラミングがほとんどWebで読めちゃうって凄いですね!!

 screen3


 LINQをほっぽって最初から読み進めていますが、実コードありの解説なので非常に頭に入りやすいです。
 動物本では深く扱わなかった(常識としてスルーしたのかも…)点についても解説してくれていたりとためになりすぎです。

 C#におけるクラスとメソッドの下りなんかは、自分がデリゲートやラムダ式に感じていた違和感を説明してくれていて目から鱗でした。

 個人的にはC#に特化したコードより、JavaやC++使いにも共通してわかるようなコードの方が色々な言語を使う環境では良いと考えていましたが、

 そういうことを言うのはC#をもっと知ってからじゃないと

 という焦燥に近い想いになりました。
 PC、Webがない環境でも読みたいので書籍も購入しようと思います。

 C#を好きになれる本(サイト?)でした。

 Web:[完全版]究極のC#プログラミング

2010年05月31日

Hokuriku.NET Vol3無事終了しました!!

 昨年夏のWindows7勉強会を契機にしてスタートしたHokuriku.NET勉強会も3回目を迎えることができました。

 Hokuriku.NETは.NET系という非常に広範囲にわたる分野になるため、特定の技術を学ぶという点では不向きですが、何でもアリな雰囲気が逆に魅力だったりします。
 今回も.NETとはほとんど関係ないけど魅力的なセッションがありました(後述)。

 準備にあたっては、手配のほとんどを@kabakiyoさんに行っていただき、登壇予定も無かったため非常にリラックスして聞くことができましたw
 ありがとうございます。

開始前のネタ振り



 まずは開始の挨拶で@kabakiyoさんが、

 「今回の会場は営利目的禁止なのでよろしくお願いします」

 という、いわばネタの仕込みのような前振りからスタート。

 そのあとのスピーカーさんの書籍参考書籍紹介などのシーンで「営利目的じゃないですよw」と笑いを誘発、場を和ます役に立っていました。
 業師ですねー。

「F#とC#の比較ネタ(仮)」 小島 富治雄さん



 関数型言語の入門&C#でF#っぽいことをするテクニカルな内容という入門から応用まで上手くカバーしたセッション。
 Scala勉強会などで聞いたカリー化の挙動がなんとなくわかりました。まだまだ利点などはストンと来て無いので関数型は今後もウォッチが必要ですね。

 C#の構文もそういう書き方があるんだぁと教えていただくことしきり、C#勉強中の身としては弟子入りしたい気持ちです。

IMG_0256


 和室でのセッションもいい雰囲気でした。

「Windows Virtual PC の活用方法」さくしま たかえさん



 農家の嫁にして主婦ギークのさくしまさんのセッション。

 VirtualPCのXPモードがVistaモードもあるとか、XPモードは差分でいくつも作成可能とかお役立ち情報が沢山でした!!

 VHDイメージは中央サーバにおいて家中のどのPCからでもVHDブートで同じ環境を使えると便利だなぁとか考えて質問したところ、やはりできないもよう・・・WebOSってこんな感じかなぁ。

 足がしびれるから座布団を3枚用意することという契約条件で登壇いただいたのに忘れてましたすみませんっ。

 IMG_0258


 でも@mita_ekmywebさんがちゃんと覚えていてくださったので、途中から座布団3枚体制が整ったのでした!!

「Azure+JRuby(?)ネタ(仮)」 はしもとさん



 はしもとさんのお話はいつも「技術者というのはこうでなければなぁ」と感じさせてくれるハック的な内容で凄くためになります。

 今回はAzureでMySQLやRubyOnRailsを動かしたいという所から、Azureの実装に迫るためになるセッション。
 懇親会でも自宅のサーバーがIP足りなくなったという英雄譚(?)聞かせていただき非常にやる気がでました!!

 IMG_0260


 

「復習シリーズ?「暗号化概説」」 ピアズ・マネジメント(株)中林秀仁さん 筏井哲治さん



 Hokuriku.NETの名物セッションというか、もはや代名詞に近い気もするピアズ・マネジメントのお二人の関心あり、笑いありのセッション。

 ただし.NET要素は暗号の計算を「VisualStudioで行った(証拠となるソースコード無しw)」というくだりだけ。

 セッションの内容は暗号化という渋いねたかとおもいきや、歴史やストリー仕立てにすれば小難しい話も聞いてもらえるよね、という「はっ」と最後に気づかせてくれるお二人らしい内容。

 IMG_0263


 

「windows phone 7の開発をしてみよう」でむらなりかずさん



 四次元ポケット並みにネタが豊富なでむらさんおWindowsPhoneのセッション。
 自分がSilverlight開発者ということもあって、これは凄くためになりました。
 
 さっそく家に帰ってWindowsPhoneの開発環境を整えたりしましたので、後で入門的な記事を書きたいと思います。

 はやく実機の登場と、デベロッパー向けの手に入れやすい環境を臨みます。

 (熱中しすぎて写真を取るのを忘れてました・・・)

 

「jQuery と MVC で作る Web アプリケーション」 マイクロソフト 井上 章さん



 今回は出張が認められず自費で参加していただきました(感謝!!)マイクロソフト井上さんのセッション。
 
 jQueryというかJavaScriptの補完の効いたエディタは他に無いかも。
 VisualStudioでjQueryの補完を受けれる仕組みはVisualStudio用のメタデータをjQuery側で提供しているからとか、これでバージョンアップの際もデータを用意しさえすればコード補完等を受けれるとか、なるほど。

IMG_0265


 

スペシャルサンクス



 またまた高品質の配信を行ってくださいました@mita_ekmywebさん、MS井上さん登壇の交渉をしていただきました@PharaohKJさん、そして勉強会を盛り上げてくださいましたオーディエンスの皆様、本当にありがとうぎざいました。

 次回、Vol4は7月(頃)に福井で開催予定ですお楽しみに!!
 全国行脚したいと希望している高橋忍さんに猛アタック予定ですので、そちらもお楽しみに!!

 

追伸



 おっと忘れてました!!
 実はHokuriku.NETのロゴができました。

 hokurikunetlogo1


 ロゴ完成の経緯は後ほど紹介しようかと思いますが、@PharaohKJさんの会社のデザイナーさんに製作いただきました、こちらもありがとうございます。

(お詫び)
 TwitterIDを間違ってしまいました配信、そして座布団を用意いただいたのは@mita_ekmywebさんでした、すみません。
 誤って記載してしまった@kkamegawaさんにもお詫び申し上げます。

2010年05月29日

C#:ほかの言語とのSwitch文の微妙な違い

 switch文でbreakを忘れるのはだれもが経験したことがあるエラーだと思う(大抵はリリース前に発見されると信じている)。

 以下のActionScript3プログラムは、他の多くの言語と同様に、

 breakを忘れたために、trace("hore");まで実行される。

var hoge:String = "hoge";

switch (hoge)
{
  case "hoge":
    trace("hoge");

  case "hore":
    trace("hore");
    break;

  default:
    trace("default");
    break;
}


C#では以下のようなコードはエラーになる。

switch(str)
{
  case "hoge":
    // break文がないのでエラーになる
    System.Diagnostics.Debug.WriteLine("hoge");

  case "hore":
    System.Diagnostics.Debug.WriteLine("hore");

    break;

  default:
    System.Diagnostics.Debug.WriteLine("default");
    break;
}

 
 エラーを回避したい場合はbreakするのが正しい動作の場合breakを、case "hore"の中も実行する(フォールスルーするというらしい)場合はgoto文を用いて以下のように書く、

case "hoge":
  System.Diagnostics.Debug.WriteLine("hoge");
  goto case "hore";

case "hore":
  System.Diagnostics.Debug.WriteLine("hore");

break;

default:
  System.Diagnostics.Debug.WriteLine("default");
  break;


 このプログラムは出力"hore"を得ることができる。

 基本的なことなのだけど、久しぶりにC#でコーディングすると「おやって」なってしまうのでメモ。

coelacanth_blog at 01:11 この記事をクリップ!

2010年05月18日

Silverlight:データバインディング入門その5(バリデーション)

 データバインディングはUIへのデータ受け渡しをシンプルなコードで実現する手段です。
 今回はバインディングするデータを検証(バリデーション)する方法を紹介します。


 過去の記事はこちら、

 Silverlight:データバインディング入門その1
 Silverlight:データバインディング入門その2
 Silverlight:データバインディング入門その3
 Silverlight:データバインディング入門その4(コンバート)


バリデーションの基礎



 まずはサンプルを見てみましょう。
 2つのTextBoxがあるシンプルなビューで、上段にシーラカンスと入力し下段にカーソルを移動するとバリデーションエラーが発生します。
 テキストボックスが赤い枠で囲まれクリックするとエラーの詳細を見ることができます。

 サンプルを見る



 下画像はサンプルの実行結果です。

screen


 サンプルのように入力値のチェックを行いエラー表示を行うのがバリデーションです。

xamlでの設定



 まずはTextBoxにバリデーションのための設定を追加しましょう。

<TextBox Height="24" HorizontalAlignment="Left" Margin="22,21,0,0" Name="textBox1" VerticalAlignment="Top" Width="120" Text="{Binding name, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnExceptions=True}"/>


 NotifyOnValidationError=TrueValidatesOnExceptions=Trueがバリデーション用の設定です。

 MainPage.xaml全文

C#コード



 C#側で入力値をチェックするコードは以下。

set
{
 if (value == "シーラカンス")
 {
  throw new ArgumentException("シーラカンスは駄目!!");
 }


 C#コード全文

 注意してほしいのは、「デバッグ開始」で実行した場合例外をキャッチできないエラーが出る場合があるので「デバックなしで実行」で実行してください。

error



 …って、ちょっと不便ですねぇ。


まとめ



 以上でデータバインディング入門を終了します。今度はもう少し突っ込んで応用編をお送りしようと思います。


2010年05月09日

Silverlight:SliderコントロールにMouseLeftButtonDownEventイベントをつける

 以前、SilverlightのSliderコントロールでMouseLeftButtonDown(スライダー上でマウスを左クリックした)イベントが取得できないと書いたけど、解決に至ることができないでいた。

 最近、会社でも自分のブログを見た人から「これ結局解決したの?」と聞かれ、「いやぁ、まだっす」というような返答をした。

 すみません解決してましたw

 久しぶりに書きなぐったソースコードを確認していたらイベントを取得していたコードが見つかったので備忘録変わりに(本当に忘れてましたからねぇ)残しておく。

 サンプルは以下(本当にマウスのダウンとアップを取得するだけ)、

 サンプルを実行する

 ソースコードは以下(該当の部分抜粋)

 MainPage.xaml
 MainPage.xaml.cs

 AddHandlerメソッドを利用すれば実現可能です。

2010年05月07日

Silverlight:データバインディング入門その3

 Silverlightのデータバインディングを紹介するエントリの3回目。
 今回はListBoxとComboBoxを利用して、2回目のエントリを発展させたサンプルを紹介。

 サンプルを実行してみる(要Silverlightランタイムインストール)

 過去の記事はこちら、

 Silverlight:データバインディング入門その1
 Silverlight:データバインディング入門その2

ObservableCollection



 今回も前回同様リストの管理にはObservableCollectionクラスを利用する。
 ObservableCollectionを利用することでバインディング対象にリストのデータが増減したことを通知することができる。

 今回のサンプルの「データを追加」ボタンを押した後の挙動がその動きに該当する。


 void MainPage_Loaded(object sender, RoutedEventArgs e)
 {
  // リストを生成、ObservableCollection
  this._persons = new ObservableCollection
  {
   new Person { name = "hoge", age = 24 },
   new Person { name = "hige", age = 19 },
   new Person { name = "hone", age = 32 }
  };

  // DataContextの対象がthis(最上位のUserControll)でもバインドが成立する
  this.DataContext = this._persons;

 }

 private void button1_Click(object sender, RoutedEventArgs e)
 {
  // リストを増やすとコントロールも自動で増える
  this._persons.Add(new Person { name = "add" + this._persons.Count, age = 18 + this._persons.Count });
 }


 コントロール対象のIDはlistBox1とcomboBox1ですがソースコード上ではまったくコントロールへの操作を加えていないことがわかる。

 実際のソースコードは以下、

 MainPage.xaml
 MainPage.xaml.cs

INotifyPropertyChanged



 リストの増減をバインドする方法としてObservableCollectionを紹介した。
 次はリストに格納されているPersonクラスのデータ変更をコントロールに通知する方法を見てみよう。

 上記リンクMainPage.xaml.csのPersonクラスの実装がそれにあたる。

 PersonクラスはINotifyPropertyChangedクラスを継承し、プロパティにPropertyChangedを持っていることが見て取れる。

 Personクラスのプロパティname, ageはsetterの中でPropertyChangedを呼び出している。これがバインディングのからくりだ。

Element to Elementバインディング



 以前に簡単に紹介したコントロール同士のバインディング、Element to Elementバインディングを見てみよう。

 MainPage.xamlのComboBoxのタグの中身がそれで

ComboBox Height="24" Name="comboBox1" Width="120" ItemsSource="{Binding}" SelectedItem="{Binding SelectedItem, ElementName=listBox1, Mode=TwoWay}"


 ComboBoxのSelectedItemプロパティにlistBox1の同じくSelectedItemプロパティを双方向バインディング(TwoWay)を行っている。

 Silverlightのxamlの柔軟性には関心するが、色々やっているとxamlがとても読めたものじゃないくらい膨大になりやすいのも事実。
 ここら辺はBlendをしっかり覚えてなるべくGUI操作で修正したいものですね。

2010年03月22日

VisualStudio2010RC(英語版)が利用可能です

 FlashBuilder4の話をしたので、Silverlight4の開発環境の話もしておきます。
 現在(正確にはMIXで)、VisualStudio2010RCにSilverlight4RC環境をインストールして開発することが可能になっております。

 Silverlight4RC
 VisualStudio2010RC

 どちらも英語版ですが、Silverlight4RC用途に限っていえば、β2までもたついた感じがあったXAMLの描画が早くなり非常に快適です。
 ただし一部(COM周りとか)変更があったようで、次週に勉強会登壇予定でSilverlight4ネタを用意している人などは(私だよ!!)急なトラブルに見舞われる可能性があるので注意が必要です。

 VisualStudioなどは高価な製品なだけに、Ultimate版を体験できる今は貴重な期間だと思います。

 ずっとRCだと良いのにねw

2009年10月21日

VisualStudio2010β2(Eng)が公開されました

 ついに出ましたね、VisualStudio2010β2!!

 自分のPCだとβ1は少し重い感じがしたのでどこまで改善されているのかが楽しみです。

1.インストール



 まずはDLページからWebインストーラーをダウンロードします。

 ISO形式でDLするリンクが見つからなかったので2台のPCにWebインストーラーでインストール。
 ちょっと不便。

2.β1はアンインストールすること



 トラブル発生。
 一台のPCにVisualStudio2010β1がインストールされていたので、それをアンインストールしてくれと警告されてしまいました。

 というわけでコントロールパネルからアプリケーションの削除を選んで・・・

 TFSObjectModel-x86_JPN.exeの場所を指定してください

 というポップアップが立ち上がり、指定しないとアンインストールができない!!
 どうやらβ1のISOが必要なようだ。これβ1のISO配布されなくなるとどうやってアンインストールすればよいのかなぁ。

 今はISOがDLできるので日本語のサイトでDL

 これでβ1がアンインストールできました。

3.続インストール



 あとはインストーラーに従って行けばインストールが完了します。
 途中再起動が必要になるので、中断できない作業を行っている場合は注意です。

 インストールは結構時間がかかるのでスケジュールに余裕があるときに行うことを推奨します。

 そして、ついに起動!!
 起動画面もちょっとおしゃれな感じです。

screem


 軽く触った印象としては、動作は軽くなっている気がします。
 あとβ1ではSilverlight2と3のプロジェクトが作成できましたが、β2ではSilverlight3のみとなっていました。

 .NETframework4の詳細と含めて今後もウォッチ、紹介していきたいです。

Profile

シーラカンス

Recent Comments
QRコード
QRコード
livedoor Readerに登録
RSS
livedoor Blog(ブログ)