2024年1月の振り返り

日々の生活

最近、節約をしたいということでトクバイというアプリを使いだした。

 

tokubai.co.jp

 

近所のスーパーのチラシとかがスマホから確認できるので非常に便利。

あと今日のレシピとして献立の例とかも出てくるのも地味に嬉しい。

 

最近はトクバイ経由で知ったスペアリブのほったらかし煮をクッキングプロで作ったりしてた。

 

ゲーム

Halo

ずっとInfiniteのマルチプレイヤーをやってた。

 

www.halowaypoint.com

 

最近高難易度キャンペーン周回とかもやりたくなってきたのでMCCでHalo初期三部作Legendaryキャンペーン周回とか配信でやりたい

 

Supraland: Six Inches Under

レッドとブルーの棒人間みたいなのになって地下を探検する感じのゲーム。

 

store.steampowered.com

 

悪魔城ドラキュラとかメトロイドみたく、徐々にパワーアップして謎解きしながらストーリーを進める感じだった。

意外とメタなネタとかもあってニヤリとするところもあってよかった。

 

Planet of Lana 

横スクロールで進んでいくパズルゲーム。

 

store.steampowered.com

 

非常に音楽が良く、サントラを買うことにした。

ストーリー的には住んでた星にやってきたロボットたちにさらわれた兄弟を探す少女の話。途中で合流する猫っぽい相棒と一緒にパズルを解いていくのが非常に楽しい。

 

 

Rise of the Tomb Raider

言わずと知れたトゥームレイダーシリーズの一つ

 

store.steampowered.com

 

どうも三部作の中編らしい(Xbox Game Passに来てたのでやってみたんだけど、シリーズ通してはやってないのよね)

 

落ちてるアイテムを加工して立ち回るのとか非常に楽しかった。特に空き缶使ってのステルスアクションをやってる時はテンション上がったなぁ。

 

Sea of Stars

スーファミ時代のPRGを現代に再現という感じのゲーム

 

store.steampowered.com

 

プレイしてないから良く知らないんだけどクロノトリガーとかのBGM作った人も協力してるらしい。

凄く親切なPRGという感じでサクサク進む。おまけに戦闘自体もボタンをタイミング良く押すことでより戦いやすくなるという感じで単調な感じにならないのもいい。

 

まだクリアしてないけど、たぶんこれPRG好きの人は満足しそうだなとか思った。

 

OSS

基本的にRubyのパーサー周りにPRを投げてた。

特にNODE_INTEGERとかの導入やUniversal ParserのAPI依存削減とかはマージされて良かったなぁ。

 

github.com

github.com

github.com

github.com

github.com

github.com

github.com

github.com

github.com

Creatodon

基本的にはMastodonのmainブランチ追従とRubyのmaster追従をしてて大きなトラブルは無しという感じだった。

 

ただ、Web UI周りのデザインが大きく変わった関係でコンフリクトしたのとかは大変だった。

 

github.com

 

Creatodonでは自動投稿削除とか予約投稿などもWeb UIからできるようにしている関係でそのあたりがコンフリクトしていた。

とはいえ、CypressでのE2Eテストを書いてあったのでいくらか楽にできたのは良かった。

 

あとCreatodonはRubyのmasterブランチで動かしている関係でリモートサーバーからの画像とかが一時的に保存できないみたいな現象も発生した。

 

それに関しては以下のPRの変更で解消されてて、どうも内部の処理でArray#firstを呼び出した際にheap-buffer-overflowが起きてた模様。

 

github.com

 

 

Creatodonの全文検索にkuromojiなどを使うようにした

はじめに

Creatodonの全文検索機能に日本語形態素解析エンジンのkuromojiを導入した時の覚書です。

 

やったこと

変更差分は以下のPRを参考にすればOKです。

 

github.com

 

基本的に最小限の変更でOKとなるようにインデックス周りとCIのみを修正しています。

 

インデックス周りの修正に関してはmayeahさんの以下のコードを参考にさせていただきました。

 

github.com

 

