kagamihogeの日記

kagamihogeの日記です。

わんくま同盟 東京勉強会 #23 - C# Day

8/9 に わんくま同盟 東京勉強会 #23 C# Day遊び参加してきました。

わんくま同盟とは、基本的に MS テクノロジー文化圏な人々の集いらしいです。そんなことすら知らずに IT 勉強会カレンダーみてなんとなく参加してきました。当然、UST の IRC のチャット欄が知らない ID ばかりでちょっとビビったり。

#23 と会重ねてることもあってか、時間のメリハリとか準備とか受付とかしっかりしてる印象を受けた。強いて悪い点言うなら昼飯の時間がちょっと短すぎかな、と。アレはアレで潔い気もするが、ちと急ぎ足な印象が……w

以下、各トークセッションの内容について。自分の所感・意見と発表者の発言やプレゼン資料の内容ごちゃ混ぜに書くので読みにくい点が多々あると思います。日本語崩壊してる部分も多々です。自分用の備忘録的な意味合いの強いエントリなのでご勘弁です。

わんくまについて等

配布資料の関連コミュニティ紹介のカラープリントがすごい。「きっとあなたにピッタリのコミュニティがあります。」とコミュニティ名が 40 個ぐらい並んでるけど、知ってるコミュニティが無い……アウェーだなぁw

UST の IRC の発言チャットログがプロジェクターに流れるのが面白い。感覚としてはニコ動みたいな感じ。MISAO っていうソフトウェアらしい。IRC 上で質問などするとその内容がプロジェクターに流れていくので、発表者の中にはそれを受けてネット越しで色々やり取りしている様は見ていて面白かった。

MVP for VB が語る C# 入門

発表者は、プログラミングのエントリーが Z80 -> 6809 とかな古強者な方。彼は色んな言語渡り歩いてるんだけど、全部羅列するのもアレなんで代表的なとこを抜き出すと Fortran -> COBOL -> C とか。そんな人が語る VB からみた C# の話。

で、そんな彼の VC# の第一印象。初期自動生成コードがなんか多いね、って印象。VB 屋から見るとなんか最初に生成されるコードが多いね、って感じだそうで。VB だと using はプロパティとして設定んなかに隠してる、とか違いが色々あるようだ。

イベントプロシージャの定義。これもまた VB と違う点に驚いた、と。VB はかなり VS の支援(GUI のコントロールを D&D で画面に貼り付けるアレとか、ドロップダウンリストでイベント選んだりするアレとか)が、VC# よりも充実してる印象。どうやら VisualStudio 上のインタフェースは VC# と VB.NET で統一されてないみたい。うーん……Flex Builder がもちょっと使いやすくなったらなー……とか俺は思ってましたw

C# だと自動生成コードと自分で書いたコードのギャップ問題が解決されてない部分がまだ結構多いっぽい。デザイン画面とコード画面のどっちかで自動生成コードを消した場合、自力で対応する片方のコードも消してあげないといけない。これは、ちょっと泥臭い感じだなー。

まぁでも使い慣れてない環境だとギャップ感じるのはある意味当たり前っちゃ当たり前でもあるからなぁ……

戸惑った点まとめ

  • フォーマット - 括弧で一行インデントしてくれやがる。勝手に↓みたいなインデントになるのがイヤだーって話。


public void hogehoge()
{
...
}

  • イベントプロシージャとイベントの関連付け - どっから関連付けやるのか、VB と違ってちょっと直感的じゃなくない?
  • プロパティの指定や代入文 - 大文字小文字を区別しないとインテリセンスきかないのがイヤだなーって話。
  • 行の終わりは ;(セミコロン) - 一行で終わる行のほうが多いんだから別にいらなくね?と。まぁ VB の _(アンダースコア) もあれだけどさーって話。

あと、VisualStudio 標準添付のサンプルが C# のスタートアップには役に立ったそうです。

次に、SQL Server を使ってみた感想などに発表内容は移る。

SqlConnection cn = new SqlConnection(); でコネクションが貼れる。……というのはどうでもよくて、VB 屋さん的には () つけないとコンパイルエラーになるのに戸惑った、と。() とか {} の有無がどのへんなのか迷うことが多かったみたい。

VB 屋さんでも C# には戸惑うつーか VisualStudio の扱いに戸惑ってる印象なのかな?

ADO.NET の使い方は VBC# もおんなじなので、VB でやってたやり方をほぼ流用できたため、そこは楽だったとかなんとか。ライブラリ覚えれば流用利くのが .NET 系の良いところか。まぁ、俺は ADO.NET のお作法はぜんぜん知らないけどw

次に、Web アプリを作ってみた感想などに発表内容は移る。

