ロンドンでエミレーツスタジアムツアーに参加してきました

Scala eXchange 2017参加のため13年ぶりにロンドンを訪れたわけですが、観光する時間があったので愛するアーセナルの本拠地エミレーツスタジアムのスタジアムツアーに参加してきました。

f:id:takezoe:20171218162223j:plain

スタジアムには巨大なショップが併設されており、ユニフォームを始めいろんなグッズが購入できます。試合のない日ですが休日ということもあり、多くの方が訪れていました。店員さんにキャプテン翼のキャラは日本語名だと発音しにくいからヨーロッパでは別の名前になっているんだよということを教えてもらうなどしました。

以下、スタジアムツアーの様子です。まずは来賓など偉い人たちが観戦するディレクターズボックス。リッチ。

f:id:takezoe:20171218162322j:plain

ディレクターズボックスからピッチを見たところ。さすが偉い人用、座席も一般客用のプラスチックの硬い椅子ではなくなんかフカフカしてます。

f:id:takezoe:20171218162503j:plain

無敗優勝のときのトロフィーが展示されていました。あれからもう13年も経つのか…。

f:id:takezoe:20171218162605j:plain

ホームチームのシャワールームにはお風呂がついてます。アウェーチームとの格差がすごい。

f:id:takezoe:20171218162658j:plain

シャワールームの先にはホームチームのロッカールームが。コンビを組む選手たちが隣になるように配置されているらしい。アウェーチームのロッカールームにはない座布団があります。柔らかいです。座っていても血行が良くなるらしい。

f:id:takezoe:20171218162827j:plain

こちらは攻撃陣。サンチェスとエジルは移籍してしまうのでしょうか…。

f:id:takezoe:20171218162917j:plain

Arsène Wenger's Office。

f:id:takezoe:20171218163045j:plain

広い。試合の前後はここでコーチ陣と相談したりするらしい。寒い季節、試合中ベンゲルが着ているダウンのコートがかけられています。

f:id:takezoe:20171218163210j:plain

選手たちはここを通ってピッチに向かいます。

f:id:takezoe:20171218163333j:plain

そしてついにピッチに!ちょうど雨が降ってきて椅子にビニールシートが被せられてしまい、監督席に座ることはできませんでした。無念。ちなみに監督やコーチ陣が座る座席は床暖房もついているらしい。ずるい。

f:id:takezoe:20171218163438j:plain

インタビューを受ける小部屋。部屋というよりボックスという感じで思ったより小さい。こんな感じの部屋がいくつか用意されていました。

f:id:takezoe:20171218163526j:plain

記者会見とかする部屋。座席はシアターのような感じで角度がついています。

f:id:takezoe:20171218163613j:plain

会見場の外にはプレスルーム。めっちゃ広いです。記者さんたちはここで速報を書いたりしているのかな。

f:id:takezoe:20171218163749j:plain

ということでツアー終了。エミレーツスタジアムは最新の大規模スタジアムなので見所が多く、客席で試合を見るのとはまた違った面白さがあります。ショップも充実していますし、ロンドンの中心部からも地下鉄で簡単にアクセスできるのでアーセナルファンの方は是非訪れてみるべきです。

ちなみにスタジアムツアーに参加するとミュージアムにも無料で入れたり、Arsenal駅方面からであれば旧ハイバリースタジアムの名残を残す住宅街も近いので散策してみるのもよいかと思います。

Scala eXchange 2017に参加してきました

f:id:takezoe:20171218053514j:plain

ロンドンで開催されたScala eXchange 2017でGitBucketのLTをさせていただきました。スライドは以下になります(口頭で話した部分を付け足すなどちょっと修正してあります)。今回もいろいろ反省が多く、修行しなくては…という感じでした。

www.slideshare.net

参加したセッションで記憶に残っているものを挙げておきます(1日目のセッションは自分の発表の準備してたのでほとんど記憶がありません)。

Leave Jala Behind: Better Exception Handling in Just 15 Mins

初日のライトニングトークScalaでの例外の扱い方について、Javaスタイルのtry〜catchブロック、Tryを使った方法、Exceptionsを使った方法を紹介していました。

Scalaでのエラー処理の方法はどうやるべきかというのは悩ましいところがある気がしますが、エラーの表現としてTryを使うのはともかくExceptionsのシンタックスシュガーを使うならtry〜catchブロックでいいんじゃないかなーというのが個人的な感覚です。

ただ、最近はScala界隈の話題は高度化しすぎているので、こういう入門者向けの話も定期的に出てくるといいなと思います。