CI周りに関してはコメントアウトするよりは実際の環境に近いものをテストできるようにしておきたかったのでMastodonソースコードで利用しているElasticsearchのイメージではなく、Elasticsearchが提供しているGitHub Actionsを使うようにしています。

GitHub Actionsを使うようにすることでkuromojiなどのプラグインをCI上で利用できるようにしてる感じですね。

 

あとはCreatodonを動かしているサーバーでkuromojiなどをインストールして、再度インデックスを再生成してます。

 

おわりに

 

とりあえず、CI周りだけどうするかなぁと考えてたんですがGitHub Actions側でいい感じにできたので良かった。

他のサーバーでkuromoji入れてるサーバーへCI周りの修正はPR投げれそうだなぁと思ってますが、やるリソースがあるかは分からないのでその辺は未定......。

 

参考

 

www.elastic.co

 

www.elastic.co

blog.asterism.xyz

 

github.com

(WIP)「リテラルオブジェクトをRubyのオブジェクトから卒業させる」をやってみた Part 2

はじめに

この記事は、以下の記事の続きです

gamelinks007.hatenablog.com

parse.yリファクタリングチャレンジの中の一つ「リテラルオブジェクトをRubyのオブジェクトから卒業させる」をチャレンジしている途中記録をまとめたものになります。

前回から今回の記事までにやったこと

マイナスがついているIntegerのリテラルオブジェクトを生成できるように対応

前回の記事までの対応だと、以下のようなコードが正しく処理されませんでした。

p -117
# => 117と出力される

これは parse.y の以下の部分で行っている -117 へと変換する処理がすり抜けているため、117 という正の数になってしまっていた感じでした。

github.com

なので、以下のコミットでマイナスがついている場合も負のIntegerを生成できるように修正した。

github.com

やっていることとしては rb_integer_literal_info_t というInteger関連の情報を保持する構造体を追加し、そこへ負の値かどうかの情報を渡すようにしています。 それを compile.cリテラルオブジェクトを生成する部分でチェックし、チェックに引っかかれば負の値として値を返すようにしています。

0の場合だけIntegerのリテラルオブジェクトを正しく生成できない問題に対応

次になんとかしたのは 0 の場合だけ正しくリテラルオブジェクトを生成できていない部分です。

具体的には以下のコードが false を返していました。

p 117 - 117 == 0
# => falseが返される

挙動などを調べたところ、これは以下のようにリテラルオブジェクトを生成していることが分かりました。

117 - 117 == 117

何故か 0 の部分が 117となっているため 0 == 117という式になり、結果として false が返っていたというわけです。

で、こちらに関しては以下のコミットで修正しました。

github.com

どうも tok(p) で値を取得している際に以前の値が残ったままになっているケースがあり、そのエッジケースに遭遇したということのようです。 そのため tokfix(p) を追加して、その辺をいい感じに処理しています。

ここは現状のRubyでは問題になっていませんが、あとでPR投げてもいいかなと思っています。

今後

とりあえず、 make btest でパスしていないテストの数が17件くらいになってきたので残りの部分を直していきたいですね。 たぶん次に対応するのは 1.2rとかのリテラルオブジェクトを生成する部分などになりそう。

宣伝

parse.y リファクタリングチャレンジとかUniversal Parserの話、またはCRubyの内部実装の話などは以下のイベントでアレコレ話してたりするので興味のある方は是非是非ご参加くださいー。

hamadarb.connpass.com

(WIP)「リテラルオブジェクトをRubyのオブジェクトから卒業させる」をやってみた

はじめに

この記事は、以下の記事にある「リテラルオブジェクトをRubyのオブジェクトから卒業させる」をチャレンジしている途中記録をまとめたものになります。

 

yui-knk.hatenablog.com

 

まだ対応途中ということもあり、不正確な情報も混じっているかもしれません。

「ここ間違ってるよ」とかあればコメントなどでツッコミを入れていただければ幸いです。

 

やったこと(というか現在やっている作業)

とりあえず、以下のPR内でIntegerのリテラルオブジェクトの生成をparse.y内部ではなくcompile.cで行うように修正しました(ローカルで軽く動作確認はとれているんですが、CIはまだ落ちている状況)

 

