読者です 読者をやめる 読者になる 読者になる

.NETのORMのことを調べてたメモ

.NET ORM

Entity FrameworkとDapper以外にあんまり知らないので、軽く調べてみた。

Dapperのページに他のORMとのベンチマーク比較があった。 github.com

その中で検証してみたいなぁと思ったのは以下の二つ。

github.com

nhibernate.info

そういえばNHibernateとかありましたね。あまりHibernate自体にいい印象を持ってないので存在自体を忘れてましたが、クエリの記述方法の豊富さ・表現力の高さを見て、ちょっと気になった感じ。

名古屋で80-100人規模の技術系コミュニティイベント開催してきた話

勉強会

趣味でNGKというイベントを主催している者です。

NGKとは

名古屋合同懇親会の略。名前から察しがつくように、名古屋でクロスコミュニティな集まりを表す感じです。

以前はNGK名義で花見も開催していましたが、今は私が主催するものは年1回の忘年会が主になっています。(蛇足だが、名古屋の技術系コミュニティ花見自体は、Functional花見という名前で行われている。Functionalとか名前が付いているものの、所詮花見。)

なお、NGK自体はオープンソース界隈や名古屋界隈で活発に活動されていたKatzkawai氏によるもので、「名古屋でクロスコミュニティな集まりをやる場合は、NGKという名前を冠したイベントを誰でも好き勝手にやればいいよ」という扱いです。

NGK20XXBの歴史

2008年に現Misoca社長の豊吉さんとクラなんとかさんが主催(記憶が曖昧)したのが初回です。

atnd.org

2回目からは「今年もやらないんですかね」『言い出した人間が~』の法則に乗り、私が主催するようになって、NGK2016Bで9年目となりました。なんか開催後のブログエントリーが発掘されたので出しておきます。

terurou.hateblo.jp

2008年は店舗貸し切りで忘年会をしながら好き勝手にLT(5分とは言っていない)を行う形式でしたが、私が主催するようになってからは、昼の部はLT大会・夜の部は忘年会というスタイルになっています。

実際の集客実績ですが、だいたい以下のような数値になっています。人数のカウントが適当なのは、昼の部はそもそもカウントしてない、夜の部は飛び入り・ドタキャンを含めたログをちゃんと残していないせいです。

  • 2008年 : 40人弱
  • 2009年 : 昼 50人強 / 夜 50人強
  • 2010年 : 昼 90人程度 / 夜 90人弱
  • 2011年 : 昼 100人程度 / 夜 85人程度
  • 2012年 : 昼 115人程度 / 夜 80人程度
  • 2013年 : 昼 105人程度 / 夜 100人弱
  • 2014年 : 昼 80人強 / 夜 85人程度
  • 2015年 : 昼 70人強 / 夜 70人強
  • 2016年 : 昼 80人強 / 夜 73人

若干人数が減ってきているのは、次のような要因だと推測しています。

  • ここ数年は勉強会ブームのピークが過ぎてきている
  • 主催者バイアスが原因で参加者が関数型的な人たちや.NET系に偏りが出てきている(他にもAndroid/iOS等のデバイス系やWebフロントエンド系のコミュニティが存在するが、最近は不参加)
    • コミュニティの仲が悪いという話ではなく、主催がちゃんと声掛けをしてなかったり、開催内容の工夫がないあたりが主因だと思われる。ただし逆説的に、あまりパワーをかけていなくても開催することが可能なため、継続できているという面はある。

名古屋のエンジニア系コミュニティの規模感とドタキャン率

名古屋近辺で現在、エンジニア系の勉強会にアクティブに参加する人(年1-2回以上参加する人)が250~300人程度(今まで1-2回なら参加したことはあるよという人も含めると500人~多めにみて800人)という肌感覚があります。名古屋にはWCANのようなデザイナー系のコミュニティというかカンファレンスもありますが、こちらは含めていません。

また、ドタキャン率が相当低いという特徴があります。NGK以外も含め、私が運営にかかわっているイベントでは、ドタキャン率は体感値で5パーセント程度です。適切にアナウンスさえすれば、キャンセル手続きすらせずドタキャンする人はほぼゼロに近くなります(まったくゼロという訳でもないですが)。

NGK20XXBの開催準備

NGK20XXBは、80-100人ぐらいを集めるイベントでありながら、私一人だけで運営を行っています。(とはいえ、当日の受付や会場準備までは、さすがに一人で回すことは無理なので、当日現場に来た方にお手伝いをしていただいています。)

事前準備の主なタスクは、次の4つになります。

  • 会場の手配
  • 告知・集客
  • LT登壇者の募集
  • スポンサーの依頼(昼の会場費および夜の部の参加費補助。NGKでは学生の参加費を無料又は低額になるように努めている)

