すくすくすくらっぷ

とりあえずすくらっぷ

DockerでPythonの環境構築を行う(Windows10 Home編)

前回はMac上にDockerの環境構築を行い、DockerFileからPython3.x系が実行できるコンテナを作成しました。

今回は、Windows10 Homeのマシン上に同じくDockerの環境構築を行い、Dockerfileを使ってPython3.x系が実行できるコンテナの作成を行います。

Dockerのインストール

Windows 10 Homeの場合だとDocker for Windows(Hyper-V)が利用できないため、 代わりにDocker Toolboxをインストールします。

Windows 10 Homeな方はこちらから
https://github.com/docker/toolbox/release

インストーラの通り進めると、3つのアイコンがデスクトップに現れます。 f:id:blauthree:20190727232704p:plain

一番下の「Docker Quickstart Terminal」をダブルクリックします。

何度か変更の許可を求めるダイアログが出てくるので「許可」を選択します。

しばらく待つと下のような画面になり、Dockerコマンドが使用可能になります。 f:id:blauthree:20190727233402p:plain

$ docker version
Client:
 Version:           18.09.3
 API version:       1.39
 Go version:        go1.12
 Git commit:        774a1f4eee
 Built:             Mon Mar  4 10:36:44 2019
 OS/Arch:           windows/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.0
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       aeac9490dc
  Built:            Wed Jul 17 18:22:15 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          v1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

次に、前回作成したDockerfileを使ってイメージとコンテナを作成します。

Dockerfileがある場所まで移動し、以下のコマンドを実行します。

$> docker build .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:18.04
18.04: Pulling from library/ubuntu
5b7339215d1d: Pull complete
14ca88e9f672: Pull complete
a31c3b1caad4: Pull complete
b054a26005b7: Pull complete
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:18.04
 ---> 4c108a37151f
Step 2/4 : RUN apt-get update
 ---> Running in 65165292f804
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [725 kB]
...
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from cycler>=0.10->matplotlib)
Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from kiwisolver>=1.0.1->matplotlib)
Installing collected packages: numpy, cycler, python-dateutil, pyparsing, kiwisolver, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.1.0 matplotlib-3.1.1 numpy-1.16.4 pyparsing-2.4.1 python-dateutil-2.8.0
Removing intermediate container 3deddb4c1414
 ---> b6337a07e65e
Successfully built b6337a07e65e
SECURITY WARNING: You are building a Docker image from Windows against a non-Windows Docker host. All files and directories added to build context will have '-rwxr-xr-x' permissions. It is recommended to double check and reset permissions for sensitive files and directories.

下のほうにWindowsからWindows以外のホストを作成すると、パーミッションがこんな感じになるよ的な警告が書かれていますがそのまま続けます。

作ったイメージをdocker imageで確認します。

$> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              b6337a07e65e        9 minutes ago       605MB
ubuntu              18.04               4c108a37151f        4 weeks ago         64.2MB

IMAGE IDが「b6337a07e65e」のものが作成したイメージになります。

イメージには特に名前がないためIMAGE IDで指定してコンテナを作成します。

$> docker run -it -d --name ubuntu_py3 b6337a07e65e
ae058a43a5529f26ac1b48aa289e81807dc39e51f35421dc174b45017014d63b
$> docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ae058a43a552        b6337a07e65e        "/bin/bash"         50 seconds ago      Up 45 seconds                           ubuntu_py3

指定した名前でコンテナができました。コンテナの中に入ります。

$> docker exec -it ubuntu_py3 /bin/bash
root@ae058a43a552:/#
root@ae058a43a552:/# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
>>> import numpy
>>> import matplotlib
>>> exit()
root@ae058a43a552:/#

前回と同様にPythonの入ったコンテナを作成することができました。

DockerでPythonの環境構築を行う

仕事でDockerを使う機会があったのですが、あまり馴染みがなかったので使い方を調べることにしました。 試しにPython3.xの環境構築を行ってみます。

Dockerのインストール

WindowsならDocker for WindowsMacならDocker for Macとわかりやすいですね。
ただし、Windows 10 Homeの場合だとDocker for Windows(Hyper-V)が利用できないため、 代わりにDocker Toolboxというものをインストールする必要があります。

今回はMacで行いますが、Windowsでも同様に動かせると思います。 Docker自体はすでにインストール済みだったためアップデートをして完了しましたが、
新規インストールの場合でも基本的にはインストーラに従えばOKだと思います。

Docker for Mac(Windows)はこちらからインストーラをダウンロードできます。
https://www.docker.com/products/docker-desktop

Windows 10 Homeな方はこちらから
https://github.com/docker/toolbox/release

DockerでのPython環境構築

