おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

ginza.rb 第98回を開催してspinelについて学んだ

Ginza.rb 第98回 - spinelについて学ぶぞ - connpass

第98回はmatzの新作である matz/spinel を題材にみんなで学びを深めました。

今回が最後のメドピア株式会社さんの会場提供でした。過去のイベントの情報を見たところ、第57回 からお世話になっていたようです。長年のサポートありがとうございました!

y-yagiさんが資料をまとめてくれた のでこれを見ながらワイワイしました。

感想

  • spinelは最初「Rubyランタイムのない環境でもRubyを配布して動かす」系のプロダクト(例: Tebako )なのかな、と想像していたのですが少なくとも現時点ではそうではないというのがわかりました。Windows対応がWSL実行のみサポートとのこと
    • 「いろんな環境にバイナリを配る」という用途だとgolangが選ばれがちだけど、これをspinelが置き換えられたらいいなあと思っている
  • ThreadがM:Nモデルなのがパフォーマンス的に有意に効きそうだなあという気持ちになりました
  • Cライブラリを使うのがCRubyよりも楽そう
  • 基本的に黒魔術系は禁止なのでRailsアプリケーションを普通に動かすのは難しそう
    • 普通じゃないやり方(Railsアプリケーションをトランスパイルする)でRailsアプリケーションを動かそうとしている人、Sam Rubyさんがすごいねという話をした
    • rubys/roundhouse: Rails as a specification; the deployment target is a build flag
    • 今年の終わりまでにMastdonをspinelで動かすぞ、という目標で頑張っているらしい
    • spinelで仕事のRailsアプリケーションを動かすことができると、明確にスループットとメモリ使用量が改善すると思うので夢がありますね
  • 今も活発に改善が行われているので、この認識も少し時間が経過したら変わっているのかもしれません

次回

10月7日(水)に、株式会社マイベストさんの会場をお借りして開催します。お題はRails8.2です。ご都合の合う方はどうぞ。 Ginza.rb 第99回 - Rails8.2について学ぶぞ - connpass

ginza.rb 第97回を開催してRubyKaigi 2026を振り返った

Ginza.rb 第97回 - RubyKaigi 2026を振り返る - connpass

第97回は函館で開催されたRubyKaigi 2026の内容についてみんなでワイワイ振り返りました。

進め方

参加者の中に登壇者がお二人(dak2さんとkoicさん)がいたので2人の発表内容や登壇した感想などを話してもらい、そこからスケジュールを眺めて気になった発表について話したい人が話していく、という流れで進めました。

特にタイムキープ等せずに進めたらDay 2まででほぼ時間切れ><1時間ちょいで全部を振り返るには内容が多すぎましたね…。

個人的に気になった発表

個人的には、差分に対応する必要なテストを選別するための方法の発表が一番印象に残りました。

rubykaigi.org

僕の見ている範囲では、いろんな会社がCIサービスに対しての支払いを何とか減らそうと色々工夫しています。

工夫の内容としては、例えばデフォルトではCIを回さずに明示的にラベルなどをつけた時にだけCIを回す運用とか。そうするとCIを回したつもりが忘れていて困るみたいなことが時折起きます。コストは下げられるけど開発者体験とのトレードオフになっている感じがあります。

あとは例えばビューだけを変更したPRであればモデルの単体テストはスキップしても大丈夫なので、明らかにスキップできるアプリケーション差分とテストの対応表を頑張って作って適用するとか。これは便利だけど、作りこんで維持するのは大変そうだなという印象。

発表で触れられていたDatadogのTest Optimizationサービスを使っていればこの問題を良い感じに解決できるようですが、Datadogユーザでなくてもお手軽になんとかしてくれる仕組みを作れないもんかな〜と思っています。時間ができたらやりたい。

あとは僕は発表は見れてないのですがrubydexASTrotutorialkit.rbあたりは後で復習しておかないとな…となりました。複数トラック形式だと物理的に全ての発表を聞くことはできない*1ので、他の参加者の視点を教えてもらえるのはとても助かります。

コミュニティかわらばん用の寄せ書きを募集しています

「コミュニティかわらばん」であなたの活動を届けませんか?|関西Ruby会議に乗っかりたいな、と思っているのでginza.rbメンバーからの寄せ書きを募集しています!こちらからお気軽にどうぞ。↓のポストにも書いているけど、一回でもミートアップに参加していればginza.rbメンバーです!

