2008-02-01から1ヶ月間の記事一覧

LockFileEx

http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpfileio/html/_win32_lockfileex.asp Windwosでflockってどうやるんだろう…と思って、よく分からないのでやっぱりwin32.cを読む。 LockFileExを使うのか、とすぐ分かる。すばらしい。

INFO:種類の Win32 でのファイル I/O

http://support.microsoft.com/kb/99173/ja SOCKETも互換性なし…と。

C ランタイム関数の Win32 で対応する関数一覧

http://support.microsoft.com/default.aspx/kb/99456/ja メモメモ。

とりあえずRubyのステート・マシンを作ってみた

うーん、果たして他の言語に応用できるもんか… %%{ machine ruby_machine; action Y { yield(data, head, fpc); head = fpc + 1; } main := ( (lower+ ' ') @Y )* ; }%% class RubyMachine %% write data; def self.parse(data) head = 0 %% write init; %% …

Mongrelのrlファイルを読む

Ragelのマニュアルとにらめっこしていてもさっぱりなので、Mongrelのソースを読んでみる、と。 svn://rubyforge.org/var/svn/mongrel/trunk/ext/http11/ ……おー、わかりやすい。RFCチックなHTTP/1.1のリクエストの定義は簡潔でなかなか気持ちいい。 Zed Shaw…

最近のやりたいこと

Ragelを勉強する 低パフォーマンスなCOMETサーバを作る C言語の動的な関数のロードを勉強する Ruby 1.9を使ってモジュールを作ってみる …ぐらいかな。

第2回RHGの逆襲に行ってきた

今回は第3章、st_tableについて。とりあえず、以下が1.8と1.9の大きな違いだと思われる。 挿入順を保持するようになった entries_packedが追加された entries_packedは要素数が少ないときに配列を使って キー、値、キー、値… という感じで、単純にキーと値…

st_tableを拡張ライブラリで使う

RHGの逆襲で「st_tableを拡張で使うと便利だよ」という話を聞いて、へーと思ったので、st_tableで簡単なハッシュテーブルを実装してみた。 拡張ライブラリ #ifdef _WIN32 __declspec(dllexport) void Init_my_hash(void); #endif #include "ruby.h" #include…

WinSockでpollをエミュレート

こんな感じ。 #include <stdio.h> #include <winsock2.h> #include "wspoll.h" #include <memory.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define MAX_NFDS WSA_MAXIMUM_WAIT_EVENTS #define POLL_TIMEOUT 1000 #define die(...) do { fprintf(stderr, __VA_A</memory.h></winsock2.h></stdio.h>…

腹減った…

プチ断食中。おなかすいたなぁ。

echod_async.c

Cygwinでは動かず。非同期だからといってIOが多重化されるわけではない…と。 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <fcntl.h> #include <sys/file.h> #include <signal.h> #include <errno.h> #define ECHO_PORT 7 #define MA…</errno.h></signal.h></sys/file.h></fcntl.h></unistd.h></sys/types.h></arpa/inet.h></sys/socket.h></string.h></stdlib.h></stdio.h>

win32/win32.c

http://svn.ruby-lang.org/repos/ruby/tags/v1_8_6_113/win32/win32.c 読んでるとナカナカ勉強になる。 「_open_osfhandle()でSOCKETをファイルディスクリプタに変換してるのかー」とか「fcntl()は定義してるけどF_GETFDは定義してないのね…」とか。

pollのエミュレートを考え中…

WinSockのイベントまわりのAPIでpoll(2)をエミュレートできないか考え中。 WinSock.hに定義されているかもしれないpollfdと定数はマクロで再定義できそうだし、WSAWaitForMultipleEvents()はイベントの数じゃなくてインデックスを返すけど不要なイベントは無…

翻訳パネル: translation.rdfのパッチ

Exciteの翻訳がまた使えなくなってたので、translation.rdfを修正。 --- translation.rdf.orig 2008-02-20 12:04:40.437500000 +0900 +++ translation.rdf 2008-02-20 12:03:04.171875000 +0900 @@ -123,7 +123,7 @@

pollのエミュレートを考え中… その2

イベントのマッピングはこんな感じかなぁ… poll(3) WinSock POLLIN FD_READ | FD_ACCEPT | FD_CLOSE POLLPRI FD_OOB POLLOUT FD_WRITE | FD_CONNECT | FD_CLOSE POLLRDHUP FD_CLOSE POLLERR × POLLHUP FD_CLOSE POLLNVAL × POLLRDNORM POLLIN POLLRDBAND POL…

