tips

GitHub Actionsで手動と自動のどちらでも実行できるデプロイワークフローを作る

やりたいこと GitHub Actionsで次の要件を実現できるデプロイのワークフローを作りたい。 次のトリガーでデプロイできる リポジトリへのAPI呼び出し 手動 プルリクエストのマージ デプロイするブランチと環境(主にstagingもしくはproduction)を選択できる …

GitHub ActionsのDockerコンテナアクションでproblem matchersを使う

Dockerコンテナアクション GitHub Actions (GHA)のDockerコンテナアクションは アクションを呼び出したときに実行したいスクリプト(entrypoint.sh) その実行環境としてのDockerfile を用意してGHAのアクションとしてまとめたもの。かんたんに他のリポジトリ…

macOSの日本語入力プログラムでトグルではない方法でひらがなと英字を切り替える

前提 あえてmacOSの日本語入力プログラム(macOSデフォルトの日本語IME)だけで生活しようとしている場合の記事 ふつうはKarabiner Elementsを使えばよいはず これまで 以前Ctrlでひらがなと英字モードをトグルするようにした。 Macのセットアップでやること…

Gemfile.lockをもとに特定のバージョンのRubyで利用できないgemの一覧を出す

Railsアプリなど、Bundlerでgemの依存管理をしているプロジェクトでRubyのアップデートをしようとするとき、不幸なことにgemが全体的に古いことがある。 また、gemspecでrequired_ruby_versionというメタデータでRubyのバージョンの範囲を設定していると、そ…

TerraformでRoute 53のゾーンに付属するNS/SOAレコードをインポートする

TerraformでRoute 53の設定をインポートするときに、aws_route53_recordのドキュメントを読んでいた。このドキュメントにはRoute 53のゾーンを作るときに自動で作られるNSレコードとSOAレコードの管理方法について記述がある。しかし、コード例にはNSレコー…

GitHub Actionsで"Files changed"のファイルを取得する

GitHub ActionsでPRの"Files changed"タブと同じファイルの内容を取得する方法*1。 - uses: actions/checkout@v3 with: # マージベースの探索でコミットをさかのぼるために全コミットを取得しておく fetch-depth: 0 - run: | # ... でPRのFiles changedと同…

pt-online-schema-changeで外部キーを削除する

サービスを停止せずにデータベースリファクタリングする - Pepabo Tech Portal の作業をやっていたときに知ったことについて書いておく。 結論 pt-online-schema-change (pt-osc)で外部キーを削除するときは そのキー名の先頭に_を付与して--alterに渡す す…

不安定なテストが存在することをSlackに通知するGitHub Actionsワークフロー

あるGitHubリポジトリのmaster(や最近はmain)ブランチで確率的に落ちるテストは間違いなく不安定なテスト*1であるという考えのもと、不安定なテストを見つけたときに自動でSlackに通知するGitHub Actionsワークフローの書きかたについて説明する*2。 なお…

Railsエンジンのappディレクトリ配下のクラスを親アプリでオーバーライドする

やりたいこと Railsエンジンのappディレクトリ配下に存在するクラス(モデルやコントローラ)のメソッドをオーバーライドしたい。 結論 RailsガイドのRailsエンジンについての記事に全部書いてある。Railsエンジンのapp配下のオーバーライドは、to_prepareを…

意図せず関連先のカラムでwhereしつつeager loadしたらクエリのパフォーマンスが極端に悪化した事例

問題 15個ぐらいのさまざまなクエリパラメータを検索条件として受け付けることができる一覧取得API(「Item取得API」とする)があった。 そのAPIで取得するItemは複数の関連を持っていた。また、関連先の取得時にN+1問題の対策が不十分だったので、取得する…

macOSのDay Oneにプレーンテキストをインポートする

macOS Catalina 10.15.4 Day One 4.11.1 とします。 Day Oneのインポート機能 Day Oneはさまざまな形式のデータをエントリとしてインポートできる。 Importing data to Day One | Day One Help 日付形式の問題 上述したサポートページには、プレーンテキスト…

値の妥当性をチェックする日時表現パーサを作る

『Haskell入門』に日時表現("YYYY/MM/DD hh:mm:ss")のパーサをAttoparsecで作る節*1があり、 このままでは9999/99/99 99:99:99のような入力ができてしまいますが、月の入力範囲を1~12に制限するといった制約をかけることも、これまで説明した範囲で簡単に実…

リソースとActive Recordのモデルのあいだの差異を吸収するクラスを作る

Web APIのリソースとバックエンドで扱うモデル(特にActive Recordのモデル)に歴史的な事情で差異があり、単純にモデルからリソースへと変換できないとき、それらの差異を吸収するクラスを作って対応することがあったのでメモを残しておきます。 問題 あるW…

関数をFunctor/Applicative/Monadにする

『プログラミングHaskell 第2版』の12章「モナドなど」の演習*1で型 (a ->) をFunctor(関手)、Applicative、Monadにするという問題があり、少しわかりにくかったので、いまの自分自身の理解をまとめました。 型(a ->)とは 部分適用された関数の型を(a ->)…

graphql-guardとポリシーオブジェクトをgraphql-ruby 1.8で使うための方法

