c

printfで文字列のところにintを渡す

c

#include <stdio.h> int main(int argc, char *argv[]) { int i = 100; printf("%s:\n", i); return 0; } とするとSEGVで落ちるけど、このとき起こっていることを理解してなかったと、久しぶりに使った valgrind のメッセージで気付いた。 $ valgrind ./seg ==25237==</stdio.h>…

Mongrel2のコードリーディング……、と関係なく正規文法についてメモ

Mongrel2のコードを眺めていてRagelという有限オートマトンを一般的なプログラミング言語にコンパイルするツールのことが気になった。Ragelのユーザーガイドの冒頭に、rationale的なことが書いてある。それとか、Wikipediaで読み漁ったところを勉強メモとし…

Mongrel2とは関係なく「Ragel」……とも関係なくGarden Path Sentences

Mongrel2のsrc/http11/http11_parser.cを見てたら以下のようなコードがあった。 #line 454 "src/http11/http11_parser.c" switch( (*p) ) { case 33: goto st16; case 58: goto tr25; case 124: goto st16; case 126: goto st16; } if ( (*p) < 45 ) { if ( …

Mongrel2が面白い

クリーンなCで書かれたWebサーバ「Mongrel2」を読んでみた。コードの内外ともにドキュメントはしっかりしているし、関連ブログエントリもあって、非常に勉強になる。何より、毒舌のZed Shawの書く文章は面白くて飽きないのがいい。例えば、src/adt以下にはユ…

8重ループでも十分速い

なんだかイライラしたので、心を落ち着けるためのProject Euler。31問目。イギリスのコインには、2ペンスとか20ペンスという偶数のものがあるらしく、いろいろ組み合わせて、ちょうど2ポインド(200ペンス)になるコインの組み合わせの数は? という問題。最…

sqliteの読み方

c

ソースコードを読め。読むなら例えば……、というときに必ず例に挙がるのがsqlite3。で、GNU Globalでタグを付けて読み始めた。btree.hがまずキモかなと思いつつ眺める。にしても、迷子感が強いので、思わず「sqlite 読み方」とググッてしまった。出てくるわ出…

Cで文字列を反転させる再帰関数

c

Cで文字列を反転させる関数を再帰を使って書け、という問題をふと思い出して書いてみた。久しぶりにCを書くと一発でコンパイルが通らなかったりする。で、プロトタイプ宣言なしだと、小粒の関数から順に並べないとダメだったりして、どうも気持ち悪い。抽象…

多倍長演算ライブラリ

c

RubyはBignumがあってIntegerクラスと勝手に変換してくれるのが便利だなと思っていたけど、多倍長演算(arbitrary precision arithmetic)のライブラリというのは結構ゴロゴロと存在していて、使うのも難しくないらしいことを発見した。きっとJavaにもいいライ…

Project Euler 23

Project Euler 23。何となくCでやってみたけど、やっぱりRubyのような抽象度の高い言語に比べると面倒だ。 #include <stdio.h> #include <stdlib.h> #define NUM 10000 #define LIMIT 28123 int isabundant(int n) { int sum = 0, ptr = 0; for (int i = 1; i <= n / 2; i++) { </stdlib.h></stdio.h>…

Linuxシステムコールプログラミング

c

「Linuxシステムコールプログラミング」(山森丈範、技術評論社)、読了。代表的なUnixのシステムコールについてジャンル別に7章ほどに分けて解説する本。システムコールとはそもそも何かということや、「サンプル以上、実用未満」のサンプルコードを掲載し…

mmapとかbrkとか

c

「Linuxシステムコールプログラミング」(山森丈範著)で、Linuxにbrk/sbrk(2)というシステムコールがあるのを知った。 #include <unistd.h> #include <stdlib.h> #include <string.h> int main() { char *s; if ((s = sbrk(13)) == -1) { perror("sbrk"); return 1; } strcpy(s, "Hello Wo</string.h></stdlib.h></unistd.h>…