2018年の振り返り

今年も今日で仕事納めなので1年の振り返りを書いてみたいと思います。

f:id:takezoe:20181228085429j:plain

Arm Treasure Dataに転職しました

前職であるビズリーチでは割と自由にやらせていただいていたのですが、先のことも色々考えないとなと思っていたところ(とは言っても積極的に転職活動していたわけではないのですが…)縁あって今年の8月にトレジャーデータに転職することになりました。

takezoe.hatenablog.com

takezoe.hatenablog.com

今のところはPresto、Sparkやその周辺のツール・ライブラリ開発などをメインでやっています。チャレンジングな課題が多く、英語力に関しても日々鍛えられていますw チームメンバーも猛者揃いで学ぶことばかりの日々ですが、少しでも多く貢献していけるよう努力していきたいと思います。

英語学習について

元々続けていたのですが、トレジャーデータへの転職もあり、英語学習に使う時間が一気に増えました。オンライン英会話をやりつつ、書籍やスマートフォンアプリなどを使ってボキャブラリを強化するという感じでやっていますが、まだまだ厳しいです。会話を追いかけるだけでも集中力が必要なので短時間のミーティングでもかなり消耗を感じます。

まあ、人間追い詰められたらやらざるを得ないというのはそうなのですが、あまり追い詰められすぎると精神衛生上も良くないですし、他の人にも迷惑がかかるので、追い詰められなくても済むのであればそれに越したことはないです。というわけで英語は余裕がある時にちゃんと勉強しておくと良いと思いますw

OSSなどの個人活動について

前半はAlpakkaにいくつか新機能をコントリビュートしたりといった活動ができていたのですが、後半は転職していっぱいいっぱいだったということもありあまりアクティブな活動はできませんでした。GitBucketもついに月一のリリースペースを崩してしまいました。

takezoe.hatenablog.com

takezoe.hatenablog.com

とはいえ、台湾で開催されたJCConf 2018や、Scala関西サミット2018で登壇の機会をいただいたり、PredictionIOのAPIサーバをSprayからAkka HTTPに移行したりと、それなりに活動はできたのではないかと思います。

takezoe.hatenablog.com

github.com

あと、以前書いたJavaの書籍の改訂作業を行なっています。できれば転職前に終わらせておきたかったのですが、Java 11のリリース時期の関係もあり現職に持ち越してしまいました。まだ作業中ですが、来年春頃発売されると思います。

まとめ

歳のせいもあってか体力的にもしんどい感じになってきてしまったので、2019年は外向けの活動は少し控えめにして、できるだけ業務に集中する時間や、英語学習に使う時間を増やしたいと思っています。OSS活動も今までと違って仕事と関係ないものに手を出す余力はあまりなさそうなので、注力するものをある程度絞っていかないといけないと思います。もちろんGitBucketは今後も続けていくつもりです!

GitBucket 4.30.0をリリースしました

Scalaで実装されたオープンソースのGitサーバ、GitBucket 4.30.0をリリースしました。

https://github.com/takezoe/gitbucket/releases/tag/4.30.0

ChangeLogの自動生成

リリースの作成時にGitのコミットログから直前のタグとの間の更新履歴を自動生成できるようになりました。"Insert ChangeLog"というボタンをクリックするとリリースの説明文にコミットの一覧が挿入されます。直前のタグは手動で選択することも可能です。

f:id:takezoe:20181215100240p:plain

Web APIの追加

以下のWeb APIが新たに追加されました。

Gistプラグインでのグループのサポート

Gistプラグインでグループのスニペットが作れるようになりました。

f:id:takezoe:20181215100307p:plain

Markdownでのチェックボックス表示

Markdown中に以下のような記述があった場合、IssueやPull requestではチェックボックスとして表示されていましたが、Gitリポジトリ内のMarkdownファイルでは表示されていませんでした。このバージョンからはdisabledなチェックボックスとして表示されるようになりました。

- [ ] checkbox1
- [ ] checkbox2

f:id:takezoe:20181215103848p:plain

タイムラインからリリースページへのリンクを表示

アクティビティのタイムラインからリリースページへのリンクが表示されるようになりました。

f:id:takezoe:20181215103927p:plain

プラグイン向けの新しい拡張ポイント

プラグイン向けに新たにanonymousAccessiblePathsという拡張ポイントが追加されました。この拡張ポイントによってプライベートモード(アクセスするには必ずログインが必要)で運用されているGitBucket上での認証不要のページをプラグインから提供できるようになります。

今回のバージョンではこの他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

Akka Streamsで簡単にリトライするFlowを作る

akka-http-contribというリポジトリRetryというユーティリティがあり、リトライ処理が簡単に書けるようだったので試しに見てみました。

