mike-neckのブログ

JavaかJavaFXかJavaEE(なんかJava8が多め)

複数の goroutine で処理をした結果を集計するようなタイプの goroutine pipeline

chansync.WaitGroupclose(channel) を駆使して組み立てる

f:id:mike_neck:20181121224358p:plain

package main

import (
    "fmt"
    "time"
    "sync"
)

var items = []string {
    "foo",
    "bar",
    "baz",
    "qux",
    "quux",
}

func main() {
    producer := make(chan string)
    consumer := make(chan string)
    var wg sync.WaitGroup
    for index := 0; index < 3; index++ {
        wg.Add(1)
        go worker(index, producer, consumer, &wg)
    }

    go func() {
        wg.Wait()
        close(consumer)
    }()

    go func() {
        for _, item := range items {
            producer <- item
            time.Sleep(130 * time. Millisecond)
        }
        close(producer)
    }()

    for item := range consumer {
        fmt.Println(item)
    }
}

func worker(num int, producer, consumer chan string, wg *sync.WaitGroup) {
    defer wg.Done()
    for item := range producer {
        consumer <- fmt.Sprintf("[worker-%d]%s[len: %d]", num, item, len(item))
        time.Sleep(300 * time. Millisecond)
    }
}

Pixela の Java クライアントを書いてみた

f:id:mike_neck:20190120230012p:plain
くさ

先月に合同勉強会 in 大都会岡山に行った時に、草を生やす Pixela というサービスが面白そうだったので、 Java のクライアントがないか探してみたところ、なさそうだったので作ってみました。

github.com

続きを読む

try-with-resources に複数のリソースを指定した場合の close の実行順

年末年始に書いていたコードで気になったことがあったので調べた。

f:id:mike_neck:20181019112748p:plain

結論だけ先に書くと、 try-with-resources に選択したリソースの順番の逆順になる。


Java9 以降で使えるようになった effevtively-final variables in try-with-resources の実行順がどうなるのかちゃんと理解していなかったが、 Java 言語仕様には書かれていた。

引用すると次の箇所

Resources are initialized in left-to-right order. ...

リソースは左から右の順番に初期化される

Resources are closed in the reverse order from that in which they were initialized. ... An exception from the closing of one resource does not prevent the closing of other resources.

リソースは初期化とは逆順にクローズされる。クローズ時に例外が発生した場合でも他のリソースのクローズに支障をきたさない

ここで、初期化すでにしているのではないかと思うのだが、続く 14.20.3.1 を読んで try-with-resources スコープの中での初期化のことなのかと思ったのだが誤解しているかもしれない。

14.20.3.1 の内容を一部だけ書くと、

try (autoCloseable) {

}

となっていたものは、一度次のような形に変換されるらしい。

try (final T resource = autoCloseable) {

}

というわけで、次のコードを jshell で動かして実験する。

try にて指定するリソースに 0 からの順番に名前をつける。一方、クローズする順番を 0 から数えていく。また、 4 番目(名前は 3)のリソースのクローズ時に例外を発生させる

この時に、仕様通りであれば、

int[] count = new int[] { 0 };

AutoCloseable autoCloseable(int num) {
  return () -> {
    System.out.println("num: " + num + " -> " + count[0]++);
    if (num % 4 == 3) {
      throw new Exception("num: " + num);
    }
  };
}

try {
  final AutoCloseable a0 = autoCloseable(0);
  final AutoCloseable a1 = autoCloseable(1);
  final AutoCloseable a2 = autoCloseable(2);
  final AutoCloseable a3 = autoCloseable(3);
  final AutoCloseable a4 = autoCloseable(4);
  try (a0; a1; a2; a3; a4) {
    System.out.println("action in try");
  } catch (final Exception e) {
    System.out.println(e.getMessage());
    throw e;
  }
} catch (final Exception e) {
  System.out.println("outer: " + e.getMessage());
} finally {
  System.out.println("finish");
}

これの出力結果は次のとおりとなった。

action in try
num: 4 -> 0
num: 3 -> 1
num: 2 -> 2
num: 1 -> 3
num: 0 -> 4
num: 3
outer: num: 3
finish

結論

try(r0;r1;r2 ...) と複数のリソースを指定した場合のクローズ実行順は逆順、つまり r2, r1, r0 の順番になる

合同勉強会 in 大都会岡山 にて 『Vim 入門』というタイトルで LT してきました #gbdaitokai

f:id:mike_neck:20181208195209p:plain
Vim 入門

2018/12/22 開催された 合同勉強会 in 大都会岡山 にて『Vim 入門』というタイトルで LT をしてきました。

gbdaitokai.connpass.com

どうやら評判がよかったのか、 LT 枠での表彰は当初予定になかったようでしたが、審査員特別賞なるものをいただきました。


特別賞を頂いた LT の資料はこちらです。

www.slideshare.net

なお、詳細な内容は以前の記事に書いたとおりです。

mike-neck.hatenadiary.com

また、デモで使ったスクリプト等はこちらより入手可能です(ただし、 デモ中にちゃんとあげたやつですよという証跡が欲しかったので、 CodePipeline / CloudFormation でデプロイするようにしてあります。あと、 readme をメンテし忘れています)

github.com

また、僕の LT に対する反応は以下のまとめの 16 〜 17 ページあたりにまとめられています。

togetter.com


今回の LT は非常に良い反応を得られるできの良さでしたが、多分まぐれなので何が良かったのか反省しておきたいと思います。