尋常でないもふもふ

a software engineer blog

2018-01-01から1年間の記事一覧

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 で課金するメリットないし。 こんなとき何も考えずにコード書いてコミットすると、個人用の匿名アカウ…