Monors Note

Pythonとそれ以外いろいろ

Dockerによるアプリケーション開発環境構築ガイド

Dcokerによる基本的なコマンド

Dockerコマンドのシーン毎の利用例

1. Dockerイメーシを取得しRunする。 - docker imageをpullする。 docker pull - imageからconteinerをrunする。 docker run -d //demon化 -it //擬似TTY --name hoge ubuntu:16.04 bash

2.ターミナルからphpをインストールして、新しいイメージを作成する。 - 1で起動したコンテナに入る。docker exec -it //擬似TTYで接続します。(Docker内でコマンドの実行のみをしたい場合は不要?) hoge bash - 起動したコンテナで色々作業をする。 - 上記の操作を反映したコンテナのイメージをcommitで作成する。docker commit hoge - 作成したdocker imageにtagをつける。docker tag [作成されたID] smpledokcer1234/ubuntu_with_php:1_0

<疑問> docker run -it <- itってなんで必要なの? <答え> 作成したDcokerの標準入出力を中継してくれる擬似的なTTYというものを作成する。 これを指定しないと、docker exec -it hoge bashなどしても the input device is not a TTYと言われて怒られる。

3.作成したイメージをファイルに出力して、一度手元から消した後にファイルを読み込んで復元 - imageをファイルに保存する。docker save -o /tmp/ubuntu_with_1_0 sampbledocker1234/ubuntu_with_php:1_0 - imageを一旦消す。 docker irm sampledocker1234/ubuntu_with_php:1_0 - loadコナンをを用いてファイルの読み込みを行う。docker load < /tmp/ubuntu_with_php_1_0

4.ローカルファイルをコンテナにコピー、逆にコンテナのファイルをローカルにコピーする - ローカルマシーンのファイルをDockerにコピーする。touch samplefile | docker cp samplefile [dockerID] - Dockerコンテナのファイルをローカルにコピーします。docker cp [dockerID]:samplefile /temp/

DockerfileでオリジナルのDcokerを作成する。

Docker CommitではOriginalのDocker Imageを元に任意の処理を行ったのちに、Imageを作成する事ができました。 しかし、この方法ではどのImageを使用してどの様な操作を行ったのかを後から確認するには大変です。 どのため、Dockerにはdocker buildというDcokerfileというファイルで定義した一連の手続きをコンテナイメージを作成する仕組みです。

Dockerfileとは

Dcokerfileには下記を指定する事が可能です。 - Dcokerイメージの指定 - 必要なパッケージのインストール - ファイルやディレクトリのコンテナ内のコピー - ユーザアカウントの作成や任意のコマンドの実行

Dockerfileで使用できるコマンド

Dockerfileを記述するのに最低限必要なコマンドは下記の通りです。

コマンド 意味
FROM ベースとなるDockerイメージを指定するコマンド
ENV 環境変数を設定するためのコマンド
ARG buildをする際に利用する引数を定義するコマンド。
デフォルト値を持つ事もできる。
buildコマンドからは--build-agesオプションにより利用する。
LABEL Dockerイメージにメタデータを付与するためのコマンド
RUM shellの実行を行うためのコマンド
SHELL デフォルトのコマンドを設定するためのコマンド
WORKDIR 起点となるディレクトリを変更するためのコマンド。
この設定を行うとRUN, CMD, ENTRYPOINT COPY, ADDのコマンドで相対パスが使われた時はそのデフォルトを起点として解釈される。
ADD ファイルやディレクトリおよび指定されたURLリソースをコンテナの指定されたパスに対してコピーするコマンド。
圧縮されている場合は解凍されてコピーされる。
COPY ADDの解凍されずにcopyされる版
EXPOSE コンテナがlistenするポート番号明示するためのコマンド。
あくまでも明示的に宣言するだけで実際に宣言しないとポートが開かない訳は無い。
ただし、実行時には正しく-pオプションにsてdockerホストとのポートを接続する必要はある。
ENTRYPOINT コンテナ起動時に事項するコマンドを指定するコマンド
CMD ENTRYPOINTと同じ

