Python
Go
環境構築
WindowsSubsystemForLinux

Windows Subsystem for Linuxの環境構築

Abstract

先日環境PATHをいじっていたら環境が壊れて新しくWindows Subsystem for Linux(WSL)をインストールしなおす運びになりました.これを機に環境構築の備忘録を残していきます.

Python

Qiitaの記事を参考にpyenv+Anacondaで構築しました.

pyenvのインストールとbashrcの設定

$ git clone https://github.com/yyuu/pyenv.git ~/.pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
$ echo 'eval "$(pyenv init -)"' >> ~/.bashrc
$ source ~/.bashrc

Anacondaのインストール

$ pyenv install -l | grep ana
$ pyenv install anaconda3-5.2.0
$ pyenv rehash
$ pyenv global anaconda3-5.2.0
$ echo 'export PATH="$PYENV_ROOT/versions/anaconda3-2.5.0/bin/:$PATH"' >> ~/.bashrc
$ source ~/.bashrc

Conda環境

Conda環境の作成

condaとpipを混ぜると危険らしいのでcondaで環境を分けてその環境ではpip installしか使わないことにします.調べてみるとactivate衝突問題というのがあるようです.conda 4.4.0からconda activateというのが導入されたようなのでこれを試すことにしました.

まず仮想環境hogeを適当に作ります.

$ conda create -n hoge python=3.6

次になにも準備せずにconda activate hogeとすると当たり前ですがエラーが出ます.

$ conda activate hoge

CommandNotFoundError: Your shell has not been properly configured to use 'conda activate'.
If your shell is Bash or a Bourne variant, enable conda for the current user with

    $ echo ". /home/<username>/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh" >> ~/.bashrc

or, for all users, enable conda with

    $ sudo ln -s /home/<username>/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh /etc/profile.d/conda.sh

The options above will permanently enable the 'conda' command, but they do NOT
put conda's base (root) environment on PATH.  To do so, run

    $ conda activate

in your terminal, or to put the base environment on PATH permanently, run

    $ echo "conda activate" >> ~/.bashrc

Previous to conda 4.4, the recommended way to activate conda was to modify PATH in
your ~/.bashrc file.  You should manually remove the line that looks like

    export PATH="/home/<username>/.pyenv/versions/anaconda3-5.2.0/bin:$PATH"

^^^ The above line should NO LONGER be in your ~/.bashrc file! ^^^

というわけで言われた通りbashrcに書き加えるとconda activateが使えるようになりました.

$  echo ". /home/<username>/.pyenv/versions/anaconda3-5.2.0/etc/profile.d/conda.sh" >> ~/.bashrc
$ source ~/.bashrc
$ conda activate hoge
(hoge) :$

Conda環境にライブラリをインストール

上で述べたようにcondaの環境内ではpip installしか使いません.今回は研究で使うガウス過程のライブラリGPyをインストールしました.

$ pip install gpy

jupyter

Conda環境ごとに切り替え

Conda環境ごとに分けることにしたのでjupyterでも簡単にConda環境を切り替えたいと思いました.調べてみるとjupyterで環境を変えるパッケージの導入法が記事になっていたのでこの通りにしました.

$ pip install environment_kernels
$ jupyter notebook --generate-config

上記の記事には一行だけでいいとありましたが自分の環境では二行書き加えないと環境を切り替えられませんでした.conda info -eで表示されるbase直下のenvs/ディレクトリを指定します.

$ conda info -e
base                  *  /home/<username>/.pyenv/versions/anaconda3-5.2.0
hoge                     /home/<username>/.pyenv/versions/anaconda3-5.2.0/envs/hoge

~/.jupyter/jupyter_notebook_config.pyに以下を書き加えます.

c.NotebookApp.kernel_spec_manager_class = 'environment_kernels.EnvironmentKernelSpecManager'
c.EnvironmentKernelSpecManager.env_dirs=['/home/<username>/.pyenv/versions/anaconda3-5.2.0/envs/']

Conda環境ごとに切り替えられなかったら

(2018/06/14追記)
上のやり方でうまく切り替わる場合と切り替わらない場合がありました.実験してみたところconda create -n env anacondaとしたときはうまくいく一方でconda create -n envとしたときはうまくいきませんでした.(両方ともconda info -eとするときちんと仮想環境が作れているのですが)

Anacondaの中でもjupyterを仮想環境にインストールしないといけないようです.当面は仮想環境を作るときにjupyterをインストールすることにします.

$ conda create -n <envname> jupyter

jupyter labの拡張

(2018/06/14追記)
せっかくノートブック形式でいろいろやれるのだから目次が欲しいところです.幸いlabextensionを導入することでいろいろと拡張できます.まずは公式ドキュメントにしたがってnode.jsを導入します.

$ conda install -c conda-forge nodejs

今回はjupyterlab-tocをインストールします.JupyterLabのバージョンは0.32以上が必要なので適宜condaをアップデートするなどして最新のjupyterをインストールします.

$ jupyter labextension install jupyterlab-toc

Go言語

「Go言語によるWebアプリケーション開発」を参考にしました.

コンパイラのインストール

公式サイトからGo言語のコンパイラをダウンロードしてインストールしました.せっかくなので最新版のgo1.10をインストールすることにしました.

$ wget https://dl.google.com/go/go1.10.3.linux-amd64.tar.gz
$ sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

ソースコードのダウンロード

WSLでUbuntuを起動してから以下のコマンドを実行して取得しました.

$ git clone https://go.googlesource.com/go
$ cd go
$ git checkout go1.10

次にsrcディレクトリに移動しビルドのためのスクリプトを実行しました.

$ cd src
$ GOROOT_BOOTSTRAP=/usr/local/go ./all.bash

いくつかのテストで失敗しました(startServer failed: listen unixgram /tmp/syslogtest998263365: setsockopt: invalid argument など).ググってみるとWSL固有の問題のようです.FAILとなった部分のメモを残して次に進みました.

PATHの追加

GOPATHとGOROOT,PATHなどいろいろ設定するのがあってややこしいのですが検索結果によるとGOPATHとPATHを設定すればいいようです.ただ$HOME/goをGOPATHにするとwarning: GOPATH set to GOROOT has no effect といわれてしまうので以下のようにGOPATHを設定しました.

$ echo 'export GOPATH=$HOME' >>~/.bashrc
$ echo 'export PATH=$PATH:$GOPATH/bin' >>~/.bashrc
$ go env

と打てばGOPATHなどを確認できます(go/binがPATHにないとそもそもgo envを使えませんが…).

動作確認

Windowsの適当なフォルダに以下のコードを作成します.コマンドプロンプトでこのディレクトリに移動しbashを起動した後go run test.goとやってHello,world!が出力されれば成功です.

test.go
package main

import "fmt"

func main() {
    fmt.Printf("Hello, world!\n")
}

参考記事

データサイエンティストを目指す人のpython環境構築 2016
condaとpip:混ぜるな危険
pyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類
Condaで作ってる仮想環境の切り替えをJupyter上で簡単に行う方法
【Go】結局、$GOPATHと$GOROOTはどこに設定すればいいの?