「仕事は楽しいかね?」を読んだ

仕事は楽しいかね? (きこ書房)

仕事は楽しいかね? (きこ書房)

Prime Reading で無料だったので読んでみた。

悪くはないと思うのだが、それほど刺さるものでもなかった。

評判がよかったので、期待値が高かったからかもしれない。

どういう層がターゲットなのかはわからないけれど、読むタイミングによっても受け取り方は違ってきそう。

なんとなく、この本で語られているような内容は、違う道でインプットしてきた気がする。

仕事は楽しいかね?」という問に対し、「まぁ、それなりに」と答える程度には楽しんでいるので、あまりこの本は向いていなかったのかもしれない。

Gradleプラグインを作ってみた #groovy #gradle

概要

これまでMavenを中心に使ってきたんだけど、今のチームではGradleを採用している。

Gradle始めて使ってみてるので、試しにプラグインを作ってみた。

どんなプラグイン

github.com

ざっくりいうとただ指定したディレクトリ配下にあるSQLファイルを実行するだけのプラグイン

SQLファイルは構成管理に乗せるようなやつはFlywayなりで扱うと思うんだけど、構成管理に乗らないようなテストデータとかを流すやつがあったら便利じゃないかなと思ったのがきっかけ。

まぁすでにもっと便利なものがどこかにありそうだし、その程度のものならわざわざプラグインにしなくてもいいと思うけど、練習の意味もあるし作りたいから作ったという感じ。

GradleのプラグインポータルにもPublishしてある。

Gradle - Plugin: red.sukun1899.wanko

ハマったところ

JdbcDriverの依存は利用側で設定するようにしたかったのだが、プラグイン側でClassNotFoundExceptionが発生してしまった。

結局後述のリンクを参考に、build.gradleを読み込んでロードするようにした。

def loader = Sql.classLoader
project.buildscript.configurations.classpath.each { File file ->
    loader.addURL(file.toURI().toURL())
}

こんな感じ。 当該コードは下記。

wanko-gradle-plugin/WankoRunTask.groovy at master · su-kun1899/wanko-gradle-plugin · GitHub

参考にしたのは下記。

テスト

テストは下記スライドがとても参考になった。

テストを書いてGradleプラグインの開発効率を改善しよう

JJUG CCC 2018 Fall で登壇してきました #jjug_ccc #ccc_e4

JJUG CCC 2018 Fall にて「複雑なドメインに泥臭く立ち向かう」というタイトルで登壇してきました。

JJUG CCC での登壇は1年ぶりです。

セッション概要

www.java-users.jp

当日の資料

speakerdeck.com

前回登壇したときのブログ

su-kun1899.hatenablog.com

登壇を終えて

今回はスポンサーセッションとして話す機会をもらえました。

正直そんなにキャッチーなテーマじゃないと思っていたし、聞きに来てくれる人いるか不安でした。

それがまさか一番大きな会場になりあんなに人が来てくれるとは。。ありがたい話です。

こんなに大勢の人の前で話すことはこの先もそうそうないのではないか。

緊張の様子。

肝心のセッションの内容ですが、結構言いたいことを好き勝手に行った感じです笑

  • データと情報という切り口でモデルを捉えている話
  • 命名
  • モブプロの落とし穴

といったあたりはどこかで話せたらなぁと思っていたので、発表できてよかったです。

資料のレビュー等々、いろいろ協力してくれたチームメンバーには感謝してもしきれません。

今回の発表で心がけたこと

今回はこれまでの登壇とはアプローチを変えてみました。

今までは資料に割と全部情報を載せている感じだったのですが、「資料を読めばわかることは、資料を読めばいいだけになってしまうので、わざわざ聞きに行かなくてもいい」と同僚のアドバイスを受けてたしかになぁ、と思ったのがきっかけです。

なので資料だけでは伝わらないかもしれないけれど、話す内容と資料とセットで、その場に来てくれた人に一番伝えたいことが伝わることを心がけて話す内容や資料を整理しました。

結果を計測することはできませんが、Twitterや懇親会等でポジティブな反応をもらえたので、個人的にはよかったかなと思っています。

その他

どうしても発表があると心がフワフワして他のセッションになかなか集中できないのですが、下記のセッションはとてもよかったです。

www.slideshare.net

speakerdeck.com

なんだか最近DDDのキーワードもよく聞く気がするし、設計論的なのがトレンドなのかな?

Gopher道場卒業式でLTしてきました

mercari.connpass.com

11月から4回に渡ってメルペイさんの主催するGopher道場に参加して、12/3に卒業式でLTしてきた。

業務でやらない言語を実践的に学ぶ機会はなかなかないので、大変貴重でありがたかった。

課題に手が回りきらなかったのが悔やまれるが、自学で粛々とやろうかなと思う。

LTはネタがないなぁと悩んでいたんだけど、FAQの内容をJavaと絡めてみた。

クオリティはともかく、Javaと絡めたことでJavaの人と認識され、懇親会でも声かけてもらえたりした。

Javaにいつも助けられてます。最近書いてないけど。

speakerdeck.com

CircleCIをローカルで動かす #CircleCI

概要

circleciのCLIをインストールするとローカルで動かせるようになります。

