LoginSignup
0
0

dockerで機械学習(8) with anaconda(8)「実践機械学習システム」Willi Richest, Luis Pedro Coelho 著

Last updated at Posted at 2018-10-07

1.すぐにプログラムを動かしたい方へ(as soon as you want)

実践機械学習システム Willi Richest, Luis Pedro Coelho 著
picture_large978-4-87311-698-3.jpeg

<この項は書きかけです。順次追記します。>

docker

dockerは複数人で同じ設定で作業、実験、実習ができるとても便利な道具です。
それまで利用していた環境とは全く別に作ります。
それまでどのような設定をしていても、dockerが起動し、ネットがつながれば大丈夫です。ここでは、本で紹介しているdockerの資料に直接基づかず、すぐに利用できる環境を提供し、またご自身で新たに導入したソフトを含めて、保存しておく方法を紹介します。

docker起動

dockerを導入し、Windows, Macではdockerを起動しておいてください。
Windowsでは、BiosでIntel Virtualizationをenableにしないとdockerが起動しない場合があります。
また、セキュリティの警告などが出ることがあります。
システム管理者での作業が必要になります。

docker pull and run

$ docker pull kaizenjapan/anaconda2-willi

$ docker run -it -p 8888:8888 kaizenjapan/anaconda2-willi /bin/bash

dockerの中と、dockerを起動したOSのシェルとが表示が似ている場合には、どちらで操作しているか間違えることがあります。dockerの入力促進記号(comman prompt)は、docker idの数字が何桁かついています。

第1章

以下のshell sessionでは

(base) root@9f32435de7a9#

は入力促進記号(comman prompt)です。実際には数字の部分が違うかもしれません。この行の#の右側を入力してください。
それ以外の行は出力です。出力にエラー、違いがあれば、コメント欄などでご連絡くださると幸いです。
それぞれの章のフォルダに移動します。

現在、まだエラーが取れていません。
うまくエラーを取る方法がありましたら、ご教示ください。

docker
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# python analyze_webstats.py 
Traceback (most recent call last):
  File "analyze_webstats.py", line 10, in <module>
    import matplotlib.pyplot as plt
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/backend_qt5agg.py", line 15, in <module>
    from .backend_qt5 import (
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/backend_qt5.py", line 19, in <module>
    import matplotlib.backends.qt_editor.figureoptions as figureoptions
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/qt_editor/figureoptions.py", line 20, in <module>
    import matplotlib.backends.qt_editor.formlayout as formlayout
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/qt_editor/formlayout.py", line 54, in <module>
    from matplotlib.backends.qt_compat import QtGui, QtWidgets, QtCore
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/qt_compat.py", line 158, in <module>
    raise ImportError("Failed to import any qt binding")
ImportError: Failed to import any qt binding
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# conda install tensorflow
Solving environment: done

# All requested packages already installed.
 
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# pip install --upgrade pip
Requirement already up-to-date: pip in /opt/conda/lib/python2.7/site-packages (18.1)
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# pip uninstall matplotlib
Uninstalling matplotlib-2.2.3:
  Would remove:
    /opt/conda/lib/python2.7/site-packages/matplotlib
    /opt/conda/lib/python2.7/site-packages/matplotlib-2.2.3-py2.7.egg-info
    /opt/conda/lib/python2.7/site-packages/pylab.py
Proceed (y/n)? pip install matplotlib
Your response ('pip install matplotlib') was not one of the expected responses: y, n
Proceed (y/n)? y
  Successfully uninstalled matplotlib-2.2.3
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# pip install matplotlib
Collecting matplotlib
  Downloading https://files.pythonhosted.org/packages/59/08/04933377dc4500e3698e93f9113dc3624874e0914f4c85767ecb5b389084/matplotlib-2.2.3-cp27-cp27mu-manylinux1_x86_64.whl (12.6MB)
    100% |████████████████████████████████| 12.6MB 2.3MB/s 
Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (2.7.3)
Requirement already satisfied: subprocess32 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (3.5.2)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (0.10.0)
Requirement already satisfied: six>=1.10 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (1.11.0)
Requirement already satisfied: backports.functools-lru-cache in /opt/conda/lib/python2.7/site-packages (from matplotlib) (1.5)
Requirement already satisfied: pytz in /opt/conda/lib/python2.7/site-packages (from matplotlib) (2018.5)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (2.2.0)
Requirement already satisfied: numpy>=1.7.1 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (1.15.1)
Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python2.7/site-packages (from matplotlib) (1.0.1)
Requirement already satisfied: setuptools in /opt/conda/lib/python2.7/site-packages (from kiwisolver>=1.0.1->matplotlib) (40.2.0)
Installing collected packages: matplotlib
Successfully installed matplotlib-2.2.3
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# python analyze_webstats.py 
[[1.000e+00 2.272e+03]
 [2.000e+00 1.656e+03]
 [3.000e+00 1.386e+03]
 [4.000e+00 1.365e+03]
 [5.000e+00 1.488e+03]
 [6.000e+00 1.337e+03]
 [7.000e+00 1.883e+03]
 [8.000e+00 2.283e+03]
 [9.000e+00 1.335e+03]
 [1.000e+01 1.025e+03]]
('Number of invalid entries:', 0)
Traceback (most recent call last):
  File "analyze_webstats.py", line 59, in <module>
    plot_models(x, y, None, os.path.join("..", "1400_01_01.png"))
  File "analyze_webstats.py", line 31, in plot_models
    plt.clf()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 671, in clf
    gcf().clf()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 586, in gcf
    return figure()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 533, in figure
    **kwargs)
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 161, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/_backend_tk.py", line 1046, in new_figure_manager_given_figure
    window = Tk.Tk(className="matplotlib")
  File "/opt/conda/lib/python2.7/lib-tk/Tkinter.py", line 1819, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable
