JDK のディストリビューションがまたいろいろ変わってた

久々に sdk ls java したら、いつも使ってる adopt が無くなってて、見慣れないやつらが増えてた。

adopt は eclipse 財団傘下になって adoptium に名前が変わったらしい。ディストリビューションの名前は temurin になったらしい。 adoptopenjdk.net

temrin 使っとくのがよいのかな。 whichjdk.com

今日のBQ謎仕様 : require_partition_filter = true なテーブル同士をJOINしつつフルスキャンしたい時

パーティショニングしていて、require_partition_filter = true のテーブル同士をJOINする場合を考える。 そのようなテーブルをフルスキャンする場合、

WHERE partitioning_field IS NOT NULL

ってやるが、これは JOIN するテーブルが一つまでだと動くが、2つ以上のテーブルを JOIN しようとするとエラーになる模様。 つまり、

FROM tbl1
LEFT JOIN tbl2 ON (...)
WHERE tbl1.partitioning_field IS NOT NULL
  AND tbl2.partitioning_field IS NOT NULL

は動くけど、

FROM tbl1
LEFT JOIN tbl2 ON (...)
LEFT JOIN tbl3 ON (...)
WHERE tbl1.partitioning_field IS NOT NULL
  AND tbl2.partitioning_field IS NOT NULL
  AND tbl3.partitioning_field IS NOT NULL

は「tbl3 は partitioning_field で絞んないとクエリできまへん」と怒られる。理不尽...

こういう場合は、WITH句で各テーブルを WHERE partitioning_field IS NOT NULL してから JOIN する必要がある。(メンドイ...)

なお、パーティションを明示的に絞れば動くようだ。 つまりこれは動く。

FROM tbl1
LEFT JOIN tbl2 ON (...)
LEFT JOIN tbl3 ON (...)
WHERE tbl1.partitioning_field = "2021-01-01"
  AND tbl2.partitioning_field = "2021-01-01" 
  AND tbl3.partitioning_field = "2021-01-01" 

2022-01-30 追記

ON 句でパーティションを絞ると動く。

つまり、これは動く。

FROM tbl1
LEFT JOIN tbl2 ON (... AND tbl2.partitioning_field IS NOT NULL)
LEFT JOIN tbl3 ON (... AND tbl3.partitioning_field IS NOT NULL)
WHERE tbl1.partitioning_field IS NOT NULL

GCP の環境変数

GCP のデフォルト・プロジェクトを設定する方法に、環境変数を設定する方法があるが、同じような役割っぽい環境変数がいくつかある。

GOOGLE_CLOUD_PROJECT
CLOUDSDK_CORE_PROJECT
GCP_PROJECT
GCLOUD_PROJECT

GCLOUD_PROJECT は deprecated のようだ。
GCLOUD_PROJECT is deprecared in favor of GOOGLE_CLOUD_PROJECT + avoid using it at all · Issue #251 · GoogleCloudPlatform/nodejs-getting-started · GitHub

GOOGLE_CLOUD_PROJECTCLOUDSDK_CORE_PROJECT を混ぜて使っちゃってハマったことがあった。
bq コマンドは GOOGLE_CLOUD_PROJECT より CLOUDSDK_CORE_PROJECT を優先するっぽいのだが、google-cloud-ruby は逆のようだ。

CLOUDSDK_CORE_PROJECT を設定すると、ローカルでは思った通りに動いたのに、サーバ上ではうまく動かなかったことがあった。よくよく調べたら、サーバ上では GOOGLE_CLOUD_PROJECT も設定しており、google-cloud-ruby がそっちに従ってた。

混乱するので混ぜるな危険! しかし、環境変数を乱立させないでほしい...

2022-01-30 追記

どうも勘違いしていた...

gcloud, bq

GOOGLE_CLOUD_PROJECTは無視している?
CLOUDSDK_CORE_PROJECTは読んでる。gcloud config setより優先される。

google-cloud-ruby, google-cloud-python

GOOGLE_CLOUD_PROJECTCLOUDSDK_CORE_PROJECTも両方読む。
両方設定されている場合はGOOGLE_CLOUD_PROJECTを優先する。

ちなみにGCP_PROJECTについては調べておらず。(cloud functions とかで使われている?)

kindle paper white に pdf を送る方法

こちらに良いまとめが。

mag.app-liv.jp

スマホタブレットのアプリから転送」がちょっと分かりづらい。
safari で pdf を開いて共有ボタンで kindle」ではダメ。それだと共有を実行した端末にしか PDF が保存されない...
box アプリや google drive アプリで pdf を開き、その上で「アプリで開く」的なボタンをクリックしないとダメ。そうすると、上のリンク先に書いてあるように「Kindleに送信」画面が出てくる。
いちいちクラウド・ストレージに up しなきゃならないのが分かりづらいし面倒...

ruby の google-cloud-bigquery は ALTER TABLE SET OPTIONS に対応してない?

Google::Cloud::Bigquery.new.query(
  <<~QUERY
    ALTER TABLE dataset.table
    SET OPTIONS (expiration_timestamp=TIMESTAMP_ADD(CURRENT_TIMESTAMP(), INTERVAL 1 DAY))
  QUERY
)

このコード、動かないっぽい...

Library/Ruby/Gems/2.6.0/gems/google-cloud-bigquery-1.31.0/lib/google/cloud/bigquery/data.rb:506:in `from_gapi_json': undefined method `fields' for nil:NilClass (NoMethodError)
        from /Library/Ruby/Gems/2.6.0/gems/google-cloud-bigquery-1.31.0/lib/google/cloud/bigquery/query_job.rb:707:in `data'
        from /Library/Ruby/Gems/2.6.0/gems/google-cloud-bigquery-1.31.0/lib/google/cloud/bigquery/project.rb:886:in `query'

のような例外が出る。

ruby ライブラリが SET OPTIONS に対応してないっぽい... (CREATE VIEW は動いた)
google-cloud-bigquery (1.31.0) で確認。

digdag 手動実行時の session time、last_session_time

workflow 画面の 「RUN」をクリックした場合の挙動

2021-01-10 に実行したとする。

cron を使った場合

schedule:
  cron>: 10 1 * * *
1時10分より前に実行した場合
session_time = クリックした日時
last_session_time= 2021-01-09 01:10:00
1時10分より後に実行した場合
session_time = クリックした日時
last_session_time= 2021-01-10 01:10:00

daily を使った場合

schedule:
  daily>: 01:10:00

1/10に実行したら、何時に実行しても以下の通り。

session_time = クリックした日時
last_session_time= 2021-01-10 01:10:00

(2023/04/27 追記) なお、上記の挙動は server mode の時の挙動であり、local mode の時は挙動が異なるようだ...