Committee + Open APIでYAMLファイルを分割する 2021年夏版

やりたいこと

OpenAPIでAPIを定義したいが、ファイルを分割して管理したい

バージョン

  • Committee 4.0.0(committee-rail 0.5.1)
  • Open API 3.0.3

最初にやったこと&課題

Open APIの仕様に則ってAPIを(ここではopenapi.yamlとした)を定義した

openapi: 3.0.3
info:
  title: Title
  description: Title
  version: 1.0.1
servers:
  - url: 'http://localhost'
paths:
  /api/token:
    get:
      description: get access token
      responses:
        200:
          description: success
          content:
            application/json:
              schema:
                type: object
                required:
                  - token
                example: { token: 'access token' }
                properties:
                  token:
                    type: string

RailsのRequestSpecはこんな感じ

require 'rails_helper'

RSpec.describe 'Api::Token', type: :request do
  include Committee::Rails::Test::Methods

  it 'GET /token' do
    get api_token_path

    expect(response).to have_http_status 200
    assert_response_schema_confirm 200
  end
end

かんたんな文字列を返すAPIを定義した。ただこれだとみんなで触るときにコンフリクトとかが頻発するのでわけたい。

ファイルを分割する

$ref というのがOpenAPIに定義されているので、それが使えそう。$ref の使い方のドキュメントを読むとpaths直下には入れられないので、get以降を切り出す。

openapi.yaml

openapi: 3.0.3
info:
  title: Title
  description: Title
  version: 1.0.1
servers:
  - url: 'http://localhost'
paths:
  /api/token:
    $ref: 'token.yaml'

token.yaml

get:
  description: get access token
  responses:
    200:
      description: success
      content:
        application/json:
          schema:
            type: object
            required:
              - token
            example: { token: 'access token' }
            properties:
              token:
                type: string

これでテストを実行すると以下のようなエラーが出て怒られる。redoc からHTMLを生成するときちんと生成されるのが余計にわからん...

NoMethodError: undefined method `set_path_item_to_operation' for #

  0) Api::Token GET /token
     Failure/Error: assert_response_schema_confirm 200

     NoMethodError:
       undefined method `set_path_item_to_operation' for #

エラーを読んでみる

set_path_item_to_operation for # なので、path itemが足りない?となってドキュメント読んだりしてた。

結論

pathsとURLを分割先のファイルに記載して書けばよかった。ドキュメントや探してみてもCommitteeのIssuesを見ても特にチケット上がってなかったのでよくわからんが動いた

openapi.yaml

openapi: 3.0.3
info:
  title: Title
  description: Title
  version: 1.0.1
servers:
  - url: 'http://localhost'
paths:
  /api/token:
    # ~1は`/` のエスケープ
    $ref: './token.yaml#/paths/~1api~1token'

token.yaml

paths:
  /api/token:
    get:
      description: get access token
      responses:
        200:
          description: success
          content:
            application/json:
              schema:
                type: object
                required:
                  - token
                example: { token: 'access token' }
                properties:
                  token:
                    type: string

Intellij IDEAで効率よくdirenvを使う

環境変数.envrc ファイルに書いて読み込ませるdirenvがあるがこれをサポートするIntellij IDEA系のプラグインがほとんどないのでうまいやり方を考える。Direnv Integration はあるが.envrcファイルを新規作成したときしかうまく動いてないぽいのでちょっと様子見。

github.com

Railsプロジェクトでやったが、Javaでも使えると思う。

手順

  1. .envrc ファイルを作成する。この時点で テスト用 の設定ファイルを書いておく。例えば export foo=test と書く。
  2. ターミナルを開いて idea コマンドで起動する。この時点でIDE には環境変数 foo=test が読み込まれている。
  3. テストでは複数のRun Configurationを使いたいが都度書き換えるのがめんどくさいので、IDEからテストを起動するときはIDEに上述の設定をそのまま使う。
  4. IDEからrailsを起動するときはRun Configurationの Environment Valuesで foo=test を上書きして起動させる

新規に設定するときはIDEを起動し直さないといけない&Toolboxから起動できないのがネック。

リモートワークの達人 を読んだ

社内でそーだいさんが薦めていたので読んでみようと思い秒速でポチった。

コロナ禍で本格的にリモートワークをやるようになって約1年。自分がやっていること、できていないことを振り返れる機会になった。

 

