福岡Rubyist会議04に登壇してきます

2024年9月7日(土曜) に開催される福岡Rubyist会議04に「Trying to Make Rubly's Parser Available as a Gem」というタイトルで登壇してきます。

 

今回は実は大江戸Ruby会議の「生活発表会」のコンセプトに倣って、CfPを公開せずFukuoka.rbとドラゴンブック読書会 に関係する人々の「日々の活動」にフォーカスした会議を開催する試みをしています。

note.com

 

ということなので、僕が普段やっていることとなると「Mastodonの話か、Rubyの内部の話か、Rubyのパーサーの話になるよな」と思い、その中からRubyのパーサーの話をを選ぶことにしました。

 

発表の大枠としては、以下のチケットでRubyに入ったUniversal Parserをgemとして利用できるようにするという試みになります。

 

bugs.ruby-lang.org

 

現在、Rubyでは parse.y や node.c などのいくつかのソースコードを使うことでRubyのパーサー部分を利用できるようになっています。

ただ、実際にそれらのソースコードを使ってRubyのパーサー部分を動かしてみたという gem や実装はほとんどありません。

 

そこで Ruby の Universal Parser を gem として利用できるようにし、Rubyのコードを実際にパースできるものを作ると面白いのではと思い、そのあたりの話をしたいと思っています。

 

現状、登壇駆動開発で絶賛実装中という感じですが、当日は実際にRubyのコードをパースできるものをお見せしたいと思っています。

 

また勤務先の永和システムマネジメントから他にも同僚二人が登壇します。

お二人の登壇内容については開発者ブログの方を参照もらえればと思います。

 

blog.agile.esm.co.jp

 

また福岡Rubyist会議04の懇親会にも参加する予定なので発表で話しきれなかった実装時の裏話や困りポイント、Rubyの内部実装の話などをお話しできればと思います。

 

fukuokarb.connpass.com

 

再来週、福岡で僕とお会いしましょう!!

Firefishを建ててみた

Firefishを建ててみたときの詰まりどころとかをまとめた記事です。 基本的には公式ドキュメントに準拠する形でやってますが一部環境の問題などでバージョンを落としていたりしますので、予めご了承ください。

firefish.dev

環境

Google CloudのCompute Engineを使っています。 OSはUbuntu 22.04 、スペックはe2-medium(メモリ4GB、 vCPU2)で動かしています。

Firefishを建てるまでにやったこと

ドメインの準備

ここはすでに利用しているドメインがあったのでそのサブドメインを使う形にしました。

また僕の場合は先にGoogle CloudのCompute Engineを用意していたのでこのタイミングでサブドメインにA レコードでIPアドレスを渡して反映しておきました。

ユーティリティの導入

まずは以下のコマンドを実行してユーティリティを入れておきます。

sudo apt update
sudo apt install build-essential python3 curl wget git lsb-release

Node.js とpnpmの導入

次に、Node.js とpnpmを入れます。

まずは以下のコマンドでNode.js をインストールします。

NODE_MAJOR=20
curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | sudo -E bash -
sudo apt install nodejs

念のためインストールされたかバージョンを表示して確認しておきます。

node --version
# => 20.6などバージョンが表示される

次にpnpmを使えるようにします。

sudo corepack enable
corepack prepare pnpm@latest --activate

こちらも念のためにインストールされたかバージョンを表示して確認します。

pnpm --version
# => 9.6.0などバージョンが表示される

PostgreSQLとPGroongaの導入

PostgreSQLをインストールしていきます。

sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install postgresql-14

sudo systemctl enable --now postgresql

公式ドキュメントではPostgreSQL v16 をインストールしているんですが、今回用意した環境ではPGroongaが上手くインストールできなかったためバージョンを下げています。

ちなみに実際には以下のようなログが出ており、おそらく依存ライブラリのバージョンが古かったんだと思います。

postgresql-16-pgdg-pgroonga : Depends: libgroonga0 (>= 14.0.5)

ただこの辺りメモをしっかりとれていないので、実行手順が微妙に間違っていた可能性もあるので、ちょっとわからないですね。

PostgreSQLもインストールされているかバージョンを表示して確認します。

psql --version
# => 14などバージョンが表示される

次にPGroongaですが、インストールにあたっては以下のドキュメントを参考にしました。

pgroonga.github.io

実際のインストールにあたって必要なコマンドは以下の通りです。

