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

RubyKaigiを振り返ってみた / After RubyKaigi

Sansan
May 15, 2019

RubyKaigiを振り返ってみた / After RubyKaigi

■イベント
AFTER RubyKaigi
https://raksul.connpass.com/event/125165/

■登壇概要
タイトル:RubyKaigiの振り返り

登壇者:DSOC Development Group 石畑 翔平

▼Sansan Builders Box
https://buildersbox.corp-sansan.com/

Sansan

May 15, 2019
Tweet

More Decks by Sansan

Other Decks in Technology

Transcript

  1. 4

  2. Ruby Curses 15 • 4/19 14:20 - の Shugo Maeda

    さんの発表 Terminal curses で 紹介されたライブラリ • C の curses ライブラリの Ruby binding ◦ 呪いって意味らしい ◦ Terminal の操作が可能 → これで自由に文字色を変えられるエディタを作ってみよう! (最終的に Qiita で色がつく形式で保存出来るといいな)
  3. Hello Curses 16 Curses.init_screen # 画面の初期化 Curses.setpos(4, 10) # カーソルを

    x = 10, y = 4 の座標に移動 Curses.addstr('Hello, Curses') # 引数の文字列を表示 Curses.addch('.') # 一文字を表示 Curses.getch # stdin から一文字の入力を受け付ける Curses.setpos(5, 10) Curses.getstr # stdin から文字列の入力を受け付ける Curses.setpos(6, 10) Curses.addstr('bye') Curses.refresh # 画面の更新 Curses.close_screen # 画面を閉じる
  4. 画面制御 18 Curses.noecho # 入力を画面に表示しない Curses.echo # 入力を画面に表示する Curses.stdscr.maxx #

    最大 x 座標 Curses.stdscr.maxy # 最大 y 座標 Curses.cols # 画面の列数 Curses.lines # 画面の行数
  5. 特殊文字の入力操作 19 # arrow key などの function key を押した際に一文字の値を返すようにする Curses.stdscr.keypad

    = true case Curses.getch # key の入力値に対応する値を定数で全て定義している when Curses::Key::DOWN Curses.addstr('cursor_down') when Curses::Key::UP Curses.addstr('cursor_up') end
  6. 文字色を変更する 20 # 色の使用を開始 Curses.start_color # color の定義、id, 文字色, 背景色

    Curses.init_pair(1, Curses::COLOR_BLUE, Curses::COLOR_WHITE) # 色を設定、定義した color pair を id で指定して渡す # attrset 自体は色の設定以外にも bold など字体の設定が出来る Curses.attrset(Curses.color_pair(1))
  7. Curses 感想 23 • カーソルの操作がエスケープシーケンスに比べて簡単でいい感じ • 他にも Window や Form

    の定義など便利そうな IF がいっぱいあって楽しそう • pry などで見れないので debug に苦労した
  8. Committee 27 • 4/18 13:30 - ota さんの発表 How to

    use OpenAPI3 for API developer で紹介されたライブラリ • OpenAPI で API リクエスト・レスポンスの検証が可能 • ちょうど API Blueprint から OpenAPI 3.0 に移行したいと考えていた ◦ 基本的な Web API の仕様は Blueprint で書いて、JSON Schema で validation ◦ API Gateway の仕様書は OpenAPI 3.0 で書いている ◦ Swagger UI が見やすく、Swagger Editor など周辺ツールも豊富 → 全て OpenAPI 3.0 に移行しようというチームの流れに → しかし、ver 3.0 に対応した validator が見つからず、断念していた → Committee が解決してくれる!!(お世話になります :dogeza: )
  9. Gem install 31 gem 'committee' group :test do # レスポンスのテストを

    Rails (というか RSpec?) で使いやすいように拡張してくれている gem 'committee-rails' end
  10. Response Validation 32 describe 'GET /api/path/to' do include Committee::Rails::Test::Methods def

    committee_options @committee_options ||= { schema_path: Rails.root.join('path', 'to', 'schema.yml').to_s, prefix: '/api' # 必要なら設定する } end specify 'validate response' do get '/api/path/to', headers: {CONTENT_TYPE: 'application/json', ACCEPT: 'application/json'} assert_schema_conform end end
  11. 37 describe 'GET /api/path/to' do include Committee::Rails::Test::Methods def committee_options @committee_options

    ||= { schema_path: Rails.root.join('path', 'to', 'schema.yml').to_s, prefix: '/api' # 必要なら設定する } end specify 'validate response' do get '/api/path/to', headers: {CONTENT_TYPE: 'application/json', ACCEPT: 'application/json'} assert_schema_conform end end 実際はこの部分が version 3.0.1 だと意図通りに 動作しない
  12. OpenAPI の parse 38 module Committee module Drivers ... def

    self.load_from_data(hash) if hash['openapi'] == '3.0.0' parser = OpenAPIParser.parse(hash) return Committee::Drivers::OpenAPI3.new.parse(parser) end ... 内側で load_from_data が呼ばれている OpenAPI3 の Driver を呼びたいが ver 3.0.0 のときしか呼ばれない
  13. Response Validation の変更 39 describe 'GET /api/path/to' do include Committee::Rails::Test::Methods

    def committee_options @committee_options ||= begin h = YAML.load_file(Rails.root.join('path', 'to', 'schema.yml').to_s) parser = OpenAPIParser.parse(h) schema = Committee::Drivers::OpenAPI3.new.parse(parser) {schema: schema, prefix: '/api'} end end Driver を自分で指定して、schema を option に 渡す
  14. 元々の OpenAPI の定義 41 get: ... responses: '200': $ref: '#/components/responses/...'

    '400': $ref: '#/components/responses/BadRequest' '404': ... 元々 responses を components に定義していた これが Response の検証時には展開されない
  15. OpenAPI を再定義 42 get: ... responses: '200': description: OK content:

    application/json: schema: $ref: '#/components/schemas/...' '400': description: 不正なリクエスト content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' '404': ... 展開した形で定義すると正しく読み込む • OpenAPI の書き方が悪いのか・ Committee が対応していないのか・ Committee の使い方が間違っているのか、 まではわからなかった • parse で Components Object を Components class にまとめるのだが、 そこには含まれいたので parse 時は展開できてい るよう
  16. Request Validation 43 Rails.application.configure do ... h = YAML.load_file(Rails.root.join('path', 'to',

    'schema.yml').to_s) parser = OpenAPIParser.parse(h) schema = Committee::Drivers::OpenAPI3.new.parse(parser) config.middleware.use Committee::Middleware::RequestValidation, {schema: schema, prefix: '/api'} end
  17. Committee 感想 44 • Blueprint のときは手動で JSON Schema に変換していたので、とても楽 •

    わざわざ個別に Controller ごとに Schema を読み込ませる必要もない • 悩み ◦ 各 API ごとに YAML を定義しているのだが、 Committee だと一つのファイルで定義している前提になっている(?) ◦ そのような構成にした方がいいのだろうか • ただこれで OpenAPI 3.0 に全面移行できるな