2013年12月16日月曜日

第3回LINQ勉強会に行ってきました(落穂拾い)

VSハッカソン倶楽部の第3回 LINQ勉強会に参加してきました。

参加者のnaichi (@naichilab)さんが下記blogにそつなくまとめられていますので発表者の方々の当日のプレゼンに興味のある方におかれましては、ぜひこちらをご覧ください。
http://naichilab.blogspot.jp/2013/12/clinqlinq.html

以下では、プレゼンの本題から外れた部分や、自分の感想を交えて好き勝手にまとめました(誰得)。



森麟(@moririring)さん

発表内容に関して

LINQ勉強会発足の経緯 ~ 今までのLINQ勉強会の内容、とこれまでのダイジェスト版とも言えるプレゼンでした。なお、ダイジェスト版と書いてしまいましたが、かなり情報量がありこれだけでも色々と勉強になりました。

ドラマや映画で言うところの「今までのあらすじ」といったところでしょうか。この森麟さんのプレゼンのおかげで、勉強会の方向性や流れがなんとなくつかめ、後の話にスムーズに付いていけました。

あらすじ、大事やなと思いました。いや、マジで。自分はふだん書類を書くとき、前置き部分は結構ざっくり書いてしまう癖があるのですが、これからはしっかりめに書くよう気をつけたいと思いました。閑話休題。



落穂拾い

紹介された過去のLINQ勉強会での発表の中で、気になったもの。

第2回 LINQ勉強会での よね (@yone64)さんの「超LINQ入門

Project Euler (プログラミングで数学の問題を解くプロジェクト)の問題を、LINQを使って解く』といった内容だったようです。理解を深めるため、ハンズオンで、LINQで問題を解いた後、解くのに用いたLINQの各メソッドを、フルスクラッチで実装してみたとか。

このへん、記憶が曖昧なので間違ってるかもしれません。(公開されているスライドからはそういう流れだったのか判別できませんでした) ともあれ、既に用意されたメソッドを、フルスクラッチで書いて理解を深めるという勉強の仕方はいいなぁと。



青柳 臣一(@ShinichiAoyagi)さん

発表内容に関して

まずは、LINQの概要について。
LINQが、各種データソース「など」を統一的な記述で扱える技術であること。
大きく分けて、LINQが扱うものは以下の3つであること。


  • IEnumerable (Object)
    • コンパイル時、for, foreachに展開される
  • IQueryable (各種データベースなど)
    • コンパイル時、ラムダ式から<Expression>に変換される
  • IObservable (ReactiveExtensions;通称Rx)

これらのうち、IEnumerableを扱うLINQの1具体例として、LINQ to XMLライブラリを紹介されていました。LINQ to XMLについて詳しくは、naichiさんのblogにまとめられている通りです。



落穂拾い

あいまあいまに、VB.NETでの記載方法について解説があったのですが「最近の(?)VB.NETのやっつけ感パない」でした。なんか手当たり次第取り込んだ感があって素敵ですね。(褒めてない)

個人的に話を聞いて衝撃を受けた仕様は、


  • XMLをコード内に直書きしてDim変数に代入可能

(てか、もっとあった気がしたのですが、改めて振り返ったら、衝撃を受けた仕様はこれだけでした。)

理路整然としたC#に比べ、VB.NETがなんでこんなキメラな言語拡張がなされているのか素人目には理解できません。



よね(@yone64)さん

発表内容に関して

IQueryable を扱うLINQの実装についての解説とともに、具体例として、ATND APIを用いてIQueryableな感じのProviderを自分で実装してみるという話でした。詳しくは、naichiさんのblogにまとめられている通りです。

言語Parser丸々1つ作ってるに等しいじゃないですか、ヤダー。(実装にかかる労力ハンパない感じが)

ふざけた感想はさておき、深く掘り下げられた話のおかげで、クエリ構文とメソッド構文がなぜ非対称になっているのか、なぜLINQtoSQLは実行不可能なクエリが生成されるのか、といった点について分かった(気になれて)良かったです。

そういえば、@nueeccさんが
と、disられていたのが印象的でした。

業務上必要にならなければ使いたくないなとは思います。
(マーフィーの法則的には、こういうこと言ったりすると、
 業務上、必要に迫られて書くことになったりするんでしょうか。
 …
 そんなの最悪だ。)



落穂拾い

今まで、ラムダ式をvarで受けれない理由を知らなかった(調べなかった)ので、「なんか気持ち悪い」というモヤモヤ感があったのですが、 Expressionの説明を聞いているうちに、<Func>か<Expression>かを判別できないからなのかと、勝手に納得してスッキリしました。(いや、実際のところどうなのか調べてないのですが…、自己完結できたのでいいかなぁと)

最近のILSpyは、かなり優秀になってて、ILからC#のコードを復元しすぎるというのは怖いですね。たまにはデコンパイラの性能はチェックしておかないとですね。


河合宣文(@neuecc)さん

発表内容に関して

@yone64さんのIQueryable とはまた違った感じで、IEnumerable について深く掘り下げた内容の発表でした。
論理的にきちっと体系立ててLINQを理解されているのがよく分かるスライド&発表で、聞いていて気持ちよかったです。
@neueccさんのblogを読んでいたり、ライブラリ(ChainingAssertion)を使っていたりして、その内容からきっと凄い人だろうとは思っていたのですが、創造よりも遥か上の人で感激でした。いや、凄いとしか言いようがなかったのですが、敢えて言うなら

「もし法曹界にいたら、賠償請求額が数十億を越えるような訴訟案件を担当しそうな人だなぁ」

とか。誰にも分からない例えでごめんなさい。



落穂拾い

『runnning状態ではMoveNextの挙動は未定義なので、ThreadSafeではないけど、Enumerator自体はThreadSafe』という話は、理解できず自分の中ではpending事項でした。ど、どゆこと?2年後くらいには分かる…、ようになりたい。

『LINQは、遅延実行されるため、実行時に引数チェックのタイミングがずれる。これが問題となる場合は、IEnumerable(yield return)の部分を、引数チェックとは別メソッドに分離するとOK。』という話は大変勉強になりました。
公式資料を読むといい実装方法が載ってるよ、って話でもあったのかなぁ。

クエリ構文へのdisりっぷりがハンパなくて、面白かった上、大変ためになりました。
本当にありがとうございました。
「クエリ構文では、intellisense利かないし、使える命令限られてるしで、何もいいことないです!」的な話を聞いて、確かにメソッドチェーンした方が合理的だなと。
不肖ながら、これからはLINQは、メソッド構文onlyで行きたいと思いました。

余談


3つのLINQのうち、Rxについては今回の勉強会では出てきませんでしたが、
Rxの入門には、第2回 LINQ勉強会での @Posauneさんの「LINQ to XXXX」が良さそうだなぁと思いました。

LT について

naichiさんのblogにまとめられている通りです。

(LTも興味深い話が多かったのですが、ここまで書いて力尽きました。すみません…。)



最後になりましたが、半日の間にLINQについて広く深く、いろんな話が聞けて大変有意義でした。
講演者の皆様をはじめ皆々様本当にありがとうございました。