sudo apt install -y software-properties-common
sudo add-apt-repository -y universe
sudo add-apt-repository -y ppa:groonga/ppa
sudo apt update
sudo apt install -y -V postgresql-14-pgroonga

Firefish公式ドキュメントにある手順とは別の方法でPGroongaをインストールしたのは、以下のコマンドで投げたリクエストが404になっており、パッケージが取得できなかったためです。

wget "https://packages.groonga.org/debian/groonga-apt-source-latest-$(lsb_release --codename --short).deb"

ちなみに、こちらは以下のようにdebianの部分をubuntuに変更するとパッケージが取得できていたのでリンクミスかもしれないです。

リンクミスではなく、READMEによるとDebian 12を対象にしているのでこれでOKのようです。

firefish.dev

なのでUbuntuでFirefishを建てる場合は以下のようにリンクを修正すればOKです。

wget "https://packages.groonga.org/ubuntu/groonga-apt-source-latest-$(lsb_release --codename --short).deb"

Redisの導入

以下のコマンドでRedisをインストールします。

curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
sudo apt update
sudo apt install redis

sudo systemctl enable --now redis-server

Redisがインストールされているかバージョンを表示して確認します。

redis-cli --version
# => 7.4.0などが表示されればOK

FFmpeg

以下のコマンドでインストールします。

sudo apt install ffmpeg

データベースの作成

Firefishで利用するデータベースを作成します。

ますは以下のコマンドでユーザーとパスワードを指定します。

sudo -u postgres createuser --no-createdb --no-createrole --no-superuser --encrypted --pwprompt firefish

実行後、パスワードを設定するように促されます。 ここで入力したパスワードはあとでFirefishの設定変更時に使用するのでメモしておきましょう。

もしパスワードをメモしておくのを忘れた場合は以下のコマンドでパスワードをリセットしておきましょう。

sudo -u postgres psql -c "ALTER USER firefish PASSWORD 'password';"

次に、データベースを作成します。

sudo -u postgres createdb --encoding='UTF8' --owner=firefish firefish_db

最後に、PGroongaの拡張機能を有効化します。

sudo -u postgres psql --command='CREATE EXTENSION pgroonga;' --dbname=firefish_db

Firefishのビルド環境準備

まずはFirefishで利用するユーザーを作成します。

sudo useradd --create-home --user-group --shell /bin/bash firefish

その後、作製したユーザーでログインします。

sudo su --login firefish

次にRustのツールチェインをインストールします。

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
. "${HOME}/.cargo/env"

実行後、以下のコマンドでcargoがインストールされていることを確認します。

cargo --version

次に、Firefishのソースコードをクローンします。

git clone --branch=main https://firefish.dev/firefish/firefish.git

クローン完了後、firefishディレクトリへ移動し、設定ファイルを編集します。 僕はVimを使っているためvimコマンドに変更していますが、慣れているエディタを使うと良いでしょう。

cd firefish
cp .config/example.yml .config/default.yml
vim .config/default.yml

色々設定項目が表示されますが変更箇所はurlとdb.passの二か所です。

url: https://<用意していたサブドメイン>/
port: 3000

db:
  host: localhost
  port: 5432
  db: firefish_db
  user: firefish
  pass: <データベース作成時に設定したパスワード>

用意していたサブドメインとデータベース作成時に設定したパスワードに変更します。

Firefishをビルド&データベースのマイグレーション

以下のコマンドでFirefishのビルドを行います。

pnpm install --frozen-lockfile
NODE_ENV=production NODE_OPTIONS='--max-old-space-size=3072' pnpm run build

次に、マイグレーションを実行します。

pnpm run migrate

マイグレーションが完了したらfirefishユーザーからログアウトします。

exit

ファイアウォールの設定

ufwを使ってファイアウォールを設定します。

sudo apt install ufw
sudo ufw default deny
sudo ufw allow 80
sudo ufw allow 443
sudo ufw --force enable

SSHに関してはここでは詳細は書きませんがポートを変更するなどしてあります。

あとは以下のコマンドで443と80が許可されているのを確認します。

sudo ufw status

リバースプロキシの設定

Firefish公式ドキュメントに則ってCaddyを使います。

sudo apt install debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update
sudo apt install caddy

最後にCaddyがインストールされているかバージョンを表示して確認します。

caddy version

Caddyがインストールされていることを確認した後は設定ファイルを編集します。

