Slide 1

Slide 1 text

作ったツールの紹介 https://github.com/noborus 斉藤 登 1

Slide 2

Slide 2 text

PostgreSQL に関連した以下のツールを紹介します trdsql テキストとデータのツール ov ターミナルページャー pgsp pg_stat_progress 監視ツール jpug-doc-tool マニュアル翻訳ツール 全部Go で書かれたCLI ツールです。 2

Slide 3

Slide 3 text

trdsql PostgreSQL ユーザーにこそ使ってほしいtrdsql https://github.com/noborus/trdsql trdsql 3

Slide 4

Slide 4 text

trdsql とは? CSV,LTSV,JSON 等にSQL を実行できるツール trdsql -ih "SELECT id, name, price FROM fruits.csv" 1,apple,100 2,orange,50 3,melon,500 同様のツールはいくつか存在する q , textql ... trdsql はDB エンジンを変更できる! trdsql 4

Slide 5

Slide 5 text

trdsql はPostgreSQL に接続可能 類似ツールの多くは内部でSQLite3 を使用している。 trdsql もSQLite3 を(内蔵して)使用しているが、PostgreSQL,MySQL に変更可能。 -driver オプションと接続先を表す -dsn オプションで変更可能。 trdsql -driver postgres -dsn "host='/var/run/postgresql/'" "SELECT * FROM fruits.csv" (設定ファイルにも書けます)。 PostgreSQL のSQL 構文、SQL 関数が使えるのでストレスフリー trdsql 5

Slide 6

Slide 6 text

PostgreSQL のインポート、エクスポート trdsql はファイルにSQL を実行するだけでなく、もっと使いみちがある。 ファイルのJOIN だけでなく、ファイルとテーブルのJOIN も可能。 テーブルだけに対しても実行可能で、SELECT 以外のSQL を実行しても問題ありませ ん。 そのため、インポート、エクスポートもできます。 trdsql 6

Slide 7

Slide 7 text

エクスポート 既存のテーブルにSQL を実行。 trdsql -driver postgres -dsn "host='/var/run/postgresql/'" -omd "SELECT * FROM actor" actor_id first_name last_name last_update 1 Penelope Guiness 2013-05-26T14:47:57Z 2 Nick Wahlberg 2013-05-26T14:47:57Z 3 Ed Chase 2013-05-26T14:47:57Z 4 Jennifer Davis 2013-05-26T14:47:57Z 5 Johnny Lollobrigida 2013-05-26T14:47:57Z trdsql 7

Slide 8

Slide 8 text

インポート trdsql の動作として、元々ファイルを指定した場合にテンポラリテーブルを作成して、 インポートしている。 そのため、テンポラリテーブルではなく実テーブルを指定する機能を開発しようとす るが、考慮することが爆発的に増える。 テーブルがすでに存在している場合… 列名を変えたい… 型を定義したい… 機能開発は中止。 trdsql 8

Slide 9

Slide 9 text

SQL で実行すればよいことに気づいた。 trdsql "CREATE TABLE fruits AS SELECT id::int,name,price::int FROM fruits.csv" CREATEE TABLE テーブル AS の代わりに INSERT INTO テーブル SELECT を使用すれば既 存のテーブルにもインポート可能。 ON CONFLICT DO NOTHING や ON CONFLICT DO UPDATE を使用すれば、専用のインポー トツールよりも柔軟なインポートが可能。 trdsql 9

Slide 10

Slide 10 text

JSON 対応 trdsql はJSONL(NDJSON )やトップが配列になっているJSON が対象だった。 ただ、そこから外れるけど、リスト形式なJSON はよくある。 { "userList": [ { "userID": 1, "nickname": "taro", }, { "userID": 2, "nickname": "hanoko", }, { "userID": 3, "nickname": "momoko", } ] } trdsql 10

Slide 11

Slide 11 text

そのままだとusrList という1 列1 行のテーブルになる。 trdsql -omd "SELECT * FROM sample.json" | userList | |----------------------------------------------------------------------------------------------------| | [{"nickname":"taro","userID":1},{"nickname":"hanoko","userID":2},{"nickname":"momoko","userID":3}] | 前まではSQL のJSON 関数でなんとかするか、jq で前処理をしてパイプで渡せば良いと 考えていた。 jq ".userList" sample.json | trdsql -omd -ijson "SELECT * FROM -" trdsql 11

Slide 12

