Slide 1

Slide 1 text

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


Slide 2

Slide 2 text

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


Slide 3

Slide 3 text

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


Slide 4

Slide 4 text

これまでの出張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」あたりで 検索するとヒットしますので興味のある方はどうぞ


Slide 5

Slide 5 text

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


Slide 6

Slide 6 text

世の中で使われている標準仕様
 ● メーカーや国、開発者が異なる機器間で通信を成立させるためにはお互いが標準 仕様を守り、正しく実装・運用されていることが大事
 ● インターネット・Web界隈ではIETFやW3C、WHATWG(HTML)などが良く見る標準化 団体
 ○ RFC:インターネットで使われるネットワークプロトコルやその中で使われる仕様などが定義されて いる。HTTP、TLS、SMTP、URL(URI)など 
 ○ W3C、WHATWG:HTML、CSS、などブラウザ寄りなもの 
 ● 標準仕様には「仕様」は書かれているが具体的な「実装」は書かれていない
 ○ ※実際には実装が先行して仕様となるケースも多いが、その辺は各社の標準化戦争的なやり取り があったりします
 6


Slide 7

Slide 7 text

Railsアプリ開発者が標準仕様を参照するときはいつ?
 ● Railsに実装されていないWeb標準に従った機能を新たに実装するとき
 ○ Railsはかなりリッチな機能を持っているが、特殊な独自サービス・ソフトウェアが付与した ヘッダを使った機能を実装するなどの際が該当する(独自SSOなど) 
 ○ 新機能を実装する際に、標準仕様を参照するようにすると比較的楽に設計できる時があ る(標準仕様は広くレビューされたものなので、一人で考えるよりは設計上の穴が少ない だろう)
 ● 外部サービスとのAPI連携がうまくいかない時の障害調査・デバッグ
 ○ Rails側、外部サービス側どちらに問題があるかを検証するために、お互いのシステムが きちんと標準仕様に沿った挙動をしているかの犯人探しをしたいとき 
 ○ ※ニッチな機能などはライブラリ実装がバグってるケースが割とあります 
 7


Slide 8

Slide 8 text

ABNF(Augmented Backus-Naur Form)とは
 8
 ● 文脈自由文法を定義するメタ言語BNF(Backus-Naur Form)の亜種の一つ
 ● 文法を定義することで「ある文法に沿っているか」を判別するのに使われる
 ● BNF亜種は他にもあるが、RFCやW3CなどWeb、インターネット界隈ではABNFがよく 使われる印象
 ● リファレンス
 ○ よく参照されるRFC5234: https://www.ietf.org/rfc/rfc5234.txt 


Slide 9

Slide 9 text

なぜABNFで書かれるのか?
 ● Examplesのリストだけでは仕様の細部を表現できないことが多い
 ○ 結果として後でバグや障害の原因になりがち
 ● 必要十分な表現力があり、人間に読みやすい
 ○ 少し学習すれば読むのは難しくない
 ● 機械的に処理することができる
 ○ 多少書式を成型すればyaccに食わせてパーサーを作ることもできる
 ○ ※パーサーが作れる=ある入力がきちんとその文法に沿っているかをチェックできる
 9


Slide 10

Slide 10 text

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


Slide 11

Slide 11 text

試しに見てみる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


Slide 12

Slide 12 text

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


Slide 13

Slide 13 text

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


Slide 14

Slide 14 text

14


Slide 15

Slide 15 text

15


Slide 16

Slide 16 text

16


Slide 17

Slide 17 text

17


Slide 18

Slide 18 text

18


Slide 19

Slide 19 text

19


Slide 20

Slide 20 text

ABNF展開の基本
 20


Slide 21

Slide 21 text

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


Slide 22

Slide 22 text

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


Slide 23

Slide 23 text

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


Slide 24

Slide 24 text

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


Slide 25

Slide 25 text

ABNFの定義(2)
 25


Slide 26

Slide 26 text

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


Slide 27

Slide 27 text

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


Slide 28

Slide 28 text

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