その前に元々の設定ファイルの名前を変更してバックアップとして使えるようにしておきます。

sudo mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak

好みのエディタで設定ファイルを開き、編集していきます。

sudo vim /etc/caddy/Caddyfile

設定ファイル二は以下の内容を貼り付けます。

<用意していたサブドメイン> {
    reverse_proxy http://127.0.0.1:3000

    log {
        output file /var/log/caddy/firefish.log
    }
}

その後、Caddyを再起動します。

sudo systemctl restart caddy

Firefishサーバーを公開

まずはserviceを追加します。 以下のようにエディタでfirefish.serviceを開きます。

sudo vim /etc/systemd/system/firefish.service

あとは以下の内容を張り付けます。

[Unit]
Description=Firefish daemon
Requires=redis.service caddy.service postgresql.service
After=redis.service caddy.service postgresql.service network-online.target

[Service]
Type=simple
User=firefish
Group=firefish
UMask=0027
ExecStart=/usr/bin/pnpm run start
WorkingDirectory=/home/firefish/firefish
Environment="NODE_ENV=production"
Environment="npm_config_cache=/tmp"
Environment="NODE_OPTIONS=--max-old-space-size=3072"
# uncomment the following line if you use jemalloc (note that the path varies on different environments)
# Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2"
StandardOutput=journal
StandardError=journal
SyslogIdentifier=firefish
TimeoutSec=60
Restart=always

CapabilityBoundingSet=
DevicePolicy=closed
NoNewPrivileges=true
LockPersonality=true
PrivateDevices=true
PrivateIPC=true
PrivateMounts=true
PrivateUsers=true
ProtectClock=true
ProtectControlGroups=true
ProtectHostname=true
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectProc=invisible
RestrictNamespaces=true
RestrictRealtime=true
RestrictSUIDSGID=true
SecureBits=noroot-locked
SystemCallArchitectures=native
SystemCallFilter=~@chown @clock @cpu-emulation @debug @ipc @keyring @memlock @module @mount @obsolete @privileged @raw-io @reboot @resources @setuid @swap
SystemCallFilter=capset pipe pipe2 setpriority

[Install]
WantedBy=multi-user.target

最後に以下のコマンドを実行してFirefishを起動します。

sudo systemctl enable --now firefish

参考

firefish.dev

pgroonga.github.io

2024年6月の振り返り

日々の生活

RubyKaigiの振り返りイベントに登壇してきた

andpad.connpass.com

 

Lramaのユーザーとして「この辺いいよね」とかを話してきました。

 

ゲーム

Halo

store.steampowered.com

 

イベントパスが来てたのでファイヤファイトやりつつこなしてた。

 

マッドマックス

store.steampowered.com

 

フュリオサの公開とかも合わさってかセールしてたので買っちゃったやつ。

マシンをカスタムしつつ、走り回れるのでいい感じ。

 

Still Wakes the Deep

store.steampowered.com

 

遊星からの物体Xとディザスター映画をミックスした感じのゲーム。

基本一本道&モンスターと戦うとかはない感じなので人によっては物足りなさを感じるかも。

あとローカライズが九州弁(実際には長崎とか博多とかをミックスした感じ)ということで色々言われてるけど、個人的にはかなりグッとくる感じに仕上がってたのでプラス要素だよなと思った。

 

OSS

Rubyのパーサー周りやLramaにPRを投げてた。

github.com

 

github.com

 

github.com

 

github.com

2024年5月の振り返り

日々の生活

RubyKaigi 2024でLTをしてきた

 

rubykaigi.org

 

RubyKaigi で登壇するのは初めてだったので大分緊張した......。

 

ゲーム

Halo

store.steampowered.com

 

引き続き、マルチプレイヤーをやったりしていた。

 

あと時たまHalo2のLegendaryキャンペーン周回とかをやったりしてた。

 
グノーシア

store.steampowered.com

 

GWの連休中にがっつりプレイしてクリアー。

いやぁ、あのエンディング良かった。

 

OSS

PrismにいくつかPRを出してマージされてた。

 

github.com

 

github.com

 

github.com

 

github.com

2024年4月の振り返り

日々の生活

 

冷凍の鯖を大量に買ったので焼いたり、南蛮漬けにしたりしてた。

南蛮漬けは最初は酢がなかったのでポン酢を使ってみて、二回目以降はすし酢を使ってみた。