Slide 12 text

jq 構文 gojq というGo 製のjq クローンが開発されていた。 package として使えるので、取り込んでしまった方が便利。 ファイル名 :: の後にjq 構文を書くと解釈してからSQL を実行できるようにした。 trdsql -omd "SELECT * FROM sample.json::.userList" userID nickname 1 taro 2 hanoko 3 momoko trdsql 12

Slide 13

Slide 13 text

⇒ 次のツール PostgreSQL の開発当初からあった問題が 2021 年に進展したのをご存知でしょうか? それは… ov 13

Slide 14

Slide 14 text

less にヘッダーオプションが入った! (まだベータリリース版) less --header 2 ov 14

Slide 15

Slide 15 text

Pager less はPager と呼ばれるジャンルのアプリケーションで、 画面に収まらない出力を1 画面ずつ表示。 Pager はいくつかある。more,less,most... psql やmysql のREPL は自分でパイプに渡せないので内部で使用する。 環境変数PAGER で設定されたコマンドを使用する。 Pager に渡った後はPager の操作になるので、 psql を使っていると思っている半分はPager を操作している。 psql にってPager は大事 ov 15

Slide 16

Slide 16 text

less http://greenwoodsoftware.com/less/ Pager のデファクトスタンダードといえる存在がless いつの間にかGitHub にも置かれていてissue 対応してます! https://github.com/gwsw/less 1983 年からの開発で2021 年にヘッダーオプションが入った。 それまでは最初に列名を出力してもスクロールすると消えていた。 psql の出力が画面に収まらないと '\x' で縦に表示しろというのが定番でした。 ov 16

Slide 17

Slide 17 text

ヘッダーオプションを使用することで、常に列名が表示できるようになった。 (ヘッダーオプションを使用すると折り返さず横スクロール表示になる)。 ov 17

Slide 18

Slide 18 text

pspg pspg はテーブル表示に特化したページャー。 pspg を使用することで、列名を常に表示、列の固定を利用して閲覧できる。 テーブル表示なので、画面端でも折り返さないで横スクロールして表示する。 pspg はpsql を想定して作られているので、psql を使用するならpspg の方が便利。 ov 18

Slide 19

Slide 19 text

ov https://github.com/noborus/ov 私が新しく作った汎用ページャー。 1 つの表示方法だけでなく、いろんな表示を動的に切り替えられる。 ヘッダー表示しても折返しができるようにした。 画面幅に収まらなくても横スクロールしないで表示できる。 そのために以下の機能を追加。 行背景の交互表示 列のハイライト ov 19

Slide 20

Slide 20 text

ov は機能盛りだくさん 検索 - インクリメンタルサーチ、正規表現のインクリメンタルサーチ フォローモード(tail -f 相当)、複数ファイルのフォローモード 圧縮ファイル対応(gzip,bzip2,zstd,lz4,xz ) exec モード(標準出力と標準エラー出力を分けて表示) ov 20

Slide 21

Slide 21 text

開発予定 PSQL_WATCH_PAGER 開発中のPostgreSQL 15 ではPSQL_WATCH_PAGER という環境変数が追加される予 定。 この変数をセットすれば \watch の出力をPAGER に出力できる。 pspg が対応(pspg の作者が入れた) --stream オプションを使う。 \watch の出力はスクロールして流れていくので複数行出力しての変化は見づらい。 先頭からの位置が変わらないと変化に気づきやすい。 Unix コマンドで言えばps コマンドを定期的に実行するか、top コマンドを使用するかの 違い。 ov 21

Slide 22

Slide 22 text

実際に \watch を実行した結果がPAGER に渡されると以下のような形式で出力され る。 Thu Mar 17 15:53:27 2022 (every 1s) <------ タイトル

Slide 23

Slide 23 text

1 回目の空行でタイトルが終わって結果がはじまりを表す 2 回目の空行で結果の終わりを表す この結果に依存して表示モードを作るのは辛い… 空行が途中で入ったり、空行を取りこぼしたりするとズレて表示が崩れやすい。 結果の区切り文字を^L(form feed) 追加することを提案して、CommitFest にも登録し た。 pspg 作者のPavel Stehule さんだけ賛成してくれたけど、他の反応はイマイチ… ov で\watch が使いやすく表示できるのかは不透明。 ov 23

Slide 24

Slide 24 text

⇒ 次のツール pgsp https://github.com/noborus/pgsp pgsp 24