NGK20XXBの準備スケジュールは、毎年以下のような感じで動いています。多忙度合いで、この通りに動けていないケースもままあります。

  • 6月
    • そろそろ忘年会の準備を始める時期だなーということを思い出す。
    • 前年の集客実績から、当年の集客予測を立てて、昼の部の会場をある程度目星を付ける。
  • 8月末~9月中旬(遅くとも10月初週)
    • 昼の部の会場を仮押さえ。集約予測数に20%程度の余裕(予測80人なら100人規模の会場)を見て、会場サイズを選定する。
    • 告知ページを作り、「昼の部LLT発表者募集」「夜の部の動員を見たいので、登録して欲しい」旨をアナウンス。
  • 10月中旬(遅くとも11月初週)
    • 夜の部会場仮押さえ。この時点では20%ぐらいは最終参加人数にぶれが生じるため、予約の際にお店には人数の増減が出ることを明示する。以後、実際の動員数を元に、随時お店に連絡し、席を確保・調整をしてもらう。
    • この時期には、LT発表者がほぼ確定している。
    • 会場費等の支出見通しからからスポンサー費用を確定し、アナウンス。
  • 開催14日前
    • LTタイトルの提出締め切り。
    • 翌週にLT発表順を決めるため、発表順序の調整が必要な場合は連絡が欲しい旨を通知。
    • スポンサー確定。ロゴ等の提出を依頼し、集まり次第、告知ページに掲載する。
    • 夜の部に登録したものの、参加不能になっている人はキャンセル手続きを行ってほしい旨をアナウンス。
  • 開催10日前
    • 夜の部会場に10人単位の予約人数の確定を連絡する。以後は数名(多くて5名)程度の調整しかできなくなる。
  • 開催7日前
    • LT発表順を抽選により確定し、アナウンス。
    • 夜の部の参加費を正式決定し、アナウンス。同時に、夜の部に急用・急病で参加不能になった場合はキャンセル手続きを行ってほしい旨もアナウンス。
    • 夜の部のキャンセルが多くなってしまった場合は「赤字が…」という泣きを入れる。
      • 実際問題、金銭的なバッファは2-3人程度しか見ていない料金設定なので、結構きつい。(とはいえ、名古屋はドタキャン率が低いので、これ以上バッファを見ると余剰になってしまう…。)
  • 開催1-2日前
    • 夜の部会場に最終人数を連絡。
    • 参加者に昼の部・夜の部の会場注意等をアナウンス。
    • 搬入物の準備。(LTタイマー用PC、夜の部名簿・参加票、夜の部領収書、プロジェクター等)
  • 当日(昼の部)
    • 開始2時間前を目安に会場入りし、会場設営および機材チェック。事前準備が不足していると、ここで問題が発覚するので、来場者に手伝ってもらって対処する(HDMIケーブル断線でプロジェクタが映らない、LTタイマーが動作しない等)
    • どうやっても多少の運営時トラブル(発表者が時間通りに来ない等)は出るので、それもネタにしながら、どうにか回す。
    • 夜の部の会費は、集められる分は昼の部の時点で回収する。
  • 当日(夜の部)
    • 夜の部のみ参加の人や「さっき登録しました!」「予約すらしてないけど来ちゃいました!」的な人がボチボチいるので、参加費を回収する。
    • NGKでは「参加者にチケットを持たせて、隣の人がチケットを持っているかチェックさせる」という儀式により、ある程度の未払いチェックを行っている。
    • 手元に数十万円ぐらいの現金があるはずなので、乾杯を済ませたら即座に会計を済ませてしまい、気を張らなくても良い状態にする。

LT登壇者・スポンサーはありがたいことに「勝手に集まってくる(文字通り)」状態になっているおかげで、集客系の労力はほぼないのが、一人で運営できている要素かと思います。とはいえ、リストアップしてみたら、それなりにタスクがある(特に夜の部の集客・会場の調整)のも事実ですね。

これからNGKを続けるには

主催者が一人しかない状態というのはやはりネックなので、主催者の立場で誰か手伝ってほしいなぁというのはあります。主催が一人だと、単純に単一障害点的なリスクがあることと、新たな開催アイディアに取り組んでいくには労力が足りないという問題はあります。

夜の部の集客予測・調整は、下手したら何万円レベルで赤字になる可能性がある(というか、過去何度か経験がある)ので、ここまで代わってくれというのは正直きついよなぁという一方で、当日の司会、会場設営、告知・アナウンス、来場者からの問い合わせ対応等の事務を手伝ってくれる人がいれば、本当に助かります。

