Axumのハンドラで任意で渡されるクエリパラメータを受け取る

たとえばAxumのハンドラでクエリパラメータ page を受け付けるときに、 page=1が付与されていれば値として1を使う page=aのように値が無効ならデフォルト値を使う pageが付与されていないならデフォルト値を使う page=のように値が空ならデフォルト値を使う …

SQLxでテスト実行時にDBのデータを管理する

RDBをデータストアとして使うWebアプリケーション(のバックエンド)の開発で、テストを通じてDBに作成したレコードを自動で削除できると、開発環境のDBが汚れず、また他のテストによって変更されたDBの状態に影響されないので便利。Rustではこれをどうやる…

『セキュア・バイ・デザイン 安全なソフトウェア設計』を読んだ

セキュア・バイ・デザイン: 安全なソフトウェア設計 Compass Booksシリーズ作者:Dan Bergh Johnsson,Daniel Deogun,Daniel Sawanoマイナビ出版Amazon ドメイン駆動設計(DDD)の方法論をベースに、ドメインに対する深い理解を獲得し、その理解を設計に反映させ…

Webサービスのソフトウェアエンジニアとしての転職活動で役立ったこと

Webサービス界隈のソフトウェアエンジニアになって初めて転職活動をした1ので、やったことのうち役に立ったことを書いておく。 前提 経歴: https://www.linkedin.com/in/kymmt/ Webサービスを開発、運用するふつうのソフトウェアエンジニア 転職活動時期は20…

運用しやすい社内用ライブラリを開発するときに考えること

以前から社内用ライブラリをホストするためにGitHub Packagesを運用できる体制を作ったりしていた。 tech.pepabo.com ところで、そもそもアプリケーションとライブラリでは開発やメンテナンスにおいて気にする点が少し異なる。そのあたりに関する初歩的なこ…

Rubyのパターンマッチを使ってMarkdownからコードブロックを抜き出す

Rubyのパターンマッチを使って、(GitHub Flavored) Markdownのテキストからコードブロックを抜き出す。次のようなテキストを考える。 # Ruby ## hello world Rubyでは次のようにhello worldします。 ```ruby puts 'hello world' ``` ``` これはRubyではあり…

Railsアプリのテスト実行時に特定の警告だけを例外に変換する

今後役立つのかわからないがRuby 2.7→3.xアップデートのときに使った方法のメモ。 Warning[:deprecated] = true すると表示される非推奨警告を発生させるコードがRailsアプリに含まれないように、テスト実行時だけこのような警告をあらかじめエラーに変換で…

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

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

コーヒー環境: カプセル式コーヒーメーカーとタンブラー

家のコーヒー環境が完全に安定したので書いておく。 コーヒーメーカー GENIO Sを使っている。 ネスカフェ ドルチェ グスト GENIO S 「ジェニオ エス」 スペースグレー【コーヒーメーカー】ネスカフェ ドルチェグストAmazon ドルチェグストは8年ぐらい使って…

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と同…

できるだけコントローラではなくモデルで例外処理する

問題: コントローラで例外処理している アプリケーションが扱うドメイン特有のエラーを例外として表現する場合に、その例外をコントローラで処理するコードを書くと、ほとんどの場合でコードが読みにくくなったり、コードを変更しづらくなったりする結果とな…

Macのセットアップでやること2022

Mac

新しくMacBookをセットアップする機会があった。開発環境はdotfilesである程度作れるようにしているが、macOSについてはいつもの設定を覚えておくしかない状態だったのでメモを残しておく。書いているのはデフォルトから変更している箇所だけ。 後述するがOS…

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

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

AOPに基づいてconcernモジュールを作る

発端: concernモジュールの命名をどうするか ここではActiveSupport::Concernをextendしたモジュールのことをconcernモジュールやconcernと呼ぶ。 「Concernに何を実装すべきかは…非常に曖昧」1である。さらに、Railsアプリのメインであるルーティングからモ…

既存のgemにRBSで型定義を書く

RBSの練習としてhatenablogというgemの型定義をRBSで書いた。 https://github.com/kymmt90/hatenablog/blob/v0.8.0/sig/hatenablog.rbs まだ該当gemのsigディレクトリに置いているだけだが、やったことを書いておく。 作業の流れ Ruby 3.0をインストールする…

OKRについて調べていた

今年から会社で導入されているOKRについて、結局どうやっていけばうまく運用できるのかわかっていなかったので、入門書を読んで調べていた。 OKRとは OKR - Wikipedia a goal-setting framework for defining and tracking objectives and their outcomes. …

Rack::Timeoutによるリクエストタイムアウトの仕組み

はじめに Rackミドルウェアの一つであるRack::Timeoutを使うと、Rackアプリがリクエストを受け取ってから一定時間が経過すると、アプリのどの場所でコードが実行されていても、その場所からRack::Timeoutの例外RequestTimeoutExceptionが発生する。 サンプル…

開発体験(DX)改善について知るために2021年1Qに読んだリソース

ここで開発体験(DX: developer experience)はおおむね次の記事で説明されている概念とする。digital transformationではない。 DX: Developer Experience (開発体験)は重要だ - Islands in the byte stream 2021年になり、担当するWebサービスのDXの改善…

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

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

2020年まとめ

2020年は特異な年だったというのもあり、個人的なことも含めて2020年にあったことをまとめた。 仕事 リモートワーク 2020年1月15日に日本での新型コロナウイルス感染者が確認されたあと、国内ではかなり早い段階で所属企業を含むグループ全社でリモートワー…

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

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

authorization code grantに沿ったDoorkeeperのコードリーディング

さまざまな都合により、OAuth 2のプロバイダになるためのDoorkeeperというgemのコードを読むことがしばしばある生活を送っている。 似た名前のモジュールやクラスが多く、読むたびに混乱しているので、authorization code grantでアクセストークンを取得する…

OpenID Connectについて知るときに読んだもの

OpenID Connect (OIDC)がどういうものか、どう使うのかについて知るために読んだものについてまとめておく。前提として、OAuth 2を利用したアプリケーションの開発経験はあるとします。 OAuth 2 OIDCはOAuth 2を拡張した認証プロトコルとなっている。前提に…

『決済サービスとキャッシュレス社会の本質』を読んだ

Eコマースに関するWebサービスを開発しているのもあって、たまに決済に関する本を読んでいて*1*2、今年は本屋に『決済サービスとキャッシュレス社会の本質』が平積みされているのを見つけたので、読むことにした。 決済サービスとキャッシュレス社会の本質作…

APIスロットリングの実現方法

ある期間でのあるWeb APIに対するアクセス回数上限を与えたときのスロットリングについて、一例ではあるがRack::Attack (v6.3.1)で採用されているしくみについて調べた。 ここでは、ある期間において特定のクライアントからのアクセスを一定回数以下に制限す…

ポモドーロ・テクニックを2か月間やってみての感想

2か月ほどポモドーロ・テクニックを使って仕事をしてみたので感想を書きます。 前提 仕事ではWebアプリケーション*1*2の開発が主な業務。最近、会社の勤務体制が原則として在宅勤務に移行した*3。 なぜ始めたか 在宅勤務はとても便利だが、家の中でずっと同…