Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20200515_出張!Railsウォッチ in 銀座Rails#21

20200515_出張!Railsウォッチ in 銀座Rails#21

2020/05/15に銀座Rails#21で発表したスライドです。
https://ginza-rails.connpass.com/event/173610/
週刊Railsウォッチ: https://techracho.bpsinc.jp/tag/%e9%80%b1%e5%88%8arails%e3%82%a6%e3%82%a9%e3%83%83%e3%83%81

37b01da9150c1e789f35771b06d36890?s=128

Masato Mori

May 15, 2020
Tweet

Transcript

  1. 出張!Railsウォッチ
 in 銀座Rails#21
 森 雅智 / @morimorihoge 1
 特集:~標準仕様を読むためのABNF~


  2. About Me
 • 森 雅智: @morimorihoge
 • BPS株式会社でRailsの受託開発チームをやってたり、週1大学非常勤で Web開発を教えてたりします
 •

    Ruby/Rails歴は11年くらい。Web開発は17年くらい
 • 銀座Ralis #10でActiveRecordでVIEWを使おうという話をしました
 About BPS & TechRacho
 • Web受託開発や電子書籍製品開発をやっている会社です
 • TechRachoという自社技術Blogを運営しています
 ◦ 3年半ほど前から平日毎日更新してます
 ◦ https://techracho.bpsinc.jp/ • お仕事相談、転職相談、TechRachoへのご意見など気軽にどうぞ
 ◦ https://www.bpsinc.jp/ 2

  3. Railsウォッチとは?
 技術ブログTechRachoで毎週連載しているRails / Ruby界隈を中 心とした雑多な情報を提供する技術雑談マガジン
 3


  4. これまでの出張Railsウォッチのピックアップテーマ
 • Rails6新機能特集
 ◦ 銀座Rails#12: 複数DB対応
 ◦ 銀座Rails#13: ActionText、Trix
 ◦

    銀座Rails#14: ActionMailbox
 • Railsアプリケーション開発に関する雑多なテーマ
 ◦ 銀座Rails#15: production、development、staging環境について
 ◦ 銀座Rails#16: 機能開発の設計レビューについて
 ◦ 銀座Rails#17: リソース管理スコープについて
 • 開発一般な話
 ◦ 銀座Rails#19: 開発チームの冗長化について
 ◦ 銀座Rails#20: Excelと仲良くしよう
 4
 ※過去のスライドはTechRachoにて公開しています。「TechRacho 銀座Rails」あたりで 検索するとヒットしますので興味のある方はどうぞ

  5. 標準仕様を読むためのABNF
 5


  6. 世の中で使われている標準仕様
 • メーカーや国、開発者が異なる機器間で通信を成立させるためにはお互いが標準 仕様を守り、正しく実装・運用されていることが大事
 • インターネット・Web界隈ではIETFやW3C、WHATWG(HTML)などが良く見る標準化 団体
 ◦ RFC:インターネットで使われるネットワークプロトコルやその中で使われる仕様などが定義されて いる。HTTP、TLS、SMTP、URL(URI)など

    
 ◦ W3C、WHATWG:HTML、CSS、などブラウザ寄りなもの 
 • 標準仕様には「仕様」は書かれているが具体的な「実装」は書かれていない
 ◦ ※実際には実装が先行して仕様となるケースも多いが、その辺は各社の標準化戦争的なやり取り があったりします
 6

  7. Railsアプリ開発者が標準仕様を参照するときはいつ?
 • Railsに実装されていないWeb標準に従った機能を新たに実装するとき
 ◦ Railsはかなりリッチな機能を持っているが、特殊な独自サービス・ソフトウェアが付与した ヘッダを使った機能を実装するなどの際が該当する(独自SSOなど) 
 ◦ 新機能を実装する際に、標準仕様を参照するようにすると比較的楽に設計できる時があ る(標準仕様は広くレビューされたものなので、一人で考えるよりは設計上の穴が少ない

    だろう)
 • 外部サービスとのAPI連携がうまくいかない時の障害調査・デバッグ
 ◦ Rails側、外部サービス側どちらに問題があるかを検証するために、お互いのシステムが きちんと標準仕様に沿った挙動をしているかの犯人探しをしたいとき 
 ◦ ※ニッチな機能などはライブラリ実装がバグってるケースが割とあります 
 7

  8. ABNF(Augmented Backus-Naur Form)とは
 8
 • 文脈自由文法を定義するメタ言語BNF(Backus-Naur Form)の亜種の一つ
 • 文法を定義することで「ある文法に沿っているか」を判別するのに使われる
 •

    BNF亜種は他にもあるが、RFCやW3CなどWeb、インターネット界隈ではABNFがよく 使われる印象
 • リファレンス
 ◦ よく参照されるRFC5234: https://www.ietf.org/rfc/rfc5234.txt 

  9. なぜABNFで書かれるのか?
 • Examplesのリストだけでは仕様の細部を表現できないことが多い
 ◦ 結果として後でバグや障害の原因になりがち
 • 必要十分な表現力があり、人間に読みやすい
 ◦ 少し学習すれば読むのは難しくない
 •

    機械的に処理することができる
 ◦ 多少書式を成型すればyaccに食わせてパーサーを作ることもできる
 ◦ ※パーサーが作れる=ある入力がきちんとその文法に沿っているかをチェックできる
 9

  10. ABNFの基本書式
 • 左辺:定義したいルール名
 • 右辺:そのルールの定義
 ◦ ※右辺の中ではそれより前に定義済みのルールを利用して良い
 10
 とにかく基本はこれ


  11. 試しに見てみるRFC3339: timestampフォーマット
 • 「RFC3339」でググって見てみましょう
 • timestampフォーマットの仕様で、以下のようなものがRFC3339準拠となる(5.8. Examplesより)
 ◦ 1985-04-12T23:20:50.52Z ※

    UTC
 ◦ 1996-12-19T16:39:57-08:00 ※ UTC -8時間のタイムゾーン(PST) 
 ◦ 1990-12-31T23:59:60Z ※ うるう秒もあり得る 
 • RubyであればDateTime#rfc3339などを使って取り出すことができる
 11

  12. コア部分はここ
 読んでいくと5.6. Internet Date/Time Formatという章が出てくる
 12
 ABNFで書かれている


  13. 13
 これを最終的に定義したい 


  14. 14


  15. 15


  16. 16


  17. 17


  18. 18


  19. 19


  20. ABNF展開の基本
 20


  21. full-dateを展開できなくなるところまで展開する
 21


  22. full-timeも展開するぞするぞするぞ・・・
 22


  23. これで全て展開できた!
 23


  24. ABNFの定義(1)
 24
 ※“a”やDIGITのようなこれ以上展開できないモノは 終端記号と呼びます
 ※ ウィキペディア先生からですが・・・ 


  25. ABNFの定義(2)
 25


  26. ルールに従って書き下したもの
 26
 以下のexamplesパターンにマッチしているか脳内parseしてみましょう 


  27. ABNFまとめ
 • RFC等の仕様には、さらにruleごとの詳細について解説がついているため、実際に はABNFに沿っている=標準仕様に沿っているとは限らないのに注意
 • Timestampは比較的わかりやすい例でしたが、もっと追ってみたい人は以下もチャ レンジしてみると良いと思います
 ◦ RFC4648:The Base16,

    Base32, and Base64 Data Encodings 
 ▪ https://tools.ietf.org/html/rfc4648 
 ◦ RFC3986:URI Generic Syntax 
 ▪ https://tools.ietf.org/html/rfc3986 
 ◦ W3C: Content Security Policy 
 ▪ https://www.w3.org/TR/CSP3/ 
 • その他自分で「仕様がうろ覚えだなあ」と感じるようなモノについては仕様を追いか けてみてABNFの定義が見つかると、自信を持ってコードを書けることが増えるかも しれません
 ◦ ソースコード内に標準仕様へのreferenceコメントを付けておくと、冗長なレビューコストも減らせるか も?
 27

  28. 次回以降もブラッシュアップしていきます
 感想・リクエストなどあればTwitter
 #ginzarails
 @morimorihoge
 @hachi8833
 までお声かけください
 28