尋常でないもふもふ

a software engineer blog

ECS + Fargate + gRPCを使ったマイクロサービス構成

バックエンドサーバは機能毎にマイクロサービスとして分割し、サーバ間通信には gRPC を使ってモダンな感じにしたい。 最初のインフラ構想 まず Node.js アプリケーションをコンテナベースにして、Code Pipeline + CodeBuild + ECR + ECS + Fargate で継続的…

Nest.jsでgRPCを使ったマイクロサービス

Nest.js ではアプリケーションサーバとして動かすだけでなく、同時に gRPC として動かし、別のマイクロサービスと通信ができる設計になっている。 docs.nestjs.com main.ts (async () => { const app = await NestFactory.create(AppModule); const protoDir…

Node.jsでRedis使うならioredisがおすすめ

TL;DR まだ node_redis を使ってる人が多いけど標準で Promise 対応してなくてレガシー ioredis 使い方はほぼいっしょ 標準で Promise 対応してるので async/await でそのまま書ける Cluster, Sentinel, LuaScripting 含めたフル機能が使える 開発者の Luin …

ioredisで謎のエラー

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のコードをJestでテストしたらコンストラクタじゃないと言われた件

TypeScript と ioredis のソースコード TypeScript で Redis 使いたい場合は ioredis で書いてこんな感じのコードになる。 sample.ts import * as Redis from 'ioredis'; (async () => { const redis = new Redis(); const pong = await redis.ping(); // =>…

awslogsはpython2系依存なのでgolang実装のcwをつかう

AWS の Lambda や ECS の需要が増えたことにより、CloudWatch Logs の需要も増えてると思う。 でも AWS コンソールから CloudWatch Logs はとても見にくい。そこで awslogs を使ってる人が多いと思う。 awslogs の問題点 Python2系への依存、これが非常にだ…

TypeORMで本番運用を見据えたマイグレーション

TypeScript で Node.js やる場合の O/R Mapper の選択肢は少ない。 TypeORM Sequelize + sequelize-typescript wetland メジャーっぽかったのと Nest.js で標準対応してるので TypeORM を使うことにしてみたが、どうも本番環境を想定した作りには至ってない…

JavaScriptの日付処理でLuxonを使う

今までは Moment.js 使ってたけどモダンに再設計された Luxon を使うことにした。 なぜ Luxon がつくられたか Why does Luxon exist? に書いてある。 作者は Moment.js のメンテナー Moment.js を改善するアイデアを持っていたが良いコードベースではなかっ…

RubyとPythonとNode.jsで開発してるやつちょっとこい

仕事上、メインの API サーバは Ruby の Rails、Lambda やマイクロサービス的なサーバは Node.js、一部 DevOps 関連のスクリプトを Python で書いてたりする。 各種プログラミング言語を使うときは言語自体のバージョン管理が必要となるが、env 系のバージョ…

ts-nodeをIDEでデバッグ実行

ts-node は TypeScript ファイルをコンパイルせずにそのまま実行できるライブラリ。 開発環境でお世話になるが、デバッグ実行するやり方の日本語情報がなかったので書いておく。 基本的なこと node コマンドの option として --inspect をつければデバッグ実…

TypeORMの@CreateDateColumnの精度を0にする

TypeORM では Rails の ActiveRecord と同じようにプライマリキーの id カラムをオートインクリメントさせたり、INSERT 時に created_at カラム、UPDATE 時に updated_at カラムを自動更新したりできる。 Entity クラス import {CreateDateColumn, Entity, P…

Mac環境でgRPCのC++コードをDockerつかって生成

背景 Protocol Buffers のコード生成だけなら Homebrew でインストール可能な protoc コマンドさえあればいいが、 $ brew install protobuf $ protoc --version libprotoc 3.6.0 gRPC コードを生成するなら grpc_cpp_plugin が必要となる。 $ which grpc_cp…

JavaScriptのオブジェクトリテラルの前後にスペースを含めるべきか否か

波括弧(curly brace)のオブジェクトリテラルを 1 行で書く場合の話。 const withSpace = { name: 'yamada', locale: 'JP' }; // 空白あり const withoutSpace = {name: 'yamada', locale: 'JP'}; // 空白なし 実は規定がない どれを見ても『オブジェクトリ…

DockerのHEALTHCHECKをwgetでやる

Docker には HEALTHCHECK というコンテナが正常稼働しているか確認する機能がある。 何をもって『正常』と判断するかはコンテナを稼働する人が指定する。Nginx みたいな Web サービスのコンテナの場合は公式サンプルにもある通りcurl を死活監視のためのコマ…

TypeScriptをはじめるとき知っておくと捗る

⚙️ tsconfig.json tsc コマンドで変換するときのための設定ファイル。 { "compilerOptions": { "module": "commonjs", "declaration": false, "noImplicitAny": false, "removeComments": true, "noLib": false, "allowSyntheticDefaultImports": true, "emi…

ECSでクラスターを削除できないとき

aws

クラスターのタスクが動いたまま タスクを「すべて停止」する 別のクラスターと同じセキュリティグループをつかっている 別のクラスターのセキュリティグループをすげ替える または対象のセキュリティグループを直接削除する

よくつかうdockerコマンド

ビルド -t でタグを指定。--no-cache でビルド時のキャッシュを使わない。 $ docker build -t jnst/my-docker-image --no-cache . 実行 -it でインタラクティブモードで実行。--rm で終了時にコンテナ破棄。/bin/ash で ash シェル(Alpine Linuxの標準シェ…

Visual Studio Codeでエディタを水平分割

デフォルトでは垂直分割モードになっていてくっそわかりにくい。 エディタ分割自体は Cmd + 1, Cmd + 2, Cmd + 3 がショートカットになっていて、最大3つまで分割できる。 Cmd + Option + 0 がトグルになっていて押すたびに垂直分割モード→水平分割モードに…

ディレクトリに応じてgitユーザーを切り替える

git

会社のアカウントでは GitHub 使ってるけど、個人のアカウントでは GitLab.com 使ってる。 プライベートリポジトリが無制限に無料なのでわざわざ GitHub で課金するメリットないし。 こんなとき何も考えずにコード書いてコミットすると、個人用の匿名アカウ…

GitHubから1ファイルだけ取得する方法

git

どうにかクローンできないかと調べてたけど GitHub API 使って curl 等から HTTP でダウンロードできた。 プログラムから GitHub リポジトリのファイルを読み込みたいときに便利。 準備 GitHub の OAuthToken が必要。 Personal access tokens のページから …

Rubyのmaxとmax_byの違い

使い方が異なる。 max メソッドは比較演算子 <=> の結果、つまり戻り値は -1, 0, 1 のいずれかを返す必要がある。 max_by は比較したい値を返すだけでよい。 gist.github.com ちなみに max も max_by も Enumerable で定義されているメソッドなので Hash に…

Go言語:自己文書化するためのテスト名

Google 社員で Go 言語のコミッターでもある @rakyll さんの 2017年2月3日のブログ記事『自己文書化するためのテスト名』が参考になった。ちょうどテストをしっかりと書くようになってきたところだったので非常にタイムリー。 SOURCE Naming tests to self-d…

クレジットカードでAXESからの謎の明細

AXES 0570-02-5525 0570025 という項目で 4,950 円。 プロバイダ料かなんかだと思って数ヶ月放置してたけど、オンライン英会話 ネイティブキャンプ の請求だった。iPhone 側で決済したと思いこんでて、あるとき AppStore 定期購読を…

C++糞コンパイルエラー集

c++

わかりにくいコンパイルエラーに悩まされて時間を無駄にすることがたびたびあり、6度目くらいでカッとなって記事にすることにした。順次追加していく。 Member reference base type 'User *const' is not a structure or union 以下は std::vector の中から…

MacにPlantUMLをいれる

クラス図やシーケンス図の UML を Markdown のようにテキストエディタで記述できる PlantUML の環境設定。 必要なもの 動作に必要なのは4つ。Java 環境とかここ2〜3年必要なかったし正直もういれたくないんだけど、このためだけにわざわざインストールする…

迷いがちな英語の変数・関数名まとめ

新しいプロジェクトはじめたり、新機能開発したりすると調べなおしたりすることが多いので順次追加していく。 類義語 お金・資源などが足りないとき insufficient [形容詞] メモリ不足 (insufficient memory) とか資源不足 (insufficient resource`) とか そ…

fishで環境変数といっしょにコマンド実行したいとき

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…

Vimの知見まとめとく

自分は vi 信者でもなければ emacs 信者でもない。どちらかというと IDE 至上主義者。 vim に関してはターミナル作業中にときどき使う。凝った設定は不要で、プラグインは使わないしカラーテーマもデフォルトで用意されてるものだけを使いたい。 無駄な設定…

2016年11月のPython環境構築

Python で開発するわけじゃないけど、Hubot を使ったりするときにサーバ操作のための自動化ツールとして Fabric をつかうことになることが度々あり pip が必要になったりする。 最近だと Google の人工知能ライブラリ TensorFlow を試すためにいれてる人も多…

zshは諦めてたけどfish shell導入したら捗った

エンジニア人生の中で zsh を導入しようと数回思いたったことはあるのだけれど、毎回初期設定のひどさを見るたびに辟易して bash でいいやと諦めていた。 コピペで機能追加できるとか言われても、自分の理解の範疇を超えてわけわからん状態になるのは耐え難…