github.com

 

RubyのASTのノードで利用されているRNodeという構造体にrb_literal_structという構造体を追加し、Integerのリテラルオブジェクトを生成する部分でrb_literal_structにパースしたコード(ex: 117などの数字)をchar*で保存しています。

また保存した値などを引き回してRNodeの生成部分まで渡し、最終的にcompile.cでリテラルオブジェクトをISeqへと渡す部分までもっていき、そこでIntegerを生成するようにしています。

 

困った点など

基本的にポインタで構造体を引き渡したりしており、意図せぬ箇所で初期化漏れがあったりしてSEGVが起き続けていたのは大分困りましたね......。

 

SEGVで大分時間が溶けたんですが「たぶん、何かしらCRuby用のデバッグツールが同梱されてるんじゃないか?」と思い、ソースコードを調べたところmake gdbという便利コマンドがあり何とかなりました。

 

make gdbRubyソースコードディレクトリ内にtest.rbを置くとそれを実行し、SEGVした際の情報などをgdbデバッグできるというコマンドです。

これのおかげでバックトレースなどをを詳細に確認でき、意図せぬ初期化漏れなどをつぶすことが出来ました。

 

今後

とりあえず、Integerのリテラルオブジェクトは剥がせそうな様子になってきたかなと思います。

ただCIがパスしていないことや他のリテラルオブジェクトを対応しないといけないので道のりはかなり長そうです。

 

ひとまず次は、CIがパスするところを目標に対応を進めたいと思います。

その後はSymbolかFloatを対応していきたいですね。

 

あと「とりあえず動く」を目標にコードを書いてるので大分アレな感じになっているのも直していきたい......。

 

Creatodonでparse.yのUniversal Parserを使っている話

はじめに

これは僕が運営・管理しているCreatodonというMastodonのサーバーでRubyに最近導入されたparse.yのUniversal Parserを使うようにした時の備忘録になります。

Rubyに導入されたparse.yのUniversal Parserのビルド方法については以下の記事が参考になります。

blog.agile.esm.co.jp

parse.yのUniversal Parser についてのより詳しい話は、yui-knkさんの以下のスライドも参照していただければと思います。

speakerdeck.com

やったこと

Creatodonではrbenvを使って利用するRubyをビルドしているので、以下のように cppflags=-DUNIVERSAL_PARSERを渡しています。 またjemallocとyjitを併用しており、それらもオプションとして渡しています。

RUBY_CONFIGURE_OPTS="--with-jemalloc --enable-yjit cppflags=-DUNIVERSAL_PARSER" rbenv install 3.3.0-dev --verbose

上記のコマンドを実行して、エラーなどなく終了すればparse.yのUniversal Parserを利用したRubyがビルドできています。

現状とか

parse.yのUniversal Parserを利用するようにしてから一か月くらい経ちましたが、いままでのところ問題なく使えています。 なので、他のRailsアプリケーションなどでも問題なく使えるんじゃないかなと思いますね。

Creatodonで利用しているOSのバージョンを上げた話

はじめに

これは僕が運営・管理しているCreatodonというMastodonのサーバーでOSのアップデート対応をした時の備忘録になります。

普段通りにMastodonの最新のソースコードに追従したところ、ローカル環境でテストが落ちておりその余波で本番環境のOSをアップデートまでやった話になります。

背景

僕が管理しているCreatodonでは数日おきにMastodonの最新のソースコードに追従しています。 これは開発版を使うことでMasotodon本体の問題などを検知しやすくする意味合いと、単に僕が最新機能を使いたいというところからこういった対応をしています。

で、直近で入った以下のAVIF形式の画像を投稿できるようにした修正の影響でローカル環境でテストが落ちるという状況が発生していました。

github.com

修正自体は、Web UIなどからAVIF形式の画像を受け取り、それをサーバー側でPNG形式に変換するというもの。

テストが落ちていたのはこの変換部分の処理で呼び出されているImageMagickでAVIF形式の画像をサポートできていなかったためでした。

