TypeScript w/ Zod でリテラルな文字列の配列を型として扱う

Zod の Schema Validation でリテラルな文字列の数パターンのみを受け付けるようにする z.enum() にリテラルな文字列の配列を渡すことでその配列のみを有効な入力になるように制限することができます。 (悪いね、今日はカツオ(bonito) は入っていないんだ) i…

個人アカウントでも AWS Organizations と IAM Identity Center を使う a.k.a. 古の AWS アカウントにかけられた東京リージョン az-a の呪いからの脱出

aws

アカウント温故知新と東京リージョン az-a の呪い 昔話になりますが、私は個人の AWS アカウントを 東京リージョンが利用可能になった 2011年 に作成しました。それ以降 EC2 をはじめとして散発的に AWS リソースを使用してきましたが、時代とともに古いアカ…

Rails でカレンダーチャート(いわゆる Github の草) を描画する

Rubygem: rails_charts から Apache ECharts を使用する 核となるのは JavaScript のライブラリ Apache ECharts です。このライブラリを利用して Canvas API ベースの 2D グラフィックを描画することができます。各言語でのラッパーライブラリが存在し、Rail…

Notion の Engineering Wiki テンプレートを使ってチームの情報共有を効率化する

Engineering Wiki のテンプレートが優秀 Notion が標準で提供しているテンプレートを物色したところ、Engineering Wiki がとても良かったので紹介します。 タグによるドキュメントの集約ができるので目的のドキュメントに到達しやすい ドキュメントをタグご…

AWS EventBridge でメトリクスとイベントの両ターゲットを対象にした通知フローを構築する

メトリクスに応じた処理とイベントに応じた処理を SNS to Chatbot の通知フローのレールに集約する ここ数ヶ月 AWS EventBridge を利用した通知フローの改善を通して AWS Observability について、その全体像の理解が深まりました。このエントリでは AWS Eve…

docker buildx でマルチプラットフォームのイメージを作成する その2

MacOS Ventura で buildx を利用して amd64 と arm64 のイメージを作成する docker buildx でマルチプラットフォームのイメージを作成する - blog.ayakumo.net で紹介した buildx を利用して amd64 と arm64 のイメージを作成していきます。環境は以下になり…

asciinema と agg: ターミナルセッションの記録と共有

百聞は一見に一見にしかず? AWS EC2 のコスト計算 API を Rust で作成した - blog.ayakumo.net で紹介したツールの README を作成するにあたり asciinema と agg*1 を使用しています。ターミナルセッションを GIF にすることで、ツールの動作や実行環境が読…

AWS EC2 のコスト計算 API を Rust で作成した

AWS EC2 のコスト計算をターミナルで行う AWS EC2 のコスト計算を行う API を Rust で作成しました。フレームワークは Actix Web を使用しています。 github.com 以下の特徴とターミナルで JSON を加工できる点で、AWS 公式の オンデマンドインスタンス料金 …

Amazon Linux 2023 用の user_data.txt を作成する

AL2023 with Ruby, Python, Node.js, and Rust EC2 環境を AL2023(Amazon Linux 2023) に切り替えるべく準備を進めています。AL2025 がリリースされる 2025年まで の 2 年間のベースとする予定です。 まずは作って壊せるスタンドアロンの開発環境(workstatio…

docker buildx でマルチプラットフォームのイメージを作成する

いつのまにかビルド時にランタイム時のターゲットプラットフォームを選択できるようになっていた 昨今は ARM 系(graviton) の EC2 を使用することが多いので、これは助かります。:-) ➜ cat Dockerfile # syntax=docker/dockerfile:1 FROM alpine:3.16 RUN ap…

フォームの入力を一部記憶してユーザーの入力作業を省力化する

英語レッスンで知らない単語がひとつ以上出てきた場合 Rails で個人用の英単語帳アプリを開発しています。開発環境は Rails 7.0.4 + Ruby 3.2.2 です。 オンライン英会話レッスンではインターネットの記事を教材にすることが多いです。その場合、同記事中に…

Ec2 Instance Connect にはリージョンごとの特定の IP 範囲からの接続をセキュリティグループで許可する必要がある

aws

AWS Management Console からブラウザベースのターミナルで EC2 に接続する AWS Management Console 内から任意の EC2 インスタンスに SSH する機能が EC2 Instance Connect です。CloudShell 同様、ブラウザベースのターミナルで接続することになります。EC…

ゲストユーザ用のデータを実データから用意する

SignUp 以前のユーザーに、実際に「動いている様子」を体感してもらう Rails で個人用の英単語帳アプリを開発しています。開発環境は Rails 7.0.4 + Ruby 3.2.2 です。 ごくごく限られた知り合いに実際にアプリを触ってもらってフィードバックをもらうために…

docker buildx build を使用して Rails の master.key をコンテナイメージから除外する

master.key とは Rails の master.key とは認証情報を暗号化する時に使用されるキーファイルです。rails credentials:edit で認証情報を credentials.yml.enc に暗号化(ENCrypt) して保存する時に使用されます。認証機能に Firebase authentication を利用し…

AWS AppRunner で Rails アプリを動かす場合のベストプラクティス

aws

AppRunner から割り当てられるドメインと DNS rebinding atttacks AppRunner にアプリをデプロイした場合、アプリに割り当てられるドメインは ランダム文字列.リージョン.awsapprunner.com になります。このドメインは Rails の DNS rebinding attacks を防…

