rails の検索結果:

Ruby 3.1はエラー表示をちょっと親切にします

…本領を発揮するのは、RailsのparamsやJSONデータの取り扱いなどのときです。 たとえばjson[:articles][:title]みたいなコードを書いて、undefined method '[]' for nil:NilClassという例外が出たとします。 このとき、変数jsonがnilだったのか、json[:articles]の返り値がnilだったのかは、残念ながらコードだけ見ても判断できません。 特定するには、デバッグ出力を挟んで再実行する必要がありました。 …

Redshiftのデータをサービス改善に役立てるデータ転送システム Queuery

…API側はシンプルなRailsで作られており、コンソールのフロントエンドはTypeScriptとReactでSPAにしています。 最近の改修内容 Queueryを紹介するついでに今年自分が改修を行った箇所について書いておきます。 QueueryアカウントとRedshiftユーザーの紐付け 以前はQueueryのコンソールから好きな名前のQueueryアカウントを誰でも作ることができ、既存Queueryアカウントの認証用トークンを誰でも有効・無効切り替えができる仕様になっていま…

AWSフル活用!クッキングLiveアプリ「cookpadLive」を支える技術

…に利用しています。 Rails や go などのアプリケーションサーバーは、社内で Amazon ECS を使って動かす環境が整っているので、 cookpadLive のアプリケーションサーバーもその仕組みを使って動かしています。( Dockerfile と jsonnet を書くと本番環境で動き始める素晴らしい仕組みです。*1) 基本的な Web アプリケーションであれば上記の仕組みだけで十分なのですが、 cookpadLive のように映像を扱ったり、リアルタイムでなにか…

データ分析 SQL とその実行結果を共有・検索できるアプリ Bdash Server を作りました

