14
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

PostgreSQLAdvent Calendar 2023

Day 19

PostgreSQLでファイヤエフェクト!

Last updated at Posted at 2023-12-18

この記事は PostgreSQL Advent Calendar 2023 19日目の記事です。

はじめに

山田です。日本のテレコム会社でPostgreSQLのコミュニティ開発やサポートを担当しています。コミュニティ開発ではコントリビュータとして認められており国内外で講演も行っています。先週は数年ぶりにPGConf.Eu 2023に参加し主催者・コミッタ・友人と旧交を温めてきました。

エフェクトプログラムを作りたい

突然ですがエフェクトプログラムをご存知でしょうか。
XX年代に学生だった私は当時流行っていたDiabloのタイトル画面のようなエフェクトをいつか自分自身で作りたいと思っておりました1

ファイヤエフェクトの例 Diablo2 resurrectedの公式ページより引用

画面下部の文字から炎が燃え上がっていますね。これがファイヤエフェクトです。

きっかけが何だったのかは失念しましたが、このまま作らずに積み残しのままにしておくのは良くないと考えたため、今年の私のアドベントカレンダーは以下をテーマとしました。

 テーマ:
    ファイヤエフェクトっぽいものをPostgreSQLの拡張機能で実現する

結論から言うと

作ったものはこれです。

右から左に炎が燃えているのがわかります。
頭を90度左に傾ける または ディスプレイを90度右に回転させるとわかりやすいです2

たとえば、実行例2を右に90度回転させるとこうなります。燃えている感じが伝わると思います3
result_40_50_rotate.gif.gif

仕組み

参考にしたアルゴリズムを完全移植したわけでは無いため異なる部分もありますが、それっぽい雰囲気を再現できたと思います。

動かしてみたい方へ

以下の環境の利用をおすすめします。

  • Microsoftのターミナル
    • 256色表示が必須
    • フォントサイズは 7以下 がおすすめ
      • 設定 -> 規定値 -> フォントサイズ で変更可能
  • PGのバージョン
    • 16 (開発時に利用したバージョンのため)
      • CTEのMATERIALIZEDオプション使用のため、12以降なら動くはず

実行方法

前提条件、留意事項

  • pg_config が 必要なので PATH を通す
  • fire_data, palette, tempテーブルを作成/削除するため、同名のテーブルが存在しない環境で実行

手順のイメージ (各自の環境に合わせて適宜修正してください)

-- postgresユーザになる
su - postgres

-- リポジトリのクローン
git clone https://github.com/yamatattsu/pg_fire.git

-- インストール
cd pg_fire
make -s install

-- psql起動
psql

-- 拡張機能作成と実行 (psql上で実行)
create extension pg_fire;
call pg_fire(50, 20); --50列20行のサイズで表示
 とか
call pg_fire(40, 50); --40列50行でサイズで表示

-- 終了方法 (psql上で実行)
CTRL+Cで終了

Enjoy!

注意事項&制限事項

  • ジョークプログラムのようなものです。実行する際は Do it your own risk でお願いします
  • 画面表示のサイズを増やすと処理が重たくなるため、前述の手順で示した値から試すと良いでしょう
  • コードに関する改善提案がありましたらgithub上でプルリクをお願いします

おわりに

いかがだったでしょうか。
本記事では、PostgreSQLの拡張機能としてpl/pgsqlでファイヤエフェクトを実現することに成功した例を紹介しました(多少課題はありますが)。ファイヤエフェクトが動くDMBSはPostgreSQLが世界初ではないかと考えます。

個人的にはこの開発により、長年の積み残しを解消することができました。次はメタボールの実現に挑戦してみようと考えています。いつの日かPostgreSQLを使用してTokyo Demo Festに応募できるようになれればと思っています。

というわけで、
みなさん今年もおつかれさまでした! 良いクリスマスをお過ごしください!

参考

ファイヤエフェクトのアルゴリズム解説

ESCシーケンス関連

ファイヤエフェクトが動いている例

  1. Diablo1が見つからなかったため、公式サイト https://diablo2.blizzard.com/ja-jp/ から引用。動いている炎を見たい場合は公式サイトまたは参考に記載の例にアクセスしてください

  2. 炎は後日見直し、下->上に向けて動くようにする予定

  3. 本記事の冒頭で引用した画像のように文字から炎が上がるところまでは再現していません

  4. Cで書くのは芸が無いと思いSQLで書いてみました

  5. 本当はフレームバッファに描きたかったのですが難しそうだったので諦めました

14
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?