Cygwin絶対殺すマン ~物理のオタクがWindows Subsystem for Linuxで数値計算できるようになるまで~

  • 78
    いいね
  • 0
    コメント

2017/08/17 Creators UpdateでWindows側のアプリが呼べるようになったとか結構変更が入ったのですが、
Insider Programを見てる感じFall Creators UpdateでWSL自体が変わりそうなのでそのタイミングで書き換えます。
Xmingの他にVcXsrvも紹介しておきます(昔からXmingばかり使っていたんですが、最近はVcXsrvの方が性能が良いみたいですね)

2016/10/25 久しぶりに見たら結構ストックされてた。ありがとうございます。
Ssh Server、Windows<->Ubuntu、並列計算、Xmingについて加筆修正しました。

長くなってきたのでWindows側の設定は別記事に書きます(すぐに書くとは言ってない)

  • Visual Studio Code(メモ:Integrated Terminalでbashを使うにはユーザ設定に"terminal.integrated.shell.windows ": "C:\WINDOWS\sysnative\bash.exe"を書き込めばOK)
  • TeX(とりあえずTeX Liveいれとけ)
  • ConEmu

などの予定

bash on Ubuntu on Windowsの起動

Windows 10の入手

既にWindows 10のPCをそのままアップグレードする場合はWindows Updateをかけていればそのうち出てきます。
または[設定]→[更新とセキュリティ]→[Windows Update]→[詳細情報]より、Anniversary Updateのダウンロードページに飛ぶことができます。

クリーンインストールのためにはMicrosoftからメディア作成ツールが配信されています。
ここからツールをダウンロードしてください。
起動後にライセンス条項に同意すると実行する動作を決めることになるので、[他のPC用にインストールメディアを作る]を選びます。
あとはDVDに焼くなりUSBフラッシュメモリを使うなりしてインストールしてください。

bash のインストール

まずは[設定]を開き[更新とセキュリティ]→[開発者向け]→[開発者モード]にチェックを入れます。ここで一度再起動します。
次に[コントロールパネル]を開き、[プログラム]→[Windows の機能の有効化または無効化]→[Windows Subsystem for Linux (Beta)]にチェックを入れます。
ここでもう一度コンピュータを再起動します。
次はコマンドプロンプトを起動しましょう。Win+Rのあとcmdで出せます。スタートメニューからでもOKです。
起動したらbashと打ってEnterすればインストールが始まります。
ユーザー名とパスワードを聞かれるので適当に決めましょう。
パスワードは入力しても画面に表示されませんが仕様です。

以下、特別な場合を除きbashといえばbash on Ubuntu on Windowsを指します。
またインストール途中に何か聞かれても基本的に全部YesでOKです。

Ssh Server

普通の物理のオタクはSsh Server機能を使わないので、セキュリティ的な意味で切っておきましょう。
[コントロールパネル]→[システムとセキュリティ]→[Windows ファイアウォールによるアプリケーションの許可]を開き
[設定の変更]で[Ssh Server]のチェックを外します。

CとFortranの実行

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

bashを起動し

$ sudo apt-get install build-essential gfortran

でEnterしてください。終わりです。
(パスワードを求められたら入力してください)
これでgcc、g++、gfortran等を使えるようになります。
ためしにgcc --versionと打ってEnterしてみましょう。

