Niigata.NET 2.0を開催しました #ngtnet

Niigata.NET 2.0 | テックトーク&.NET開発お悩み相談室 – Niigata.NET | Doorkeeper

GWの終わりの5/7(土)にNiigata.NETの第2回勉強会を開催しました。

今回は前半は普段のテックトーク、後半は参加者の皆さんから普段の開発で困ったことなどについて、みんなで考えようなお悩み相談室としました。前回は初回ということで遠方よりご参加いただいたりと半ばお祭りでしたが、今回は地元参加者のみでの比較的少人数での会となりました。

テックトーク

考える、プログラミング初級講座 C#編 by @AILight

1つ目のテックトークは、越後が誇るMS MVPである@AILightさんによる、「変数」に絞ったC#入門でした(資料はアップされていないようです)。始めるまえに「時間が読めない」と公言していた通り、1時間半を超える大規模セッションになりましたf(^^;

ポイントを絞って振り返ってみます。

まず、C# ステップアップに大切なこととして次の3つを挙げています。

  1. 言語仕様を学ぶ
  2. ランタイムを学ぶ
  3. 短く書くようにする

C#の言語仕様については、最近はコードネームRoslynこと「.NET Compiler Platform」がオープンに開発が進んでいることもあり、ちょっと追うのが大変です。C# 5.0までくらいなら、VSのインストール先に入っているので、まずこちらで確認して、最新仕様は別途「C# によるプログラミング入門」などのサイトで確認するとよいと思います。

VS2015なら、言語仕様は以下のフォルダーにあります。

C:\Program Files\Microsoft Visual Studio 14.0\VC#\Specifications\1041\CSharp Language Specification.docx

次に変数の使い方として以下の3つを挙げています。

  1. 宣言
  2. 代入
  3. 参照

これらについて、実際の「自分のルール」含めて、変数名やvar使うか問題、多次元/ジャグ配列の宣言と初期化などについて語ってくれました。それらの中で、私も真似しようかなと思ったルールが一つあって、それは「変数名略すな」です。

よくこんなコードを書いてしまいがちです。


var client = new HttpClient();
client.~

ですが、ただの「client」ではもし今後HTTPSクライアントが増えたらどうするのか?といった視点から避けるべきという主張でした。その代わり、


var httpClient = new HttpClient();
client.~

のように、型名をcamelCaseにしたので良いのではということでした。

こんな感じで、「変数」だけでこれでもか、これでもかと大いに語ってくださいました。

テスト駆動開発(TDD) in .NET by @masaru_b_cl

私のセッションです。内容はスライドを参照ください。後日補足を加えて別途エントリにもまとめるつもりです。

私のセッションもデモ入れたりして少し長くなってしまいました。やはり資料をぎりぎりに作成するのはだめです……。

質疑応答は記憶している範囲ではこんな感じでした。

  • DB絡んだテストはどうするのか?
    • SetUp等でDB接続してデータをこしらえてテストしている
    • FastであることよりもIndependentでRepeatableな方が価値が高いので問題なし
  • いわゆる「単体テスト」に流用できないのか?
    • TDDのユニットテストは「開発者テスト」であり、品質保証を目的とするテストとは違うもの
      • 流用できる部分もあるかもしれないがそれほど多くない
    • 品証の単体テストは、単一コンポーネントというよりは各種コンポーネントを組み合わせて「ユースケース」を元に設計する
  • privateなメソッドのテストはやるのか?
    • privateなものはpublicなメソッドを通じて行う
      • privateなものは実装に近すぎて簡単にテストが壊れるため
    • そのためTDDもユースケースを考慮したテストを行う方がよい
    • もしprivateなメソッドをテストしたくなったら、単一責務の原則に従い責務分割のチャンス

 

.NET お悩み相談室

そして、今回のメインだったはずが、テックトークでだいぶ時間が押してしまい、30分くらいしかできませんでした。

