API の検索結果:

emruby: ブラウザで動くMRI

…enでは使えないC APIをいろいろケアした(たとえばIO.popenはNotImplementedErrorにしたとか) 保守的GCがそのままでは動かないので、Emscriptenが提供している保守的GC用のAPIを使うようにした *1 動的リンクは実験的サポートらしかったので、必要な拡張ライブラリを静的リンクするようにした その他こまごまとコンパイルオプションを調整した これらの変更はRubyソースコードへのパッチにする必要がありますが、幸いコミット権限を持っているので、…

クックパッドマートの生鮮食品を SORACOM の IoT デバイスで遠隔温度監視している話

…バイルアプリからは API アプリを介して DynamoDB にある温度データにアクセスできるようになっています。なお、データの行き先が CloudWatch と DynamoDB の 2 つになっているのは開発事情の都合です。 構成自体はシンプルで、全体の実装にもそこまで長い時間はかかりませんでした。たとえば AWS Lambda の部分は AWS CDK を使って 1 日かからずに作れています。 なお、自分が不慣れだったこともあり、上記の構成に落ち着くまでには少し時間がか…

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

…ものです。 OpenAPI で利用されている記述方法として知っている方も多いかもしれません。百聞は一見にしかずということで、JSON Schema とそれに対応する JSON の簡単なサンプルをご紹介します。 { title: "お料理レシピ", type: "object", properties: { id: { title: "ID", type: "integer" }, title: { title: "タイトル", type: "string" }, conten…

Cookpad Online Spring Internship 2021 と Hackarade を合同開催しました

…シップ用に Web API を用意しました。 講師の想定を超えて、基本課題を2日目の朝6時に終える猛者や、すべての発展課題に取り組む猛者がいました。 同じ課題に取り組んでいても、成果発表では参加者ごとの個性がよく出ていて感心しました。 今回のインターンシップでの大きなチャレンジは、従来のような対面型でのインターンを単にオンラインにするのではなく、オンラインならではの効果が得られるような実施方法を模索することでした。 先ほど触れた講義動画はそのひとつです。 会場という制約がない…

GraphQL Code Generator で TypeScript の型を自動生成する

…てやっていますが、GraphQL Code Generator はそのあたりのプラグインも豊富で変更したいとなったときにプラグインの追加で気軽に構成変更できるのも便利です。 まだまだこのあたりも環境整備も発展途上ですので我こそは最高の環境を作るぞという方、もしくは API 呼び出しに型がなくて疲れてしまい、このような環境で開発してみたくなった方はお気軽にお問い合わせください! https://twitter.com/hokaccha https://cookpad.jobs/

Google Apps Script の拡張サービスの TypeScript 用型定義ファイルの自動生成

…ク付きで出力 外部 API にアクセスするスクリプトを一定周期ごとに動かす このようなことを無料で行うことができます1。 クックパッドでは Google Workspace をオフィススイートとして広く使用しており、スプレッドシートやドキュメントの自動化・マクロ実装などに Google Apps Script が利用されています。 Google Apps Scriptを普段の作業の改善に使うことも可能です。たとえば定例のテンプレートを google docs で管理してておき…

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

…は使えない sendAPIRequest('/example', (result) => { // アロー関数は使えない if ([4, 5, 6].includes(result.items)) { ... } // Array.includes は使えない }); } これらを手作業で書き換えることもできますが、人間が新しい構文を見分けるのはミスを起こしがちですし、遠からずサポート対象外になる IE 9 のためだけに古い構文に書き直すのはもったいないものです。なんとか自動…

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

…ックパッドマートの API を使えるなど、基礎部分がある程度固まっていました。そのため、レシピアプリ側でまず最低限使える状態にした後、改善を繰り返す期間が焦点となってきます。 そのタイミングで最も変動が大きいのは UI ではないかと思います。 使うデータは同じでも、目的に応じて見せ方は変わる サーバーから返す情報が同じままでも、見せ方を変えるだけで印象や体験は変えられます。時には API からまるごと変える場合もありますが、多くは UI(View 層)の作り直しが楽になるだけ…

データ基盤チーム0人で運用は回るのか?! 前人未踏チャレンジ・クックパッドデータ基盤のすべて2020

…ueryはHTTPのAPIでRedshiftにクエリーを投げられる薄いシステムで、 内部ではRedshiftのUNLOADを使っています。 アプリケーションはUNLOADされたデータをS3から読むので、 読み込みの負荷をRedshiftから切り離すことができる利点があります。 特にRubyからは、redshift-connectorというライブラリで Queueryを簡単に使えるようにしています。 2020年に行った施策 以上がデータ基盤の概要です。 アーキテクチャは最初に設…

Ruby 3.0 の Ractor を自慢したい

…うまいこと簡単に扱うAPIに落とし込めませんでした(チャンネルをさらにほかのRactorに渡すような用途で、うまいことモデリングできませんでした)。 いくつかのパターンでは、CSP のほうが書きやすい、というのがわかっていたのですが、Ractor 自体をチャンネルのように使えば、性能を気にしなければ、実は CSP とほぼ同じようなことができることがわかったので、とりあえず Actor model 風のインターフェースをベースにしました。性能はあとでなんとかしよう、と思っていま…

プロと読み解く Ruby 3.0 NEWS

…havior. C-API methods related to $SAFE have been removed. [Feature #16131] 古のセキュリティ機構である $SAFE 機能は、Ruby 2.7 で廃止されましたが(プロと読み解くRuby 2.7 NEWS - クックパッド開発者ブログ 「$SAFE の廃止」)、まだ対応していないコードに警告などを出すため、$SAFE自体を特別扱いして、何か代入されたら警告を出す、もしくは例外を出す、という挙動になっていま…

Compositional LayoutとDiffable Data Sourceを使ってiOSアプリのつくれぽ詳細画面を実装する

iOS

…ViewItemは、APIから取得したつくれぽ情報をViewにとって都合の良い形に変換した構造体です) enum Section: CaseIterable { case media case margin case recipeTitle case recipeDescription case ingredientsHeader case ingredients case showMore } enum Item: Hashable { case media(media: …

Taking Advantage of Debugging Tools for Android App Development

…d from an API or user-generated like some of the screens that we've added in the renewal project. Using Flipper, the view tree of the screen can be checked and verified if the views are inflated correctly. Client App Selecting the view will…

大規模プロジェクトにおけるモバイル基盤の取り組み

…フィードバック実装 API21, 22 では FrameLayout 以外の ViewGroup で foreground が正しく反映されないため、foreground を利用してタッチフィードバック(ripple)を実装するとうまく反映されません。 stackoverflowの類似投稿 material-components のリポジトリにもForegroundLinearLayoutが存在しているので、他プロジェクトでも不便そうだなと思っています。 マルチモジュール関連…

AWS の This is My Architecture(動画)でS3を中心としたセキュリティログ基盤の紹介をしました

…リクエスト数が多いとAPIの呼び出し制限にひっかかる恐れがあります(参考)。こうしたことから、センサー側で少しログをためた後にS3へアップロードするため、ログを貯める時間がそのまま遅延になります。この遅延がどのくらいになるかはログの流量やセンサーの能力や性質などに依存するため一概には言えませんが、筆者の経験則からするとおおよそ1〜2分、最大でも5分程度になるように各種設定するのが良いと思われます。 ここで問題になるのが、1〜2分ほどの遅延がセキュリティログの利用にどのくらいの…

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

…) GraphQL(API) 技術選択する上でまず最初に考えたのは、TypeScript を中心に据えることです。型チェックによる整合性の検査、補完やリファクタリングを中心としたエディタの支援など、TypeScript を導入することによる生産性の向上は非常に大きいものがあります。 次にフロントエンドの描画ライブラリはシェアの大きさやTypeScript との相性、使いやすさなどを考慮したうえで React を採用することにし、サイトの性質上 Server Side Rend…

ドキュメントを書くときの「メンタルモデルの原則」

…きアンチパターンは「APIリファレンスしか用意されていないライブラリのドキュメント」みたいなものです。これは「もっと使いこなしたい人向け」以外の読者のメンタルモデルや目的を完全に無視していると思います。(それで問題ない場合ももちろんありますが) ちなみにJasperでは以下のようにドキュメントの入り口を分けることによって、異なる読者を適切なドキュメントに誘導しています。 🙆演繹的・帰納的な説明により推測を可能にする 人間がものを推測するときは大きく分けて演繹的な方法と帰納的な…

検索インフラを安全に切り替えた話

… の Config API に目をつけました。 Config API を利用すると Solr の設定を REST-like API で取得したり、更新したりすることができます。これを利用して実験をあるほど自動化できるツールを作ることにしました。 solr-hako-load-tester 設計目標としては次のようなことを上げました。 多様な Solr のパラメータを試せること 手軽に設定を変更できること 試したい設定をキューに詰め込んで順番に実行できるようにすること 一方でこ…

2020年のクックパッドAndroidアプリのアーキテクチャ事情

…んでした。大まかに API 通信や DB 操作等のデータ取得箇所を分離し、複雑なロジックを持つ場合は Manager, Util 等の強いオブジェクトが生成されていましたが、それ以外は Activity / Fragment に処理を直接記述することがほとんどでした。 そういった状況の中で今後もアプリを継続的に開発可能にすることを目的にアーキテクチャの導入が始まりました。クックパッドアプリでは iOS/Android 両プラットフォームで VIPER アーキテクチャを採用し、…

nerman: AllenNLP と Optuna で作る固有表現抽出システム

…スを利用せずに予測 API を用意する方法も考えられます. 今回のタスクの目標は「すでに投稿されたレシピからの料理用語の自動抽出」であり,これはバッチ処理であらかじめ計算可能です. このため, API サーバを用意せずにバッチ処理で予測を行う方針を採用しました. また,エンジニア以外のスタッフにも予測結果を使ってみてもらいたいと考えていました. クックパッドはエンジニア以外のスタッフも SQL を書ける方が多いため, 予測結果をクエリ可能な形でデータベースに保存しておく方針は…

日々の簡単なプロトタイピングに Flutter を活用する

…droid の純正 API のみで実現することも可能です。 さらに、まだ stable channel では提供されていないため今回は取り組みませんでしたが Web app や Linux app の開発もサポートを予定しているようなのでこれらのプラットフォームについてもコストをかけずに検証が可能になるかもしれません。 このように、さまざまなプラットフォームの技術的な検証を小さい学習コストで実現出来ました。 終わりに 今回は、モバイル向け OS 純正の音声認識ライブラリの性能…

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

…ources: 6 api keys: None endpoints: None functions: loadGenerator: serverless-artillery-minimum-dev-loadGenerator layers: None Serverless: Run the "serverless" command to setup monitoring, troubleshooting and testing. Deploy complete. 負荷試験の…

クックパッドのサービスメッシュ基盤を改善した話

…ート v1 xDS API の廃止 cookpad/itacho での itacho generate 廃止 xDS API の CI 整備 Envoy のアップデート クックパッドで利用されている Envoy のバージョンは v1.9.0 と 2018/12 にリリースされた古いバージョンを利用していました。v1.9.0 でも機能としては十分でしたが、脆弱性が報告されていたり、古いバージョンを使い続けることでアップデートがどんどん大変になっていくことに懸念がありました。その…

インフラにかかるコストを正しく「説明」するための取り組み

… Explorer API から取得したデータそのものや、それらを加工したものです。API のコールには 1 リクエストあたり 0.01USD と、積み重なるとそれなりに高額になりうる料金がかかるため、バッチ処理で定期的に Costco に取り込むようにしています。 予算と月次のふりかえりに関する機能 予算を Cost Explorer のフィルタとして定義する Costco には予算という概念があります。これは組織としての予算に対して Cost Explorer のフィルタ…

在宅勤務でも雑談がしたい!在宅勤務の課題解決の取り組み

…問題の解決のために API 経由でライセンスユーザーを複数作成し、1ユーザーにつき1ミーティングをホストする形でさぎょイプ用のミーティングを用意することで解決しています。ライセンスユーザーなのでお金はかかります😇 詳細な手順はリポジトリの README に記載しました。 アプリケーションはブラウザで動くクライアントアプリと Cloud Functions の2つでできています。データストアは Firebase の Cloud Firestore を利用しています。Zoom ミ…

在宅勤務環境を改善する社内オンラインハッカソンを開催した話

…rkcloud の API を経由して勤怠を記録できる Slack bot が社内で開発されたため、Slack での発言をトリガーにして出勤/退勤の打刻ができるようになりました。 みんなが買ったもの こちらは @hogelog の作品。在宅勤務の不便を解消するためにみんながいろいろなものを購入していると思います。この作品はこれまで Amazon で買ってきたものを購入履歴から投稿することで、みんなが買っている便利なものを知ることができるサービス。この作品は人事本部長賞を受賞し…

Bridging the Gap Between Engineering and Design

iOS

…cause of rapid iteration, this happens frequently and takes the time of both engineering and design teams to communicate changes. Each iteration takes a lot of time and disturbs the working pattern of all members involved on a feature. A Pr…

iOSアプリのメモリリークを発見、改善する技術

…検索は重い処理ですがAPIを通してサーバ上で行われるため、アプリは結果を表示するだけです。そのためメモリを多く必要としません。 これまでにも何度かメモリリークが発生している状況はありましたが、メモリを多く必要としないため多少の無駄があってもアプリの動作に影響がありませんでした。 クックパッドアプリで用いられているクラスの大半は自力で動くようなことはせず、RunLoop等のイベントループによって動作します。 UIKitを使用しているとインスタンスのRunLoopからの除去は自然…

AWS リソース管理の Terraform 移行

…DBCluster API で正式なパスワードに変更します。API を通じて master_password を得る手段が無いので Terraform は tfstate にある値を信じるしかなく、tfstate にも Terraform ファイルにも pasuwa-do と書かれているので差分が発生せず、センシティブな値を tfstate にも Terraform ファイルにも書き込まずに Terraform でリソースを管理することができています。 今後 Codenize…

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

…BFFを活用した既存APIサーバーの再構築" で紹介されている、Orcha と呼ばれる BFF Server を通じて、必要なレスポンスをクライアントに返すことが決まっていました。そこで、広告を表示させるにあたって、従来のように非同期で直接広告配信サーバーにリクエストするのではなく、BFF Server としての Orcha の立ち位置を利用し、Orcha から広告配信サーバーを問い合わせるようにできないか、という議論が要件定義フェーズで生じてきました。 アーキテクチャ概要 …

/* */ @import "/css/theme/report/report.css"; /* */ /* */ body{ background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527163350.png'); background-repeat: repeat-x; background-color:transparent; background-attachment: scroll; background-position: left top;} /* */ body{ border-top: 3px solid orange; color: #3c3c3c; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; line-height: 1.8; font-size: 16px; } a { text-decoration: underline; color: #693e1c; } a:hover { color: #80400e; text-decoration: underline; } .entry-title a{ color: rgb(176, 108, 28); cursor: auto; display: inline; font-family: 'Helvetica Neue', Helvetica, 'ヒラギノ角ゴ Pro W3', 'Hiragino Kaku Gothic Pro', Meiryo, Osaka, 'MS Pゴシック', sans-serif; font-size: 30px; font-weight: bold; height: auto; line-height: 40.5px; text-decoration: underline solid rgb(176, 108, 28); width: auto; line-height: 1.35; } .date a { color: #9b8b6c; font-size: 14px; text-decoration: none; font-weight: normal; } .urllist-title-link { font-size: 14px; } /* Recent Entries */ .recent-entries a{ color: #693e1c; } .recent-entries a:visited { color: #4d2200; text-decoration: none; } .hatena-module-recent-entries li { padding-bottom: 8px; border-bottom-width: 0px; } /*Widget*/ .hatena-module-body li { list-style-type: circle; } .hatena-module-body a{ text-decoration: none; } .hatena-module-body a:hover{ text-decoration: underline; } /* Widget name */ .hatena-module-title, .hatena-module-title a{ color: #b06c1c; margin-top: 20px; margin-bottom: 7px; } /* work frame*/ #container { width: 970px; text-align: center; margin: 0 auto; background: transparent; padding: 0 30px; } #wrapper { float: left; overflow: hidden; width: 660px; } #box2 { width: 240px; float: right; font-size: 14px; word-wrap: break-word; } /*#blog-title-inner{*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-position: left 0px;*/ /*}*/ /*.header-image-only #blog-title-inner {*/ /*background-repeat: no-repeat;*/ /*position: relative;*/ /*height: 200px;*/ /*display: none;*/ /*}*/ /*#blog-title {*/ /*margin-top: 3px;*/ /*height: 125px;*/ /*background-image: url('https://cdn-ak.f.st-hatena.com/images/fotolife/c/cookpadtech/20140527/20140527172848.png');*/ /*background-repeat: no-repeat;*/ /*background-position: left 0px;*/ /*}*/