PostgreSQL でムービーを再生してみた

本エントリーは [PostgreSQL Advent Calendar 2021](https://qiita.com/advent-calendar/2021/postgresql) の 20日目 です。

昨日は @kingtomo1122 さんの「[Towers of Hanoi on PostgreSQL](https://qiita.com/kingtomo1122/items/c137b2d6b53f16168cea)」でした。
ロボットアームまで持ち出すとは素晴らしい記事でしたね！ :beers: 

# はじめに (ポエム風？)

よなよなエールを愛する [PostgreSQL Contributor](https://www.postgresql.org/community/contributors/) の @yamatattsu です [^1]。
今年をふりかえると、社内PJへの技術支援の傍らでコミュニティ活動としては以下を頑張りました。

* [PGConf.Online 2021 で講演](https://pgconf.ru/en/2021/290100)
* [Europa PostgreSQL User Group の依頼によるインタビュー記事執筆](https://postgresql.life/post/tatsuro_yamada/)
* [PG14 で拡張統計の一覧機能 (\dX) の実装](https://www.postgresql.org/docs/release/14.0/)[^2]　など

限られた時間の中で成果を出したと言えますが、改善の余地もあります。
それは "英語" なのですが、上記講演・記事執筆・機能開発のどれにとっても進める上で重要なポイントでした。

来年は少しでもスムーズに進められるようにと、今月から「スピーキングマラソン」を進めつつ、さらに効果的な方法は無いのか？と日々考えているわけですが、ある日、数年前に"英語が流暢な元同僚"と会話した内容をふと思い出しました。

　数年前
　　自分　「どうやったらそんなに英語を喋れるようになるのでしょう？」
　　元同僚「特にないけど、昔、セリフを覚えるほど何度も Star Wars を見てたなぁ」


私に足りなかったのはこれです！

**＞何度も Star Wars を見てた＜**

映画を見ることは好きですが、英語のセリフを暗記するくらい同じ映画を何度も見たことがありません。Star Wars のシリーズもすべて見ましたが、どれも各１回しか見ていませんでした。

ということで今年の私のアドベントカレンダーは、
PostgreSQL 上で 何度も Star Wars を見れるようにするため、プレイヤーを開発することをテーマとしました(？！)

## 結論から言うと、

プレイヤーの開発に成功しました！
これです↓

[pg_ascii_movie](https://github.com/yamatattsu/pg_ascii_movie)

このプレイヤーは PostgreSQL の拡張機能として動作し、Star Wars の ascii movie を再生できます。インストールしておけば、トラブル解析や実行計画チューニングの合間にいつでも Star Wars を視聴できますね（冗談です）。

## pg_ascii_movie のデモ

![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/380469/49dd80ee-dc71-62d5-01e6-e2e0fb6cb43c.gif)


## インストール方法

前提条件を確認し、次の 1. ～ 4. を順番に実施してください。

:::note
前提条件・気を付ける点
　- pg_config が 必要なので PATH を通す
　- pg_config と file_fdw は devel と contrib の RPM にあるため、必要であれば追加
:::



1. [ソース](https://github.com/yamatattsu/pg_ascii_movie)を持ってきてインストール

	```bash
	$ git clone https://github.com/yamatattsu/pg_ascii_movie
	$ cd pg_ascii_movie
	$ make -s install
	```

2. file_fdw と pg_ascii_movie の拡張機能を有効化し、ムービーファイルへの外部表を作成する。下記の *filename* には sw1.txt への絶対パスを記載してください。
 
	次のように psql を起動し、

	```bash
	$ psql
	```

	以下を実行する。

	```sql
	CREATE EXTENSION file_fdw;
	CREATE EXTENSION pg_ascii_movie;
	\dx

	CREATE SERVER movies FOREIGN DATA WRAPPER file_fdw;

	CREATE FOREIGN TABLE sw1 (
	data text
	) SERVER movies
	OPTIONS ( filename 'path/to/pg_ascii_movie/movies/sw1.txt');
	```

3. 続けて、外部表に問題なくアクセスできるかテストする (念のため)。そんなファイルは無い！といったエラーメッセージが出た場合は外部表の設定を見直してください。

	```sql
	select * from sw1 limit 1;
	```

4. 上記 3. がOKならば、play_sw1() プロシージャを呼び、Star Wars Episode IVを楽しむ。
Enjoy!  :smile: 

	```sql
	call play_sw1();
	```
おまけ：画面左上の数字 (xx/3410) は進捗表示機能です。



## 仕組み

play_sw1() プロシージャでは、Star Wars の ascii movie (テキストファイル: sw1.txt[^3]) を 1フレームごとに file_fdw で読み込み、指定された時間だけ画面表示する※、といったことを繰り返しています。 ※この時間の補正が改善したい点の１つ
画面クリアにはエスケープシーケンスを利用しています。 PC98とか使っていた方には懐かしいですね。

## 注意＆制限事項

* 本拡張機能はジョークプログラムのようなものです。*Do it your own lisk* でお願いします。
* CentOS7、PG14、Teraterm の環境で動作確認しましたが、他のOSでは不明です。
* 実装の改善点は色々ありますが、温かく見守ってください（pl/pgsqlはじめて書きました）[^4]。

# おわりに

いかがだったでしょうか。
昨年のアドベントカレンダーではロジレプの可能性を示すため [スマホとタブレットでロジレプを試す記事](https://qiita.com/yamatattsu/items/c7924834116ed5b12f66) を執筆しましたが、今年は語学力向上を目的として PostgreSQL 上で Star Wars を見るための拡張機能 pg_ascii_movie を開発してみました。
完成したのは良いのですが、実は ascii movie なので音声がありません。 従って、リーディングの練習には良いのですが、ヒアリングやスピーキングの練習になるかと言うと・・・。

さて、気を取り直しまして、本記事によって PostgreSQL の拡張機能の面白さが伝われば幸いです。

みなさん、良い Christmas とお正月をお過ごしください～！

*Happy Holidays!*
*May YonaYona-ale be with you...*


## 参考文献 (Thanks!)

エスケープシーケンス関連

* https://www.mm2d.net/main/prog/c/console-02.html
* https://kenpg.bitbucket.io/blog/201602/05.html

拡張機能関連

* https://www.postgresql.jp/document/13/html/extend-extensions.html
* https://qiita.com/kasa_zip/items/e28c8abd89e8457caf80

pl/pgsql関連

* https://qiita.com/SRsawaguchi/items/411801e254ee66f511f1
* https://qiita.com/ester41/items/3401606322888a0a7f21

スターウォーズ関連

* http://www.asciimation.co.nz/index.php (ここが本家)
* https://github.com/nitram509/ascii-telnet-server
* https://qiita.com/gorilla0513/items/bc53f13c63b5291912d2

[^1]: [Contributors](https://www.postgresql.org/community/contributors/) のリスト上で "yamada" で検索
[^2]: [Release note](https://www.postgresql.org/docs/release/14.0/) の "Add psql command \dX to list extended statistics objects" です
[^3]: [ascii-telnet-server](https://github.com/nitram509/ascii-telnet-server) の sw1.txt をPG用に修正(s/\/\\\/.g)し利用
[^4]: file_fdw や pl/pgsql をなぜ利用したのか、もっと楽な方法があるのでは、など色々と思うところはあると思いますが、とりあえずそれっぽく動くので良しとします。改善案がある場合は、 issue よりも pull request をいただけるとありがたいです :-D