私が会社経営をしてることもあるので、イベント開催代行みたいなことを企業活動としてやるプランも考えられますが、コミュニティ相手で収益化はほぼ不可能なので社会貢献活動して扱わざるを得ない点と、いわゆる「エンジニア焼きそば問題」が出てきてしまうので、難しそうです。

ja_JP.UTF-8ロケールを指定したPostgreSQL Dockerコンテナを作る

Docker PostgreSQL

Docker for Mac で 日本語locale設定を含む PostgreSQL を構築 - Qiita を参考にした。

要点

DockerHubで配布されているPostgreSQLコミュニティ公式のDockerイメージでは、日本語ロケールが有効になってない。よって、有効化したイメージを作成(ビルド)する。

イメージの作成

ここでは、公式のPostgreSQL 9.6.1イメージをベースとして、9.6.1_jaという名前のイメージを作成する。

  1. 任意の空ディレクトリを作る。以後、このディレクトリ内で作業する。
  2. 次の通りDockerfileを作成する。

     FROM postgres:9.6.1
     RUN localedef -i ja_JP -c -f UTF-8 -A /usr/share/locale/locale.alias ja_JP.UTF-8
     ENV LANG ja_JP.utf8
    
  3. ビルドする。

     docker build -t postgres:9.6.1_ja .
    

コンテナの起動

initdbの引数を指定してコンテナを起動する。--nameは自分の管理しやすい名称にする(つけなくても良い)。

docker run --name xxxxxxxx -d -p 5432:5432 -e POSTGRES_INITDB_ARGS="--encoding=UTF-8 --locale=ja_JP.UTF-8" postgres:9.6.1_ja

IntelliJ IDEA 2016.2でEclipse Compiler for Java(ECJ) + Lombokを有効にする

この問題に対応してる時にやり方を覚えた副産物。

terurou.hateblo.jp

javacからECJにするとコンパイルが速くなるっぽいのと、いろいろ警告を出してくれるようになる。ただ、ECJとjavacは挙動が違うので、注意は必要。

前提

  • Lombok Plugin インストール済み

ECJへの切り替え方

  1. Build, Execution, Development > Compiler > Java CompilerUse compilerEclipse にする。 f:id:terurou:20161114003547p:plain

  2. Build, Execution, Development > Compiler > Annotation ProcessorsEnable annotation processing を有効にする。 f:id:terurou:20161114003557p:plain

  3. Build, Execution, Development > CompilerShared build process VM options:-javaagent:lombok.jar を設定する。(lombok.jarはフルパスで指定) f:id:terurou:20161114003608p:plain

効果

  • 設定前(javac):Compilation completed successfully in 37s 546ms
  • 設定後(ECJ):Compilation completed successfully with 723 warnings in 31s 306ms

自動生成したコードがwarning出しまくっているが、まぁ速くなったっぽい

参考ページ

IntelliJ IDEAでGradleプロジェクトをインポートしたときにクラスパスが反映されない問題へのワークアラウンド

Gradle IntelliJ IDEA

GradleでSpring BootやらLombokやらを組み合わせたマルチプロジェクトを作っていて、なぜかIntelliJ IDEA側にclasspathがうまいこと反映されない問題が生じていた(Gradle上でのビルドは通るが、IntelliJ IDEA上ではコンパイルエラーと出る)。

都度、IDEからadd classpathをすれば動いてはいたのだけど、ビルドスクリプトを弄るたびにclasspathがぶっ壊れて、手動操作が必要になるのはだるいので、解決策を探して色々試したところ、以下で行けた。

// IntelliJ IDEA用のワークアラウンド
// dependencies編集後にIntelliJ IDEA上のみでコンパイルエラーが生じる場合は、providedを追記してください
apply plugin: 'idea'

configurations {
    provided
}

dependencies {
    provided "org.projectlombok:lombok:1.16.10"
    provided "org.slf4j:slf4j-api:1.7.21"
    provided "org.springframework:spring-beans:4.3.3.RELEASE"
    provided "org.springframework:spring-context:4.3.3.RELEASE"
}

idea {
    module {
        scopes.PROVIDED.plus += [configurations.provided]
    }
}

参考ページ

システム全体のキャプチャを無効化してFiddlerを起動する

fiddler

起動するたびにF12を押すのもだるいのでやり方を定期的に探してたのだけど、やっと見つけた。

コマンドラインオプションに -noattach をつけるか、Tools > Fiddler OptionsConnections > Act as system proxy on startup をOFFにする。

stackoverflow.com

f:id:terurou:20161002170814p:plain

FiddlerをHigh DPI環境に対応させる

fiddler

起動オプションに -dpiAware をつければ解決する。

textslashplain.com

だいぶ前に認識してたのだけど、やり方忘れてたのでメモ。