Bluepostech

プログラムとかはこっち

【win10】インラインでemacsが使えない【未解決】

今年初めての投稿で縁起がよくない記事だが、どうしても解決しないので投稿しようと思う。

先日windows10のPCを購入し、開発環境を整えようとしたのだが、今まで使ってきたEmacsがうまく動く方法を見つけることができなかった。その顛末をまとめようと思う。

1.bash on windows

windows10の最大の目玉といっていい機能が、bash on windowsだ。これはwindowsでネイティブなbashやapt-getが使える機能で、当然Emacsも使用することができる。

bash on windowsEmacsやその他gccなどソフトを使うことができた。しかしひとつ決定的に困ったものがある。それは、cygwinでの「cygstart」に相当するものがないということだ。
cygwinでは、たとえば

cygstart ./

でカレントディレクトリをエクスプローラで開くことができる。またパスを指定すればそこを開くこともできるし、ファイルを指定すれば対応するソフトで開くことができる。

bashでもexplorerを直接うちこめばエクスプローラを開くことができる。しかしbash on windowsdosのシステムとパスの指定の仕方がことなるので、パスを指定しても読み込めず開けないのである。
また、表記が欠けたりとbash on windows自体まだ発展途上な部分がある。

2.MSYS2

結局bash on windows以外の環境をいれることになったのだが、MSYS2がいいと聞いたので使ってみることにした。

MSYS2はMinGW系のパッケージで、minttyというcygwinと同じターミナルソフトからLinuxライクなターミナル環境を構築するパッケージだ。
これでpacmanを使ってEmacsを入れてみた。すると別ウィンドウで開くGUIでは使うことができた。

Emacsをインラインで使う場合は-nwというオプションをつければよい。しかしそれではエラーメッセージが出て起動できなかった。

調べたところ、win8からminttyの入出力の問題で対話型ソフトがほとんど使えないらしい。しかしそれを修正するwinptyというラッパーができているとのことだったのでインストールして使ってみた。すると起動できずにプロンプトに戻ってしまい、その上入出力がめちゃくちゃになってしまった。pythonなどに対しても同じことになったのでwinptyの問題らしく、winptyをpacmanではなくソースからビルドしたりもしてみたが、直らなかった。それにそもそもMSYS2もcygstartは使えない(ただし調べていないだけで調べればそれっぽい機能はあるかもしれない)。

2017.02.08 追記:windows7でも同様の問題を確認した。さらにMSYS2ではリンクを張るのが少々面倒なようだ。

3.cygwin

というわけで、結局cygwinを入れてみた。インストールの仕方はwin7と変わらない。インストールはうまくいった。しかし動作はもっさりする。

まずはapt-cygからEmacsを入れてみたが、起動せずにそのままプロンプトに戻るという状態だった。しかしpythonは使うことができた。

cygwinにもwinptyをビルドしてみたが、MSYS2の場合と同じことになった。またソースからビルドもしてみたがうまくいかなかった。

4.AtomEmacs

というわけでEmacsCUIで使うのは断念して、Atomに乗り換えてみることにした。

Atomもインラインで使うことはできないが、コマンドラインから起動することができる。なので現在はcygwinからatomを起動して使っている。

AtomにはEmacsに近いキーバインドを使うパッケージatomic-emacsが用意されている。コメントアウトするときのM-;などが異なるが、大まかには同じようなショートカットが使える。

というわけなので、もしwindows10のLinuxライクなシステムでいい感じにEmacsCUIで使える方法を知っている人がいたら教えてください。

【python】matplotlibがdvipngを見つけられない

最近理論の話が続いたのでプログラムの話に戻ろう。

先日matplotlibを使ったpythonコードを移植しようとしたところ、以下のようなエラーを吐いて動かない、ということがあった。

Could not obtain dvipng version

直訳すると「dvipngのバージョンを特定できない」というような意味だが、実はそうではないらしい。

そもそもdvipngとはtexで出力に使われるdviをじかにpngに変換するソフトで、一度このブログでも取り上げている。texliveに含まれているソフトで、texliveをインストールすれば一緒に入ってくる。
移植先の環境にはtexliveがすでに入っていると思っていたのだが、まずwhichでdvipngを調べても入っておらず、platexを調べても入っていないことがわかった。

そこで「dvipngだけ入ればいいや」とdvipngだけインストールしようとしたら、今度はlibkpathseaだったかがないというエラーが出た。仕方なしにtexliveをまるごと入れると、無事matplotlibまで動くようになった。

