後輩がもってる、Bessa なんとか、という距離計連動式のカメラを触らせてもらった。
ファインダーの作り込みがいまひとつなのだが、等倍、というか、ただの透過式のファインダーは、レンジファインダーのカメラの存在意義的にはいいのかもね。空気のような存在感。
けっこういい感じの重さだった。惚れちゃうかも。
でもね、FE2 買ったばっかりだし(笑)。
投稿者: yasu
あうー。
ねる。
ていうか、寝かせて。
自転車進捗
– サドルバッグと携帯用の工具類
– 前後の灯火類
– メーター
– ボトルケージ
などを揃えた。ボトルケージと工具以外は、ほとんど余っているものを流用する感じ。はやく部品そろわないかなー。
あと、バーテープなんかも買ってきた。
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 はもっと最近のノリというか、そんな感じ。
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__ と同等の識別子、だと思う。