kb84tkhrのブログ

何を書こうか考え中です あ、あと組織とは関係ないってやつです 個人的なやつ

Python プロフェッショナルプログラミング 第3版: 開発環境構築

Python プロフェッショナルプログラミング 第3版 やっていくよ
この本はつまみ食いで試していこうと思う

マシンはWindows/macOS/Linuxを使い、サーバーのテスト環境として、仮想マシン上のUbuntuを使う、という前提で説明します。

ということなんでWindowsでもいいんだろうなと思うんだけれども
コマンドの例は仮想マシンだけでなくホスト側もUbuntuっぽく、
最初は混乱した

「開発環境」と言ったら
開発のためにエディタやIDEを起動する環境のことなのか
開発中の実行環境のことなのかどっちなんだというね

最初はエディタを起動するほうの環境かと思ったけどそうではないようす
そっちは何環境って呼べばいいのかな
そっちも仮想マシン立ち上げてUbuntu上で開発するってのも面白いかもしれない
気が向いたら試してみよう

Chapter 01: Pythonをはじめよう(ちょっとだけ)

本書ではPython開発環境のOSとして「Ubuntu16.04 LTS」を前提として説明します。

ここでは、開発中に開発しているプログラムを動かす環境のことを
開発環境と言ってるんだよな
ここでだいぶ混乱した
もしかしたら今でも混乱しているかもしれない

またゲストOSを動かす環境として、「VirtualBox」と「Vagrant」を利用しています。
これらの環境構築に関しては、「Appendix A: 開発環境のセットアップ」として
用意していますので、初学者の方はまず、Appendixを参照してください。

Appendix A: 開発環境のセットアップ

VirtualBoxとVagranをインストール
なにも考えずデフォルトのまま

インストールが完了したら、ターミナル(macOSではTerminal.appというアプリケーションが標準で用意されています)を起動し下記コマンドを実行してインストールされているか確認しましょう。

Windowsおいてけぼり感
気分的にGit Bashからやってみようか
そういえばWindowsだとWSLとやらでUbuntuらしきものが動くんだったな
普通に使いものになるんだろか
これもいずれ試してみる・・・ってどんどん逸れていく一方なのでは

$ vagrant -v
Vagrant 2.2.4

こんな感じでよろしいでしょうか
ゲストにはubuntu/xenial64を使う
ダウンロードにしばらく時間がかかるのでその間にこのxenial64ってのが
なんなのか調べてみよう

Vagrant Cloud上ではVagrant box ubuntu/xenial64 - Vagrant Cloudだけど
ここにはなんにも情報がないように見える

ほかの検索結果はだいたいQiitaとか
公式ページみたいなのはないのかな
それともただのUbuntuで特に言うことはないってことかな
サーバ版とデスクトップ版とあるみたいだけどどっちが入るんだろう
Vagrantfileってやつを見ろってことなのかね
ユーザ名とパスワードで苦労した人がいっぱいいるみたいだけど

とかやってるうちにダウンロードできた

$ vagrant box add ubuntu/xenial64
==> box: Loading metadata for box 'ubuntu/xenial64'
    box: URL: https://vagrantcloud.com/ubuntu/xenial64
==> box: Adding box 'ubuntu/xenial64' (v20190406.0.0) for provider: virtualbox
    box: Downloading: https://vagrantcloud.com/ubuntu/boxes/xenial64/versions/20190406.0.0/providers/virtualbox.box
    box: Download redirected to host: cloud-images.ubuntu.com
    box:
==> box: Successfully added box 'ubuntu/xenial64' (v20190406.0.0) for 'virtualbox'!
$ vagrant box list
ubuntu/xenial64 (virtualbox, 20190406.0.0)

初期化

$ vagrant init ubuntu/xenial64
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

中身を見てみる
config.vm.box = "ubuntu/xenial64"の行以外は全部コメントアウトされてる

起動
いっぱいメッセージが出る
情報ないから一度読んでおこうと思ったけどいまいま役に立ちそうな情報はなさげ
共有フォルダの場所くらいか

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'ubuntu/xenial64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'ubuntu/xenial64' version '20190406.0.0' is up to date...

   :
   :

    default: VirtualBox Version: 6.0
==> default: Mounting shared folders...
    default: /vagrant => D:/Dropbox/takahiro/Documents/study/PPP3/work

sshで接続
ここもたいしたことは言ってない
そういえば、パスワードは聞かれなかったな
vagrant sshで接続するだけなら不要ってことか

