Learning Spark: Lightning-Fast Data Analytics 2nd Edition

Spark 3.0に対応したLearning Sparkの2nd Edition、しばらく前にDatabricks社のWebサイトから無料でダウンロードできるものを入手していたのですが、最近ようやく一通り目を通すことができました。

Sparkの基礎からStructured Streamingによるストリーム処理、パフォーマンスチューニング、MLlibによる機械学習、さらにMLflowによる機械学習パイプライン、Delta Lakeによるデータレイクなど最新のトピックまでカバーされ、サンプルコードも基本的にScalaPythonの両方で同一のコードが記述されているという網羅度の高いSparkの入門書です。

個人的にはややわかりづらいStructured Streamingの挙動について図も多用して説明されていたのが好印象でした。また、Sparkは開発が非常に活発であるということもあり、APIにも複数の種類やレイヤーがあるのも入門者にはわかりづらい部分なのではないかと思うのですが、そのあたりも歴史を追いつつ説明されており、Sparkを使い始めるのであればとりあえずこれを読んでおけば間違いないという内容になっていると思います。構築・運用に関する部分は弱いかなと思うのものの、環境依存なところもありますし、マネージドなクラウドサービスを使うという選択肢もあるので妥当なところではないでしょうか。

Spark 3.0での新機能については最後の章にまとめられているのですが、各章でも該当箇所で個別に触れられています。1st Editionは読んだことがないので比較はできないのですが、単にSpark 3.0の章を付け足しただけというわけではなく、全編丁寧にアップデートされている印象です。

なお、冒頭でも触れたとおり、この書籍はDatabricks社のWebサイトから無料でダウンロードすることができます(メールアドレスの登録が必要)。

databricks.com

以前紹介したPresto: The Definitive Guideもそうでしたが、オライリーでは最近こういうパターンが増えていますね。ノベルティなどでオライリー製作の小冊子が配布されているのもよく見かけます。技術書の出版はグローバルで見ても難しい商売だとは思うのですが、オープンソースプロダクトを支援している企業としては広告宣伝活動の一環としてコストを投下できますし、読者としても無料でまとまった書籍の形で情報を得ることができる、オライリーのブランドを活かした興味深い取り組みだと思います。

GitBucket 4.34.0をリリースしました

f:id:takezoe:20200726033019p:plain

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

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

2020年初、7ヶ月ぶりのリリースとなります。色々変更が溜まっていたり、プラグインのアップデートも必要だったりしたのでいつリリース作業をしようかと思っていたのですが、4連休を使ってリリース作業を行うことができたのでよかったです。次のリリースはいつできるのか…。

今回のバージョンでの主な変更内容は以下の通りです。

システム管理画面の強化

管理者向けのシステム管理画面を強化し、新たな設定項目を多数追加しました。

ファイルアップロードの設定

これまではファイルサイズ、タイムアウトの設定をCLIオプションや環境変数などで行うことができましたが、管理画面上から行えるようになりました。また、別途ラージファイル向けの設定も可能になっています。

f:id:takezoe:20200726032942p:plain

リポジトリ操作の制限

リポジトリのリネーム、削除、フォーク、移管といった操作を管理者のみに制限できるようになりました。

f:id:takezoe:20200726032954p:plain

ユーザ定義CSS

管理者はGitBucketの外観をカスタマイズするために任意のCSSを定義できるようになりました。定義したCSSはGitBucketのすべてのページに適用されます。

f:id:takezoe:20200726033006p:plain

リポジトリビューアの性能改善

リポジトリ情報のインメモリキャッシュや、ディレクトリ内のファイルが多い場合に詳細情報の表示をスキップするなどの対応によって巨大なGitリポジトリでのリポジトリビューアの表示速度が大幅に改善しています。

スタンドアロンモードでのHttpSessionの永続化

