2016/10/31(月)bash on Ubuntu on Windowsを試してみる
cygwinやmsys2など、Windows上でunixツールを使うためのものは以前からいろいろありますが、Microsoft本家が出してきたこいつは、「ubuntuのバイナリがそのまま動く」という点が今までと違います。使うための条件は、
- Windows10の64bit版であること
- Windows10のバージョン1607以降であること
8月のリリース以降、少しずつ時間をずらしながらWindows Updateを降らせていたようですが、そろそろほとんどのWindows10が1607になった頃ではないでしょうか。
インストール
インストール方法の情報は検索すればたくさん出てきますが、次のような手順です。- 「スタートを右クリック→プログラムと機能→Windowsの機能の有効化または無効化」で、「Windows Subsysyem for Linux (Beta)」をチェックする。再起動。
- 「スタート→歯車アイコン→更新とセキュリティ→開発者向け」で、「開発者モードを使う」を、「サイドロードアプリ」から「開発者モード」に変更。再起動。
- 「スタートを右クリック→コマンドプロンプト」でコマンドプロンプトを起動し、bashとタイプ。"y"でダウンロードとインストールが始まります。数分かかります。ユーザIDとパスワードを聞かれてインストール完了。
- 次回以降は、スタートメニューに「Bash on Ubuntu on Windows」が登録されているのでそこから起動できます。
アンインストール
いろいろ試しにパッケージを入れたりしてシステムが壊れることもあるかと思いますが、コマンドプロンプトでlxrun /uninstall /fullと入れるときれいさっぱり削除できます。上の「bashとタイプ」のところからやりなおすことが出来ます。
簡単な使い方など
- 中身はubuntu 14.04です。いつものubuntuの作法通り、
sudo apt update sudo apt upgrade
で最新に更新しておきましょう。 - これで、端末内で完結するような作業は大体できます。最初は最低限しかインストールされていないので、いつものubuntuの作法で必要なパッケージをインストールしましょう。とりあえず
sudo apt install build-essential
でCコンパイラなど最低限の開発環境を入れることをお勧めします。 - ubuntu側からは、windows側のファイルが例えばCドライブなら
/mnt/c/
以下に見えます。逆にwindows側から見てubuntuのファイルシステムは
c:\Users\(windowsユーザ名)\AppData\Local\lxss\
にあり、このフォルダがubuntu側の"/"に対応しています。隠しファイルになっているので普通の状態では見えないかも知れません。恐らく、ubuntu側からwindowsのファイルシステムを操作することはOK、windows側からubuntuのファイルシステムを操作するのはNG、だと思われます。
- X windowを使うソフトウェアが動かない。gnuplotくらい使いたい!
- (文字幅を正しく扱えないせいか)日本語が頻繁に文字化けする。
- そもそも日本語が入力できない。
X環境を作る
買ったままのwindowsでソフトウェア追加無しにunix環境が使えるのがbash on ubuntu on windowsのメリットですが、windows用のX serverを入れてしまえば使えるソフトウェアが一気に増え、また日本語の問題も解決できる可能性があります。そこで、上記問題点を解決すべく、X serverを入れてみます。X serverは有料、無料いろいろあると思いますが、いろいろ検索してみると無料では
の2つがよく使われているようです。今回はXmingの方を使ってみました。Xming X Serverによると、Public Domain Releasesという無料版と、Website Releaseという新しいが寄付が必要な版があるようです。今回はPublic Domain Releasesの方を使いました。
- Xming 6.9.0.31
- Xming-fonts 7.7.0.10
スタートメニューから「Xming」を起動します。(「XLaunch」の方だといろいろオプションを設定してから起動します。今回はデフォルトのままで十分。) すると、右下に
のようなアイコンが出ます。これで、bash on ubuntu on windowsからの描画命令を受け止める準備が出来たことになります。動作チェックします。
sudo apt install x11-apps sudo apt install x11-utils sudo apt install x11-xserver-utilsといくつかのx11の基本アプリをインストールして、
DISPLAY=localhost:0.0 xeyes &とxeyesを起動してみます。
のようにマウスカーソルを追う目玉が表示されたら、正常に動作しています。
gnuplotを試してみましょう。
sudo apt install gnuplot-x11としてインストールし、
DISPLAY=localhost:0.0 gnuplotとして起動します。
のように、ちゃんと動作しました。毎回「DISPLAY=localhost:0.0」とするのが面倒なら、
export DISPLAY=localhost:0.0とすると、端末を閉じるまで有効になります。
驚くべきことに、日本語フォントを追加してやると、少しエラーが出るもののfirefoxを動かすことができます。
sudo apt install fonts-ipafont sudo apt install firefox
日本語環境を整える
ここまでちゃんと動作するとなると、日本語の読み書きがまともにできないのが惜しくなってきます。そこで、少し頑張って環境を整えてみました。いろいろ試行錯誤した結果ではありますが、もっといい方法もありそうなので情報が欲しいところです。以下、自分が試した方法を書きます。X serverがwindows側にインストールしてあって、また上で書いたように、sudo apt install fonts-ipafontで日本語フォントを追加してあるものとします。
まず、端末は、windows側を捨ててXの方で動かすことにします。いろいろ試しましたが、lxterminalが良さそうでした。
sudo apt install lxterminalでインストールし、
DISPLAY=localhost:0.0 lxterminal &で起動します。起動後に「編集→設定」でフォントをMonoSpace 10からMonospace 15くらいにしてあげると見やすい感じになりました。
windows側の端末を使わずにこちらを使うことにします。こちらからだと「DISPLAY=locahost:0.0」をいちいち打たなくてよくなります。windows側の端末を閉じると全部落ちてしまうので、アイコンにでもしておきましょう。
かな漢字変換のシステムを入れます。いろいろ試しましたが、uim-anthyが何とか動作しました。
sudo apt install uim uim-xim uim-anthyのようにインストールします。そして、windows側のbashターミナルで、
DISPLAY=localhost:0.0 UIM_CANDWIN_PROG=uim-candwin-gtk uim-xim &のようにかな漢字変換サーバを起動し、lxterminalの起動は
DISPLAY=localhost:0.0 XMODIFIERS="@im=uim" GTK_IM_MODULE=uim QT_IM_MODULE=uim lxterminal &とします。これで、「半角/全角」キーで日本語入力ができるようになりました。
terminal起動時の設定が長いですが、このterminalから起動したものにはこの設定が伝わるので、ここからいろいろ起動することにすれば楽です。
その他もろもろ
他にもいろいろ入れてみました。TeX環境。
sudo apt install texlive-lang-cjkで簡単に入ります(ちょっと時間がかかります)。ついでに
sudo apt install evinceでpdfビューアも。
java。
sudo apt install default-jdkあちこちでjavaは動かないという記述を見かけましたが、普通に動いているように見えます。
自分はvimで十分ですが、もう少し普通のエディタを使いたいなら、
sudo apt install geanyあたりはいかがでしょうか。
ま、windows側のお気に入りのエディタを使えば済むことではありますが。
vmwareなどの仮想化ソフトを使うよりずっと軽いのが嬉しいです。windowsとの分業がしやすいのも大きな利点かと。次はsshdなどサーバ系のソフトをいろいろ試してみたいと思います。
追記
上で書いたかな漢字変換サーバとlxterminalの起動を自動化するなら、例えばhome directoryの.bashrcの末尾にif [ $SHLVL -eq 1 ]; then if DISPLAY=localhost:0.0 xset q > /dev/null 2>&1 ; then DISPLAY=localhost:0.0 UIM_CANDWIN_PROG=uim-candwin-gtk uim-xim & DISPLAY=localhost:0.0 XMODIFIERS="@im=uim" GTK_IM_MODULE=uim QT_IM_MODULE=uim lxterminal & fi fiのように書けばいいでしょう。最初に起動されたbashで、なおかつXが利用可能なら、かな漢字変換サーバとlxterminalを起動します。
次のwindows10の大型アップデートでubuntu 16.04になるとか日本語入力も普通に出来るようになるとか噂が聞こえてくるので、そのときにはここに書いたことの大半は無意味になってしまうかもしれません。
この記事は、次のページを参考に書きました。
- Bash on Ubuntu on Windowsメモ
- Bash on Ubuntu on Windowsをインストールしてみよう!
- Bash on Ubuntu on Windows とX Windowの組み合わせで日本語表示と日本語入力
- 俺の Bash on Windows10 環境
- Bash on Ubuntu on WindowsでTensorFlowを使うためのメモ
- Cygwin絶対殺すマン ~物理のオタクがWindows Subsystem for Linuxで数値計算できるようになるまで~
2016/08/03(水)半精度浮動小数点数に関する思考実験
IEEE754-2008の半精度では、16bitを符号s(1bit)+指数部e(5bit)+仮数部m(10bit)に分割しています。指数部のオフセットは15で、従って正規化数は
x = (-1)s × 1.m × 2e-15のように、非正規化数は
x = (-1)s × 0.m × 2-14のように実数xと対応します。
ところで、URRという浮動小数点数の表現形式をご存知でしょうか。浜田穂積先生が80年代(IEEE754制定より前!)に提案された浮動小数点数の表現形式です。詳細は
- 浜田 穂積, 二重指数分割に基づくデータ長独立実数値表現法, 情報処理学会論文誌, Vol.22, No. 6, pp. 521-526 (1981)
- 浜田 穂積, 二重指数分割に基づくデータ長独立実数値表現法II, 情報処理学会論文誌, Vol.24, No. 2, pp. 149-156 (1983)
さて、半精度浮動小数点数は、bit数が少ないこともあって表現できる数値の範囲が非常に狭く、簡単にアンダーフローやオーバーフローを起こしてしまいます。正の最大数は何と65504です。正の最小数は、精度を保っている正規化数で2-14≃6.1×10-5、非正規化数まで考えても2-24≃5.96×10-8にすぎません。
そこで、URR的な考え方を用いて16bit浮動小数点数を構成したらどうなるか考えてみました。URRは-infやNaNが無いなど、現代のIEEE754に慣れた我々には使いにくいところもあるので、指数部と仮数部の区切りを可変にするという思想はそのままで、適当にフォーマットを定めます。指数部は、Eliasのデルタ符号を用いることにします。デルタ符号は1,2,3,…の自然数しか表せないので、指数部とデルタ符号で表す数値を
デルタ符号 | 1 | 2 | 3 | 4 | 5 | … | 255 | 256 | … | 508 | 509 | 510 | 511 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
指数部 | 0 | -1 | 1 | -2 | 2 | … | 127 | -128 | … | -254 | ±0 | ±inf | NaN |
デルタ符号の長さ | 1 | 3 | 3 | 5 | 5 | … | 14 | 15 | … | 15 | 15 | 15 | 15 |
提案方式の仮数部長 | IEEE754-2008の仮数部長 | |
---|---|---|
2-254 | 1 | - |
⋮ | ⋮ | ⋮ |
2-128 | 1 | - |
2-127 | 2 | - |
⋮ | ⋮ | ⋮ |
2-24 | 6 | 1 |
2-23 | 6 | 2 |
2-22 | 6 | 3 |
⋮ | ⋮ | ⋮ |
2-16 | 6 | 9 |
2-15 | 7 | 10 |
2-14 | 7 | 11 |
⋮ | ⋮ | ⋮ |
2-8 | 7 | 11 |
2-7 | 8 | 11 |
⋮ | ⋮ | ⋮ |
2-4 | 8 | 11 |
2-3 | 11 | 11 |
2-2 | 11 | 11 |
2-1 | 13 | 11 |
20 | 15 | 11 |
21 | 13 | 11 |
22 | 11 | 11 |
23 | 11 | 11 |
24 | 8 | 11 |
⋮ | ⋮ | ⋮ |
27 | 8 | 11 |
28 | 7 | 11 |
⋮ | ⋮ | ⋮ |
214 | 7 | 11 |
215 | 7 | 11 |
216 | 6 | - |
⋮ | ⋮ | ⋮ |
2127 | 2 | - |
2128 | 1 | - |
⋮ | ⋮ | ⋮ |
2253 | 1 | - |
もちろんハードウェアのサポートが無くソフトウェアエミュレーションでは速度は絶望的ですが、将来このような優れたフォーマットが気軽に使えるようになればいいなと思っています。FPGAとかで作って遊んだりできないかなあ。
2016/05/21(土)カシオの関数電卓の奇妙な挙動
123456789123456 - 123456789121111 = 2345非常に近い2つの数同士の引き算を行なうと、「桁落ち」と呼ばれる有効数字の減少が発生します。これは有限精度の計算を行っている以上仕方のないことですが、どうやらこの関数電卓では、
123456789123456 - 123456789123111 = 345
123456789123456 - 123456789123411 = 0 (45でない!)
「減算で桁落ちが発生した結果有効数字が2桁以下になったとき、その数を強制的に0に書き換える」という仕様になっているようです。桁落ちが起きるような厳しい計算こそ高精度な電卓の助けが欲しいところなのに、そこでわざわざかろうじて残った情報を捨て去ってしまうというのは極めて不可解な仕様だと感じます。
この仕様で困ってしまう場面はいくらでもありそうですが、一つ例を作ってみました。2次方程式
0.9999996 x2 - 2x + 1.0000004 = 0の解をいわゆる2次方程式の解の公式で計算してみます。判別式の値は、
4 - 4 × 0.9999996 × 1.0000004ですが、この値が
= 4 - 3.99999999999936
= 0.00000000000064
= 6.4 × 10-13
4 - 3.99999999999936 = 0となってしまいます。3.99999999999936を正しく格納できる仮数部を持っているにも関わらず、です。実にもったいない仕様だとは思いませんか。素直な10進数15桁の演算ならば、
sqrt(6.4 × 10-13) = 8 × 10-7のようにほぼ正確に計算できたはずなのに、
x1 = (2 - 8×10-7)/2/0.9999996 = 1
x2 = (2 + 8×10-7)/2/0.9999996 ≈ 1.000000800000032
x1 ≈ 1.00000040000016のような重解になってしまいます。また、手作業で解の公式を使って計算した場合のみならず、関数電卓に組み込まれた2次方程式ソルバーを使っても全く同じ計算結果が得られました。すなわち、ユーザに直接見える部分のみならず、内部の演算ルーチンそのものがこの仕様に蝕まれていることは確実と思われます。
x2 ≈ 1.00000040000016
この仕様はカシオfx-5800Pに特有のものなのか、他の機種にも見られるものなのか、ヨドバシカメラの関数電卓売り場の展示機を触って調べてみました。すると、
機種名 | 仮数部の桁数 | 桁落ち時に捨てられる桁数 |
---|---|---|
カシオ fx-5800P/JP900/FD10Pro/375ES/72F | 15 | 2 |
キヤノン F-789SG | 18 | 2 |
キヤノン F-715SA | 16 | 3 |
シャープ EL-509M | 14 | 1 |
2016/05/01(日)emscriptenで遊んでみた
インストールしたばかりのubuntu 16.04で試しました。しかし、
sudo apt install emscriptenで入れてもうまく動かない模様です。clang/llvmのバージョンの問題っぽいがよく分かりません。
そこで、本家の Download and install — Emscripten 1.36.1 documentation に従ってインストールしてみました。そこではポータブル版というroot権限なしで入れる方法が紹介されていました。その方が周辺ツールのバージョンに左右されなくてインストールが楽なのかな。
sudo apt install cmakePortable Emscripten SDK for Linux and OS X (emsdk-portable.tar.gz) をダウンロードして展開し、その中にcdして
./emsdk update ./emsdk install latest ./emsdk activate latestします。最後の作業で/home/kashi/.emscriptenが作られました。これでインストールは終了。使う前に
source emsdk_env.shでPATHの設定が必要です。
適当なc++のプログラムを作って、
emcc test.cc node a.out.jsで動くのを確認しました。
次に、kvのプログラムを動かしてみました。問題はboostで、emscriptenでは外部ライブラリを使ったプログラムはそのままでは動きません。外部ライブラリもソースから変換する必要があります。kvの場合は幸いなことにboostはheader onlyの範囲でしか使っていませんので、大丈夫なはずです。自分は、
ln -s /usr/include/boost ホームのどこかとリンクを張ってしまって、-Iにそれを指定してごまかしました。これが正しいかどうかは分かりません。また、javascriptの中ではfesetroundによる丸めの向きの変更は効かないので、そのままでは精度保証出来ません。kvは-DKV_NOHWROUNDを付けると丸めの向きの変更を行わずエミュレーションで方向付き丸めを行なう機能を持っており、それをつけるとちゃんと精度保証付きで計算してくれるようです。
emcc -I(kvの場所) -I(boostの場所) -DKV_NOHWROUND hoge.ccみたいな感じです。kvのサンプルはmpfrを使ったもの以外は大体動きそうです。実行速度はちゃんと測ってませんがネイティブのC++の30倍程度でしょうか。htmlに変換してfirefoxに食わせた方がnode.jsより速いようにも見えました。
単なる遊びであってあまり意味はないですが、楽しいです。
2016/01/28(木)googleのAlphaGoが人類を超えた!?
最初に知ったのは、現在最強の囲碁プログラムの一つ、Crazy Stoneの作者のつぶやきでした。そこにyoutubeへのリンクが。まもなく、NHKの記事が出て、それらによると、googleがネイチャーに論文を発表し、AlphaGoと名付けられた囲碁AIが史上初めて人間のプロ棋士にハンデ無しで勝ったということでした。
- 中身はモンテカルロ木探索にディープラーニングを組み合わせたもの
- 中国のプロに5戦全勝
- 3月に現在人類最強の一人と思われるイ・セドルと対局
にありますが、基本的に有料です。
googleのブログの記事はこちら
開発の中心となったのは、最近Googleに買収されたイギリスのAIを研究するDeepMind社のDemis Hassabis氏。DeepMind社の記事はこちら。
この記事中に、無料で読める論文のプレプリントへのリンクがあります。
まだ論文は読んでいませんが、既存の最強の囲碁ソフトに500戦499勝とか、既存の最強の囲碁ソフトに4子おかせて勝率8割とか、恐ろしい噂が聞こえてきます。プロ棋士に勝った棋譜を見た感想もとても強いというものが多く、3月のセドルとの対局が楽しみです。