Bessa

後輩がもってる、Bessa なんとか、という距離計連動式のカメラを触らせてもらった。
ファインダーの作り込みがいまひとつなのだが、等倍、というか、ただの透過式のファインダーは、レンジファインダーのカメラの存在意義的にはいいのかもね。空気のような存在感。
けっこういい感じの重さだった。惚れちゃうかも。
でもね、FE2 買ったばっかりだし(笑)。

自転車進捗

– サドルバッグと携帯用の工具類
– 前後の灯火類
– メーター
– ボトルケージ
などを揃えた。ボトルケージと工具以外は、ほとんど余っているものを流用する感じ。はやく部品そろわないかなー。
あと、バーテープなんかも買ってきた。
WH-R550 で 10s のスプロケ使うにはスペーサーがいるのかー。ううむ。
カンパのホイールはどうなんだろう…

FreeBSD で空きメモリ容量を取得

FreeBSD は sysctl でいろいろわかる。top のソース (machine.c) とか読めば簡単。

#include <sys/types.h>
#include <sys/resource.h>
#include <sys/sysctl.h>
#include <sys/vmmeter.h>
#include <stdio.h>
#include <unistd.h>
#define UNIT (1024*1024)
int getsysctl(char* name){
int mib[4];
size_t len = 4;
int size;
sysctlnametomib(name, mib, &len);
if (sysctl(mib, 4, &size, &len, NULL, 0) != -1)
return size;
return 0;
}
int main(){
int pagesize = getpagesize();
int pa, pi, pw, pc, pf;
pa = getsysctl("vm.stats.vm.v_active_count");
pi = getsysctl("vm.stats.vm.v_inactive_count");
pw = getsysctl("vm.stats.vm.v_wire_count");
pc = getsysctl("vm.stats.vm.v_cache_count");
pf = getsysctl("vm.stats.vm.v_free_count");
printf("active: %d\n",   pa * pagesize / UNIT);
printf("inactive: %d\n", pi * pagesize / UNIT);
printf("wired: %d\n",    pw * pagesize / UNIT);
printf("cache: %d\n",    pc * pagesize / UNIT);
printf("free: %d\n",     pf * pagesize / UNIT);
return 0;
}

MacOS X で空きメモリ容量を取得

MacOS X の top とかで表示される空きメモリ容量を、自分のプログラムからシステムコールとか使って取得したいなー、と思ってたのだけれど、どうも sysctl ではダメらしい。で、いろんなフリーのツールのソースを読んだりしてびびっときたのが host_statistics() というやつだ。Mach のシステムコールらしい。

直接参考になったのはこれ。ユーザランドは BSD だけど、カーネルは Mach なんだよなー、なるほどなー、という感じだ。

C のプログラムにするとこんな感じ。

#include <stdio.h>
#include <mach/mach_init.h>
#include <mach/host_info.h>
#include <mach/mach_host.h>
int main(){
vm_statistics_data_t page_info;
vm_size_t pagesize;
mach_msg_type_number_t count;
kern_return_t kret;
pagesize = 0;
kret = host_page_size (mach_host_self(), &pagesize);
count = HOST_VM_INFO_COUNT;
kret = host_statistics (mach_host_self(), HOST_VM_INFO,
(host_info_t)&page_info, &count);
if (kret == KERN_SUCCESS){
unsigned int pw, pa, pi, pf;
pw = page_info.wire_count*pagesize;
pa = page_info.active_count*pagesize;
pi = page_info.inactive_count*pagesize;
pf = page_info.free_count*pagesize;
printf("wired %d\n", pw);
printf("active %d\n", pa);
printf("inactive %d\n", pi);
printf("free %d\n", pf);
}
return 0;
}

実行すればこうだ。

% ./a.out
wired 136630272
active 330928128
inactive 348598272
free 526020608

めでたい。FreeBSD では sysctl でいけるんだけど、Linux は procfs みるしかないのかな?

CICLISMO 2

チャリ音楽といえば、Kraftwerk の Tour de France soundtrack ですが、CYCLISMO は Made in Japan なわけですよ。… Kraftwerk のアレは昔からのテクノ路線で、CYCLISMO はもっと最近のノリというか、そんな感じ。


Protein Bioinformatics と一緒に amazon で買った。
チャリ音楽といえば、Kraftwerk の Tour de France soundtrack ですが、CICLISMO は Made in Japan なわけですよ。
音楽的には、僕の感覚から言うと多少騒がしいのだけれど、いきなりヘリの爆音から始まったりとか、すげえかっちょええっす。Kraftwerk のアレは昔からのテクノ路線で、CICLISMO はもっと最近のノリというか、そんな感じ。
意外なアーティストが参加してたりとかして、びっくり。
HRMC 氏なんかは聴くべきだね。ぜったい。

FE2 修理

