量産型エンジニアの憂鬱

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

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ちゃん最後の長距離ドライブ。楽しかったです。

Perl6のコンストラクタと継承

Perl5にはクラス構文がありません。

モジュール名で bless された リファレンスをインスタンスとして扱うことができます。
ハッシュリファレンスまたは無名ハッシュを bless した場合、キー値ペアをメンバとして使えます。
Perl5 では new メソッドで 自身のモジュール名で bless した 無名ハッシュ を返すことでコンストラクタとして利用しています。

また、グローバル変数 @ISA にスーパークラスを指定することで、スーパークラスのメソッドが利用できるようになります(継承)。
上記スクリプト内では Bird インスタンスが Animal の name メソッドを利用しています。


さて、Perl6ではクラス構文が存在しています。

is で継承することができます。自然言語っぽくていいですね。 Bird is Animal。
メンバ変数が public な場合は上記のように簡単に記述することができます。
継承してもデフォルトコンストラクタがよしなにやってくれています。

メンバを private 変数にした場合はどうなるでしょうか。

全て Nil になってしまいました。
前回 の記事で書いた通り、 デフォルトコンストラクタでは private なメンバに値を渡してくれないようです。

今回は、継承した場合のコンストラクタについて考えましょう。

method new はオーバーライドされてしまう

サブクラスの new がスーパークラスの new でオーバーライドしてしまいます。

サブクラスで new メソッドを定義した場合に、スーパークラスの new が呼ばれず、値が設定できません。
また、サブクラスからスーパークラスの private メンバにアクセスすることもできません。
前回の記事のように無理やり private なメンバに値を設定してやろうとしていると、継承したときにスーパークラスの値が設定できなくなってしまいます。

submethod BUILDを使う

submethod BUILD の場合、スーパークラスのコンストラクタも呼ばれます。

スーパークラスの private メンバにも値を設定してやることができます。

method new と bless で書く方が Perl5 での記述と似ていてついそっちで書きたくなってしまうのですが、
基本 submethod BUILD 使う方がいいですね。

DBUnitでxmlからインサートするときに最初のレコードでnullを指定したい

DBUnitが便利ですね。
Spring Bootにおけるテストでは以下のように書けば毎回データセットをインサートしてくれます。

最初のレコードでnullを指定したい場合にちょっと戸惑いました。

二つ目以降のレコードに null を指定したい場合は、エレメントにカラムを書かなければ null になります。

f:id:duck8823:20161106001224p:plain

最初のレコードに null を指定して、二つ目以降のレコードには任意の値を指定したい場合、困ったことになります。
データセットを以下のように書いてインサートすると

f:id:duck8823:20161106001710p:plain

二つ目のレコードのnameカラムに値が入ってくれません。
どうやら一つ目のレコードに記述されているカラム名しか見ないようです。
二つ目以降のカラムに存在しないカラム名を指定してもエラーになりません。

ReplacementDataSet を利用することで null をインサートすることが可能になります。

文字列 {null} を null に変換しています。
データセットは次のように用意します。

f:id:duck8823:20161106002529p:plain

これで null がインサートされました。
普段はアノテーションでデータセットを指定できる TestExecutionListener を作ってこれを利用しています。
テスト毎にデータセットを指定するのに、以下のようにアノテーションで指定出来て便利です。

Perl6でprivateなメンバにコンストラクタで値を渡したい

※ 追記あり

Perl6でprivateなメンバを作ったときに、コンストラクタで値を渡せなくてちょっとハマったのでメモ。

publicなメンバを設定する場合、

メンバ変数の $ の後に . をつけることで、アクセッサが自動的にできます。
インスタンスからメンバ名でアクセスできるようになります。
また、デフォルトコンストラクタでは、名前付き引数としてpublicなメンバに値を渡してやることができます。

publicなフィールドのみ持つクラスを作る場合はめっちゃスッキリ。
Pythonの namedTuple とかそんな感じで使えますね。

さて、メンバをprivateにしたい場合はどうするのか。
変数の . を ! に変更することで、 private なメンバになります。

この場合、アクセッサは自分で記述する必要があります。
また、デフォルトコンストラクタでは値を渡すことができません。

じゃあ、コンストラクタをオーバライドしてみましょう。

これでもダメでした。
blessの時点で値が入ってこないみたい。

それなら、blessした後に private なメソッドを介して値を渡してやればいいんじゃないか。

イケました。
private なメソッドはメソッド名の前に ! をつけます。
インスタンスから実行しようとしてもちゃんと syntax error になりました。

アクセッサをオーバライドする

アクセッサをオーバーライドしてdieするなどして、アクセスできなくしちゃう方法もあります。
この場合、コンストラクタはデフォルトでいいので便利かも。
クラス内からメンバ変数にアクセスする場合に . でアクセスするとオーバライドしたメソッドが呼び出されてしまうので、 ! でアクセスするのが注意点。


[2016/11/06追記]

BUILDで書く

ご指摘いただきました。公式でちゃんと書かれてますね。

submethod BUILD で private なフィールドに値を設定できます。
ご指摘&URLのご紹介ありがとうございます。
newをオーバーライドするのは、どうしても固定長引数にしたい時など限定的な場合のみにした方がよさそうですね。