$ vagrant ssh
Welcome to Ubuntu 16.04.6 LTS (GNU/Linux 4.4.0-145-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.

New release '18.04.2 LTS' available.
Run 'do-release-upgrade' to upgrade to it.

パッケージを最新化

vagrant@ubuntu-xenial:~$ sudo apt -y update
Get:1 http://security.ubuntu.com/ubuntu xenial-security InRelease [109 kB]
Hit:2 http://archive.ubuntu.com/ubuntu xenial InRelease
   
   :
   :

Fetched 15.8 MB in 1min 15s (209 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
vagrant@ubuntu-xenial:~$ sudo apt -y upgrade
Reading package lists... Done

   :
   :

update-initramfs: Generating /boot/initrd.img-4.4.0-145-generic
W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.

VMを止める

vagrant@ubuntu-xenial:~$ exit
logout
Connection to 127.0.0.1 closed.

$ vagrant halt
==> default: Attempting graceful shutdown of VM...
$ vagrant global-status
id       name    provider   state    directory
-----------------------------------------------------------------------------------
3777ae8  default virtualbox poweroff D:/Dropbox/takahiro/Documents/study/PPP3/work

ふむ
「ゲストOSが本当にシャットダウンしているか確認する場合は
vagrant global-statusコマンドを実行してください」って
書いてあるけど実行例にはrunning状態のゲストしかいないのは
どういうことか
まあいいや

日本語設定
あらためてvagrant upからvagrant sshして

vagrant@ubuntu-xenial:~$ sudo apt install language-pack-ja
Reading package lists... Done

    :
    :

Setting up language-pack-ja (1:16.04+20171210) ...
Setting up language-pack-ja-base (1:16.04+20160627) ...
Generating locales (this might take a while)...
  ja_JP.UTF-8... done
Generation complete.
vagrant@ubuntu-xenial:~$ sudo update-locale LANG=ja_JP.UTF-8
vagrant@ubuntu-xenial:~$ vi .bashrc
# 末尾に`export LANGUAGE=ja_JP:ja`を追加
vagrant@ubuntu-xenial:~$ source ~/.bashrc
vagrant@ubuntu-xenial:~$ fjkalds;
fjkalds: コマンドが見つかりません

なった

プライベートネットワークの設定
Vagrantfileの下の行のコメントアウトを外すだけ

  # config.vm.network "private_network", ip: "192.168.33.10"

でこれはいつ反映されるんだというと
さすがにファイル保存則反映ってことはない

$ ping 192.168.33.10

192.168.33.10 に ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。

vagrant reloadしてやるとUACが出た
これは反映されたっぽいな

$ vagrant reload
  :
  :
$ ping 192.168.33.10

192.168.33.10 に ping を送信しています 32 バイトのデータ:
192.168.33.10 からの応答: バイト数 =32 時間 <1ms TTL=64

ok

実際に開発をするときは、ホストOS上で普段使い慣れたエディターでプログラムを書いて、そのファイルをゲストOSに転送して動作を確認します。

やっぱそういうやり方になるのね
ここのコメントアウトを外して“../data”を“./src”に変更して
srcディレクトリを作ってreload
ところで“./”って書かないといけないものかな
基準はVagrantfileのあるディレクトリだそうな

  # config.vm.synced_folder "../data", "/vagrant_data"

お試し

$ touch src/sample.txt
$ vagrant ssh
vagrant@ubuntu-xenial:~$ ls /vagrant_data
sample.txt

できてる

ゲストのスナップショットを取る

$ vagrant snapshot save PPP3-20190408
==> default: Snapshotting the machine as 'PPP3-20190408'...
==> default: Snapshot saved! You can restore the snapshot at any time by
==> default: using `vagrant snapshot restore`. You can delete it using
==> default: `vagrant snapshot delete`.

takahiro@Bordeaux MINGW64 /d/Dropbox/takahiro/Documents/study/PPP3/work
$ vagrant snapshot list
PPP3-20190408

できた

リストアしてみる
へんなの出た

takahiro@Bordeaux MINGW64 /d/Dropbox/takahiro/Documents/study/PPP3/work
$ vagrant snapshot restore PPP3-20190408
==> default: Forcing shutdown of VM...
==> default: Restoring the snapshot 'PPP3-20190408'...
==> default: Checking if box 'ubuntu/xenial64' version '20190406.0.0' is up to date...
==> default: Resuming suspended VM...
==> default: Booting VM...
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "c78f6681-5a53-4347-a90d-5f77e39d3157", "--type", "headless"]

Stderr: VBoxManage.exe: error: Failed to load unit 'lsilogicscsi' (VERR_SSM_LOADED_TOO_LITTLE)
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

あてずっぽうなコマンドで現状を確認

$ vagrant status
Current machine states:

default                   saved (virtualbox)

To resume this VM, simply run `vagrant up`.

vagrant upしろとの仰せ

$ vagrant up
VBoxManage.exe: error: Details: code E_FAIL (0x80004005), component ConsoleWrap, interface IConsole

だめじゃない
いちどhaltしてからやってみるか

$ vagrant halt
$ vagrant up
$ vagrant ssh

こんどは起動した模様

ところでこのスナップショットとか、その前にOSのイメージ
そのものとかはどこに保存されてるの

$ pwd
/c/Users/takahiro/VirtualBox VMs/work_default_1554725896171_49324/Snapshots
$ ls -l
drwxr-xr-x 1 takahiro 197609          0 4月   8 22:43 Snapshots
-rw-r--r-- 1 takahiro 197609 1313800192 4月   8 22:43 ubuntu-xenial-16.04-cloudimg.vmdk
$ cd Snapshots/
$ ls -l
total 127896
-rw-r--r-- 1 takahiro 197609 129522805 4月   8 22:43 2019-04-08T13-43-02-805959000Z.sav

この1.3Gくらいあるやつがそうかな
ちょっと置き場所考えないとだな