まずはDockerを起動します。
するとこんなアイコンが出てきて、もそもそと動きます。
これが止まるとDockerの起動完了です。
Windowsであれば画面右下あたりに同じアイコンがいるはずです。 f:id:blauthree:20190712234202p:plain

ターミナルを起動し、以下のコマンドを実行してこんな結果になればOKです。

$>docker version
Client: Docker Engine - Community
 Version:           18.09.2
 API version:       1.39
 Go version:        go1.10.8
 Git commit:        6247962
 Built:             Sun Feb 10 04:12:39 2019
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.2
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.10.6
  Git commit:       6247962
  Built:            Sun Feb 10 04:13:06 2019
  OS/Arch:          linux/amd64
  Experimental:     true

次にDockerのイメージを取得します。
docker search でdocker hubで共有されている作成済みイメージを検索できるようです。
検索に引っかかればそのイメージを使うことができます。

$>docker search python3
NAME                                  DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
sellpy/python3-jupyter-sklearn        python3-jupyter-sklearn                         4                                       [OK]
openwhisk/python3action               Apache OpenWhisk runtime for Python 3 Actions   4                                       
kuralabs/python3-dev                  Python 3 ready container to build Python pro…   3                                       [OK]
clutteredcode/python3-alpine-pandas   Python3 with pandas based on alpine             2                                       [OK]
sellpy/python3-jupyter-sklearn-java   python3-jupyter-sklearn-java                    2                                       [OK]
codenvy/python34                      Dockerfile:https://github.com/codenvy/docker…   1                                       
sellpy/python3-gphoto2                Python3, Gphoto2                                1                                       [OK]
tedder42/python3-scipy-cron           .                                               1                                       [OK]
brumbrum/python3                      Immagine contenente python3                     1                                       [OK]
... 以下略 ...                                                                                   

いっぱいあんなおい・・・どれ選べばいいんだよ・・・

ということでUbuntuのイメージを取得してPython3をインストールすることにしました。
LTS版であるUbuntu 18.04をインストールします。

$>docker pull ubuntu:18.04 
18.04: Pulling from library/ubuntu
5b7339215d1d: Pull complete 
14ca88e9f672: Pull complete 
a31c3b1caad4: Pull complete 
b054a26005b7: Pull complete 
Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c
Status: Downloaded newer image for ubuntu:18.04

docker imagesで取得したDockerイメージの一覧を表示できます。

$>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              18.04               4c108a37151f        3 weeks ago         64.2MB

さっそくUbuntuを動かしてみます。以下コマンドでDockerコンテナの作成&起動が行われます。

$>docker run -it -d --name ubuntu18.04 ubuntu:18.04
aa320e5db96d9ead4c8e1a4b1194373c5353b90a90cbd86e8e4e71ad9f71b732

各オプションは以下のような感じです。

オプション 動作
-it ターミナルで操作可能に
-d バックグラウンド実行
--name コンテナに名前をつける

なんか長い文字列が出れば成功です。これはコンテナIDとなります。
docker psとすると、起動しているコンテナが表示されます。
ここで先程表示されたコンテナIDの一部が表示されているはずです。

$>docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
aa320e5db96d        ubuntu:18.04        "/bin/bash"         2 minutes ago       Up 2 minutes                            ubuntu18.04

あとはdocker execコマンドでDockerのUbuntuにログインすることができます。
ちなみにこの時点ではインストールされていないため、Python3は実行できません。

$>docker exec -it ubuntu18.04 /bin/bash
root@aa320e5db96d:/# 
root@aa320e5db96d:/# python3
bash: python3: command not found

apt-get updateしてから、Python3とpython3-pipをインストールします。
python3コマンドで実行できたらOK。

root@aa320e5db96d:/# apt-get update
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/multiverse amd64 Packages [4172 B]
...
root@aa320e5db96d:/# apt-get install -y python3 python3-pip
...
root@aa320e5db96d:/# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 

pip3でNumpy, Matplotlibをインストールします。
importでエラーが出なければ成功です。
exitでログアウトします。

root@aa320e5db96d:/# pip3 install numpy matplotlib
root@aa320e5db96d:/# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34) 
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> import matplotlib
>>> exit()
root@aa320e5db96d:/# exit

もとのターミナルに戻る場合は、docker stopでコンテナを停止させます。

$>docker stop ubuntu18.04
ubuntu18.04

DockerFileを作る

Pythonが実行できるところまでは確認できたので、次は別マシンでも動かせるようにします。
調べてみるとDockerFileというものを作ることで、環境構築をスムーズに行うことができるようです。手順書みたいですね。
ググった情報とMac上で動かした情報をもとにDockerfileを作ってみました。

# ベースとなるイメージ
FROM ubuntu:18.04

# RUNでコンテナ生成時に実行する
RUN apt-get update
RUN apt-get install -y python3 python3-pip
RUN pip3 install numpy matplotlib

