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.mak
https://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 で問題なさげ.

起動

vim 起動してから以下のコマンドで起動

 :VimShell 

":new" とかで画面分割してやると vim からでずに作業できる. まれに変な動きするけどひとつのターミナルで作業できるのは快適.

BoehmGC + pthread

Boehm GC をマルチスレッド環境で使うときのメモ.

include 方法

#define GC_THREADS // pthread_*とかを上書きする
#include "gc.h"
#include 
#include 
#include 
http://fistfvck.sakura.ne.jp/w/c_cplusplus/boehmgc
  • 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 備忘録

久しく使っていないのでメモメモ.

数学記号まわり

2項演算子
\vee \vee \land
\wedge \wedge \or
単項演算子
\neg \neg
括弧
下括弧 \underbrace{abc}_{DDD} \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 の
            いずれかにあるかどうかの判定

【\if】 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)
http://www.is.titech.ac.jp/~mase/latex.hlp

手動バージョン管理で色付け(第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 で値が変わるのも理解できない.

以下使用したソースコード (hoge.c)

#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-utils のインストールにより fuse グループが追加される.

使ってみる

使用するユーザを 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

として, fuse-utils をアンインストールすれば fuse グループは勝手にけしてくれるしエラーもでない.

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 (ファイル変換なし)