dockerでのポート

Docker内部にアプリをインストールした場合、そのアプリに対して通信を行う必要が出てくる。 この様な場合、docker内部のアプリと通信を可能にするために、ポートを設定する必要がある。

ポートの指定はdocker run -p [hostのIPを指定(ex: localhost)]:[host側のポートを指定]:[Docker側のポートを指定]を使用すれば可能です。

例えば、ホスト側の80ポートに対してDockerの80ポートをバインドしたい場合は下記の通り設定を行う。

▶︎入力

docker run -d -p 80:80 sample:nginx

▶︎出力

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS                      PORTS                                                                                       NAMES
4fb9e407daa6        sample:nginx            "nginx -g 'daemon of…"   7 hours ago         Up 7 hours                  0.0.0.0:80->80/tcp 

(追記予定)

※「Dockerによるアプリケーション開発環境構築ガイド」を読んで内容を自分なりにまとめたものです。

Amazon CAPTCHA

dockerでMysql コンテナを起動する。

dockerコンテナでポート3306でMYSQL:5.7を起動する。

docker run -itd --name develop-mysql-orderqr -e MYSQL_ALLOW_EMPTY_PASSWORD=true -e MYSQL_ROOT_PASSWORD='' -p 3306:3306 mysql:5.7

また、MySqlにターミナル上から接続したい場合 mysql -u root -h 127.0.0.1 -P 3306

と入力する。

【KanBan】今後の方針

Productを作成していかないとやばいとひしひしと感じてきたので、ProductChallengeと称して何かを作成していきたいと思う。

第一弾はKanBanアプリの作成を行う。Webアプリとしてデプロイまで持っていければ良いと思っている。

やりたい事(ざっくりと)

  • Trel●●をパク、、真似て作成する。(ユースケース、UIを考えるのを省略したいため)
  • Vue.js + SpringBootで作成する。
  • CI環境の作成もしっかり行いたい。

AtCorder:ABC102:B問題

問題

beta.atcoder.jp

方針

回答

a, b, c, d = map(int, input().split())

x ,y = c - a, d - b
print(c - y, d + x, a - y , b + x)

感想

初めての問題だったため解けなかったが、回転行列とわかればそうでもなかった。 次は普通に解こう。

"error: There was a problem with the editor 'vi'."(git)

何が起きた?

gitで下記エラーが発生した。

gitで"error: There was a problem with the editor 'vi'."

これはどうやら、viとvimが競合しているから発生するエラーの様だ。 gitの設定でエディターの設定をvimにしていすれば解決する。

git config --global core.editer vim

設定を確認するには、下記コマンドを使用する。

less ~/.gitconfig

lessコマンド

www.atmarkit.co.jp

参考

qiita.com

PythonでのEnumクラスの使用方法

Enum型ってなんのためにあるの状態だったのですが、かなり便利なことに気が付いたのでまとめます。

値クラスの作成をしたはいいが、不具合が多くてもっといい方法はないかを探したのがきっかけです。 (環境はPython 3.5.2です。)

最初に作成した値クラスは以下の通り。

class Pos(object):
    def __init__(self): raise AttributeError('this instance is not able to embody')
        
    NOUN = '名詞'
    VERB = '動詞'
    PARTICLE = '助詞'
    ADJECTIVE = '形容詞'

しかし、この方法では Pos.NOUN = '猫'でクラス属性の書き換えが可能です。 これらをいじって堅牢な定数クラスを作成するのは骨が折れそうです。

Enum型の導入

これら問題を簡単に解決する標準ライブラリがPythonにはあるようです。 また、Effective Javaでも上記の様な型クラスを作成せず、Enum型を使用することが推奨されています。 (項目30: int定数の代わりにenumを使用する)

Enum型を用いる利点

