バックエンドサーバは機能毎にマイクロサービスとして分割し、サーバ間通信には gRPC を使ってモダンな感じにしたい。 最初のインフラ構想 まず Node.js アプリケーションをコンテナベースにして、Code Pipeline + CodeBuild + ECR + ECS + Fargate で継続的…
Nest.js ではアプリケーションサーバとして動かすだけでなく、同時に gRPC として動かし、別のマイクロサービスと通信ができる設計になっている。 docs.nestjs.com main.ts (async () => { const app = await NestFactory.create(AppModule); const protoDir…
TL;DR まだ node_redis を使ってる人が多いけど標準で Promise 対応してなくてレガシー ioredis 使い方はほぼいっしょ 標準で Promise 対応してるので async/await でそのまま書ける Cluster, Sentinel, LuaScripting 含めたフル機能が使える 開発者の Luin …
ioredis で謎のエラーがでてハマった。 [ioredis] Unhandled error event: ParserError: Protocol error, got "J" as reply type byte. Please report this. at handleError (/Users/jnst/go/src/github.com/Translimit/park-server/node_modules/redis-pars…
TypeScript と ioredis のソースコード TypeScript で Redis 使いたい場合は ioredis で書いてこんな感じのコードになる。 sample.ts import * as Redis from 'ioredis'; (async () => { const redis = new Redis(); const pong = await redis.ping(); // =>…
AWS の Lambda や ECS の需要が増えたことにより、CloudWatch Logs の需要も増えてると思う。 でも AWS コンソールから CloudWatch Logs はとても見にくい。そこで awslogs を使ってる人が多いと思う。 awslogs の問題点 Python2系への依存、これが非常にだ…
TypeScript で Node.js やる場合の O/R Mapper の選択肢は少ない。 TypeORM Sequelize + sequelize-typescript wetland メジャーっぽかったのと Nest.js で標準対応してるので TypeORM を使うことにしてみたが、どうも本番環境を想定した作りには至ってない…
今までは Moment.js 使ってたけどモダンに再設計された Luxon を使うことにした。 なぜ Luxon がつくられたか Why does Luxon exist? に書いてある。 作者は Moment.js のメンテナー Moment.js を改善するアイデアを持っていたが良いコードベースではなかっ…
仕事上、メインの API サーバは Ruby の Rails、Lambda やマイクロサービス的なサーバは Node.js、一部 DevOps 関連のスクリプトを Python で書いてたりする。 各種プログラミング言語を使うときは言語自体のバージョン管理が必要となるが、env 系のバージョ…
ts-node は TypeScript ファイルをコンパイルせずにそのまま実行できるライブラリ。 開発環境でお世話になるが、デバッグ実行するやり方の日本語情報がなかったので書いておく。 基本的なこと node コマンドの option として --inspect をつければデバッグ実…
TypeORM では Rails の ActiveRecord と同じようにプライマリキーの id カラムをオートインクリメントさせたり、INSERT 時に created_at カラム、UPDATE 時に updated_at カラムを自動更新したりできる。 Entity クラス import {CreateDateColumn, Entity, P…
背景 Protocol Buffers のコード生成だけなら Homebrew でインストール可能な protoc コマンドさえあればいいが、 $ brew install protobuf $ protoc --version libprotoc 3.6.0 gRPC コードを生成するなら grpc_cpp_plugin が必要となる。 $ which grpc_cp…
波括弧(curly brace)のオブジェクトリテラルを 1 行で書く場合の話。 const withSpace = { name: 'yamada', locale: 'JP' }; // 空白あり const withoutSpace = {name: 'yamada', locale: 'JP'}; // 空白なし 実は規定がない どれを見ても『オブジェクトリ…
Docker には HEALTHCHECK というコンテナが正常稼働しているか確認する機能がある。 何をもって『正常』と判断するかはコンテナを稼働する人が指定する。Nginx みたいな Web サービスのコンテナの場合は公式サンプルにもある通りcurl を死活監視のためのコマ…
⚙️ tsconfig.json tsc コマンドで変換するときのための設定ファイル。 { "compilerOptions": { "module": "commonjs", "declaration": false, "noImplicitAny": false, "removeComments": true, "noLib": false, "allowSyntheticDefaultImports": true, "emi…
クラスターのタスクが動いたまま タスクを「すべて停止」する 別のクラスターと同じセキュリティグループをつかっている 別のクラスターのセキュリティグループをすげ替える または対象のセキュリティグループを直接削除する
ビルド -t でタグを指定。--no-cache でビルド時のキャッシュを使わない。 $ docker build -t jnst/my-docker-image --no-cache . 実行 -it でインタラクティブモードで実行。--rm で終了時にコンテナ破棄。/bin/ash で ash シェル(Alpine Linuxの標準シェ…
デフォルトでは垂直分割モードになっていてくっそわかりにくい。 エディタ分割自体は Cmd + 1, Cmd + 2, Cmd + 3 がショートカットになっていて、最大3つまで分割できる。 Cmd + Option + 0 がトグルになっていて押すたびに垂直分割モード→水平分割モードに…
会社のアカウントでは GitHub 使ってるけど、個人のアカウントでは GitLab.com 使ってる。 プライベートリポジトリが無制限に無料なのでわざわざ GitHub で課金するメリットないし。 こんなとき何も考えずにコード書いてコミットすると、個人用の匿名アカウ…
どうにかクローンできないかと調べてたけど GitHub API 使って curl 等から HTTP でダウンロードできた。 プログラムから GitHub リポジトリのファイルを読み込みたいときに便利。 準備 GitHub の OAuthToken が必要。 Personal access tokens のページから …
使い方が異なる。 max メソッドは比較演算子 <=> の結果、つまり戻り値は -1, 0, 1 のいずれかを返す必要がある。 max_by は比較したい値を返すだけでよい。 gist.github.com ちなみに max も max_by も Enumerable で定義されているメソッドなので Hash に…
Google 社員で Go 言語のコミッターでもある @rakyll さんの 2017年2月3日のブログ記事『自己文書化するためのテスト名』が参考になった。ちょうどテストをしっかりと書くようになってきたところだったので非常にタイムリー。 SOURCE Naming tests to self-d…
AXES 0570-02-5525 0570025 という項目で 4,950 円。 プロバイダ料かなんかだと思って数ヶ月放置してたけど、オンライン英会話 ネイティブキャンプ の請求だった。iPhone 側で決済したと思いこんでて、あるとき AppStore 定期購読を…
わかりにくいコンパイルエラーに悩まされて時間を無駄にすることがたびたびあり、6度目くらいでカッとなって記事にすることにした。順次追加していく。 Member reference base type 'User *const' is not a structure or union 以下は std::vector の中から…
クラス図やシーケンス図の UML を Markdown のようにテキストエディタで記述できる PlantUML の環境設定。 必要なもの 動作に必要なのは4つ。Java 環境とかここ2〜3年必要なかったし正直もういれたくないんだけど、このためだけにわざわざインストールする…
新しいプロジェクトはじめたり、新機能開発したりすると調べなおしたりすることが多いので順次追加していく。 類義語 お金・資源などが足りないとき insufficient [形容詞] メモリ不足 (insufficient memory) とか資源不足 (insufficient resource`) とか そ…
FishShell ではイコール演算子を使って変数に設定という記法がない。 Ruby on Rails で RAILS_ENV=test bundle exec rake db:migrate みたいなことするとエラーになる。 $ RAILS_ENV=test bundle exec rake db:migrate:status Unsupported use of '='. To ru…
自分は vi 信者でもなければ emacs 信者でもない。どちらかというと IDE 至上主義者。 vim に関してはターミナル作業中にときどき使う。凝った設定は不要で、プラグインは使わないしカラーテーマもデフォルトで用意されてるものだけを使いたい。 無駄な設定…
Python で開発するわけじゃないけど、Hubot を使ったりするときにサーバ操作のための自動化ツールとして Fabric をつかうことになることが度々あり pip が必要になったりする。 最近だと Google の人工知能ライブラリ TensorFlow を試すためにいれてる人も多…
エンジニア人生の中で zsh を導入しようと数回思いたったことはあるのだけれど、毎回初期設定のひどさを見るたびに辟易して bash でいいやと諦めていた。 コピペで機能追加できるとか言われても、自分の理解の範疇を超えてわけわからん状態になるのは耐え難…