まず、DB は外から見えないネットワークに置かないと危険だよね、って話。仰るとおりで、アクセス権とかユーザとかちゃんと設定しないとホントはまずいんだけど、結構テキトーに済ましてること多いからなぁ……

同じプロジェクト内でも、ディレクトリ(?)を分けてアセンブリとして扱えば、VBC# も区別なく互いに呼べる。このマルチ言語具合は .NET Framework の恩恵受けられる部分だねー。

.NET にも twitter API あるんだ? ってか MS 界隈な人たちも twitter やってるんだねw

C# の現在・過去・未来

C#Ecma および ISO , 日本だと JIS で標準化されている。C# はアンダース・ヘルスバーグ(Delphi の中の人)が中心になって作った、と。

まずはオブジェクト指向言語 C++ の成り立ち。いろんな言語のいろんな要素を取り入れて作られてる歴史の話。

で、Java の厳密な名前空間VB の GC、 Object Pascal からプロパティ・デリゲート、を取り込み、C++ のヤなところだったポインタの隔離とかをしたのが C#

C# -> C# 2.0 で更に色々追加。Ada からジェネリック。ほかに、反復子、匿名メソッド、partial class を追加した。

そして 3.0。言語機能にあきたらず、パラダイムや概念の取り込みが始まった。関数型言語や宣言型の方式、AOP 、LL の簡便さなど。具体的には、ラムダ式、クエリ式(SQL 式みたいなののこと)、拡張メソッド、暗黙型変換・匿名型とかとか。

で、4.0。パラレル(これなんだろ?) モデル駆動、Silverlight2 とか。さすがに俺にはこの辺はちょっと未来派過ぎてちょっとついていけなかったw

MS 社内としてもメモリのオーバーランとかバッファオーバーフローとか悩んでるらしい。なので C# 使おうね、みたいな流れがあるらしい。

ジェネリックJava のあれってなんちゃってジェネリックぽいよなぁ、やっぱり。なんかモノがぜんぜん違う気がする。あとで復習しとかないと……

反復子と yield。うーん…… Ruby と比べるとちょっとやり方キモいような感じ。

partial - トークセッション中では「言語またいで partial できたら便利だよねー。可能だろうけどどうなんだろうね」なんて意見がw

nullable - null を許容する int の宣言。null 結合演算子。nullだったら -1 を代入とか。null の例外防ぐのに便利なのかな?

匿名メソッド - ちょっとしたイベントハンドラを簡易に記述するのに便利だよね、こういうの。

ここから C# 3.0 の話。

暗黙に片付けされたローカル変数 - var ってか要は型推論? いやよくわかってないですすいませんw 「var がない言語が許されるのは小学生までだよねー」とか言ってました。

ラムダ式 - この辺まだよくわかってないんだよなぁ。関数型由来の概念は今ひとつよくわかってないからなぁ……ちょっと補強しないと。

自動実装プロパティ - AS にもあるあれだよね。

partial メソッド - Java でいう所の interface の簡易版みたいな感じ? ただし、実装しなくてもコンパイルエラーにならない。呼んでも何もしないんだとさ。なので、partial void までがひとつの宣言とかなんとか。

パラレル Linq ・パラレル For - まったくわからんw

データアクセス - なんかいろいろ紆余曲折してんなーてことだけは理解した。

Windows アプリケーション - Windows Forms から WPF に移行とか。

Web アプリケーション - ASP.NET とか Silverlight 1.0 -> 2.0 とか。

まとめ。

ホント、C# って色んな技術・概念取り込んでるなーって印象なんだけど、たいていの人は同じ感覚のようだ。お昼ご飯一緒に食べた人に C# のカオス具合についてちょっと聞いてみた感じでは、C#1.0 はともかく、3.0 の機能ぜんぶ使いこなすような人はほとんどいないだろうなーって話をしてた。

LT

LT って 5 分一本勝負の熱き戦いらしい。5 分がスタンダードだったのか……

値型と参照型を考える 型のボックス化

C# のボクシングの話。値と参照型を相互変換勝手にやってくれるよ的な話。IRC のコメントログに「完全 OOP 言語使えばいいと思うよ」ってのが出てたけどちょっと無粋じゃないかなーとか思いましたw

発表者のデモアプリを実際に試してみるところまでいかなかった。LT の時間配分ってかなり難しいなー。まぁ LT はやってみるのが大切だし、その制限で如何に見せるか、ってところも魅力だろうなんだろうね。

デモアプリでは、いろいろ試してみると意外な結果になる、ってこと示したかったんだと思う。Java のボクシングもハマり所あるからねぇ。

iPhone のプログラミング

スマートフォン? いいえ、ポータブル Mac です……だそうですw

