How ActiveRecord::Migration converts create_table DSL into SQL statements
この記事は Akatsuki Advent Calendar 2020 の20日目の記事です。 はじめに ゲームサーバでは大量のユーザーデータなどを取り扱うため、データベースの負荷分散のために水平シャーディング(水平分割)が行われることがあります。 アカツキでも、これまで Ruby on Rails や Elixir 等でゲームサーバを開発する中で、それぞれの方法で水平分割を行ってきています。 さて、先日リリースされた Ruby on Rails 6.1 では、待望の水平シャーディング機能が標準でサポートされました。 早速使っていきたいところですが、これまで別の方法で水平シャーディングを実現していたアプリケーションを移行するにあたってはいくつか課題があるため、 それをどう解決するかの一例をご紹介したいと思います。 また、その解決の一環で利用した Ruby の BasicObject クラス
こんにちは、@f_subal です。 pixivFACTORY というサービスで普段はフロントエンドをやっています。 今回は Rails のサービスに Headless CMS の Contentful を導入し、ワークフローを改善した話をします。 ランディングページ、あるいはマスターデータの詳細について pixivFACTORY はグッズおよび同人誌がブラウザ上で簡単に作れるサービスです。 取り扱っているグッズは 60 種類以上あり、各グッズごとに仕様が大きく異なります。 グッズにはそれぞれ、仕様や出来上がりの写真を載せたページ(以下、product 詳細とも呼びます)が存在します。 要するに、以下の状況を想定してください。 運営が管理する静的なドメインモデル(ここでいう「作れるグッズの仕様」)が存在する モデルの各内容について説明するページが存在する 各ページの内容は DB の内容から
パッチ会や地域 Ruby コミュニティなどで集めた知見を元に、勤務先の永和システムマネジメントなんかで度々話している表題についてテキスト化しておく。 TL;DR Ruby 2.8.0 の開発が始まっているが、それは 2020 年のどこかで Ruby 3.0 になるらしい Ruby 3.0 ではキーワード引数 (以下 kwargs) の分離という破壊的変更があり、Ruby 2.7 系は事実上の移行パスバージョン的な位置付けになるだろう 2020年1月8日の現時点では、Ruby 2.7 の kwargs の分離警告について対応された安定版の Rails はなく、周辺 Gem も WIP なので OSS エコシステムに参加していくと良い 2.8.0 (tentative; to be 3.0.0) development has started 2019年の ruby/ruby での matz
TL;DR- RuboCop良いよ - 入れるだけだと誰も使わないよ - 運用フローに入れると良いよ - 千里の道も一歩からだよ RuboCopとはRuboCopはコーディング規約に従っているかをチェックし、コードの品質を保ってくれるgemです。 RuboCopのイメージ例えば以下のようなrubyとしてはあまり良くないコードだった場合に、RuboCopはルールに沿って問題点の指摘や自動修正を行ってくれます。 これ以外にもRuboCopは多様なルールをサポートしており、その中にはバグりやすいコードを回避するようなルールもあります。 RuboCopを使う事でコーディング規約に沿っていないコードや、バグを含んだコードを自動である程度抑制でき、レビュー等でそれらの指摘する手間を大きく削減できます。 導入方法gem install rubocop するか、Gemfileに書いてインストールしてくださ
RubocopというRubyの文法チェッカがありますが、 これをCircleCI等のCIツールで実行してチェックしている人も多いと思います。 Rubocop: https://github.com/bbatsov/rubocop Rubocopに限らずですが、 このような静的チェックツールは、既存のリポジトリに追加しようとすると、 既存コードに対するエラーが存在しているため。 開発を一度止めて全体のリファクタリングとテストを行う、 除外指定をして既存コードを無視して適用するなどの対応が必要になり。 なかなか、導入に踏み切れないこともあると思います。 このエントリでは、 既存プロジェクトに対してスムーズに導入する方法として。 PullRequestの新規or修正箇所でエラーがあった場合のみ、 (既存コードは無視して)CIでエラーとなるようにする方法を提案します。 # ちなみにRubocopに
2018年9月12日、メドピア株式会社が主催するイベント「MedBeer」が開催されました。今回のテーマは「Rails開発での技術的負債との付き合い方」。長期間の開発において避けて通れない技術的負債をいかにして克服するか? そのノウハウを語ります。「クックパッドの巨大 Rails アプリケーションの改善」に登壇したのは、小室直氏。クックパッドを支える巨大なRailsアプリケーションにおいて、どのような問題が発生し、どうやって解決したのか? その歴史と変遷を振り返ります。講演資料はこちら 巨大Railsアプリケーションの改善 小室直氏(以下、小室):始めさせていただきます。 まずこれ、たいした意味もなく出してるんですが、この会場に来たときにこれを見て「あ~すごいちゃんとイベントバナー作ってる。クックパッド、クラッシー。あ、クックパッドもなんか絡んでるんだな~」って思ったんですけど。よく
マリオカートでカーブを曲がるときに体を傾斜させてしまうCTO室 kenzo0107 です。 今回は 2018/04/02 にリニューアルしたイシコメの Rails × ECS についてです。 イシコメとは? 「イシコメ」は、医師10万人の声でつくるヘルスケアメディアです。 医師と一般の方々をつなげることで、医療情報格差を埋めることを目指しています。 MedPeerの10万人の医師会員に協力いただいたアンケート結果をもとに編集部で記事を執筆し、医師監修の上で配信。多くの医師の声を反映することで、より正しい情報を提供しています ishicome.medpeer.jp リニューアル経緯 リニューアル前は以下のような構成でした。 フロントに Laravel 5 バックに Drupal Docker on EC2 コンテナイメージの S3 でのプライベート管理 Docker がまだ出てきて間もない頃
■ 企業は安易なMastodonインスタンスの運用を避けるべきでは? たまにはセキュリティクラスタ的なことを書いてみる。最初は「安全なMastodonインスタンスの選び方」というタイトルだったんだけど「安全と安心は違うしなぁ」と思い、「安心な~選び方」にしていたんだが、ここ数日で「企業は自社インスタンスを立ち上げるべき!」みたいな煽りをよく目にすることになったのでこうした。 「おひとりさまインスタンス」を立てる記事がいくつも書かれ、さくらインターネットが提供するVPSで簡単にインスタンスを動かせるスクリプトを提供されたりして、この波にのって我が社も専用インスタンスを持とうって考えてる企業は多いと思う。すでにニッポン放送のインスタンス「Tuner」みたいな(非IT系)企業インスタンスができ始めている。 そりゃぁ他人・他社が運用するインスタンスにアカウント作って「公式でござい」なんてするより、
こんにちは。パートナーアライアンス部の諸橋 (@moro) です。 突然ですが、わたしはいまクックパッドの「ユーザー基盤」を再構築しようとしています。 一口に「ユーザー基盤の再構築」といっても、そのゴールが何を指すかは(わたし自身にとってもまだ)漠然としており、固定されたゴールは見いだせていません。しかし後述するように、いくつかの問題は明確な形を取っています。言い換えると、それら明確な問題と向き合いながら『柔軟でいい感じのユーザー基盤を目指す』というのがこの再構築プロジェクトの目的です。 その第一歩目として、ユーザー登録部分を現状のクックパッド本体とは別の小さなRailsアプリケーションとして実装を進め、つい先日、一部の限定された利用者の方に向けて公開することができました。 今後も様子を見ながら公開範囲を拡大していく予定です。 再構築の背景 ではその「明確な問題」とはなんでしょうか。 最大
初めまして、qsona (tw) と申します。Ruby on Rails Advent Calendar 2016 6日目の記事になります。 Rails歴は10ヶ月で、もちろんAdvent Calendarへの参戦も初です。 全体的に生意気な内容と思いますが、 じゃんじゃんマサカリ投げてください お手柔らかにお願いします。 はじめに 環境 JSONを返すAPIで、データベースはRDBを想定してます。 あんまり関係ないですが一応、Rails5 (api mode) + MySQLを想定しています。 マイクロサービスとしてのバックエンドに使う技術スタックの必要な要件 マイクロサービスの良いところは、サービスごとに合った別々の技術が使えるということです。 とはいえ、一般的な組織であれば、学習コストの面などから、ファーストチョイスとなる言語があり、普通の要件に対してはその言語を使う、ということにな
■ [newrelic][rails] Rails で特定のホストでのみ NewRelic Agent を起動する術 NewRelic は素晴らしいけど、Pro は高い($149/ホスト)ので、数十台、数百台でサービスを支えている時に全台に入れるわけにはいかない。何とかできないかね、と雑に %w[ foo.example.com bar.example.com ].each do |hostname| if `hostname`.chomp == hostname require 'newrelic_rpm' end end みたいな奴を、initializers に突っ込んでみたけど、見事に全部無効になってしまった。どうやら newrelic の agent は railtie で initializer の hook に初期化処理を仕込んでいるので、initializer で requ
こんにちは。技術部 開発基盤グループの諸橋です。 クックパッドでは昨今の多くのWeb企業と同じように、GitHub EnterpriseのPull Requestを使ったコードレビューを広範に実施しています。わたしたちのコードレビューでは、ソースコードの字面にとどまらず、サービスの機能として魅力的かどうかや、保守性を含めた設計が適切かといった議論に発展することも良くあります。 きょうはそんななかで話題に上がった「現在時刻」の扱いかたに関する設計の話を書きます。 背景 サービスを開発・運営している我々には、時間帯によって出し分けたり、特定の期間のみに表示したいコンテンツがたくさんあります。 そのたびにデプロイし直すというのはつらいので(特に24:00に出なくなるコンテンツなど)なんとかしたくなりますが、一方で時限式のコンテンツはその時になるまでちゃんと動いているか確証が取れないので怖いです。
本記事は英語版ブログで公開された記事の翻訳版です。 2013年7月に、米国テキサス州オースティンで開催されたLonestar Ruby Conferenceで、Rubyによるアプリケーションサーバーについてお話させていただきました。その中でいくつかのRubyアプリケーションサーバーのパフォーマンスや、さまざまな状況における挙動の違いを比較しました。この記事では、講演準備として行ったリサーチの中で分かったことをかいつまんでご紹介します。 実際のカンファレンスの録画をご覧になりたい方は、Confreaksで公開されていますのでそちらをご参照ください。テストに使用した簡単な自作アプリケーションはGitHubに、講演スライドはSlideshareにそれぞれ公開しています。 このリサーチは、Passenger 4のパフォーマンス評価以外すべて2013年7月に行ったものなので、情報が多少古くなっている
2024年4月1日より、Supership株式会社は親会社であるSupershipホールディングス株式会社に吸収合併されました。 合併に伴い、存続会社であるSupershipホールディングスは社名をSupershipに変更し、新たな経営体制を発足しました。本件に関する詳細は、プレスリリースをご確認ください。 2024年4月1日より、Supership株式会社は親会社であるSupershipホールディングス株式会社に吸収合併されました。 合併に伴い、存続会社であるSupershipホールディングスは社名をSupershipに変更し、新たな経営体制を発足しました。 本件に関する詳細は、プレスリリースをご確認ください。
Railsで大きなファイルを扱う際のポイントをまとめてみました。 前提 大きなファイルとは だいたい100MB~10GBくらいのファイルをダウンロード・アップロードするのを想定することにします。 数MB程度だと、特別な工夫なしでもそれほど問題になりません。10GBを超えてくると、気をつけるべき点が変わってくるかと思います。 以下では主にサンプルとして、1GBのファイル(ISOファイルやZIPファイルなど)を想定します。 環境 以下のような環境を想定します。 Railsは4系 Nginx + Unicornのスタンダードな構成 サーバ1台のシンプルな構成(ロードバランサを使用した複数台構成については、末尾に少し記載しています) ダウンロード ファイルのダウンロード まずは、Railsアプリから大きなファイルを配信するケースを考えましょう。 たとえば、ISOファイルをサーバ内に保存しておいて、
2013.08.12 [Rails 4.0] 巨大なテーブルやserializeを使うときのActiveRecordオーバーヘッドを測定してみた Railsは遅い!とよく言われますが、高速化ポイントのうち最有力候補の1つがDB/モデル周りです。 N+1問題を修正するだけでも、体感できるレベルの高速化が期待できます。 しかし、RubyKaigiでCookPadの方も言っていたように、RDBMSがSQLを実行する時間だけでなく、ActiveRecordオブジェクトの処理は非常に重いです。 モデル周りの最適化と聞いて、一生懸命SQLをEXPLAINするのも大事ですが、ログに出力される「Prefecture Load (0.5ms)」のような数値にはActiveRecordオブジェクト部分のオーバーヘッドが含まれていないため、全体でどの部分が遅いのかを理解しないと徒労に終わってしまう可能性がありま
Rails アプリを Docker で稼動させる際に、 Gemfile と Gemfile.lock を先に ADD して bundle install してからアプリケーション全体を ADD することで、 bundle install の結果をキャッシュする手法はよく知られています。 ADD Gemfile /app/Gemfile.lock ADD Gemfile /app/Gemfile WORKDIR /apps RUN bundle -j4 ADD . /app こういうやつ。 ところがこの手法は Jenkins のように毎回リポジトリが clean にチェックアウトされる環境では全く無効です。 何故なら、 Docker は ADD するファイルが更新されているかどうかを、ファイルの中身そのものではなく、タイムスタンプなどのメタデータで確認しているからです。 git checko
山本隆の開発日誌 Kotlin/Swift/Flutter/JavaScript/TypeScript/PHPでWindows/macOS/Android/iOS/Webアプリなどを作ってます Ruby on RailsのGeneratorの作り方。 script/generateでプラグインの雛形を作成する。 ruby script/generate plugin sample Rails::Generator::NamedBaseを継承したSampleGeneratorクラスを作成する。 Rails::Generator::NamedBaseは、Rails::Generator::Baseを継承し、先頭の引数にクラス名を受け取る。 vendor/plugins/sample/generators/sample/sample_generator.rb class SampleGenera
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く