量産型エンジニアの憂鬱

きっと僕は何物にもなれない。

iOSDCで当日スタッフ & LTトークしてきました

i will blog.


こちらのiOSDCの写真をみてたんです。
…ぼくめっちゃデブやん…

鏡って2割ほど痩せて見えるんですね。気づきがありました。


さて iOSDC 2017 も終わり、日々の業務を粛々と進めております。
僕は 当日スタッフ と、 LTトーク枠で参加してきました。

LTトーク内容は 所属グループのブログ で少し紹介しているのでそちらをご覧ください。
発表前日に資料について気になって、調査したり資料を直したりしていたら朝になっていました。
発表内容に興味を持っていただいて、懇親会時に話かけていただいたりもして、やはり発表するのはいいなと思いました。
…笑いはとれなかったけど。


当日スタッフとしては、トラックDの担当でした。 トラックDはあまりセッションもなかったので、受けつけのヘルプをしていた時間の方が長かったかもしれないです。 あとは仕事ありそうなところ手伝ったり、LT前は緊張しすぎてウロウロしていました。

スタッフのみなさん本当に出来る方々ばかりで、頭があがりませんでした。 何よりみなさんが本当に楽しんでいて、それがよかった。

f:id:duck8823:20170922021214j:plain


是非来年もスタッフとして参加させていただきたいです。 トークも応募したいと思います。 それまでにダイエットします。 痩せてイケメン枠で登壇&スタッフしたいです。


普段は iOS Test Night、 Android Test Night などで運営のお手伝いをしています。こちらもどうぞ参加ください。

testnight.connpass.com

俺コンでも発表します。

orecon.connpass.com

GitHubと各種CIサービスを連携してみる

普段GitHubを使っていて、Travis CIと連携してバッヂをつけたりしています。 Pull Requestが来たときなんかも自動でビルド・テストをしてくれるので便利ですよね。

今回は、自分でサーバーを用意せず利用できるCIとGitHubを連携してみました。 今回ご紹介するのは以下のCIサービスです。


Travis CI

GitHubとの連携

https://travis-ci.org/

トップページ右上の Sign in with GitHub からログインすることができます。

f:id:duck8823:20170716225944p:plain

ログイン後、 https://travis-ci.org/profile/GitHubのアカウント名/ にアクセスすると、Publicなリポジトリ一覧が表示されます。

f:id:duck8823:20170716233025p:plain

連携したいリポジトリf:id:duck8823:20170716233225p:plain に設定すると連携できます。

リポジトリの設定

リポジトリの設定は、リポジトリ名横の歯車マークをクリックします。 f:id:duck8823:20170716234907p:plain

以下のような設定項目が表示されます。 f:id:duck8823:20170717001102p:plain

.travis.yml の記述

詳しくは https://docs.travis-ci.com/user/customizing-the-build/ を見ながら設定しましょう。