$ gcc --version
gcc (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
Copyright (C) 2013 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

となり現在インストールされているgccのバージョン(2016/06/27時点)が表示されます。
これが表示されれば正しくインストールされています。

実行テスト

それでは実際にプログラムを書いて実行してみましょう。
まずは

$ vim testC.c

と入力して Vim を起動します。Emacs?そんなものは知らん。
iで挿入モードにして以下のコードを入力し、Escでコマンドモードに戻り:wqで保存して終了します。
詳しい使い方はVimコマンドまとめあたりを参照しましょう。

testC.c
#include<stdio.h>

int main(void){
    printf("Hello, World!\n");

    return 0;
}

次にこれをコンパイルして実行してみます。

$ gcc testC.c

でコンパイルして

./a.out

で実行しましょう。画面に

$ ./a.out
Hello, World!

と表示されれば成功です。
Fortranも以下のコードをコンパイルしてみてください。

testF.f95
program testF
    implicit none
    print *, "Hello, World!"
end program

コンパイルは

$ gfortran testF.f95

で行います。

$ ./a.out
Hello, World!

で成功です。

Make

ところで上で作ったtestC.cですが、もっと簡単にコンパイルすることができます。
vim Makefileとして次のようなファイルを作ってください。

Makefile
testC:

ここでmakeコマンドを実行すると

$ make
cc testC.c -o testC

コンパイルされて./testCで実行可能なtestCが生成されます。
このようなmakeの利用はプログラムが大規模になると必須です。

に詳しいです。

Windows <-> Ubuntu

WindowsからUbuntuを見るとき

ところで、さっき作ったtestC.cをWindows側から操作したくなったらどうしましょう。
そのためにはさっきまでいじっていたUbuntuがWindowsのどこにあるか知る必要があります。
bashで
bash:
$ cd ~

でアクセスできるディレクトリは、Windowsからはcmd.exe

cd C:\Users\Windowsのアカウント名\AppData\Local\lxss\home\上で設定したUbuntuのユーザー名

を実行すれば行くことができます。試しにdirコマンドでディレクトリの中身を表示すれば、さっき作ったtestC.cが見つかるはずです。
もちろん、WindowsのGUI、つまり普段マウスで操作しているウインドウでも同じ場所には行けますが、そのためには
[コントロールパネル]→[デスクトップのカスタマイズ]→[エクスプローラーのオプション]→[表示]から
[保護されたオペレーティングシステムファイルを表示しない(推奨)]のチェックを外しておく必要があります。

UbuntuからWindowsを見るとき

逆にUbuntuからみるときはbashで

$ cd /mnt/c/Windowsのアカウント名

でWindowsのホームディレクトリ(ピクチャやドキュメントの1つ上のディレクトリ)にアクセスできます。
例として、Dropboxにあるexample.f90ファイルをUbuntuのホームディレクトリにコピーするときは

$ cp /mnt/c/Users/Windowsのアカウント名/Dropbox/example.f90 ~/

とします。

並列計算

並列計算を行いたいときはOpenMPやMPIを利用します。

OpenMP

今のgccにはOpenMPが最初から入っているので、コンパイル時にオプションをつけるだけでOKです。
サンプルとしてHello, World!を8つ表示するプログラムを書いてみます。

OpenMPtest.c
#include <stdio.h>
#include <omp.h>

int main(void){

#pragma omp parallel
{
    printf("Hello, World! (%d / %d)\n", omp_get_thread_num(), omp_get_num_threads());
}

    return 0;
}

これを-fopenmpをつけてコンパイルします。

$ gcc -fopenmp OpenMPtest.c

実行する前に環境変数OMP_NUM_THREADSで立てるスレッドを指定しておきます。

$ export OMP_NUM_THREADS=8
$ ./a.out
Hello World (2 / 8)
Hello World (7 / 8)
Hello World (3 / 8)
Hello World (4 / 8)
Hello World (5 / 8)
Hello World (6 / 8)
Hello World (0 / 8)
Hello World (1 / 8)

MPI

まずはOpenMPI(≠OpenMP)をインストールします。

$ sudo apt-get install openmpi-bin libopenmpi-dev

MPIでHello, World!を表示するサンプルプログラムは以下のようになります。

MPItest.c
#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[]){
    int rank, size;
    MPI_Init(&argc, &argv);

    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &size);

    printf("Hello, World! (%d / %d)\n", rank, size);

    MPI_Finalize();

    return 0;
}

8プロセスで実行してみましょう。

$ mpicc MPItest.c
$ mpirun -np 8 ./a.out
Hello, World! (2 / 8)
Hello, World! (3 / 8)
Hello, World! (4 / 8)
Hello, World! (5 / 8)
Hello, World! (7 / 8)
Hello, World! (0 / 8)
Hello, World! (1 / 8)
Hello, World! (6 / 8)

となりました。

Git

一度書いたプログラムを修正することは多いです。
色々といじっている間に動かなくなってしまった!なんてことになったら困りますよね。
そこでバージョン管理システムのGitを使いましょう。
まずはインストールします。