Slide 25

Slide 25 text

pg_stat_progess_* という、処理中状況を表すView を表示するだけの シンプルなツール 対象View バージョンによって増えていきますが。以下のView を対象にしています。 pg_stat_progress_analyze pg_stat_progress_basebackup pg_stat_progress_cluster pg_stat_progress_copy pg_stat_progress_create_index pg_stat_progress_vacuum pgsp 25

Slide 26

Slide 26 text

SELECT * FROM pg_stat_progress_analyze; 実行すれば、その時点での状況を教えてくれる。 pid | datid | datname | relid | phase | sample_blks_total | sample_blks_scanned | ext_stats_total | ext_stats_computed | child_tables_total | child_tables_done | current_child_table_relid -------+-------+---------+-------+-----------------------+------------------ -+---------------------+-----------------+--------------------+------------------- -+-------------------+--------------------------- 30481 | 16386 | noborus | 25855 | acquiring sample rows | 30000 | 21320 | 0 | 0 | 0 | 0 | 0 (1 row) (結果はView によって異なる。) pgsp 26

Slide 27

Slide 27 text

問題点 処理中にはレコードが追加されて、処理が終わるとレコードが消える。 psql の \watch を使用すれば監視できるが、 前述の通り \watch はスクロールして流れていくので変化は見づらい。 前述のPSQL_WATCH_PAGER によって改善するかもしれない。 そもそも、わかりやすくない。 pgsp 27

Slide 28

Slide 28 text

pgsp プログレスのView なんだからプログレスバーを表示する監視ツールを探す が無かった⇒そこで作ったのが pgsp 特徴 1 つのview だけでなく、複数のview (デフォルトは全部)に対して定期的に問い合 わせる。 処理中はわかる範囲でプログレスバーを表示。 レコードが消えても指定した秒数間は表示し続ける。 ターミナルの表示域(幅、高さ)によって、表示方法を変更。 オプションで、監視間隔、終了してから表示し続ける秒数等に対応。 pgsp 28

Slide 29

Slide 29 text

今後 Go のTUI フレームワークBubble Tea を使用 https://github.com/charmbracelet/bub bletea プログレスバー以外にも機能豊富な ので、統合監視ツールも作れるか も。 pgsp 29

Slide 30

Slide 30 text

⇒ 次のツール jpug-doc-tool PostgreSQL マニュアル翻訳のためのツール https://github.com/noborus/jpug-doc-tool/ jpug-doc-tool 30

Slide 31

Slide 31 text

自己紹介 PostgreSQL マニュアルの日本語翻訳プロジェクトに参加している斉藤です。 PostgreSQL マニュアルの日本語翻訳の管理がGitHub に移行してからビルドツールの修 正等以下のことを担当しています。 UTF-8 への変更 ビルド環境の修正 CI の整備 CSS 、HTML のヘッダーフッター PDF 作成 https://pgsql-jp.github.io/ の管理 翻訳もやってますが、英語は得意じゃないです。 jpug-doc-tool 31

Slide 32

Slide 32 text

PostgreSQL 日本語マニュアル PostgreSQL 日本語マニュアル翻訳プロジェクトはjpug-doc という名前で管理されてい ます。 https://github.com/pgsql-jp/jpug-doc 詳しくはQiita のPostgreSQL 日本語マニュアルについてを参照してください。 現在、拡張子はsgml ですが、すべてXML 処理系で処理されています。 jpug-doc-tool 32

Slide 33

Slide 33 text

jpug-doc-tool 誕生のきっかけ PostgreSQL 13 のマニュアルには「翻訳が終わらない危機」があった。 中身は変わらないが表記法が変わって変更量が爆発した。 一番影響が大きかったfunc.sgml 。 バージョンアップ 変更行数 11.0 ⇒12.0 2,168 12.0 ⇒13.0 36,575 変更(+,- )の行数が実際の行数を上回った。 バージョン 行数 12.0 22,673 13.0 21,153 jpug-doc-tool 33

Slide 34

Slide 34 text

実際の変更例 内容は変わらないが、タグが変わって、 13 のマニュアルに対して12 の翻訳をマージできず round() numeric 最も近い整数への丸め を以下のようにする必要がある。 round numeric 最も近い整数への丸め jpug-doc-tool 34

Slide 35

Slide 35 text

