Hatena::ブログ(Diary)

当面C#と.NETな記録 このページをアンテナに追加 RSSフィード

2007/6/28 (木)

[] ねくすとてくのろじぃ  ねくすとてくのろじぃを含むブックマーク  ねくすとてくのろじぃのブックマークコメント

最近、MSの次の技術の発表が多杉てさっぱりわからないので、コードネームと概要をコピペ。

コピペ元 B# .NET Blog

Silverlight とか DLR とか IronRuby とかは日本語情報が多いのでぐぐって。

Astoria と Pex なんて今初めて知った。あと LINQ to なんとかは大杉。そろそろ LINQ to ( LINQ to なんとか ) が必要かも(・ω・)

(追記)リンクを付けた

p-nixp-nix 2007/06/29 08:20 Katmaiは「SQL Server 2008」になりましたよー

siokoshousiokoshou 2007/06/29 14:11 ありがと〜!

トラックバック - http://d.hatena.ne.jp/siokoshou/20070628

2007/6/27 (水)

[][] enum を文字列で置き換えて ComboBox に表示する  enum を文字列で置き換えて ComboBox に表示するを含むブックマーク  enum を文字列で置き換えて ComboBox に表示するのブックマークコメント

先週は、DataBindingで大ハマリしてました。データベース知らない→ADO.NET知らない→DataBindingあまり使わないって流れで、DataBindingをよく知らないのが原因。なので、ADO.NET本を借りてきてちょっと勉強中です。以下は WinForm の DataBinding についてです。ASP.NETはまたちょっと違うらしい。

まずは ComboBox (と ListBox) の DataSource, ValueMember, DisplayMember の使い方。しかも ADO.NET なし。こいつらも DataBinding の範疇に入るのかわかりませんが、まあどっちでもいいや。

MSDNライブラリの「ListControlクラス」を見ればサンプルコードがあるので、そちらもどうぞ。リンクしようとしたら「コンテンツが見つかりません」と出た…。Googleキャッシュには確かに残ってるんだけど…。


ComboBox (と ListBox) の DataSource, ValueMember, DisplayMember の使い方

DataSource, ValueMember, DisplayMember は言葉で説明しただけではわかりづらいので、コンボボックスに「ある enum の値を文字列で置き換えて表示/選択したい」っていうシチュエーションで順を追って説明します(よくありますよね?)。

表示/選択したい enum はこれです。

public enum Gender { Male, Female }

でも、実際の表示にはこっちの文字列を使いたい。

public static readonly string[] Gender_ja_JP = { "男性", "女性" };

