スキップしてメイン コンテンツに移動

投稿

Emacs 26.1のソースビルド

環境: Debian 9.5 stretch x86_64 インストール先をホームディレクトリ内にすればビルド自体には管理者権限は不要. ただし必要なライブラリをインストールするためにsudoを使った. ソースのダウンロード: http://ftp.jaist.ac.jp/pub/GNU/emacs/ 依存ライブラリの導入 他に足りないライブラリがある場合は次節でconfigureしたときに教えてくれるから適宜インストールする. 手元の環境ではlibncurses5-devとlibgnutls28-devが足りないと怒られたので sudo apt install libgnutls28-dev libncurses5-dev を実行. 最近はもっぱらCUI版しか使ってないからGUIは放棄したけど, GUI版をインストールする場合は下記参照. インストール 別段難しいことはなく ./configure --prefix=/home/name/.local/ --without-x make make install でオッケー. 10分もかからなかった. これでインストール時に指定したディレクトリ (上の例だと/home/name/.local/bin) に実行ファイルが生成されるから, 普通に実行すればいい. GUI版のインストール フル機能のGUI版には追加で libgtk-3-dev , libtiff5-dev , libgif-dev , libgd-dev が必要. 適宜インストールしてconfigure時に without-x オプションを外せばよい. ただしGTK+3にディスク容量190MBくらい必要. emacsの実行ファイル自体は49MB->54MBでGUIつけてもそんなに大きくなる訳ではない.

Emacs on WSLのクリップボード