…た Ruby on Rails 風の開発体験を提供するフルスタックフレームワークとなっています。Next.js と Prisma の機能を使うことに加え、rails generate 風なコード生成機能があったり "Zero-API" という思想で作られたデータベースクライアント実装があったりします。"Zero-API" は面白くて、サーバーサイドの実装でもクライアントサイドの実装でも同じように db.user.findUnique({ where: { id: userId…

emruby: ブラウザで動くMRI

…しいです。 先日銀座Rails#32でもemrubyについて話したので、発表資料を貼っておきます。Rubyのビルドプロセスや、Emscripten自体に興味がある人は面白いと思います。 emruby: ブラウザで動くRuby from mametter www.slideshare.net *1:マシンスタックやレジスタを走査してオブジェクトの参照を探すということをするのですが、そのためにスタックの先頭と終端を得るAPI emscripten_scan_stack やレジスタ…

Cookpad Summer Internship 2021 (10 day Tech コース)を開催します!

…いるRuby on Rails、AWS などを題材に講義を実施します。 サービス開発講義では、クックパッドにおけるユーザーの課題解決のための考え方をインプットし、それを体感していきます。 後半 5 日間は実践的なプログラムとして、OJT プログラムと PBL プログラムの2種類を実施します。 OJT プログラムではクックパッドの部署に配属され、メンターの指導のもとサービス開発を実践します。 PBL プログラムでは社員エンジニアのサポートのもと、身近な課題を解決するサービスを自…

JSON Schema をクックパッドマートの商品登録画面に導入した話

…、フロントエンドは Rails の View の仕組みを用いて HTML が返される仕組みとなっています。また、動的な処理などを追加する際には TypeScript / React を用いている状態です。そのため、 React で JSON Schema に基づいたフォームの出し分けを自動で制御するライブラリとして、 react-jsonschema-form を利用することとしました。 また、バックエンドについては Rails で開発が行われているため、 Ruby 製で J…

Rails に Babel と Rollup を組み込んで CoffeeScript を JavaScript に段階的に移行した話

… Rollup を Rails のアセットパイプラインに組み込み、レガシーな CoffeeScript ファイルを ES2015+ の JavaScript に移行した話をします。 レシピサービスと CoffeeScript の歴史 クックパッドは10年以上の歴史を持つサービスです。中でもレシピサービスの web アプリケーションは初期に作られた Rails 2 アプリケーションがアップグレードを重ねながら今も動いています。2018年には Rails 3 から4へ、つい最近で…

SwiftUI を活用した「レシピ」×「買い物」の新機能開発

…ド(Ruby on Rails, Java 等)、検索技術、ログ分析、マーケティングなどなど様々な領域で取り組みたい課題が沢山あります。 カジュアル面談や学生インターンシップなども随時実施していますので、ぜひお気軽にご連絡ください! cookpad.careers *1:近隣地域の生産者や市場直送の新鮮でおいしい食材を、1品から送料無料で購入できる。https://info.cookpad.com/pr/news/press_2020_1015 *2:最短で注文当日に受け取り…

プロと読み解く Ruby 3.0 NEWS

…つ、Ruby on Railsの交流サイトにmatzがスレッドを立てて、ユーザの声を直接聞くことにしました。延べ40件ほどのさまざまなコメントをいただいたので、遠藤がすべてのご意見を何度も読み返し、分類集計しました。その結果、「変更予告の警告が出ること自体が不満 *2」「実務的な対応ノウハウが共有されていない *3」ということが不満の源泉で、問題の変更自体には意外と前向きな人が多いことがわかりました。そこで、前者の問題に対しては最善の対応ということで 2.7.2 でデフォルト…

レシピサービスのフロントエンドを Next.js と GraphQL のシステムに置き換えている話

…トはモノリシックな Rails で作られていて、10年以上 Rails で開発を続けてきました。10 年以上同じシステムで開発を重ねれば当然レガシーな部分が大量に生まれてきますが、特にフロントエンドはその影響が顕著でした。 どこから使われているかわからない CSS が大量にある、JS のコードは昔ながらの CoffeeScript*1 と jQuery で書かれており、JS のライブラリの管理も vendor/assets にファイルを入れてリポジトリにコミットするという運用…

負荷試験用 Web コンソールの開発

…発しました。普通の Rails アプリケーションとして実装し、F5 と名付けました。コスト最適化のため、データベースは Aurora Serverless (MySQL) を利用しています。例として、10 分間で 50 RPS まで ramp-up し、50 RPS を 3 分間継続するというデバッグ用の負荷試験を実行したときの様子が以下になります。 負荷試験中の F5 のスクリーンショット itkq/artillery-plugin-cloudwatch により収集したメト…

Cookpad Online Summer Internship 2020 5 Day Engineer コースを開催しました

…や Ruby on Rails アプリケーションの実装・改善を体験してもらいました。 Android レシピの閲覧・投稿ができるアプリ MiniCookpad の開発を通して、Android 版クックパッドアプリで採用されているアーキテクチャやテスト手法を体験してもらいました。 iOS Android と同じく、MiniCookpad の開発を通して iOS 版クックパッドアプリで採用されているアーキテクチャやテスト手法を体験してもらいました。内容の大筋は Android・i…

RailsアプリケーションのCIにDynamoDB Localを導入した話

…ie)です。 今回はRailsアプリケーションのCIにDynamoDB Localを導入した事例をご紹介します。 広告入稿システムとCI クックパッドでは自社製の広告入稿システム・配信サーバーを運用しています。また広告の一部はDynamoDBを利用したアーキテクチャで入稿・配信されています。詳細は以前の記事「広告配信サーバーにおける DynamoDB Accelerator (DAX) 活用事例の紹介」で紹介されています。この入稿・配信のうち、広告入稿システムのCIに対してD…

広告配信サーバーにおける DynamoDB Accelerator (DAX) 活用事例の紹介

…バーも Ruby (Rails) から Go への移行をしているので、ECS Service の Running Tasks 数の削減によるコスト低下も見込んでいます。 コスト最適化の取り組みは、"インフラのコスト最適化の重要性と RI (リザーブドインスタンス) の維持管理におけるクックパッドでの取り組み"にて紹介されているように、SRE チームが技術力を結集して、最適化に必要な基盤の整備や情報提供を行ってくれています。この取組のおかげで、アプリケーション開発者としても要件…

プロと読み解くRuby 2.7 NEWS

…としてクックパッドのRailsアプリを実行してみて、影響を測る、というのを繰り返しました。その結果はチケット [Feature #14183] にも残っています。 当初は完全な分離を目指していましたが、あまりにも非互換が大きい(def foo(opt = {}); endというメソッドにfoo(k: 1)を渡すコードはあまりにも多い)ということをチケット上でJeremy Evansという人が主張し、このケースだけは分離を諦めることでチケット上で合意しました。これが2019年4…

サービス特性にあった検索システムの設計戦略

…ーション環境上で他のRailsなどのアプリケーションと同じように可用性とリクエストに対するスケーラビリティを担保したデプロイができます。 EC2上にデプロイすることになると、物理サーバによるクラスタのメンテナンスコストがかかってしまうため、S3上でインデックスデータを管理し、ECS上にデプロイすることにしました。 クックパッドマートは、他機能もECS上で動作しています。検索サーバも管理を同じ環境にすることでDockerのデプロイに慣れているメンバであれば検索サーバのデプロイ学…

Ruby中間表現のバイナリ出力を改善する

…いう課題に取り組み、Railsアプリケーションのコンパイルキャッシュのサイズを70%以上削減することに成功しました。以下ではこの課題の概要とその成果について述べたいと思います。 InstructionSequenceの概要 まず、RubyVM 内で実行される命令の中間表現、InstructionSequence (以下 ISeq と省略) について簡単に説明します。 通常の Ruby プログラムは、以下のような手順で実行されます。 ソースコードを構文解析し、抽象構文木を作る。…

2019 年度版:クックパッド x 広告領域の紹介

…たシステム 初期は Rails アプリケーションだったが、機能の肥大化及びインフラコストの削減&開発速度の向上を目指し、一部の機能を Go に Microservices として切り出し Legacy ads delivery service いわゆる「配信」システム 旧世代。初期は Cookpad アプリケーション自体に配信ロジックが内在されていた 現在はほとんどの機能が新世代に移行済み、新規開発することは殆どない。旧バージョンアプリの互換性のために残していたが、物理削除含…

インフラのコスト最適化の重要性と RI (リザーブドインスタンス) の維持管理におけるクックパッドでの取り組み

…て運用できています。Rails を始めとする HTTP をしゃべるアプリケーションサーバなど、状態を持たないサービスのほとんどは、スポットインスタンスで構成された ECS クラスタで動いています。これは、コストの最適化に大きく寄与しています。 2. RI (リザーブドインスタンス) の運用 このトピックは、記事の後半で述べるためここではいったん隅に置いておきます。 3. キャパシティを過不足ない適切な状態に保つ 文字で書いただけでは「いいじゃんやろうよ」という感じなのですが …

ISMM 2019 で発表してきました

…ションの性能分析で Rails が題材になっていたことです。「あ、見たことあるコードだ」みたいな。 ウェブアプリケーションに関する分析の話は、View-Centric Performance Optimization for Database-Backed Web Applications (ICSE'19) のものだったように思います。主に ORM でのアンチパターンをいろいろ分析して(講演では、そのパターンを色々紹介されていました)、それを静的解析してアプリからそのアンチ…

EuRuKo 2019 で発表してきました

…Future of Rails at GitHub - Eileen M. Uchitelle GitHub で働く Rails コミッターである Eileen の発表。Rails わかんないのでさらっと紹介です。 なんと、GitHub では、Rails をフォークして使っていたそうです。 "The Past, Present, and Future of Rails at GitHub" GitHub は Rails をフォークしていた しかし、先端の Rails にどんど…

Simpacker: Rails と webpack をもっとシンプルにインテグレーションしたいのです

…kaccha)です。Rails で webpack を使うためのシンプルな gem を作ったのでそれについて紹介します。 Webpacker Rails で webpack を利用した Web フロントエンドの環境を作る場合、最近では Webpacker が選択されることが多いでしょう。Rails 6 からは Webpacker が標準になることもあり、この流れはますます加速すると思われます。 私自身もこれまでいくつかのプロジェクトで Webpacker を利用してきました。…

モダンBFFを活用した既存APIサーバーの再構築

…最大のモノリシックなRailsアプリケーション」であり、 理由はよくわからないがとにかくこれをさわるだけで開発期間が3倍になる優れモノです。 できることならいっさいPantryにさわることなく開発を終えたいわけです。 図2: Pantryをいじれば目的は達成できるが対価が必要 つまり、API呼び出し回数は増やしたくないのでできれば既存のAPIに値を追加する形で実装したい。 しかしそのためにPantryはいじりたくない。 API呼び出し回数を増やしたくない……既存のAPIに手を…

レシピ検索を支えるレガシーでクリティカルな大規模バッチを刷新した話

…ました。 不必要に Rails である cookpad_all に存在するバッチ群は kuroko と呼ばれていますが、それらが Rails で実装されていたことから、旧検索バッチも Rails で実装されていました。 しかし、このバッチの実態は「大量のデータを収集して処理」することであり「user facing な Web アプリケーションをすばやく開発することができる」という Rails の強みが活かされるようなものではありませんでした。 実際の実装としても、その大部分が…

Working with AWS AppSync on iOS

…e Ruby on Rails. Our AppSync setup is a bit different than the standard use case. AppSync is designed to be configured by app developers through the Amplify CLI. Since our team has dedicated backend engineers, we've opted to do most configu…

GraphQL Asia 2019 で登壇しました

…olithic な Rails アプリ、いわゆる "Monorail" が 10 年以上稼働していました。2 年前から Airbnb SOA というアーキテクチャを導入し、徐々に service oriented な構成へと移行しているとのこと。その中でも、presentation layer に GraphQL Gateway を導入しているとのことでした。 この発表の最大の価値は、RPC フレームワークであるFacebook's branch of Apache Thri…

1枚のラベルの向こうには、1人のユーザがいる【連載:クックパッドマート開発の裏側 vol.3】

…ドマート全体を支えるRailsアプリケーション)に発行すべきラベルの情報を集約し、日次バッチにて発行するラベル情報をstar_ethernetを利用してプリンターに送信します。 バッチにはkuroko2を利用し、barbequeで各プリンターへのラベル発行ジョブの管理しています。何かしらのトラブルでラベル発行に失敗した時は、原因を調査しジョブを再実行することで全てのプリンターで確実にラベルが発行されるようにしています。またラベル残量が少なくなっていたり、紙詰まりの発生を検知し…

クックパッドマートにおける実世界での配送を意識した注文の検証処理【連載:クックパッドマート開発の裏側 vol.1】

… データ間の関連性 rails的に表現すると、このような関連性を持っています。 class Delivery belons_to :location end class Location has_many :deliveries end class Product end class Order has_many :products belongs_to :delivery end また、商品の集荷配送については、後ほど詳細を述べますが下記のような流れになります。 販売店は注…

マイクロサービス化を支える継続的切り替え術

…返すようにします。 Rails であればコントローラに以下のような感じで書けます。 class RecipesController prepend_before_action :not_implemented, except: %i[edit] def create # ... end def show # ... end def edit # 移植完了したアクションでは普通のレスポンスを返せる end def not_implemented head :service_un…