本当はリソースから読む値とでも、いいほうに解釈しておいてください(^^;

今回は Person クラス(ってのがあると思ってください)にべた書きしました。

で、これをフォーム上のコンボボックス this.genderComboBox に結び付けるにはどうするか?

( Gender.Male, Gender_ja_JP[ 0 ] ) のような enum と文字列を一対一対応させたデータ型(なんでもいい)を作ってやり、そのコレクション(や配列)をコンボボックスの DataSource に入れてやればOKです。

ここでは KeyValuePair<string, Gender> を使います。

対応表はこのようになります。

KeyValuePair<string, Gender>[] array = new KeyValuePair<string, Gender>[] {
  new KeyValuePair<string, Gender>( Person.Gender_ja_JP[ 0 ], Gender.Male ),
  new KeyValuePair<string, Gender>( Person.Gender_ja_JP[ 1 ], Gender.Female ) };

これをコンボボックスの DataSource に入れ、DisplayMember と ValueMember で表の読み方を教えてあげればお終いです。

this.genderComboBox.DataSource = array;
this.genderComboBox.ValueMember = "Value";
this.genderComboBox.DisplayMember = "Key";

DisplayMember と ValueMember は、KeyValuePair<string, Gender> のパブリックプロパティを表しています。ValueMember が実際の値を表すプロパティDisplayMember が表示に使うプロパティDataSource はその対応表です。

あとは SelectedValue で読んでみてください。SelectedValue は enum の Gender で読み書きできます。文字列のほうではありません。MSDNライブラリによると「ValueMember にプロパティを指定しない場合、SelectedValue はオブジェクトの ToString メソッドの結果を返します。」だそうですので、ご注意を。


データバインディング時の注意

ここまでで対応付けはできたけど、データバインディングと一緒に使うときは注意が必要っぽいです。

エンティティクラスを書いて、いったんコンパイルして、VisualStudioでそのエンティティをオブジェクトデータソースとしてフォームにポトペタするってのが、データバインディングを使うときの普通なやりかたと思います。オブジェクトを詳細に設定して多数のコントロールを一度に生成できますが、この方法でコンボボックスを作るとコンボボックスのTextプロパティにバインドしたコードが生成されるようです。上述の対応付けの方法では、Textプロパティにバインドした場合にはうまく働きません!SelectedValueプロパティにバインドしないといけないようです。

何か手順を間違っているのかもしれませんが、自分で試した範囲ではそうでした。なので、フォームのコンストラクタでInitializeComponent()後に以下のように書いて対処しました。

this.genderComboBox.DataBindings.Clear();
this.genderComboBox.DataBindings.Add(
  new Binding( "SelectedValue", this.personBindingSource, "Gender", true ) );

Clearしないで両方にバインドすると、WinFormを閉じることさえできなくなるので注意。

(追記)デザイナのコンボボックスの右上の三角をクリックして出てくる「データバインド項目を使用する」を使うと、SelectedValueプロパティにバインドします。データソースで詳細をポトペタしてからこれを使うと、TextとSelectedValueの両プロパティにバインドしたコードが生成され、まともに動かないので注意。(追記終わり)


自動化してみる

ここからはおまけ。KeyValuePair<string, Gender>[] array を作るところを自動化してみました。enum 作るのも、日本語リソースを用意するのもしょうがないけど、これをくっつけるのは自動化してしまいます。対応関係を明示的に書くってのも良いことだと思うけど、やっぱり面倒なので。

using System;
using System.Collections.Generic;
using System.Reflection;

namespace BindingTest
{
  public static class EnumHelper
  {
    public static Array CreateMappingTable( Type enumType, IList<string> textList )
    {
      try
      {
        Array enumValues = Enum.GetValues( enumType );
        if ( enumValues.Length != textList.Count )
          throw new ArgumentException( "enumType に定義された要素数と textList の要素数が異なります。" );

        Type pairType = typeof( KeyValuePair<,> ).MakeGenericType( new Type[] { typeof( string ), enumType } );
        ConstructorInfo ci = pairType.GetConstructor( new Type[] { typeof( string ), enumType } );

        Array result = Array.CreateInstance( pairType, enumValues.Length );
        int i = 0;
        foreach ( object value in enumValues )
        {
          result.SetValue( ci.Invoke( new object[] { textList[ i ], value } ), i );
          i++;
        }
        return result;
      }
      catch ( ArgumentNullException e )
      {
        throw new ArgumentNullException( "enumType が null です", e );
      }
      catch ( ArgumentException e )
      {
        throw new ArgumentException( "enumType が Enum ではありません", e );
      }
    }
  }
}

また、MakeGenericTypeみたいなマニアックな世界になってしまった。型を後から指定するタイプのコードは面倒ですね…。MakeGenericType は id:siokoshou:20070509#p2 を参考にどうぞ。あとは普段あまり目にしないものが多いけど、簡単なものしか使ってないです。メソッド名がいけてないなぁ…。

これがあれば、↓が

KeyValuePair<string, Gender>[] array = new KeyValuePair<string, Gender>[] {
  new KeyValuePair<string, Gender>( Person.Gender_ja_JP[ 0 ], Gender.Male ),
  new KeyValuePair<string, Gender>( Person.Gender_ja_JP[ 1 ], Gender.Female ) };

this.genderComboBox.DataSource = array;
this.genderComboBox.ValueMember = "Value";
this.genderComboBox.DisplayMember = "Key";

こう書けます。

this.genderComboBox.DataSource = EnumHelper.CreateMappingTable(
  typeof( Gender ), Person.Gender_ja_JP );
this.genderComboBox.ValueMember = "Value";
this.genderComboBox.DisplayMember = "Key";

ラク!

enumと対応付ける文字列の要素の順番に気をつけてくださいね。enum中の要素の現れる順ではなく、値順になります。 enum E { a = 0, b = -1 } とした場合、対応する文字列のほうは string[] EText = { "b", "a" }; となります。enumの値が飛んでいても文字列のほうは値順に隙間なく並べてください。

最後に愚痴。DataSource が IDictionary<,> を受けることができればスッキリきれいなのに! IList しか受けれないようで。Dictionary がこれほどしっくりくる使いどころはそうそうないと思うんだけど…。

以上、データバインディングのお勉強してたハズが、なんか違うほうにいってしまった日記でしたw

[][] enum を ComboBox に表示する (文字列で置き換えない)  enum を ComboBox に表示する (文字列で置き換えない)を含むブックマーク  enum を ComboBox に表示する (文字列で置き換えない)のブックマークコメント

もうちょっと実験したらまた不思議なことが起きたのでメモ。

enum を直接コンボボックスに表示する場合です。一つ前のエントリとの違いは文字列で置き換えないってところ。こっちが先だろって一人つっこみしつつ…。

表示したいのはこれ。

public enum Gender { Male, Female }

そのままコンボボックスに Male や Female と表示します。フォームにこれを書くだけ。

this.genderComboBox.DataSource = Enum.GetValues( typeof( Gender ) );

ただし!前の文字列で置き換える例では、データバインディングを使うとき、コンボボックスの Text プロパティにバインドすると動かず、SelectedValue プロパティにバインドしました。

今度は逆で、この例では Text プロパティにバインドしないと動きません。

なんだかなぁ。データバインディングはドキュメントも少ないくせにややこしい。

トラックバック - http://d.hatena.ne.jp/siokoshou/20070627

2007/6/26 (火)

[] 読み仮名アプリ  読み仮名アプリを含むブックマーク  読み仮名アプリのブックマークコメント

f:id:siokoshou:20070626132101j:image

先日公開された Yahoo の日本語形態素解析 Web サービスを使って読み仮名振りアプリを作ってみました。手抜きだけどね:)