問題 手元の環境 (Debian 9.5 on Win10 1803) だけかもしれないけれども、cmdのコピペ機能(つまり右クリック)を使って Emacs on WSL にペーストしようとすると、非常に重い、とてつもなく思い。短文ならともかく500行とかコピペしようとすると数分固まる。20行くらいでも時間がかかる。そのうえ、インデントが妙なことになる。最悪。 解決策 PowerShellの Get-Clipboard コマンドを使えば、Win10のクリップボードの中身を取り出せる。そこで、PowerShellコマンドを呼び出して出力をバッファに書き込むようにすればいい。 reddit に書いてあったスクリプトを修正したものがこちら。 (defun wsl-paste () (interactive) (insert (shell-command-to-string "powershell.exe -command 'Get-Clipboard'"))) (global-set-key (kbd "C-c C-v") 'wsl-paste) これで C-c C-v でWin10のクリップボードからペーストする。 いまいち検証しきれてないけれども、 (setq x-select-enable-clipboard t) 設定と相性が悪い模様。このところGUIはほぼ使わなくなってたので、こちらを消すことで対処した。 コメント これで爆速でペーストできるようになって一件落着。VS Codeに移行するかと本気で考えたけど、やっぱりEmacsのが使いやすい。

Rustで科学技術計算 (4) Vec型の操作まとめ

https://doc.rust-lang.org/std/vec/struct.Vec.html 新しいベクタの作り方 let mut vec: Vec<f64> = Vec::new(); let mut vec: Vec<f64> = Vec::with_capacity(1024); let mut vec: Vec<f64> = vec![ 0., 1., 2., 3. ]; let mut vec: Vec<f64> = vec![ 0.; 16 ]; let mut vec = (0..16).map(|x| x as f64).collect::<Vec<f64>>(); // 連続する数字を要素とするベクタをイテレータを経由して生成 // mapの部分をいじるか, イテレータアダプタを使えばもっといろいろなことができる // https://rust-lang-ja.github.io/the-rust-programming-language-ja/1.6/book/iterators.html 要素の挿入 vec.push( 3.14 ); // ベクタの最後に要素3.14を追加する vec.insert( 2, 3.14 ); // vec[2] = 3.14となるように要素を挿入し, その後ろの要素を一個ずつずらす // メソッドinsert( index, element ) はindex > vec.len()のときパニックを引き起こす vec.append( vec2 ); // ふたつのベクタを連結する (Pythonでいうリストのextend) 要素の除去 vec.remove(4); // 4番目の要素vec[3]を除去し, 後ろの要素を一個ずつ詰める vec.swap_remove(4); //4番目の要素vec[3]を除去し, 最後の要素vec[vec.len()-1]をvec[3]に入れる // メソッドswap_removeはO(1)で動作するのに対して, removeの方が時間がかかる let x: f64 = vec.pop(); // 最後の要素を取り出し, それを返す (従ってこの処理によりvec.len()...

制限三体問題シミュレータ by Rust

// 制限三体問題シミュレータ // // 座標系は連星系の重心を原点とし, 平均運動nで回転する系. // 従ってe=0のとき連星は静止するが, e \neq 0も計算できる. // 連星の長半径aと平均運動nが1となる単位系を用いる. // // 必要なパラメータは // 連星の質量比 q = M_2 / M_1 // 連星の離心率 e // 計算終了時刻 t_end // と初期条件 x: [f64;3], v: [f64;3] の計九つ. 上ふたつを // コマンドライン引数としてセットすることもできる. // // use std::env; // コマンドライン引数を使用する場合はコメントアウトを外す use std::f64::consts::PI; fn main() { // パラメータの設定 // let args: Vec = env::args().collect(); // let q: f64 = args[1].parse:: ().unwrap(); // let e: f64 = args[1].parse:: ().unwrap(); let q: f64 = 0.01; let e: f64 = 0.; let t_end: f64 = 128.*PI; // 初期条件 let mut t: f64 = 0.; let mut x: [f64;3] = [ 0.5-q/(1.+q), 3f64.sqrt()/2., 0. ]; let mut v: [f64;3] = [ 0., 0., 0. ]; println!("{} {} {} {}", t, x[0], x[1], x[2] ); // アウトプット間隔 let t_output: f64 = 0.0625; let mut t_record: f64 = t_output; // 数値積分 while t = t_record { println!("{} {} {} {}", t, x[0], x[1], x[2] ); t_record += t_output; }; }; } fn true_anomaly ( t: f64, ...

Rustで科学計算 (3) 関数を別ファイルで定義する

main.rcの中ですべての関数を定義しようとすると, 往々にしてだらだらと長くなって可読性が損なわれます. そのような場合, Rustでは別ファイルを用意してその中で関数を定義することができます (関数のモジュール化). ここではメイン関数は ./src/main.rc に含まれるものとします. 関数を定義する別ファイルは ./src/sample.rc とし, その中で定義された関数は main.rc 中で mod sample; とした上で sample::(関数名) と呼び出すことができます. ただしその際に ./src/sample 中の関数には pub 宣言が必要です. ./src/main.rc の記述 mod sample; fn main() { let mut x: f64 = 1.; x = sample::times2( x ); println!("{}", x ); } ./src/sample.rc の記述 pub fn times2( x: f64 ) -> f64 { 2. * x } なお, この別ファイルの名称は ./src/sample/mod.rs とすることもできます. この方が別ファイルを階層的に配置できるので, 大規模なプロジェクトでは有利かもしれません. 詳細は参考文献を見てください. 参考文献 クレートとモジュール - The Book

Rustで科学計算 (2) Vec型

1. 配列とVec型 Rustの配列は, その長さが コンパイル時に 既に固定されている必要があります. 従って, 最初から長さのわかっているベクトルを扱う場合には, 例えばその長さNを const N: usize = 128; とコンパイル時定数として導入することで, 素直に配列をつくることができます. const N: usize = 128; fn main() { let x: [ f64; N ] = [ 0.; N ]; } 一方, コンパイル時には長さが決まっておらず実行時に動的に決定される場合, または実行時にコマンドライン引数として長さを与えたい場合, コンパイル時には配列の長さが決まっていない訳なので, それを配列として実現することはできません. そのような状況ではVec型 (Vectorとも) を利用しましょう. 2. Vec型の宣言と要素の追加, 参照, 削除 例えば要素が既知のi32型を要素とするVec型変数 a は let a: Vec<i32> = vec![ 0, 1, 2, 3, 4 ]; により宣言できます. あるいは, f64型を要素として持つことのできる空のVec型変数 v を宣言するには let mut v: Vec<f64> = Vec::new(); とします. いま変数 v には何も要素がないので, そこに要素を追加するには v.push(0.0) とすればよいです. 要素をpushするためには変数がmutableであることが必要です. また, Vectorの要素の型はすべて共通でなければなりません. なお, あらかじめvectorの要素数が, 例えば上限128と見当がついているのならば let mut v: Vec<f64> = Vec::with_capacity(128); とした方が高速に動作します. もちろんこの場合でも128を超えて要素を追加することは可能です. Vector v の要素の値は配列と同じく v[i] によりアクセスできます. 要素数がNのとき, 引数 i は0からN-1までの値を取り, その範囲外の要素にアクセスしようとするとpanicが引き起こされます. vector v の i 番目の要素を削除したい...

matplotlib.histのnormedが変

以下の内容はPython 3.5.2 + matplotlib 1.5.1およびPython 3.6.2 + matplotlib 2.0.2で検証した. 作業日は2017年10月22日, 前者はUbuntu 16.04 on Win10 (WSL), 後者はDebian 8.9 (Anaconda). 規格化したいのにできない なにか数値の列 data があったとして, そのヒストグラムをmatplotlibでプロットしたいとする. 普通に plt.hist( data ) とすると, これは縦軸が各bin内に入るデータ点が何個あるかを表すことになる. これをデータ総数 len(data) で規格化したプロットにしようと思って plt.hist( data, normed=True ) または normed=1 とかやっちゃうと, 思った通りのアウトプットにならずに頭を傾げることになる. 例えば: import numpy as np import matplotlib.pyplot as plt data = np.random.normal(0,0.1,1000) weights = np.ones(len(data))/len(data) plt.hist( data, weights=weights ) plt.show() アウトプットは で, 縦軸が1を超えるとか, 意味がわからない. 原因 matplotlibのドキュメント を見ても何も書いてない. これは numpyのドキュメント に答えが書いてあるからで, 要するに normed オプションは事実上 density オプションと等しく, これは縦軸を確率分布関数と思って規格化するオプションである, と. 従って, normed=True オプションを指定すると, binの 面積 が1に規格化されることになる. いま欲しいものは値の 総和 が1に規格化されたアウトプットなのだから, binの幅が1でない限り, 欲しい結果は得られない. 対策 代わりに weights オプションを指定すればこの問題は解決できる. これは data の1つの値の重みを指定するパラメー...