そこでImageMagickでのAVIF形式のサポートを調査し、対応を進めていた感じです。

またローカル環境としては

  • Ubuntu 20.04 LTS(WSL)
  • Ruby 3.3.0-dev
  • Node.js v20

を利用している状況でした。

また本番環境もローカルと同じものを利用している状況です。

ImageMagickでのAVIFサポートについて

現状ではImageMagick 7 と 6系列の一部ではAVIF形式の画像をサポートしているようです。

kmy.blueの鯖缶さんが書かれた以下の記事などでもわかるようにAVIF形式の画像をサポートできるのはImageMagick 7系列からのようです。

note.com

ただ上の記事中に言及されているように、Masotodon公式ではImageMagick 6系列を利用しており、CI上でもテストが落ちていませんでした。

そこで追加の調査を進めたところ、CI上などで利用されているUbuntu 22.04 LTSでインストールできるImageMagick 6は20.04のものとバージョンが異なっており、かつAVIF形式の画像をサポートしているということが分かりました。

そのため、Ubuntu 20.04を利用しているサーバーでAVIFへの対応する場合の方針としては

のどちらかになりそうでした。

最終的な対応について

結論から言うとCreatodonではUbuntu 22.04へとOSを上げる方向で対応しています。

というのも該当のバージョンでImageMagickをビルドしようとしたところlibheifなどの関連ライブラリがaptで取ってこれなかったんですよね。 なのでlibheifをソースコードからビルドしようとしたところ、さらにその依存先のライブラリがそのまますんなりビルドできなさそうな感じにもなっていたという......。

またいずれにしてもOSのアップデート対応をする必要は出てくるので、今回はOSを上げる方向で対応した感じです。

今後

一旦Ubuntu 22.04にあげる方向で対応できましたが、すべてのサーバーでそれをやるのは厳しいよなぁと思ってます。 なので、また別途ImageMagickをビルドする方向で対応できないか調査してみたいと思ってます。

esaで書いたリリースノートを自動でMastodonに投稿するようにした

はじめに

表題の通り、esaで書いたリリースノートを自動的にMastodonへ投稿するようにした時の覚書になります。

 

背景

CreatodonというMastodonのサーバーを運営しており、常に最新のMastodonソースコードに追従するようにしています。

gamelinks007.net

 

で、僕以外のユーザーさんへどういった変更が取り込まれたかをリリースノートととしてesaに以下のようにまとめていました(実際には僕が後で変更差分を振り返る時にも使ってたりもします)

 

esa-pages.io

 

このリリースノートを書いたうえで、

  • ソースコードの追従作業を行う
  • 動作確認
  • 本番環境への反映対応
  • リリースノートの投稿
  • お知らせ機能でのリリースノートの共有

などを対応していました。

 

動作確認についてはCypressでのE2Eテストやテストコードの拡充などで自動化が済んでiいます。

本番環境への反映作業についてもGitのフックを使い、GitHubからソースコードをpullする際におおよその作業は自動化していたりします。

 

ただ、リリースノートの投稿などに関しては毎回手作業で対応しており、ちょっと面倒くさくなっていました。

 

そこで、そのあたりを今回自動化してみたという感じです。

 

やったこと

 

基本的には

  • Masotodon側でAPIトークンを生成
  • esaで書いたリリースノートを外部記事として公開する際にWebhookをLambdaに投げる
  • Lambdaで受け取ったWebhookの内容を調整し、APIトークンを使ってMastodonへと投稿する

という感じで対応しました。

 

esaのWebhookについては以下のドキュメントを参照しつつ対応。

docs.esa.io

 

docs.esa.io

 

Lambdaに関しては、HTTPSエンドポイントが利用できるようになっているのでそちらを使ってサクッと対応しています。

 

dev.classmethod.jp

 

あとはLambdaで受け取ったWebhookを調整してMastodonへ投稿する処理を以下のように書いた感じです。

github.com

 

実際に投稿できたもの

gamelinks007.net

 

こんな感じで外部記事として公開すると自動的に投稿出来ていい感じですねー。