サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
新内閣発足
blog.willnet.in
Ginza.rb 第92回 - アプリケーションサーバについて学ぶぞ - connpass 第92回はRubyから使うアプリケーションサーバについて学びました。 アプリケーションサーバ2025 実は第75回や第76回でもその当時新しかったアプリケーションサーバについて学ぶというのをやっていました。しかしそこから6年経過してpitchforkなどまた状況が変わっているかな、ということで再度のアプリケーションサーバ回です。 y-yagiさんの用意してくれた資料をみながらワイワイしました。今回とりあげたサーバは以下の5つです。 puma unicorn pitchfork falcon Itsi pitchforkとItsiが新しい枠でpuma、unicorn、falconが既存枠。 雑感 アプリケーションサーバに求められているのは何より安定性なので、その点で新しいアプリケーションサーバがpum
wkhtmltopdfの次どうするか問題 - おもしろwebサービス開発日記の続き。 上の記事でも書いていますが、令和の今RailsアプリケーションでPDFを生成する基本的な方針としては次の2択だと思っています。 chromeを使ってHTMLからPDFに変換する Thinreports などで直接PDFを生成する 「chromeを使ってHTMLからPDFを生成する」のgemとしてはgroverが有名ですね。だけどこれはruby -> puppeteer -> chromeという構成で、間にnode製のツールであるpuppeteerが挟まっています。 ferrum はrubyから直接chromeを扱うgemなので、これを利用するとnodeが不要になるしメモリ消費量も多少下がるはずだしいいじゃん、と前記事を書いているときは思っていました。しかしferrumはあくまでchromeを操作するのが目
gazay/gon: Your Rails variables in your JS お手伝い先で使っているので見てみたら最終コミットが4年前でIssueやPRが積み重なっており、CIはTravisCIという状況。メンテされないgemとどう向き合うか。“普通のOSS開発者” willnetさんの取り組み で書いたようにCIをGitHub Actionsに移行するPRを出して作者にメンションするも音沙汰なし、というところで気合を入れて作者にメールをしたところメンテナ(collaborator)にしてもらえました。 seed-doと同様に、新しいRubyやRailsで動かないのをなんとかするくらいのモチベはあるのでできる範囲で頑張っていこうと思います。
Ginza.rb 第91回 - Gumroadのソースコードを読むぞ - connpass 第91回はOSSになったGumroadのコードを読みました。 Gumroad 実際にお金を稼いでいるアプリケーションのコードをOSSにして、外部コントリビュータのPRをうけつつその上で開発を進めるというのは世界的に見てもなかなかユニークな形式なのではないでしょうか。 流石にコード公開前の履歴まではみれないですが、それ以外は特にコードの公開用に体裁を整えた形式が見えないのが潔いなと思いました。コードを眺めるとapp/helpersにビューヘルパーではないヘルパー用モジュールが含まれているのとか、app/modulesがなんでもモジュール置き場になっているのとかにとてもリアルさを感じます。このような負債は多かれ少なかれ歴史のあるアプリケーションには必ず見られるものですが、今後これとどのように付き合ってい
昨日Findyさんに寄稿した記事が公開されました。もしまだ読んでない方いたら読んで記事下部にある「応援」ボタンをポチッと押してください。Ruby Associationへ応援の数 * 100円寄付されます。 メンテされないgemとどう向き合うか。“普通のOSS開発者” willnetさんの取り組み この記事内でseed-fuをforkしてseed-doを作ったぞ、という話をしていますが、OSS開発という話の流れの一部で書いているのでスルーしてしまう人もいるかなと思いこのブログ中でも書いておきます。 seed-fuってなに seed-fuはRailsのシードデータ(本番、開発環境に関わらず)を作るためのgemです。Rails公式としてはdb/seeds.rbがシードデータ用のファイルとして用意されていますが、db/seeds.rbは空のファイルであり、具体的にどうやってデータを用意したら良い
Rails8からrails g authenticationで簡単な認証用のコードが生成できるようになりました。これまで認証といえばdevise gemが定番でしたが、rails g authentication(以下認証ジェネレータと呼びます)もこれから一定使われるようになるのではないかと想像しています。 そんな認証ジェネレータを利用して、生成されたコードを読んでみると気になるポイントがあります。認証用の情報がsession[:user_id]ではなくcookies.signed[:session_id]のような形で保持する形式になっているところです。 rails/railties/lib/rails/generators/rails/authentication/templates/app/controllers/concerns/authentication.rb.tt at mai
最近、Lamby というRackアプリケーションをAWS Lambda上で動かすためのGemを使って、RackアプリケーションをAWS Lambda上で動かしてみました。簡単に使えて良い感じだったのでメモしておきます。 前提 もともとm3 tech blogの記事 を見てLambdaでもRailsを動かせることは知っていました。 ここ数年ほど個人ブログ用のリダイレクタを DigitalOceanの$4/月のインスタンス上で動かしていたのですが、普段は全然アクセス数がないはずなので、これをLambdaに載せ替えたらもっと安くなるのでは?と思い、試しに乗り換えてみることにしたのでした。 設定の仕方 Lambyでは、以下のようなコマンドを使って新しいRailsアプリ*1の雛形を生成できます。 docker run \ --rm \ --interactive \ --volume "${PWD}
これはRubyKaigi 2025のLT用に出したプロポーザルの内容をブログエントリにしたものです。プロポーザルは落選したのでここに書くことで供養しておこうと思います。 導入 既存のメソッドの定義を再利用しつつ新しい振る舞いを追加する方法としてはModule#prependが一般的な手法ですが、Module#prependがなかったころ(Ruby < 2.0)はaliasを利用していました。深く考えずに昔の名残でaliasを利用する人がまだいるかもしれません。しかし、aliasとModule#prependが組み合わされると思わぬ不具合に遭遇することがあります。 不具合の例 次のように、同じメソッドをModule#prependで上書きしてからaliasで上書きするとSystemStackErrorになります。 class Hello def say 'hello' end end Hel
Railsでよく使われるテンプレートエンジンとしてerb(erubi)、haml、 slimがあります。パフォーマンスの観点だけをとりあげたとき、約5年前に パーフェクトRuby on Rails【増補改訂版】 を書いたときには、速い実装を選べば速度差は特にないという認識でした。それを裏付けるベンチマークはこちら↓。 当時のベンチマーク結果 2025年でも結果は変わらないかな?と思い新しくベンチマークを取ってみた結果が次のとおりです。M1 max MBPでベンチマークを取っています。 前提として、hamlのv6以降、hamlitがhamlになったのでhamlitは入れていません。あと個人的に注目しているPhlexを追加しています。 ruby 3.4.2 (2025-02-15 revision d2930f8e7a) +PRISM [arm64-darwin24] Warming up -
時折、仕事でRailsのconfig.load_defaultsのバージョンを上げていく作業をしています。具体的には上げるバージョンに含まれるそれぞれの設定の意味を理解して、影響範囲を把握したうえで一つづつPull Requestを作るようにしています。実際にやってみた感想としては、これはなかなか難易度が高くきちんと影響範囲を理解したうえで実施できているプロジェクトは少ないのではないか?と思いました。そこで、これからconfig.load_defaultsのバージョンを上げる人の役に立つようにブログエントリを書いてみた次第です。 今日はconfig.load_defaults 7.0に含まれるconfig.active_support.hash_digest_class = OpenSSL::Digest::SHA256を取り上げます。 対象となるコミット: Change the defa
Ginza.rb 第85回 - Solid Trifectaについて学ぶぞ - connpass Rails8.0にはいったSolid3兄弟*1ことSolid Cache, Solid Cable, Solid Queueについて取り上げる回でした。まずはy-yagiさんがSolid CacheとSolid Cableについて資料を作ってくれたのでそれを見ながらワイワイしました。 About Solid Cache - Slidev About Solid Cable - Slidev Solid Cacheをきちんと使うにはDB側の設定を頑張る必要があり運用の難易度も高そうなので、HEYやBaseCampのようにRedisのメモリに乗り切らないくらいのキャッシュを使うのでなければRedisをストレージにしたほうがいいんじゃないか、などの話をしていました。運用の知見に関してはこれから公開さ
表題の通り、発表してきました。 Sidekiq vs Solid Queue | Kaigi on Rails 2024 スライドはこちら。 発表に至るまでの道のり イベントの懇親会などでエンジニアの人と話しているときに「最近気になっているgemあります?」のような質問に「Solid Queueですかねえ」と返すと「なんですかそれ?」と聞かれたりする イベントの懇親会などでSidekiqを使っている会社さんの中の人にProやEnterpriseつかってます?と聞くと「なんですかそれ?」と聞かれたりする 新しいRailsで標準になったが、既存のRailsアプリケーションには影響がないもの(例: importmaps)に対して「Railsアップグレードするならこれ対応しないといけないですか?」と聞かれたりする SidekiqとSolid Queueをお題にして話せばこの手の疑問を一気に解決でき
以前のエントリで、スレッドローカル変数とファイバーローカル変数について解説しました。このエントリはその続きになります。 ファイバーストレージとは スレッドローカル変数やファイバーローカル変数を使うと複数(スレッド|ファイバー)環境で固有の値を持つことができて便利です。利用例としてはActiveSupport::CurrentAttributesなどがあります。 しかし、(スレッド|ファイバー)ごとに固有の値を持つことで不便を感じるケースがあります。例えばRailsなどでリクエストを受け付けている最中に別の(スレッド|ファイバー)を作り、その中で外部APIを叩くとします。このときに外部APIを叩く(スレッド|ファイバー)からリクエストを処理する(スレッド|ファイバー)で設定した(スレッド|ファイバー)ローカル変数を参照することはできません。これは不便ですね。 この問題を解決したのがRuby3
僕はRailsアプリケーション開発者としてはなるべく型は書きたくない派閥に属しています。でもライブラリ作者としては型をつけておくと利用者が嬉しいだろう、という気持ちがあります。 そんな折gimeiにPRがきたので、重い腰を上げて型を導入したときのメモを残しておきます。 関連エントリ: gimeiのv1.3.0をリリースしました - おもしろwebサービス開発日記 型はどうやって学ぶか 執筆時点では日本語におけるまとまったいい感じの記事は少なめな印象です。文法については pockeさんの記事が詳しく、読むと基本的な文法について把握することができます。 あとは公式のドキュメントでをひたすら読むのがよさそう。 rbs/docs at master · ruby/rbs steep/README.md at master · soutaro/steep gimeiで定義した型が正しいかチェックする
このエントリは SmartHR Advent Calendar 2023の21日目の記事です。 Railsのバージョンを上げる作業は、単に新しいバージョンのgemをインストールするだけでは終わりません。Railsの新しいバージョンに沿った設定項目を確認し、適宜適用していく必要があります。もちろん必ずしもすべての設定を最新にしなければならないわけではありませんが、Railsの新しい設定というのは基本的にそうすることにメリットがあるから作られているわけで、特別な理由がなければ最新の状態にしておきたいものです。 みなさんのRailsアプリケーションのconfig/application.rb には次のような設定があるはずです。 config.load_defaults 6.1 このコードサンプルは引数が6.1なので、Rails6.1デフォルトの設定を適用していることを示しています。これを7.0に
Kaigi on Rails初のオフライン開催であるKaigi on Rails 2023で登壇する機会をいただけました。 例外は遅い 資料と動画は こちら から辿れます。 ちょっと間が空いてしまいましたが、以下登壇に関連してつらつら思いついたことを書いています。 なんでこの題材で話をしたんですか これまでのKaigi on Railsの発表内容から 明日の業務から使えるRailsの知見 Railsアプリケーション開発の実例 に関連したキャッチーなテーマが採択されやすんだろうな〜、とあたりをつけていました。僕は前者のネタはたくさんストックがある*1ので、その中で みんな興味がありそう 既存の書籍や記事ではあまり取り上げられていない題材 として、例外がよさそうだとなったのでした。発表でも言及した destroyじゃなくてdestroy!を使いましょう rescue_fromだけでエラーハンド
前回の大阪RubyKaigi02に続き、大阪RubyKaigi03でも登壇機会をいただけました。 スライドはこちら。 感想 自分含めみんなflaky testで疲弊しているので、それを仕組みで解決したいぞ、みんなで仕組みを作っていこうぜという発表でした。10分の発表は思っていたよりも短くて*1いろいろ省略してしまったのが残念ポイントです。 話したいことがもっとあった(時間が足りなくて省略したことがたくさんある)ので、その辺まとめたブログエントリを後日書くかもしれません #osrb03 https://t.co/6gYajmqrbF— willnet (@netwillnet) September 9, 2023 私と大阪 発表時間が足りなかったのもあって自己紹介は10秒で駆け抜けてしまったのですが、僕は昔ちょっとだけ大阪に住んでいたことがあります。発表の翌日は住んでいたあたりをひたすら散歩
先日、仕事でRails(Active Record)の難しい仕様に遭遇したので共有するためにエントリをしたためました。似たようなケースに遭遇した人の手助けになれば幸いです(\( ⁰⊖⁰)/) 対応Railsバージョンと設定 Rails6.1以上 config.active_record.has_many_inversing = true(Rails6.1のデフォルト設定)である 問題1 まず次のコードを読んでみてください。 class User < ApplicationRecord has_many :posts end class Post < ApplicationRecord belongs_to :user, inverse_of: :posts # (1) before_update { puts 'before_update' } end user = User.new po
TokyuRuby会議14に参加してLTしてきました。 スライドはこちら。 発表について mrskは個人的にかなり推しているプロダクトで、これの存在により仕事でも個人でも今より安いインフラを活用する選択肢を取りやすくなったと感じています。とりあえず僕が今運用しているサービスはmrskを活用してDigitalOceanあたりに寄せていけたらな、と思います。みなさんも使ってみると便利ですよ。オススメ。 感想 久しぶりにオフラインで5分のLTをしました。あと色んな人とビールを飲みながら雑に会話して、コロナ禍以前の地域コミュニティの感覚ってこんなだったなあ…と思っていたら6時間があっという間に過ぎていきましたね。次回のTokyuRuby会議も楽しみにしています。 次回発表予告 Osaka RubyKaigi 03のCFPが通っているので、9月の発表に向けて資料作りを頑張っていきます。当日大阪参加す
この件、関連するPRやIssueが複数あってコメントも分散しており、人に説明するのがややこしいのでブログとしてまとめたものになります。間違いや意見などあったらコメントください! 追記(2023/08/02) 7-0-stableブランチに今回の変更をrevertするコミットが入りました。挙動が変わって困った人が出たので一度元に戻して仕切り直しにする方針のようです。 [7-0-stable] Revert singular association breaking changes by zzak · Pull Request #48809 · rails/rails 7.0.7がいつリリースされるかはわかりませんが、今の状態でリリースされたら7.0.4の振る舞いに戻ることになります。7.0.5以降の変更で困っている人は一旦7-0-stableを指すようにすると良いかもしれません。 概要 Ra
10年ほど前にサービス開始したmiucheeですが、この度Twitter API有料化を受けてサービス終了することにしました。 10年前はぼくの両親の携帯電話はガラケーでしたが、今となっては二人ともスマホを使うようになり、みてね 経由で孫の写真を共有したり、facetimeでビデオ通話をしたりとするようになりました。 昔と比べるとスマホを始めとするデバイスがいろんな世代にも普及して、情報共有がやりやすくなった結果miucheeもその役目を終えたのではと思います。 ご利用いただいていたユーザの皆様ありがとうございました。
wkhtmltopdfというライブラリは、HTMLからPDFを生成してくれるライブラリです。Rubyからだとwicked_pdfや pdfkit 経由で使われることが多いです。 さてそんなwkhtmltopdfですが、GitHubリポジトリ を見るとわかるようにアーカイブされてしまっています。公式ページ に経緯が書いてありますが、要約するとwkhtmltopdfが依存しているQtWebkitのメンテが止まったのが原因でメンテが続けられなくなったということのようです。 wkhtmltopdfが参照しているQtWebkitはかなり古いものなので、モダンなブラウザでの描画と差分が出たり、脆弱性を付かれたりする可能性がありそう。なのでなにか別のやり方に乗り換えたい。 選択肢を考えてみる 乗り換え先は具体的に何がいいの、というと僕も自信を持ってこれだ!という解を持っていないのですが、headless
表題の通りのことができるgem、CiLoggerが便利ですよという話です。 私達は大量のテストをCI上で実行しています。テスト結果を見れば失敗理由が自明なものもありますが、E2Eテストなどでよく起きる「たまに失敗するテスト」の調査はログやスクリーンショットなど、可能な限りの情報を集めないと根本原因がつかめないことが多いです。 そんなときに、特に考えずRailsデフォルトの設定(config.log_level #=> :debug)のままにしておくと、膨大なログの中から該当するテストに関連する行を探し当てる作業が必要になります。これは事前の準備なしではほぼ不可能です。 事前の準備として簡単に思いつく方法は、テスト前後で「どのテストが開始/終了したか」をログに出力することです。 config.around do |example| Rails.logger.debug("start exam
このエントリはSmartHR Advent Calendar 2021の23日目の記事です。 SmartHRでは毎週「Rubyist@SmartHR(仮)」という名の定例ミーティング*1が行われています。このミーティングはバックエンドエンジニアが集まり、チームをまたいだ情報共有や相談をすることを目的としています。その中では僕がTipsなどを共有する「willnetさんのありがたいお言葉」というコーナーが常設されています。 このエントリでは、そのコーナーで共有した内容をひとつ紹介します*2。 Thread#[]で取得できる値はファイバーローカル変数なのだった アプリケーションのコードではあまり見かけませんが、ライブラリ中でスレッドセーフを意識している設定を読むと Thread.current[:locale] = :ja のようになっているのをよく見かけます。それで僕はThread#[]はス
Rack::RuntimeというRackミドルウェアがあります。これはリクエストを処理するのにかかった時間を"X-Runtime"というレスポンスヘッダに含める、というものです。コードはこれ↓ rack/runtime.rb at master · rack/rack これはRailsのデフォルトのRackミドルウェアであり、特に何もしない限り有効になっています。 このX-Runtimeが、タイミング攻撃で使われている事例があったとのことで、デフォルトから削除になりました。 Remove Rack::Runtime and deprecate referencing it · rails/rails@7bfcf4b これにより、明示的にRack::Runtimeをミドルウェアで使う宣言をしない限りはRack::Runtimeは使えなくなります(Rails7.0から)。 実際にはX-Runt
僕がお手伝いしているiCAREさん主催のミートアップ、iCARE Dev Meetupで、最近発表されたBasecamp社製jsフレームワークであるHotwireについて話しました。 【iCARE Dev Meetup #18】技術顧問が語る、Ruby on Rails実践開発 - connpass 動画も公開されているので気になる方は探してみてください*1。 所感 弊社サービスであるsavanna.ioはHotwireを使って作っています。Hotwireはつい最近発表されましたが、その前身となるフレームワークであるturbolinksとStimulusの組み合わせで数年間開発していました。 なので「サーバサイドはHTMLを返し、jsは最小限」というスタイルが少人数で開発するチームにとてもマッチすることは身を持って体験しています。Vue.jsやReactを採用していたら機能を開発するスピー
弊社サービスである savanna.io はずっとTurbolinksとStimulusで開発してきたのですが、この度 Hotwireがリリースされた*1のでTurbolinks部分をTurboに置き換えてみました。その際のやったことやハマったことのメモを残しておきます。メモ書きなので雑なのはご容赦ください。 前提 webpackerを使ってます。assets pipeline派や素のwebpackを利用している人は適宜読み替えてください TurbolinksのアンインストールとTurboのインストール turbo-railsをGemfileに追加してbundle install ./bin/rails turbo:installをする で問題なくいけるのであればそれで。turbo:installが失敗したらturbo-rails/turbo_with_webpacker.rb と同等のこ
本エントリはiCARE Advent Calendar 2020の25日目です。 僕はiCARE社内で技術顧問としていろんなことをやっていますが、そのうちの一つとしてRailsアプリケーションのテスト改善があります。具体的には「たまに失敗するテスト」で難しいものがあったときに調査して解決をしています。この「たまに失敗するテスト」はiCAREに限らず、ほとんどの会社が苦しめられているのではないでしょうか。僕のお手伝いしている他の会社でも同様なので、複数社の社内ドキュメントツールに「こういうふうに調査するといいですよ」という文章を書いています。しかしこれらはどれも社内wikiどまりで、現時点で公開されている文章が存在していません。 そこで今回この場を借り「失敗したテストがあったときにどうしたらいいのか」の決定版を書いて、今後は「これ読んでおいてください」で済ませたいなと思っています。 前提 R
この記事はSmartHR Advent Calendar 2020 11日目の記事です。 僕のお手伝いしているSmartHRでは、毎週バックエンドエンジニアが集まり、技術的なトピックについて共有、相談しあうミーティングを開催しています。そのミーティングでは僕がTipsなどを共有するコーナーが常設されています*1。 このエントリでは、そのコーナーで共有した内容をひとつ紹介します。 APIに制限をかける方法について APIを外部に提供するとき、一定の制限をかけてユーザがAPIを乱用するのを防ぐことはよくあることではないでしょうか。素直に考えると「1時間に5000回までAPIを実行できる」のようなやり方を思いつきますね。GitHubのAPIもそのやり方ですし、SmartHRのAPIも同様です。 じゃあそれでいいのでは。となるかもしれませんが少し待ってください。いろんなクライアントがAPIを大量に
次のページ
このページを最初にブックマークしてみませんか?
『おもしろwebサービス開発日記』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く