GraphQL開発のベストプラクティスをまとめた"Principled GraphQL"を読んだ

"Principled GraphQL"はApollo社が公開しているGraphQL開発のベストプラクティス集です。 principledgraphql.com 背景として、近年のアプリケーション開発では「データグラフ」が重要になってきているとしています。GraphQLを通じて、ある企業のすべてのアプ…

値の妥当性をチェックする日時表現パーサを作る

『Haskell入門』に日時表現("YYYY/MM/DD hh:mm:ss")のパーサをAttoparsecで作る節*1があり、 このままでは9999/99/99 99:99:99のような入力ができてしまいますが、月の入力範囲を1~12に制限するといった制約をかけることも、これまで説明した範囲で簡単に実…

リソースとActive Recordのモデルのあいだの差異を吸収するクラスを作る

Web APIのリソースとバックエンドで扱うモデル(特にActive Recordのモデル)に歴史的な事情で差異があり、単純にモデルからリソースへと変換できないとき、それらの差異を吸収するクラスを作って対応することがあったのでメモを残しておきます。 問題 あるW…

関数をFunctor/Applicative/Monadにする

『プログラミングHaskell 第2版』の12章「モナドなど」の演習*1で型 (a ->) をFunctor(関手)、Applicative、Monadにするという問題があり、少しわかりにくかったので、いまの自分自身の理解をまとめました。 型(a ->)とは 部分適用された関数の型を(a ->)…

WebAuthnによる認証機能を作りながら理解を深める

Web

何をやったか 最近の仕事柄興味があったのと、WEB+DB PRESS Vol.114の特集2を読んだこともあって、理解を深めるためにWebAuthnでの公開鍵登録(今回はサインアップを兼ねる)、認証だけできる簡単なWebアプリを作りました。リポジトリのREADMEに様子のGIFア…

外部サービスのリソースをJSONシリアライザブルなActive Modelとして表現する

RailsでWeb APIを作っていて、外部のサービスからリソースを取得し、DBには保存しないもののレスポンスに含めてクライアントに返したい、ということがありました。このとき次のモジュールが役立ったので紹介します。 ActiveModel::Model ActiveModel::Attrib…

Active Recordでstring型属性を暗号化するためのRailsプラグインを作った

複数プロジェクトで、Active Recordのstring型を拡張して透過的に文字列を暗号化/復号できる型をattributes API(ActiveRecord::Attributes) を使って書く場面を目撃したり、自分でも書く機会があったので、Railsプラグインに切り出してみました。 github.c…

OpenAPI 3ドキュメントも使えるSchemaConformist 0.3.0をリリースした

rubygems.org これまでのバージョンの差分はOpenAPI 3ドキュメントが使えるようになった点です。OpenAPI 3に対応したCommittee v3の機能を使うことで、integration test/request spec実行中にOpenAPI 3ドキュメント中のスキーマに基づいたJSONレスポンスのバ…

『改正割賦販売法でカード決済はこう変わる』を読んだ

2019年の1Qに読んだ本シリーズ: 改正 割賦販売法でカード決済はこう変わる作者: 瀬田陽介,井原亮二出版社/メーカー: 日経BP社発売日: 2018/04/12メディア: 単行本この商品を含むブログを見る 概要 2018年6月から施行されている「改正割賦販売法」によって、…

『失敗から学ぶRDBの正しい歩き方』を読んだ

2019年の1Qに読んだ本シリーズ: 失敗から学ぶRDBの正しい歩き方 (Software Design plus)作者: 曽根壮大出版社/メーカー: 技術評論社発売日: 2019/03/06メディア: 単行本(ソフトカバー)この商品を含むブログを見る RDBのテーブル設計や運用に関するアンチパ…

『図解 カードビジネスの実務 第2版』を読んだ

2019年の1Qに読んだ本シリーズ: " title="クレジットのすべてがわかる! 図解 カードビジネスの実務">クレジットのすべてがわかる! 図解 カードビジネスの実務作者: 本田元出版社/メーカー: 中央経済社発売日: 2017/03/23メディア: 単行本この商品を含むブロ…

『WEB+DB PRESS Vol.108』でスキーマ駆動Web API開発についての特集記事を執筆しました

このたび、2018年12月22日に発売された『WEB+DB PRESS Vol.108』の特集1「効率急上昇!スキーマ駆動Web API開発」の企画と執筆に携わりました。id:june29さん、id:ackintoshさん両名との共著です。 WEB+DB PRESS Vol.108作者: 中野暁人,山本浩平,大和田純,曽…

Stripe Sources APIにおける決済の抽象化

この記事はGMOペパボ Advent Calendar 2018の23日目の記事です。 GMOペパボのAdvent Calendarと言っておきながら、Stripeが提供しているWeb APIの話をします。 Stripeの決済用Web APIでは、sourceという概念を通じて多様な決済方法を抽象化して表現していま…

"The Modular Monolith: Rails Architecture"を読んだ

Modular MonolithというアーキテクチャをRailsアプリケーションへ適用する記事を読みました。 medium.com モノリスアーキテクチャとマイクロサービスアーキテクチャの中間に位置する、一つのモノリシックなアプリケーション内でドメインごとにモジュールに分…

このブログをHTTPS化した

はてなブログで独自ドメインを当てているときもHTTPS化できるようにとっくになっていたので、このブログもHTTPS化しました。 手順 こちらの記事を全面的に参考にさせてもらいました。 blog.jnito.com まずはgemをインストールします。config.yml の準備もい…