出た話題としてはこんな感じだったかと。

  • 現在WinFormsのクラサバアプリを型付DataSet+TableAdapterを使って作っているが、EFにした方がよいのか?
    • MSのリソースはEFに集まっている
    • DataSetのように非接続型アクセスするには、ひと工夫必要
  • .NET関連の最新情報キャッチアップはみんなどうしているのか?
    • 最新情報を追っている人をSNS等でウォッチする
    • MSのドキュメント、チュートリアルを参考に手を動かす

時間がなかったので、正直消化不良気味でした。ぜひリベンジしたい。

 

全体を通じて

今回は参加者が地元の方だけということもあり、比較的おとなしい印象でした。また、TwitterをはじめとしたSNSのアカウントも持っていないような人が大半なのか、#ngtnetのTLは大変寂しいものになってしまいました。

今後に向けては、幹事の@AILightさん、@84taka0310さんとも相談していきますが、講師と生徒のような関係ではなく、もっと参加者の皆さんにガツガツ来てもらえるようなコミュニティにしていくため、何ができるか考えていかなくてはと思いました。地元の中小SIベンダーの一社員といった人に、どうやって動機づけしていくかは、地方コミュニティはどこでも同じ悩みを抱えているかもしれませんね。

 

次回について

少なくとも年2回の開催を目指すため、次回は10月あたりを予定しています。また日取り等決まったら告知します。

広告

過去のバージョンのVisual Studioのライセンスを知る方法

Visual Studioのライセンスについては、Microsoftからライセンス・ホワイトペーパーが公開されています。

Visual StudioとMSDNのライセンス ホワイトペーパー
https://www.microsoft.com/ja-jp/download/details.aspx?id=13350

ただ、こちらからダウンロードできるのは最新バージョン(現時点ではVS2015)のものしかありません。それでは、諸事情で過去のバージョンのライセンスについて知りたい場合はどうすればよいのでしょう?

そんな時は、対象バージョンのCD、DVDメディアをエクスプローラーで開き、ルートにある、「license.htm」ファイルを開けば、おそらく望みのものが得られると思います。実際にメディアがなくとも、MSDNサブスクリプション契約していれば、過去のバージョンのISOファイルがダウンロードできるはずですので、そちらをマウントすればOKです。

DbDataAdapter.DisposeはDbCommandオブジェクトをDisposeしない

大量にDbDataAdapter使うコードで、途中でFillできなくなって調べた結果です。

System.Data.Common.DbDataAdapterにはSystem.Data.IDbDataAdapterインターフェースの実装であるSelect/Insert/Update/DeleteCommandプロパティがあり、これらのプロパティにはSystem.Data.IDbCommand型のオブジェクトの設定/取得が可能です。

そして、DbDataAdapter.Disposeメソッドを呼び出しても、この4つのコマンドオブジェクトはDisposeされず、nullが設定されるだけです。したがって、各プロパティに設定したコマンドオブジェクトは、そのコマンドオブジェクトを生成する側で、明示的にDisposeしてやらないといけません。

[参照]
https://github.com/Microsoft/referencesource/blob/master/System.Data%2FSystem%2FData%2FCommon%2FDbDataAdapter.cs#L236

override protected void Dispose(bool disposing) { // V1.0.3300, MDAC 69629
    if (disposing) { // release mananged objects
        IDbDataAdapter pthis = (IDbDataAdapter) this; // must cast to interface to obtain correct value
        pthis.SelectCommand = null;
        pthis.InsertCommand = null;
        pthis.UpdateCommand = null;
        pthis.DeleteCommand = null;
    }
    // release unmanaged objects
    base.Dispose(disposing); // notify base classes
}

最初、どうしてこうなってるのかなーと思ったのですが、DbDataAdapterはあくまでAdapterであって、Compositionではないからかと納得しました。どういうことかというと、DbDataAdapterへの各コマンドの付け外しは自由自在なので、DbDataAdapterがコマンドオブジェクトの死活管理を行うことはできないんですよね。

ハマりかけてなるほどなぁという話でした。