github.com

テストケースによると使い方はこんな感じです。

def flow[T] = Flow.fromFunction[(Int, T), (Try[Int], T)] {
  case (i, j) if i % 2 == 0 
    => (Failure(new Exception(“cooked failure”)), j)
  case (i, j)
    => (Success(i + 1), j)
}
val (source, sink) = TestSource.probe[Int]
  .map(i => (i, i))
  .via(Retry(flow[Int]) { s =>
    if (s < 42) Some((s + 1, s + 1)) // recover
    else None // give up
  })
  .toMat(TestSink.probe)(Keep.both)
  .run()

Retry.apply()は以下の2つのパラメータを取ります。

  • リトライさせたいFlow。このFlowTrySuccessまたはFailure)を返すように実装しておく必要があります。
  • 失敗した時のリカバリ用関数。この関数はOptionSomeまたはNone)を返すように実装しておく必要があります。

FlowFailureを返した場合、リカバリ用の関数が呼ばれるという仕組みです。リカバリ用の関数がSomeを返した場合はその値でリトライされ、Noneを返した場合はリトライをギブアップします。

簡単なものですが、処理に失敗する可能性のあるフローをシンプルにリトライ可能にしたい場合には便利なユーティリティだと思います。akka-stream-contribにはこの他にも便利なユーティリティがあるようなのでAkka Streamsを使っているのであれば一度チェックしてみるとよいと思います。

SONYのオープンイヤー型イヤホンSTH40DJPを買ってみた

以前ビデオ会議の際にオープンイヤー型のイヤホンなら自分の声も聞こえて便利という話を聞いていたのですが、最近自分もオンラインミーティングや英会話をやる機会が多いので購入してみました。

実際に使ってみると、イヤホンで音を鳴らしたまま周囲の音がちゃんと聞こえるというのはなかなか新体験です。思っていたより音質もいいですし、音漏れも気になりません。ただ、当然ですが電車など騒音の大きな場所ではその音もそのまま聞こえるので打ち消されてイヤホンの音が聞こえなくなります。

イヤホン自体は見た目より軽いのですが形状が独特なので合う合わないはあるかもしれません。ずっとイヤホンを鳴らしていても聴き疲れ感はないのですが、自分は耳がちょっと痛くなる感じがあります。また、マイク内蔵のリモコンがついており、自分の使っているAndroidスマートフォンでは再生・停止、ボリュームの増減がちゃんと機能しました。

騒音の多い通勤電車や集中したい場合はこれまで通りSHUREの弾丸イヤホン、オンラインミーティングや英会話、仕事中などはこちらと使い分けてみたいと思います。

ワイヤレス版もあり、こちらならイヤホンをつけたまま家の中を移動できそうです。が、お値段が大分張ります…。オープンイヤー型に限らず、左右分離型のワイヤレスイヤホンは今だとちゃんとしたものを買おうとするとこのくらいの価格帯になる感じなのでもう少し様子見ですかね…。

Scala関西Summit 2018に参加しました

11月10日(土)、11日(日)の2日間に渡り大阪で開催されたScala関西Summit 2018に参加してきました。

上記のツイートの通り、今年も昨年に引き続きGitBucketでスポンサーさせていただくとともに、ありがたいことにスピーカーとして「長期的にメンテナンスの必要なScala製アプリケーションにおいて気をつけるべきこと」という発表をさせていただきました。発表資料は以下になります。

www.slideshare.net

現実と向き合うような内容になってしまったかもと思いますが、仕事で8年以上Scalaを使ってきての現在の率直な感想です。転職して自分の立場がこれまでとは大きく変わったこともあり、振り返りの意味も込めて発表させていただきました。

最後の方で少しだけ、トレジャーデータではAirframeというDIコンテナを中心としたライブラリに必要な機能を集約することでメンテナンスの必要な箇所を局所化しているという話をさせていただきました。もちろんすべてをAirframeでカバーできているわけではありませんしが、Scalaのバージョンアップにきちんと追従していくための1つの現実的な戦術なのではないかと思います。

全体としてはAkka関連のセッションが多かったのと、ZOZOさんがhttp4sを使っているというのがちょっと驚きでした。個人的には@smdtmsさんのDatabricksのセッションも興味深く聴講させていただきました。

2日目のアンカンファレンスにも参加させていただいたのですが、OSSハッカソンは簡単にできそうなものでとにかくPRしてみようという感じで一応ゴールまではたどり着くことができたものの、もう少し時間をかけて難しいイシューに取り組んでもよかったかも知れませんね。また、@grimroseさんがAirframeハンズオンを開催してくださっていました。ありがとうございました^^;

