API の検索結果:

React Nativeで作った新アプリについて(5日間連載)

…実装、サーバサイドのAPIを簡単に呼び出せる仕組み、よく使うカラー・レイアウトの提供、etcという感じです。 Prototype Labsとは APIリファレンス ドキュメントはESDocというJavaScript向けのドキュメンテーションツールで作りました 特にドキュメント周りは力を入れて整備しました。というのも、社内のデザイナー(HTML, CSS, JSに多少触れたことがある人)にも使ってもらえるようにというのを目標の1つにしていたからです。実際、デザイナーとペアプロ的…

クッキングLIVEアプリcookpadTVのコメント配信技術

…に コメントを受けるAPIは別アプリケーションとして構築しました。コメントを受けるAPIはその他のAPIとは特性が違うので、コメントを受けるAPIだけをチューニングしやすくなるからです。 以下では、このコメントを受けるAPIサーバーのことを メッセージサーバー と呼び、その他のAPIサーバーを 通常のAPIサーバー と呼ぶことにします。*1 まず、実装言語はgolangを採用しました。採用理由は以下が挙げられます。 並列処理が得意な言語なので、同時接続を受け付けやすい 後述の…

Web アプリケーションを把握するためのコンソール

…、AWS のように API で情報を取得できるインフラを使っていたり、hako の定義ファイルのように機械的に読み込める情報があるので、これらの実際に使われている実態と乖離していない一次情報を自動的に集めることを念頭に置いて設計しました。 hako-console 自体は極力マスターとなるデータを持たない 既に別の場所にあるデータやメトリクスを表示するだけにする 人間が何かを入力することも極力しない かわりに他のシステムからデータを取得して、それを機械的に処理する アプリの状…

MR による料理サポートのための取り組み

…チャしてその画像を API リクエストでサーバへ送信します。 そしてサーバ側で画像認識した結果を受け取りその結果を表示します。 背景 背景としては、Semantic ARのように HoloLens と画像認識モデルを組み合わせ画像認識結果を現実世界に重畳させてユーザーに提供したいというモチベーションがありました。 HoloLens で画像認識するには HoloLens 自体で画像認識モデルを動かすか、API を経由してサーバ側で画像認識した結果を可視化するかの2通りがあります…

TLS証明書の発行・デプロイについて

…DV証明書を発行し、APIエンドポイント用のドメインなどを除いて順次EV証明書を配置しています。 以前はドメインごとにEV証明書を一つ一つ購入していたためコストも無視できなかったのですが、後述するマルチドメイン証明書を用いることで年100ドルほどで追加購入できるようになりました。 また、常にEV証明書を設定するというわけでもなく、URLの変更などで使用しなくなりリダイレクトのみ行うドメインについてはEV証明書をやめてACMの証明書に切り替える、ということも行っています。 EV…

Google Play アプリ内定期購入を実装する

…Developer APIを利用する事で、ユーザ様の問い合わせに対して購入のキャンセルや払い戻し対応も可能になるので、この格言に習う事に越した事はありません。 TIPS5. 購入トランザクション上のログを細かく取る 決済系に限らず「まずはログ」という所で、TIPS4に関連して、ユーザ様が商品の購入に失敗した際、どの処理中に購入に失敗してしまったのかを追跡可能な状態にする必要があります。 クックパッドのAndroidアプリでは、よりユーザ様の購入状況が追跡できるよう、購入/復元…

Nginxへの変更に伴うリバースプロキシのテストの改善

…ジトリで管理され、Capistranoで設定を配布する方式になっていました。これは当初、サーバ全体の構成管理(当時はPuppet)の適用タイミングと、プロキシサーバの設定の変更タイミングが異なると考えてのことだったのですが、現状では単に管理が複雑になるだけでメリットがない状態になっていました。 この状況を踏まえ、リバースプロキシのOSなどのリニューアルをするタイミングで、より平易に設定を書くことができるNginxへ変更し、また、Nginxの設定ファイルについてはItamaeの…

良い感じにログを収集するライブラリ、Puree-Swiftをリリースしました

…ます。 以下のようにAPIリクエストを伴うようなログ送信に適しています。 class LogServerOutput: BufferedOutput { override func write(_ chunk: BufferedOutput.Chunk, completion: @escaping (Bool) -> Void) { let payload = chunk.logs.flatMap { log in if let userData = log.userData…

Cookpad の新規事業と Firebase

…tion: @escaping (Firebase.User?) -> Void) { guard let authUser = Auth.auth().currentUser else { return completion(nil) } self.get(authUser.uid) { user, _ in guard let user = user else { completion(nil) return } completion(user) } } } } あとは通…

サーバーレスなバックアップシステムを AWS SAM を用いてシュッと構築する

…コンピューティング API Gateway: リバースプロキシ SNS (Simple Notification Service): pub/sub によるメッセージング SQS (Simple Queue Service): キューによるメッセージング S3: オブジェクトストレージ DynamoDB: NoSQL データベース CloudWatch: ロギングおよびモニタリング これらのコンポーネントは AWS によって維持管理されており、高い可用性とスケーラビリティを持…