Is ScalaC Getting Faster, or Am I Just Imagining It?

コンパイラ高速化の技術的な話かと思っていたのですが、ちょっと思ってたのと違いましたw 以下のようなことを話されていました。

  • Scala 2.12になってからすでに20%以上コンパイラのパフォーマンスは改善されており50%の高速化も夢ではない
  • 高速化のためにはベンチマークやプロファイリングが重要だけどコンパイラベンチマークやプロファイリングは難しい
  • scalacの高速化の成果はDottyにも還元される
  • 様々な人がコンパイル速度の高速化に取り組んでいるのでもしアイデアがあれば聞かせて欲しい、取り組みに参加して欲しい

技術的な話というよりは、どちらかといえばコミュニティ寄りの話だったのですが、パッションを感じる熱いセッションだったと思います。

Compiling Collections to SQL with Slick

今回はこのために参加したと言っても過言ではないほど楽しみにしていたSlickの開発者Stefan ZeigerさんによるSlickのQuery Compilerの解説セッション。内容的にはだいぶ前のものですが以下のスライドが近く、このスライドを現状にあわせてアップデートした感じでした。

http://slick.lightbend.com/talks/2014-03-04_LAMP/Slick%20Query%20Compiler.pdf

デバッグ用のオプションや、コンパイラのフェーズ、ASTの変換の様子がまとめられており、ノードの特殊なプロパティについても説明があり、これからSlickのソースを読んでみようという人には大変参考になる内容だったのではないかと思います。是非スライドを公開して欲しいです。

How to Name Things: The Hardest Problem in Programming

Peter Hiltonさんによるネーミングについてのセッションでした。

彼は結構前から同じような話をしているようですし、Scalaとも直接関係ある話ではないのですが(fishとかspaceshipみたいなASCIIアートオペレータはやめろという話はありましたがw)、特に良い名前付けのためにはボキャブラリを増やすことが重要という点は非常に刺さるものがありました。良いコードを書くためにはプログラミングテクニックだけでなく教養も必要ということですね…。

Composing Programs

Functional Programming in ScalaRed Book)の著者Rúnar Bjarnasonさんによる関数型プログラミングの基礎的な話でした。

スライドは以下のURLで公開されています。

https://www.dropbox.com/s/0l7r5o7tczzx57m/Compositionality.pdf?dl=0

最初に紹介する係の人が「FP in Scala持ってる人!」→みんな一斉に手をあげるからの「エクササイズ全部ちゃんとやった人!」→1人以外全員手を降ろすが面白かったです。

まとめ

去年のScala界隈ではFreeモナドがブームだったようですが、今年はTagless Finalが流行りみたいです(自分は今回はその手のセッションには参加しませんでしたが…)。他のセッションではShapelessやcirceといったライブラリの名前がよく登場しており、Scala界隈における関数型プログラミングの人気の高さを再確認しました。

Scala eXchangeは(ヨーロッパ開催のScala Daysを除けば)ヨーロッパ最大のScalaカンファレンスとのことで参加者数も多く、非常に熱気のあるカンファレンスでした。

Akka実践バイブル アクターモデルによる並行・分散システムの実現

Akka in Actionの日本語翻訳版である「Akka実践バイブル」がついに完成したとのことで翔泳社さんからお送りいただきました。ありがとうございます。

f:id:takezoe:20171212124409j:plain

実はこの本は2年ほど前に翻訳を検討していたのですが、当時まだ原著がアーリーアクセス中でいつ完成するかわからないという状態だったため見送ったという経緯があります(そのため同じく翻訳を検討していたScalaパズルに着手することになりました)。時は流れて今年のScalaMatsuriで@yugolfさんをお見かけし、当時Akka in Actionの読書会を主催されていたことから「Akka in Actionの翻訳しませんか?」とご相談させていただいたことが今回の日本語版発売のきっかけになりました。

自分としても数年越しの夢を形にしていただくことができ、翻訳者の皆さま、レビュアーの皆さまには感謝の気持ちでいっぱいです。分量もかなりある本ですので大変だったと思いますが、全編通して非常に丁寧に翻訳、レビューされています。また、単なる翻訳ではなく、Akkaの最新版にあわせた記述の修正や、Alpakka、JavaからAkkaを使う方法など日本語版独自の内容も含まれています。

Akkaがどのような思想で設計されているか、Akkaを使ったリアクティブシステムのデザインパターンなどについては実際にAkkaを使わない場合でも役に立つ内容なのではないかと思いますし、すでにAkkaを使っている方はもちろん、アクターモデルやリアクティブシステムのアーキテクチャについて学びたいという方は是非手に取ってみていただければと思います。

