Windows10にMSYS2をインストールしgccとAnacondaを使えるようにするまでの流れ
はじめに
個人的にゲーム中に生成されるリプレイファイルの解析をしており、 その際にWindowsでしか使用できないソフトがあったのでWindowsにシェル環境を構築してみることにしました。 Windowsでの環境構築に関しては全くの初心者ですので、参考にするのは自己責任でお願いします。 今回は64bit版のMSYS2をインストールし、環境構築を行っていきます。
1. MSYS2のインストール
MSYS2はシェルがbashでパッケージマネージャーとしてpacman、デフォルトのターミナルはminttyというものらしく、
普段Linuxを使用している人もあまり迷うことなく使用できそうだったので今回はMSYS2をインストールすることにしました。
参考→MSYS2で快適なターミナル生活 - Qiita
MSYS2は MSYS2 homepageからmsys2-x86_64-20161025.exe(2017年10月時点)をダウンロードし、インストーラーの指示に従うだけで完了します。
ターミナルはC:\msys64\mingw64.exeを起動することで使えるようになります。(32bitの場合はmingw32.exe)
2. パッケージの更新
MSYS2をインストールした直後はパッケージのバージョンが古いので以下のコマンドで更新していきます。
$ pacman -Syuu
ちなみにpacmanのオプション
-Syはパッケージデータベースの更新
-Suはパッケージの更新(アップデートのみ)
-Suuはパッケージの更新(ダウングレードも許可する)
という意味らしいです。
また、初期の状態では最低限のパッケージしかインストールされていないらしいので、 Windowsでgccなどを利用できるMSYS2の環境設定など - Qiita を参考にgitやgccをインストールしました。
$ pacman -S vim gcc git gcc-libs openssh
--- 2017/10/27追記 ---
gccやC++のライブラリインストールに関して参考になりそうなサイトを見つけたので記載しておきます。
ccache - MinGW-w64 on MSYS2 - C++ ClockUpMemo
--- 追記ここまで ---
3. Anacondaのインストール
Anacondaの公式サイトからインストーラーをダウンロードして実行します。
https://www.anaconda.com/download/#_windows インストールは基本的にNextを押していけばいいですが、後半のAdvanced Optionsの画面で必ず Add Anaconda to my PATH environment variableとRegister Anaconda as my default Pythonにチェックを入れるようにしましょう。 チェックを入れずにインストールすると後でMYSYS2から呼び出すときに面倒です。
これでAnacondaのインストールは完了しましたが、まだターミナルから呼び出すことはできません。 次の章で環境変数PATHの設定について説明します。
4. Windowsの環境変数PATHをMYSYS2で引き継ぐようにする
初期のMSYS2の設定ではWindowsの環境変数PATHの設定を引き継ぎません。
つまり、環境変数PATHに追加されているAnacondaがMSYS2からは呼び出すことができません。
試しにMSYS2でwhere pythonとコマンドを入力してみると、Anacondaを見つけられていないことが分かると思います。
以下のサイトを参考にし、Windowsの環境変数にMSYS2_PATH_TYPEを追加し値をinheritに設定することで、Windowsの環境変数PATHをMSYS2で引き継ぐことができるようになります。
MSYS2/MinGW-w64 (64bit/32bit) インストール手順 メモ · GitHub
もう一度ターミナルを立ち上げ直し$ where pythonを実行すると、C:\Users\UserName\Anaconda3\python.exeと出力されるはずです。(パスはAnacondaのインストール先によって変わります)
さらに、ターミナルからpythonコマンドでAnacondaが呼び出されるように、winptyのインストールとパスの設定をします。
pacman -S winpty
上のコマンドを実行した後、以下を~/.bash_profileに追加します。
export ANACONDA_HOME=$HOMEDRIVE$HOMEPATH/Anaconda3
export PATH=$ANACONDA_HOME/Scripts:$ANACONDA_HOME:$PATH
alias python="winpty python"
alias ipython="winpty ipython"
alias jupyter="winpty jupyter"
MSYS2上でpython, jupyter, R, atomを使用する設定手順(Windows上でデータ分析するために) | takemikami's note
$ source ~/.bash_profile
を実行した後に、$ pythonと打つと、
Python 3.6.2 |Anaconda, Inc.| (default, Sep 19 2017, 08:03:39) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
Anacondaが呼び出せていることが確認できました。
UbuntuのバージョンによってVimとNeovimを使い分ける(自分用メモ)
はじめに
所属している学生団体で使用しているライブラリにUbuntu14.04でしか動かないものがあり仕方がなくUbuntu14.04を使用していましたが、
大学の研究室ではUbuntu16.04でも困らないので今回はUbuntu14.04とUbuntu16.04のデュアルブート環境を構築してみました。
今回はその際に起きた問題や解決策を自分用にメモしていきます。
問題その1.Ubuntu14.04でNeovimが動かない。
に書いたように、自分はVim8.0をビルドして使っていたのですが、どちらでも同じ環境を使えるようにUbuntu14.04にNeovim Unstable版をインストールしてみました。
しかし、なぜかNormal, Insertの表記やカーソルが文字化けし、まともに入力ができない状態になってしまいました。
この件については色々調べましたが、他の方はこの問題は起きていないのかあまり解決策がヒットせず、
結局Ubuntu14.04にNeovimをインストールすることは諦めました。
解決方法知っている方がいれば教えてください。
問題その2.Vimでpythonのパッケージ補完をすると動作が重たくなる
これは、解決方法はないのですが、VimにNeocomplete.vim, jedi-vimの組み合わせでかなり大きなPythonのパッケージ(NumpyとかPandasとか)の補完
をしようとすると処理に時間が掛かり、その間ユーザーは操作することができなくなってしまいます。
この件について、一定時間で処理を返すようにはできないのかネット上で質問してみたところ、なんとNeocomplete.vim作者のShougoさんから回答が返ってきました。
Shougoさんによると、
残念ながら、neocomplete では無理です。 それを実現するにはマルチスレッドかマルチプロセス化しなければいけないからです。 jedi-vim の補完はシングルスレッドなので、もし neocomplete がマルチスレッド化してもやはり止まってしまいます。 neovim をお使いなら deoplete.nvim + deoplete-jedi を使うと状況は多少改善されると思います。deoplete-jedi にはキャッシュ機能や補完のタイムアウトがあります。
ということでしたのでこの問題についてはこれ以上の解決方法がないという結論に至りました。
以上の問題から、Ubuntu14.04ではVim8.0、Ubuntu16.04ではNeovimを使用し、できるだけ環境を同じにしようと思います。
プラグインのリンクはこちらです↴
GitHubのリンクとVimの設定(自分用メモ)
ここに自分のGitHubへのリンクとVimの設定で調べたことを書いていきます。
VIM - Vi IMproved 8.0を使用しています。
vim-jp.org こちらを参考にlua, python3を有効にしました。
—インストール方法
$ sudo apt-get build-dep vim
$ sudo apt-get install git gettext libncurses5-dev libacl1-dev libgpm-dev
$ sudo apt-get install libperl-dev python-dev python3-dev ruby-dev
$ sudo apt-get install lua5.2 liblua5.2-dev
$ sudo apt-get install luajit libluajit-5.1
$ sudo apt-get install autoconf automake cproto
$ git clone https://github.com/vim/vim.git
$ ./configure --with-features=huge --enable-perlinterp --enable-pythoninterp --enable-python3interp --enable-rubyinterp --enable-luainterp --with-luajit --enable-fail-if-missing
$ make
$ sudo make install
これからインストールする予定のプラグインとインストールしたプラグイン一覧
— インストールするプラグイン
GitHub - justmao945/vim-clang: Clang completion plugin for vim
– vim-clangはC++補完を効かせるのに必要。なぜかうまくインストールできないので調べ中。。。
↓
— 2017/08/04追記 —
どうやらclangのコンパイルオプションの設定が悪かったみたい…。
dein.vimのlazy.tomlの設定の
let g:clang_cpp_options = '-std=c++1y -stdlib=libc++'
を
let g:clang_cpp_options = '-std=c++1y'
に変えたところうまく動いた。
Ubuntu14.04にlibc++
をインストールしたけど上の設定では挙動が変(遅い、補完候補がたまに違うものに変わる…?)なので調査中…。
sudo apt-get install libc++-dev
— 追記ここまで —
— インストールしたプラグイン
このサイトを参考にjedi-vimをインストールしました!
$HOME/.cache/dein/repos/github.com/davidhalter/jedi-vim
の中で
$ git submodule update --init
をするの忘れない。
他にもインストールしたプラグインがあるので随時更新します。
やっとChainerが動いた!!
一日調べまくってやっとChainerが動きました.
ソースコードはこちら↴
# -*- coding: utf-8 -*- import numpy as np import chainer from chainer import cuda, Function, gradient_check, report, training, utils, Variable from chainer import datasets, iterators, optimizers, serializers from chainer import Link, Chain, ChainList import chainer.functions as F import chainer.links as L from chainer.training import extensions class Model(Chain): def __init__(self, n_units, n_out): super(Model, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_units), l4=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) h3 = F.relu(self.l3(h2)) return F.relu(self.l4(h3)) def main(): epoch = 200 model = Model(64, 1) optimizer = optimizers.Adam() optimizer.use_cleargrads() optimizer.setup(model) is_gpu = True if(is_gpu): gpu_device = 0 cuda.get_device(gpu_device).use() model.to_gpu(gpu_device) xp = cuda.cupy else: xp = np data = [] for i in range(1, 10): for j in range(1, 10): data.append([xp.array([i, j], dtype=xp.float32), xp.array([i * j], xp.float32)]) loss = None for i in range(epoch): for x, t in data: model.cleargrads() y = model(Variable(x.reshape((1, 2)))) t = Variable(t.reshape((1, 1))) loss = F.mean_squared_error(y, t) loss.backward() optimizer.update() print("epoch = ", i, " / ", end="") print("loss = ", loss.data) # テスト flag = True while(flag): print("数値: ") one = int(input()) two = int(input()) d = xp.array([one, two], dtype=xp.float32) answer = model(Variable(d.reshape((1, 2)))) print("答え = ", answer.data) if __name__ == '__main__': main()
入力に掛け算の数字([1, 1], [1, 2], …, [6, 7], …, [9, 9])
正解データにその答え([1], [2], …, [42], …, [81])
を与えている.
ChainerのTrainerが分からない...
この一週間, Docmentや他の紹介記事を見てChainerの使い方を勉強していたが
Trainerの使い方が意味不明…
試しに掛け算を学習させてみようと思い
入力データとして[1, 1], [1, 2], …, [9, 9]のVariableと
正解データとして[1], [2], …, [81]のVariableを用意してみた.
恐らくTrainerを使わずに実装するとあっさり動くんだろうけどなんとしてもTrainerを使ってみたい.
# -*- coding: utf-8 -*- import numpy as np import sys import chainer from chainer import cuda, Function, gradient_check, report from chainer import training, utils, Variable from chainer import datasets, iterators, optimizers, serializers from chainer import Link, Chain, ChainList import chainer.functions as F import chainer.links as L from chainer.training import extensions class MyChain(Chain): def __init__(self, n_units, n_out): super(MyChain, self).__init__( l1=L.Linear(None, n_units), l2=L.Linear(None, n_units), l3=L.Linear(None, n_out), ) def __call__(self, x): h1 = F.relu(self.l1(x)) h2 = F.relu(self.l2(h1)) return F.relu(self.l3(h2)) def main(): is_gpu = True # CPUの場合はFalse xp = cuda.cupy if is_gpu else np batchsize = 3 model = MyChain(32, 1) # x_data : トレーニングデータ # t_data : 正解データ x_data = [] t_data = [] for i in range(1, 10): for j in range(1, 10): x_data.append(Variable(xp.array([i, j], dtype=xp.float32))) t_data.append(Variable(xp.array([i * j], dtype=xp.float32))) # 最適化 opt = optimizers.Adam() opt.use_cleargrads() opt.setup(model) train_iter = chainer.iterators.SerialIterator(x_data, batchsize) updater = training.StandardUpdater(train_iter, opt) trainer = training.Trainer(updater, (2000, 'epoch'), out='result') trainer.run() if __name__ == '__main__': main()
一度Trainer使わずやってみようかな.