Hatena::ブログ(Diary)

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

2007/8/31 (金)

[] シープラプラ  シープラプラを含むブックマーク  シープラプラのブックマークコメント

Yahoo!翻訳C++ を「シープラプラ」とか半端に訳してくれて吹いたw

geek festa とかはうまく訳してくれる、小粋なやつです。

[] ToString() のオーバーライドを強制したかったのに…  ToString() のオーバーライドを強制したかったのに…を含むブックマーク  ToString() のオーバーライドを強制したかったのに…のブックマークコメント

interface IHoge
{
    string ToString();
}

こうやって ToString() のオーバーライドを強制しようとしたら、

public class Hoge : IHoge { }

でも通るという…。そりゃそうだわなぁ。

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

2007/8/29 (水)

[] 内部イテレータと外部イテレータ  内部イテレータと外部イテレータを含むブックマーク  内部イテレータと外部イテレータのブックマークコメント

ときどき聞く言葉ですが、違いを知らなかったのでちょっと調べてみました。GoFデザインパターン聖典(^^;に記述がありました。

それによると、イテレータの内部でぐるぐる回すのが内部イテレータ。対して、イテレータを使ってイテレータの外で回すのが外部イテレータ。

まあ、まんまなんですが、例を挙げると List<T> の ForEach( Action<T> action ) とか ConvertAll<TOutput>( Converter<T, TOutput> converter ) なんかが内部イテレータ。一般的によく使われる、foreach ( T item in list ) { ... } みたいな使い方が外部イテレータ。

LINQ to Object の Select や Where なんかは内部イテレータですね。←LINQ to Object をこう説明すれば通じる人には一瞬で通じるのかもしれません。

「内部イテレータは簡単に使える。外部イテレータは内部イテレータより柔軟」とのこと。そうですねぇ。

以前、List<T> の FindAll と ConvertAll を組み合わせて使おうとして困ったことがあります。FindAll に複数の条件を与えて、「条件A」に一致した場合は「変換A」、「条件B」に一致した場合は「変換B」を使うみたいなことができないんですよね。2回に分ければいいんですが、そうすると両方の条件に一致する要素を後で捨てる処理が必要になったりして、それも馬鹿馬鹿しい感じ。この問題は LINQ にもありますね。パズル的にやってできないことはないけど実用的じゃない、みたいな。で、解決策としては何でも屋の ForEach が必要でしょうってことで。ForEach がないのは、LINQ to Object には簡単に作れても、ほかの LINQ に用意できないからなのかなぁ。

「また、内部イテレータは無名関数やクロージャや継続を提供していない言語には不向きである。」とも記述があります。今となってはそうですねって感想ですが、ちょっと前の自分だったらこの文の意味が理解できなかっただろうなぁ。というか、この本、昔読んだときはあんまり理解できなかったけど、今読むとスラスラ読めるなぁ。Smalltalk はわからないままだけど。

k.inabaさんのところで (http://www.kmonos.net/wlog/41.php の 04/08/09) yield が内部イテレータ風に外部イテレータを書ける構文って記述を見つけました。なるほど、そう考えるとスッキリ説明できますね!プチ感動。

関連 id:NyaRuRu:20070818 とかあちこち

NyaRuRuNyaRuRu 2007/08/30 04:04 分岐込みのパイプラインとなると,Haskell の Arrow がそれっぽいんですかねぇ?
私の場合 Arrow を Mathematica で再現しようとしてあの言語が動的型付けであることに気づいたという.

siokoshousiokoshou 2007/08/30 19:05 お〜、そんなのがあるんですかぁ。ふと思ったけど、もしかしてサブクエリを使えばそれぞれで変換みたいなことができるのかなとか思ったり。ちょっと考えてみよ。
それにしても、内部イテレータみたいにある程度のことができるけど制約もいろいろとあると、ついどうにかこうにか解決できないかなとパズルっぽく遊んでしまいますw 最初からなんでもできるよっていう外部イテレータだと興味がそそられないんだけどw なんなんだろう、こういう無駄なことばかり追求してしまう感覚は(^^;

siokoshousiokoshou 2007/08/31 10:22 Arrowスゴス…。http://d.hatena.ne.jp/r-west/20070720/1184946510
超高機能パイプって感じ。モナドと一緒であんまり理解できないけど、無駄な(?)高機能っぷりがいいですねw

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

2007/8/21 (火)

[] C#3.0仕様 正式版  C#3.0仕様 正式版を含むブックマーク  C#3.0仕様 正式版のブックマークコメント

http://download.microsoft.com/download/3/8/8/388e7205-bc10-4226-b2a8-75351c669b09/csharp%20language%20specification.doc

正式版が出たそうです。参考訳でもいいから日本語版が欲しいなっと。

via http://blogs.msdn.com/charlie/archive/2007/08/20/c-3-0-specification-now-available.aspx

前回の回答はどうなったんだろう…。NyaRuRuさんが書いてた Expression Tree の件、かなり気になります。

ところで、匿名メソッド(Anonymous Method)とラムダ式(lamda expression)をあわせて、匿名関数(Anonymous function)と呼ぶんですね。まあ、2.0互換が不要なら匿名メソッドはお役御免ですが。

NyaRuRuNyaRuRu 2007/08/24 12:33 >Expression Tree の件
TechEd会場で波村さんに直接聞いてみたところ、最近Fixされたバグでそういうのを見たことがあるとのことでした。

siokoshousiokoshou 2007/08/24 12:47 おぉ!生情報に感激です。

NyaRuRuNyaRuRu 2007/11/20 05:17 >Expression Tree の件
RTM 版で直感通りの結果を返すように変更されているのを確認しました.

siokoshousiokoshou 2007/11/20 13:21 はや!

2007/8/19 (日)

[] アクセス修飾子  アクセス修飾子を含むブックマーク  アクセス修飾子のブックマークコメント

トップレベルの型のアクセス修飾子は C# の public は IL でも public。C# の internal が IL では private なだけだった。入れ子の型はいろんなのがあるけど。わかってしまえば、なんだそれだけかという例。

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

2007/8/18 (土)

[] β2 での anonymous type  β2 での anonymous typeを含むブックマーク  β2 での anonymous typeのブックマークコメント

以前からちょこちょこ書いてきたようにβ2で匿名型が「不変な型」に変わりました。いったん生成したらもう値は変更できません。どう変わったか、最小のコードを書いて、Release でのコンパイル結果を ILdasm で見てみました。

class Program
{
  static void Main()
  {
    var n = new { Name = "A", Age = 20 };
  }
}

まずは Main の IL から。

.method private hidebysig static void  Main() cil managed
{
  .entrypoint
  // Code size       14 (0xe)
  .maxstack  8
  IL_0000:  ldstr      "A"
  IL_0005:  ldc.i4.s   20
  IL_0007:  newobj     instance void class '<>f__AnonymousType0`2'<string,int32>::.ctor(!0,
                                                                                        !1)
  IL_000c:  pop
  IL_000d:  ret
} // end of method Program::Main

「<>f__AnonymousType0`2」がこの型の仮名のようです。ジェネリックとして生成されてます。以前と違って string と int を引数に取るコンストラクタ一発で生成に変わったようです。

次に全体構成、ツリーのダンプ。

___[MOD] C:\Documents and Settings\Administrator\My Documents\Visual Studio 2008\Projects\AnonyTypeTest\AnonyTypeTest\bin\Release\AnonyTypeTest.exe
   |      M A N I F E S T
   |     <>f__AnonymousType0`2<'<Name>j__TPar','<Age>j__TPar'>
   |   |     .class private auto ansi sealed beforefieldinit 
   |   |     .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor() = ( 01 00 00 00 )  ...
   |   |     .custom instance void [mscorlib]System.Diagnostics.DebuggerDisplayAttribute::.ctor(string) = ( 01 00 1F 5C 7B 20 4E 61 6D 65 20 3D 20 7B 4E 61   // ...\{ Name = {Na ...
   |   |___[FLD] field <Age>i__Field : private initonly !1
   |   |___[FLD] field <Name>i__Field : private initonly !0
   |   |     method .ctor : void(!'<Name>j__TPar',!'<Age>j__TPar')
   |   |___[MET] method Equals : bool(object)
   |   |___[MET] method GetHashCode : int32()
   |   |___[MET] method ToString : string()
   |   |     method get_Age : !'<Age>j__TPar'()
   |   |     method get_Name : !'<Name>j__TPar'()
   |   |___[PTY] prop Age : instance !1()
   |   |___[PTY] prop Name : instance !0()
   |
   |___[CLS] Program
   |   |     .class private auto ansi beforefieldinit 
   |   |___[MET] method .ctor : void()
   |   |___[STM] method Main : void()
   |

ちょっと汚くて見づらいかもしれませんが、生情報ということで…。

「<>f__AnonymousType0`2<'<Name>j__TPar','<Age>j__TPar'>」の下にずらずらといろいろ生成されています。本文がたった1行のコードなのにこんなに! C#2.0以降、コード生成がお好きなようです。

詳しく見ていきます。まずは「.class private auto ansi sealed beforefieldinit」。private !?また無理やりな新しいルールを導入したようですね…。匿名型の型のスコープは一つのメソッドなので、これを private としたのでしょう。つまり、ほかのメソッドにある匿名型は見えないってことです。渡すこともできません。訂正:渡せます。渡せば見えます。ちょっとハンドリングが素直じゃないだけで。渡せないかも?よくわかりません…。

そして、sealed することで継承できなくしています。これは不変にするため。

フィールドには見慣れない initonly なんてのがついています。徹底して不変にしてます。

コンストラクタは Main で呼んでいたもの一つのみ。他の形式はなし。不変なのでこれは当然です。

プロパティは get だけで、set はありません。不変です。

ほかに3つのメソッドがあります。bool Equals( object )、GetHashCode、ToString()。なんと GetHashCode が自動的に生成されています!

Equals メソッドでは型チェック後、フィールドの値それぞれを System.Collections.Generic.EqualityComparer<T> で比較しています。フツーです。

ここまで自動でやっといて IEquatable<T> の bool Equals( T ) は生成しないんですね。ガッカリ…。と思ったけど、よく考えてみたら as が一つ入るかどうかの違いしかないのか。anonymous type って名前なのに class しか生成しないから、これは気にするほどのことではないのかも。

しかし、== 演算子と != 演算子のオーバーロードはしていません。Equals() と演算子 == のオーバーロードに関するガイドラインでは、不変な型の == 演算子のオーバーロードは有効とあるのに。代表的な不変な型の string と違うってのはどうなのよ?

これはつまり、

using System;

class Program
{
  static void Main()
  {
    var n  = new { Name = "A", Age = 20 };
    var n2 = new { Name = "A", Age = 20 };

    Console.WriteLine( n == n2 );
    Console.WriteLine( n.Equals( n2 ) );
    Console.ReadKey();
  }
}

の結果が False, True ということです。う〜ん。

ちなみに、この n と n2 は同じ型のプロパティを同じ順で持っているので、同じ型とみなしてくれます。

ToString はきちんと StringBuilder を使って、こんなのを作ります。

{ Name = A, Age = 20 }

で、最後に GetHashCode。どんな型にでも対応できるそれなりのハッシュ値を作ることができるの?ってのがよくわかりませんが、なんだかそれっぽい値を作り出すようです。こんな。

( 2097581262 * 2773833001 + Name.GetHashCode() ) * 2773833001 + Age.GetHashCode()

これが良いのか悪いのかさっぱりわかりませんが、匿名型だけ自動的に GetHashCode 書いてくれていいなぁ。2008の次のバージョンではほかの型向けにも同様のサポートが入るかもしれません。


ところで、ジェネリックとして生成されるのはコード爆発を抑えるためかと思ったけど、{ Name = "A", City = "B" }と{ City = "B", Name = "A" }としてもそれぞれ別の型としてコードが生成されました。== で比較しようとすると「型が違う」ってコンパイラに怒られました。そうか違うのか。Equals での比較も当然 False です。

ちなみに、{ Name = "A", City = "B", } のように最後の「,」はあってもOKでした。

var n4 = new { n.Name, n.Age };

こんなふうにプロパティ名を省略して書くと、自動でつけてくれたりもします。それぞれ、Name、Age の名前を勝手につけてくれます。つまり、この場合は n と同じ型になります。

気になるところは == のオーバーロードがないってところかな。

nsharpnsharp 2007/08/18 15:30 匿名型のコード生成は、VBと比較してみるとまたおもしろいかもしれません。
VBの方はデフォルトmutable、「Key」とつけたフィールドだけreadonlyになって、Equals・GetHashCodeの挙動も変わったり、などなど。

  Dim n = New With { Key .Name = ”A”, .Age = 20 }

siokoshousiokoshou 2007/08/18 16:25 えぇぇ、それぞれで違うんですか!むぅ。でも、VBよくわからないんですよね…。IL見てみます。

siokoshousiokoshou 2007/08/18 20:51 VBだと IEquatable<T> の Equals( T obj ) が自動生成されてますねぇ。ズルイ。

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

2007/8/8 (水)

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

HTMLを機械的に処理したいことがときどきあるんだけど、そのHTMLが壊れたHTMLだと扱いが大変です。ネスケIEが壊れたHTMLをがんばって表示してくれたおかげで、世の中のHTMLは壊れてることが普通によくあります。まったく余計なことを…。

そこで壊れたHTMLを修正してくれるソフトが Tidy です。XHTMLにしたり、XMLにしたりもできます。

機械処理のためではなく、自分のサイトのHTMLをXHTMLに変換する、または文法エラーをチェックするソフトとしても有効です。

ShiftJISも通ります。EUCは不明。rawで通るのかな?

派生ソフトが山ほどありますが、今回は Windows でこちらを使ってみました。

XHTML化するのに使った設定ファイルはこちらを使わせてもらいました。

XHTMLに変換したら、あとは XSLT なりなんなりでどうぞ。XSLT で今回参考にしたところをまとめておきます(つまり自分メモ)。

XSLTは関数型言語風ですよね。それにしても、使いづらい。XMLで書くのがうざすぎ。そのうち LINQ to XML してみたいけど、夏バテ気味でメンドー。

p-nixp-nix 2007/08/09 00:29 >XSLTは関数型言語風ですよね
ですよね、ですよね。昔から何となくXSLTを書く時に違和感を感じていて、もしかしてこれは関数型言語的なのでは、とずっと思ってました。
わーい、同じ考えの人がいてうれしいです。
ちなみに私はHTML→XHTMLの変換はDreamweaverをつかっているへたれです。。
もちろんTidyも使ったことありますが、周りがついてこれず、浮いてしまい、孤立して結局やめる、という、、
グチですね。失礼しました。

siokoshousiokoshou 2007/08/09 08:34 パズルっぽさが関数型言語ですよねぇ。

NyaRuRuNyaRuRu 2007/08/09 11:30 XPath 1.0 はアレなのでどうでもいいとして,XPath 2.0 や XQuery は Python や LINQ を見た後だとなかなか面白く読めますよ.
もっともまあ,出てくるのが遅すぎたというか,今なら「どうしても必要なら LINQ から自動生成すればいいんじゃね?」という気もしますけど.

NyaRuRuNyaRuRu 2007/08/09 13:28 あるいは最強にして一強の JavaScript で同じことできるなら別にいいじゃんとか.< XQuery
JavaScript 1.7 に yield 入りましたし,LINQ っぽいことはもうできるんじゃないですかねぇ.
Volta/Tesla 時代は文字通り雲をつかむ話なのでよくわからんですが.

siokoshousiokoshou 2007/08/09 19:18 > XPath 2.0 や XQuery
ぐぐってちらっと見てみたら、シーケンスとかフィルターとか、関数型ですねぇw
> JavaScript 1.7 に yield
IEがサポートするのがいつになるのやら…
> Volta/Tesla 時代は文字通り雲をつかむ
うまい!w 座布団一枚!

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

2007/8/3 (金)

[] LINQ IQueryable provider を作る方法  LINQ IQueryable provider を作る方法を含むブックマーク  LINQ IQueryable provider を作る方法のブックマークコメント

http://blogs.msdn.com/mattwar/default.aspx

IQueryableを実装して LINQ to hoge を作る方法が連載されています。インタプリタパターンでミニ言語を作る方法そのものなので、あまりお目にかかれないVisitorパターンとインタプリタパターンの解説としてもよいかと。

実際にIQueryableを拡張することなんかなさそうだけど、おもしろそう。すでに効率的な検索処理を持っているシステムやら、サーバーやらにLINQでクエリーを投げたいってときは拡張するべきですね。LINQ to LDAPとか、ぐぐれば出てきます。ほかにどんな場面で拡張したほうがいいのやら。思いつきませぬ。

NyaRuRuNyaRuRu 2007/08/04 02:19 >Visitorパターン
MetaLinq を使って,ツリー要素へのマッチと書き換え自体を LINQ で書くという技もあります.
http://blog.magenic.com/blogs/aarone/archive/2007/05/24/Announcing-MetaLinq-_2D00_-Linq-to-Expressions.aspx
http://www.codeplex.com/metalinq

以前うちの日記で書いた LINQ to DesktopSearch も MetaLinq でさくっと書き直せそうでした.他には F# でパターンマッチですかね.

あと,ExpressionTree Visualizer は案の定というか存在します.最近はサンプルに同梱されてますね.
Orcas beta2 だと以下の場所です.
C:¥Program Files¥Microsoft Visual Studio 9.0¥Samples¥1033¥CSharpSamples.zip¥LinqSamples¥ExpressionTreeVisualizer

NyaRuRuNyaRuRu 2007/08/04 02:22 あー,ExpressionTree Visualizer はよく見たらコメントで既に指摘がありましたね.

siokoshousiokoshou 2007/08/04 20:53 おぉ、既にそんなものがあるんですか!LINQ関連はどこまでもディープに突き進んで行きますねw 今、見ようとしたら一時的に表示されないようなので、後で見てみます。
ExpressionTree VisualizerでExpressionTree遊び中です。ちょっと木が深くて見づらいけど、おもしろいですねぇ。

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

2007/8/1 (水)

[] LINQ to SQL Debug Visualizer  LINQ to SQL Debug Visualizerを含むブックマーク  LINQ to SQL Debug Visualizerのブックマークコメント

おなじみスコットガさんのblogから。この人は本当にマネージャなんだろうか。

http://weblogs.asp.net/scottgu/archive/2007/07/31/linq-to-sql-debug-visualizer.aspx

LINQ to SQLはC#の中の言語内DSL(ミニ言語)なので、どういうSQLを発行するのか?ってのが最大の関心事だと思います。そこでこれを使ってSQLを確認というわけですね。その場でSQL発行できるVisualizerってのはおもしろい。Visualizerでそんなことまでできるんですね。

この機能、VisualStudioに標準で入れないんだろうか。後で試す、かもしれない。

ところでExpressionTree Visualizerはないんでしょうか?ExpressionTreeで遊んでいるんですが、いろいろと謎が多くて…。ちょこっとコードを変えただけで全然違うILが生成されるんで、追いかけるのが大変だったり…。このところ、ラムダ式やExpressionTreeの最適化あたりに興味津々です。

dotnetmemodotnetmemo 2007/08/02 07:14 はじめまして。
Expression TreeのVisualizerはOrcasのサンプルについているようです。
C:¥Program Files¥Microsoft Visual Studio 9.0¥Samples¥1033¥CSharpSamples¥LinqSamples¥ExpressionTreeVisualizer

siokoshousiokoshou 2007/08/02 08:58 おぉぉぉぉ!ありがとうございます!試してみます。

トラックバック - http://d.hatena.ne.jp/siokoshou/20070801
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 |
Connection: close