async-graphqlで独自の名前とフィールドを持つconnection/edgeを定義する

GraphQLで、適切にグラフ上のノード間の関係を示すために、connectionやedgeに独自の名前をつけて、独自のフィールドも追加したいことがある。 Explaining GraphQL Connections | Apollo GraphQL Blog Instead think of them as the relationship between tw…

定義する例外を減らしつつソフトウェアを設計する方法を"A Philosophy of Software Design"から学ぶ

会社の読書会で"A Philosophy of Software Design"を読んでいる。 A Philosophy of Software Design, 2nd Edition (English Edition)作者:Ousterhout, John K. Amazon 自分の担当で第10章"Define Errors Out Of Existence"をしっかり読む機会があり、けっこ…

中途入社のソフトウェアエンジニアがWebサービス開発に参加するとき役立ったこと

この記事は一休.com Advent Calendar 2023 8日目の記事です。 2023-09-25に入社して2か月半が経ったので、既存のWebサービスの開発にソフトウェアエンジニアとして参加するにあたって役立ったことを書いておく。 『Webサービスのソフトウェアエンジニアとし…

RustでTestcontainers入門: テストコードから依存サービスを起動してテスト環境を作成する

この記事はRust Advent Calendar 2023 シリーズ1の4日目の記事です。 あるソフトウェアをテストするとき、そのソフトウェアがデータベースやメッセージブローカのような外部のサービスに依存する場合に、その依存をどのように扱うかという問題がつきまとう。…

タスクに「〜対応」という名前をつけるのを避けたい理由

先日同僚と雑談的に話してたことを書いておく。ソフトウェア開発のバックログにおける話です。 「〜対応」とは 主に差し込みで入ったタスクやなにか早めに単一の解決したい事象のためのタスクに名付けられやすい名前。 あくまでも例としてだが 「マーケから…

RustでTiberiusを使ってSQL Serverのコンテナに接続する

Microsoftが提供しているSQL ServerのDockerイメージを使うと、デフォルト設定では無料のSQL Server Developer Editionのコンテナを起動できる。 learn.microsoft.com このコンテナに対してRustからクエリを発行したい。Rustでは、SQL Serverのクライアント…

ghでカレントディレクトリをもとにGitHubの新規リポジトリを作る

GitHub CLI (gh)でカレントディレクトリ配下のリポジトリをGitHubの新規リポジトリとしてプッシュする方法。 $ gh repo create $(basename $(pwd)) --push -s . --pushでリポジトリ作成とともにローカルのコミットをリモートにプッシュする。そのソースとな…

宣言的マクロでfor内包表記を部分的に実装する

Rustの宣言的マクロ(declarative macro)でScalaのfor内包表記(for comprehension)を部分的に実装してみた。Scalaの for { x <- xs y <- ys } yield doSomething(x, y) をRustで for_vec! { x <- xs, y <- ys; do_something(x, y) } のように書けるようにする…

現場で役立つGraphQLの知見をまとめた"Production Ready GraphQL"を読んだ

GraphQLを久しぶりに使うことになったので、復習のために"Production Ready GraphQL"を読んだ。 book.productionreadygraphql.com 著者はGitHubとShopifyでGraphQL APIの開発に携わっていた人なので、信頼感がある。GraphQL APIの開発をしようとした人はだい…

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が発生する。 サンプル…