ポン酢はじっくりつかると味が濃い目になるのでご飯泥棒な感じで、すし酢とかのほうがさっぱり目なので気分によって作り替えるとよさそうだった。

 

あとは、リングフィットアドベンチャーをがっつりやって体重を減らせたので良い。

 

ゲーム

Halo
Stray

store.steampowered.com

 

前々から気にはなっててプレイできないでいたんだけど、えいやで買ってそのまま一気にクリアまでやってしまった。

 

猫の動きとか凄くこだわりを感じるゲームで、ほんとかって良かった一作。

 

今は実績解除とかを進めている。

溶鉄のマルフーシャ

store.steampowered.com

 

これも前から気になってたゲーム。同じくえいやで買って一気にクリアまでやった。

世界観とかエンディングのあれこれとか86や装甲騎兵ボトムズを彷彿させる感じで好みだった。

さくさく進むのでちょっと空き時間あるなって時にプレイするのもよさそう。

 

グノーシア

store.steampowered.com

 

前にフォロワーさんからオススメしていただいたのもあり、気にはなっていたんだけどGWの連休もあるしで買ってプレイ中。

今のところループは50回目くらいなのでまだまだ勝てたり勝てなかったりという感じ。

 

ペルソナ3リロード

p3re.jp

引き続きプレイ中。とはいえStrayとかにリソース取られてたので進み具合はあんまりという感じ。

Hollow Knight

store.steampowered.com

同じく引き続きプレイ中。こちらも進み具合はあんまりという感じ。

 

リングフィットアドベンチャー

www.nintendo.com

 

購入してから二年以上経つけどようやくストーリーをクリア!

 

クリアはしたけど、引き続き運動不足解消のため継続してやってる。

OSS

引き続きRubyのパーサー周りにPR投げてた。

github.com

github.com

github.com

github.com

Creatodon

Mastodon のmain追従対応とかやってた。大きな変更とかが入ってえらいこっちゃになることはなかったので良いんだけど、少し刺激が減ってきた感じがあるので何かしら手を入れたい感。

主に利用している言語のバージョンとかその辺をやるか、サーバー移管をやるとかになるかもだけどまだ未定。

2024年3月の振り返り

日々の生活

運動をできるだけやるように生活習慣を変え始めた。

ゲームのところでも触れるけど二年ぶりくらいにリングフィットアドベンチャーを再開。

体調が悪い日以外はできるだけコンスタントにやるように心掛けている

そのおかげか体重も2kgくらい減り、大分体力が戻ってきた感じがある

 

ゲーム

Halo

相変わらずInfiniteではマルチプレイヤーでファイアファイトをやりながらウィークリーミッションとウィークリーアルティメットの消化とかをやっていた。

 

store.steampowered.com

 

コンスタントにウィークリーミッションを消化できていたのと、もう少し歯ごたえのある遊びがしたかったのでHalo2 Legendaryキャンペーン周回やHalo3 ODST Legendaryキャンペーン周回などもやっていた。

 

store.steampowered.com

 

Halo2Halo3 ODSTは大分久しぶり(たぶん数か月ぶり)のプレイだったのでどんなもんかなと思っていたけど、大分サクサクといけた。

とくにHalo3 ODSTの方は3時間以内くらいでクリアできたので大分いい感じだった。

 

Doom(1993)

最初のキャンペーンの「Keep-Deep in the Dead」をクリアした。

 

store.steampowered.com

 

Doom自体は初めてだったので武器の切り替え操作などで戸惑ったけど、プレイしているうちに慣れた

結構遊びやすい印象なのと、エイムもそこまで厳密ではないのでFPS始めるのにはいいかもしれない。

 

ペルソナ3リロード

p3re.jp

引き続きストーリーを進めながら、タルタロスでレベル上げをしていた。

まだ4月なので全然進んでないけど......。

 

タルタロスの攻略とレベル上げの見通しが立ったのでコミュ育成に力を入れていきたい。

 

 

Hollow Knight

メトロイドヴァニアかつソウルライクな2Dアクションアドベンチャー

 

store.steampowered.com

 

Xbox Game Passに前からあって気になっていたので初めてみた。

メトロイドヴァニア系はいくつかやったことがあるのもあり、今のところはサクサク進んでいる。

ただ大分広いダンジョンっぽいのでまだまだ遊び甲斐がありそう

 

