「docker compose up」でSTATUSが「exited (1) 」になるときは「docker compose logs」でエラーの原因を見つける

「docker compose up」でSTATUSが「exited (1) 」になるときは「docker compose logs」でエラーの原因を見つける。

コンテナを起動するため以下のコマンドを実行した。

docker compose up -d

しかし、コンテナにアクセスできない。

コンテナの状況を確認する。

docker compose ps

「STATUS」が「exited (1) 」になっている。
何らかの理由でコンテナが起動に失敗している。

こういうときは、

docker compose logs

でログを確認してエラーになっている原因を見つける。

VMware Workstation PlayerにAmazon Linux 2をインストールする。

VMware Workstation PlayerにAmazon Linux 2をインストールする。

seed.iso 起動ディスクを作成する

seedconfigフォルダーを作成し、meta-dataファイルとuser-dataファイルを作成します。

meta-data

local-hostname: al.localhost

user-data

#cloud-config
#vim:syntax=yaml
users:
 - default
chpasswd:
  list: |
    ec2-user:password
ssh_pwauth: True

seedconfigディレクトリーで、以下のコマンドを実行します。

Linuxの場合

genisoimage -output seed.iso -volid cidata -joliet -rock user-data meta-data

macOSの場合

hdiutil makehybrid -o seed.iso -hfs -joliet -iso -default-volume-name cidata seedconfig/

Amazon Linux 2 VM イメージのダウンロード

以下のページからovaファイルをダウンロードする。

仮想マシンの作成

VMware Workstation Playerを起動し、「仮想マシンを開く」を選択する。

ダウンロードしたovaファイルを選択する。

「新規仮想マシンの名前」と「新しい仮想マシンのストレージパス」を入力し、「インポート」ボタンを押す。


「仮想マシン設定の編集」を選択する。

「追加」ボタンを押し、「CD/DVD ドライブ」を選択して「完了」ボタンを押す。

「ISO イメージ ファイルを使用する」をチェックし、seed.isoファイルを選択します。

「OK」ボタンを押し、仮想マシン設定画面を閉じます。

「仮想マシンの再生」を選択します。

仮想マシンが起動したら、ログイン名に「ec2-user」、パスワードにuser-dataファイルで設定したパスワードを入力する。

以上で完了。

textlintをプログラムに組み込んで使う

textlintをコマンドラインから実行するのではなく、プログラムに組み込んで使う方法です。

textlintをインストールする

textlintをインストールします。

npm install --save-dev textlint

textlintで使用するルールをインストールする

使用するルールをインストールします。

npm install --save-dev textlint-rule-max-kanji-continuous-len
npm install --save-dev textlint-rule-preset-ja-spacing
npm install --save-dev textlint-rule-preset-ja-technical-writing
npm install --save-dev textlint-rule-prh

textlintを読み込み

JavaScriptのプログラムから、textlintモジュールを読み込みます。

// index.js
const TextLintEngine = require("textlint").TextLintEngine;

ルールをファイルから読み込む

ルールをファイルから読み込むときは、configFileキーの値にファイルの場所を指定します。

config/.textlintrcファイル

{
  "filters": {},
  "rules": {
    "max-kanji-continuous-len": true,
    "preset-ja-spacing": true,
    "preset-ja-technical-writing": true,
    "prh": {
      "rulePaths": [
        "../node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml"
      ]
    }
  }
}

ルールをconfig/.textlintrcファイルから読み込む。

const options = {
    configFile: 'config/.textlintrc'
};

ルールをコードで設定する

ルールをコードで指定するときは、rulesキーの値に使用するルールを指定し、ルールの設定をrulesConfigの値に設定します。

const options = {
    rules: [
        'max-kanji-continuous-len',
        'prh',
    ],
    rulesConfig: {
        'no-todo': true,
        'max-kanji-continuous-len': true,
        'prh': {
            'rulePaths':[
                'node_modules/prh/prh-rules/media/WEB+DB_PRESS.yml'
            ]
        }
    },
};

ルールプリセットを使用するときは、presetsキーの値に使用するルールプリセットを指定します。

const options = {
    presets: [
        'preset-ja-spacing',
        'preset-ja-technical-writing',
    ],
};

TextLintEngineを作成する

TextLintEngineコンストラクターの引数に設定を指定して、TextLintEngineのインスタンスを作成します。

const engine = new TextLintEngine(options);

チェックする文字列をファイルから読み込む

チェックする文字列をファイルから読み込むときは、TextLintEngineのexecuteOnFilesメソッドの引数にファイルのパスを指定します。

const path = require("path");
const filePath = 'index.txt';
const filePathList = [path.resolve(process.cwd(), filePath)];

const engine = new TextLintEngine(options);
engine.executeOnFiles(filePathList)

チェックする文字列を引数で指定する

チェックする文字列を引数で指定するときは、TextLintEngineのexecuteOnTextメソッドを使用します。

const TEXT = `私の javascript がバグっている
一二三`

const engine = new TextLintEngine(options);
engine.executeOnText(TEXT)

チェックした結果を受け取る

executeOnFilesメソッドやexecuteOnTextメソッドはPromiseを返します。

結果(LintResultの配列)を受け取ったら、isErrorResultsメソッドでエラーの有無を確認します。

エラーがあるときは、formatResultsメソッドで結果を文字列に変換できます。

engine.executeOnText(TEXT)
    .then(function (results) {
        if (engine.isErrorResults(results)) {
            const output = engine.formatResults(results);
            console.log(output);
        } else {
            console.log("All Passed!");
        }
    }).catch(function (error) {
        console.error(error);
    });

KotlinのPairを使う

関数から2つの値を返したいことがあります。
データクラスを作成することもできますが、複数の値を返す関数がたくさんあると煩雑な方法となります。
PairクラスやTripleクラスは、この問題を解決します。

Pair

Pairクラスは2つの値を格納するクラスです。

(参考)「Pair – Kotlin Programming Language

Constructors

data class Pair<out A, out B> : Serializable

次のように使います。

val pair = Pair(1, "x")

Properties

格納されている値を取得するには、firstプロパティとsecondプロパティを使用します。

val pair = Pair(1, "x")
println(pair.first) //=> 1
println(pair.second) //=> x

次のように、変数に割り当てることもできます。

val pair = Pair(1, "x")
val (first, second) = pair
println(first) //=> 1
println(second) //=> x

Infix

Infix関数toを使用して簡単に宣言できます。

fun getPair() : Pair<Int, String> {
    return 1 to "x"
}

val (first, second) = getPair()
println(first) //=> 1
println(second) //=> x

toList

toListメソッドを使うと、Listに変換できます。

(参考)toList – Kotlin Programming Language

val list: List<Any> = Pair(1, "x").toList()
println(list) //=> [1, x]
println(list[0]) //=> 1
println(list[1]) //=> x