これの続きです。 blog.kymmt.com 問題 graphql-guardはインラインでポリシーを書く方法の他に、ポリシーオブジェクトを定義して GraphQL::Guard.new に渡すという方法があります。使いかたはREADMEに書いてあるとおりです。 class GraphqlPolicy RULES = { …

graphql-guardをgraphql-ruby 1.8で使うためのある方法

問題 graphql-ruby 1.8ではclass-based APIが導入されました。フィールド定義は型を表すクラスのコンテキストでクラスメソッド field を呼ぶ形で定義します。 class Types::Query < Types::BaseObject field :viewer, Types::User, null: true def viewer co…

アソシエーションのscopeを使いつつLIMITっぽいことをやる

細かすぎて伝わらないかもしれませんが、ハマったので共有します。 問題 ユーザーが免許を持つ次のようなモデルを考えます。has_one :licenseは免許更新を重ねてきたなかで最新の免許を取得したくて書いたと思ってください。 class User < ApplicationRecord…

GraphQL Subscriptionsをgraphql-rubyとAction Cableで作る

graphql-rubyでは、RailsのAction Cableに乗ることでGraphQL Subscriptionsを実装できます。 GraphQL Subscriptionsとは GraphQL Subscriptionsは、あらかじめ特定のGraphQLクエリを購読しておき、サーバ側でイベントが起きるたびにその形式のデータを受信で…

wscatでAction Cableと通信する

Railsで/cableなどのエンドポイントにAction CableをマウントするとWebSocketサーバとして利用できます。wscatを使ってAction CableによるWebSocket APIと対話的に通信するために、送信するデータの形式などを調べました。 準備 wscat github.com npmでイン…

dry-containerとdry-auto_injectでDIコンテナを作る

dry-rbファミリーのdry-containerとdry-auto_injectを使うと、POROの組み合わせでDIが実現できます。 DIについてハイパーざっくり理解を得るには次の記事を読めばよいです。 qiita.com 上の記事の中のDIコンテナを適用したコードをdry-containerとdry-auto_i…

GraphQL APIをスキーマファースト開発するためのモックサーバをRailsとApolloで作る

GMOペパボ Advent Calendar 2017の23日目の記事です。 今回はJavaScriptでGraphQLのサーバ/クライアントや関連ツールを提供しているApolloのツールセットでRailsプロジェクトでGraphQLのモックサーバを立ち上げるところまでを試してみます。 業務でRails製…

RSpecのrequest specでCommitteeを使ってレスポンスJSONを自動的にバリデーションする

この記事の続きのようなものです。 blog.kymmt.com やりたいこと Rails + RSpecでWeb APIのrequest specを書くときに、Committee(とCommittee::Rails)の assert_schema_conform を使って、レスポンスのJSONがOpenAPIドキュメントで定義したレスポンスのJSO…

Web APIのレスポンスJSONをCommittee + OpenAPIでバリデーションして仕様と実装の乖離を防ぐ

APIドキュメントに書いたJSON Schemaと実際に実装したWeb APIのレスポンスJSONが一致するかバリデーションするためのCommitteeというgemがあります。また、このCommitteeをRailsプロジェクト中のテストから使うためのCommittee::Railsというgemがあります。 …

graphql-ruby + Railsで簡易なクエリとミューテーションが使えるGraphQL APIを実装する

会社でGraphQLのハンズオンがあったのをきっかけに、最近はGraphQLのサーバ側実装をちょっと触っています。 graphql-rubyを使うと、RubyでGraphQL APIを実装することができます。今回はRailsでGraphQLのクエリとミューテーションを実装してみました。 graphq…

Springが動くRails+MySQLなAPIサーバの開発環境をDocker Composeで作る

このあいだ、Rails+MySQLという構成のアプリケーション開発環境をDocker Composeで構築できるようにしました。 blog.kymmt.com いろいろと理解が深まるにつれて、何点かクリアしたい問題が見えてきました。 Dockerfile で使うイメージ ruby:2.4.1-onbuild は…

Rails+MySQLなAPIサーバの開発環境をDocker Composeで作る

先日、"Quickstart: Compose and Rails"の手順にしたがいながら、Docker ComposeでRails+MySQLがとりあえず動くような環境を作りました。 blog.kymmt.com 今回は、RailsのAPIサーバの開発環境をもうちょっといい感じにDocker Composeで作ってみます。DBにはM…

"Quickstart: Compose and Rails"を読みながらDocker ComposeでRails+MySQLの環境を作る

次の記事などでDockerを使ってRailsの開発環境を構築しているのを見て、自分でもやっておこうと思ったので、やってみました。 dev.classmethod.jp 公式ドキュメントの"Quickstart: Compose and Rails"を読みながらやります。 docs.docker.com 前提 まったく…

Ruby のテストカバレッジを Travis CI から Code Climate へ POST する方法が変わっていた

Travis CI 上で Rubygems のテストを実行して、テストカバレッジの集計結果を Code Climate へ POST するときにエラーが発生していたので、解決方法をメモしておきます。 エラー /home/travis/.rvm/rubies/ruby-2.0.0-p598/bin/ruby -I"lib:test" -I"/home/t…

Ruby で順列の列挙を実装する

最近いろいろな人が次の本をやっているのを見かけるので、気になって読み進めてみています。 プログラマ脳を鍛える数学パズル シンプルで高速なコードが書けるようになる70問作者: 増井敏克出版社/メーカー: 翔泳社発売日: 2015/10/14メディア: 単行本(ソフ…

Code Climate + Travis CI で gem のテストカバレッジを自動測定する

Code Climate は Git リポジトリからソースコードを読み込んで、品質診断をやってくれる SaaS です。例えば、静的解析として 循環的複雑度(ソースコードの複雑さを表す尺度) ソースコード中の処理/構造の重複数(コードクローン) などをソースコードごと…