===================================== POSIX 環境の設定 (WSL Ubuntu の設定) ===================================== .. contents:: 目次 :depth: 4 Windows 用の POSIX 環境として WSL 上の Ubuntu が整備出来ましたので、 ここからは Ubuntu の設定を行っていきます。 Windows 以外の環境から仮想マシン等で Ubuntu を使う場合、 このパートの内容はそのまま適用可能です。 このパートの設定では PowerShell は使いません。 :ref:`Howto-start-Ubuntu` の方法で WSL を起動して WSL 上の Ubuntu から行って下さい。 .. _auto_proxy_setting_for_ubuntu: Proxy の設定 =============== 大学や企業では、セキュリティ対策や通信量の節約を目的として、 インターネットとの間に Firewall を設けると共に、 proxy サーバー経由の通信を必須としている場合があります。 そのような環境では `WPAD (Web Proxy Auto-Discovery) Protocol`_ を用いて、 `PAC (Proxy Auto-Config)`_ ファイルを提供することで、プロキシを自動的に検出して 設定をおこなうような仕組みを用いている場合があります。 .. _WPAD (Web Proxy Auto-Discovery) Protocol: .. _WPAD: https://ja.wikipedia.org/wiki/Web_Proxy_Auto-Discovery_Protocol .. _PAC (Proxy Auto-Config): .. _PAC: https://ja.wikipedia.org/wiki/Proxy_Auto-Config インストール直後、標準設定状態の WSL では Proxy の設定を自動検出できませんので、 インターネット経由のパッケージ導入等が出来ません。 Proxy を検出して自動的に設定を行うために、以下の手順を実施してください。 #. WSL に Ubuntu を導入済みのパソコンをインターネットに接続してください。 #. インターネット接続に認証等が必要な場合は、必要な認証も済ませてください。 #. WSL に導入した Ubuntu のコマンドラインを開きます。 #. WSL 上で動作している Ubuntu のコマンドラインに :numref:`WSL 上の Ubuntu に自動 Proxy を設定するコマンド` をコピペして実行してください。 WSL 導入の際、初回起動時に登録したパスワードを求められるので、正しく入力してください。 .. sudo sh -c 'printf $@>$0;chmod 440 $0' /etc/sudoers.d/inherit_proxy 'Defaults\tenv_keep+=%s_proxy\n' {f,ht}tp{,s} no .. code-block:: bash :class: forCnP :caption: WSL 上の Ubuntu に自動 Proxy を設定するコマンド :name: WSL 上の Ubuntu に自動 Proxy を設定するコマンド proxy_setup () { cd /tmp sudo sh -c 'printf $@>$0;chmod 440 $0' /etc/sudoers.d/inherit_proxy 'Defaults\tenv_keep+=%s_proxy\n' {f,ht}tp{,s} no mkdir -p ~/.config/bash/bashrc.d cat >~/.config/bash/bashrc.d/autoproxy.sh <<-'EOD' function proxy_autoset () { . ~/.config/bash/bashrc.d/autoproxy.conf >&/dev/null && return proxy_fromsystem || proxy_wpad } function proxy_fromsystem () { type powershell.exe >&/dev/null || return proxy_set "$(powershell.exe -C '&{[System.Net.WebRequest]::GetSystemWebProxy().GetProxy($Args[0]).AbsoluteUri|sls -not $Args[0]|Write-Host -n}' "https://google.com/")" } function proxy_pac () # { : ${PROXY_PAC:=$1} proxy_set "$( if type wget >&/dev/null; then wget --no-proxy -qO - "${PROXY_PAC}" elif type curl >&/dev/null; then curl --noproxy "*" -s "${PROXY_PAC}" fi \ | grep PROXY \ | sed -E 's@^.*"\s*PROXY\s*([^"]*)\s*".*$@http://\1@g' )" } function proxy_wpad () { proxy_pac http://wpad/wpad.dat } function proxy_set () # { [ -z "$1" ] && { proxy_unset; return; } declare -gx {ftp,http,https}_proxy="$1" declare -gx no_proxy="localhost,127.0.0.1,localnet" } function proxy_unset () { unset {ftp,http,https,no}_proxy } function proxy_register () { proxy_export >~/.config/bash/bashrc.d/autoproxy.conf } function proxy_unregister () { rm ~/.config/bash/bashrc.d/autoproxy.conf } function proxy_on () { proxy_autoset } function proxy_off () { proxy_unset } function proxy_export () { declare -gp {ftp,http,https,no}_proxy | sed -E 's/-/-g/' } proxy_autoset EOD local bak=~/.bashrc,$(date -r ~/.bashrc +%Y%m%d_%H%M%S) cp -a ~/.bashrc "$bak" grep -v "^: proc bashrc.d;" "$bak" >~/.bashrc echo ': proc bashrc.d; for i in ~/.config/bash/bashrc.d/*.sh; do . "$i"; unset i; done' >>~/.bashrc . ~/.config/bash/bashrc.d/autoproxy.sh } proxy_setup 上記の設定では、以下の 3 点の設定を行っています。 * 実行するコマンドに root [#root]_ 権限を与える ``sudo`` に proxy を渡す設定を ``/etc/sudoers.d/inherit_proxy/inherit_proxy`` に追加 * proxy の自動検出機能を ``~/.config/bash/bashrc.d/autoproxy.sh`` に追加 * bash 起動時に ``~/.config/bash/bashrc.d/`` 以下の設定ファイルを全て読み込む機能を bash の設定ファイル ``~/.bashrc`` に追加 .. note:: 上記スクリプトによる proxy の設定状況は ``proxy_export`` コマンドで確認出来ます。山口大学の学内で情報コンセントや無線 LAN を利用している場合は :numref:`山口大学学内の情報コンセント環境下における proxy_export 実行例` のような結果が得られるでしょう。 .. code-block:: console :caption: 山口大学学内の情報コンセント環境下における proxy_export 実行例 :name: 山口大学学内の情報コンセント環境下における proxy_export 実行例 $ proxy_export declare -gx ftp_proxy="http://proxy.cc.yamaguchi-u.ac.jp:8080/" declare -gx http_proxy="http://proxy.cc.yamaguchi-u.ac.jp:8080/" declare -gx https_proxy="http://proxy.cc.yamaguchi-u.ac.jp:8080/" declare -gx no_proxy="localhost,127.0.0.1,localnet" もし山口大学学内の情報コンセント環境下で使っているのに、proxy が自動で拾えない人は、 ``curl http://wpad/wpad.dat`` または ``wget -O- http://wpad/wpad.dat`` で `PAC`_ ファイルが取得できるか確認してください [#WPADの名前解決]_。 `PAC`_ ファイルが取得できない場合は、 `WPAD`_ によるプロキシの自動解決が出来ないので :numref:`WSL 上の Ubuntu に自動 Proxy を設定するコマンド` を設定後、 :numref:`proxy の手動設定` の設定を行うことで、手動設定した proxy を永続化出来ます。 解除したい場合は ``proxy_unregister`` コマンドを実行してください。 自宅等で proxy が不要な場合は ``proxy_on`` , ``proxy_off`` コマンドで一時的に ON/OFF を切り替えることができます。 .. code-block:: :name: proxy の手動設定 :caption: proxy の手動設定 :class: forCnP proxy_set http://proxy.cc.yamaguchi-u.ac.jp:8080/ proxy_register .. [#root] UNIX において OS の管理者権限を持つ super user には root というユーザー名を当てるのが慣例となっています。 Windows で言う所の Administrator というユーザー名に相当します。 .. [#wpadの名前解決] DNS suffix の機能で wpad 以下のホスト名を解決出来る必要があります。 山口大学内では wpad にサフィックスとして .cc.yamaguchi-u.ac.jp を補って、 wpad.cc.yamaguchi-u.ac.jp という名前を解決します。 DNS suffix が使えない場合、山口大学限定の方法になりますが、 ``/etc/hosts`` に ``172.17.1.3 wpad`` を加えておくことで名前解決させることは出来ます。 .. _install_packages_required_for_practice: 演習に必要なパッケージの導入 ============================ 最後に演習必要となる wslu, Python3, Jupyter Notebook, numpy, matplotlib, OpenCV のパッケージを導入して環境構築を終えましょう。 WSL 上で動作している Ubuntu のコマンドラインに :numref:`WSL 上の Ubuntu に演習に必要となるパッケージを導入するコマンド` をコピペして実行してください。 .. code-block:: bash :class: forCnP :caption: WSL 上の Ubuntu に演習に必要となるパッケージを導入するコマンド :name: WSL 上の Ubuntu に演習に必要となるパッケージを導入するコマンド sudo apt update; sudo apt install -y wslu python3-pip python3-opencv python3-matplotlib jupyter 2023-05-27 現在、インストール直後の WSL Ubuntu に行ったところ、463 ファイル 378MB をダウンロードしてインストール後 1809 MB を消費する状況でしたので、多少時間がかかります。気長に待ってください。 .. _setup_for_jupyter_notebook: Jupyter Notebook の設定 ========================== 必要なパッケージのインストールが完了したら、 WSL 上で動作している Ubuntu のコマンドラインに :numref:`Jupyter Notebook の設定コマンド` のコマンドを実行してください。この設定を行っておくことで、Jupyter Notebook 起動時に自動的に web ブラウザが開くようになります。 .. code-block:: bash :class: forCnP :caption: Jupyter Notebook の設定コマンド :name: Jupyter Notebook の設定コマンド jupyter notebook --generate-config sed -i,bak -E 's/^#?(c.NotebookApp.use_redirect_file\s*=\s*).*/\1False/g' ~/.jupyter/jupyter_notebook_config.py 以上で、設定は終了です。 .. _starting_jupyter_notebook: Jupyter Notebook の起動 ========================== 最後に、Jupyter Notebook が起動することを確認しましょう。 WSL 上で動作している Ubuntu のコマンドラインに :numref:`Jupyter Notebook の起動コマンド` のコマンドを実行してください。 .. code-block:: bash :class: forCnP :caption: Jupyter Notebook の起動コマンド :name: Jupyter Notebook の起動コマンド jupyter notebook 上手く起動したら web ブラウザに :numref:`fig_jupyter_notebook` のようなページが表示されるはずです。 .. figure:: fig_jupyter_notebook.png :name: fig_jupyter_notebook Jupyter Notebook 右上の「New ▼」からプルダウンメニューを開いて「Python 3」を作成しましょう。 白紙のノートが開いたら「+」ボタンでコードブロックを 4 つに増やして以下の4つのコードを順に貼り付けます。 最後に「▶▶ (restart the kernel then re-run the whole notebook (with dialog))」で実行してください。 .. code-block:: ipython3 :class: forCnP :caption: Jupyter notebook サンプル1 コードブロック1 :name: Jupyter notebook サンプル1 コードブロック1 import cv2 import os url = "https://upload.wikimedia.org/wikipedia/commons/thumb/2/2f/Apollo_17_Cernan_on_moon.jpg/233px-Apollo_17_Cernan_on_moon.jpg" !curl -sO "$url" img = cv2.imread(os.path.basename(url), cv2.IMREAD_UNCHANGED) .. code-block:: ipython3 :class: forCnP :caption: Jupyter notebook サンプル1 コードブロック2 :name: Jupyter notebook サンプル1 コードブロック2 import matplotlib.pyplot matplotlib.pyplot.imshow(cv2.cvtColor(img, img.ndim == 2 and cv2.COLOR_GRAY2RGBA or [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGRA2RGBA][img.shape[2] - 3])) matplotlib.pyplot.show() .. code-block:: ipython3 :class: forCnP :caption: Jupyter notebook サンプル1 コードブロック3 :name: Jupyter notebook サンプル1 コードブロック3 import IPython.display IPython.display.display(IPython.display.Image(cv2.imencode(".png", img)[1].tobytes())) .. code-block:: ipython3 :class: forCnP :caption: Jupyter notebook サンプル1 コードブロック4 :name: Jupyter notebook サンプル1 コードブロック4 import PIL display(PIL.Image.fromarray(cv2.cvtColor(img, img.ndim == 2 and cv2.COLOR_GRAY2RGBA or [cv2.COLOR_BGR2RGBA, cv2.COLOR_BGRA2RGBA][img.shape[2] - 3]))) 無事、環境構築が成功していれば、:numref:`fig_jupyter_notebook_sample001_result` のような実行結果が得られるはずです。 .. figure:: fig_jupyter_notebook_sample001_result.png :name: fig_jupyter_notebook_sample001_result Jupyter notebook サンプル1 実行結果 .. _quit_jupyter_notebook: Jupyter Notebook の終了 ========================== Web ブラウザ上から Quit を実施するか、 Jupyter Notebook を実行中の WSL で [CTRL]+[C] を数回叩くと Juyter Notebook のサーバーが終了します。