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
ファイルを新規作成したときしかうまく動いてないぽいのでちょっと様子見。
Railsプロジェクトでやったが、Javaでも使えると思う。
手順
.envrc
ファイルを作成する。この時点で テスト用 の設定ファイルを書いておく。例えばexport foo=test
と書く。- ターミナルを開いて
idea
コマンドで起動する。この時点でIDE には環境変数foo=test
が読み込まれている。 - テストでは複数のRun Configurationを使いたいが都度書き換えるのがめんどくさいので、IDEからテストを起動するときはIDEに上述の設定をそのまま使う。
- IDEからrailsを起動するときはRun Configurationの Environment Valuesで
foo=test
を上書きして起動させる
新規に設定するときはIDEを起動し直さないといけない&Toolboxから起動できないのがネック。
リモートワークの達人 を読んだ
社内でそーだいさんが薦めていたので読んでみようと思い秒速でポチった。
コロナ禍で本格的にリモートワークをやるようになって約1年。自分がやっていること、できていないことを振り返れる機会になった。
元来自分は働きすぎの気配があるので強引に定時近くになったら強制的に切りのいいところで止めるようにしている。以前はズルズルと仕事をしていたのだけど、どんなに遅くとも19時には終わってご飯食べてニュース見てゆっくりするようにしている。通勤時間がないのでこのニュース見る時間で仕事とプライベートのON/OFFをしている。
あとは、出社している時とリモートワークでも同じ服装をしている。もともとスーツではないので私服でいいのだが、社員証のネックストラップが首にすれるのが嫌なので襟付きのシャツを来ているのを継続している。それをクリーニングに毎週出している。服もパリッとしているので気持ちがいい。
また、自宅に仕事の快適さを導入した。椅子買ったり、ディスプレイ買ったり。
無駄な承認や手続きを根絶しようという項目があって、そういえばなんでこれ承認手続きがいるんだっけ?というのを思い出した。例えば本番サーバにSession Managerで繋ぐときになんで承認手続きがいるんだっけ?というのを思い出した。当時は良かったのかもしれないけど、環境が変わったりしているので、徐々に変えていければなーとは思っている。定期的に棚卸しができる会を作ってみても面白そう。
また、モチベーションが上がらない時は仕事に問題があるというのはそういう考え方があるのか。と感じた。自分は結構自分の中に課題があると感じるタイプなんだけど、自分と仕事の接点を考えた方が良さそうだなーと。確かにマネジャーとして他人のモチベが上がらないときに改善するときはコントロールしやすい仕事側のことが多い気がするので、それを自分に当てはめれば良いということがすっぽり抜けていた。いつから自分のことをコントロールしやすいなんていつから思っていたんだろう。この辺はちゃんと客観的に物事を見切れていないんだろうなーと思う。
2020買ったものまとめ
今年を振り返りつつ買ったものをまとめる。やはりコロナの影響で家で仕事をするようになってからだいぶそこにお金をつぎ込んだ。
衣
仕事では首に社員証が擦れるのが嫌だったのでいつも襟付きのシャツを来ていたがそれを継続。仕事と普段着の違いが出るようにして気持ちを入れ替えていたというのと、洗濯するのが面倒なので襟付きのシャツだとクリーニングに出してもあまり値段がかからないというところを重視。
食
ビール
今年はオンライン飲みがあったりしたのも含めて、@tdakak さんに色々ビールをおすすめしてもらった。多分一番飲んだのはヒューガルデンホワイトと伊勢角屋麦酒のヒメホワイトじゃないかなと思う。ヒューガルデンは近所のスーパーで売ってるのですぐ手に入るところがポイント高い。
ヒメホワイト | クラフトビール・地ビールの通販 伊勢角屋麦酒
TANGERINEのみかん
もともとみかんが好きなので近所のスーパーで買って食べてたのだけどBSニュースで知って購入。ダンボールの中に40〜50個ぐらい入っているので一人でも食べれるレベルなのがいい。
nosh
もともとBase Breadを食べていたのだけど味が単調になっているなと感じたのと、温かいものを食べたかったのでこちらに切り替えた。味は個人で合う、合わないがあるのでヘルシーなものを探している人はいいかも
住
机の広さだけちょっと不満だけど、会社の自席よりも良い環境と整えられたと思っている。
机
部屋が1Kなのであまり大きなものが置けないため、幅100cmぐらいの机を購入。ちょっと手狭だけどこれ以上大きくなると今度は入らなくなるのでこの辺は妥協。
椅子
もともと、普通の椅子にアーユルチェアーをつけて座っていたのだけど、「座らせない」をコンセプトにしている椅子だったので、仕事上ずっと座っているため相性が悪くなってきたので一念発起してオカムラのバロンチェアを購入。バロンチェアが一番納期が短かったのが最終的な決め手だったが、家に入るか少しヒヤヒヤしていた。会社ではコンテッサを使っていたときもあったけどまぁ大して座り心地はかわらない。
ディスプレイ&Webカメラ
会社みたいにミーティングルームと自分の机を往復することがなくなり、ずっとディスプレイ前にいるからと思ってちょっといいものを購入。27inchで最初は机のサイズに比べて大きいと感じたものの今では慣れてしまった。個人所有のMacと会社のMacを交互につなげ直しながら使っている。ちなみにキーボードはRealForce for MacをディスプレイのUSBに挿して使っている。
スペースの都合上、クラムシェルモードでPCを使っているのでWebカメラも買った。マイク機能は使ってないけどミーティングに十分耐えられるクオリティを出してくれている。
EIZO FlexScan 27.0インチ ディスプレイモニター (4K UHD/IPSパネル/ノングレア/ブラック/USB Type-C搭載/5年間保証&無輝点保証) EV2785-BK
- 発売日: 2018/01/30
- メディア: Personal Computers
ロジクール ウェブカメラ C920n ブラック フルHD 1080P ウェブカム ストリーミング 自動フォーカス ステレオマイク 国内正規品 2年間メーカー保証 ブラック
- 発売日: 2019/04/25
- メディア: Personal Computers
イヤホンはAirPods Proのまま
一応SonyのWF-1000XM3とBoseのBose QuietComfort® Earbudsは買ったのだけど、WF-1000XM3は新宿駅近辺でブツブツ切れるのと、iPhone、Macとの相性がやっぱりよいので、AirPods Proを継続して使っている。もともと使っていたBoseのQC20をそのまま使っても良かったのだけど机の上がゴチャゴチャするので断念。
以上、買ったものでした。来年も経済回していくぞ!!
Agile Tech EXPO に参加した
色々なことが変わっていく中で、高速に試してカイゼンしていくことが必要となっている時代で、開発だけのアジャイルではなく、ビジネスとしてのアジャイルが必要になってきてる時代に何ができるだろうか?ということを考えた。
「ソフトウェア開発は文化」という川口さん。文化に根づかせるということはどうしたらいいんだろう?自分の会社でソフトウェア開発は根付いているのか?と感じた。そもそもソフトウェア開発ってなんだろうか?
また、「場」の大切さも改めて感じた。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の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 されているのがわかる