事前準備として、アプリケーションID登録フォームでアプリケーションIDを取る必要があります。Yahoo のアカウントがあれば、ポチっとその場で取れるので楽。下の読み仮名サービスクラスの appid の --- を取ったIDで置き換えてください。

WinForm なプロジェクトを新規作成して、テキストボックス2つとボタン1つを置きます。ボタンの名前は buttonExec にして、テキストボックスは1,2のままで。テキストボックスは1が入力用、2が変換結果の読み仮名表示用です。デザイナでボタンをダブルクリックして buttonExec_Click を生成しておきます。

フォームのコードはこれだけ。

using System;
using System.Windows.Forms;

namespace Keitaiso
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }

    private void buttonExec_Click( object sender, EventArgs e )
    {
      YomiganaService yomigana = new YomiganaService( this.textBox1.Text );
      this.textBox2.Text = yomigana.Exec();
    }
  }
}

あとは読み仮名サービスクラス。REST は WebClient だけでさらっと書けていいねぇ。POST も書いてみたけどエラーが返ってきてうまく動かなかったので GET のみ公開。

using System;
using System.Text;
using System.Net;
using System.IO;
using System.Xml;

namespace Keitaiso
{
  public class YomiganaService
  {
    // 取得したIDで置き換えてください
    const string appid = "appid=---";

    private string _text;
    public string Text
    {
      get { return this._text; }
    }

    private string _yomigana;
    public string Yomigana
    {
      get { return this._yomigana; }
    }

    public YomiganaService( string text )
    {
      if ( 50 * 1024 <= text.Length )
        throw new ArgumentOutOfRangeException( "text", "長すぎ" );

      this._text = text;
      this._yomigana = "";
    }

    public string Exec()
    {
      using ( WebClient wc = new WebClient() )
      {
        const string serviceUrl = "http://api.jlp.yahoo.co.jp/MAService/V1/parse?";
        const string separator = "&";
        const string results = "results=ma";
        const string maResponse = "ma_response=reading";
        const string maFilter = "ma_filter=1|2|3|4|5|6|7|8|9|10|11|12|13";
        const string request = serviceUrl + appid + separator + results
          + separator + maResponse + separator + maFilter + separator;

        string sentence = "sentence=" + this._text;

        wc.Encoding = Encoding.UTF8;
        string result = wc.DownloadString( request + sentence );
        this._yomigana = Parse( result );
      }
      return this._yomigana;
    }