sudo apt-get install git

英語学習と並んで毎日はてブのホットエントリに上がるように、Gitの使い方を覚えるのはやや面倒ですが、幸いにして基本的な使い方を覚えられるチュートリアルがネット上にたくさんあります。Git をはじめからていねいにが短時間で覚えられて楽だと思います。

GUIアプリの利用

Xming

せっかくシミュレーションしたり実験結果を解析したりしても、結果を表やグラフに表せなければ意味がありません。Xサーバを導入してGUIアプリを使いましょう。

まずはXmingをhttps://osdn.jp/projects/sfnet_xming/からダウンロードします。
Xming-6-9-0-31-setup.exe (日付: 2007-11-02, サイズ: 2.2 MB)
Xming-fonts-7-7-0-10-setup.exe (日付: 2016-08-09, サイズ: 31.9 MB)
をダウンロードしてください。
ダウンロードしたexeファイルを実行した後はひたすらNextを押していけば大丈夫です。
インストールが終わったらXLaunchを起動しましょう。
Winを押してxlaunchとでも打てば出てきます。
ここではXmingの設定ファイルを作ります。
基本的に[次へ]を押していけばいいですが、Additional parameters for Xmingの欄に-dpi 100と書いておくと、フォントが大きくなり見やすくなります。
[次へ]が[完了]に変わった画面で、[Save configuration]を押し、今の設定を保存します。
[完了]を押すとXmingが起動します。
次からは保存したconfig.xlaunchを起動すればXmingが動きます。

起動できているか確かめてみます。
まずはbashを起動し

$ sudo apt-get install x11-apps

をインストールします。続いて以下のコマンドを打ってみましょう。

$ export DISPLAY=localhost:0.0
$ xclock

画面に時計が現れましたか?もし

Error: Can't open display: localhost:0.0

と出るようであればXmingが起動していないか、DISPLAYの値が渡されていないかのどちらかなので確認してみてください。

さて、毎回Xmingを起動してDISPLAYの値を渡すのは面倒ですよね?
せっかくなのでbashの起動時に使えるように設定しましょう。

まずは先に保存したconfig.xlaunchをWindowsのスタートアップに登録します。
以下のフォルダ内にconfig.xlaunchのショートカットを作ることでWindowsの起動と同時に起動することができます。
AppDataは隠しフォルダになっているので注意してください。

C:\Users\ユーザー名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

次にDISPLAYを設定します。bashを起動して

$ vim ~/.bashrc

でbashの設定ファイルを開きましょう。
なにやら色々書いてあるかと思いますが、一番下に以下を追加して保存してください。

# for Xming
export DISPLAY=localhost:0.0

# for Xmingはコメントなので入れなくてもいいのですが、後々見返すときに困るといけないので書きました。

VcXsrv

Xmingの無料版は更新が結構前に止まっているので、代わりにVcXsrv Windows X Serverを使ってみます。
こちらはアプリのアイコンがそのまま表示されるので、たくさんアプリを起動する場合は便利です。
sourceforgeからダウンロードし、Fullでインストールして起動するだけです。
DISPLAYと.bashrcの設定はXmingの場合と同じです。

Gnuplot

それではグラフ描画アプリの代表格Gnuplotを使ってみましょう。
インストールは

$ sudo apt-get install gnuplot-x11

で可能です。つい

sudo apt-get install gnuplot

としてしまいがちですが、こうするとterminalの設定がうまくいきません。必ずgnuplot-x11をインストールしましょう。

$ gnuplot

で起動すると

        G N U P L O T
        Version 4.6 patchlevel 4    last modified 2013-10-02
        Build System: Linux x86_64

        Copyright (C) 1986-1993, 1998, 2004, 2007-2013
        Thomas Williams, Colin Kelley and many others

        gnuplot home:     http://www.gnuplot.info
        faq, bugs, etc:   type "help FAQ"
        immediate help:   type "help"  (plot window: hit 'h')

Terminal type set to 'wxt'
gnuplot>

と表示されます。ここで

Terminal type set to 'wxt'

の部分が違う場合は

set terminal wxt