f:id:takezoe:20181114213551j:plain

昨年は朝一のセッションでの登壇にも関わらず気合いの日帰り弾丸ツアーだったのでだいぶしんどかったのですが、今年は2daysということもあり、前日入りして2泊するという余裕ある日程で参加できたので、いろんな方とお話しできたり、ちょっとだけ観光っぽいこともできて良い気分転換になりました。

ScalaMatsuriが海外で開催されているScalaカンファレンスに引けを取らない国際カンファレンスとして成長している一方、Scala関西Summitはまた違った温かみのあるカンファレンスだと感じています。この素晴らしい雰囲気のカンファレンスがまた来年も関西で開催されることを願ってやみません。

Scalafixで未使用のインポート文を削除する

Scalaで未使用のインポート文を自動で消せないかという話があり、Scalafixだとできそうだったのでやってみました。

github.com

ドキュメントに書かれている通りでいけるのですが、手順をまとめておきます。

まずはproject/plugins.sbtにsbtプラグインを追加。Scalaのバージョンによって使用するsbtのバージョンが違うので注意してください。

addSbtPlugin("ch.epfl.scala" % "sbt-scalafix" % "0.9.0")

とりあえずこれだけでScalafixを使えるようにはなるのですが、未使用のインポート文を削除するには追加の設定が必要です。build.sbtに以下の設定を追加します。

addCompilerPlugin(scalafixSemanticdb),
scalacOptions ++= List(
  "-Yrangepos",
  "-Ywarn-unused:import"
)

これでsbt "scalafix RemoveUnused"を実行すると未使用のインポート文が削除されます。

また、プロジェクトのルートディレクトリの.scalafix.confというファイルでデフォルトで実行するルールを指定することができるので、以下のような設定をしておくとsbt scalafixと入力するだけで未使用のインポート文を削除できるようになります。

rules = [
  RemoveUnused
]

ちょっと設定が面倒ですし、sbtプラグインだけでなくコンパイラプラグインも必要になります。また、Scala.jsプロジェクトでは動作しないという問題もあるのですが、未使用のインポート文を消す以外にもProcedure Syntaxの自動修正や指定した構文を利用禁止にする機能もあるのでこれらの機能にメリットを見い出せるのであれば導入するのもありかもしれません。

なお、Play FrameworkなどでTwirlを使用している場合、-Ywarn-unused:importオプションを有効にするとコンパイル時に大量の警告が出力されてしまいます。こちらで紹介されているように、

TwirlKeys.templateImports := Seq()

を指定して自動インポートをしないようにすれば警告も出なくなるのですが、この場合はTwirlがデフォルトでインポートしてくれているHtmlなども明示的にインポートしないと使えなくなるのでかなり不便な気がします。こういう点も考えると未使用のインポート文の削除のためにScalafixを導入するのはやや微妙かなというのが個人的な印象です。

実践Scala入門

「実践Scala入門」を技術評論社さんからお送りいただきました。Scalaの入門書というとコップ本を思い浮かべる方が多いと思いますが、下のツイートでも書いている通りこの本はかなりコンパクトです。

A5判本文300ページ弱という分量でScalaの基本的な部分を押さえつつ、sbt、Futureを使った並行プログラミング、ユニットテスト(ScalaCheckによるパラメータテストやMockitoを使ったテストまで!)などもカバーされています。また、さすがScalaを使い込んでいる著者陣だけあってScalaの各機能の使い方だけでなく、注意事項やどのように使うと便利なのかなど、実用的な内容も詰め込まれています。

もちろん他の言語でのプログラミング経験がある、実用的なプログラムを書くには別途Javaライブラリなどの知識が必要になるといった前提や、関数型プログラミングやアドバンスドな機能に敢えて触れないことでトピックを絞っている側面はありますが、それにしても一切無駄がないという表現がぴったりの、まさに「コンパクトなコップ本」というコンセプト通りのScala入門書になっています。

なお、巻末でScalaの日本語書籍としてScala逆引きレシピやScalaパズル、またWebフレームワークとしてScalatraを紹介していただいています。 Scala逆引きレシピは内容的にだいぶ古くなってしまっているので改訂できるといいなと思っているのですが、Scala 3も控えているのでまたタイミングが難しいところです。そういう意味ではこの「実践Scala入門」は成熟したScala 2.12系が全盛の非常に良いタイミングでリリースされたのではないでしょうか。

現状間違いなく日本語でのScala入門書の決定版といえる書籍かと思いますのでこれからScalaを初めてみようという方はもちろん、すでにScalaを使っている方も是非一度手に取ってみていただければと思います。

実践Scala入門

実践Scala入門