EAGAINとWSAEWOULDBLOCK

http://www.kt.rim.or.jp/~ksk/wskfaq-ja/articles/bsd-compatibility.html http://www.koders.com/c/fidECDE0904A9E7E0D9F1AFB22DB9076C356C4C2BCE.aspx?s=map_errno#L183 map_errnoでWSAEWOULDBLOCKをEAGAINにマップするという話はないんだろうか…

echod_winsock_event.c

WSAWaitForMultipleEvents、資料少ない…。動くことは動いたけど、終了処理が怪しいなぁ。 #include <stdio.h> #include <winsock2.h> #define _CRT_SECURE_DEPRECATE_MEMORY #include <memory.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define WSAWFME_TIMEOUT 1000 #define RCVBUFSIZ</memory.h></winsock2.h></stdio.h>…

あー…

echoサーバを書き続けるブログになってるなぁ。 今日はaio_readかな。

echod_winsock.c

#include <stdio.h> #include <winsock2.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define die(...) do { fprintf(stderr, __VA_ARGS__); WSACleanup(); exit(1); } while(0) #define debug(...) do { fprintf(stderr, __VA_ARGS__); } while(0) sta</winsock2.h></stdio.h>…

echod_winsock_select.c

fd_setをなめるのがめんどくさいなぁ。 #include <stdio.h> #include <winsock2.h> #include <time.h> #define _CRT_SECURE_DEPRECATE_MEMORY #include <memory.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define die(...) do { fprintf(stderr, __VA_ARGS__); WSAClean</memory.h></time.h></winsock2.h></stdio.h>…

RubyでのWinSockの初期化

拡張でWinSockの初期化をするわけにはいかないよなぁ…ということでRubyのソース(1.8.6-p111)を読んでみる。 win32/win32.cのStartSockets()関数でWinSockで初期化されてた。 static void StartSockets () { WORD version; WSADATA retdata; int ret; #ifndef…

WinSock: WSAPoll

http://msdn2.microsoft.com/en-us/library/ms741669.aspx 最近追加されたみたい。サンプル少ないなー。 Rubyで使ってみようと思ったら、WinSockのバージョンが違って挫折。

echod_winsock_poll.c

書くことは書いたけど、ws2_32.dllのバージョンが古くて動かず。 #include <stdio.h> #include <winsock2.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define MAX_NFDS 64 #define RCVBUFSIZE 256 #define POLL_TIMEOUT 1000 #define die(...) do { fprintf(stderr, __VA_ARGS</winsock2.h></stdio.h>…

Pound 2.4

http://www.apsis.ch/pound/ とりあえずメモ。 ざっと見た感じIPv6への対応とURLによるセッションが主な変更点かな?

echod.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define die(s) do { perror((s)); exit(1); } while(0) #ifdef DEBUG #…</errno.h></unistd.h></sys/types.h></arpa/inet.h></sys/socket.h></string.h></stdlib.h></stdio.h>

echod_prefork.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <errno.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define die(s) do { perror((s)); exit(1); } while(0) #ifdef DEBUG #…</errno.h></unistd.h></sys/types.h></arpa/inet.h></sys/socket.h></string.h></stdlib.h></stdio.h>

echod_multithread.c

TIME_WAITがたまっていくけど、いいのかなぁ・・・ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <pthread.h> #include <errno.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define die(s) do…</errno.h></pthread.h></unistd.h></sys/types.h></arpa/inet.h></sys/socket.h></string.h></stdlib.h></stdio.h>

echod_select.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <sys/select.h> #include <sys/time.h> #include <errno.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define die(s) do { f…</errno.h></sys/time.h></sys/select.h></unistd.h></sys/types.h></arpa/inet.h></sys/socket.h></string.h></stdlib.h></stdio.h>

echod_poll.c

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #include <arpa/inet.h> #include <sys/types.h> #include <unistd.h> #include <poll.h> #include <errno.h> #define ECHO_PORT 7 #define MAX_BACKLOG 5 #define RCVBUFSIZE 256 #define MAX_NFDS 1024 #define POLL_TIMEOUT 1000 #…</errno.h></poll.h></unistd.h></sys/types.h></arpa/inet.h></sys/socket.h></string.h></stdlib.h></stdio.h>

Google: Keyboard shortcuts

WEB

http://www.google.com/search?hl=ja&esrch=BetaShortcuts&q=hoge こんな試験やってたんだー。