Ruby 2.5 の改善を自慢したい

…e:81043] rapid CI service for MRI trunk)。いわゆる普通のテストを定期的に行う CI は rubyci というものがあるのですが、結果が出るまで時間がかかる、通知がないなど不満がありました。そこで、最短で2分で結果が出る環境を整備することにしました。計算機はクラウド環境では無く、実機を利用しています。私が主催した東京Ruby会議11の予備費を用いて購入したマシンと、ある企業様から Ruby Association へ寄贈頂いたマシン、それ…

料理画像判定のためのバックエンドアーキテクチャ

…像判定用のHTTPのAPIエンドポイントを用意し、そこに画像をアップロードして判定処理を行い、結果をレスポンスで返すという構成で実現していました。 Web APIはRailsとUnicornで動いているサーバーで、その後ろに実際に判定をおこなうPythonのサーバーがたっていてRailsのアプリケーションはそこと通信しています。 この処理は画像アップロードに加えて、料理画像判定の処理にディープラーニングを用いているのでそれなりに重たい処理になります。APIサーバーで利用してい…

クックパッドのデータ活用基盤

…ryというHTTP APIシステムを挟むようにしています。 Queueryは、APIでselect文を受け付けて結果をS3にUNLOADし、そのURLを返すだけの単純なシステムです。 このシステムを作った一番の理由は、バッチからの読み込み方法をRedshiftのUNLOADだけに限定したかったという点です。 Redshiftのカーソルはleader nodeにデータをマテリアライズするうえに、カーソルがクローズされるまでコネクションを占有しつづけます。 いずれの特徴もlead…

Synthetic Monitoring を活用したグローバルサービスのネットワークレイテンシの測定と改善

…利用した場合のある API のレスポンスタイムの比較です。 これを見るとインドネシアのユーザに対しては Fastly と X 社 共にレスポンスタイムの改善効果があるとわかります。現在はグローバルサービスには部分的に Fastly を導入しています。TLS 接続や全体のレスポンスタイムは以下のようになりました。期待していた通り、 TLS ハンドシェイクの短縮やレスポンスタイムの改善がされています。 余談ですが、2017年7月中頃までは Fastly を導入するとアルゼンチンの…

クックパッドと分散トレーシング

…d library API の標準化を進めているプロジェクトもあります。 クックパッドでの導入 分散トレーシングシステムの選定 クックパッドで分散トレーシングを導入するに当たり、いくつかの点を考慮して AWS が提供するマネージドサービスである AWS X-Ray*7 を採用しました。クックパッド内では一般的なユースケースを想定しているので、既存の分散トレーシング実装を利用することを決めました。分散トレーシングシステム実装として採用例も多く開発も活発な Zipkin に焦点を…

2nd Hackarade: Machine Learning Challenge

…発部が作成している API があったため、そちらを使用しています。 多くの要素が絡む総合格闘技的なトピックでしたが、スピーディーに実装してみんなが確認できるものが出来上がったので、どうすれば人数カウントの精度が上がるかという議論も含めて盛り上がっていました。 究極のカレーレシピを錬成する RNN を使ってカレーのレシピを生成してみようという話です。 講義では RNN には触れませんでしたが、torch-rnn を使ってカレーのレシピを生成するモデルを学習し、実際にレシピを生成…

Android TVアプリの自動化されたテストの小話

…ックス端末とかが引っかかることがあります。そのため、UI_MODE_TYPE_TELEVISIONをもつがAndroid TVではない環境下で、Android TV向けのAPIを呼んでしまった場合、アプリがクラッシュしてしまいます。国内ではいくつかこの状態になる端末が存在するらしく、私たちも再現するまで気づかなかったのですがこのような状態になるようです。(ただ、 UI_MODE_TYPE_TELEVISION による判定はGoogle公式にも書かれている方法ではあるのですが)

時系列データベースに関する基礎知識と時系列データの符号化方式について

…関しても、HTTP API を用意しており、Graphite 形式と互換の HTTP API で書き込むことが出来る時系列データベースが新たに開発されている程度には普及しています。 一方で、時系列データを保存する構造に関しては非常に単純であるために、時系列データにタグを付けて管理・解析することや、 数秒単位でデータを書き込み続けた場合に、高性能なストレージを複数用意する必要があるなどの、いくつかの課題が未だに残っているような状態です。 その他にも、検索エンジンや RDBMS …

モバイルアプリのアーキテクチャを考える