リングフィットアドベンチャー

二年ぶりぐらいにリングフィットアドベンチャーを再開。

 

www.nintendo.com

 

最初のコースからプレイしなおして、ガンガンレベル上げとかやっていた。

 

とりあえず、3月中にクリア直前まで進められたので良い。

 

OSS

RubyにいくつかのPRを投げていた

 

github.com

 

github.com

 

NODE_ONCEの対応の件の詳細は事業部の開発者ブログの方に経緯とかまとめてある。

blog.agile.esm.co.jp

 

Ripperの件は、CreatodonでUniversal Parserを有効化していてRDocのビルドエラーが出ているのに気付いて調査を始めたもの。

メモリ周りの問題だったので、調査しながら初めて触ったGDBやValgrindにだいぶ慣れることができた。

 

Creatodon

引き続き、Mastodon のmain追従対応とかをしながらRubyのmasterで動かしている。

通知周りの設定がいくつか変更になったので、その辺りをまとめたりとかしていた。

2024年2月の振り返り

日々の生活

ひき肉を赤ワインで煮込んでミートソースを作ったりするのにハマっていた。

ケチャップとかで少し酸味強めにして、粉チーズをまぶしてまろやかにする感じで食べてたんだけど非常に良かった

一度に大量に作れるので作り置きしやすいのも良かった

 

あとは原木しいたけを頂いたので、それを焼いて醤油で食べたりしてた

そのまま焼いても美味しいんだけど、中華スープの素とかといっしょにスープにしておくのも良かった

 

ゲーム

Halo

久しぶりにHalo InfiniteのLegendaryキャンペーン周回とかやってた

久しぶりだったので大分ボス戦に苦戦するかなと思いきや、意外と覚えててサクサク進んでた

やっぱ継続してプレイしてたので少しは上達しているらしい

 

マルチプレイヤーの方は基本的にFirefightをこなしつつ、ウィークリーミッションを消化

あと個人的に嬉しかったのがミョルニルアーマーのMrak IVが来たこと

www.halowaypoint.com

 

ジェローム、アリス、ダグラスたちが使ってるアーマーでHalo Wars好きとしてはかなりありがたい

まだカスタムとかできていないので頃合いを見て好みのアーマーに仕上げたい

 

Sea of Stars 

store.steampowered.com

 

序盤はのんびりプレイしてたけど、だんだんとハマって最後はのめり込むようにプレイしてた

シナリオの楽しさ、音楽の良さももちろんだけど何より戦闘システムがいい

リズムよくボタンを押すと連撃が決まったり、ジャストガードができたりと臨場感があって良い

またスキルポイント的なものは通常攻撃で回復するので、どのタイミングで通常攻撃を行いスキルポイントを回復させるかの判断も絶妙に楽しい

 

戦闘中、強力な攻撃を行う相手の頭上に阻止するための攻撃属性とかが表示されるのでそれをうまくつきながら敵の攻撃をいなして完封とかができるシステムなのも非常に良かった

そのために仲間の入れ替えなどもうまく考えつつ立ち回らないといけない

上手く完封できた時の楽しさは最高

ペルソナ3リロード

p3re.jp

久しぶりのペルソナ

たぶん最後にやったの女神異聞禄ペルソナ(PS)を久しぶりにプレイした時なので数年前とかかも

 

初代と2とかは遊んでたんだけど、3は今回初めてプレイ

シナリオ自体はアニメ版を見てたのでだいたい分かってるので比較的サクサク進んでる

 

OSS

Rubyに最近導入されたUniversal Parserの依存関係整理とかやってた

github.com

 

あと社内の勉強会で出たバグの対応とかも投げたりしてた

 

月の終わりごろはUniversal Parserを有効化するとRipperがメモリ関連のエラーを出して落ちる件の調査とかをメインにやってた

とりあえず原因らしきところとか対応とかは見えてきたところなので引き続き頑張りたい

 

Creatodon

引き続き、main追従したりしてた

けど、Ripperのメモリ関連のエラー調査とかにかかりきりになってて最近追従できていないので週末に頑張って対応したい

 

あとCreatodonはUniversal Parserを有効化したRubyのmasterで動かしている

だけど、Ripperのエラーの件が解消できていないので暫くはUniversal Parser有効化したRubyは使えなさそうかなぁと思ってる

使ってるとやっぱりバグを踏むので出来るだけ使いたいけど......