コミュニティかわらばんの寄せ書きを集めるスレ · Issue #1301 · ginzarb/meetups

次回

次回は7月24日(金)にspinelをお題にしてワイワイする予定です。ご都合の合う方お気軽にご参加ください (( ⁰⊖⁰)/)

Ginza.rb 第98回 - spinelについて学ぶぞ - connpass

*1:あと体力的にずっと発表を聞き続けるのも厳しい><

lambyを利用したRackアプリケーションが起動しなくなったのを直した

RackアプリケーションをLambdaでホスティングしてみたの続編です。

lamby を使ったRackアプリケーションはここ1年ほど特に問題なく運用できていたのですが、先日Lambdaで動かしているアプリケーションのヘルスチェックが失敗するようになりました。CloudWatch Logsを見てみると次のようなエラーが出ていました。

/usr/local/lib/ruby/3.2.0/bundler/runtime.rb:304:in `check_for_activated_spec!': You have already activated logger 1.5.3, but your Gemfile requires logger 1.7.0. Since logger is a default gem, you can either remove your dependency on it or try updating to a newer version of bundler that supports logger as a default gem. (Gem::LoadError)

lambyでは次のように、aws_lambda_ricというAWS公式のRuby用のクライアントを経由してRackアプリケーションを実行しています。これはlambyの公式ドキュメントにあるコードをそのまま引用して利用しています。

FROM ruby:3.2-bullseye

RUN gem install 'aws_lambda_ric'
ENTRYPOINT [ "/usr/local/bundle/bin/aws_lambda_ric" ]
CMD ["config/environment.Lamby.cmd"]

僕の作ったRackアプリケーションはGemfileで管理されたsinatraを利用していました。上記のコードを見てわかるように、aws_lambda_ricはGemfile管理外で実行されています。そしてaws_lambda_ricとsinatraはどちらもloggerを依存関係として持っています。

ログメッセージとこれらの事実を繋ぎ合わせるとaws_lambda_ricとsinatraのロードするloggerのバージョンが違うのでエラーになっていたということがわかります。Gemfileにaws_lambda_ricを明示的に追加して、ENTRYPOINTをbundle exec形式に変更することで解決しました。

FROM ruby:3.2-bullseye

RUN gem install 'aws_lambda_ric'
ENTRYPOINT [ "bundle", "exec", "aws_lambda_ric" ]
CMD ["config/environment.Lamby.cmd"]

これは本家にフィードバックしようと思ったのですが、gemそのものの問題ではないのでIssueを作りづらいな…となりとりあえずブログとして供養しておこうと思ってエントリを認めた次第です。

ginza.rb 第96回を開催してFizzyについて学んだ

Ginza.rb 第96回 - Fizzyソースコードリーディング - connpass

第96回は37signals社が公開したFizzyのソースコードを見ながらワイワイしました。

basecamp/fizzy: Kanban as it should be. Not as it has been.

fizzyというビジネスに対する感想

第96回を開催したタイミングでは「1000カード以上を作ろうとすると20ドル/月」という課金体系でした。ユーザ数などは無制限でだいぶ安い。さらにコードが公開されているのでオンプレでも動かせる。オンプレからクラウド、クラウドからオンプレへの移行もやりやすいようにuuid7で作っていて(それぞれが稼働している状態でデータをマージしてもidが衝突しない)、ユーザとしてみたら最高便利なんだけどサービス提供側からしたらこれで採算取れるのかな?と思っていたら完全無料のサービスになってしまって驚きました。元々どういうビジネスプランだったのか気になるところです。

設計や実装に対する感想

色々気になった点を列挙しています。

  • 大まかなコード体系としてはbasecamp/once-campfireと似ています(同一の会社のプロダクトなので当たり前だけど)。最近のプロダクトなのでAGENTS.mdだったりSTYLE.md)だったりとAIエージェントに読ませるためのファイルがあるのが違い。
  • 大きな特徴としてはsqlite3とmysqlのどちらでも使える構成だということ。元々はsqlite3で実装する予定だったけど途中で厳しいことがわかりSaaS版はmysqlにしたというのをどこかで読みました。
  • 全文検索をDBで実装しているというのも珍しいところです。一昨年のRails WorldでDHHが話していたActive Record Searchの原型はこれなんだろうと思っています。しかし実装としてはMySQLとsqliteの全文検索機能を比較的素朴に使っており、単語はスペースで区切られるのが前提になっているため日本語でFizzyを使うと検索はまともに動きません。残念><
  • seedの定義の仕方も面白いです。まずseed用のDSLを定義して、各テナントでDSLを利用してレコードを作っています。
  • マルチテナントなSaaSとしてテナントを分けるのをRackミドルウェアで実装している、というのも個人的には面白い点だと思いました
  • あとはライセンスが興味深かったです。基本MITと同等だけど競合サービスを作るのは禁止というO’Saasyライセンスを新設しています。
  • koicさんも書いてたけどzip_kitを知れたのは収穫でした。

次回

次回は5月15日(金)に、RubyKaigiの振り返りをやります。興味のある方はぜひご参加ください。

Ginza.rb 第97回 - RubyKaigi 2026を振り返る - connpass

seed-doのv4.0.0をリリースしました

seed-do v3.2.0をリリースしました - おもしろwebサービス開発日記 で書いていた速度改善案を実装してv4.0.0としてリリースしました。

rubygems.org

SeedDo.seed(bulk: true)とするとRailsのupsert_allを使用して一括でレコードをUPSERTできるようにしました。

PRはこちら

github.com

大半の人は、単にSeedDo.seedSeedDo.seed(bulk: true)に置換するだけでseedの実行が速くなるんじゃないかな、と期待しています。ただし upsert_all:unique_byオプションを利用している関係でPostgreSQLとSQLiteでしか利用できません。MySQLユーザの人はごめんなさい。

また、この機能を入れるにあたって内部APIの整理をした関係で非互換が発生したのでメジャーバージョンアップをしています。内部APIを使ってなければ関係ないはず。

利用してみて、何か感想などあれば教えてもらえると嬉しいです。

株式会社ウィルネットは設立9周年を迎えました

2月21日は弊社の設立記念日でした。もう会社運営も10年目。時間が過ぎるのはあっという間ですね…。

去年のエントリはこちら:

blog.willnet.in

法人9年目を振り返る

2025年の弊社(僕)の活動を振り返ると、OSS活動をよくやっていた印象があります。仕事の関係で見ていたライブラリのメンテが滞っていて仕方ないから直すか〜というのを繰り返していたらいつの間にかメンテナになっていたりしました。AI AgentのおかげでコミットメッセージやPRの英語に困らなくなったというのが要因として大きい気がします。

メンテされないgemの向き合い方についてfindyさんに寄稿したりもしました。

findy-code.io

あとはブログのエントリ数が2024年の倍以上あるのでまあまあアウトプットを頑張っていそう。お仕事の一環で僕が新しく知ったり学んだりした情報を共有するというのを継続してやっていて、そこでのアウトプットで満足してパブリックな状態にはせずにいたのですがやっぱりパブリックにもした方がいいよね、ということで時間や気力的に可能な分だけ公にしています。特にRails8.1のマイナーフィーチャーをまとめました みたいなやつがパブリックになっていると自分でも便利なのでもっとやっていきたい(時間があれば…)。

最近はAI Agentのおかげで時間がない中でもちょっとしたタスクを進めることができて楽しいです。仕事もプライベートもなんやかんやで忙しいのですが、顧問先に関しては週1日程度分を募集しています。興味ある方はお声がけください。

10年目も健康に気をつけつつ頑張っていきます (( ⁰⊖⁰)/)

ginza.rb 第95回を開催してRuby4.0について学んだ

Ginza.rb 第95回 - Ruby4.0について学ぶぞ - connpass

第95回はRuby4.0について学びました。ko1さんやmameさん、hsbtさんが書いてくれた資料を参考にみんなでわいわいしました。

感想

個人的にはRuby::Boxがどう自分たちの生活を変えていくのか、というのに興味があります。

例えば boxwerkのように、Ruby::Boxでパッケージを分けることでパッケージ間の疎結合を強制させるであるとか、Ruby::Box: Rethinking Code Reloading with Isolated Namespaces | Ruby Elders で書かれているような、アプリケーションのリロードをRuby::Boxを都度作り直すことで実現するとか。

Ruby::Boxが実際に我々の手元で動くようになったことで夢が広がりつつあるのを感じます。

次回

次回は3月13日(金)開催予定です。fizzyのソースコードリーディングをします。興味のある方はぜひご参加ください。

Ginza.rb 第96回 - Fizzyソースコードリーディング - connpass