…ントの種類に応じて API リクエストを行いレスポンスから models のストリームを生成する models = requestTrigger .flatMapFirst { [weak self] triggerType -> Observable<ModelRequest.Response> in // 中略: API リクエスト } .startWith([]) .shareReplay(1) } } https://github.com/morishin/RxMVV…

Sisimaiを使ったバウンスメールの管理

…く、またわかりやすいAPIで、しかも自分が慣れたRubyのライブラリであったため、とても簡単に新しいシステムに組み込むことができました。 以下はSisimaiを使ってバウンスメールの解析を行うサンプルコードです(※公式ドキュメントより引用) #! /usr/bin/env ruby require 'sisimai' v = Sisimai.make('/path/to/mbox') # or Path to Maildir if v.is_a? Array v.each d…

最近のサービス間のデータとイベントの連携について

…ypermedia API の社内標準化 まず、データ連携の第一歩としてウェブ API によるデータの作成・閲覧・更新・削除についてです。 クックパッドではウェブ API の開発・利用には Garage とそのクライアントである GarageClient を用いています。 Garage は RESTful Hypermedia API を Ruby on Rails 上で開発するためのライブラリであり、クックパッドで4年近くの開発・利用されています。Garage 自体について…

Web サービスの完全 HTTPS 化

…には Amazon API Gateway を使い、受け取った JSON を Amazon Kinesis Firehose に送信して Amazon Elasticsearch Service で分析を行えるようにしています。実装が必要な箇所は API Gateway が JSON を受け取る箇所のみですので、非常に楽です。 全体リリース 段階的リリースにおいて徐々に公開範囲を広げていき、問題がなければ全体リリースへと進みます。 アプリケーションが HTTPS 接続を受け入…

MySQL with InnoDB のインデックスの基礎知識とありがちな間違い

こんにちは、サービス開発部の荒引 (@a_bicky) です。 突然ですが、RDBMS の既存のテーブルを見てみたら「何でこんなにインデックスだらけなの?」みたいな経験はありませんか?不要なインデックスは容量を圧迫したり、挿入が遅くなったりと良いことがありません。 そんなわけで、今回はレコードを検索するために必要なインデックスの基礎知識と、よく見かける不適切なインデックスについて解説します。クックパッドでは Rails のデータベースとして主に MySQL 5.6、MySQL…

ユーザー基盤を作り直しながらRailsでのサービス層に向き合う

…完了を知らせるためのAPIを叩く。 そこで、この処理ではARモデルを直接読み書きするのではなく、フォームオブジェクトを導入し、「ユーザー登録完了フォーム」として抽出しました。 これにより、以下の観点で「無理のないアプリケーションコード」にできたと思っています。 フォームの入力値をrequestやparamsハッシュから取り出したあとの、Plain OldなRubyオブジェクトにできた。そのため、モデルのユニットテストとして一連の処理をテストできた。 複数ARモデルのオブジェク…

モバイルアプリ開発における思いと工夫

…ん。アプリの外側で、APIサーバーに問題があるなどして機能を提供できなければ、これもまた計測ができません。 したがって、施策を仮説どおりに実装していること、その効果を計測できる状態を維持することが大切になります。 次に、ユーザー体験の面から見てみましょう。 クックパッドはコミュニティサービスなので、ユーザーが離れていってしまうことはサービスにとっての損失になります。ユーザーが離れていってしまう体験とはどんなものでしょうか。 ユーザーにとって残念な体験が続くと、離れていってしま…

『Swift実践入門』2月7日発売

…させていただきます。APIKitなどで著名な@_ishkawaさんとの共著となります。 Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)作者: 石川洋資,西山勇世出版社/メーカー: 技術評論社発売日: 2017/02/07メディア: 単行本(ソフトカバー)この商品を含むブログを見る また、刊行記念のイベントも開催することになりましたので、興味のある方はぜひご参加ください。 執筆の動機 〜Swiftのwhyとwhenの解消〜…

Swift 3 マイグレーション

…Swift 3 の API Design Guidelines をある程度使っていたので、既存の Swift コードが割りと Swift 3 っぽかったです。とはいえ、できることがいくつかありました。 enum Swift 3 では、 enum の頭文字が小文字になっていて、マイグレーションツールは自動的に多くのを変えてくれるのですが、 String の rawValue を持つ enum (enum MyEnum: String で定義されたもの)は変えてくれません。値名を…

Swiftプロジェクトのビルド時間を計測・改善するxcprofilerを作った話

…tion: @escaping (Bool) -> Void) | 107.9 | | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.swift | 8 | @objc override init(frame: CGRect) | 102.5 | | xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.swift | 31 | private final func configureAppearance() | 102.1 | | xxxxxxx…

EarlGreyを使った画面操作を伴う自動テスト

…tはPrivate APIを使用するため、Xcodeのバージョンが変わることで整合性がくずれたのでしょう。 しっかり使って育てていきたい EarlGreyはOSS(オープンソースソフトウェア)として公開されているフレームワークなので、必要な実装は追加していくことが可能です。 今回は、コミットするところまでいけませんでしたが、自分たちが使っていきたいものなので、まだ育てるフェーズと思ってどんどん試していきましょう。 クックパッドでは業務時間中のOSSへの貢献も認められているので…

非SPAなサービスにReactを導入する

…話題では、サーバ側はAPIのみを提供し、View(HTML)は全てJavaScriptで描画するような、いわゆるシングルページアプリケーション(以下SPA)についてよく語られます。 一方で、SPAを構築するにはコストがかかることも事実で、特にフロントエンドエンジニアが多くない環境では、従来通りサーバーサイドでViewを書きつつ動的な部分だけJavaScriptで処理するというアーキテクチャのほうが現実的な場合も往々にしてあります。 今回はこのような、サーバー側でHTMLを生成…