Enum型を用いる利点は以下の通りです。

  • コンパイル時に代入された値に変換されないので、デバック時に分かりやすい。
  • 異なるEnum型を比較しようとするとコンパイルエラーとなる。

Enumの使い方

Python 3.4 から標準ライブラリに入る Enum 型が今からでも便利 - Qiitaを参考に使い方をまとめます。 (IntEnumに関しては省略しています。)

enumモジュール内のEnumクラスを使用します。呼び出し方法は3種類で可能ですが、下記の方法では内部の値が何なのかは覗けません。

from enum import Enum

class Hoo(Enum):
    NOUN = '名詞'
    VERB = '動詞'
    PARTICLE = '助詞'
    ADJECTIVE = '形容詞'
    NOUNS = '名詞'

# 3つの方法でアクセス可能
## 属性
print(Hoo.NOUN ) # Hoo.NOUN

## キーワードを指定した呼び出し
print(Hoo('名詞')) # Hoo.NOUN

## 添え字
print(Hoo['NOUN']) # Hoo.NOUN

値を覗くにはnamevalue属性を使用します。

Hoo.NOUN.name # 名詞

Hoo.NOUN.value # NOUN

値クラスで問題だった値の再代入を行った場合はエラーとなります。

Hoo.NEKO = '猫' # AttributeError: Cannot reassign members.

ただし、同値比較はenum型同士しか行えません。

print(Hoo.NOUN == '名詞') # False
print(Hoo.NOUN == 'NOUN') # False

gitでbranchも含めてtree構造を出す

gitを使っていてbranchも含めてtree構造に出来ればなと思い、調べてみた。 標準のgitに機能が含まれていました。 (参考:gitのrebaseとremoteとbranchと - 日々常々

gitのバージョン

git version 2.9.0.windows.1

branchの構造

masterbugFixの2つのブランチがある。

$ git branch -a
  bugFix
* master

コマンド

$git log --graph --decorate --oneline --all
* 280350c (HEAD -> master) bbbb.txt is modigied
| * 1f8ab7a (bugFix) aaaa.txt is bugFixed
|/
* cd668e3 maked master

git logはlogを見るためのコマンド。

オプションの説明

--graph

logのグラフ化が可能

$ git log --graph
* commit 280350c6abd5fcd5f6713b7dce9736f7141c233e
| Author: user
| Date:   Tue May 1 23:49:29 2018 +0900
|
|     bbbb.txt is modigied
|
* commit cd668e39ad2c4fa3d4bc1108d1ad66567366e1eb
  Author: user
  Date:   Tue May 1 23:40:52 2018 +0900

      maked master

--oneline

ハッシュ値(一意に決まる部分まで)コメントだけのシンプルフォーマットに変換

$ git log --oneline
280350c bbbb.txt is modigied
cd668e3 maked master

--all

全てのブランチを表示する。これがないとheadの場所のlogが表示されるだけ。

commit 280350c6abd5fcd5f6713b7dce9736f7141c233e
Author: user
Date:   Tue May 1 23:49:29 2018 +0900

    bbbb.txt is modigied

commit 1f8ab7a76000ba31e6e4c99d396d624671cacf67
Author: user
Date:   Tue May 1 23:45:34 2018 +0900

    aaaa.txt is bugFixed

commit cd668e39ad2c4fa3d4bc1108d1ad66567366e1eb
Author: user
Date:   Tue May 1 23:40:52 2018 +0900

    maked master

--decorate

(HEAD -> master)など、ブランチの親子関係が表示される。

commit 280350c6abd5fcd5f6713b7dce9736f7141c233e (HEAD -> master)
Author: user
Date:   Tue May 1 23:49:29 2018 +0900

    bbbb.txt is modigied

commit cd668e39ad2c4fa3d4bc1108d1ad66567366e1eb
Author: user
Date:   Tue May 1 23:40:52 2018 +0900

    maked master