分散協調サービスのメモ

以前は分散システムの設計をやってたんですが、最近ちょっと離れているので、2017年7月末時点の分散協調サービスについて確認。

自分で使うとしたらこの辺りになるかなぁ。あとは用途要件に合わせて、RabbitMQ + Zabbixみたいな組み合わせと比較していく感じ。

DynamoDBがスケールしねーぞの話に関するメモ

こういう話が流れてきたので元記事を読んでみたのだけど、そもそもDynamoDBの仕組みを把握してなかったので理解ができなかった。ということで、ざっと調べた結果を、自分(Cassandraをがっつり触ってた経験あり)が後から読んでわかればいいや程度のメモに。

DynamoDBとは

DynamoDBのスループット設定の考え方の注意点

このスライドを一回読むとよさそう。

www.slideshare.net

端的には、

f:id:terurou:20170709121701j:plain

100,000RCUを持っていたとしても、パーティションが50個あれば、1パーティションあたりのRCUは2,000となる。

で、パーティションキーを元にアクセスするパーティションを特定する性質上、以下ようなアクセスの偏りが生じるケースがある。

f:id:terurou:20170709122132j:plain

元記事の指摘ポイント

言いたいことはわかるけど、DynamoDBの仕組み(課金の仕組み)を考えると、なかなか難しい問題。分散DBは難しい。

IntelliJ IDEAでHiDPI(Per-monitor DPI)対応

Windows 10 Creators Update(1703) + IntelliJ IDEA 2017.1.2 で確認。これで表示がぼやけなくなった。

idea.propertiesで sun.java2d.uiScale.enabled=true を設定しろということらしい。というか、他にも swing.bufferPerWindow=true みたいなマルチディスプレイに影響しそうな設定が存在するので、 https://github.com/JetBrains/intellij-community/blob/master/bin/idea.properties をそのまま配置した方が無難な気がする。

idea.properties の設定は、IntelliJ IDEAのメニューの Help > Edit Custom Properties... から設定する。

ただ、これだけだとディスプレイ毎フォントサイズの微調整が効かないので、エディタフォントサイズを都度変更する方法で対応する。

IntelliJ IDEA 2017.1 Help :: Zooming in the Editor

XPS15 9560を買った

VAIO Z(2015)を使ってきたが、低電圧版CPUのパワーとメモリ16GBでは開発が厳しくなってきたので、XPS15 9560を買った。

www.dell.com

買ったのは国内モデルのプラチナ(下位モデル:SSD 256GB, MEM 8GB)だが、

  • Core i7 7700HQ以上のCPUで重量・筐体がまともそうな選択肢がこれしかなかった
  • SSDとメモリーは換装する前提
    • 公式の内部コンポーネントの換装マニュアルがあり、ほぼ同筐体の9550の換装報告が多い
    • 筐体設計上はMEM 32GBまでサポートされているが、国内の上位モデルでは16GBまでしか選択できない
    • ついでにSSDも自分で好きなやつにしたい
  • 15インチFull HD
    • 上位モデルだと4Kだが、このディスプレイサイズだと確実に持て余す
    • どうせメインユースでは外部ディスプレイに接続する
    • タッチパネルはあれば便利だが、開発端末にはなくてもいい
  • 上位モデルよりバッテリーセルが小さいが、その分は軽い
    • Let'snoteも持ってるので、モバイル性を気にする場合はそちらを使う
    • そもそもバッテリー容量を気にするユースケース・機種ではない
  • VAIO Zのデジタイザ、年に数回しか使わなかった…

といった選定基準でこれにした。

XPS15 9560のクーポン

旧モデルの9550だった頃を含めて3-4か月はクーポンの監視していたが、XPS15の場合では8,000円/15,000円引きクーポンはカス、15%引きはまずまず、それ以上はたまにしか来ないという感じになっている。

ちなみに自分は期末/年初期の17%引きクーポンが来るのを狙って買ったので、約3万円引きの15万弱で購入している。次の高レートクーポンはおそらく夏のボーナス期に出てくると思われる。

換装したSSDとメモリ

Samsung SM961 512GB

同じSamsungの960 ProやPM961の上位と悩んだが、SM961でも実用上は十分爆速で、MTBFの差ぐらいになるので、価格と相談してSM961で十分と判断した。約3万円。

ちなみに、SamsungSSDの現行モデルについては、 Samsung V-NAND採用NVMe M.2フォームファクタSSDにリテール版 「SSD 960 PRO」と「SSD 960 EVO」が登場 | Ark Tech and Market News Vol.3001037 を参考にした。

PC4-21300 16GB * 2

XPS15 9560標準のメモリモジュールはPC4-19200が搭載されているが、仕様上はPC4-21300まで対応していることがわかったので、これを買った。3万円強。

コンポーネントの換装

分解の仕方は、この動画を見るのが手っ取り早い。

www.youtube.com

  • コンポーネントの換装を行う前に、USBリカバリメディアを作成する
  • 筐体を分解するために、通常のプラス精密ドライバーのほか、星形ドライバー(T-5)が必要になる
  • 爪がかみ合っているが結構弱いので、ツールはなくても分解できる。黒いヒンジ側に指がかかるので、動画の通りこちらから引っぺがせば簡単に底面パネルが外せる

ちなみに底面パネルを外すとこんな感じになっていた。画像がぼけているが、中央部にメモリスロット、その左側にM.2スロットがある。

左下には2.5インチ用のマウンタがあり、ここにもドライブを増設できる。ここは97Whrバッテリーセルの場合は埋まっている。

また、左上にはネットワークカードスロットがあり、これも換装可能となっている。

f:id:terurou:20170422235420j:plain

SSDの認識

BIOSでストレージのモードをRAIDからAHCIにしないとSM961は認識してくれなかった。引っかかったのはこれぐらい。

Windows 10 1703(Creators Update)のインストール

ISOイメージをダウンロードしてきて、RufusでUSBブータブルメディアを作成した。パーティション構成をGPTにしないとブート時に認識してくれなかった。

OSをインストールするとWiFiまでは認識してくれたので、あとはWindows Updateから自動でドライバを適用した。 ただ、これではSM961用のNVMe Driverドライバーが不足するので、これだけは自分でインストールした。

Tools & Software | Download | Samsung Memory & Storage

まとめ

分解するため、保障がアレになるが、22万円弱でこんな感じのスペックになった。わーい。

f:id:terurou:20170423160437p:plain

SM961はシステムドライブとして使ってるので、すこしベンチマークが悪くなっているが、それでも爆速には変わりはない。 f:id:terurou:20170423160447p:plain

.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 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

2019-10-03 追記

どうやらPostgreSQL 10.xのコンテナイメージでは、POSTGRES_INITDB_ARGS の指定が不要になったっぽい。localedef と 環境変数の設定は引き続き必要。