Aizu Advent Calendar2020の11日目の記事です。
知り合い(@flying_hato_bus)や知り合い(nozomoto)からの熱い誘いがあったのでもう年末ですがしれっと書いてみました。何気にAdvent Calendarは初です。
ちなみにサラッと書いた技術の無駄使いの宣伝なのでそこまで期待せずに覗いてもらえれば幸いです苦笑
TL;DR
https://wancom.github.io/Cloud/
(自分の気が変わって公開終了していなければ)多分ここを見るとこんな感じの雲の写真が現れます。正確には写真ではなく生成された画像ですね。
使用している技術
使っている主な技術はパーリンノイズとBMP、GithubActionsです。
(他にももちろんC言語やImageMagickなとがありますが割愛します)
パーリンノイズ
パーリンノイズは自然な感じのノイズを生成するアルゴリズムです。
ただの乱数だと飛び飛びで不自然な感じになりますが、パーリンノイズは「事前に計算された勾配に従って内挿を行い、時間的/空間的に擬似乱数的に変化する値を生成する」ことで滑らかで自然な雰囲気を持たせることができます。
https://ja.wikipedia.org/wiki/パーリンノイズ
説明できるほど深くまで理解はできていませんがイメージとしては一定間隔に乱数で山や谷を作り、その間の値を計算で滑らかに埋めるという感じです。
__
/ \__ /
/ \__/
/
__/
**~~~~**~~~~**~~....
*が乱数で生成した値
~が*の間を埋める値
(アスキーアートにしたらわかりやすくなるかと思いましたが、むしろ余計にわかりにくくなってしまった気が…)
実際のコードはこちらです。自分で理解するために書いたこともあり、あまり綺麗なコードではありません…
https://github.com/wancom/Cloud/blob/master/cloud.c
BMP(Microsoft Windows Bitmap Image)
BMPは主にWindowsで使用されている画像の保存形式です。
https://ja.wikipedia.org/wiki/Windows_bitmap
圧縮せずに1ピクセルずつ情報を保持しているため構造はシンプルです。
あまり何も考えずに作ったためとりあえず簡単に生成できるということで使用しました。
なお生成した画像はその後ImageMagickを使ってPNGに変換しています。
BMPファイルの生成には下記のサイトを参考にしました。
https://www.ruche-home.net/program/bmp/struct
GitHub Actions
実は毎日雲の画像を生成しているため上記のサイトは毎日雲の画像が変化します。これはGitHub Actionsを使用して実現しています。
GitHub Actionsは通常特定ブランチにマージされた時をトリガーにしてデプロイするなどに使いますが、cronのように指定した日時をトリガーにして何かをするということもできます。
今回は毎朝7時に雲の画像を生成し、リポジトリに追加してPushするという操作を自動で行うようにしています。
(ちなみに余談ですが、GitHub Actionsで実行されるコンテナーにはデフォルトで様々なツールがインストールされていますが、まさかImageMagickのconvertコマンドも入っているとは思いませんでした。)
コードはこちら
https://github.com/wancom/Cloud
雲のWebページはこちら
https://wancom.github.io/Cloud/
あとがき
今回は完全に思いつきでチャチャっと作ったものなのでこんなこともできるんだなと感じていただければ幸いです…
そのうち気が向いたら曇りや夕方も再現してみようかなと思います。