(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# 

dockerを起動したOSのブラウザで localhost:8888 を表示してください。

tokenの欄に、7a5331fc8bad20cea75fc965e0734876860496be34ddf2c9
をコピペ

01_the_machine_learning_landscape.ipynb
選択

2. 各種エラーを取った経緯

python3で起動

本の記述をよく読まず、python3(anaconda3)を導入してエラーを出した。
python2(anaconda2)を導入し直した。
dockerだと、先に導入したものを終了すれば、全く他に影響を与えなくん楽ちん。

plot関連のエラー

pipでmatplotlibを再導入したらでなくなった。

(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# python analyze_webstats.py 
[[1.000e+00 2.272e+03]
 [2.000e+00 1.656e+03]
 [3.000e+00 1.386e+03]
 [4.000e+00 1.365e+03]
 [5.000e+00 1.488e+03]
 [6.000e+00 1.337e+03]
 [7.000e+00 1.883e+03]
 [8.000e+00 2.283e+03]
 [9.000e+00 1.335e+03]
 [1.000e+01 1.025e+03]]
('Number of invalid entries:', 0)
Traceback (most recent call last):
  File "analyze_webstats.py", line 59, in <module>
    plot_models(x, y, None, os.path.join("..", "1400_01_01.png"))
  File "analyze_webstats.py", line 31, in plot_models
    plt.clf()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 671, in clf
    gcf().clf()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 586, in gcf
    return figure()
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/pyplot.py", line 533, in figure
    **kwargs)
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backend_bases.py", line 161, in new_figure_manager
    return cls.new_figure_manager_given_figure(num, fig)
  File "/opt/conda/lib/python2.7/site-packages/matplotlib/backends/_backend_tk.py", line 1046, in new_figure_manager_given_figure
    window = Tk.Tk(className="matplotlib")
  File "/opt/conda/lib/python2.7/lib-tk/Tkinter.py", line 1819, in __init__
    self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: no display name and no $DISPLAY environment variable

import matplotlib as mpl
mpl.use('Agg')
の2行を付け加えると、エラーは次のように変わる。

(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# python analyze_webstats.py 
[[1.000e+00 2.272e+03]
 [2.000e+00 1.656e+03]
 [3.000e+00 1.386e+03]
 [4.000e+00 1.365e+03]
 [5.000e+00 1.488e+03]
 [6.000e+00 1.337e+03]
 [7.000e+00 1.883e+03]
 [8.000e+00 2.283e+03]
 [9.000e+00 1.335e+03]
 [1.000e+01 1.025e+03]]
('Number of invalid entries:', 0)
Model parameters: [   2.57152281 1002.10684085]
('Error of the model:', array([3.19874315e+08]))
/opt/conda/lib/python2.7/site-packages/numpy/lib/polynomial.py:578: RuntimeWarning: overflow encountered in multiply
  scale = NX.sqrt((lhs*lhs).sum(axis=0))
/opt/conda/lib/python2.7/site-packages/numpy/core/_methods.py:36: RuntimeWarning: overflow encountered in reduce
  return umr_sum(a, axis, dtype, out, keepdims, initial)
analyze_webstats.py:71: RankWarning: Polyfit may be poorly conditioned
  f100 = sp.poly1d(sp.polyfit(x, y, 100))
Traceback (most recent call last):
  File "analyze_webstats.py", line 80, in <module>
    xa = x[:inflection]
TypeError: slice indices must be integers or None or have an __index__ method

79行にint関数を追加。
inflection = int(3.5 * 7 * 24) # TypeError: slice indices must be integers or None or have an index method

(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# python analyze_webstats.py 
[[1.000e+00 2.272e+03]
 [2.000e+00 1.656e+03]
 [3.000e+00 1.386e+03]
 [4.000e+00 1.365e+03]
 [5.000e+00 1.488e+03]
 [6.000e+00 1.337e+03]
 [7.000e+00 1.883e+03]
 [8.000e+00 2.283e+03]
 [9.000e+00 1.335e+03]
 [1.000e+01 1.025e+03]]
('Number of invalid entries:', 0)
Model parameters: [   2.57152281 1002.10684085]
('Error of the model:', array([3.19874315e+08]))
/opt/conda/lib/python2.7/site-packages/numpy/lib/polynomial.py:578: RuntimeWarning: overflow encountered in multiply
  scale = NX.sqrt((lhs*lhs).sum(axis=0))
/opt/conda/lib/python2.7/site-packages/numpy/core/_methods.py:36: RuntimeWarning: overflow encountered in reduce
  return umr_sum(a, axis, dtype, out, keepdims, initial)
analyze_webstats.py:71: RankWarning: Polyfit may be poorly conditioned
  f100 = sp.poly1d(sp.polyfit(x, y, 100))
Errors for the complete data set:
Error d=1: 319874314.777419
Error d=2: 182006476.431710
Error d=3: 140655634.699245
Error d=10: 123592114.553118
Error d=53: 111276325.816514
Errors for only the time after inflection point
Error d=1: 147651658.425710
Error d=2: 63345307.090621
Error d=3: 34668520.328785
Error d=10: 23118096.679445
Error d=53: 20394625.617148
Error inflection=136467834.765625
Trained only on data after inflection point
analyze_webstats.py:115: RankWarning: Polyfit may be poorly conditioned
  fb10 = sp.poly1d(sp.polyfit(xb, yb, 10))
analyze_webstats.py:116: RankWarning: Polyfit may be poorly conditioned
  fb100 = sp.poly1d(sp.polyfit(xb, yb, 100))
Errors for only the time after inflection point
Error d=1: 26975119.829741
Error d=2: 21985756.969013
Error d=3: 21807724.363931
Error d=10: 20604865.999491
Error d=53: 19589909.088950
analyze_webstats.py:136: RankWarning: Polyfit may be poorly conditioned
  fbt10 = sp.poly1d(sp.polyfit(xb[train], yb[train], 10))
analyze_webstats.py:137: RankWarning: Polyfit may be poorly conditioned
  fbt100 = sp.poly1d(sp.polyfit(xb[train], yb[train], 100))
Test errors for only the time after inflection point
Error d=1: 8102343.162989
Error d=2: 6015103.019447
Error d=3: 6316719.326090
Error d=10: 7222791.170787
Error d=53: 6851508.554098
         2
0.09915 x - 112.8 x + 3.41e+04
         2
0.09915 x - 112.8 x - 6.59e+04
100,000 hits/hour expected at week 9.303590

前の変更を取り消し、代入文にint関数を加えてみる。
xa = x[:int(inflection)]
ya = y[:int(inflection)]
xb = x[int(inflection):]
yb = y[int(inflection):]

(base) root@9f32435de7a9:/BuildingMachineLearningSystemsWithPython/ch01# python analyze_webstats.py 
[[1.000e+00 2.272e+03]
 [2.000e+00 1.656e+03]
 [3.000e+00 1.386e+03]
 [4.000e+00 1.365e+03]
 [5.000e+00 1.488e+03]
 [6.000e+00 1.337e+03]
 [7.000e+00 1.883e+03]
 [8.000e+00 2.283e+03]
 [9.000e+00 1.335e+03]
 [1.000e+01 1.025e+03]]
('Number of invalid entries:', 0)
Model parameters: [   2.57152281 1002.10684085]
('Error of the model:', array([3.19874315e+08]))
/opt/conda/lib/python2.7/site-packages/numpy/lib/polynomial.py:578: RuntimeWarning: overflow encountered in multiply
  scale = NX.sqrt((lhs*lhs).sum(axis=0))
/opt/conda/lib/python2.7/site-packages/numpy/core/_methods.py:36: RuntimeWarning: overflow encountered in reduce
  return umr_sum(a, axis, dtype, out, keepdims, initial)
analyze_webstats.py:71: RankWarning: Polyfit may be poorly conditioned
  f100 = sp.poly1d(sp.polyfit(x, y, 100))
Errors for the complete data set:
Error d=1: 319874314.777419
Error d=2: 182006476.431710
Error d=3: 140655634.699245
Error d=10: 123592114.553118
Error d=53: 111276325.816514
Errors for only the time after inflection point
Error d=1: 147651658.425710
Error d=2: 63345307.090621
Error d=3: 34668520.328785
Error d=10: 23118096.679445
Error d=53: 20394625.617148
Error inflection=136467834.765625
Trained only on data after inflection point
analyze_webstats.py:115: RankWarning: Polyfit may be poorly conditioned
  fb10 = sp.poly1d(sp.polyfit(xb, yb, 10))
analyze_webstats.py:116: RankWarning: Polyfit may be poorly conditioned
  fb100 = sp.poly1d(sp.polyfit(xb, yb, 100))
Errors for only the time after inflection point
Error d=1: 26975119.829741
Error d=2: 21985756.969013
Error d=3: 21807724.363931
Error d=10: 20604865.999491
Error d=53: 19589909.088950
analyze_webstats.py:136: RankWarning: Polyfit may be poorly conditioned
  fbt10 = sp.poly1d(sp.polyfit(xb[train], yb[train], 10))
analyze_webstats.py:137: RankWarning: Polyfit may be poorly conditioned
  fbt100 = sp.poly1d(sp.polyfit(xb[train], yb[train], 100))
Test errors for only the time after inflection point
Error d=1: 7132411.480159
Error d=2: 5673594.303076
Error d=3: 5613429.342371
Error d=10: 5713678.619663
Error d=53: 6367113.789256
       2
0.101 x - 115.1 x + 3.481e+04
       2
0.101 x - 115.1 x - 6.519e+04
100,000 hits/hour expected at week 9.252794

3. dockerを自力で構築する方へ

anaconda/keras/tensorflow方針(docker deploy policy)

ここから下は、上記のpullしていただいたdockerをどういう方針で、どういう手順で作ったかを記録します。
上記のdockerを利用する上での参考資料です。1章の続きをする上では必要ありません。
自力でdocker/anaconda/keras/tensorflowを構築する場合の手順になります。
dockerfileを作る方法ではありません。ごめんなさい。

docker

ubuntu, debianなどのLinuxを、linux, windows, mac osから共通に利用できる仕組み。
利用するOSの設定を変更せずに利用できるのがよい。
同じ仕様で、大量の人が利用することができる。

ソフトウェアの開発元が公式に対応しているものと、利用者が便利に仕立てたものの両方が利用可能である。今回は、公式に配布しているものを、自分で仕立てて、他の人にも利用できるようにする。

python

DeepLearningの実習をPhthonで行って来た。
pythonを使う理由は、多くの機械学習の仕組みがpythonで利用できることと、Rなどの統計解析の仕組みもpythonから容易に利用できることがある。

anaconda

pythonには、2と3という版の違いと、配布方法の違いなどがある。
Anacondaでpython3をこの1年半利用してきた。

Anacondaを利用した理由は、統計解析のライブラリと、JupyterNotebookが初めから入っているからである。

docker公式配布

ubuntu, debianなどのOSの公式配布,gcc, anacondaなどの言語の公式配布などがある。
これらを利用し、docker-hubに登録することにより、公式配布の質の確認と、変更権を含む幅広い情報の共有ができる。dockerが公式配布するものではなく、それぞれのソフト提供者の公式配布という意味。

docker pull

docker公式配布の利用は、URLからpullすることで実現する。

docker Anaconda

anacondaが公式配布しているものを利用。

$  docker pull continuumio/anaconda2
05d1a5232b46: Already exists 
b46ad780a34a: Pull complete 
543ba6ae39a1: Pull complete 
a617ad1c5335: Pull complete 
Digest: sha256:0939eb5c7f27e86f84591cd56fa8b89f02fcee52176e5951676c70c3bdbfd3fd
Status: Downloaded newer image for continuumio/anaconda2:latest

docker run

実行はdocker runである。
今回はブラウザで閲覧するため-pの設定を行う。

$ docker run -it  continuumio/anaconda2 /bin/bash
(base) root@bab8510e7b8e:/# 

apt

ubuntu, debianはDebian系の道具類の配布の仕組みが利用できる。
aptのよいところは、debianというカーネルの開発者が大勢集まっており、基本機能の整合性を厳密に取っているところにある。
通信規約の改良にあたって、Linuxのカーネルに手を入れる必要があったときに、ソースをaptで導入し、patch適用後コンパイルしてもエラーなくコンパイルできて以来、linuxといえばaptが利用できるDebian系を愛用している。
Raspberry PIで有名なRaspbianもDebian系で、aptが利用できる。
そのため、dockerで作業した状況をRaspbianで再現することはとても容易である。

(base) root@0da2c87a513f:/# # apt update
Ign:1 http://deb.debian.org/debian stretch InRelease
Get:2 http://security.debian.org/debian-security stretch/updates InRelease [94.3 kB]
Get:3 http://deb.debian.org/debian stretch-updates InRelease [91.0 kB]
Hit:4 http://deb.debian.org/debian stretch Release                       
Get:5 http://security.debian.org/debian-security stretch/updates/main amd64 Packages [447 kB]
Fetched 632 kB in 1s (479 kB/s)                            
Reading package lists... Done

git

本にあるURLからgitで取得する。

(base) root@b789c278e622:/# git clone https://github.com/wrichert/BuildingMachineLearningSystemsWithPython

pip install

(base) root@bab8510e7b8e:/BuildingMachineLearningSystemsWithPython/ch01# pip install QtGui
Collecting QtGui
  Downloading https://files.pythonhosted.org/packages/01/3a/fbc802c50f2db85fff637388e3fed3a17f5c848febe6815ef29d13c60e00/qtgui-0.0.1.tar.gz
Building wheels for collected packages: QtGui
  Running setup.py bdist_wheel for QtGui ... done
  Stored in directory: /root/.cache/pip/wheels/dc/24/19/968e6c14da845bd653d59c2de3bd550c0d636afb15b53020ed
Successfully built QtGui
Installing collected packages: QtGui
Successfully installed QtGui-0.0.1

conda install

pythonには、pipというpythonのライブラリ等を導入する仕組みがある。
今回は、condaというanaconda専用のライブラリ導入の仕組みを利用してみる。

conda install tensorflow

(base) root@5a5136f16eab:/handson-ml# conda install tensorflow
Solving environment: done

## Package Plan ##

  environment location: /opt/conda

  added / updated specs: 
    - tensorflow


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    jdcal-1.4                  |           py36_0          11 KB
    multipledispatch-0.6.0     |           py36_0          21 KB


(中略)

    patsy-0.5.0                |           py36_0         322 KB
    sphinxcontrib-websupport-1.1.0|           py36_1          36 KB
    astroid-2.0.4              |           py36_0         247 KB
    ------------------------------------------------------------
                                           Total:       339.6 MB

The following NEW packages will be INSTALLED:

    _tflow_select:                      2.3.0-mkl                
    absl-py:                            0.5.0-py36_0             
    astor:                              0.7.1-py36_0             
    gast:                               0.2.0-py36_0             
    grpcio:                             1.12.1-py36hdbcaa40_0    
    keras-applications:                 1.0.6-py36_0             
    keras-preprocessing:                1.0.5-py36_0             
    libprotobuf:                        3.6.0-hdbcaa40_0         
    markdown:                           2.6.11-py36_0            
    protobuf:                           3.6.0-py36hf484d3e_0     
    tensorboard:                        1.11.0-py36hf484d3e_0    
    tensorflow:                         1.11.0-mkl_py36ha6f0bda_0
    tensorflow-base:                    1.11.0-mkl_py36h3c3e929_0
    termcolor:                          1.1.0-py36_1             
    typed-ast:                          1.1.0-py36h14c3975_0     

The following packages will be REMOVED:

    anaconda:                           5.3.0-py37_0             

The following packages will be UPDATED:

    _ipyw_jlab_nb_ext_conf:             0.1.0-py37_0              --> 0.1.0-py36_0           
    alabaster:                          0.7.11-py37_0             --> 0.7.11-py36_0          
    anaconda-client:                    1.7.2-py37_0              --> 1.7.2-py36_0           
    anaconda-navigator:                 1.9.2-py37_0              --> 1.9.2-py36_0           
    anaconda-project:                   0.8.2-py37_0              --> 0.8.2-py36_0           
    appdirs:                            1.4.3-py37h28b3542_0      --> 1.4.3-py36h28b3542_0   
    asn1crypto:                         0.24.0-py37_0             --> 0.24.0-py36_0          
    astroid:                            2.0.4-py37_0              --> 2.0.4-py36_0           
    astropy:                            3.0.4-py37h14c3975_0      --> 3.0.4-py36h14c3975_0   
    atomicwrites:                       1.2.1-py37_0              --> 1.2.1-py36_0           
    attrs:                              18.2.0-py37h28b3542_0     --> 18.2.0-py36h28b3542_0  
    automat:                            0.7.0-py37_0              --> 0.7.0-py36_0           
    babel:                              2.6.0-py37_0              --> 2.6.0-py36_0           
    backcall:                           0.1.0-py37_0              --> 0.1.0-py36_0           
    backports:                          1.0-py37_1                --> 1.0-py36_1             
    backports.shutil_get_terminal_size: 1.0.0-py37_2              --> 1.0.0-py36_2           
    beautifulsoup4:                     4.6.3-py37_0              --> 4.6.3-py36_0           
    bitarray:                           0.8.3-py37h14c3975_0      --> 0.8.3-py36h14c3975_0   
    bkcharts:                           0.2-py37_0                --> 0.2-py36_0             
    blaze:                              0.11.3-py37_0             --> 0.11.3-py36_0          
    bleach:                             2.1.4-py37_0              --> 2.1.4-py36_0           
    bokeh:                              0.13.0-py37_0             --> 0.13.0-py36_0          
    boto:                               2.49.0-py37_0             --> 2.49.0-py36_0          
    bottleneck:                         1.2.1-py37h035aef0_1      --> 1.2.1-py36h035aef0_1   
    certifi:                            2018.8.24-py37_1          --> 2018.8.24-py36_1       
    cffi:                               1.11.5-py37he75722e_1     --> 1.11.5-py36he75722e_1  
    chardet:                            3.0.4-py37_1              --> 3.0.4-py36_1           
    click:                              6.7-py37_0                --> 7.0-py36_0             
    cloudpickle:                        0.5.5-py37_0              --> 0.5.6-py36_0           
    clyent:                             1.2.2-py37_1              --> 1.2.2-py36_1           
    colorama:                           0.3.9-py37_0              --> 0.3.9-py36_0           
    conda:                              4.5.11-py37_0             --> 4.5.11-py36_0          
    conda-build:                        3.15.1-py37_0             --> 3.15.1-py36_0          
    constantly:                         15.1.0-py37h28b3542_0     --> 15.1.0-py36h28b3542_0  
    contextlib2:                        0.5.5-py37_0              --> 0.5.5-py36_0           
    cryptography:                       2.3.1-py37hc365091_0      --> 2.3.1-py36hc365091_0   
    cycler:                             0.10.0-py37_0             --> 0.10.0-py36_0          
    cython:                             0.28.5-py37hf484d3e_0     --> 0.28.5-py36hf484d3e_0  
    cytoolz:                            0.9.0.1-py37h14c3975_1    --> 0.9.0.1-py36h14c3975_1 
    dask:                               0.19.1-py37_0             --> 0.19.2-py36_0          
    dask-core:                          0.19.1-py37_0             --> 0.19.2-py36_0          
    datashape:                          0.5.4-py37_1              --> 0.5.4-py36_1           
    decorator:                          4.3.0-py37_0              --> 4.3.0-py36_0           
    defusedxml:                         0.5.0-py37_1              --> 0.5.0-py36_1           
    distributed:                        1.23.1-py37_0             --> 1.23.2-py36_0          
    docutils:                           0.14-py37_0               --> 0.14-py36_0            
    entrypoints:                        0.2.3-py37_2              --> 0.2.3-py36_2           
    et_xmlfile:                         1.0.1-py37_0              --> 1.0.1-py36_0           
    fastcache:                          1.0.2-py37h14c3975_2      --> 1.0.2-py36h14c3975_2   
    filelock:                           3.0.8-py37_0              --> 3.0.8-py36_0           
    flask:                              1.0.2-py37_1              --> 1.0.2-py36_1           
    flask-cors:                         3.0.6-py37_0              --> 3.0.6-py36_0           
    gevent:                             1.3.6-py37h7b6447c_0      --> 1.3.6-py36h7b6447c_0   
    glob2:                              0.6-py37_0                --> 0.6-py36_1             
    gmpy2:                              2.0.8-py37h10f8cd9_2      --> 2.0.8-py36h10f8cd9_2   
    greenlet:                           0.4.15-py37h7b6447c_0     --> 0.4.15-py36h7b6447c_0  
    h5py:                               2.8.0-py37h989c5e5_3      --> 2.8.0-py36h989c5e5_3   
    heapdict:                           1.0.0-py37_2              --> 1.0.0-py36_2           
    html5lib:                           1.0.1-py37_0              --> 1.0.1-py36_0           
    hyperlink:                          18.0.0-py37_0             --> 18.0.0-py36_0          
    idna:                               2.7-py37_0                --> 2.7-py36_0             
    imageio:                            2.4.1-py37_0              --> 2.4.1-py36_0           
    imagesize:                          1.1.0-py37_0              --> 1.1.0-py36_0           
    incremental:                        17.5.0-py37_0             --> 17.5.0-py36_0          
    ipykernel:                          4.9.0-py37_1              --> 5.0.0-py36h39e3cac_0   
    ipython:                            6.5.0-py37_0              --> 7.0.1-py36h39e3cac_0   
    ipython_genutils:                   0.2.0-py37_0              --> 0.2.0-py36_0           
    ipywidgets:                         7.4.1-py37_0              --> 7.4.2-py36_0           
    isort:                              4.3.4-py37_0              --> 4.3.4-py36_0           
    itsdangerous:                       0.24-py37_1               --> 0.24-py36_1            
    jdcal:                              1.4-py37_0                --> 1.4-py36_0             
    jedi:                               0.12.1-py37_0             --> 0.12.1-py36_0          
    jeepney:                            0.3.1-py37_0              --> 0.4-py36_0             
    jinja2:                             2.10-py37_0               --> 2.10-py36_0            
    jsonschema:                         2.6.0-py37_0              --> 2.6.0-py36_0           
    jupyter:                            1.0.0-py37_7              --> 1.0.0-py36_7           
    jupyter_client:                     5.2.3-py37_0              --> 5.2.3-py36_0           
    jupyter_console:                    5.2.0-py37_1              --> 5.2.0-py36_1           
    jupyter_core:                       4.4.0-py37_0              --> 4.4.0-py36_0           
    jupyterlab:                         0.34.9-py37_0             --> 0.34.12-py36_0         
    jupyterlab_launcher:                0.13.1-py37_0             --> 0.13.1-py36_0          
    keyring:                            13.2.1-py37_0             --> 13.2.1-py36_0          
    kiwisolver:                         1.0.1-py37hf484d3e_0      --> 1.0.1-py36hf484d3e_0   
    lazy-object-proxy:                  1.3.1-py37h14c3975_2      --> 1.3.1-py36h14c3975_2   
    llvmlite:                           0.24.0-py37hdbcaa40_0     --> 0.25.0-py36hd408876_0  
    locket:                             0.2.0-py37_1              --> 0.2.0-py36_1           
    lxml:                               4.2.5-py37hefd8a0e_0      --> 4.2.5-py36hefd8a0e_0   
    markupsafe:                         1.0-py37h14c3975_1        --> 1.0-py36h14c3975_1     
    matplotlib:                         2.2.3-py37hb69df0a_0      --> 3.0.0-py36h5429711_0   
    mccabe:                             0.6.1-py37_1              --> 0.6.1-py36_1           
    mistune:                            0.8.3-py37h14c3975_1      --> 0.8.3-py36h14c3975_1   
    mkl-service:                        1.1.2-py37h90e4bf4_5      --> 1.1.2-py36h90e4bf4_5   
    mkl_fft:                            1.0.4-py37h4414c95_1      --> 1.0.6-py36h7dd41cf_0   
    mkl_random:                         1.0.1-py37h4414c95_1      --> 1.0.1-py36h4414c95_1   
    more-itertools:                     4.3.0-py37_0              --> 4.3.0-py36_0           
    mpmath:                             1.0.0-py37_2              --> 1.0.0-py36_2           
    msgpack-python:                     0.5.6-py37h6bb024c_1      --> 0.5.6-py36h6bb024c_1   
    multipledispatch:                   0.6.0-py37_0              --> 0.6.0-py36_0           
    navigator-updater:                  0.2.1-py37_0              --> 0.2.1-py36_0           
    nbconvert:                          5.4.0-py37_1              --> 5.4.0-py36_1           
    nbformat:                           4.4.0-py37_0              --> 4.4.0-py36_0           
    networkx:                           2.1-py37_0                --> 2.2-py36_1             
    nltk:                               3.3.0-py37_0              --> 3.3.0-py36_0           
    nose:                               1.3.7-py37_2              --> 1.3.7-py36_2           
    notebook:                           5.6.0-py37_0              --> 5.7.0-py36_0           
    numba:                              0.39.0-py37h04863e7_0     --> 0.40.0-py36h962f231_0  
    numexpr:                            2.6.8-py37hd89afb7_0      --> 2.6.8-py36hd89afb7_0   
    numpy:                              1.15.1-py37h1d66e8a_0     --> 1.15.2-py36h1d66e8a_1  
    numpy-base:                         1.15.1-py37h81de0dd_0     --> 1.15.2-py36h81de0dd_1  
    numpydoc:                           0.8.0-py37_0              --> 0.8.0-py36_0           
    odo:                                0.5.1-py37_0              --> 0.5.1-py36_0           
    olefile:                            0.46-py37_0               --> 0.46-py36_0            
    openpyxl:                           2.5.6-py37_0              --> 2.5.8-py36_0           
    packaging:                          17.1-py37_0               --> 18.0-py36_0            
    pandas:                             0.23.4-py37h04863e7_0     --> 0.23.4-py36h04863e7_0  
    pandocfilters:                      1.4.2-py37_1              --> 1.4.2-py36_1           
    parso:                              0.3.1-py37_0              --> 0.3.1-py36_0           
    partd:                              0.3.8-py37_0              --> 0.3.8-py36_0           
    path.py:                            11.1.0-py37_0             --> 11.1.0-py36_0          
    pathlib2:                           2.3.2-py37_0              --> 2.3.2-py36_0           
    patsy:                              0.5.0-py37_0              --> 0.5.0-py36_0           
    pep8:                               1.7.1-py37_0              --> 1.7.1-py36_0           
    pexpect:                            4.6.0-py37_0              --> 4.6.0-py36_0           
    pickleshare:                        0.7.4-py37_0              --> 0.7.5-py36_0           
    pillow:                             5.2.0-py37heded4f4_0      --> 5.3.0-py36h34e0f95_0   
    pip:                                10.0.1-py37_0             --> 10.0.1-py36_0          
    pkginfo:                            1.4.2-py37_1              --> 1.4.2-py36_1           
    pluggy:                             0.7.1-py37h28b3542_0      --> 0.7.1-py36h28b3542_0   
    ply:                                3.11-py37_0               --> 3.11-py36_0            
    prometheus_client:                  0.3.1-py37h28b3542_0      --> 0.3.1-py36h28b3542_0   
    prompt_toolkit:                     1.0.15-py37_0             --> 2.0.5-py36_0           
    psutil:                             5.4.7-py37h14c3975_0      --> 5.4.7-py36h14c3975_0   
    ptyprocess:                         0.6.0-py37_0              --> 0.6.0-py36_0           
    py:                                 1.6.0-py37_0              --> 1.6.0-py36_0           
    pyasn1:                             0.4.4-py37h28b3542_0      --> 0.4.4-py36h28b3542_0   
    pyasn1-modules:                     0.2.2-py37_0              --> 0.2.2-py36_0           
    pycodestyle:                        2.4.0-py37_0              --> 2.4.0-py36_0           
    pycosat:                            0.6.3-py37h14c3975_0      --> 0.6.3-py36h14c3975_0   
    pycparser:                          2.18-py37_1               --> 2.19-py36_0            
    pycrypto:                           2.6.1-py37h14c3975_9      --> 2.6.1-py36h14c3975_9   
    pycurl:                             7.43.0.2-py37hb7f436b_0   --> 7.43.0.2-py36hb7f436b_0
    pyflakes:                           2.0.0-py37_0              --> 2.0.0-py36_0           
    pygments:                           2.2.0-py37_0              --> 2.2.0-py36_0           
    pylint:                             2.1.1-py37_0              --> 2.1.1-py36_0           
    pyodbc:                             4.0.24-py37he6710b0_0     --> 4.0.24-py36he6710b0_0  
    pyopenssl:                          18.0.0-py37_0             --> 18.0.0-py36_0          
    pyparsing:                          2.2.0-py37_1              --> 2.2.1-py36_0           
    pyqt:                               5.9.2-py37h05f1152_2      --> 5.9.2-py36h05f1152_2   
    pysocks:                            1.6.8-py37_0              --> 1.6.8-py36_0           
    pytables:                           3.4.4-py37ha205bf6_0      --> 3.4.4-py36ha205bf6_0   
    pytest:                             3.8.0-py37_0              --> 3.8.1-py36_0           
    pytest-arraydiff:                   0.2-py37h39e3cac_0        --> 0.2-py36h39e3cac_0     
    pytest-astropy:                     0.4.0-py37_0              --> 0.4.0-py36_0           
    pytest-doctestplus:                 0.1.3-py37_0              --> 0.1.3-py36_0           
    pytest-openfiles:                   0.3.0-py37_0              --> 0.3.0-py36_0           
    pytest-remotedata:                  0.3.0-py37_0              --> 0.3.0-py36_0           
    python-dateutil:                    2.7.3-py37_0              --> 2.7.3-py36_0           
    pytz:                               2018.5-py37_0             --> 2018.5-py36_0          
    pywavelets:                         1.0.0-py37hdd07704_0      --> 1.0.1-py36hdd07704_0   
    pyyaml:                             3.13-py37h14c3975_0       --> 3.13-py36h14c3975_0    
    pyzmq:                              17.1.2-py37h14c3975_0     --> 17.1.2-py36h14c3975_0  
    qtawesome:                          0.4.4-py37_0              --> 0.5.0-py36_0           
    qtconsole:                          4.4.1-py37_0              --> 4.4.1-py36_0           
    qtpy:                               1.5.0-py37_0              --> 1.5.1-py36_0           
    requests:                           2.19.1-py37_0             --> 2.19.1-py36_0          
    rope:                               0.11.0-py37_0             --> 0.11.0-py36_0          
    ruamel_yaml:                        0.15.46-py37h14c3975_0    --> 0.15.46-py36h14c3975_0 
    scikit-image:                       0.14.0-py37hf484d3e_1     --> 0.14.0-py36hf484d3e_1  
    scikit-learn:                       0.19.2-py37h4989274_0     --> 0.20.0-py36h4989274_1  
    scipy:                              1.1.0-py37hfa4b5c9_1      --> 1.1.0-py36hfa4b5c9_1   
    seaborn:                            0.9.0-py37_0              --> 0.9.0-py36_0           
    secretstorage:                      3.1.0-py37_0              --> 3.1.0-py36_0           
    send2trash:                         1.5.0-py37_0              --> 1.5.0-py36_0           
    service_identity:                   17.0.0-py37h28b3542_0     --> 17.0.0-py36h28b3542_0  
    setuptools:                         40.2.0-py37_0             --> 40.4.3-py36_0          
    simplegeneric:                      0.8.1-py37_2              --> 0.8.1-py36_2           
    singledispatch:                     3.4.0.3-py37_0            --> 3.4.0.3-py36_0         
    sip:                                4.19.8-py37hf484d3e_0     --> 4.19.8-py36hf484d3e_0  
    six:                                1.11.0-py37_1             --> 1.11.0-py36_1          
    snowballstemmer:                    1.2.1-py37_0              --> 1.2.1-py36_0           
    sortedcollections:                  1.0.1-py37_0              --> 1.0.1-py36_0           
    sortedcontainers:                   2.0.5-py37_0              --> 2.0.5-py36_0           
    sphinx:                             1.7.9-py37_0              --> 1.8.1-py36_0           
    sphinxcontrib:                      1.0-py37_1                --> 1.0-py36_1             
    sphinxcontrib-websupport:           1.1.0-py37_1              --> 1.1.0-py36_1           
    spyder:                             3.3.1-py37_1              --> 3.3.1-py36_1           
    spyder-kernels:                     0.2.6-py37_0              --> 0.2.6-py36_0           
    sqlalchemy:                         1.2.11-py37h7b6447c_0     --> 1.2.12-py36h7b6447c_0  
    statsmodels:                        0.9.0-py37h035aef0_0      --> 0.9.0-py36h035aef0_0   
    sympy:                              1.2-py37_0                --> 1.3-py36_0             
    tblib:                              1.3.2-py37_0              --> 1.3.2-py36_0           
    terminado:                          0.8.1-py37_1              --> 0.8.1-py36_1           
    testpath:                           0.3.1-py37_0              --> 0.4.1-py36_0           
    toolz:                              0.9.0-py37_0              --> 0.9.0-py36_0           
    tornado:                            5.1-py37h14c3975_0        --> 5.1.1-py36h7b6447c_0   
    tqdm:                               4.26.0-py37h28b3542_0     --> 4.26.0-py36h28b3542_0  
    traitlets:                          4.3.2-py37_0              --> 4.3.2-py36_0           
    twisted:                            18.7.0-py37h14c3975_1     --> 18.7.0-py36h14c3975_1  
    unicodecsv:                         0.14.1-py37_0             --> 0.14.1-py36_0          
    urllib3:                            1.23-py37_0               --> 1.23-py36_0            
    wcwidth:                            0.1.7-py37_0              --> 0.1.7-py36_0           
    webencodings:                       0.5.1-py37_1              --> 0.5.1-py36_1           
    werkzeug:                           0.14.1-py37_0             --> 0.14.1-py36_0          
    wheel:                              0.31.1-py37_0             --> 0.32.0-py36_0          
    widgetsnbextension:                 3.4.1-py37_0              --> 3.4.2-py36_0           
    wrapt:                              1.10.11-py37h14c3975_2    --> 1.10.11-py36h14c3975_2 
    xlrd:                               1.1.0-py37_1              --> 1.1.0-py36_1           
    xlsxwriter:                         1.1.0-py37_0              --> 1.1.1-py36_0           
    xlwt:                               1.3.0-py37_0              --> 1.3.0-py36_0           
    zict:                               0.1.3-py37_0              --> 0.1.3-py36_0           
    zope:                               1.0-py37_1                --> 1.0-py36_1             
    zope.interface:                     4.5.0-py37h14c3975_0      --> 4.5.0-py36h14c3975_0   

The following packages will be DOWNGRADED:

    python:                             3.7.0-hc3d631a_0          --> 3.6.6-hc3d631a_0       

Proceed ([y]/n)? y


Downloading and Extracting Packages
jdcal-1.4            | 11 KB     | ######################################################################## | 100% 
multipledispatch-0.6 | 21 KB     | ######################################################################## | 100% 

(中略)

patsy-0.5.0          | 322 KB    | ######################################################################## | 100% 
sphinxcontrib-websup | 36 KB     | ######################################################################## | 100% 
astroid-2.0.4        | 247 KB    | ######################################################################## | 100% 
Preparing transaction: done
Verifying transaction: done
Executing transaction: done

#3. docker hub 登録
ここからは、新たにソフトを導入したdockerを自分のhubに登録する方法です。
ご自身で何かソフトウェアを導入されたら、ぜひhubに登録することをお勧めします。

docker hubへのID登録が必要になります。

続きの作業を誰かに依頼したり、エラーがでてわからなくなったときに、対処方法を問い合わせるのにも役立ちます。
kaizenjapanは小川清のIDです。ご自身のIDで読み替えて、ご登録ください。

docker push

$ docker ps 
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                            NAMES
5a5136f16eab        continuumio/anaconda3   "/usr/bin/tini -- /b…"   2 hours ago 
peaceful_noice

$ docker commit 5a5136f16eab  kaizenjapan/anaconda-willi
sha256:4c4291a744d335cba469307e8c71e174eb0d25afed02055059bd9654926c80f2
$ docker push kaizenjapan/anaconda-willi
The push refers to repository [docker.io/kaizenjapan/anaconda-willi]
40b1bd665ba4: Pushing  46.21MB/2.017GB
513109f92bd0: Mounted from kaizenjapan/anaconda-pythonai 
443496790d0d: Mounted from kaizenjapan/anaconda-pythonai 
64e142099cde: Mounted from kaizenjapan/anaconda-pythonai 
b28ef0b6fef8: Mounted from kaizenja

#4. 参考資料(reference)

dockerでpython
https://hub.docker.com/r/continuumio/anaconda3/~/dockerfile/

ローカル環境をよごさずに Jupyter で python コードが動く環境を手軽につくる方法
https://qiita.com/yaiwase/items/3a58313e028315004a56

Anaconda の JupyterLab を Docker で使う
https://qiita.com/ao_log/items/350a3845d49f4b1d7198

機械学習を半自動化するauto-sklearnの環境構築(Mac&Docker)
https://qiita.com/inoue0426/items/ffd7f4235dcfde88942b

dockerで機械学習 with anaconda 一覧
https://qiita.com/kaizen_nagoya/items/ddd12477544bf5ba85e2

dockerで機械学習(1)with anaconda(1)「ゼロから作るDeep Learning - Pythonで学ぶディープラーニングの理論と実装」斎藤 康毅 著
https://qiita.com/kaizen_nagoya/items/a7e94ef6dca128d035ab

dockerで機械学習(2)with anaconda(2)「ゼロから作るDeep Learning2自然言語処理編」斎藤 康毅 著
https://qiita.com/kaizen_nagoya/items/3b80dfc76933cea522c6

dockerで機械学習(3)with anaconda(3)「直感Deep Learning」Antonio Gulli、Sujit Pal 第1章,第2章
https://qiita.com/kaizen_nagoya/items/483ae708c71c88419c32

dockerで機械学習(71) 環境構築(1) docker どっかーら、どーやってもエラーばっかり。
https://qiita.com/kaizen_nagoya/items/690d806a4760d9b9e040
dockerで機械学習(72) 環境構築(2) Docker for Windows
https://qiita.com/kaizen_nagoya/items/c4daa5cf52e9f0c2c002
dockerで機械学習(73) 環境構築(3) docker/linux/macos bash スクリプト, ms-dos batchファイル
https://qiita.com/kaizen_nagoya/items/3f7b39110b7f303a5558
dockerで機械学習(74) 環境構築(4) R 難関いくつ?
https://qiita.com/kaizen_nagoya/items/5fb44773bc38574bcf1c
dockerで機械学習(75)環境構築(5)docker関連ファイルの管理
https://qiita.com/kaizen_nagoya/items/4f03df9a42c923087b5d

「名古屋のIoTは名古屋のOSで」Dockerをどっかーらどうやって使えばいいんでしょう。TOPPERS/FMP on RaspberryPi with Macintosh編 5つの関門
https://qiita.com/kaizen_nagoya/items/9c46c6da8ceb64d2d7af

64bitCPUへの道 and/or 64歳の決意
https://qiita.com/kaizen_nagoya/items/cfb5ffa24ded23ab3f60

ゼロから作るDeepLearning2自然言語処理編 読書会の進め方(例)
https://qiita.com/kaizen_nagoya/items/025eb3f701b36209302e

Docker for windows

BIOSでInte Virtualization をenableにしていないと動作しないことを書いていない記事が多い。なぜかは調査中。

今更Docker for Windowsをインストールしたのでその備忘録
https://qiita.com/toro_ponz/items/d66d5571c4646ad33279

Docker for Windowsで起動時に「Docker for Windows - Access denied」と表示される場合の対処法
https://qiita.com/toro_ponz/items/d75706a3039f00ba1205

Windows 10 Hyper-Vユーザに送るDockerの解説
https://qiita.com/banban525/items/48aec05671c3c77d454a

Docker for WindowsでDockerを学ぶ (バージョンCE 17.06.2)
https://qiita.com/rubytomato@github/items/eec2118e89ee9bd8d17a

Docker for Windows をインストールする
https://qiita.com/centipede/items/f8d77b66343ef5096eee

Windows 10(Surface)にDocker for Windowsをインストール
https://qiita.com/chakimar/items/868298096ebf9186d690

<この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。>

6. 文書履歴(document history)

ver. 0.10 初稿 20181006
ver. 0.11 みだし、参考文献追記 20181019

最後までおよみいただきありがとうございました。

いいね 💚、フォローをお願いします。

Thank you very much for reading to the last sentence.

Please press the like icon 💚 and follow me for your happy life.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0