とするか、もう一度インストールしましょう。

さて、無事にインストールができたら実際にグラフを描いてみます。

plot sin(x)

と打てば正弦波が描画されます。

ParaView

2016/06/27時点での最新はv5.1ですが、apt-getで入るのはv4.0の模様。

$ sudo apt-get install paraview

でインストールできます。

leafpad

このあたりで相当奇特な人以外はVimを使うのが嫌になってきているはずです。
Linux環境を使うならVimは必須なのですが(sshで入ったサーバにviしかない場合も)、
最初にストレスをためてもいけないのでGUIエディタを入れましょう。
bashからWinodwsで使ってるエディタを直接呼び出せたら楽なんですが、どうやらそういう設計思想ではないようです。

GUIエディタのメインはWindowsの方でVisual Studio Codeを使うとして、ここでは軽いleafpadを使います。

$ sudo apt-get install leafpad

これでleafpadと打てば起動するようにはなりますが、メニューの文字がおかしなことになります。苦肉の策ですが、環境変数を一時的に変更して起動します。

$ env LANG=en_US leafpad

これも毎回打つのが面倒なのでエイリアスを設定しておきます。

$ echo '# leafpad alias' >> ~/.bashrc
$ echo 'alias leafpad="env LANG=en_US leafpad"' >> ~/.bashrc

Python

直接入れる方法

最近はPythonが科学技術計算に使われることが多くなってきました。
CやFortranを書くのが面倒な人やMatlabに払うお金がない人も圧倒的ライブラリのおかげで安心です。
ここではPython 3のみを扱います。Python 2はどうせ消え去るのでさっさと忘れてください。
まだまだ若いPythonはFortranのように過去の遺産にとらわれる必要はないのです。

実はbashを入れた時点でもうPython 3を使うことができます。
python3と入力してEnterを押してみてください。

$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29)
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

と表示されましたか?さらに1+1を計算してみましょう。

>>> 1+1
2

きちんと計算できました。とりあえず電卓としては使えそうです。
しかしバリバリの科学技術計算のために使うにはやはりライブラリが必須です。
一度Python3からexit()で出て、以下のコマンドを実行してください。
それなりにインストールに時間がかかりますが気長に待ちましょう。

$ sudo apt-get install python3-dev
$ sudo apt-get install python3-numpy python3-scipy python3-matplotlib

科学技術計算に必須のライブラリnumpy, scipy, matplotlibを入れました。
numpy, scipyは主に行列演算を、matplotlibはグラフなどの描画を担当します。
numpy, scipyは裏でCとFortranで書かれたライブラリが走ってるので、スクリプト言語のくせに爆速で計算できます。
詳しい使い方は他の文献を当たってください。
ここでは例としてnumpyを使って連立1次方程式を解いてみます。

\begin{cases}
x+y+z=9\\
2x+3y-2z=5\\
3x-y+z=7
\end{cases}

これを以下のコードで解きます。
(Vimかleafpadでlinalg.pyを書きましょう)

linalg.py
# coding: UTF-8
import numpy

A = numpy.array([[1, 1, 1],
                [2, 3, -2],
                [3, -1, 1]])
b = numpy.array([9, 5, 7])

x = numpy.linalg.solve(A, b)

print(x)

これを実行すれば簡単に解くことができます。

$ python3 linalg.py
[ 2.  3.  4.]

ね、簡単でしょう?

Anacondaを利用する方法

世の中には便利なものがありまして、主要なライブラリを一発でインストールして管理までしてくれるAnacondaなるディストリビューションがあります。
これはこれで導入が面倒なのですが、データサイエンティストを目指す人のpython環境構築 2016にきれいにまとまっているので、こちらを使ってもよいでしょう。
activateでbashが落ちるバグがあるのでpyenvとanacondaを共存させる時のactivate衝突問題の回避策3種類の解決策2を使ってください。

ただしこのままだと

OMP: Error #100: Fatal system error detected.
OMP: System error #22: Invalid argument

というエラーが起きてしまうので(MKLに対応できていない模様)

$ conda install nomkl

を忘れずに。
引用元:Anaconda Python with Windows Subsystem for Linux
(そのうち修正されそう)