尋常でないもふもふ

a software engineer blog

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

仕事上、メインの API サーバは RubyRails、Lambda やマイクロサービス的なサーバは Node.js、一部 DevOps 関連のスクリプトPython で書いてたりする。

各種プログラミング言語を使うときは言語自体のバージョン管理が必要となるが、env 系のバージョン管理ツールで統一するとコマンドがいっしょなので便利。
そして Mac でも Linux でも使える(これ超大事)。

Mac へのインストール方法

$ brew install rbenv
$ brew install pyenv
$ brew install nodenv

基本的なコマンド

インストール可能なバージョン一覧

$ rbenv install -l

インストール

$ rbenv install 2.5.1

インストール済のバージョン一覧

$ rbenv versions

アンインストール

$ rbenv uninstall 3.6.5

インストールしたバージョンをシステム上でグローバルに利用する

$ rbenv global 3.6.5

インストールしたバージョンを現在のディレクトリだけで利用する

$ rbenv local 3.6.5

カレントディレクトリに .ruby-version ファイルが生成されるので rbenv はこれを参照して指定のバージョンを利用する仕組み。

fish shell によるパス設定

bash を使ってる場合 ~/.bash_profile を編集する『パスを通す設定』が煩わしい。でも fish shell ならプラグインをインストールするだけ。

jnst.hateblo.jp

$ fisher install pyenv
$ fisher install rbenv
$ fisher install oh-my-fish/plugin-nodenv

自分で設定ファイルを vi とかで修正する必要がない。

Node.js のバージョン管理ツールいろいろ

nodenv の存在に気づくまでは nodebrew を使っていた。
だいたい同じだけど、カレントディレクトリだけ特定のバージョンを利用する機能はない。
(あと nodebrew は指定バージョンのインストールで v10.11.0 みたいに v を付けるが、nodenv 系は付けない点に注意。)

$ nodebrew ls-remote
$ nodebrew install-binary v10
$ nodebrew ls
$ nodebrew use v10
$ nodebrew uninstall v10
$ nodebrew selfupdate

nodenv と同じ env 系のバージョン管理ツールとして ndenv というものもあるが、こっちはもうメンテナンスされてないので使わない。
nodeenv という一文字違いの紛らわしいものもあるが、まったくの別系統のようだ。ちなみに Node.js を最初に使い始めた 5 年くらい前は nvm を使っていた気がする。

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

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

基本的なこと

node コマンドの option として --inspect をつければデバッグ実行になる。--require をつけることで node_modules のライブラリを読み込むことができる。

$ node --inspect --require ts-node/register src/main.ts
Debugger listening on ws://127.0.0.1:9229/690c42e8-c2d4-407a-b768-6c5270241775
For help, see: https://nodejs.org/en/docs/inspector

これで WebSocket の ws://127.0.0.1:9229 で待ち受けてるので、IDE 等からアタッチすることでデバッギングできる状態になっているというわけ。

ts-node のインストール

$ npm install ts-node -D
$ yarn add ts-node -D

WebStorm でのやり方

実行

--inspect --require ts-node/register して実行する ts ファイルを指定するだけ。 f:id:jnst:20180910162556p:plain

Jest でテスト

--inspect --require ts-node/register して実行するテストファイルを指定するだけ。

f:id:jnst:20180910162618p:plain

結果

f:id:jnst:20180910163534p:plain

VS Code でも同様のやり方でデバッグ実行できる。

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

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

Entity クラス

import {CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn} from 'typeorm';

@Entity('samples')
export class Sample {
  @PrimaryGeneratedColumn()
  id: number;

  @CreateDateColumn({name: 'created_at'})
  createdAt: Date;

  @UpdateDateColumn({name: 'updated_at'})
  updatedAt: Date;
}

ActiveRecord との違い

ActiveRecord では DATETIME の精度がデフォルトの 0 となり、値としては 2018-01-01 00:00:00 のようになる。

Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
created_at datetime NO NULL
updated_at datetime NO NULL

TypeORM は DATETIME の精度が 6 となり、値としては 2018-01-01 00:00:00.000000 のようにマイクロ秒まで扱う設定となる。

Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
created_at datetime(6) NO CURRENT_TIMESTAMP(6)
updated_at datetime(6) NO CURRENT_TIMESTAMP(6)

精度を 0 にする

要件次第ではあるがマイクロ秒どころかミリ秒すらいらなかったので ActiveRecord と同じように精度 0 にしたい。

@CreateDateColumn({name: 'created_at', precision: 0, default: () => 'NOW()'})
createdAt: Date;

@UpdateDateColumn({name: 'updated_at', precision: 0, default: () => 'NOW()'})
updatedAt: Date;

precision で精度を 0 指定する。これだけだとデフォルト値が CURRENT_TIMESTAMP(6) となってしまいエラーになるので、公式 FAQ に書いてあるやり方でデフォルト値も書き換える。