git | マージのタイミングで毎回gcが発生する際の対処例

gitリポジトリを使った開発中に、何故かマージ動作が起きるタイミングで毎回git gcが実行されてしまう状態になりました。環境は次の通り。


$ git --version
git version 2.6.2.windows.1

マージが発生するコマンド全部(merge、rebase、その他)なので非常にウザいです。で調べてみてもよくわかりません。

そこで試したのが以下の手順

  1. git gc –aggressive
    ガッツリGCやってゴミを減らす
  2. git prune
    自動gcの後に「warning: There are too many unreachable loose objects; run ‘git prune’ to remove them.」と表示されたので実行

これで毎回gcが発生しなくなりました!やったね!

同じ状況になった人は試してみてはいかがでしょうか?

2015年ふりかえり by @masaru_b_cl

今年も残すところあとわずか!ということで、昨年に引き続き1年の活動を振り返ってみようと思います。


1月

ASP.NET Identity連載の第8回掲載

昨年からCodeZineで連載中の「ASP.NET Identity入門」の第8回として、Two factor authentication、いわゆる二要素認証について書いた記事が公開されました。

 

Windows向けの開発環境自動構築スクリプト作成

Git for WindowsやVimなどをWindows環境で自動インストールするスクリプトを作成しました。

masaru-b-cl/create-win-dev-env

ただ、その後Windows向けwgetの公開ページにアクセスできなくなったり、Git for Windows 2.x系が公開されたりと、見直ししないといけないなぁと思っています。


2月

「Visual Studioのコード分析機能を利用してコードの品質を上げよう」掲載

CodeZineで「Visual Studioのコード分析機能を利用してコードの品質を上げよう」が公開されました

CodeZineのPR記事「さらに使いやすく便利になった「Visual Studio」を始めよう!」の一つとして、「Visual Studioのコード分析機能を利用してコードの品質を上げよう」が掲載されました。


3月

ASP.NET Identity連載の第9回、第10回公開

ASP.NET Identity入門 第9回が公開されました

外部アカウント認証についての第9回、ユーザー管理機能についての第10回の記事が公開されました。

 

長岡IT開発者勉強会 第40回「初心者Day!」に参加および発表

長岡IT開発者勉強会 第40回「初心者Day!」で発表してきました #nds40 by @masaru_b_cl