ごく簡単なことだが、エラーメッセージで検索をかけると英語のページしか出てこなかったので。

「熱速度」とは結局何なのか

統計物理の重要な概念のひとつに「熱速度」という概念がある。

熱速度とは、気体やプラズマのように多くの粒子からなる系で、さまざまな速度で運動する粒子集団の代表的な速度として定義される。しかし定義がいくつかあるうえ、あまりテキストに載っていないので、初学者の混乱のもとになっている。なのでここでまとめてみようと思う。

この記事では、1次元Maxwell分布を考える。すなわち分布関数が次で与えられる系を考える。

\displaystyle f(v)=\left(\frac{m}{2\pi T}\right)^{\frac{1}{2}}e^{-\frac{mv^2}{2T}}

1. 粒子の平均速度からの定義

今考えている系は1次元なので、平均値を考えると速度は0となってしまう。そのため2乗平均の平方根を考える。
\begin{eqnarray}\overline{v^2} &=&\left(\frac{m}{2\pi T}\right)^{\frac{1}{2}}\int^{\infty}_{-\infty}v^2 e^{-\frac{mv^2}{2T}}dv \\
&=&\frac{T}{m}
\end{eqnarray}
したがって
\displaystyle v_{th1}=\sqrt{\frac{T}{m}}
となる。

平均速度が0であることを考えると、v_{th1}は速度の統計的な揺らぎそのものであり、大多数の粒子はv_{th1}以下の速さで正か負の方向に運動していると解釈できる。

2. 速さの平均値

1次元Maxwell分布で「速度」の平均は0になるが、その絶対値である「速さ」の平均はそうはならない。それを計算してみると、
\displaystyle \begin{eqnarray}
v_{th2} &=& \overline{|v|}\\
&=&\left(\frac{2\pi T}{m}\right)^{\frac{1}{2}}\int^{\infty}_{-\infty}|v|e^{-\frac{mv^2}{2T}}dv \\
&=& \left(\frac{2\pi T}{m}\right)^{\frac{1}{2}} \times 2 \times \int^{\infty}_0 ve^{-\frac{mv^2}{2T}}dv \\ 
&=& 2 \times \left(\frac{m}{2\pi T}\right)^{\frac{1}{2}} \times \frac{1}{2} \times \frac{2T}{m} \\
&=& \sqrt{\frac{2T}{\pi m}}
\end{eqnarray}
となる。

3. 1/e値半幅

分布関数の指数部分がうまく規格化されるようにv_{th3}を定める。
\displaystyle v_{th3}=\sqrt{\frac{2T}{m}}
と定義すると、分布関数は
\displaystyle
f(v)=\left(\frac{m}{2\pi T}\right)^{\frac{1}{2}}e^{-\frac{v^2}{v_{th3}^2}}
と指数部分が速度が熱速度で規格化されたきれいな形になる。

このときのv_{th3}の意味だが、v=v_{th3}の粒子を考えると、
f(v_{th3})=f_0e^{-1}
となり、分布関数が最大値の1/eとなる速度であることがわかる。

4. で、結局どれなのか

ここまで3つの定義を述べたが、どれも使われていることがあるので、どれが使われているのかは前後の文脈から判断するしかない。

定義上係数がちがうだけだが、\sqrt{2/\pi}\simeq0.798, \sqrt{2}=1.414なので、
v_{th}=(1.106\pm0.308)\sqrt{\frac{T}{m}}
となり、相対誤差は最大で(1.414-0.798)/(0.798)=77.2%にもなる。

実際には熱速度は理論計算のときに式変形を簡単にするためであったり、数値として出てくるときは目安として出てくる。前者の場合は文脈から読み取れることも多いが、後者の場合は定義がかかれていなければまるで意味のないものになってしまう。なのでレポートに使うときはどの定義を使ったのかはっきり書いておく必要がある。

ここからは個人の感想だが、出てくる頻度としては1の定義が一番多い気がする。次に多いのは3の定義で、2の定義はwikipedia以外で見たことがない。

なお、3次元の場合でも考えることができ、そのときはさらに係数が変わってくる。計算は面倒なのでここでは書かない。

参考:この手の計算ではガウス積分の計算が大量に出てくる。わからなければ以下の拙著も参考にしてほしい。
bluepost69-tech.hatenablog.com