コード日進月歩

しんくうの技術的な小話、メモ、つれづれ、など

docker-composeのコンテナ名のデフォルト名は「プロジェクト名-サービス名-インデックス番号」

Version2からルールが変更になったので、そもそもどういう挙動か調べる

挙動確認したバージョン

$ docker-compose --version
Docker Compose version v2.3.3

TL;DR

  • docker-composeで立ち上がるコンテナ名を明示的に指定しない場合 {{プロジェクト名}}-{{サービス名}}-{{インデックス番号}} となる。
  • 「プロジェクト名」は docker-composeの起動オプションで指定可能だが、ない場合は COMPOSE_PROJECT_NAME環境変数が使われる
  • COMPOSE_PROJECT_NAME は格別指定がない場合は起動ディレクトリの文字列が設定される

コンテナ名決定を司るソースコード

デフォルトのコンテナ名は以下のロジックで書かれている

func getContainerName(projectName string, service types.ServiceConfig, number int) string {
    name := strings.Join([]string{projectName, service.Name, strconv.Itoa(number)}, Separator)
    if service.ContainerName != "" {
        name = service.ContainerName
    }
    return name
}

from https://github.com/docker/compose/blob/v2/pkg/compose/convergence.go

明示的に service.ContainerName があればそれが入るが、ない場合は Separator で「プロジェクト名」「サービス名」「引数の番号」となる。このとき引数の番号は1から自動的に採番されるようになっている。

プロジェクト名とは

プロジェクト名は docker-compose -p で指定できるもの。ヘルプでは以下のような記述がある。

-p, --project-name NAME Specify an alternate project name (default: directory name)

ディレクトリ名がデフォルトになるとのことだが、これは環境変数COMPOSE_PROJECT_NAME との兼ね合いで設定されているもので、以下のような説明が公式ドキュメントにある。

この変数を設定するのは任意です。 変数を設定しなかった場合 COMPOSE_PROJECT_NAME のデフォルトは、プロジェクトディレクトリの basename となります。 コマンドラインオプション の -p も参照してください。 - Compose CLI 環境変数 — Docker-docs-ja 19.03 ドキュメント

コンテナ名を指定したい場合

指定したい場合はドキュメントにあるとおり container-name を使うと指定できる。ただし重複したコンテナ名があると立ち上がらないので注意が必要。

container_name: sukina-container-mei

デフォルト名はdocker-composeのv2から変わった

デフォルトのコンテナ名だが、昔は区切りが - ではなく _ であったが、docker-composeのversinが2になるときに変更になっている。

define compose container names with a valid hostname by ndeloof · Pull Request #8655 · docker/compose

これはhostnameとしてコンテナ名が使われるため、hostnameは _ を許容していないのでhostnameとして正しくつかえるようにするための変更だった様子。

関連リンク

サーバのホスト名に使える文字は英字、数字、ハイフンそしてドット

定義の面はわからなかったのでざっくりまとめる。

出典

出典いわく

RFC1123には以下のように記述がある。

正当なインターネットホスト名の構文はRFC952[DNS:4]で規定され、RFC1034のセクション3.5[DNS:1]で繰り返し述べられている。ホスト名構文の一つの側面をここで変更する。先頭文字の制限が緩和され、英字または数字のいずれかであれば許容されるようになる。ホストソフトウェアは、より寛容なこの構文をサポートしなければならない(MUST)。

ここをもとにRFC1034の3.5のセクションを見ると文字列ルールの定義が記載されている。ドメインの定義だが、これがホスト名と同義ということになる。

<domain> ::= <subdomain> | " "
<subdomain> ::= <label> | <subdomain> "." <label>
<label> ::= <letter> [ [ <ldh-str> ] <let-dig> ]
<ldh-str> ::= <let-dig-hyp> | <let-dig-hyp> <ldh-str>
<let-dig-hyp> ::= <let-dig> | "-"
<let-dig> ::= <letter> | <digit>

<letter> ::= 大文字のAからZと小文字のaからzの52文字のアルファベット文字
に含まれる任意の1文字
<digit> ::= 0から9までの10の数字の任意の数字