iPhone SDK とシミュレータ(傾きとかも再現できる)が存在する、などなどの話。

言語は Objective-C 2.0 - C 言語にオブジェクト指向足したようなもの。

アプリケーション公開には iPhone Developer Program とやらに参加する必要がある。色んなとこの blog とかで言われてるようにちと NDA な部分がきついみたいね。

匿名 delegate 内のローカル変数

LT の内容とは関係なく、delegate ってああいう風に使うんだーとか思ってた俺 Java 屋。匿名 delegate 内のローカル変数はヒープに取られるから気をつけないといけないよ、って話。

GZIP ファイルや ZIP ファイルを自分で作ろう

Microsoft MVP を再受賞したら MVP 向けの長期貸与プログラムとして XBOX360 が送られてきて遊んでしまったらしい。MS スゲーw

Deflate っていう API で ZIP 圧縮できんじゃね? と思いきやそうでもないらしい。んで、DeflateStream ってのは ZIP の圧縮部分の Stream ってだけらしい。なので、ヘッダとか足りない部分つければ ZIP 書庫作れんじゃね? ってのが今回のセッションのきっかけなんだそうで。

Deflate とは PKZIP のバージョン 2 移行で使われているデータ圧縮アルゴリズム。ZIP や gzip などで使われてる。パテントフリーなのが特徴。

tar とはその名のとーりテープに保存するために複数のファイルを連結したもの。だから tar で連結したあと GNU zip を使用して圧縮する、つまり *.tar.gz なわけで。アレってそういう意味だったのか……初めて知ったわ……

tar 形式の解説。詳しいとこは書くとキリが無いので省略。ヘッダ情報とかは仕様通りとしか言えないからなぁ。ヘッダーがこうで、中身はこうでーとかの表見てると FAT 実装してたころ思い出す。

zip 形式の解説。ここも詳しいとこは書くとキリが無いので省略。余談で Java は標準ライブラリでサポートしてます、とか。

zip は、なんでこんなパラメータになってんだ? みたいな部分がちょくちょくある、って話。前世紀の遺物みたいなところもあるから、今見るとキモく見える部分多いんだよねぇ、こういうのって。FAT も今となってはそうだし……

日付と時刻は FAT と同じ方式。1980 年からの数え上げするアレです。Y2K ŠÔˆá‚Á‚½2000”N‘΍ô æ‰„‚΂µ‚Í‘Ê–Ú を思い出した。

これのコードは見ても確かに分かり辛いだろうなぁ。FAT 書いてたときもそうだったけど、コレ系って、基本的に仕様通りゴリゴリ書いてくだけだし……

まとめ。

GZipStream , DeflateStream を使用して tar.gz, zip を作ることは可能。ただし、圧縮率を指定することはできない。発表者の所感として、どちらかと言えば圧縮よりも解凍に特化したほうがいいかもなぁ、って印象だった模様。

C# 登場前夜

Java の話をナシにして C# 語れないと思うんで、まずそっから、とか。

1990 〜 に GUI の OS が出てきて、Java のタネが出てきた。んで、Sun が色んな企業とライセンスを交わす。Write once, run anyware の始まり始まり。ファイルシステム周り、画面周りは確かにメーカー間で VM 互換ないけど、ほかの部分はまぁそこそこ Write once, run anyware ……だと思う。

Java はクラスファイルをクライアントからサーバーに持ってくだけでおおよそ動くようになってきてはいる。開発マシンとサーバで OS が異なる、ってのは Java ではフツー。まぁソレが完全に機能しているかと言われればまぁビミョーなとこもいくつかあるんだけどもw

Java と Microsoft のビミョーな関係。1996/1 に MS は他社に先駆けて JIT コンパイラ搭載した VM 公開したりと意外?と積極的に Java に取り組んでいたようだ。

1997/10 に Sun が MS をライセンス違反で提訴! MS の VJ++ は Windows 上では便利な代物提供しちゃったけど Write once, run anyware やぶってるじゃーん、と。具体的に言うと JDK 1.1 の互換テストをパスしなかったんだとか。

で、MS は何をしたかというと。独自の拡張として delegate キーワードなんてものを入れた。型システムを複雑にしたり、自由度が低いとか、内部クラスよりも取り立てて便利とも言えない、とか言われてたんだとか。この辺色々ドロドロしたことがあったんだろうなぁ……

他の MS の独自拡張としてコンパイラ指令。 @dll, @com とか。どんなものかは推してしるべし。

裁判の結果、JDK1.1 までで MS へのライセンス停止→ MS は独自に Java の代わりになる言語を作成しなければ…という流れで生まれたのが C#IRC で「お前の Java は俺の Java, 俺の Java は J#」ってコメントがなんか受けたw

