Slackの勢いをグラフにしてくれる君を作った

github.com

https://raw.githubusercontent.com/matsu-chara/slack_ikioi_png/images/all.png

分報チャンネルが社内で話題なので流量を可視化することで仕事の集中度となんかリンクしてるのかなーと思って雑に作りました。 22~0時とかに山がありますがその辺は仕事してるのではなくて帰宅後雑談タイムだなーとかが分かります。

ruby力がなさすぎてrubocopに怒られまくった(;´Д`)

KafkaMeetup Japan#1 で発表しました

Apache Kafka Meetup Japan #1 at Yahoo! JAPAN - connpass

www.slideshare.net

ザクザクとした発表になりましたが、これからKafkaを導入しようとか今導入してますという人たちにとって役立つ情報になると良いなと思っています。

RAIDについては、カーネルパニックにしちゃえば良いのではという意見も頂き色々進捗しそうです。 Brokerのヘルスチェックと組み合わせてやりたい・・メトリクスの可視化もしたい・・。

Scala研修テキストも公開されているので、 今回のも含めて、お仕事でやっていることが大体外部に公開できていることになりました。

こういう感じでオープンに仕事できるというのは良いことですね₍₍ (ง´・_・`)ว ⁾⁾

ansible.cfgにask_vault_pass = Trueを設定したいけど毎回パスワード聞かれたくないとき

ansible.cfgにask_vault_pass = Trueを設定したいけどそうすると必要なとき以外もvaultパスを聞かれてつらいのをなんとか回避する

ansible-vaultで暗号化したファイルをansible-playbookコマンドなどで使いたい場合は

ansible-playbook --ask-vault-pass -i ... site.yml

のように--ask-vault-pass を指定する必要がありますが、人類なので容易に指定を忘れ、 ERROR: A vault password must be specified to decrypt のように追い返されたりします。

このようなミスを防ぐためにAnsible Vault を賢く使うで紹介されているようなテクニックが利用できます。

具体的には、ansible.cfg

[defaults]
ask_vault_pass = True

と書くことで、--ask-vault-pass を指定しなくてもvault passwordが聞かれるようになります。

(vault_password_file=/path/to/password/fileを書くとpassword入力自体もショートカットできますが、 機密情報ファイル管理という別の問題が発生するので今のところ使っていません。)

ところが上記のansible.cfgを設定すると

ansible -i ... all -a "echo hello"

のような暗号化ファイルの復号化が必要ないコマンドに対しても毎回vault-passが聞かれるようになります。 (聞かれるが、decrypt自体は行わないので、"a"とか空白とか入れてもコマンドが実行されるという仕様・・・。)

これが少し面倒なのでansible.cfgに上記設定をいれるか迷っていましたが、

ANSIBLE_ASK_VAULT_PASS= ansible -i ... all -a "echo hello"

のようにansbile.cfgの設定を上書きしてask_vault_pass指定を一時的になかったコトにできるらしいので、暗号化が必要ないコマンドではこれを実行することにしました(若干面倒だけど・・・。)

super.preRestartの位置でライフサイクルメソッドの呼ばれる順番は変わる - akka

akka 2.3.13です。

preRestartの中のどの位置でsuper.preRestart(..) を呼ぶかによって微妙に処理の順番が変わって辛かったのでメモします。

gist.github.com

コメントのとおりですが、

最初にsuper.preRestartを呼ぶとpreStart -> postStop -> preRestart 最後にsuper.preRestartを呼ぶとpreStart -> preRestart -> postStop の順番で処理されるようです。

これはclass ActorのpreRestartの実装の中でpostStopメソッドを呼んでいることが原因です。 つまり下記コメントの一でpostStopが呼ばれています。

override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
    super.preRestart(reason, message) // <-- ここでpostStopが呼ばれている
    println("preRestart")

当然super.preRestart(..) の位置をずらしてしまったら先にpreRestartの処理が走ってしまいます(◞‸◟)

さらに選択肢としてはsuper.preRestartを呼ばないことにより「postStopを処理しない」みたいなことも可能です。 postStopを呼ばない動機はよく分かりませんが、前回の記事で super.postRestartを呼ばないことによりpreStartを処理しないみたいなパターンが出てきたので、それと同じような応用法があるかもしれません。

言われてみれば当たり前ですがちょっと柔軟すぎる気がするんですがなれたらいい感じなんですかね(´;ω;`)

actor内で特定のExceptionが投げられることをテストしたいときはEventFilterを使おう - akka

akka 2.3.13です

KillされたことをテストしたくなったのでググったらEventFilterなるものが出てきました。

Testing Actor Systems — Akka Documentation

なんとログを見て特定の例外ログが出ているかどうかを見るもののようです。ゴリ押してますね。 使い方は公式のとおりなので書くまでもないですが、下のように書けます。

import akka.testkit.EventFilter
import com.typesafe.config.ConfigFactory
 
implicit val system = ActorSystem("testsystem", ConfigFactory.parseString("""
  akka.loggers = ["akka.testkit.TestEventListener"]
  """))
try {
  val actor = system.actorOf(Props.empty)
  EventFilter[ActorKilledException](occurrences = 1) intercept {
    actor ! Kill
  }
} finally {
  shutdown(system)
}

ログの設定を設定ファイルでやりたい時はtest/resources/application.conf などでやればOKです。

TestProbeでも良い?

Killされたことがテストできたら最高だったのですが、よく考えたら止まっていることがわかればまあいい感じだと気づいたので Testing Actor Systems — Akka Documentationにあるように TestProbe経由でTerminatedを観測してやれば良さそうでした。

val p = TestProbe()
probe watch target
target ! Kill
probe.expectTerminated(target)