AWSの機械学習プラットフォームSageMakerを使ってみた

AWSの新サービスである機械学習プラットフォーム SageMakerを触ってみました。ざっくり言うとデータ処理、学習、作成したモデルをコンテナとしてデプロイするという一連の作業をAWS上で提供されるJupyter Notebookから行うことができるというものです。

aws.amazon.com

SageMakerで作成したJupyter Notebookには最初からいろんなサンプルがついているのでまずはこれらで動きを確かめてみました。

f:id:takezoe:20171206171818p:plain

データなどを準備した後、create_training_job()メソッドに必要なパラメータを渡すと自動的に必要なインスタンスが用意され学習が行われます。サンプルでは学習データはS3に置かれており、生成された予測モデルは指定したS3上のパスに保存されます。ちなみに独自のアルゴリズムを使用したい場合はDockerイメージを用意する必要があるみたいです。

同じくcreate_endpoint()メソッドでHTTPのPOSTメソッドでアクセス可能なエンドポイントができます。パラメータでインスタンス数を指定できるので冗長化はできるようですが、APIリファレンスを見た感じモデルを更新した場合などの再デプロイする場合はエンドポイントを一回削除して作り直すか、別のエンドポイントを作成する必要がありそう。

ダッシュボードにはこんな感じでノートブック、学習ジョブ、モデル、エンドポイントの状態が表示されます。

f:id:takezoe:20171206172133p:plain

これらのワークフローに乗るためにはSageMakerのライブラリの使い方を覚える必要があります。デフォルトで付属しているサンプルや以下の開発者ガイドに目を通しておくとよいと思います。

docs.aws.amazon.com

ただ、必ずしもSageMakerのワークフローに乗らなくてもよいのかもしれません。たとえば入力データをAthenaから持って来たり、SageMakerのジョブを使わずに学習を行うということもできそうです。AWS上のリソースを活用するためのマネージドなJupyter Notebookとして使うのもありかもしれません。

GitBucketプラグインの開発をサポートするsbtプラグインを作りました

少し前からこんなsbtプラグインを作っていたのですが、使えそうな感じになってきたので紹介記事を書きたいと思います。

github.com

このプラグインはGitBucketプラグインのsbtプロジェクトに以下の機能を提供します。

使用するにはproject/plugin.sbtに以下の記述を追加します。

addSbtPlugin("io.github.gitbucket" % "sbt-gitbucket-plugin" % "1.2.0")

build.sbtにはGitBucketのバージョンのみ指定すればOKです。

gitbucketVersion := "4.19.0"

GitBucketはプラグインのオートリロード機能を持っているので、ローカルでGitBucketを立ち上げた状態でプラグインソースコードを編集したらsbt installを実行すればプラグインの動作確認を行うことができます。GitBucketを再起動する必要もありませんし、セッションも切れないので結構快適に開発ができると思います。

sbt install<HOME>/.gitbucket/pluginsディレクトリにプラグインのjarファイルをコピーしますが、環境変数GITBUCKET_HOMEシステムプロパティgitbucket.homeが設定されている場合はそちらを優先します。また、完成したプラグインをリリースする場合はsbt assemblyで生成されたtarget/scala-2.12/<プロジェクト名>-assembly-<バージョン番号>.jarを配布すればOKです。

将来的にはプラグインのリモートリポジトリからのインストールをできるようにしたいと考えているのですが、その際に必要となるであろうメタデータファイルの生成などもこのプラグインでできるようにしたいと考えています。いつになるかわかりませんが…。

以下のGitBucketプラグイン用のテンプレートプロジェクトもこのsbtプラグインを使うように更新されていますので、このテンプレートを使用することで簡単にGitBucketプラグインの開発を始めることができます。

github.com

もし新しいプラグインを作成した場合は是非GitBucket Community Pluginsに掲載させていただければと思いますのでご連絡ください!

GitBucket 4.19.0をリリースしました

4.19.0には本体およびバンドルされたプラグインにいくつかの問題があったため、修正した4.19.3をリリース済みです。こちらをご利用ください。 https://github.com/gitbucket/gitbucket/releases/tag/4.14.3

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

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

Mavenリポジトリプラグインが利用可能に

GitBucket上にMavenリポジトリをホストするgitbucket-maven-repository-pluginが利用可能になりました。

f:id:takezoe:20171129183533p:plain

