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/10/02(日)scan2016
自分が発表した内容は大体5月に この記事 に書いたもので、だいぶ忘れかけていたので何というか気合いがなかなか入らなくて大変でした。行きの飛行機の中で電源が使えたのが大助かり。stiffなODEをどう効率的に精度保証するか、というのは何年も前からこの業界の大きなテーマで、それなりに印象を残せたのではないかと勝手に考えています。
この業界は狭くて研究者の数が多くないので、朝から晩までずっと精度保証の話を聞くという機会は滅多に無く、どの話も刺激的で大変満足出来ました。(こういう機会に自分の発表だけしてさっさと遊びに行っちゃう人は何を考えてるんだろう、と毒を吐いておこう。誰が何をしようと勝手だけど、そういう人とは友達になれないなあ。)
メキシコから来た某juliaおじさんのjulia押しが強力で割と印象に残りました。C++のテンプレートのような、型に合わせて何通りもの新しい関数を自動生成する機能があるようで、うまく使えば確かに精度保証付き数値計算にフィットするかなと。
また、double-doubleの誤差評価を厳密に頑張る話もなかなか楽しそう。某Y氏が数年前にやろうとしてた気がするが、それとの関係はどうなんだろうか。
Csendesの話面白かった。やはり遅延微分方程式に手を出すべきか?
Tuckerがオーガナイザーだったせいか、ODEの話が多めでしたね。国府先生の話で出てきた宮路先生のTaylorモデルの実装とか、興味あるなあ。
2年後に東京で開催することが正式に決定したので、頑張らないと!
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/06/20(月)方向付き丸めクイズ
- x = a + b
- x = a - b
- x = a × b
- x = a / b
- x = (a + b) + c
- x = (a × b) × c
- x = (a - b) - c
- x = a - (b + c)
- x = -a + b
- x = -( (-a) + (-b) )
- x = a × b + c × d
- x = (a + b) × (c + d)
- x = a / (b + c)
- x = a - b × c
- x = a + (-b) × c
- x = sqrt(a)
- x = exp(a)
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 |