vimshell をインストールしたときのメモ
http://github.com/Shougo/vimshell からファイルをとってきて, doc/vimshell.jax を読む
http://github.com/Shougo/vimshell/tree/master より、配布ファイルをそのフォルダごとVimの'runtimepath'にコピーする。
さらに、vimshellを使用するにはvimprocが必要である。
私がvimshell用に修正したvimprocがあるので、それをリポジトリから取ってきくる。
http://github.com/Shougo/vimproc
そしてproc.soをmakeする。Make方法
* Linux BSD: > $ make -f make_gcc.makhttps://github.com/Shougo/vimshell/blob/master/doc/vimshell.jax
runtimepath ってのがなにかわからないけど, vim 上で ":set all" してみるとこんなんでてきたから, ~/.vim におけば大丈夫なはず.
runtimepath=~/.vim,/var/lib/vim/addons,/usr/share/vim/vimfiles,/usr/share/vim/vim71, /usr/share/vim/vimfiles/after,/var/lib/vim/addons/after,~/.vim/after
同じファイルがあるようだけど, 気にせずに上書きしてしまった.
vimshell> cp -r autoload/ doc/ plugin/ syntax/ ~/.vim
つぎに vimproc を make する.
vimproc/doc/vimproc.jax に以下の記述.
コンパイルが通ったら、autoload/にあるファイルやディレクトリ、plugin/にあるファイルを'runtimepath'オプションで示されるディレクトリにコピーする。doc/にあるのはヘルプファイルである。Windowsユーザーでコンパイルするのが嫌な場合は、githubのダウンロードに32bit/64bit版のproc.dllファイルがある。
https://github.com/Shougo/vimproc/blob/master/doc/vimproc.jax
vimproc> make -f make_gcc.mak
vimshell より runtimepath に関する記述がくわしい. ~/.vim で問題なさげ.
BoehmGC + pthread
Boehm GC をマルチスレッド環境で使うときのメモ.
include 方法
#define GC_THREADS // pthread_*とかを上書きする #include "gc.h" #includehttp://fistfvck.sakura.ne.jp/w/c_cplusplus/boehmgc#include #include
- GC_MALLOC とか普通にコールすればいい.
- #inlucde "gc.h" より前に GC_THREADS を define
- #inculde
より前に "gc.h" を include
仕事でテスト辺りが今のメイン作業なので、気晴らしに家でプログラムを作っている。
それで、ここ数日悩んでいたのが、Pthreadを使っている環境でBoehm GCのGC_malloc()を使うとSIGSEGVが発生する現象。
ネットで調べても解決しないかったので、解決した方法を書いておく。
細かく見ていくと、スレッドを使ってもmain()では発生せずにスレッド内でGC_malloc()を行うとダメらしい。
(中略)
その中に、GC_init()といういかにもな関数があった。
コメントにもあるようにスレッドを使うときには必要っぽい。
英語が苦手なのでこれぐらいしか分からないけど。
/* Initialize the collector. This is only required when using thread-local * allocation, since unlike the regular allocation routines, GC_local_malloc * is not self-initializing. If you use GC_local_malloc you should arrange * to call this somehow (e.g. from a constructor) before doing any allocation. * For win32 threads, it needs to be called explicitly. */ GC_API void GC_init(void);ということで、GC_init()を明示的に呼んでやることで無事解決。
2007-11-24
だいぶ前だから今はいらない?よくわからない.
GDB
(gdb) help handle # ヘルプ表示 (gdb) handle SIGPWR "nostop" "pass" "noprint" (gdb) handle SIGXCPU "nostop" "pass" "noprint"SIGPWR や SIGXCPU は Boehm GC 関連で本来の用途とは違う用途で使われている。
GDB で特定のシグナルを無視したり表示したり - higepon blog
これやらないと gdb で動かすとすぐに止まってしまう
Program received signal SIGPWR, Power fail/restart. [Switching to Thread 0xb6f5bb90 (LWP 17644)] 0xb777d410 in __kernel_vsyscall ()
LaTeX 備忘録
久しく使っていないのでメモメモ.
数学記号まわり
単項演算子
|
\neg |
括弧
下括弧 |
\underbrace{abc}_{DDD} |
その他
矢印の上下に文字 (mathop に対応していないみたい)] | \mathop{\rightarrow}^{hoge} |
条件付き制御構造
以下の全ての \if...文は 対応する \fi で終了する 一般形 【\if...<条件><条件成立時の実行文>\else<条件不成立時の実行文>\fi】 ( \else<条件不成立時の実行文> 部分は省略出来る ) (p.207) \if--- \fi 構文の nesting は {...} の nesting とは独立 (p.209-210) 【\ifnum<整数1><関係><整数>】 2 整数の大小比較 関係は <,=,> の 3種 【\ifdim<実数1><関係><実数>】 2 単位附き実数の大小比較 関係は <,=,> の 3種 【例】 \ifdim \hsize>100pt ... \fi 【\ifodd<整数>】 整数が奇数かどうかの判定 【\ifvmode】 TeXが v-mode か internal v-mode にあるかどうかの判定 【\ifhmode】 TeXが h-mode か internal h-mode にあるかどうかの判定 【\ifmmode】 TeXが math-mode か display math-mode にあるかどうかの判定 【\ifinner】 TeXが internal v-mode, restricted h-mode, (nondisplay) math-mode の いずれかにあるかどうかの判定 【\ifhttp://www.is.titech.ac.jp/~mase/latex.hlp】 2つの token が同じ character code を持つかどうかの判定 (その際 category code の差は無視される) 【\ifcat 】 2つの token が同じ category code を持つかどうかの 判定(その際 character code の差は無視される) 関連命令 \noexpand 【\ifx 】 2つの token が同じかどうかの判定(成立条件は TeXbook Chap.20 p.210 を参照) 【\ifvoid<整数>】 整数に対応する box register が 空 かどうかの判定 【\ifhbox<整数>】 整数に対応する box register が hbox かどうかの判定 【\ifhvox<整数>】 整数に対応する box register が vbox かどうかの判定 【\ifhvox<整数>】 整数に対応する box register が vbox かどうかの判定 【\ifeof<整数>】 整数は 0-15. 整数に対応する入力ファイルが open されていないか, 又はファイルが読み終っているとき成立 【\iftrue】 必ず成立 【\iffalse】 必ず不成立 【\ifcase<整数> \or \or... \else \fi】(p.210) 条件分岐. 整数値 m が 0 から n 迄の時は textm が実行される それ以外は が実行される. \else 以下は無くてもよい 【\loop<実行文1><\if...<条件>><実行文2>\repeat】 (p.217) <\if...<条件>>部は \fi 無し まず<実行文1>を実行,次に<条件>成立なら<実行文2>を実行し,又<実行文1>に 戻る... 途中で<条件>が不成立になったらループから抜ける 【その他】 \newif (p.211)
手動バージョン管理で色付け(第1引数で指定した数字以上の部分に色を付ける)
\newcommand{\col}[2]{% \ifnum #1 > 1 \textcolor{red}{#2} % \else {#2} \fi % } \col{0}{ここは古い} \col{10}{ここは新しい}
gcc 丸めモードと最適化オプション
% gcc -v ... gcc バージョン 4.2.4 (Ubuntu 4.2.4-1ubuntu4) % gcc hoge.c -lm && ./a.out 0: 4.00099999999999980105e+01, 4.00100000000000051159e+01 1: 4.00099999999999980105e+01, 4.00100000000000051159e+01 % gcc -O1 hoge.c -lm && ./a.out 0: 4.00099999999999980105e+01, 4.00099999999999980105e+01 1: 4.00099999999999980105e+01, 4.00100000000000051159e+01 % gcc -O2 hoge.c -lm && ./a.out 0: 4.00099999999999980105e+01, 4.00099999999999980105e+01 1: 4.00099999999999980105e+01, 4.00100000000000051159e+01 % gcc -O3 hoge.c -lm && ./a.out 0: 4.00099999999999980105e+01, 4.00099999999999980105e+01 1: 4.00099999999999980105e+01, 4.00099999999999980105e+01
数値演算の結果がおかしなことになってしまった.
hoge.c でやっていることは 40 と 0.01 を上丸めと下丸めで足し合わせて 40.01 を含む区間を求める.
丸めモードの指定は fesetround を使用して実現しているが, 上丸めがうまくいかない.
ほかの値でやると下丸めがうまくいかないこともある.
add0 と add1 で値が変わるのも理解できない.
#include <stdio.h> #include <fenv.h> #define UP fesetround(FE_UPWARD) #define DOWN fesetround(FE_DOWNWARD) #define NEAR fesetround(FE_TONEAREST) typedef struct { double sup; double inf; } intv; #define ADD(x,y,z) DOWN; (z)->inf=(x)->inf+(y)->inf; UP; (z)->sup=(x)->sup+(y)->sup; intv add0(intv x, intv y) { intv z; ADD(&x,&y,&z); NEAR; return z; } intv add1(intv x, intv y) { intv z; ADD(&x,&y,&z); if (z.inf <= z.sup) { NEAR;} return z; } int main() { intv d1, d2, d3; d1.inf = d1.sup = 40; d2.inf = d2.sup = 0.01; d3 = add0(d1, d2); printf("0: %1.20e, %1.20e\n", d3.inf, d3.sup); d3 = add1(d1, d2); printf("1: %1.20e, %1.20e\n", d3.inf, d3.sup); return 0; }
GMP と BoehmGC
以下のようなコードを 32bit 環境の Mosh で実行すると大量に「Repeated allocation of very large block」という警告が出る。
GMP の allocation が問題みたいなので mp_set_memory_functions で GC_malloc_atomic を指定したいがこれは NG らしい。
Boehm GC の Repeated allocation of very large block 問題 - higepon blog
GMP を使用して多項式演算を実装していると, 「Repeated allocation of very large block」がでてくる.
多倍長整数を BoehmGC つかって自前で実装したことがあるのだけど, GC_malloc 使うのと GC_malloc_atomic では効率差が大きくでた.
GMP のソースみてないから大丈夫かどうかわからないのだけど, サイズの大きい allocate は整数の値を表す部分と文字列の部分で GC に影響ないだろうから, mp_set_memory_functions で渡す関数を以下のようにしたらだめなのかしら.
my_alloc(size) { if (size > AAA) { return GC_malloc_atomic(size); } else { return GC_malloc(size); } }
void *big_alloc(p, size) { if (size > AAA) { return GC_malloc_ignore_off_page(size); } else { return GC_malloc(size); } }
sshfs
リモートのディレクトリをローカルにマウントする便利なやつです.
インストール
# apt-get install sshfs パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています... 完了 以下の特別パッケージがインストールされます: fuse-utils .... creating fuse device node... udev active, devices will be created in /dev/.static/dev/ creating fuse group... Adding group `fuse' (GID 114) ... % grep fuse /etc/group fuse:x:114:
使ってみる
使用するユーザを fuse グループに追加した後,
% sshfs remote: ~/mnt fusermount: failed to open /dev/fuse: No such file or directory # mknod -m 666 /dev/fuse c 10 229 % sshfs remote: ~/mnt % df | grep sshfs sshfs#remote: 7999999992 0 7999999992 0% /home/xxx/mnt # umount ~/mnt
一般ユーザで umount するには fusermount を使用する(01/07 追記)
% fusermount -u ~/mnt % df | grep sshfs
おまけ
この状態で
# apt-get remove sshfs # vi /etc/group -- fuse グループを削除 # apt-get install sshfs ... dpkg: syntax error: unknown group `fuse' in statoverride file E: Sub-process /usr/bin/dpkg returned an error code (2)
とエラーがでる.
# vi /var/lib/dpkg/statoverride ... root fuse 4750 /usr/bin/fusermount -- この行を削除 # apt-get install sshfs
これでインストールはできるようになる fuse グループは追加されない.
# apt-get remove sshfs fuse-utils
CD/DVD
ぜんぜん使い方しらないなぁと思ったら, FreeBSD な時代には一度も CD/DVD ドライブを認識してくれたことがなかったのでした. (ドライバが対応してない/USBが使えない...)
CD-ROM を入れると勝手に認識してくれた.
% cat /etc/fstab /dev/scd0 /media/cdrom0 udf,iso9660 user,noauto 0 0 % df | grep cdrom /dev/scd0 31xxxxx 31xxxxx 0 100% /media/cdrom0 % ls -l /cdrom lrwxrwxrwx 1 root root 11 2007-12-20 00:53 /cdrom -> media/cdrom/ % ls -l /media/cdrom lrwxrwxrwx 1 root root 6 2007-12-20 00:53 /media/cdrom -> cdrom0/
ただ, アプリのインストールに失敗するなぁと思ってインストーラのシェルスクリプトを眺めていたら, すべてのファイルが小文字になっていたことが発覚.
% man mount ... norock Rock Ridge 拡張が利用できる場合でもこれを無効にする。 map も参照の こと。 nojoliet Microsoft Joliet 拡張が利用できる場合でもこれを無効にする。 map も 参照のこと。 check=r[elaxed] / check=s[trict] check=relaxed が指定されると、ファイル名はまず小文字に変換されてか ら照合される。これは norock および map=normal とともに用いた場合に だけ意味がある。 (デフォルトは check=strict。) .... map=n[ormal] / map=o[ff] / map=a[corn] Rock Ridge 拡張がされていないボリュームに対して normal が指定され ると、ファイル名の大文字が小文字の ASCII にマップされ、最後の ‘;1’ は削除され、‘;’ はすべて ‘.’ に変換される。 map=off が指定されると 、ファイル名の変換は行わない。 norockを 見 よ 。 デ フ ォ ル ト は map=normal 。 map=acorn は map=normal と似ているが、Acorn 拡張があ ればそれを適用する。 .... # umount /cdrom
とりあえずアンマウントして, いろいろためしてみたら, Joliet 優先でうまくいった (/dev/scd0 は /etc/fstab とか df の結果から).
# mount -t iso9660 -r /dev/scd0 /media/cdrom # RockRidge優先 # mount -t iso9660 -r -o norock /dev/scd0 /media/cdrom # Joliet優先 # mount -t iso9660 -r -o norock,nojoliet /dev/scd0 /media/cdrom # iso9660 # mount -t iso9660 -r -o norock,nojoilet,map=off /dev/scd0 /media/cdrom # iso9660 raw (ファイル変換なし)