『なるほどUnixプロセス』を読んだ

読みました。 tatsu-zine.com どんな本か 主にRubyの Process モジュールを使いながらUnixプロセスについて知る本です。 Rubyでには Process モジュールを通じてUnixプロセスを操作することができます。つまり、プロセスに関するUnixのシステムコールをRuby…

GraphQLナイトに参加した & 『GraphQLとスキーマファースト開発』についてLTした

connpass.com 五反田のfreeeさんでGraphQLナイトが開催されたので参加してきました。会社のSlackの開発者チャンネルで@hsbtさんが貼ったリンクを見て開催に気づけたので、ありがたい限りでした。 また、LT枠が急遽空いたので、前日に飛び入りでLTすることに…

graphql-guardとポリシーオブジェクトをgraphql-ruby 1.8で使うための方法

これの続きです。 blog.kymmt.com 問題 graphql-guardはインラインでポリシーを書く方法の他に、ポリシーオブジェクトを定義して GraphQL::Guard.new に渡すという方法があります。使いかたはREADMEに書いてあるとおりです。 class GraphqlPolicy RULES = { …

graphql-guardをgraphql-ruby 1.8で使うためのある方法

問題 graphql-ruby 1.8ではclass-based APIが導入されました。フィールド定義は型を表すクラスのコンテキストでクラスメソッド field を呼ぶ形で定義します。 class Types::Query < Types::BaseObject field :viewer, Types::User, null: true def viewer co…

アソシエーションのscopeを使いつつLIMITっぽいことをやる

細かすぎて伝わらないかもしれませんが、ハマったので共有します。 問題 ユーザーが免許を持つ次のようなモデルを考えます。has_one :licenseは免許更新を重ねてきたなかで最新の免許を取得したくて書いたと思ってください。 class User < ApplicationRecord…

GraphQL Subscriptionsをgraphql-rubyとAction Cableで作る

graphql-rubyでは、RailsのAction Cableに乗ることでGraphQL Subscriptionsを実装できます。 GraphQL Subscriptionsとは GraphQL Subscriptionsは、あらかじめ特定のGraphQLクエリを購読しておき、サーバ側でイベントが起きるたびにその形式のデータを受信で…

wscatでAction Cableと通信する

Railsで/cableなどのエンドポイントにAction CableをマウントするとWebSocketサーバとして利用できます。wscatを使ってAction CableによるWebSocket APIと対話的に通信するために、送信するデータの形式などを調べました。 準備 wscat github.com npmでイン…

GraphQL APIを作るときにテストをどう書いていくか

こういうのはどうかという最近の考えを書いておきます。とはいっても、だいたいはgraphql-rubyのドキュメントに書いてあります。Rails + graphql-ruby + RSpecが前提です。 各フィールドのテスト フィールドから正しく値を取得できるか、つまりRailsのモデル…

Yokohama.rb Monthly Meetup #88 に参加した

2018-02-17(月)のYokohama.rb Monthly Meetup #88 参加メモです。 yokohamarb.doorkeeper.jp Rubyレシピブック 気づいたら第11章「オブジェクトとメタプログラミング」に入っていました。 273: オブジェクトが同じか調べる 274: オブジェクトを複製する 27…

dry-containerとdry-auto_injectでDIコンテナを作る

dry-rbファミリーのdry-containerとdry-auto_injectを使うと、POROの組み合わせでDIが実現できます。 DIについてハイパーざっくり理解を得るには次の記事を読めばよいです。 qiita.com 上の記事の中のDIコンテナを適用したコードをdry-containerとdry-auto_i…

GraphQL APIをスキーマファースト開発するためのモックサーバをRailsとApolloで作る

GMOペパボ Advent Calendar 2017の23日目の記事です。 今回はJavaScriptでGraphQLのサーバ/クライアントや関連ツールを提供しているApolloのツールセットでRailsプロジェクトでGraphQLのモックサーバを立ち上げるところまでを試してみます。 業務でRails製…

Railsの内部やPluginによる拡張方法について学べる本 "Crafting Rails 4 Applications" を読んだ

読みました、というよりは夏の終わりぐらいから何度か読んでいました。 Crafting Rails 4 Applications: Expert Practices for Everyday Rails Development (The Facets of Ruby)作者: Jose Valim,Brian P. Hogan出版社/メーカー: Pragmatic Bookshelf発売日…

Yokohama.rb Monthly Meetup #85 に参加した

2017-11-11(土)のYokohama.rb Monthly Meetup #85メモです。 yokohamarb.doorkeeper.jp Rubyレシピブック @igrepさんと、第10章の「Webプログラミング」の続きで次のレシピを読みました。 265: クッキーを処理する 266: セッションを使用する cgiとRackを…

テスト時にAPIドキュメントのスキーマ定義からレスポンスのJSONを自動でバリデーションするgemを作った

あらかじめ書いたJSON Hyper Schema/OpenAPI 2.0のAPIドキュメントにおけるレスポンスのスキーマ定義をもとに、APIモードのRailsでHTTPリクエストを発行するテストを実行すると、自動でレスポンスのJSONをバリデーションしてくれるSchemaConformistというgem…

社内勉強会でスキーマファースト開発についてしゃべった

2017-10-24(火)にペパボEC事業部において「EC事業部 TechMTG #4」という社内勉強会がありました。この機会に、昨今のWeb API開発事情について知ってもらおうと思い、最近はチームでスキーマファースト開発をやってみているという話をしました。 スライドに…