社内se × プログラマ × ビッグデータ

プログラミングなどITに興味があります。

docker-compose 環境ファイル .env

docker-compose では、.env という環境ファイルを通して、デフォルトの環境変数を定義できる。
http://docs.docker.jp/compose/env-file.html

たとえば、mysql の docker コンテナを docker-compose で構築しようとしている場合、以下のような .env ファイルを用意しておけば、docker-compose.yml 内で実行時に自動的に置き換えられる。

.env

DB_NAME=bluesky
DB_USER=blueskyarea
DB_PASS=area
DB_PORT=13306
TZ=Asia/Tokyo

docker-compose.yml

version: "3"
services:
  mysql-db:
    image: mysql:8.0
    environment:
      - MYSQL_DATABASE=${DB_NAME}
      - MYSQL_USER=${DB_USER}
      - MYSQL_PASSWORD=${DB_PASS}
      - MYSQL_ROOT_PASSWORD=${DB_PASS}
      - TZ=${TZ}
    ports:
      - ${DB_PORT}:3306

正規表現での実例パート1

1. Java Integer の変数名を含む行にマッチさせる
src 内にあるすべてのファイルを検索させている。

$ egrep -hr 'p(rivate|ublic|rotect) +Integer +[a-zA-Z_0-9]+' src
	private Integer speed;
		private Integer speed;
	public Integer generateNumber() {
	public Integer getAverage() {
	private Integer price;
	private Integer reviewNum;
	public Integer getPrice() {
	public Integer getReviewNum() {
		private Integer sales;
		public Integer getSales() {

2. ダブルクォートで囲まれた文字列を含む行にマッチさせる
[^"]* は”ダブルクォート以外の文字列”を表現している。

$ egrep -hr '"[^"]*"' src
		Member member = new Member(1, "hoge");
		PointCard pointCard = new PointCard(1, "hoge", 2000L);
		assertTrue(wb.getMessage().equals("This is example."));
		Whitebox.setInternalState(wb, "message", "overwritten the message.");
		assertTrue(wb.getMessage().equals("overwritten the message."));
		assertThat(memberMock.getMemberNameAndPoint(), is("hoge_7777"));
		when(birthMonth.getBirthStone(anyInt())).thenReturn("not found");
		when(birthMonth.getBirthStone(2)).thenReturn("amethyst");
		when(birthMonth.getBirthStone(7)).thenReturn("ruby");
		when(birthMonth.getBirthStone(11)).thenReturn("topaz");

3. ドル金額のみが含まれる行にマッチさせる
以下のようなテキスト(text.txt)があるとする。

082
1040.2
$56
23
$8.11
$abc
$77.7 in total

^..$ で囲んでいるため、"$77.7 in total" はマッチ対象にならない。

$ egrep -i '^\$[0-9]+(.[0-9]+)?$' text.txt 
$56
$8.11

重複 typo を正規表現の後方参照でチェック

以下のように、不要な重複が含まれるテキスト (typo.txt) があるとする。

A typo is a mistake made in the typing process.
A typo typo is a mistake made in the typing process.
A typo is a a mistake made in the typing process.
A typo is a mistake made in in the typing process.

このテキストに対して、以下のコマンドを使えば重複部分をピックアップすることができる。
※ただし、同じ行内で重複している場合のみ

$ egrep -i '\<([a-z]+) +\1\>' typo.txt

A typo typo is a mistake made in the typing process.
A typo is a a mistake made in the typing process.
A typo is a mistake made in in the typing process.

正規表現 HTML <HR> を例にいろいろマッチ

以下の3行が含まれるテキスト hr.txt があるとする。

# hr.txt
<HR SIZE=16>
<HR SIZE=16 >
<HR SIZE=8>
<HR>
<HR SIZE=16> にマッチさせるには?

HRとSIZEの間に1つ分の空白スペースを設けるために、+ を使う。

$ egrep -i '<HR +SIZE=16>' hr.txt
<HR SIZE=16>
<HR SIZE=16 > にもマッチさせるには?

16の後に0個以上の空白スペースを設けるために、* を使う。

$ egrep -i '<HR +SIZE=16> *' hr.txt
<HR SIZE=16>
<HR SIZE=16 >
<HR SIZE=8> にもマッチさせるには?

1桁以上の数値にマッチさせるため、[0-9]+ を使う。

$ egrep -i '<HR +SIZE=[0-9]+ *>' hr.txt
<HR SIZE=16>
<HR SIZE=16 >
<HR SIZE=8>
<HR> にもマッチさせるには?

<HR> 以外の部分については、オプション扱いにするため、()? を使う。

$ egrep -i '<HR( +SIZE=[0-9]+ *)?>' hr.txt
<HR SIZE=16>
<HR SIZE=16 >
<HR SIZE=8>
<HR>

正規表現で単語でマッチ

以下のようなテキストがあった場合。

My name is blue. I like mystery.

普通に "my" でマッチさせようとすると、"My" と "mystery" がマッチする。

egrep -i 'my' words.txt

もし、”My" だけをマッチさせたい場合は、\< \> のメタ文字が使える。

egrep -i '\<my\>' words.txt

正規表現を使うなら、ターゲットテキストをよく理解する

2019年11月15日を表現する場合、以下のように色々なパターンが考えられる。

file.txt

2019/11/15
2019-11-15
2019 11/15

これらを含む行を正規表現で検索するとなった場合、どのような方法があるか。

$ egrep '2019[-/" "]11[-/" "]14' file.txt
2019/11/14
2019-11-14
2019 11/14

このように考えられうる文字を直接指定することができるが、見た目があまりよくない。

そこでもし、このテキストには似たようなパターンしか存在しないことが理解できていれば
以下のようにシンプルな正規表現でマッチさせることも可能。

$ egrep '2019.11.14' file.txt
2019/11/14
2019-11-14
2019 11/14

以下のような文字列までマッチしてしまうことになるが、このような文字列は存在しないことが予め分かっていれば気にする必要がない。
2019511314

正規表現の解釈について

文字どおりに解釈する習慣を身につけるべきらしい

以下の正規表現を見てみると

^cat

”行頭が cat の行にマッチする”と解釈できる。

ただ、文字どおりに解釈すると

”行頭がある場合、その次が c その次が a その次が t になっている行にマッチする” となる。

では、以下の3つの本質的な意味は何になるのだろう?

^cat$
^$
^

というのを考えることで、正規表現の本質的な意味を理解するトレーニングになる気がする。