使える文字

上記のルールにはなっているが使える文字ということで汲み取ると

  • 大文字のAからZと小文字のaからzの52文字のアルファベット文字
  • 0から9までの10パターンの数字
  • . (ドット)
  • - (ハイフン)

ということになる。

使えそうで使えない文字

これを見ると実は _ (アンダースコア,アンダーバー)は使えない、がホスト名においては許容しているケースがいくつかある。詳しくは参考リンクのサイト参照のこと。

参考リンク

「アラインをとる」というビジネス用語の意味をざっくりまとめる

HTMLの text-align が脳裏に出てきて、全然関係ない言葉だと認識するのに労力がかかったので雑にまとめる

利用シーン

「AさんとBさんに例の件はアラインしている?」

意味

本来のalignの意味は以下の通り

1.〔~を〕一直線[平行]にする[並べる] 2.〔部品などを〕調整する、調節する 3.〔大義や方針で~を〕同じ立場に置く、提携させる - alignの意味・使い方・読み方|英辞郎 on the WEB

1の意味のニュアンスである「直線に並べる」というところから転じて「揃える」という意味合いがあり、「認識を揃える」という意味で使われるケースがおおい。そのため日本語に置き換えると「アラインしている」は「認識が揃っている」、「アラインを取る」は「認識を揃える」という置き換えで認識するとニュアンスとしては合致する。

参考サイト

JavaScriptにおいてイベントハンドラに何もしないダミー関数を入れる意味と効果

Reactハンズオンラーニングを読んでいてなるほどなーと思ったのでメモ

コード例

Reactでクリックイベントを付与したオブジェクトを作る関数を作るとする

function makeClickableButton(onClickEventFunction = f => f){
  return ( <button onClick={onClickEventFunction} >this is demo button</button>)
}

f => f という形で一見すると意味のない初期値をいれるような記述が今回取り上げたい話題

どういう嬉しい効果があるのか

このような書き方にすると「引数に何もセットしなくてもエラーにならない」というのが嬉しいポイント。

仮に onClick などに undefined がセットされてしまうと、クリックするとJavaScriptのバージョンによってはでエラーが上がってしまう懸念がある。そのため、必ず何かしら関数が入るようにしておきたい。特にクリック時のイベントに関して何もセットしたくないがコンポーネント自体は出したいときなどに makeClickableButton() と呼んでも問題ない形になる。

また、 undefined の変数が来ても、中身としてエラーにはならないので、防護壁の一枚としても機能する。

記事に起こした際の余談

Reactハンズオン第2版の記述をもとに検証してみたが、実際のところ直近のブラウザではonClickイベントにundefinedなものを設定してもエラーにならないので、どこかしらのバージョンで対策がされている可能性があります。

参考

JavaScriptのデフォルト引数はundefinedを渡した場合でもデフォルト引数を入れてくれる

なるほど、と思ったのでメモ

前提

この仕様はECMA2015からの仕様です、IE11などでは動かない話なのでお気をつけください。

今回着目したいコード

引数に何も設定されていないときに代わりの値として入るデフォルト引数を書く場合の関数を考える

function test(x = 1, y = 1) {
  console.log(`${x} , ${y}`)
}

通常の動き

引数が何も設定されていないとデフォルト引数が使われる

test()
// 1 , 1

test(100)
// 100 , 1

let setVal = 30
test(setVal,20)
// 30 , 20

undefinedな値を引数に使う場合の動き

引数にundefined相当のものがセットされると、undefinedが入らずデフォルト引数の値が入る

test(undefined,100)
// 1 . 100


let nonSetVal
test(20,nonSetVal)
// 20 , 1

参考リンク

Web開発でも使われるトルツメ、トルママ、イキに関してざっくりまとめる

仕様の検討をしているときに、言葉尻としては意味がぼんやりわかるが、認識されていないことがあるのでざっくりまとめる

そもそも「トルツメ」「トルママ」とは