このプラグインをインストールすると以下の2つのMavenリポジトリが利用可能になります。

  • http(s)://GITBUCKET_HOST/maven/releases
  • http(s)://GITBUCKET_HOST/maven/snapshots

このMavenリポジトリに対してWebDAVまたはSCPでアーティファクトをアップロードすることができます。このプラグインや、具体的な設定についての詳細はプラグインREADMEを参照してください。

Scalatra 2.6へのアップデート

GitBucketはWebフレームワークとしてScalatraを使用しています。Scalatraはこの11月にメジャーアップデートである2.6がリリースされ、GitBucket 4.19.0も早速Scalatra 2.6系に移行しました。

Scalatra 2.6での大きなトピックの1つとして、これまでGitBucketのオーガニゼーションで開発していたscalatra-formsがScalatra本体のサブモジュールとして移管されたということがあります。今回のリリースではGitBucketのコードベースも移管後のものを使うように修正されていますが、これは既存のGitBucketプラグインのバイナリ互換性を壊す可能性があります。もし動作しないプラグインを見つけた場合はプラグインの作者に知らせてください。

この他に、Scala、sbt、JGitのバージョンがアップデートされています。また、日付関係の処理はJava8のDate & Time APIを使用するように修正され、joda-timeへの依存関係が削除されています。

システム設定画面のレイアウト改善

システム設定画面のレイアウトや挙動が少しだけ変更されています。その中でやや大きな変更点はスキンセレクタのプルダウンで、配置や選択項目がわかりやすい形に変更された他、スキンを選択するとその場でスキン適用後の表示を確認できるようになりました。

f:id:takezoe:20171129183547p:plain

新しい拡張ポイントの追加

新しい拡張ポイントとしてsshCommandProviderを追加しました。プラグインはこの拡張ポイントを使用してユーザからのSSHアクセスをハンドリングすることが可能です。実際に前述のgitbucket-maven-repository-pluginはこの拡張ポイントを使用してSCPでのアーティファクトのアップロードを実装しています。

なお、今回のバージョンではScalatra 2.6向けの修正が間に合わなかったため、gitbucket-pages-pluginが一時的にバンドル対象から外されています。修正完了後、将来のバージョンで再度バンドルされるようになる予定です。また、この他にも様々な改善やバグフィックスを行っています。詳細についてはIssueの一覧をご覧ください。

Apache PredictionIOのインストール方法(バイナリディストリビューション版)

Apache PredictionIOのハウツーについては以前以下の記事でインストール方法からテンプレートを使ったレコメンドAPIのデプロイまでを紹介しました。

takezoe.hatenablog.com

当時のPredictionIOはインストールするにはソースからビルドするべしというかなりスパルタンなインストール方法だったのですが、最新のPredictionIO 0.12.0-incubatingではバイナリディストリビューションもリリースされるようになっていますので、こちらを使用したインストール方法について補足したいと思います。

まだ公式サイトのインストールガイドにはリンクがありませんが、以下からバイナリディストリビューションをダウンロードできます。

http://ftp.meisei-u.ac.jp/mirror/apache/dist/incubator/predictionio/0.12.0-incubating/apache-predictionio-0.12.0-incubating-bin.tar.gz

展開するとPredictionIO-0.12.0-incubatingというディレクトリが出てきます。

$ tar xvzf apache-predictionio-0.12.0-incubating-bin.tar.gz

展開後のディレクトリにSparkをインストールします。PredictionIOはSpark 1.6、2.0、2.1に対応していますが、バイナリディストリビューションはSpark 2.1向けにビルドされています。

$ wget https://archive.apache.org/dist/spark/spark-2.1.1/spark-2.1.1-bin-hadoop2.6.tgz
$ mkdir PredictionIO-0.12.0-incubating/vendors
$ tar zxvfC spark-2.1.1-bin-hadoop2.6.tgz PredictionIO-0.12.0-incubating/vendors

ストレージにPostgreSQLを使う場合はPostgreSQLJDBCドライバも必要です。

$ cd PredictionIO-0.12.0-incubating/lib
$ wget https://jdbc.postgresql.org/download/postgresql-42.0.0.jar

以上でインストール完了です。

バイナリディストリビューションといってもSparkやJDBCドライバを追加インストールする必要があったり、テンプレートのコンパイルにsbtをインストールしておく必要があったりするのは相変わらずですが、ソースからビルドする必要がないので少しだけ楽になっているんじゃないかと思いますw

なお、公式のものではないのですが、コミュニティで作られているDockerイメージもいくつかあるので、こちらを利用することもできます。