マイクロソフト独禁法事件/Java契約事件 ってのがよくまとまってるらしい。読むの大変らしいけど。

第二部:Java 屋からみた C#

C#Java よりちょっと低級化したかな? って印象。Scala はより抽象度高めた印象。

Java のプリミティブ型の部分引き継いだり、ネイティブなコードへの連携を強化。MS ってバイナリ好きだよねーとかなんとか。IRC のコメントによると「その中途半端さが C# の魅力」らしいw windows 抱えてる MS と Sun とでは思惑は別なんだろうねぇ。

C#Java の機能比較がいつのまにやら別にどっちもそうかわんなくね? 乗り換える理由としてはそんなに強い理由がないよなぁ、みたいな話に……w 傍で聞いてる分には非常に面白かった。

Java 屋さんから見た C# は概ねああいう印象に落ち着くんじゃないですかね?

後は細かいネタがいろいろ。IDE が一社独占ってどうよ? とか、MS な人たちは Java 2.0 の時代で話すけど JavaJ2SE 5.0 になってからはだいぶマシになったよね、とか。VM の駆動方式。インタープリタ -> JIT -> JDK 1.3 から HotSpot になったとか。

要は C# は MS というか windows の都合のいい言語にしたいってことみたい。で、都合のいいように J++ 作ったら怒られちゃった、と。そんなことしたら OS 依存するだろ、って Sun に怒られたカタチなんだけど、MS 的にはそれでよかったんだろうなぁ……

こうしてみると、ホント Java は 5.0 から載った機能多いよなぁ……

演算子のオーバーロードの話。immutable なオブジェクトの比較はシンプルにやりたいな、と思うときはある(equals ダルいよね、とかそんな感じ)。その場の余談として、Java から .NET 行った人間の書いたコードはすぐわかるんだとかw == 多用すると Java 屋さんは読めないだろうねーとか、そういう話。

Java って開発環境整備するのがちょっと面倒だよね、って話も。確かに、ディストリみたいなのがあればなーっとは俺も思う。最近の Eclipse は色々と配布形態用意してるけど、結局色々プラグイン入れないといけないからまだまだメンドウ感は……

ちなみに IRC のコメの流れがものすごい速いセッションでした。やっぱみんなこのテの話題大好きなんだなぁ……w

今さらですが Collections について復習してみた。C# を一から勉強したくなりました。

Microsoft MVC for C# 受賞したんでやっぱり XBOX360 届いてた、っていう画像がなんとも……w


まず、配列の書き方の復習。ここらへんは C#Java は似通ってる。配列境界越えると例外も出るし。けど、VB はちょっと違って from,to を指定するから、VBC# 併用者は戸惑うところだとか。

んで、生の配列だと要素数変えられなかったり(realloc みたいなことやろうと思えば手段はほかにもあるけど)と不便なのでコレクション - System.Collections の出番。

ArrayList(可変長配列), HashTable(連想配列) とかとか。sort, search もメソッドとして用意されてる。てか用意されてないとイヤだわなw

ArrayList は要素として何でも入ってしまうんで、ジェネリックコレクション-System.Collections.Generic の出番。文法は IList int2 = new List{8,9,..} な感じ。

Java も似たような文法とはいえ .NET 2.0,C#2.0 から導入されたジェネリックJava のそれとちょっと違う感じが…… ↑の List の例みたく型制約とかの部分は同じっぽいけど。

IEnumerable って口に出すと読みにくいよねw

コレクション周りで count, size, length どれー? って問題。MS もハマってるようだ。Java もゴチャゴチャになってるからなぁ。

clone() - deep copyshallow copy の違いはおさえとかないと混乱するとこだよね。っていうか deep copy をキッチリやるのは結構面倒。IRC のコメでは「循環参照してるとかなりイヤらしいよね」「いったんシリアライズするのが単純」なんてのも。

Array.ForEach は C# にもあるって話。ActionScript さわったときに各要素に対して処理を実行するコレの機能って便利だなーと思いました。

Hashtable は指定した key がないと null 返すけど、Dictionary は例外返す。ちょっとキモいなw

パネルディスカッション - C#VB どっちが凄い?

ここは雰囲気を楽しむものだったところが多いと思うので省略。




最初は、俺は C# 門外漢だからどうだろうなーと思ったけどフツーに面白い内容のセッションが多かったです。今回は C# day というお題で、メチャクチャ突っ込んだ内容のセッションじゃなかったんで、タイミング良かった感じかなー。懇親会も色々面白い話聞けて楽しかったし。ちょっと違う分野の勉強会に参加するのはアリだなー。

また機会あれば、わんくまの方々よろしくお願いします。