    private string Parse( string xmlText )
    {
      StringBuilder sb = new StringBuilder();
      using ( StringReader sr = new StringReader( xmlText ) )
      using ( XmlReader reader = XmlReader.Create( sr ) )
      {
        while ( reader.ReadToFollowing( "reading" ) )
        {
          sb.Append( reader.ReadElementString() );
        }
      }
      return sb.ToString();
    }
  }
}

これでできあがり。

MeCab で読み仮名振りをよくやってるんですが、Yahoo も試してみたくて作りました。自分で辞書をいじれないってのはきつい制限だと思うけど、まあ試してみるかと思って。遊んでみてください。

#「十六夜」が「16よる」とか帰ってきたw そんなもんかw

トラックバック - http://d.hatena.ne.jp/siokoshou/20070626

2007/6/24 (日)

[] FizzBuzz問題  FizzBuzz問題を含むブックマーク  FizzBuzz問題のブックマークコメント

奥村先生が例のFizzBuzz問題を生徒42人に制限時間付きで実施してみたそうな。

http://oku.edu.mie-u.ac.jp/~okumura/blog/node/1531

結果が気になります。勝手に予想、2割の8人。

[] そのうち書く  そのうち書くを含むブックマーク  そのうち書くのブックマークコメント

不変について。immutable。

  • (自分で出会ったモノで)不変について一番詳しく記述がある書籍(今読んでいる)
  • リッチャー本にもちょっとだけ記述があったハズ
    • 値型と不変な参照型のみを引数に取るメソッドはマルチスレッドOKとかそんな記述だったような気がする。そうじゃなければコピーすれとかイヤなことが書いてあったような…。id:siokoshou:20070315のDiffを書くときに気をつけて書いた。

いつか書く。たぶん。

トラックバック - http://d.hatena.ne.jp/siokoshou/20070624

2007/6/14 (木)

[] Disposable パターン  Disposable パターンを含むブックマーク  Disposable パターンのブックマークコメント

http://msdn.microsoft.com/msdnmag/issues/07/07/CLRInsideOut/default.aspx?loc=jp

面倒くさいDisposableパターンの徹底解説の最新版。セキュリティコンテキストの情報とか(私にとっては)目新しいものがあるので、よくわかっている人にもオススメ。滅多にIDisposableを書かないのでよく忘れてしまいます。

典型的なDisposableパターンは id:siokoshou:20061124スニペットをどうぞ。↑の記事の終わりのほうにあるように、派生型には使わないで!