組み込みJettyを使用したスタンドアロンモードで使用する場合、これまでは再起動するとHttpSessionはリセットされていましたが、以下のように--save_sessionsというオプションを付けて起動することでHttpSessionをディスクに永続化できるようになりました。

$ java --save_sessions -jar gitbucket.war

Web APIのアップデート

List commits APIが新たに追加されました。また、既存のAPIGitHubとの互換性向上のためいくつか更新されています。GitBucketのユーザさんからはJenkins連携でのトラブルで質問をいただくことが多いのですが、今回のバージョンアップで状況が改善することを期待しています。

プラグインのアップデート

デフォルトでバンドルされているプラグインのうち、以下の2つのプラグインがバージョンアップしています。

今回は7ヶ月ぶりのリリースだけあり、この他にもMariaDBサポートの改善、アクティビティログの改善、サイドバーに表示されるリポジトリ一覧の制限など、様々な改善やバグ修正が行われています。詳細についてはIssueの一覧をご覧いただければと思います。

ThinkPadキーボードをMacで使うためのKarabiner Elementsの設定 最新版

過去にも同じ記事を書いたのですが、ThinkPadキーボードのモデルチェンジやKarabinar Elementsのバージョンアップで微妙に変わっている部分もあるのでThinkPad TrackPoint Keyboard IIで行った設定を自分の備忘録を兼ねてメモしておきます。

スペースキー周辺のキーはなるべくMacBook本体の配列にあわせるようこんな感じに。実際はCapsLockとControlの入れ替えはFor all devicesで全てのキーボードに適用されるようにしています。Mac側の設定で変えることもできるのでそれでもよいと思います。

日本語入力の切り替えはコマンドキーの単体押しで切り替えられるように。

トラックポイントのボタンの設定もカスタマイズできるよう、マウスとして認識されているデバイスにもチェックを入れておきます。

そしてセンターボタンを無効に。これをやっておかないと、トラックポイントでスクロールしようとしたときにセンターボタンでリンクをクリックしてどんどん新しいウィンドウが開いてしまうという事故が多発します。まあでもこれは人によるかも。

ちなみに上記はUSB接続の場合の設定で、Bluetooth接続の場合はキーボードとマウスが1デバイスとして認識されるようです。なのでトラックポイントのボタンの設定もキーボードと同じデバイスに対して行います。

ThinkPad TrackPoint Keyboard IIを買った

ここ数年メインの作業環境がThinkPadではなくなってしまったため、外付けのThinkPadキーボードを買い替えながら使い続けており、現在使っているBluetooth版のものもまだまだ全然使えるので迷ったのですが、7年ぶりのバージョンアップということでやはり購入してしまいました。オーダーしてから届くまで1ヶ月以上かかりました。日本語配列のモデルだともう少し早く届くようです。

www.lenovo.com

見た目は前モデルと変わりませんが、確かに色々と進化しています。特に前モデルは筐体の剛性の不足によるものか、実際のThinkPadと比べるとカチャカチャというややチープなタイプ感があったのですが、今回は明らかにタッチが変わっており、ThinkPad本体のキーボードと近いタイプ感になっています。筐体の剛性に関しては7列時代の外付けキーボードを含めて最もしっかりしており、今までで最もThinkPadのキータッチを忠実に再現している外付けキーボードと言っていいのではないかと思います。

キーストロールは前モデルと比べるとやや浅くなっているようですが、最近はThinkPadも薄型化しているので、ThinkPad搭載のキーボードもこのくらいのキーストロークなのかもしれません。トラックポイントのボタンはフラットな形状に変更されており、以前のものに慣れていると最初は少し戸惑うかもしれません。特にセンターボタンを手探りで探すのがやや難しくなったように感じます。

