君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

babelで現在のnodeJsのバージョンに合わせてトランスパイルする

** あとで少し追記する

babelのinstall

yarn init -y
yarn add @babel/cli --dev
yarn add @babel/core --dev

コンパイルするソース

class Hoge {
  constructor() {
  }
}
const hoge = new Hoge();

コンパイル

何も入れず、そのままコンパイルしてみる

yarn run babel index.js
class Hoge {
  constructor() {
  }
}
const hoge = new Hoge();

そのままでてきた。

@babel/preset-envを入れてみる

今まではbabel-preset-es2015など、 トランスパイルするときに参照する仕様をパッケージに追加する必要があった。

しかし、@babel/preset-envを用いれば、 実行環境に合わせて勝手にパッケージを追加してくれる。

また、ブラウザを指定した変換ができたりする。

今回はnode上で動くようにトランスパイルするので、 .babelrcを以下のように指定。

yarn add @babel/preset-env --dev
{
  "presets": [
    [
      "@babel/preset-env",
      {
        "useBuiltIns": "entry",
        "targets": {
          "node": "current"
        }
      }
    ]
  ]
}

dockerのコンテナを削除する〜サブシェルについて〜

いきさつ

とまっているDockerコンテナを全部削除したい。

と思って方法を調べたら「サブシェル」という技術を知った。

方法

$ docker rm $(docker ps -aq)

解説

( )

( )でくくった処理はサブシェル内で実行する。

親シェルの環境変数を汚したくないときに使う。

$( )

$( )内の標準出力を値として得ることができる。

$ echo $(ls)
Applications Desktop Documents Downloads Dropbox Library Movies Music Pictures Public

これを引数として渡すことができるのか。

releaseブランチを導入するメリットについて考える

f:id:karoten512:20181211132007p:plain

背景

masterブランチとdevelopブランチ、

それとfeatureブランチで開発しているケースを考える。

developからfeatureブランチを生やして、featureの開発が終わったらdevelopにマージ。

developにマージしたものをリリースのタイミングでmasterにマージ。

それを本番環境にリリース。

問題

リリースに伴い、コードの細かい修正を行うことがある(リリース作業と呼ぶことにする)。

それらのリリース作業と開発作業が並行して行われるとき困る。

リリース作業内容も開発作業内容もdevelopにマージされるので、

それをmasterにマージしてリリースすると、開発途中のものまでmasterにマージされてしまう。

まだリリースしたくない機能があるのにリリースされてしまったりするよ。

解決策

開発用のブランチとリリース用のブランチを分ける。

リリース作業に入った時、developブランチからreleaseブランチを切って、

それに対してリリース作業のコミットをする。

リリース作業が終了すればmasterにマージする。

(さらにdevelopにもリリース作業の内容を反映させるため、マージする)

メリット

リリース作業中でも、developブランチにプルリク&マージができるので、

作業が滞らずに進む。

リリース作業中の開発内容が本番環境にリリースされることがなく、安全。

AWSのCloudFrontの設定(OriginPath)を、aws-cliから変更する

f:id:karoten512:20181206221710p:plain

いきさつ

デプロイ自動化の一環で、

AWSのCloudFrontの設定をaws-cliから変更したくなった。

(今回変更したのはOriginPath)

前提

  • aws-cliが使用できる環境
  • jpが使用できる環境

出来上がったシェル

# Etagの抽出
RAW_ETAG=$(aws cloudfront get-distribution-config --id "xxxxxxxxx" | jq '.ETag')
ETAG=$(echo ${RAW_ETAG} | sed "s/\"//g")

# 今の設定をファイルとして抽出
aws cloudfront get-distribution-config --id "xxxxxxxxx" | jq '.["DistributionConfig"]' > old_dist.conf

# 抽出した設定ファイルの書き換え
cat old_dist.conf | jq '.["Origins"]["Items"][0]["OriginPath"] = "'/dir_name'"' > new_dist.conf

# 新しい設定の適用
aws cloudfront update-distribution --id "xxxxxxxxx" --distribution-config file://new_dist.conf --if-match ${ETAG}

解説

全体について

CloudFrontの設定を変えるには、

aws cloudfront update-distribution --id "xxxxxxxxx" --distribution-config file://new_dist.conf --if-match ${ETAG}

というコマンドを叩きます。このとき

  • 現在のCloudFront設定のバージョンを表す文字列「Etag」
  • 新しい設定ファイルである「new_dist.conf」