公式 を見ながらやってみた

インストール

Macだとbrewで入れられる。

$ brew update
$ brew install circleci

brewで入れるとUpdateコマンドは使えないらしい。

$ circleci update check
`update` is not available because this tool was installed using `homebrew`.
Please consult the package manager's documentation on how to update the CLI.

APIトークンの取得

ここからAPIトークンを発行する

設定

setupコマンドを使う。

$ circleci setup
✔ CircleCI API Token: ****************************************
API token has been set.
✔ CircleCI Host: https://circleci.com
CircleCI host has been set.

使い方

基本的にプロジェクトルートで行う。

ただしconfig.ymlのパスをオプションで渡すことはできる。

config.ymlのバリデーション

$ circleci config validate
Config file at .circleci/config.yml is valid.

Jobの実行

単一のJobしか実行できないようだ。

workflowとかは多分無理。

キャッシュやartifactの保存など一部は対応していないっぽいログが出る。
(でもビルドは通る)

Job名はオプションで指定するが、デフォルトだとbuildになってる模様。

$ circleci build --job build

デバッグ実行

buildコマンドとの違いはよく分からない。

helpには出てこないが、buildコマンドのオプションも渡せそうな雰囲気がある。

$ circleci local execute --job build

ヘルプ系

コマンドのヘルプ

$ circleci --help

各コマンドのヘルプ(下記だとbuild)

$ circleci help build

バージョン

$ circleci version

テスト用のDBをdockerで立てるGradleタスクを作る #Gradle

概要

テストでDBを別立てするような場合に、CI上ではCI環境側で提供するデータベースを利用するが、ローカル開発時のテストDBの用意がめんどくさい。

なので、コンテナDBをテスト時に立ち上げるタスクを作ってみる。

build.gradle

task setupTestDatabase(type: Exec) {
    commandLine 'docker'
    args = [
            'run',
            '--rm',
            '--name', 'continer_name',
            '-e', 'POSTGRES_USER=user_name',
            '-e', 'POSTGRES_PASSWORD=user_password',
            '-e', 'POSTGRES_DB=db_name',
            '-p', '5432:5432',
            '-d', 'postgres:10'
    ]
    doLast {
        logger.info 'database started.'
    }
}

task cleanupTestDatabase(type: Exec) {
    commandLine 'docker'
    args = ['stop', 'continer_name']
    doLast {
        logger.info 'database stopped.'
    }
}

task localTest(dependsOn: [setupTestDatabase, test]){
    doLast {
        println 'test completed.'
    }
}
test.mustRunAfter setupTestDatabase
localTest.finalizedBy cleanupTestDatabase

解説

./gradlew localTest で実行できるタスクを用意している。

タスクの中で行われるのは下記。

  1. dockerでPostgreSQLのDBコンテナを起動
  2. testを実行
  3. コンテナを停止

補足

  • Execを使うとコマンド実行できる
  • dockerは --rm を付けることで、停止時にコンテナを破棄する
  • dependsOnでDBの構築とテストのタスクを束ねる
  • mustRunAfterで依存タスクの順序を制御する
  • finalizedByでコンテナを停止する

その他

  • doLastがないと、タスクの終了を待ってくれないようだ
  • testでコケるとfinalizedByが実行されない

参考

What's New in Kotlin 1.3をさらっと眺めてみた #kotlin

What's New in Kotlin 1.3 - Kotlin Programming Language

↑をサラッと読んだ

  • contract構文ができた?
    • 🙄スマートキャストが便利になったみたいだけどよく分からん。。
  • whenの条件で変数代入ができるようになった
  • @JvmStatic@JvmField がinterfaceのcompanion objectで使えるようになった
    • 🙄うれしみはよく分からん
    • 🙄インターフェース内定数が宣言できるようになったってことかな?
  • アノテーションクラスの中にインナークラス、インターフェース、Enumが定義できるようになった
  • main関数の引数が省略可能になった。
  • FunctionTypeが引数を42個まで受け取れるようになった。
    • 🙄そんなに必要なのん。。?
  • progressiveモードができた
    • 🙄破壊的変更を厭わない人のためのコンパイルモード?
  • インラインクラスができた(実験的)
    • 🙄プロパティ一つだけのクラス?
    • 🙄最適化が積極的になされるっぽさ
  • 符号なし整数型ができた(実験的)

標準ライブラリ

  • マルチプラットフォームのランダムができた
    • java.util.Randomkotlin.random.Random
  • isNullOrEmpty/orEmptyの拡張関数ができた
  • array.copyIntoができた
  • keyのリストからMapを作れるassociateWithができた
    • 🙄valueだけ返せばMapになるっぽ
  • CollectionにifEmptyとifBlankができた
  • リフレクションでsealedクラスに触るAPIができた?
    • 🙄sealedクラスってなんだったけか
    • 🙄Enumの拡張版?

小さな変更

  • BooleanがCompanionを持つようになった
    • 🙄TRUEとかFALSEとかかな?
  • Any?.hashCode() はnullの場合0を返す?
  • CharにMIN_VALUE/MAX_VALUEの定数ができた
  • プリミティブ型のCompanionにSIZE_BYTESとSIZE_BITS定数ができた