接続方式に関しては、前モデルでは有線のUSB版とワイヤレスのBluetooth版に分かれていたのですが、今回は1台でUSB/Bluetooth両対応となっています。USB接続もUSBドングルを使用した無線方式になっており、Bluetoothのペアリングを使わなくても無線で使えますし、無線でもBIOSの操作が可能です。USBドングルは使わないときはキーボード本体に収納しておくことができます。前モデルのBluetooth版ではマルチペアリングができなかったため、複数の機器を切り替えて使う際にはペアリングをしなおす必要があり不便だったのですが、今回もマルチペアリングはできないものの、無線USBとの併用によりUSBとBluetoothで機器を切り替えて使うという運用が可能になっています。

また、前モデルのBluetooth版ではWindows以外ではFnLockが効かないため、ファンクションキーを使うのにFnキーとのコンビネーションが必要だったのですが(USB版ではコンビネーションなしでファンクションキーが使えました。また、Macでも回避策はあったようです)、今回のモデルではキーボード側でFnLockが効くようになっています。

というわけで、とりあえず前モデルで自分が感じていた不満点は全て解決されていました。お値段は定価だと15,000円以上と相変わらずなかなかな感じですが、トラックポイントは他のキーボードでは代替不能ですし、今回のアップグレード内容を考えると既存のThinkPadキーボードユーザも買い換える価値はあるのではないかと思います。今後しばらく経てば割引クーポンなども出ると思いますし、コンパクトサイズかつトラックポイントのおかげでマウスのスペースも節約でき、手狭な自宅作業環境にもピッタリなのでWork from Homeのお供に1枚いかがでしょうかw

発売後に様々なメディアにレビュー記事が掲載されていましたが、以下の記事が大変参考になりました。素晴らしい熱量のレビュー記事ですw

japanese.engadget.com

また、以下のレノボの方のインタビュー記事も面白かったです。ThinkPadキーボードは50%が日本で売れているとのことですが、逆に言えば日本以外では全然売れてないんだなという。そりゃ新製品の優先度も上がらないわけですよね。

news.mynavi.jp

しかしこれでまた今後数年はアップデートが望めないことを考えると、USB-Cのドングルが欲しかったとか、やはりBluetoothでマルチペアリングをサポートして欲しかったとか、本体のUSB-C端子で有線接続もできるとよかったなど、どうしても欲が出てきてしまいますね…。

GitHub Actions 実践入門

最近GitBucketのCIをTravisからGitHub Actionsに移行したりしていたのですが、達人出版会さんのセールでこの本が半額になっていたので購入してみました。

tatsu-zine.com

内容的にはGitHub Actionsの基本的な使い方から様々な機能、アクションの作り方まで一通りのトピックがカバーされています。

GitHub Actionsは公式のドキュメントが充実しており、日本語化もされているので概ね困ることはないと思うのですが、やはり書籍の形だと目を通しやすいですし、公式のドキュメントでは触れられていない実用的なTipsなども含まれています。欲をいえばサンプルレシピはもっとバリエーションが欲しかったかもとか、オフィシャルのアクションについて詳細な解説が欲しかったかもという気はしますが、GitHub Actionsでどんなことができるかを押さえるには最適な書籍なのではないかと思います。

なお、著者さんのブログによるとこの書籍は同人誌として執筆されたものだそうで、同人版も引き続き販売されているそうです。商業版の出版に当たって見直された内容は同人版にも反映されているとのことですし、最新情報にも随時アップデートされるとのことですので、特に拘りのない方はこちらを購入されたほうがお得かもしれません。

www.kaizenprogrammer.com

GraalVMでネイティブイメージを生成可能なScalaベースのCLIアプリケーションのためのgiter8テンプレートを作ってみた

以前PicocliとGraalVMを使ってScalaでネイティブCLIアプリケーションを作成する方法を試してみたのですが、その後細々とスタンドアロンのネイティブイメージを作成するのに適したScalaライブラリの組み合わせを試したりしていたので、これらをまとめてgiter8テンプレートにしてみました。

github.com

使い方は簡単で、まずは以下のようにしてプロジェクトを作成します。

$ sbt new takezoe/scala-native-cli.g8