が必要になるので、準備が必要です。

Etagの抽出

RAW_ETAG=$(aws cloudfront get-distribution-config --id "xxxxxxxxx" | jq '.ETag')
ETAG=$(echo ${RAW_ETAG} | sed "s/\"//g")

普通に抽出するとダブルクォーテーションが着いてしまうので、 除去しておきます。

新しい設定ファイルである「new_dist.conf」を生成

# 今の構成ファイルの抽出
aws cloudfront get-distribution-config --id "xxxxxxxxx" | jq '.["DistributionConfig"]' > old_dist.conf

# 抽出した構成ファイルの書き換え
cat old_dist.conf | jq '.["Origins"]["Items"][0]["OriginPath"] = "'/dir_name'"' > new_dist.conf

まず今の構成ファイルを抽出し、

そのファイルの一部(今回でいうとOriginPath)を書き換え、

新しい設定ファイルを生成しておきます。

感想

これだけでもだいぶ便利になった。

CUIはやっぱりよい。

Go言語製のmigrationツール、sql-migateを使ってみた(postgresSQL編)

経緯

開発環境と本番環境のDB差異をできる限り無くすためにmigrationツールを導入する。

プロジェクトリポジトリと同じリポジトリマイグレーションファイルを管理することにより、

ソースコードとDBスキーマのバージョンを同期させることができる。

使用するmigrationツールは「sql-migrate(https://github.com/rubenv/sql-migrate)」

導入

goの実行環境を入れる

$ brew install go

~/.bash_profileに以下を記述して、パスを通す

export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin

~/.bash_profileを読み込む

source ~/.bash_profile

sql-migrateをinstall

$ go get -v github.com/rubenv/sql-migrate/...
$ sql-migrate -v #バージョンが表示されればinstall成功

DB設定をdbconfig.ymlで記述

development:
    dialect: postgres # 使用するRDBMS
    datasource: dbname=dbName host=hostName user=userName password=passWord port=5432 sslmode=disable
    dir: migrations/postgres # マイグレーションファイルのあるディレクトリ
    table: migrations # マイグレーション履歴を保存するテーブル名

使用方法

マイグレーションファイルの雛形を作成

sql-migrate new add-column-to-user-table
# Created migration migrations/postgres/20181206145950-add-column-to-user-table.sql と表示されます。これが雛形です。

マイグレーションファイルの雛形を編集

-- +migrate Up
create table users (
id serial PRIMARY KEY,
name text NOT NULL,
date timestamp NOT NULL);
 
-- +migrate Down
drop table users;

以上のようにup(行いたいスキーマ変更SQL)とdown(それを打ち消すSQL)の両方を記述する必要があります。

マイグレーションファイルの実行

sql-migrate up

これでupに記述したSQLが実行されます。 upに書いたSQLが間違っていたなどで、DBスキーマを元に戻したい場合は、

sql-migrate down

で元に戻してください。その後、upに書いたSQLを編集し、マイグレーションファイルを実行し直してください。

補足

どこまでマイグレーションが実行されているのかは、

$ sql-migrate status

で確認できます。 なおこの情報はmigrationsというテーブルでも確認できます。

AWS CLI S3にまつわるコマンドメモ〜一覧表示、ダウンロード、アップロード〜

f:id:karoten512:20181203131958j:plain

一覧表示系

s3内においてあるbucketをすべて表示する

aws S3 ls

S3内においてある特定のbucketの中身を表示する

aws s3 ls {bucketName}

ダウンロード系

S3上のファイルをlocal上のフォルダに落としてくる

aws s3 cp s3://{bucketName} {localFolderName} --recursive

アップロード系

local上のファイルをS3内においてある特定のbucketにアップロード

aws s3 cp {localFolderName} s3://{bucketName}  --recursive

【告知】1本5分のpodcast、ナノキャスはじめます。

f:id:karoten512:20181028002244j:plain

この間ポッドキャストに初めて出た。とても楽しかった。

monorazi.hateblo.jp

だから自分でもやろうと決めた。

自分で言うのもなんですが、かなり特殊なポッドキャストになる予定。

現時点での構成はこんな感じ。

  • 1本5分きり
  • 僕が喋りっぱなし
  • 内容はフィクションとノンフィクションの間
  • 全7回構成(7回目がいわゆる「最終回」)

とても楽しみ。

ものラジパーソナリティのお二人、

今回は出演の機会をくださりありがとうございました。

それではお楽しみにね。