英語と日本語のペアのリストを抽出して、 新しいバージョンで日本語訳を挿入する方法にした。 en:Rounds to nearest integer ja: 最も近い整数への丸め 実装は正規表現バリバリ。 XML 処理系で置き換えようとするとインデントが元に戻せなかった… 数パターンに対応したので、他の人に使えるように体裁を整えたのが jpug-doc-tool jpug-doc-tool 35

Slide 36

Slide 36 text

jpug-doc-tool の機能 チェック機能を追加 英語と日本語のペアのリストにより以下のチェックが可能になった。 未翻訳の英語だけのパラグラフがないか 英語、日本語訳のタグが同じか 日本語に含まれている英単語が英語にもあるか 英語と日本語を指定して両方含まれているか --en merge --ja マージ 数値は同じ数値が含まれているか 13 の翻訳完了後も数十カ所発見(最近http->https 等の修正が多くあった)。 jpug-doc-tool 36

Slide 37

Slide 37 text

日本語訳挿入の強化 完全一致した場合のみ日本語訳を適用するだけでなく、類似した文に注意書きを入れ て挿入するオプションを追加。 a SQL ⇒ an SQL のような修正では日本語訳の修正は必要ない。 レーベンシュタイン距離によって同一ファイル内の文から類似しているか比較 (package https://github.com/agnivade/levenshtein を使用しているだけ)。 さらにAPI を利用した機械翻訳も! jpug-doc-tool 37

Slide 38

Slide 38 text

みんなの自動翻訳@TexTra https://mt-auto-minhon-mlt.ucri.jgn-x.jp/ 利用規約にオープンソースライセンスの翻訳に使用 できることが明言されている。 いわゆるAI 翻訳で精度も日々向上している。 API も公開している。 Go からAPI を利用できるパッケージを作成。 https://github.com/noborus/go-textra jpug-doc-tool にも組み込んだ。 jpug-doc-tool 38

Slide 39

Slide 39 text

アカウント情報を設定ファイルに書いたら、以下を実行すると… jpug-doc-tool replace --mt brin.sgml 未翻訳の箇所に日本語訳を挿入する。 API...[Some of the built-in operator ] Done API...[bloom operator classes accept ] Done API...[Defines the estimated number o] Done API...[Defines the desired false posi] Done API...[minmax-multi operator classes ] Done API...[Defines the maximum number of ] Done API...[Returns whether all the ScanKe] Done API...[To write an operator class for] Done API...[Support procedure numbers 1-10] Done API...[The minmax-multi operator clas] Done replace: brin.sgml jpug-doc-tool 39

Slide 40

Slide 40 text

「みんなの自動翻訳」を利用した日本語訳挿入 diff --git a/doc/src/sgml/brin.sgml b/doc/src/sgml/brin.sgml index 7b90452dd8..0c60b2bc79 100644 --- a/doc/src/sgml/brin.sgml +++ b/doc/src/sgml/brin.sgml @@ -778,14 +778,24 @@ LOG: request for BRIN range summarization for index "brin_wi_idx" page 128 was Operator Class Parameters + + + 一部の組み込み演算子クラスでは、演算子クラスの動作に影響するパラメータを指定できます。 + 各演算子クラスには、使用可能なパラメータの独自のセットがあります。 + パラメータを指定できるのは、bloom 演算子クラスとminmax-multi 演算子クラスのみです。 最後に人がチェックして修正し、《機械翻訳》コメントを消せばOK 。 jpug-doc-tool 40

Slide 41

Slide 41 text

「みんなの自動翻訳」をコマンドで利用 コマンドラインから翻訳ツールとしても使用できる。 jpug-doc-tool mt "This is a pen." generalNT_en_ja がデフォルトの翻訳エンジンだが、カスタマイズした翻訳エンジンを 追加できる。 c-1640_en_ja: これはペンです。 generalNT_en_ja: これはペンです。 自動翻訳の利用は、まだほぼされていない。 jpug-doc-tool を利用している人が自分以外いない… jpug-doc-tool 41

Slide 42

Slide 42 text

紹介したツール (全部MIT ライセンスです) trdsql https://github.com/noborus/trdsql ov https://github.com/noborus/ov pgsp https://github.com/noborus/pgsp jpug-doc-tool https://github.com/noborus/jpug-doc- tool みんなの自動翻訳API クライアント Go パッケージ https://github.com/noborus/go-textra jpug-doc-tool 42