scoptを使った簡単なサンプルコードも生成されるようになっているのでこれをベースにコマンドを実装したら、以下のコマンドを実行するとtarget/graalvm-native-imageディレクトリにネイティブイメージが生成されます(GraalVMとnative-imageコマンドは予めインストールしておく必要があります)。

$ sbt graalvm-native-image:packageBin

テンプレートといってもscala-native-packagerと、CLIツールを作るのに便利そうないくつかのライブラリを設定済みのsbtプロジェクトを生成するだけですが、他にもIOやファイル操作関連のライブラリを入れておくと便利そうな気がします。テンプレートにいろいろライブラリを入れておいて、必要なもの以外はコメントアウトして使うというような使い方が良いかもしれません。このあたりは自分でも使いながらブラッシュアップしていこうかと思います。

実は同様のgiter8テンプレートも既に存在するのですが、自分のユースケースにあわせてデフォルトのライブラリをカスタマイズできた方が便利そうということで…。

github.com

ただ、こちらのテンプレートはDockerイメージの作成にも対応しているようです。もちろんツールの利用者はDockerさえインストールされていれば使えますし、ビルドもDockerで行うためビルド時にローカルにGraalVMをインストールする必要もないようです。これは中々便利そうな機能なので時間があれば自分のテンプレートにも取り入れてみようかと思います。

MetalsプロジェクトでBloopのCLIを活用する

以前Metalsユーザ向けのBloopの紹介記事を見かけたのですが、確かにVS CodeなどでMetalsを使っている場合、BloopやMetalsサーバが常にVS Codeの背後で起動しているのでターミナルでのコンパイルやテストの実行にもBloopのCLIを活用するには理に適っているかもしれません。

chris-kipp.io

というわけで少し試してみました。BloopのCLI自体はMacであればHomebrewでインストールできます。

$ brew install scalacenter/bloop/bloop

コンパイルしてみます。sbtと違って必ずプロジェクト名を指定しないといけないという点に注意してください(マルチプロジェクトでない場合でも)。プロジェクトの一覧は bloop projects で表示できます。テストコードをコンパイルする場合は プロジェクト名-test を指定します。また、-wオプションを付けるとソースディレクトリを監視してファイルの変更時に自動的に再コンパイル結果を表示してくれます。

# プロジェクトの一覧
$ bloop projects
sample
sample-test

# ソースコードのコンパイル
$ bloop compile sample

# テストコードのコンパイル
$ bloop compile sample-test

# 自動再コンパイル
$ bloop compile sample -w

テストを実行する場合は以下のようにします。特定のテストケースのみ実行することももちろん可能です。

# テストを実行
$ bloop test sample

# 特定のテストケースのみ実行
$ bloop test sample -o com.github.takezoe.sample.SampleTest

# ワイルドカードも使用可能
$ bloop test sample -o *SampleTest

同様にプログラムの実行も可能です。プロジェクト内に起動クラスが複数存在する場合は -m で実行するクラス名を指定します。また、引数を渡したい場合は -- に続けて指定します。

# プログラムを実行
$ bloop run sample

# 起動クラスを指定して実行
$ bloop run sample -m com.github.takezoe.sample.SampleApp

# 引数を指定
$ bloop run sample -- arg1 arg2
$ bloop run sample -m com.github.takezoe.sample.SampleApp -- arg1 arg2

より詳細な使い方やオプションについては以下のBloopのドキュメントを参照してください。

実際に試してみたところ、当たり前と言えば当たり前なのですが確かに速いです。ただ、これはそもそもMetalsでも同様ですが、ビルド時にsbtでコード生成している場合などは事前に一度sbtを走らせてからでないとビルドが通らなかったりなど、bloopコマンドで完全にsbtを置き換えることはできません。また、プログラムの実行やテストなどはMetalsのUI上で行うことでエディタ上でのデバッグも可能になるといったメリットもあります。BloopのCLIはあくまで補助ツールとして使うと良い感じだと思います。