以下は ruby プロジェクト(https://github.com/duck8823/danger-slack)の例

language: ruby
cache:
  directories:
    - bundle

rvm:
  - 2.3.1

before_script:
    - bundle exec danger

script:
    - bundle exec rake spec

Travis CIはOS X のイメージも無料で利用することができます。
設定項目も必要最低限で1画面でまとまっていて、
スケジュールも設定できる。
個人のOSSなんかは Travis CI を使うと便利そうですね。



Circle CI

GitHubとの連携

Circle CI のサインアップページから Start with GitHub をクリックし、ログインします。

ログイン後に Settings > Projects に進むとリポジトリ一覧が表示されます。

f:id:duck8823:20170717015852p:plain

連携したいリポジトリの歯車マークを押し、 表示されたページで Follow Project をクリックしましょう。

f:id:duck8823:20170717020024p:plain

リポジトリの設定

follow すると、様々な設定が可能になります。 Settings > Projects > 設定したいプロジェクトの歯車マーク

f:id:duck8823:20170717020604p:plain

環境変数は BUILD SETTINGS の Environment Variables で設定できます。

circle.yml の設定

以下は ruby プロジェクト(https://github.com/duck8823/danger-slack)の例

machine:
  ruby:
    version: 2.3.1

test:
  pre:
    - bundle exec danger
  override:
    - bundle exec rake spec

circle ci では osx を利用するには有料プランを選択する必要があります。



Wercker

GitHub との連携

https://app.wercker.com にアクセスするとログインページに遷移します。
LOG IN WITH GITHUB をクリックしてログインしましょう。

ログイン後、ヘッダーに表示されている Create をクリックし、 Application を選択します。
f:id:duck8823:20170717025058p:plain

リポジトリ一覧が表示されるので、連携したいプロジェクトを選択肢し、 Use selected repo をクリックします。 f:id:duck8823:20170717025259p:plain

続いてアクセス方法を選択して Next step をクリックします。 f:id:duck8823:20170717025428p:plain

リポジトリの設定

ヘッダーメニューの Applications をクリックし、一覧から設定したいリポジトリを選択します。 Environment を選択すると環境変数を設定することができます。 TokenなどはProtectedにチェックをつけるといいでしょう。

f:id:duck8823:20170717030053p:plain

werker.yml

box: ruby
build:
    steps:
        - bundle-install
        - script:
            name: test
            code: bundle exec rake spec

Werkerは、パイプラインを作成することも可能です。
プライベートリポジトリも無料で利用できます。
残念ながら今のところ Danger は利用できません。

Dangerプラグインを作ろう

Danger

最近流行りつつある? Danger です。 Pull Request に対して色々チェックできるようになります。

先月末にポツポツと紹介記事が出ました。

Dangerとても便利です。 他のプロジェクトでも使えそうなルールなどはプラグインにして使い回ししたいですね。 なのでプラグインを作ってみます。

プラグイン作成も公式ページで詳しく乗ってます。 http://danger.systems/guides/creating_your_first_plugin.html

Dangerのインストー

$ gem install danger

プラグインの初期化

プラグイン名にハイフン(-)は推奨されていません。 単語はアンダースコア(_)で区切りましょう。

$ danger plugins create <plugin_name>

上記コマンドを実行すると、 git config からユーザ名とメールアドレスを取得してよしなに初期化してくれます。

danger-plugin_name/
├── Gemfile
├── Guardfile
├── LICENSE.txt
├── README.md
├── Rakefile
├── danger-plugin_name.gemspec
├── lib
│   ├── danger_plugin.rb
│   ├── danger_plugin_name.rb
│   └── plugin_name
│       ├── gem_version.rb
│       └── plugin.rb
└── spec
    ├── plugin_name_spec.rb
    └── spec_helper.rb

3 directories, 12 files

作成されたディレクトリへ移動します。 danger-<plugin_name> というディレクトリが作成されています。

$ cd danger-plugin_name

テストなどに必要なGemをインストールしておきます。

$ bundle install --path vendor/bundle

また、テストを実行する際にリポジトリの upstream の情報が必要になります。リポジトリを作成して upstream を登録しておきます。

$ git remote add origin <上流のリポジトリURL>
$ git push -u origin master

メソッドを作る

簡単なプラグインを作る場合は lib/<plugin_name>/plugin.rb を変更するだけでできます。

say というメソッドを追加してみます。

lib/<plugin_name>/plugin.rb

diff --git a/lib/plugin_name/plugin.rb b/lib/plugin_name/plugin.rb
index eeda801..cea9600 100644
--- a/lib/plugin_name/plugin.rb
+++ b/lib/plugin_name/plugin.rb
@@ -29,5 +29,12 @@ module Danger
     def warn_on_mondays
       warn 'Trying to merge code on a Monday' if Date.today.wday == 1
     end
+
+    # A method that messages 'Hello Danger.'
+    # @return [Array<String>]
+    #
+    def say
+      message 'Hello Danger.'
+    end
   end
 end

テストを書く

プラグインを作ったらテストをかきましょう。

spec/<plugin_name>_spec.rb

diff --git a/spec/plugin_name_spec.rb b/spec/plugin_name_spec.rb
index 484958f..a3ec8ad 100644
--- a/spec/plugin_name_spec.rb
+++ b/spec/plugin_name_spec.rb
@@ -36,6 +36,11 @@ module Danger
         expect(@dangerfile.status_report[:warnings]).to eq([])
       end

+      it "Messages" do
+        @my_plugin.say
+
+        expect(@dangerfile.status_report[:messages]).to eq(["Hello Danger."])
+      end
     end
   end
 end

テストを書いたら実行します。 以下のコマンドで rspec と RuboCop が実行されます。 RuboCopでは色々指摘されると思うので必要あれば修正してください。

$ bundle exec rake spec
....

Finished in 0.06292 seconds (files took 0.4549 seconds to load)
4 examples, 0 failures

Running RuboCop...
Inspecting 6 files
...CCC

Offenses:

lib/plugin_name/plugin.rb:20:1: C: Extra empty line detected at class body beginning.
lib/plugin_name/plugin.rb:30:12: C: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
      warn 'Trying to merge code on a Monday' if Date.today.wday == 1
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
lib/plugin_name/plugin.rb:37:15: C: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
      message 'Hello Danger.'
              ^^^^^^^^^^^^^^^
spec/plugin_name_spec.rb:42:1: C: Tab detected.
        expect(@dangerfile.status_report[:messages]).to eq(["Hello Danger."])
^^
spec/plugin_name_spec.rb:42:3: C: Inconsistent indentation detected.
        expect(@dangerfile.status_report[:messages]).to eq(["Hello Danger."])
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
spec/spec_helper.rb:12:23: C: Prefer double-quoted strings unless you need single quotes to avoid extra backslashes for escaping.
if `git remote -v` == ''
                      ^^

6 files inspected, 6 offenses detected
RuboCop failed!

動作確認したい

これがとてもめんどくさいです。 Pull Requestを用意する必要があります。 確認の場合、既にCloseされている Pull Request でも問題ありません。 個人で開発しているライブラリのリポジトリで確認してみました。

$ git clone https://github.com/duck8823/Slack-RTM-Bot.git
$ cd Slack-RTM-Bot

Dangerとプラグインを使えるようにGemfileを用意してやります。 プラグイン:path を指定することで作成途中のもので試すことができます。

Gemfile

source "https://rubygems.org"

gem 'danger'
gem 'danger-plugin_name', :path => 'path/to/danger-plugin_name'

bundleインストー

$ bundle install --path vendor/bundle

これで準備ができました。

続いて Dangerfile を用意しましょう。 プロジェクト直下に置く必要があります。

Dangerfile

plugin_name.say

Dangerfile ではプラグインインスタンスが利用できます。 インスタンス名は以下の命名規則に従います。 http://danger.systems/guides/creating_your_first_plugin.html#tech-specs

確認は、

$ bundle exec danger local

で可能です。

また、

$ bundle exec danger pr https://github.com/duck8823/Slack-RTM-Bot/pull/20

のようにすることで特定の Pull Request に対して確認することも可能です。

local または pr で実行した場合、以下のような内容が表示されます。

Info:

+------------------+----------------------------------------------------------------------------------------------+
|                                                  Danger v5.3.3                                                  |
|                                                 DSL Attributes                                                  |
+------------------+----------------------------------------------------------------------------------------------+
|    status_report |                                                                                              |
| violation_report |                                                                                              |
|              --- | ---                                                                                          |
|     scm_provider | github                                                                                       |
|             diff | diff --git a/lib/Slack/RTM/Bot/Client.pm b/lib/Slack/RTM/Bot/Client.pm                       |
|                  | index 9b86bc6..4c8ff0d 100644                                                                |
|                  | --- a/lib/Slack/RTM/Bot/Client.pm                                                            |
|                  | +++ b/lib/Slack/RTM/Bot/Client.pm                                                            |
|                  | @@ -248,7 +248,7 @@ sub _listen {                                                            |
|                   |       $channel = $self->find_channel_or_group_name($buffer_obj->{channel});
                        |   $channel ||= $self->_refetch_channel_name($buffer_obj->{channel});
                          | $channel ||= $self->_refetch_group_name($buffer_obj->{channel});
       |           | -      die "There are no channels or groups of such id: $buffer_obj->{user}" unless $user;
 |                 | +      die "There are no channels or groups of such id: $buffer_obj->{channel}" unless $channel;
                                                                                          |
                                             |RTM::Bot::Response->new(
                                                                   |
|                  | @@ -273,4 +273,4 @@ ACTION: for my $action(@{$self->{actions}}){                             |
                                                                                          |
                                                                                          |
                                                                                            |
|                  | -1;                                                                                          |
|                  | \ No newline at end of file                                                                  |
|                  | +1;                                                                                          |
|      added_files | #<Danger::FileList:0x007fe123a9d678>                                                         |
|    deleted_files | #<Danger::FileList:0x007fe123a9cea8>                                                         |
|   modified_files | lib/Slack/RTM/Bot/Client.pm                                                                  |
|    renamed_files | []                                                                                           |
|    lines_of_code | 4                                                                                            |
|        deletions | 2                                                                                            |
|       insertions | 2                                                                                            |
|          commits | b4e3b9fd228752e3c7fffd7c9cb5258959f281a2                                                     |
|              api | Octokit::Client                                                                              |
|          pr_json | [Skipped JSON]                                                                               |
|          mr_json | [Skipped JSON]                                                                               |
|          pr_diff | [Skipped Diff]                                                                               |
|           review | #<Danger::RequestSources::GitHubSource::Review:0x007fe12398a498>                             |
|         pr_title | bugfix channel or group not found (was checking for user instead)                            |
|          pr_body |                                                                                              |
|        pr_author | dada                                                                                         |
|        pr_labels | []                                                                                           |
|  branch_for_base | master                                                                                       |
|  branch_for_head | master                                                                                       |
|      base_commit | 947aeeaf5443494d3e7895292662b617b369bf05                                                     |
|      head_commit | b4e3b9fd228752e3c7fffd7c9cb5258959f281a2                                                     |
|         mr_title | bugfix channel or group not found (was checking for user instead)                            |
|          mr_body |                                                                                              |
|        mr_author | dada                                                                                         |
|        mr_labels | []                                                                                           |
|              say | Violation Hello Danger. { file: , line:  }                                                   |
|     my_attribute |                                                                                              |
|  warn_on_mondays |                                                                                              |
|              --- | ---                                                                                          |
|              SCM | Danger::GitRepo                                                                              |
|           Source | Danger::LocalGitRepo                                                                         |
|         Requests | Danger::RequestSources::GitHub                                                               |
|      Base Commit | commit 947aeeaf5443494d3e7895292662b617b369bf05                                              |
|                  | Author: shunsuke maeda <duck8823@gmail.com>                                                  |
|                  | Date:   Sat Apr 8 12:30:31 2017 +0900                                                        |
|                  |                                                                                              |
|                  |     Checking in changes prior to tagging of version 1.04.                                    |
|                  |                                                                                              |
|                  |     Changelog diff is:                                                                       |
|                  |                                                                                              |
|                  |     diff --git a/Changes b/Changes                                                           |
|                  |     index 311b411..e8e2578 100644                                                            |
|                  |     --- a/Changes                                                                            |
|                  |     +++ b/Changes                                                                            |
|                  |     @@ -2,6 +2,10 @@ Revision history for Perl extension Slack-RTM-Bot                       |
|                  |                                                                                              |
|                  |      {{$NEXT}}                                                                               |
|                  |                                                                                              |
|                  |     +1.04 2017-04-08T03:30:26Z                                                               |
|                  |     +                                                                                        |
|                  |     +   - Fix dying when response to new channel/group                                       |
|                  |     +                                                                                        |
|                  |      1.03 2017-04-05T23:11:07Z                                                               |
|                  |                                                                                              |
|                  |         - Fix a bug that zombies spawn when stop_RTM                                         |
|      Head Commit | commit b4e3b9fd228752e3c7fffd7c9cb5258959f281a2                                              |
|                  | Author: dada <dada@perl.it>                                                                  |
|                  | Date:   Fri May 19 18:07:20 2017 +0200                                                       |
|                  |                                                                                              |
|                  |     bugfix channel or group not found (was checking for user instead)                        |
+------------------+----------------------------------------------------------------------------------------------+

Results:

Messages:
- [ ] Hello Danger.
- [ ] Hello Danger.

Info: ではDangerが取得した Git や GitHub などの情報を閲覧することができます。また、プラグイン内の 引数がないメソッドを自動的に実行し 、結果を表示してくれます。

Results: では messagefail などの DSL を実行した結果を表示してくれます。

上記の例で Hello Danger. が重複して表示されているのは、

  • Dangerfileでの呼び出し
  • Info: で表示するための呼び出し

で二回実行されたからです。

引数なしのメソッドでPull Requestをクローズするなどの処理を実装した場合、local または pr モードで意図しないメソッド呼び出しが起こる場合があるので気をつけましょう。 (記事を書いた時点でDangerのバージョンは 5.3.3 )

また、実行時に

Octokit::TooManyRequests: GET https://api.github.com/repos/duck8823/Slack-RTM-Bot/issues/20: 403 - API rate limit exceeded for

というようなエラーが出た場合は、 環境変数DANGER_GITHUB_API_TOKEN を設定してやることで回避できる場合があります。

利用するトークンは https://github.com/settings/tokens で作成することができます。

READMEの自動生成

Dangerは README を自動的に生成するコマンドも用意してくれています。

$ bundle exec danger plugins readme
### plugin_name

This is your plugin class. Any attributes or methods you expose here will
be available from within your Dangerfile.

To be published on the Danger plugins site, you will need to have
the public interface documented. Danger uses [YARD](http://yardoc.org/)
for generating documentation from your plugin source, and you can verify
by running `danger plugins lint` or `bundle exec rake spec`.

You should replace these comments with a public description of your library.

<blockquote>Ensure people are well warned about merging on Mondays
  <pre>
my_plugin.warn_on_mondays</pre>
</blockquote>



#### Attributes

`my_attribute` - An attribute that you can read/write from your Dangerfile




#### Methods

`warn_on_mondays` - A method that you can call from your Dangerfile

`say` - A method that messages 'Hello Danger.'

plugins readme コマンドは lib/<plugin_name>/plugin.rb のドキュメント(YARD形式)を元にREADMEを作成します。

正しくドキュメントが記述されているかどうかは、

$ bundle exec danger plugins lint

で調べることができます。 例えば、追加したメソッドにドキュメントが存在しない場合には以下のようなエラーが出ます。

[!] Failed


Errors
  - Description - say (method):
    - You should include a description for your method.
    - @see - https://github.com/dbgrandi/danger-prose/blob/v2.0.0/lib/danger_plugin.rb#L40#-L41
    - /private/tmp/danger-plugin_name/lib/plugin_name/plugin.rb:33


Warnings
  - Return Type - say (method):
    - If the function has no useful return value, use ` @return  [void]` - this will be ignored by documentation generators.
    - @see - https://github.com/dbgrandi/danger-prose/blob/v2.0.0/lib/danger_plugin.rb#L46
    - /private/tmp/danger-plugin_name/lib/plugin_name/plugin.rb:33

Failing due to errors

記述に従ってドキュメントを整備しましょう。

公開しましょう

良いプラグインができたら公開しましょう。

公開前に、 danger-<plugin_name>.gemspec を確認しましょう。

danger-<plugin_name>.gemspec

# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'plugin_name/gem_version.rb'

Gem::Specification.new do |spec|
  spec.name          = 'danger-plugin_name'
  spec.version       = PluginName::VERSION
  spec.authors       = ['shunsuke maeda']
  spec.email         = ['duck8823@gmail.com']
  spec.description   = %q{A short description of danger-plugin_name.}
  spec.summary       = %q{A longer description of danger-plugin_name.}
  spec.homepage      = 'https://github.com/duck8823/danger-plugin_name'
  spec.license       = 'MIT'
.
.
.

githubアカウント名と git config の user.name が異なる場合などは適宜変更してください。 spec.homepage のアカウント名部分に user.name が使われるのでスペースがある場合などは gem に登録できません。

修正が完了したら

$ rake release

RubyGems に登録することができます。

さらに Danger本家サイト にプラグインとして紹介してもらいましょう。 以下にプラグインを追加して Merge Request を出せば、光速でマージしてくれます。

https://gitlab.com/danger-systems/danger.systems/blob/master/plugins.json

その後、サイトはそのうち更新されます。

plugins コマンドでも確認できます。

$ danger plugins
Downloading Plugins list...

Available Danger Plugins:

-> danger-prose
     A danger plugin for working with bodies of markdown prose.
     - Gem:     danger-prose
     - URL:     https://github.com/dbgrandi/danger-prose

-> danger-android_lint
     Lint files of a gradle based Android project. This is done using the Android's Lint tool. Results are passed out as tables in markdown.
     - Gem:     danger-android_lint
     - URL:     https://github.com/loadsmart/danger-android_lint
・
・
・

公開したプラグイン

僕が作ったプラグインも掲載されています。 http://danger.systems/plugins/slack.html

message や fail などの内容をSlackに通知するプラグインです。 DangerはGitHub上に HTML 形式でコメントしてくれるので、 GitHub の Slack 連携では HTML は表現されません。 対策としてHTMLコメントでそれぞれの数を表示してくれているのですが微妙な感じ。

f:id:duck8823:20170711164521p:plain

プラグインでは内容も表示し、色によって error などわかるようにしました。

f:id:duck8823:20170711164536p:plain

地味にチャンネルやメンバー一覧を取得するメソッドも用意しています。 サクッと指摘内容をSlackに通知したい場合は使ってみてください。 https://github.com/duck8823/danger-slack

Dangerを使ってみる

Danger

What is Danger?

CI上で、バージョン管理ホスティングサービス の Pull Request / Merge Request の内容を解析して、コメントすることができるツール。
設定ファイルは Ruby DSL で記述するので、様々なチェックができる。

サポート状況

サポート状況などは公式を確認してください。

使い方

プロジェクト

Gemfileに danger を追加

gem 'danger'

Dangerfileを作成

message('PRいただきました')

CI環境で実行

bundle install
bundle exec danger

Dangerによるコメント

Dangerによるコメントは、デフォルトでは最初に行われたコメントを更新する。
実行時に --new-comment オプションを指定することで新しいコメントとして表示される。

bundle exec danger --new-comment

Dangerで取得できる情報

githubGitHubの場合)で各種情報が取得できる。
http://danger.systems/reference.html

github.apiOctokit::Client が取得できるので、追加でトークンなど指定せずにGitHubAPIを介して情報を取得することができる。

必要な環境変数

環境変数 DANGER_GITHUB_API_TOKENが必要。

DANGER_GITHUB_API_TOKEN="xxxxxx"

Dangerfile

DSL

コメント用の拡張構文として、 messagewarnfail などが用意されているがHTMLのテーブルでコメントしてくれる。
フォーマットが気に入らない場合は markdown が用意されている。

アウトプット(テーブルとして表示)

  • message
  • warn
  • fail(ビルドが失敗する)

アウトプット(テーブルの下に表示)

diffにコメント

warn("Please add your name", file: "CHANGELOG.md", line: 4)

プラグイン

共通の処理などをプラグインとして提供しておくと、使い回しも効きそう。
プラグインの作成方法は 公式

運用

OSSプロジェクトなどではビルド毎に danger を実行してチェックしている
dangerは Pull Request 以外のビルドは自動的にスキップする

ローカルで確認する方法

Dangerfileを変更して確認したい場合、 commit -> push -> hook だと効率が悪いし、PRなどを汚してしまう。
ローカルでPRを指定して確認する方法も用意されている。

http://danger.systems/guides/troubleshooting.html#i-want-to-work-locally-on-my-dangerfile

bundle exec danger pr https://github.com/danger/danger/pull/662

JJUG CCC 2016 Fallに行ってきました

JJUG CCC 2016 Fallに行ってきました。

何回か参加させていただいて、いつも電車で行ってたのですが、今回は車で行きました。
伊豆から新宿、高速使うと近い近い。

家帰ってから見たら、新宿まで行ったのに全然歩いていませんでした。

さて、聞いたセッションについて一言ずつ・・・

Be a great engineer!〜 フォローすべきトレンド、スルーすべきトレンドをどう見抜くのか

[CCC2016Fall]Be a great engineer! #jjug_ccc #ccc_a1 // Speaker Deck

聞いていて、首を縦に振ってました。

TwitterとかブログとかGitHubでコード書いてCPANに登録したりしたら、 色々とレスポンスいただいたりしていて、
最近自分でも「アウトプットするとインプット増える」ってのを言っていたので、
「情報を得るためには情報を発信する」ってのがぐう納得しました。

SpringはどうやってDIしているのか

SpringはどうやってDIしているのか? #jjug_ccc // Speaker Deck

本筋とは関係ないけど、農業とIoTも進んでるなあー。と感じました。
本筋は Spring の DI についてソースコードを追っていく感じ。
この時Surfaceのペンが壊れて気を取られていたら追いつけなくなってしまった。。。

理解するにはやっぱりソースコードリーディング必要やなあ。と思った次第。

Event Driven Microservices with Spring Cloud Stream

Data Microservices with Spring Cloud Stream, Task, and Data Flow #js…

今回自分が使っていない技術の話聞いたのはこのセッションだけですね。
今まで Spring Cloud のこと誤解していました。
そして連携がめっちゃ簡単で度肝抜かれました。

今はマイクロサービスは導入してないんですけど、カードとして取っておきたい技術。

Spring CloudでDDD的なマイクロサービスを作ってみる

GitHub - bufferings/jjug-ccc-2016-fall

DDDで出てくる言葉について、実際にやってみて理解が深まったという話

境界つけられたコンテキスト

組織の違いによって物理的に境界つけられたことが、結果的によかった。
DBに直接アクセスしちゃえば楽だけど、後のことを考えると・・・

ユビキタス言語

普段日本語で話してるのにソースに落とす時点で英語に変換しちゃっている。
社内で英語で話すようになって真のユビキタス言語を理解できた。

リポジトリ

DBとのやりとり。エンティティにはアノテーションすらつけない。 ここは Hibernateアノテーションぺたぺたつけてる自分的には悩みどころ。

ドメイン駆動設計とScala 〜既存プロジェクトへの適用〜

DDDについての基本的なところ教えていただいた感じ。
エンティティ、バリューオブジェクト、集約など
コンテキストの言葉の意味が通じる範囲の例がわかりやすかったです。
(自分のメモでは肉まんが関西ではになっているけど違う例だった。)

JPA と DDD の関係で僕が思っていること

JPAとDDDは相性いいのでは?っていうお話。

仕様と実装(ExlipseLink、Hibernate)でも違う部分もある。

自分は今の業務でHibernate使っているので非常に参考になりました。
上にも出てきたけどアノテーションでテーブルの情報などで汚染されちゃうのが嫌な場合は、 xmlファイルに定義すればいいと。

xmlしんどいからアノテーションっていう経緯もあるので、
すごい悩ましいところ。
まあ、方針さえ決まればいいところつまみ食いでいいと思っています。

そしてこのカタログは重宝しそう。
JPA マッピングカタログ - Qiita

ここまで聴いて撤退し、横浜でガッツ麵DXを食べました。

4年間乗ってきたワゴンRちゃん最後の長距離ドライブ。楽しかったです。