TrinoにおけるPostgreSQLのVARCHAR/CHAR型に対する範囲検索のプッシュダウンについて

TrinoはJDBC経由で様々なデータベースに接続できるのですが、PostgreSQLコネクタで以前はサポートされていたVARCHAR/CHAR型のカラムに対する範囲検索(<、<=、>、>=)のプッシュダウンがTrino 353以降廃止されていました。これはTrinoとPostgreSQLのCOLLATIONの違いが原因で、カラムの値によっては検索結果が期待したものにならないケースがあるためです。

github.com

そこで、以下のように明示的にCOLLATIONを指定してプッシュダウンする修正をTrino 365で取り込んでもらいました。

github.com

しかし、このプッシュダウンはオプションとなっており、Trinoのデフォルト設定では無効になっています。有効にするにはTrinoに以下の設定を追加する必要があります。

postgresql.experimental.enable-string-pushdown-with-collate=true

というのもPostgreSQL側でインデックスが張られていてもPostgreSQL側のCOLLATIONでインデックスが作成されているとプッシュダウンした場合にそのインデックスを利用することができないからという理由のようです(Trinoが指定するCOLLATIONでインデックスを作っておく必要がある)。個人的にはどっちにしろフルスキャンするんだからPostgreSQL→Trino間の転送量が減る分インデックスが使えなくてもプッシュダウンした方がマシなのではという気がしないでもないですが…。

実際にこのプッシュダウンが嬉しいケースは限られるかなと思いますが、もしTrinoからレコード数の多いPostgreSQLのテーブルのVARCHAR/CHAR型のカラムに対して範囲検索をしたいという場合はこのオプションの有効にすると速くなるのではないかと思います。前述のようにTrino用にインデックスを作っておくとより効果的です。

なお、最近のTrinoではJDBCコネクタでのプッシュダウンの強化(LIKE検索など)なども進められているようなので、PostgreSQLなどTrinoからJDBCコネクタ経由で接続可能なデータベースの検索パフォーマンスのさらなる向上が期待できそうです。

Trino/Prestoをdockerで動かしてみる

もう少しTrino/Prestoネタもブログに書いていこうかなというのと、普段テスト用途で古いバージョンのTrino/Prestoを手元で動かす際にdockerを使うことが多いので自分用のメモを兼ねて。

TrinoはDockerHubで公式のdockerイメージが公開されているので簡単にdockerで動かすことができます。イメージの使い方については以下にドキュメントがあります。

github.com

デフォルト設定で実行するだけならこんな感じ。

docker run --rm -p 8080:8080 --name trino trinodb/trino:371

起動後、以下のようにしてCLIクライアントで接続可能。もちろんlocalhostの8080ポートでWeb UIにもアクセスできますし、JDBCドライバなどで接続することも可能です。

docker exec -it trino trino

設定ファイルは /etc/trino ディレクトリに格納されているのでローカルで設定ファイルを用意しておきこのディレクトリにマウントすることで任意の設定で動作させることができます。

docker run --rm -p 8080:8080 -v <ローカルディレクトリ>:/etc/trino --name trino trinodb/trino:371

以下のディレクトリにデフォルトの設定ファイル群があるのでこれをベースに設定を弄ったりカタログを追加したりするとよいと思います。

なお、Trinoへのリブランディングされた350以前のPresto時代のdockerイメージについてはDockerHubから削除されてしまっているのですが、GitHub Container Registryにイメージがバックアップされています。互換性のチェックのために過去のバージョンを使いたいケースも多いので助かります。

docker run --rm -p 8080:8080 -v <ローカルディレクトリ>:/etc/presto --name presto ghcr.io/trinodb/presto:350

設定ファイルを配置するディレクトリは /etc/presto または /usr/lib/presto/default/etc になっています(後者が優先されます)。

docker run --rm -p 8080:8080 -v <ローカルディレクトリ>:/etc/presto --name presto ghcr.io/trinodb/presto:350

Fire TV Stickを買ってみた

最近買い物ブログが続きますが…。

以前からDAZNをPCやiPadで視聴していたりAmazon Primeにも加入していたのですが、業務用PCと私用PCで外部ディスプレイやキーボードの接続を切り替えるのが結構億劫だなぁと感じていたところ、Fire TV Stickがビックカメラで1000円引きで売ってたのとポイントもいくらか溜まっていたので物は試しと買ってみました(1000円引きセールはすでに終了しているようです)。

最初の設定が若干面倒なのと電源を別途取らないといけないので配線がごちゃごちゃしてしまうのが難点ですが、USBで電源供給できるTVであればTVだけで完結しそうですが、それでもごちゃごちゃしてしまう感が否めないし、ネット動画対応のTVだとハードウェアの陳腐化で製品寿命が短そうで悩ましいところ。USB-Cで接続できるTVとセットトップデバイスがあるといいのかも?