印刷物の現行の誤りを修正する校正作業において、修正箇所の記述をするための「校正記号」というものがある。この校正記号を標準化したJIS規格として JIS Z 8208 として定義されている。その中において、トルツメやママという表現をつかっているため、そちらが原典となる。

それぞれの規格上の意味

JIS規格の記述を引用して簡単に説明をする

トルツメ

文字を「削除して埋める」というときに対象となる文字に線を引くなどして、そこに併記する形で「トルツメ」と記述する形で使用する。「トル」とだけ書く場合もある。

トルママ

文字を「削除し、削除した部分をそのまま空白にする」というときに対象となる文字に線を引くなどして、そこに併記する形で「トルママ」と記述する形で使用する。「トルアキ」と記載する場合もある。

イキ

修正の記述の記載を行ったのちに、当該修正が不要となったときに修正そのものを取り消すことを表現するために「イキ」と記載を行う。

Webのデザインにおいての所感

Web開発の世界においてもこれらの言葉を耳にすることは多く、概ね校正用語とほぼ同等の意味で使われることが多いと思われる。(こちらは出典があるわけではなく筆者体感)

主な使われ方としてはHTMLの構成要素として削って欲しい場合に「トルツメ」という表現をすることが多いように見受けられ、HTMLのレンダリングの動きとして該当のDOM要素記述を削ると該当要素がが抜けて他の要素が詰まる形になるためその親和性の高さも重なり使われているように思われる。

なお、「イキ」に関しては校正用語と同じニュアンスで「修正をキャンセルしてそのままで問題ない」という意図で使われることが多いイメージ。

参考リンク

JavaScriptの二重のアロー演算子を使ったカリー化がわかりにくいので分解して理解する

読んでいてたまにわからなくなるタイミングがあるので記憶を呼び起こすためのメモ

カリー化とは

Wikipedia曰く以下のようなことをカリー化としている。

カリー化 (currying, カリー化された=curried) とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること(あるいはその関数のこと)である。 - カリー化 - Wikipedia

実際にカリー化でやりたいことは「引数が複数ある関数において、個々の引数を固定した関数をつくる」ということである。

// ベースの値を足す値と引く値をセットするメソッド
let normalFunction = (baseNumber, addNumber, subtractNumber) => {
  console.log(baseNumber + addNumber - subtractNumber);
};

// ベースの値を固定して、他の値は引数としてとるfunctionを作る(これはカリー化とは言わず部分適用と呼ばれる)
let fixBaseFunction = (baseNumber) => {
  return (inAddNumber, inSubtractNumber) => normalFunction(baseNumber , inAddNumber , inSubtractNumber);
};

let base100Function = fixBaseFunction(100)

// 以下は同じ意味
normalFunction(100,20,30);
fixBaseFunction(100)(20,30);
base100Function(20,30);


// 似た形ですべての引数を単独の引数の形に変形する、これがカリー化
let curriedFunction = (inBaseNumber) => {
  return (inAddNumber) => {
    return (inSubtractNumber) => {
      normalFunction(inBaseNumber , inAddNumber , inSubtractNumber);
    };
  };
};

// 他のfunctionと同じ結果となる
curriedFunction(100)(20)(30);

このようにカリー化を行うと「baseNumberだけ100で大体固定なんだけどな…」のようなシーンに100で固定した関数を作り出して渡すということが可能になる。

なお、カリー化は引数を1つずつ分割することを意味し、部分的に引数を分割すること(上記の例で言う fixBaseFunction )は「部分適用」と呼ばれる。

アロー演算子を二重に使ってカリー化をする

カリー化をとても雑にいうと「引数を複数持つ関数を引数を一つずつ取る形に分割する」ということなので、それをアロー演算子を重ねて使うとかんたんに実現できる

let originalFunction = (x, y) => {
  return x - y;
};


let curriedFunction = (x) => {
  return (y) => {
    return x - y;
  };
};

let arrowCurriedFunction = (x) => (y) => {
  return x - y;
};

let minimumArrowCurriedFunction = x => y => x - y;

参考サイト