以下コマンドでDockerfileからPython3, pi3のインストールをしてくれます。

$>docker build .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM ubuntu:18.04
 ---> 4c108a37151f
Step 2/4 : RUN apt-get update
 ---> Running in 85954746378d
Get:1 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:2 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/main amd64 Packages [578 kB]
Get:4 http://archive.ubuntu.com/ubuntu 
...
197f63eae486eca2c35dcd334bab75ad524e0de1/kiwisolver-1.1.0-cp36-cp36m-manylinux1_x86_64.whl (90kB)
Requirement already satisfied: six in /usr/lib/python3/dist-packages (from cycler>=0.10->matplotlib)
Requirement already satisfied: setuptools in /usr/lib/python3/dist-packages (from kiwisolver>=1.0.1->matplotlib)
Installing collected packages: numpy, cycler, python-dateutil, pyparsing, kiwisolver, matplotlib
Successfully installed cycler-0.10.0 kiwisolver-1.1.0 matplotlib-3.1.1 numpy-1.16.4 pyparsing-2.4.0 python-dateutil-2.8.0
Removing intermediate container 4a4fcaf63749
 ---> 028e80075d12
Successfully built 028e80075d12

docker imagesを実行すると、イメージが追加されていることがわかります。
作成したイメージからコンテナの作成を行うと、Python3の環境構築が完了した状態で起動することができます。

$>docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              028e80075d12        49 seconds ago      605MB
ubuntu              18.04               4c108a37151f        3 weeks ago         64.2MB

いったんここまで。次はWindowsマシンに環境構築をしたいと思います。

Raspberry Pi 3.5 インチモニタがコンソール起動時のみ固まる

先日、AmazonでKumanというメーカーから出ている3. 5インチディスプレイを買ったのですが、少しハマったのでメモします。

Raspberry Piで使うにはドライバを入れる必要があります。
最初は、説明書にある通り以下のドライバからインストールしました。

github.com

デスクトップモードで起動するようにするとうまく動くのですが、コンソールのみで起動したときに画面が固まったままとなってしまいました。
何度か再インストールしたものの変わらず。(sshが繋がるのは助かりました・・・)

調べてみると、似たようなドライバがあるようでそちらからインストールするとうまくいきました。

github.com 更新日付も2019/5/22時点では後者のほうが新しいようです。

Raspbianのバージョンとかも関係しそうですが、なにか不具合があったらwaveshareのものをインストールするとうまくいくかもしれないですね。

Electronでパスワード生成アプリを作ってみる 4 (パスワードの強度をチェックする)

前回の続きです。
blauthree.hatenablog.com

見た目はともかくとして、パスワード生成アプリっぽくなってきました。 今回は、生成したパスワードの強度をチェックしたいと思います。

「パスワード 強度 チェック javascript」で検索してみると、
「zxcvbn」というライブラリを発見。
どうやらDropbox社が公開したMITライセンスのライブラリみたいですね。
これを使ってみたいと思います。

https://github.com/dropbox/zxcvbn

導入としては、githubにあるManual Installationに従います。
index.htmlと同じ階層にzxcvbn.jsを置いて、head部に以下のコードを追加。

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <!-- ここに追加 -->
  <script type="text/javascript" src="zxcvbn.js"></script>
  <title>Electron-Password</title>
</head>

次にjs部分で判定の結果を表示させます。
zxcvbn(password)でパスワードの情報を格納したobjectを返すようです。
scoreで強度に応じた結果(0~4)を返すのでそれに対応した文字列を返します。

generatePassword()では、パスワードとその強度判定結果をalertに表示させています。

function generatePassword() {
    var length = document.getElementById("passLength").value; // テキストボックスの値を取得
    var pw = "";

    for (var i=0; i < length; i++) {
        pw += randomChar();
    }

    // アラートでパスワードと強度の判定結果を出力
    var message = pw + "\r\n";
    message += "強度: " + checkPassword(pw);
    alert(message);
    return pw;
}

/**
 * zxcvbnでパスワード強度を判定する
 * @param {} password 
 */
function checkPassword(password) {
    var result = ["弱い", "そこそこ弱い", "中", "そこそこ強い", "強い"];
    // zxcvbnで判定し、resultにある文言を返す
    var score = zxcvbn(password).score;
    return result[score];
}

以下は実行結果です。

3文字Ver f:id:blauthree:20180628231813p:plain

9文字Ver f:id:blauthree:20180628231842p:plain

13文字Ver f:id:blauthree:20180628231933p:plain

それぞれ結果が変わっていることがわかります。

ここまで実装したコードをgithubにアップしてみました。 github.com

今度はデザインとかもそれっぽいアプリを何か作ることを目標にしたいと思います。