しかしPCでストリーミング見るときはPCを立ち上げたりディスプレイの接続を切り替えたりなどある程度準備が必要なので若干心理的障壁というか億劫になるところがあったのですが、リモコン操作だけで見られるのはやはり楽ですね。Amazon Prime Videoのコンテンツも豊富ですし、アプリを入れると海外ニュースを流しておけたりするのもいい感じです。これは確かに普通のテレビ番組は見なくなりそう…。

Sharkのハンディクリーナーを買ってみた

少し前の話なのですが、有効期限切れで失効しそうな家電量販店のポイントが結構あったので以前から欲しいと思っていたハンディクリーナーを買ってみました。

購入したのはSharkのEVOPOWERシリーズの最新モデルで、ハンディクリーナーの割に吸引力が強いというのと、このカラーのみフローリング用の延長ノズルが付属しておりハンディクリーナーとしてだけではなくコードレスの掃除機のような感じでも使えるというのが決め手でした。

実際に使ってみると延長ノズルは思ってたよりもチープでしたがなんとか使えるかなという感じ。一台で床から細かい部分の掃除までこなせますし、なにより思い立った時に気軽に掃除できるので、作業に煮詰まった時など気分転換に掃除するようになりました(掃除に現実逃避していると言えなくもない)。

使わないアタッチメントは充電台にセットしておけますし、普通のコードレス掃除機と比べて場所も取りません。延長ノズルだけは充電台にセットできないので充電中の置き場に困りますが…。軽量なハンディクリーナーということでバッテリーの持続時間も不安でしたが自宅を一通り掃除するには十分でした。

吸引力の強力なブーストモードは長時間使っていると発熱のせいか勝手に電源が落ちてしまうのがやや残念なところですが、不満な点はそのくらいで良い買い物でした。

Post Corona: From Crisis to Opportunity

ベストセラーになったThe FourのScott Gallowayさんによる続編的な書籍で最近日本語訳も出ていたのですが書店で原著を発見したのでそちらを読んでみました。

今作はより社会的な問題にフォーカスしており、後半かなりのページを割いて教育や政治の重要性について強く訴えています。もしかしてScott Gallowayさんは政治家を目指しているのではと思ってしまいました。

原著が発売されたのは2020年11月なので、現在までの間に世間の情勢も結構変わっているところもあり、The Fourと同様、今読むと答え合わせ的な部分もあるのですが、Netflixの苦戦を予想していたりさすがだなーと感じる部分もありました。ただ、本書で述べてされているようにパンデミックが社会が変わるチャンスになりそうかというと、どうもそうはならなそうな気配もありますが、果たしてこの先世の中どうなるでしょうか…。

ちなみにThe Fourのペーパーバックが字がめっちゃ小さくて読むのが辛かったのですが、今回は(読んだのはUK版ですが)普通サイズだったので助かりました。

ブックオフでScalatra in Actionを発見した

先日近所のブックオフで発見したので思わず確保してしまいました。

だいぶ前に出た本ですでに古くなってしまっている部分も多いのですが、自分が開発に関わっているフレームワークの書籍が出る機会というのは早々ないと思うので記念に取っておこうと思います。

他にも何冊かManningのIN ACTIONシリーズが並んでいたので近所在住のエンジニア氏が転居などでまとめて処分されたのでしょうか。もしかしたら近所にScalatraユーザの方が住んでいたのかもしれないですね。

IntelliJのScalaプラグインでTwirlエディタがdefiningを認識しない問題

GitBucketではHTMLのレンダリングにTwirlを使っており、IntelliJScalaプラグインに付属しているTwirlエディタを便利に使用しているのですが、どういうわけかこのTwirlエディタがdefiningを認識せず、definingで定義した変数の補完が効かなかったりエディタ上でエラーとして表示されてしまうという点を不便に感じていました(Playプロジェクトじゃなから?)。

f:id:takezoe:20220117124800p:plain

ずっと諦めていたのですが、最近IntelliJの設定をあれこれ見直しているとフレームワークのPlay2の設定のところにインポートの設定があることに気づいたので、ここにdefiningを提供しているplay.twirl.api.TwirlFeatureImpots._を追加してみたところ、無事definingを認識するようになりました。

f:id:takezoe:20220117122053p:plain

巨大かつ複雑なテンプレートほどdefiningで変数を定義したくなるので、今まで結構不便だなぁと思っていたのですが、これでだいぶ快適になりました。ただ、この他にもmapでcaseを使って分解した変数を認識してくれないことがあったり(ちゃんと認識してくれるケースもある)、Twirlエディタの挙動は結構謎な感じがありますね…。