元来自分は働きすぎの気配があるので強引に定時近くになったら強制的に切りのいいところで止めるようにしている。以前はズルズルと仕事をしていたのだけど、どんなに遅くとも19時には終わってご飯食べてニュース見てゆっくりするようにしている。通勤時間がないのでこのニュース見る時間で仕事とプライベートのON/OFFをしている。

あとは、出社している時とリモートワークでも同じ服装をしている。もともとスーツではないので私服でいいのだが、社員証のネックストラップが首にすれるのが嫌なので襟付きのシャツを来ているのを継続している。それをクリーニングに毎週出している。服もパリッとしているので気持ちがいい。

また、自宅に仕事の快適さを導入した。椅子買ったり、ディスプレイ買ったり。

 

無駄な承認や手続きを根絶しようという項目があって、そういえばなんでこれ承認手続きがいるんだっけ?というのを思い出した。例えば本番サーバにSession Managerで繋ぐときになんで承認手続きがいるんだっけ?というのを思い出した。当時は良かったのかもしれないけど、環境が変わったりしているので、徐々に変えていければなーとは思っている。定期的に棚卸しができる会を作ってみても面白そう。

 

また、モチベーションが上がらない時は仕事に問題があるというのはそういう考え方があるのか。と感じた。自分は結構自分の中に課題があると感じるタイプなんだけど、自分と仕事の接点を考えた方が良さそうだなーと。確かにマネジャーとして他人のモチベが上がらないときに改善するときはコントロールしやすい仕事側のことが多い気がするので、それを自分に当てはめれば良いということがすっぽり抜けていた。いつから自分のことをコントロールしやすいなんていつから思っていたんだろう。この辺はちゃんと客観的に物事を見切れていないんだろうなーと思う。

 

 

 

 

2020買ったものまとめ

今年を振り返りつつ買ったものをまとめる。やはりコロナの影響で家で仕事をするようになってからだいぶそこにお金をつぎ込んだ。

仕事では首に社員証が擦れるのが嫌だったのでいつも襟付きのシャツを来ていたがそれを継続。仕事と普段着の違いが出るようにして気持ちを入れ替えていたというのと、洗濯するのが面倒なので襟付きのシャツだとクリーニングに出してもあまり値段がかからないというところを重視。

ビール

今年はオンライン飲みがあったりしたのも含めて、@tdakak さんに色々ビールをおすすめしてもらった。多分一番飲んだのはヒューガルデンホワイトと伊勢角屋麦酒のヒメホワイトじゃないかなと思う。ヒューガルデンは近所のスーパーで売ってるのですぐ手に入るところがポイント高い。

ヒメホワイト | クラフトビール・地ビールの通販 伊勢角屋麦酒

TANGERINEのみかん

もともとみかんが好きなので近所のスーパーで買って食べてたのだけどBSニュースで知って購入。ダンボールの中に40〜50個ぐらい入っているので一人でも食べれるレベルなのがいい。

tangerines.stores.jp

nosh

もともとBase Breadを食べていたのだけど味が単調になっているなと感じたのと、温かいものを食べたかったのでこちらに切り替えた。味は個人で合う、合わないがあるのでヘルシーなものを探している人はいいかも

nosh.jp

机の広さだけちょっと不満だけど、会社の自席よりも良い環境と整えられたと思っている。

部屋が1Kなのであまり大きなものが置けないため、幅100cmぐらいの机を購入。ちょっと手狭だけどこれ以上大きくなると今度は入らなくなるのでこの辺は妥協。

www.low-ya.com

椅子

もともと、普通の椅子にアーユルチェアーをつけて座っていたのだけど、「座らせない」をコンセプトにしている椅子だったので、仕事上ずっと座っているため相性が悪くなってきたので一念発起してオカムラのバロンチェアを購入。バロンチェアが一番納期が短かったのが最終的な決め手だったが、家に入るか少しヒヤヒヤしていた。会社ではコンテッサを使っていたときもあったけどまぁ大して座り心地はかわらない。

item.rakuten.co.jp

ディスプレイ&Webカメラ