GCは必要だと思うけど、おかげでかえって(?)ややこしくなったものもありますね…。銀の弾丸は(ry

トラックバック - http://d.hatena.ne.jp/siokoshou/20070614

2007/6/12 (火)

Safari3 for Windows β

[] 難しいこと  難しいことを含むブックマーク  難しいことのブックマークコメント

http://www.rubyist.net/~matz/20070604.html#p07

すっかり議論に乗り遅れた感があるので、自分の日記でつぶやき。

難しいものが難しいままであったとしても、やっぱりセキュリティホールは残るんじゃないかとか思ったり。

むしろ、難しいがゆえにまた別の問題を引き起こすんじゃないかとか。例えばC++は難しいけど、メモリ関連のバグはよくある問題だし。

難しければ賢い人しか触らないから問題が起きないってことはない。趣味でコードを書く人は難しいことに近づかないかもしれないけど(それだけでもマシと言えばマシなのか…)、お仕事な人は滅茶苦茶でもとにかく書く。ひどいコードは趣味コードじゃなく、仕事コードにあるのはそのせいだと、どこかで読んだ気がする。

以前、C++のメモリ管理まわりを担当したことがあるけど、新人が入ってきてコードを書くたびにお約束のメモリの問題を起こしてくれて、何度も何度も説明しに行った嫌な思い出があります。GCは必要だ!

結局、難しくても簡単でも問題は出る、としか言いようがないような…。なので簡単なほうが好きです。解決策はみんなで探って行くべと逃げて終わり。

[] Safari3 for Windows β  Safari3 for Windows βを含むブックマーク  Safari3 for Windows βのブックマークコメント

http://www.apple.com/safari/download/

メニューの文字が重なってて読めない…。

MS時代は終わりGoogle/Appleの時代だなぁとしみじみ。

CoreGraphics.dllなんて入ってきた!

[] 文字列の比較  文字列の比較を含むブックマーク  文字列の比較のブックマークコメント

.NETの文字列の比較は複雑なことをやってますが、そのあたりのよい記事を見つけました。こないだ「等値性(等価性)と同一性」でちらっと触れた(で間違ったw)とこ関連。

MSDN記事の日本語版を見つけれない…。

リッチャー本でもこのあたりにちらっと触れてますね。

トラックバック - http://d.hatena.ne.jp/siokoshou/20070612

2007/6/8 (金)

[] LL  LLを含むブックマーク  LLのブックマークコメント

最近Rubyをゆっくり勉強中だったりします。実はRubyとの出会いはC#より古いんだけど、本格的にRuby本を買ってきて勉強するのは初めてだったり。

昔、Perl大好きな先輩がRubyと出会って、もうPerlはいい、Rubyで行くって宣言したときが出会いなので、衝撃的な出会いだったんですが、当時よちよちPerl状態だった自分はそのままPerlにとどまってしまいました。

その後、Perlはたいして身に付かず、Rubyもたいして身に付かずな状態でしたが、それでもどちらもたまにちょっとしたタスクをこなすだけならできてしまうので、本格的な勉強は棚上げ状態でした。そんな中途半端な知識でも役に立ってしまうのがLLの利点な訳ですが。

C/C++/Java/C#といった本格的なシステム構築言語は中途半端な知識だとマズイという危機感をいだきますが、LLだと全然そんな気がしないんですよね。LLで本格的なシステムを構築している、はてなの中の人とかはきっちり勉強すると思いますが、その他大勢の人はきっと私と似たり寄ったりの状態じゃないかと思います。

なんでちゃんと勉強したいと思ったのかというと、C#/.NETをやってるとどうも自分はRubyに恋してるんじゃないかという気がしてしょうがなかったってのがあります。言語ばかり学んでもしょうがないとも思うんですが、だんだんだんだん気になってきたので、まあ本一冊買ってみるのもいいかなと。そんな軽い気持ちで始めてます。まあ、なによりMatzさんのファンであり、ミーハーだったりもしますw

でもきっと、MS製Rubyが出るってことが後押ししているんだろうな。.NET上のRubyは既にいくつかあったのに本を買う気にならなかったし、自分が使うマシンにはたいていRubyは入れてあるのに(PerlもPHPもだけど)、それでも本一冊買うこともしなかったのに、今買うってのはきっとそうなんだろうなぁ。

ずっと書いてない間にwiiスポのテニスで2000超えたりもしましたけどねw 熱い戦いになると、コンピュータも明らかなアウト球を拾いにいくけど、そのとき観客席に飛び込んで帰ってこなくなったこともありましたwww

nsharpnsharp 2007/06/08 17:47 IronRubyだけでなく、MSはApache + Rubyのサンプルをいくつか出してきてますよ。(非公開ベータでですけど・・・。w)

漏れの場合は、逆に最近Perl寄りになってきてたりします。いろんな選択肢があると、結局最後にモノを言うのはreachとライブラリの豊富さなのかな、ということで。

siokoshousiokoshou 2007/06/08 19:40 MSがApache + Rubyですか(^^; すごいなぁ。Perlは文法が嫌いだけどCPANはいいなぁと思ってます。でも、自分が書いたものが読めないのでやっぱり避けますw まぁ自分の書き方が悪いせいなのはわかってるんですが…w

nintenshinnintenshin 2007/06/09 00:32 > テニス
2000超えると、点たまりにくくないですか?勝ってもマイナスになったり・・・

siokoshousiokoshou 2007/06/09 03:00 ストレートで勝っても内容によってはマイナスですね。上がったり下がったりの日々です。

トラックバック - http://d.hatena.ne.jp/siokoshou/20070608
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 06 | 09 | 11 | 12 |
2007 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 08 | 09 | 10 | 12 |
2009 | 01 | 03 | 04 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 07 |
2011 | 04 | 07 | 10 |
2012 | 04 | 12 |
2013 | 08 |
2014 | 03 | 08 |
2017 | 09 |