WindowsやOfficeなどの基本的なショートカットキーの紹介などで1セッションしてきました。まさかこのときは、これで今年のNDS参加が最後になるとは思っていませんでした…(すいませんすいませんすいm(ry


4月

ASP.NET Identity連載の第11回公開

ロール(権限)管理およびロールによる機能制限方法についての第11回が公開されました。

 

長岡IT開発者勉強会 第41回「入学おめでとう会」のLTと懇親会だけ参加

第41回 長岡IT開発者勉強会に顔出してきた #nds41

この日のNDSは、ずっとお世話になっていて5月に新潟を去った@neko_gata_sのお見送りも兼ねて、本編には参加できませんでしたが最後に顔出しと無茶振りのLTをやってきました。

なお、LTで話した新人研修の話は、その後実践して概ね良い結果でした。改善点などはまた追々アウトプットしていければと。

 

semver.orgの日本語版のtypoへの修正Pull Request作成

Node.js等で採用されている体系的なプログラムバージョニング規約である、「セマンティック バージョニング」の日本語版を読んでいたところ、軽微な誤りを見つけたので修正Pull Requestを作成しました。

このPRは11月に無事マージされ、現在のWebページは正しい内容で読むことができます。


5月

本業が忙しかったこともあり、特に目立ったアウトプットはありませんでした。


6月

実例に学ぶチーム開発におけるNuGet導入のすすめ 第1回公開

VS PR記事の時に案として出たけれど没になったNuGetに関する記事を、ASP.NET Identity連載の合間に、2回に分けて「実例に学ぶチーム開発におけるNuGet導入のすすめ」として執筆しました。その第1回目「チーム開発でもパッケージ管理を容易に! NuGetを活用してライブラリを効果的に配布しよう」が公開されました。

 

EntityClassGeneratorForOracle公開

テーブル定義に対応したEntityクラスを自動生成するコマンドライン実行ファイルである「EntityClassGenerator for Oracle」を公開しました。

masaru-b-cl/EntityClassGeneratorForOracle

このプログラムの元ネタは、@neueccさんの「Micro-ORMとテーブルのクラス定義自動生成について」です。この記事を最初に読んだ時からいつか作ろうとは思っていたのですが、ちょっとまとまった時間ができたので、さくっと作りました。


7月

実例に学ぶチーム開発におけるNuGet導入のすすめ 第2回公開

先月に引き続き、第2回目「NuGetを活用してライブラリの変更に柔軟に対応しよう」が公開されました。


8月

ASP.NET Identity連載の第12回公開

独自の認証処理を行う方法についての第12回が公開されました。


9月

ASP.NET Identity連載の第13回公開

任意のデータストアを使う方法についての第13回が公開されました。

 

OnBuildにMSBuild 14.0向けパッチのPull Request作成

VSでビルドした時にNuGetパッケージを作成、公開できる@kazukさん作のNuGetパッケージ「OnBuild」に対して、VS2015のみの環境で動作しないという問題があることがわかり、その対処の一部としてのパッチを作成しました

ただ、VS2015自体のNuGetの動作がいまいちまだ不安定なので、本当の意味でのVS2015対応はもう少し先になりそう、とのことでした。


10月

ASP.NET Identity連載の最終回公開

本連載の締めくくりとして、ASP.NET 5 BetaにおけるASP.NET Identityについての第14回が公開されました。1年を超える長い連載も、ようやく終了しました。

 

Niigata.NET開催

Niigata.NETを開催してきました #ngtnet

かねてから新潟でも.NETの勉強会を開きたいと熱望してきましたが、@AILightさん、@84taka0310さんのご協力もあり、ようやく開催することができました。

第2回もそれほど間をあけずに開催したいとは思っているのですが、最近多忙で準備する時間が確保できないでいます。春頃を目途にまた準備していこうと思います。


11月

年末に向けで徐々に忙しくなったこともあり、目立ったアウトプットはありませんでした。


12月

Advent Calendar参加

このところ毎年恒例のAdvent Calendarに今年も参加しました。

参加したのは以下の3エントリ。


 

今年はASP.NET Identity記事が終わった後、少し燃え尽き症候群のような状態もあり、アウトプットが比較的少なめでした。それでも、Niigata.NETが開催できたことは、本当に良かった。

来年はプログラマの定年である35歳の今色々と考えるところがあり、すこしじっくりと考えて様々なことに取り組んでいこうと思います。その過程でまたアウトプットすることもあるでしょう。

それでは、みなさん良いお年を!

 

書評 | プログラマのためのDocker教科書

プログラマのためのDocker教科書 インフラの基礎知識&コードによる環境構築の自動化

WINGSプロジェクトにてレビューアを募集していたので応募し、献本していただきました。

本書はこの1,2年ですっかりメジャーになったDockerおよびその周辺ツールについて、実際のコマンド、設定ファイルの例、動作イメージなどをふんだんに盛り込んで紹介しています。

Dockerは進化スピードも速く、またいわゆるWeb系のコミュニティで人気があることもあり、これまで日本ででは体系的にまとまった情報を得る手段があまりありませんでした。本書ではDockerのインストール方法から基本コマンドの説明、ローカルリポジトリの利用方法、さらにはDocker Machine、Docker Swarmといった周辺ツールの説明も順を追って説明されているため、最初の一冊にふさわしい内容と言えます。また、コマンド等のオプションについても、主要なものは個別に取り上げ、説明されていますし、索引も非常に充実しており、リファレンスとしても活用できるでしょう。

その他、一番最初にネットワークなどの「インフラ」用語について解説されているのも好印象でした。「プログラマのための」と銘打っているように、インフラに精通していないプログラマ(程度問題ではありますが)でも、一通りの知識をつけることができ、例えば新入社員~2,3年目の経験の浅いプログラマにはうってつけです。

ただ、気になる所がないわけではありません。

まず、dockerコマンドのオプションの例を実際に打ち込みながら学習を進めていると、たまにそのコマンドを実行する前に何をすればよいのかわからないことがありました。例えばあるコンテナが動作している前提で実行するコマンドがあり、そのコンテナをどうやって作ればよいのかわからない、といったケースです。少し考えればなんとなくは分かりますが、全くの初心者にはちょっとつらいかもしれません。

他には、ボリュームやリンクといったコンテナ間の連携機能の動作イメージが少しわかりにくく感じました。これらはそもそもが少し難解な概念だということもあるとは思いますが、ボリュームオプションで指定したボリュームに他のコンテナからどのような順でアクセスしているのかを、順を追って説明した図などがあればよかったです。

とはいえ、これらの問題は本書の本質的な価値にはほとんど影響ないでしょう。総じて良くまとまっており、Dockerを触ろうと思った人に、自信を持ってオススメできる一冊だと思います。

oo4oを倒した話 by @masaru_b_cl #vbadvent2015

この記事はVisual Basic Advent Calendar 2015の22日分です。昨日は@hilaponさんの「Visual Basic 2015 の新機能(その3) – (憂国のプログラマ Hatena版 改め) 周回遅れのブルース」でした。

問題

未だにまれによくあるVB6→VB(.NET)への移行の際、問題となるのがサードパーティ製品の扱いです。その中でもRDBMSへのアクセスを行うプロバイダーの変更は特に厄介です。

もちろん、データアクセス処理を適度に抽象化して、一箇所にまとめているようであれば、影響は小規模で済むのですが、VB6といえば良くも悪くも「誰でも」システムが作れたので、まぁお察しということで。

そんな状況の中、Oracle Database 11gまでサポートしていたoo4o(Oracle Objects for OLE)が、Oracle Database 12cではとうとうサポートが打ち切られてしまい、ODP.NETへの乗り換えを余儀なくされてしまいました。とはいえ、システム内のあちこちにoo4oを直に叩くコードが散乱していて、すべて書き換えるのは無理があります。

解決法

というわけでこんな感じのものを作って、oo4oを倒すことに成功しました。

https://github.com/masaru-b-cl/Oo4oBuster

oo4o Buster

oo4oを操作するコードをなるべく変更せずに、ODP.NETへ置き換えるためのサポートを行います。

必須要件

  • ODP.NET 11g or higher

使い方

Using db = BusterDb.OpenDatabase(dbName, userId, password)
  Dim dynaset = db.CreateDynaset(sql)

  Console.WriteLine("count = {0}", dynaset.RecordCount)

  While Not dynaset.EOF
    Console.WriteLine("name = {0}", dynaset("name").Value)
    Console.WriteLine("age = {0}", dynaset("age").Value)

    dynaset.MoveNext()
  Next

  dynaset.Close()
  db.Close()
End Using

ライセンス

zlib/libpng

oo4oを利用したコードとの比較は、次のテストコードを参照してください。

https://github.com/masaru-b-cl/Oo4oBuster/blob/master/Oo4oBuster.Test%2FOo4oBusterTest.vb

解説

ざっくりいえば、次のようなものがポイントです。

  • 動的アクセスを主体とする
    • VB6のころもVariant型でやってたし
    • ダイナセットの実装はプライベートで外に見せない
  • oo4oの基本的なAPIをエミュレートする
    • OpenDatabaseプロシージャ
    • CreateDynasetプロシージャ
    • Move*系プロシージャ
    • etc…
  • Disposableパターンで後処理する

実際業務で使ったのは、トランザクション管理などもう少しいろいろと実装していますが、基本はこんな感じです。

まとめ

動的アクセス万歳!

明日は…

@yajuさんにバトンタッチです。