Fly.io のファーストインプレッション

Heroku の料金体系改定 Heroku’s Next Chapter | Heroku でアナウンスされている通り 11/28 から heroku の料金体系が改定されます。無料枠の Free と Hobby プランは 11/28 で廃止されます。そのため、多くのエンジニアが無料枠を求めて fly.io, railway, r…

開発環境の sqlite3@mac とステージング環境の postgresql@heroku をデータベースツールキット sequel とカスタム rake タスクで同期する

sqlite3 DB(on Mac) と postgresql DB(on Heroku) を同期する 私の場合 Rails の開発環境とステージング環境をそれぞれ以下のように構築しています。開発に伴う動作確認や実際の英単語の入力は開発環境(Mac mini)で行うことがほとんどなので、自然と両環境で…

Rails で Firebase Authentication を使う場合のユーザーモデルとテスト

Firebase Authentication を使う場合、ユーザーモデルとテストはどうする? Rails で個人用の英単語帳アプリを開発しています。開発環境は Rails 7.0.4 + Ruby 3.1.2 です。 ユーザ認証に Firebase Authentication を導入すると、フォームに入力した email と…

unbuffer と tee の組み合わせで標準出力とログのカラーを保持する

tee に渡すとカラー出力が打ち消されて色なしになってしまう 開発環境の構築などの定型処理は Rakefile でタスクを定義して、バッチ処理として実行しています。 この際にログも保持するようにしているのですが、単純に tee に渡すだけでは標準出力もログもカ…

Real World Exception Handling

奇数(odd)がだめなら偶数(even)にすればいいじゃない スプレッドシートからデータをインポート処理を書いています。指定地点 s から指定された h[:x], h[:y] の座標分、セルを切り取って配列(matrix) とハッシュ(kv_pair_matrix) のどちらからでもデータを利…

ansible の command module を使用して複数ホストのログを確認する

複数ホストへコマンドを一括実行したい時 複数ホストに一括してコマンドを実行したい時がたまにあります。繰り返す作業ではなく、ざっとログにエラーメッセージが出ていないかなどをアドホックに確認したい時など。これは ansible の command module を利用…

ひとつの入力語に対して複数カラムを対象にして検索を行い結果をまとめる

「空気を読む」検索 Rails の検索には Ransack が重用されます。Ransack では基本的にモデルの単一カラムに対して cont(contain) や eq(equal) といった条件で検索が可能です。この場合、ユーザーがひとつの用語で複数のカラムを検索したい場合、別々の入力…

AWS CDK で EC2 を構築する時の地雷処理

古い AWS アカウントの呪い(?) 私の AWS アカウントでは Tokyo リージョン(ap-northeast-1) の Availability Zone の a が使用できません。使用できるのは b と c だけです。これはアカウントを作成した時期(2011年)に関係しているようです。比較的新しい時…

Tenets of SRE を Github Issues/Pull Requests のラベルにする

Tenets of SRE を Github Issues/Pull Requests のラベルにする Github にデフォルトで用意されているラベル(bug, duplicate, enhancement, ...) はアプリ開発向けです。インフラ開発向けの課題管理には SRE Book で定義されている Tenets of SRE(availabili…

バッチ処理を cron から k8s cronjob に移行する

Shamshir のスタンドアローン版を k8s(minikube) の cronjob に移植した記録です。 cron でバッチを動かす時の問題点 node, ruby, python 他インタプリンタ系の言語でプログラムを作ると nodenv + npm/yarn, rbenv + bundler, pyenv + pip などのエコシステ…

Chrome で検索対象の言語を英語のみにして検索する

設定方法 URL バーを右クリックして「検索エンジンを管理」のメニューを表示します。 メニューを以下のように修正します。検索エンジン名とキーワード(トリガーとなるキー)をお好みで指定します。 https://www.google.com/search?gl=us&hl=en&gws_rd=cr&pws=…

aws-minikube: ELB とも連携できてフットワークが軽い AWS k8s 環境

k8s 環境として minikube, eks, aws-minikube を比較してみました(k3s は未経験)。個人的には aws-minikube がコスト面/機能面でよさそうに思えたので紹介です。 aws-minikube とは? EC2 1 台で k8s 環境が整うツールです。Red Hat 社の Jakub Scholz 氏が 2…

Getting started with Amazon EKS (2) とコスト計算

前回 に引き続き、EKS でサンプルの nginx pod を外部公開するまでを実施しました。 docs.aws.amazon.com Service の外部公開 Getting Started with Amazon EKS で紹介されているデプロイだと Type:ClusterIP でクラスタ内部への公開なので、これを type: Lo…

Ansible における抽象/具体モデルと誰が/何をするの考え方

Ansible の group と host, role と task の関係が 公式ドキュメント からだと個人的にわかりにくかったのでまとめた図です。頭の中でなんとなく理解していたことを図や表に起こしてみることで理解が促進されました(公式ドキュメントにこういった説明があれ…

Node.js のテストフレームワークとデバッガ

テストフレームワーク Jest shamshir に細かなバグを見つけたので少しの間、我流のプリントデバッグをしていたのですが、継続的なメンテナンスを考えてテストフレームワークを導入することにしました。参考にしている「ハンズオン Node.js」の「8 章 ユニッ…