日々常々

ふつうのプログラマがあたりまえにしたいこと。

Gradleでテストしたらcommitする

commit自体はgradle-gitプラグインで一瞬。

import org.ajoberstar.gradle.git.tasks.*
buildscript {
  repositories { mavenCentral() }
  dependencies { classpath 'org.ajoberstar:gradle-git:0.2.3' }
}

task commit(type: GitCommit) {
  message = "こみっとー"
}

と build.gradle に書いて gradle commit を叩けばコミットできます*1。やったね!

テストしたらコミットしたい

task commit(dependsOn: test, type: GitCommit) {
  message = "こみっとー"
}

これでおk。


……流石に芸が無い。コミットコメントにテスト結果の集計をねじ込もうと思う。ちょっと探してみたけど集計したのが見当たらなかったので自分でカウントするよ。。。。
build.gradle 全文はこんな感じ。

apply plugin: 'java'

repositories() {
  mavenCentral()
}

dependencies {
  testCompile 'junit:junit:4.11'
}

test {
  ext.msg = ''<<''
  ext.res = [testCount:0, successfulTestCount:0, failedTestCount:0, skippedTestCount:0]
  afterTest { d, r -> res.each { it.value += r."$it.key" } }
  ignoreFailures = true
  doLast {
    msg << "${res.testCount} tests completed"
    if (res.failedTestCount > 0) msg << ", ${res.failedTestCount} failed"
    if (res.skippedTestCount > 0) msg << ", ${res.skippedTestCount} skipped"
  }
}

import org.ajoberstar.gradle.git.tasks.*
buildscript {
  repositories { mavenCentral() }
  dependencies { classpath 'org.ajoberstar:gradle-git:0.2.3' }
}
task add(type: GitAdd)
task commit(dependsOn: [clean, test, add], type: GitCommit) {
  message = test.ext.msg
}

もっとスマートにできるはず(´・ω・`)

*1:gitのユーザー名とかはglobalから持ってかれた

受け取った言葉の価値を自分で決める

言葉の価値は受け手が決めるもの。

金言と言われる言葉であっても、共感したとか勉強になったとかためになったとか言われるものであっても、決めるのは読んだ人です。多くの人の評価がどうだからと言って、周りは関係ありません。他の人の意見を聞くことで、見落としていた価値に気付ける可能性はあるかもしれませんが、その程度の参考情報としてみるのが良い。
ある言葉から何も得られなかったなら、それは受け手の責任です。
受け手にとって当たり前のことに思えた、つまりそこに差異を見出せなかった。もしくは差異を価値の無いものと判断したと言うことです。万人に価値が無いなんてことはあり得ません。思うのはその人の勝手ですが、あくまで「そう思った人がいる」でしかないです。だから「自分の言葉に価値なんて無いんじゃないか」なんてよくわからない自己評価で、情報の発信を思い止まるべきではないはず。

情報の流量は爆発的に上がっていて、似たような情報を見つけることは容易です。だから「この話、前にどこかで見た」まで思うのはよくあることで、だからといって「だから価値がない」なんてことにはなりません。膨大な情報量のなかで埋もれてしまうものも多いので、繰り返される借りてきたような言葉でも、その場で発せられていると言うところに価値は無くはありません。
もちろん、そのせいでノイズが増えると言う面もありますが、もはや今更です。情報の多くを手に入れに行っていたのも昔で、特化した情報を除いて、多くの情報は入ってくるものをどうフィルタリングするかに変わっています。そんな中でノイズを減らそうと努力しても無駄な話で、価値が無いとかノイズだとかなんて気にせずに発するべき。


「しょーもないこと」や「こまかいこと」とかの前置きは要らないんじゃないかなと。言葉の価値は様々だし、変に予断させるような言葉は付け加えないほうが、言葉そのものは響きそうだし。手土産の「つまらないものですが……」に似てる気もするけど、これらの前置きは謙譲とかじゃなく「自信のなさ」から来ていそうなので別の話です。
自分が聞いた言葉の価値は、自分で決める。他の人でも、発した人ですら決められるものでは無い。

AutoCloseableでなくてもtry-with-resourcesがしたい

2013年にリリースされる予定のJavaSE8に入る内容を書いてます。Early Draft Review 2です。まだ変わるかもしれません。「違ったじゃん」と言われても知りません。……って注意書き要るかなぁ。

発端

「AutoCloseableを実装していないクラスにtry-with-resourcesを使うラッパ」が紹介されてた。で、Lambda後ならmethod referenceで出来そうだなと思ったわけです。

やってみた

こんなクラスがあって。

class Disposable {
    void dispose() {
        System.out.println("dispose!");
    }
}

こんな感じで。

public class Hoge {
    public static void main(String... args) throws Exception {
        Disposable obj = new Disposable();
        try(AutoCloseable ac = obj::dispose) {
            System.out.println("try!");
        } finally {
            System.out.println("finally!");
        }
    }
}

コンパイルして実行。

$ java8c Hoge.java 
$ ls
Disposable.class	Hoge.class		Hoge.java
$ java8 Hoge
try!
dispose!
finally!

うん、できた。ごく普通。

感想

素直に出来てコード量もごく僅かで済んでます。
せっかくtry-with-resourcesでリソースの変数のスコープがtry内になってたんだけど、これをやろうと思うと変数をtryの外に出さなきゃいけない。でもそんな問題にもならないし、使えなくはなさそう……かな。