自動テスト実行結果の目的を整理する / Organizing objectives of automated test results
Railsのプロジェクトがそこそこ大きくなり、ServiceやSerializerなどのカスタムレイヤーを追加してコードを細分化しているものの、レイヤーの役割やインターフェイスのルールが明確に決まっておらずふわふわとしていることを課題と感じていました。課題を解決するヒントを探すため、Railsの超巨大OSSプロジェクトであるGitLabの設計ドキュメントを読んでみました。 ガイドラインの必要性 まず初めにガイドラインの必要性が語られています。レイヤーの抽象化ができたとしても、それを正しく使えないと、あっという間にメンテナンスしにくいコードができてしまうということが説明されています。 例として、あるFinder(Finderはデータベースからデータを検索する抽象)の中で別のFinderを呼び出してはいけないということが挙げられています。もしそうしたなら、Finderにどんどんオプションが追加
Rails 6.0の複数DBのレビューしてるときに気づいたことなんですけど、たぶんリードレプリカからデータを読むテストをするのたぶん大変だと思われます。 うちの業務のアプリでActive Recordが更新を検知できない方法でデータが更新されるとテストがコケるという問題が以前にあり、これと同じ構造の問題がマスターのコネクションで更新したときマスターのコネクションのクエリキャッシュはクリアされるけどリードレプリカのコネクションのクエリキャッシュは残ったままというのがあるよね、というのをテストコードで示そうと思ったときのことである。 github.com 通常RailsアプリでDBつかったテストをするとき、テストの中で変更されたデータを毎回初期状態に戻すのにフィクスチャーをロードし直すのは時間がかかって効率がわるいので、テストケースに入る前にトランザクションを開始しといてテストケース終わったら
昨日まで何回かにわたり、多様なドキュメント形式の変換アプリケーションであるPandocのコアとなる仕組みを説明してきました。 特に、Pandoc構造とそれを生成するReader、生成されたPandoc構造を変換するPandocフィルターについて、少し時間をかけて紹介しました。 では、PandocのReaderとフィルターについて理解したところで、Pandocを使って本は作れるでしょうか? いままでの説明には登場しませんでしたが、Pandocの出力側を担うWriterには、「PDF生成のためのLaTeX Writer」や「EPUB Writer」など、「本」を作るのに使えそうなものがあります。 それらWriterを制御するためのコマンドラインオプションはいろいろ用意されており、独自のテンプレートを指定することも可能です。 ただ正直なところ、これらのWriterは、吊るしの状態では売り物の本を
こんにちは、タイミーデリバリー開発チームの宮城です。 今回は弊社のOpenAPI3ベースのスキーマ駆動開発の運用方法を紹介します。 TL;DR 技術スタックは OpenAPI3, Swagger UI, Committee, ActiveModelSerializers Committeeを利用してOpenAPI準拠のRequest Specを行う OpenAPI3のrequiredキーワードに注意する 背景 タイミーデリバリーでは、RailsによるAPIサーバーと、Web管理画面としてVue.jsによるSPA、ユーザー向けiOSアプリとしてSwiftを採用しています。 1つのモノリスなRailsで利用者別にネームスペースを区切り、それぞれエンドポイントを提供しています。 サーバーサイドとクライアントサイドを分離し並行して開発を進めるためにスキーマ駆動開発を導入しました。スキーマ駆動開発の
皆さんこんにちは、とらのあなラボのY.Fです。 先日、弊社エンジニアが開発で関わっているCreatiaで、以下のお知らせが投稿されました。 【新機能のご案内】#クリエイティア にて、『パスワードレスログイン』機能をリリースいたしました。 パスワードの代わりに指紋や顔認証、PINコードを使って、スムーズかつ安全にクリエイティアにログインできるようになりました! ▶詳細は下記記事をご参照くださいhttps://t.co/FzsVIAl7Sp— クリエイティア[Creatia]@ファンクラブ開設費無料! (@creatia_cc) 2023年6月8日 弊社のサービスは、とらのあな通販やサークルポータル除いて、ほぼRuby on Railsを利用しています。 speakerdeck.com 今回の記事では、Ruby on Rails + WebAuthnについて、調べたことなどをまとめてみたいと思
Rails 6.1の目玉機能として以下のように書けるwhere拡張を入れてたんですが、いろいろあって6.1からはrevertされてしまいました🥲 posts = Post.order(:id) posts.where("id >": 9).pluck(:id) # => [10, 11] posts.where("id >=": 9).pluck(:id) # => [9, 10, 11] posts.where("id <": 3).pluck(:id) # => [1, 2] posts.where("id <=": 3).pluck(:id) # => [1, 2, 3] github.com github.com なんですが、そんなことで引き下がる僕ではないので、6.1ではpredicate生成に干渉できる拡張ポイントを用意しており、以下のようなコードを適当に読み込まれるところに
バックエンドエンジニアの宮澤です。 弊社のANDPADでは多くのWebサービスと同じようにメールでの通知機能を持っています。 今回はRailsと複数のメール配信サービスを組み合わせて、メール配信機能を冗長化した事例を紹介します。 ANDPADで導入しているメール配信サービス ANDPADでは2つのメール配信サービスを利用しています Mailgun(メイン) Sendgrid(サブ) 通常はMailgunを主系として利用し、SendgridはMailgunでの送信失敗時に備えて待機する構成になっていて、Mailgunで障害が発生した場合でも自動的にSendgird経由でメール配信できるようになっています。 また、サブにSendgridを採用している理由にRFCに準拠しないメールアドレスへの対策もあります。 ANDPADでは個人の携帯キャリアメールで登録しているアカウントも多く、キャリアメール
Googleは、同社がクラウドサービスとして提供しているCloud SpannerをRailsのActive Recordに対応させるアダプタ「activerecord-spanner-adapter」が正式版となったことを発表しました。 Cloud Spannerは、Googleの多数のデータセンターにまたがる地球規模で大規模分散処理を行うリレーショナルデータベースです。事実上無制限とされる高いスケーラビリティと99.999%の高可用性を備えつつ、強い一貫性とトランザクション処理、SQLによるクエリなどを実装しています。 メルカリの決済サービスであるメルペイがバックエンドデータベースにCloud Spannerを採用し、数百万ユーザーの処理を行っているとされています。 このCloud SpannerをRailsのActive Recordのバックエンドデータベースとして使えるようにするア
はじめに 読みやすくメンテナンスしやすいRSpecを書けていますか? RSpecはというかRubyはというか柔軟なので色々な書き方ができてしまいます。 ある程度の規模のテストコードでは、油断するとどこで定義されている let なのかわからないものが登場したり、なぜか作られる(あるいは作られない)謎のレコードでテストが失敗したり、そういった辛い目にあったりするのではないでしょうか。 僕がRSpecを書くときに意識していることをまとめてみました。 これを実践するようになってつらい現象にあうことはずいぶんと減り、ずいぶんと読みやすくなったんじゃないかなと思っています。 ※効果には個人差があります。 Ruby on Railsを使ったアプリケーションのテスト向けですがRuby on Rails以外でも使えると思います。 主に以下の影響を強く受けています。 RSpecとセットで使われることが多いFa
はじめに (背景) 昨年のクリスマスにRuby 2.7.0がリリースされました。 Ruby 2.7は今年リリース予定のRuby 3への移行を見据えたバージョンであり、多くの新機能や変更点があります。そこで、弊社が企画制作する『Babyプラス』のRailsアプリをRuby 2.6.5 -> 2.7.0に上げて動かしてみたところ、約1,000件のテストケース実行に対して6件のエラーと2,700件ほどのワーニングが発生しました。この結果の分析によりRuby 2.7移行について傾向と対策が見えてきたので、現時点 (2020/01/08) で分かったことを共有します。 結論 (Ruby2.7移行についての傾向と対策) 傾向として、多くのgemがRuby 2.7.0からワーニングとなる言語仕様変更の影響を受ける 具体的には、ブロック無しProc.new/proc/lambdaおよびキーワード引数 (k
まずは Ruby on Rails の公式チュートリアルに沿って Rails アプリケーションを作るところから始めます。 チュートリアルをざっとみた感じ、Rails アプリケーションを作成するためには rails コマンドだけではなく node や yarn など様々なソフトウェアを実行環境にインストールする必要がありそうです。 突然ですが、僕はローカル環境にいろいろインストールしたくない勢です。AWS Cloud9 のようなクラウド IDE サービスを使う方法もありますが、理由は特にないけどローカル環境で完結させたいんです、そんな思いを持つ方も多くいらっしゃるかと思います。そこで連載の第 1 回となる本記事では、以下をゴールに進めていきます。 Rails チュートリアルで必要と書かれている依存ソフトウェア (rails, node, yarn など)をローカル環境にインストールせずに R
ネイト・ベルコペック (@nateberkopec) SpeedShop(詳細),Railsパフォーマンス・コンサルタンシー 要約:Rails開発者の多くが、ActiveRecordがSQLクエリを実際に実行する条件を理解していません。よくある3つのケースを見てみましょう:countメソッドの誤使用と、サブセットをセレクトするためのwhereの使用、そしてpresent?です。 断言しましょう。あなたはこの3つのメソッドを使い過ぎていて、無駄なQueryとN+1を発生させているでしょう。 (字幕:なんて奇妙な謎だ、バットマン!) "いつActiveRecordがクエリを実行するかって?知るか!" ActiveRecordは素晴らしいです。本当に。しかし抽象化されているので、データ・ベース上で実行されている実際のSQLクエリに無頓着になりがちです。ActiveRecordがどのように動作す
先日、Rails 6が正式にリリースされました。 ついにRails 6が正式リリースされたようです!🎉 Rails 6.0: Action Mailbox, Action Text, Multiple DBs, Parallel Testing, Webpacker by default, and Zeitwerk | Riding Rails https://t.co/pHoJb68B97— Junichi Ito (伊藤淳一) (@jnchito) 2019年8月16日 だから、というわけでもないのですが、Rails関連の記事をいくつか書いてQiitaにアップしています。 Railsアプリのアップグレードの手順 1つ目はRailsアプリのアップグレード(バージョンアップ)の手順です。 永久保存版!?伊藤さん式・Railsアプリのアップグレード手順 - Qiita qiita.com
こんにちは。SmartHRでRails顧問業をしています @willnetです。最近は主にリファクタリングをしています。 SmartHRでは毎週「Rubyist@SmartHR(仮)」という名の定例ミーティング*1が行われています。このミーティングはバックエンドエンジニアが集まり、チームをまたいだ情報共有や相談をすることを目的としています。その中では僕がTipsなどを共有する「willnetさんのありがたいお言葉」というコーナーが常設されています。 「willnetさんのありがたいお言葉」のコーナーではRailsの最新動向に関する話をすることが多いのですが、最近はRailsの各種機能がどのように動くのかをクイズ形式にして共有しています。これがなかなか好評なので今回テックブログにしてみた次第です。みんな全問正解できるかな? ちなみにこんな感じでやってます まず問題と回答の選択肢を見せてからs
こんにちは。 id:Pocke です。 今日は activerecord-originator という gem を作ったので紹介します。 github.com なにこれ Active Record が発行するSQLの各部分に、それがどこで作られたものかをコメントとして入れ込む gem です。 理解するには実例を見るのが早いでしょう。次のログはArticlesController#indexで実行されるクエリの例です。 Article Load (0.1ms) SELECT "articles".* FROM "articles" WHERE "articles"."status" = ? /* app/models/article.rb:3:in `published' */ AND "articles"."category_id" = ? /* app/controllers/artic
はじめに Railsアプリケーションを長く運用していると避けて通れないのがRailsのバージョンアップです。 古いバージョンのRailsは順次サポートの対象から外れていく(=不具合修正やセキュリティ対応がされなくなる)ため、バージョンアップをせずに運用するわけにはいきません。 そこでこの記事では僕・伊藤淳一がRailsアプリのバージョンをアップグレード(アップデート)する手順を紹介します。 この手順はこれまで何度もRailsアプリケーションをアップグレードしてきた僕の知見が詰まった、いわば「秘伝のタレ」的なアップグレード手順です。 想定するRailsアプリケーション この記事で想定しているのは以下のようなRailsアプリケーションです。 開発者1人でもなんとか面倒が見れるレベルの規模(=アップグレードは1人で作業する想定) 趣味で作っているのではなく、外部のユーザーがいるRailsアプリ(
mimemagic gemのライセンス問題で色々ありましたね。ライセンスは法的な問題なので確認も難しい問題でした。 さて、marcelからmimemagicへの依存が無くなってmime typeの判定がApache Tikaを元にしたものになりました。 hackmd.io しかし、この変更にはmarcelのmime type判定結果が変化するものが含まれていました。 例えば、以下のsample.xlsxというファイルのmime typeの判定をMarcel: 1.0.0、0,3,3それぞれに行わせると... ❯ xxd sample.xlsx 00000000: 504b 0304 1400 0808 0800 3123 7d52 0000 PK........1#}R.. 00000010: 0000 0000 0000 0000 0000 1800 0000 786c ........
こんにちは、開発者のkinoppydです。こんにちは。 SmartHRでは、去年から引き続きRubyKaigiにスケジュールアプリを提供しています。事前にRubyKaigiスケジュールから「拙者のセットリスト」を作成してもらい、SNSで他の参加者とシェアして楽しんでもらうことを目的にしています。 これが今年のワイのセトリや!https://t.co/vZ3nGrPlCt #rubykaigi— kinoppyd (@GhostBrain) 2022年9月1日 去年のソースコードを利用しつつ、今年は新しいチャレンジとしてフロントの環境をNext.jsに移行してみようと考えました。去年の時点で、フロントはほぼReactで書かれており、helperという名の実質APIも書かれていたので、そんなに大きな手間にはならないだろうと思いましたが、とはいえ色々と起こったのでその様子をお伝えしたいと思います
プロダクト開発人材の副業転職プラットフォーム Offers を開発している、株式会社 overflow にて EM をやっております磯崎と申します。 日々プロダクトを開発している中で、様々な格闘があるかと思いますが、その中でも大分格闘してきた Open API を用いたスキーマ駆動開発について今回は書いてます。 この構成で運用してよかったと今のところは思ってますが、色々面倒な事や落とし穴にも直面してきました。自分たちの中に溜まっている知識を書き記していくのでどこかでお役に立てればハッピーです ☺️ 最初に API を定義、その後開発を進めていくスキーマ駆動開発 そもそもスキーマ駆動開発とは、はじめに API を定義し、それを元にフロントエンド・バックエンドと開発を同時に進めていく開発フローです。 フロント実装においては通信部分で、「何を送信すべきか」、「何が返ってくるのか」を予め決まった状
EngineeringOpen SourceRunning GitHub on Rails 6.0On August 26, 2019, the GitHub application was deployed to production with 100% of traffic on the newest Rails version: 6.0. Read more about our process for upgrading, what we learned, and what’s next. On August 26, 2019, the GitHub application was deployed to production with 100 percent of traffic on the newest Rails version: 6.0. This change came
今年もRubyKaigiが始まりましたね!noteはrubyスポンサーとして協賛しています。三重の会場にきている方は、ぜひnoteのブースにも足を運びください。 さて、noteはRuby on Railsを用いたwebサービスとして2014年にリリースされました。現在でも継続してRailsのコードベースを利用しています。 しかし、多くの機能がリリースされ、開発者も増えたため、モノリスの巨大化が進んでおり、開発効率に影響が出始めていました。 今回はそれらの問題を解消するために、noteが継続的に取り組んでいる・取り組んできたバックエンドの改善プロセスについて説明していきます。 モジュールでサービスを構成するモノリスは大きくなるとメンテナンスが難しくなります。Railsは、MVCの各層に全てのドメインがフラットに並び、レイヤごと・レイヤ間の結合度が高くなる設計思想で、巨大モノリス化への対処が難
注意喚起の記事になります。タイトルが結論です。 既にこの問題に言及している記事はいくつかあるのですが*1、私は気付かずに踏んでしまったので、タイトルで「おっと、うちは大丈夫かな」と思ってもらえるようにこの記事を書いています。 joinableとは何か 問題として挙げているjoinableオプションですが、これはネストしたトランザクションの挙動に影響を与えます。少しややこしいので、サンプルコードを見せながら説明します。 # frozen_string_literal: true require "bundler/inline" gemfile(true) do source "https://rubygems.org" git_source(:github) { |repo| "https://github.com/#{repo}.git" } gem "activerecord", "7.
Ruby on Railsはどのように生まれ、発展してきたのか[後編]。作者DHH氏やコアチームが語る動画「Ruby on Rails: The Documentary」が公開 最も有名なWebアプリケーションフレームワークの1つである「Ruby on Rails」は、もともと37signals社が社内向けに開発したフレームワークでした。 現在ではGitHubやShopifyなど大規模なWebサービスを支えるRuby on Railsも、登場初期には「スケールしない」という批判にさらされ、また競合となるフレームワークが登場するなどの経緯を経ています。 こうしたRuby on Railsのこれまでを、作者であるDavid Heinemeier Hansson(以下、DHH)氏や関係者が振り返る動画「Ruby on Rails: The Documentaryが、昨年(2023年)11月に公開
はじめに こんにちは。 mybest でBackendエンジニアをしている rince です。 現在、弊社ではRails6.1から7.0へのアップグレードを進めています。 → 2023/3/2にRails7.0にアップグレード完了しました! アップグレードを進める中で新たに追加された便利なメソッドを使用する機会があったので、今回はそんなRailsの最新便利メソッドをまとめました。 また、Rails7.0だけでなく、6.0や6.1で追加されたメソッドの中にもまだ割と知られていない便利なメソッドがあったりするので、それらについても合わせてご紹介します。 よりシンプルにわかりやすくコードを書けるメソッドがたくさん追加されていますので、ぜひ読んでみていただいて、皆さんの開発の手助けになれば嬉しいです。 ActiveRecord destroy_by / delete_by (6.0〜) 特定条件の
こんにちは。会計Plusでエンジニアをしているぽっけです。最近はシャケをしばくバイトで、やっとでんせつに上がりました。 今日はstrong_migrationsというRails向けのgemを紹介します。 strong_migrationsとは https://github.com/ankane/strong_migrations strong_migrationsは、危険なmigrationを検出するgemです。 データベースのmigrationは、ときに危険になります。たとえば実行するDDLによってはデータベースへの書き込みをブロックしてしまうことがあります。またテーブル定義の変更は、うまくやらないとアプリケーションが意図せぬ動作をするかも知れません。 strong_migrationsはそのような危険なmigrationを検出します。 使い方 使い方はかんたんです。strong_mi
Rails 6.0: Action Mailbox, Action Text, Multiple DBs, Parallel Testing, Webpacker by default, and Zeitwerk Dealing with incoming email, composing rich-text content, connecting to multiple databases, parallelizing test runs, integrating JavaScript with love, and rewriting the code loader. These are fundamental improvements to the fundamentals of working with the web and building fast and fresh appl
概要 元サイトの許諾を得て翻訳・公開いたします。 英語記事: Improving Database performance and overcoming common N+1 issues in Active Record using includes, preload, eager_load, pluck, select, exists? – Saeloun Blog 原文公開日: 2020/01/08 著者: Rohit Kumar サイト: Saeloun -- Ruby on Railsのコンサルティング会社で、Rails + React開発のほかに、React Nativeによるモバイルアプリ開発も手がけています。 日本語タイトルは内容に即したものにしました。 2020/03/11: 初版公開 2023/09/27: 更新 Railsアプリケーションのパフォーマンスは多くの変数に
それなりの規模のサービスを運用していると、不可解なエラーに遭遇することはよくあるものです。その中でもデータベース関連のエラーは一見難解な問題に見えるかもしれませんが、原因調査に役立つ情報をさえ出力すればたいていの場合は容易に原因を特定できるものです。というわけで、Rails でよく遭遇するエラーの調査に役立つ情報を出力する gem を作成しました。 activerecord-debug_errors 現在次のエラーをサポートしています。 ActiveRecord::LockWaitTimeout (MySQL のみ) ActiveRecord::Deadlocked (MySQL のみ) ActiveRecord::ConnectionTimeoutError 以下、具体的な例を用いてどのような情報が表示されるか説明します。 ActiveRecord::LockWaitTimeout Ac
概要 原著者の許諾を得て翻訳・公開いたします。 英語記事: Use Sidekiq Directly, Not Through Active Job - Andy Croll 原文公開日: 2021/10/04 著者: Andy Croll 参考: 週刊Railsウォッチ20211018: SidekiqをActive Job経由ではなく直接使う 参考: Active Job の基礎 - Railsガイド Webアプリケーションを構築する場合は、ユーザーごとのレスポンスに要する時間を最小限に留めるべきです。Webサイトが速ければ速いほど、その分ユーザーも幸せになれます。 そのための方法の1つは、重くなる可能性のある処理(実行に長時間かかる、パラレル化可能な処理)を、イミディエイトなWebリクエストの外で非同期実行することです。メール送信、計画的なクリーンアップ、長時間かかる計算、外部API
11月に入社したCTO室SREの@sinsokuです。 主にやっていることはRailsアプリのレビューや開発環境の改善です。*1 社内のRailsアプリを横断して浅くレビューする(8つくらい) MedPeerの開発環境の改善 docker-compose up で30個のコンテナが起動するのを減らす SwitchPointからActiveRecord v6への移行 CircleCIの実行時間の短縮、稀に落ちるテストの修正 その他の細かい改善 このうち、CircleCIについて知見が溜まったので技術ブログで紹介します。 CircleCIで気をつける点 CircleCIの実行時間を短くするにはいくつかコツがあります。 gemとnpmをできるだけキャッシュする RSpecを並列で実行する前に assets:precompile を実行しておく 各ジョブで必要なgem(もしくはnpm)だけをキャッ
TL;DR RuboCopプラグインの開発の為にPull Requestを見たいです 仕事としてでもそうでなくても構いません TwitterやGitHub Issueやメール( kuwabara (at) pocke(dot)me )までご連絡お待ちしています 背景 現在私はRuboCop Typed (仮)というRuboCopプラグインの開発をしています。 github.com pocke.hatenablog.com このRuboCopプラグインでは、Ruby 3で導入される予定の静的型の情報を使って、従来ではできなかった解析をRuboCopで行うことを目的にしています。 私は現在この解析を実装しつつ、型情報によって解決できるようになる問題にはどのようなものがあるのかを探しています。 そして、この「型情報によって解決できるようになる問題」を探すために多くのPull Requestを読み
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く