PostgreSQL 16全部ぬこ 振り返り

# はじめに
にゃーん。趣味でポスグレをやっている者だ。

この記事は[PostgreSQL 16 全部ぬこ Advent Calendar 2022](https://qiita.com/advent-calendar/2022/pg16-all-nuko) 最終日の記事です。
今回は、全部ぬこアドベントカレンダーをやってみようと思ったきっかけや、準備、苦労した点などをつらつらと書いてみます。

**終盤はちょいネタ切れ感もありましたが、とりあえずなんとか完走しました！**

# きっかけ＆動機
## 篠田の虎の巻
PostgreSQLに関わっている人、特に新バージョンの機能を知りたい人なら、たぶん多くの人がお世話になっている「篠田の虎の巻」シリーズ。
10月22日にも[PostgreSQL 15 GA 新機能検証結果](https://community.hpe.com/t5/hpe-blog-japan/%E7%AF%A0%E7%94%B0%E3%81%AE%E8%99%8E%E3%81%AE%E5%B7%BB-postgresql-15-ga-%E6%96%B0%E6%A9%9F%E8%83%BD%E6%A4%9C%E8%A8%BC%E7%B5%90%E6%9E%9C-%E5%85%AC%E9%96%8B/ba-p/7176302#.Y5w28X3P0aE)が公開されています。このシリーズ、新機能を網羅しているのは勿論ですが、更に凄いところは、beta1がリリースされた5月下旬にはbeta1バージョンを公開しているところ。

## PostgreSQL 15のリリースノートと虎の巻でわいわい言う会
で、今年の夏頃に、このbeta1版をベースにして3回に渡って「PostgreSQL 15のリリースノートと虎の巻でわいわい言う会」というオンラインミーティングが3回開催されました。

* [PostgreSQL 15のリリースノートと虎の巻でわいわい言う会 ツイートまとめ](https://togetter.com/li/1906524)
* [PostgreSQL 15のリリースノートと虎の巻でわいわい言う会（続）ツイートまとめ](https://togetter.com/li/1913387)
* [PostgreSQL 15のリリースノートと虎の巻でわいわい言う会（続2）ツイートまとめ](https://togetter.com/li/1916626)

この会の中で「篠田さん、betaリリースから間がないその時期に虎の巻リリースできるの？」と聞いたところ、執筆自体は冬の頃からやっていて、commit logなどを見ながら随時作成していた、とのこと。
なるほどー、それはそうだよなー。と夏の頃は思っていたわけです。

10月になって、PostgreSQL 15も無事リリースされ、次はPostgreSQL 16の話をまた5月くらいから書くのかなーとか思っていたのですが、ここでふと気づくわけですよ。
**「Commitfestに上がっている項目を見れば、ゆるふわ勢の俺でも早々とPostgreSQL 16ネタ書けるんじゃないか？」**

# 準備
全部ぬこシリーズは5年くらい前に[PostgreSQL 10全部ぬこ](https://qiita.com/advent-calendar/2017/pg10-nuko-only)というのをやったことはあるのですが、準備不足で12月は結構地獄をみました。その時の経験から、「全部ぬこ」をやるためには、しっかり準備しないといけないのは身にしみています。
なので、今回は自分にしてはわりとしっかりと準備を勧めてみました。

## 10月
今年は11/11開催の[PostgreSQL Conference Japan 2022](https://www.postgresql.jp/jpug-pgcon2022)でライトニングトーク大会がない、ということが割と早くわかったので、10月から準備に着手ができます。
（ライトニングトーク大会用のネタづくりに費やす時間がアドベントカレンダーの準備に回せる）

まずは[Commitfest](https://commitfest.postgresql.org/)ページの確認です。
Commitfestというのは2ヶ月単位で期間を区切って、その間に次のバージョンに入れたい改造項目のコードを上げてレビューしてもらうという開発サイクルのことで（このへんは[藤井さんのスライド](https://www.slideshare.net/nttdata-tech/postgresql-global-development-group-osc2022-online-kyoto-nttdata)を見てもらったほうがいいかも）、その期間中に``Commited``なったものが、次のバージョンに入ることになります。[^1]

で、アドベントカレンダーの時期としては、[Commitfest 2022-11](https://commitfest.postgresql.org/40/)と[Commitfest 2022-01](https://commitfest.postgresql.org/41/)あたりのCommitfestと重なるので、そこからネタを探していきます。
まだ10月時点では、Qiita記事には書かず、候補になる項目をテキストファイルでCommitefest項目名とリンクのメモだけを作っておきます。

## 11月
今年は間抜けなことに[PostgreSQL Conference Japan 2022](https://www.postgresql.jp/jpug-pgcon2022)の懇親会チケットを買い忘れて、懇親会に出れなかったのが悔やまれます。というのは、懇親会内でライトニングトークやったらしい？ので、懇親会に出席していれば、ライトニングトークの場で「全部ぬこやります」宣言できたのに・・・と。
それとは関係なく、日々、[Commitfest 2022-11](https://commitfest.postgresql.org/40/)のページをチェックしてネタにできそうなものを書き留めておきます。

Commitfest項目のうち、何を記事にするかというと以下の3つを満たすこと。

* ステータスが``Commited``のもの
    * ``Needs Review``とかだとパッチを当てて環境駆逐して・・・とか難易度（というか面倒臭さ）が一気に上がってしまう。
* 自分が理解できるもの
    * 当然、自分が理解できないと記事掛けないし。
* 記事にしやすいもの
    * TopicがRefactorとかDocumentとかTestとかは、やっぱり記事にしにくい。

11月に入ったので、そろそろQiita記事のストックを始めます。
といってもQiitaの下書き保存の数には限りがあるらしいので、代わりにHackMDで下書き原稿を作っておきます。
また、「はじめに」とか「概要」のテンプレートを考えておきます。

11月下旬頃になったあることに気づきます。
**圧倒的にネタが足りねえ・・・**

上に示した3つの条件を満たす改造項目が思ったよりも少ない！
11月最終週時点で記事のストックは9個＋書けるかどうか怪しい項目が3,4個。アドベントカレンダー枠の25個からすると半分程度。いけるのか？
かなり迷いましたが、12月になってから増える項目もあるはずだし、なんとかなるだろう！とちょっと強引ですが直前の11月末にエントリしました。

# アドベントカレンダー始まる！
## 12月
とりあえず9つ分のストックを予約投稿でまず埋めて、9日分のバッファを作ります。
また、12月になったので、今度は[Commitfest 2022-01](https://commitfest.postgresql.org/41/)を毎日チェックします。

12/7時点で、純粋にCommitfest項目だけでエントリを作るのに無理を感じたので、終盤3日はちょいズルして、システムカタログ全般の変更、PostgreSQLパラメータの変更、このポエム、というので埋めようと妥協。
それから数日の間に幾つか書きやすそうな項目が増えてきて、12/15頃にはなんとか全ての枠を埋められそうな状況になりました。
ここまでくれば、後は記事を書くだけです。

# つらい点

## ネタ不足！
アドベントカレンダーが3月にあれば、Commitfest 3回分のネタを準備して望めたから、かなり楽になったかもしれない。
この時期にPostgreSQL 新バージョンネタオンリーで全部アドベントカレンダーはキツいですね。

## 英文メーリングリストつらい
Commitfestのページなんですが、タイトルは書いてあるものの、その詳細については何も書かれていません。
詳細を知りたければ、Commitfestのページにあるメーリングリストのリンクから内容を追っていくしかありません。

* 英語わからん（DeepL先生とGoogle翻訳副講師さまさまです）
* 長い（ものにもよるけど、延々メールでの議論が続く項目もある）
* まとめがないスレッドも多い（「エイリアン vs ジョーズ」じゃないけど **もう結果だけ教えろ！** という気分になる）

## 検証するバージョンが意外と多い

検証時には、結局以下のバージョンを用意しました。

* PostgreSQL 15 beta
* PostgreSQL 15,0
* PostgreSQL 15.1
* PostgreSQL 16-devel

基本はPostgreSQL 16-develとPostgreSQL 15.1を比較することが多いのですが、
Commitfest項目のTopic：Bug fixだと、PostgreSQL 15.0時点で反映されているものがあったからです。このあたりはCommitされたタイミングにもよります。
あと、仕方ないけど、PostgreSQL 16-develは開発途中なので、しばしばカタログバージョンが変わります。そうなると以前の検証で使っていたデータベースクラスタが使えなくなるの、ちょくちょくデータベースクラスタを再生成する必要があります。にゃーん。

## 検証結果が微妙
これは性能改善関連の項目で数件あったんですが、メーリングリストの議論にあったような効果が見えない（項目によっては、PostgreSQL 15 beta版よりPostgreSQL 15.0やPostgreSQL 16-develのほうが遅いケースもあった）とかなり悩みます。
まず最初に疑うのは自分の検証環境ですからね。
でも、いろいろ検証環境や測定方法を変えてもうまく結果が取れないものは、今回そのまま出しました・・・。にゃーん。

### 有識者のコメントはありがたい！
自分が書いていたこのアドカレを見た有識者の方から、コメント・指摘をいただいて修正した記事もいくつかあります。
一番大きい修正は22日目の[PG16:Fast COPY FROM command for the foreign tables](https://qiita.com/nuko_yokohama/items/f80896e9fdf891effb82)の記事でした。
公開した版だと「測定したけど効果なかった・・・」という内容でしたが、指摘を元に測定環境を再構築・再測定したところ著しい改善効果が確認できたので、記事を修正して再公開しました。

## 書いた結果が御破算に！
``pg_vacuum_all_tables``,``pg_analyze_all_tables``という定義済みロールが追加されたよ！という記事（[PG16:allow granting VACUUM and ANALYZE privileges on relations](https://qiita.com/nuko_yokohama/items/37b197a6f39edb1278f4)）を1日目に書いたのですが、12/19の別項目のCommitによって``pg_maintain``ロールに統合され、``pg_vacuum_all_tables``,``pg_analyze_all_tables``ロールはなくなりました！なんてこともあったりします。
まあ、こういうことがあるから、開発中のバージョンを追うのは楽しくもありますが。

## 時間が足りない！
12月になってからも改造項目の調査、検証、Qiita記事化があるので、当然生活から時間が削られます。

自分の場合、朝は散歩（未だにポケモンGOユーザなので）して朝食→在宅勤務、というのが朝のパターンなのですが、早朝は実は自分的には一番頭が冴えている気がするので、朝の散歩時間をアドベントカレンダー活動に回すことになります。
歩かなくなるので健康にはよろしくない。

休日も当然、アドベントカレンダー活動に回すことになります。なので、遠くにラーメンを食べに行けない・・・（近所では食べるけど）

# おわりに：何を得たのか

今回の全部ぬこアドベントカレンダーを通じて得たものは自分なりにはあると思います。

* PostgreSQL 16の機能の（ほんの一部をだけど）先行して理解できた。
* PostgreSQL Commitfestの歩き方が少しわかってきた
* 毎日締切があるような連載のための準備や進め方

そして、PostgreSQLゆるふわ勢でもなんとかPostgreSQL開発版のネタで25本書けるんだ、という実績が作れたところが大きいです。


**これを読んで「よっしゃ、自分でも全部俺アドベントカレンダーできそうじゃん！」と思う人が増えれば幸いです。**


[^1]: たまに開発途中でRevertされることもあります。PostgreSQL 15だとJSON関連の機能追加がRevertされた気がする。