FE2 のミラーが上がりっぱなしになって、巻き上げもできない状態だった (シャッターダイヤルをメカニカルにしても動かないので、電池切れとは関係ない) のだが、底蓋をあけてちょっといじったら、直った。めでたい。
Nikomat もなおしたいのだが、こいつはカニ目ドライバが必要。分解の手順とかは、web を探したらけっこうでてきた。たとえばこれ とか。大事にしてあげないとね。きっと、修理すればまだまだ使えるはず!

malloc その後

2GB 以上だめなのって、32bit 符号付きな値でサイズ指定してるからそれ以上は一気にとれないだけじゃね?しかもさっきのプログラム、free() してないじゃん、ということに気づいたので、やってみた。
FreeBSD はまあ、loader.conf で設定してるから妥当。

% ./a.out
malloc   128MB :OK!
malloc   256MB :OK!
malloc   384MB :OK!
malloc   512MB :OK!
malloc   640MB :OK!
malloc   768MB :OK!
malloc   896MB :OK!
malloc  1024MB :OK!
malloc  1152MB :OK!
malloc  1280MB :OK!
malloc  1408MB :OK!
malloc  1536MB :OK!
malloc  1664MB :OK!
malloc  1792MB :OK!
malloc  1920MB :OK!
malloc  2048MB :failed...

MacOS X は 32bit 環境でもけっこういける。64bit 環境なら無限だ。

% ./a.out
malloc   128MB :OK!
malloc   256MB :OK!
malloc   384MB :OK!
malloc   512MB :OK!
malloc   640MB :OK!
malloc   768MB :OK!
malloc   896MB :OK!
malloc  1024MB :OK!
malloc  1152MB :OK!
malloc  1280MB :OK!
malloc  1408MB :OK!
malloc  1536MB :OK!
malloc  1664MB :OK!
malloc  1792MB :OK!
malloc  1920MB :OK!
malloc  2048MB :OK!
malloc  2176MB :OK!
malloc  2304MB :OK!
malloc  2432MB :OK!
malloc  2560MB :OK!
malloc  2688MB :OK!
malloc  2816MB :OK!
malloc  2944MB :OK!
malloc  3072MB :OK!
malloc  3200MB :OK!
a.out(2293) malloc: *** vm_allocate(size=134217728) failed (error code=3)
a.out(2293) malloc: *** error: can't allocate region
a.out(2293) malloc: *** set a breakpoint in szone_error to debug
malloc  3328MB :failed...

テストプログラムはこんな感じ。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#define UNIT 128
#define LIMIT 10240/UNIT // 10240/UNIT = max 10GB
void hogealloc(int level){
void *p;
int l;
l = level + 1;
printf("malloc %5dMB :", l*UNIT);
if ( (p = malloc(UNIT*1024*1024)) == NULL ){
printf("failed...\n");
return;
} else {
printf("OK!\n");
if( l == LIMIT ) printf("exit.\n");
else hogealloc(l);
return;
}
}
main(){
int s=1;
hogealloc(0);
}

free() してないけど、まあ、これならいいだろ。

MAXDSIZ

FreeBSD/i386 で、なにも設定していないときの1プロセスあたりの最大メモリサイズは512MB。でも、そんなんじゃ sequence analysis なんかできませんがな。

% limit
datasize     524288 kbytes
stacksize    65536 kbytes

これがデフォルトだ。んで、/boot/loader.conf に

kern.maxdsiz="2048m"
kern.maxssiz="1024m"

と書いてやったところ、

% limit
datasize     2097152 kbytes
stacksize    1048576 kbytes

になった。いえーい。FreeBSD/amd64 とかだとどうなんでしょう?
テスト用に書いたコードはこんな感じ:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
main(){
int s=1;
void *p;
for( s=1; s<=2048; s*=2 ){
printf("malloc %5dMB :", s);
if ( (p = malloc(s *1024*1024)) == NULL )
printf("failed¥n");
else
printf("OK¥n");
}
}

FreeBSD/Linux/MacOS の32bit環境では 2048MB はダメ、Mac の ppc64 なら OK だった。
FreeBSD はもしかしたら、MAXDSIZ をもうちょっと増やせば 2048 はいけるかも。

Linux で limit たたいてみた結果:

% limit
datasize     unlimited
stacksize    8192 kbytes

MacOS で limit :

% limit
datasize        6144 kbytes
stacksize       8192 kbytes

6144k って嘘だろ、おい。表示が間違ってるだけみたいだけど。

MacOS/ppc でコンパイル時に 32bit と 64bit 環境を識別

#if defined (__APPLE__) && defined (__ppc__)
printf("ppc32\n");
#endif
#if defined (__APPLE__) && defined (__ppc64__)
printf("ppc64\n");
#endif

こいつを gcc -arch ppc -arch ppc64 hogehoge.c とかしてコンパイルしてやると、32bit な環境と 64bit な環境ではちゃんと違った表示になる。ちなみに、__APPLE__ は、__linux__ とか __FreeBSD__ と同等の識別子、だと思う。