会社みたいにミーティングルームと自分の机を往復することがなくなり、ずっとディスプレイ前にいるからと思ってちょっといいものを購入。27inchで最初は机のサイズに比べて大きいと感じたものの今では慣れてしまった。個人所有のMacと会社のMacを交互につなげ直しながら使っている。ちなみにキーボードはRealForce for MacをディスプレイのUSBに挿して使っている。

スペースの都合上、クラムシェルモードでPCを使っているのでWebカメラも買った。マイク機能は使ってないけどミーティングに十分耐えられるクオリティを出してくれている。

イヤホンはAirPods Proのまま

一応SonyのWF-1000XM3とBoseBose QuietComfort® Earbudsは買ったのだけど、WF-1000XM3は新宿駅近辺でブツブツ切れるのと、iPhoneMacとの相性がやっぱりよいので、AirPods Proを継続して使っている。もともと使っていたBoseのQC20をそのまま使っても良かったのだけど机の上がゴチャゴチャするので断念。

www.sony.jp

www.bose.co.jp

以上、買ったものでした。来年も経済回していくぞ!!

Agile Tech EXPO に参加した

agiletechexpo.connpass.com

色々なことが変わっていく中で、高速に試してカイゼンしていくことが必要となっている時代で、開発だけのアジャイルではなく、ビジネスとしてのアジャイルが必要になってきてる時代に何ができるだろうか?ということを考えた。

「ソフトウェア開発は文化」という川口さん。文化に根づかせるということはどうしたらいいんだろう?自分の会社でソフトウェア開発は根付いているのか?と感じた。そもそもソフトウェア開発ってなんだろうか?

また、「場」の大切さも改めて感じた。1対1のコミュニケーションではなく、一人ひとりの行動が場の影響を受ける。よって、どのような場を作るかが非常に大切である。また、一人ひとりの行動が場を変えていけるんだなと思った。

MySQL Clientのちょっと便利な設定

MySQL Clientでサーバにつないでからのちょっと便利な設定。使いそうなものをピックアップ

use \u

Databaseのスイッチ

pager less -S

less -S と同じようなpager設定になる。-S 1行が長いときに折り返さない設定になる。

tee hoge.log(\t)

hoge.log という名前でログファイルを取る。間違って tee 'hoge.log' とするとファイル名にシングルコーテーションが入るので注意する

ego (\G)

これは query \G として使うことが多い。結果を縦に表示してくれる。

source hoge.sql (.)

hoge.sql を実行する。

status (\s)

現在の設定を表示する

system (!)

\! ls と書くとlsコマンドを実行する

delimiter (\d)

文の区切り文字を変更する。デフォルトは ; 。誰かがきっと使うんだろう

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.5.1.2 mysql コマンド

MySQLのinsert on duplicate key update と replace構文の違い

忘れてたので思い出しながらメモ

TL;DR

  • upsert構文として、insert on duplicate key update と replace構文の2つがある
  • 似たような挙動だけど違う
  • insert on duplicate key update はupdate
  • replace構文はdelete insert になる。

実際にやってみた

こういうテーブルを作ってみる

CREATE TABLE `replace_sample` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `email` varchar(255) NOT NULL,
  `name` varchar(100) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
insert into replace_sample(email,name)values('taro@example.com','taro'), ('jiro@example.com','jiro');
mysql> select * from replace_sample;
+----+------------------+------+
| id | email            | name |
+----+------------------+------+
|  1 | taro@example.com | taro |
|  2 | jiro@example.com | jiro |
+----+------------------+------+

insert on duplicate key update を投げる

mysql> insert into replace_sample(email, name) values('taro@example.com', 'saburo') on duplicate key update name='saburo';
Query OK, 2 rows affected (0.00 sec)

mysql> select * from replace_sample;
+----+------------------+--------+
| id | email            | name   |
+----+------------------+--------+
|  1 | taro@example.com | saburo |
|  2 | jiro@example.com | jiro   |
+----+------------------+--------+
2 rows in set (0.01 sec)

replace構文を投げる

mysql> replace into replace_sample(email,name) values('taro@example.com', 'ichiro');
Query OK, 2 rows affected (0.00 sec)

mysql> select * from replace_sample;
+----+------------------+--------+
| id | email            | name   |
+----+------------------+--------+
|  2 | jiro@example.com | jiro   |
|  3 | taro@example.com | ichiro |
+----+------------------+--------+
2 rows in set (0.01 sec)

delete - insert されているのがわかる

リンク