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

Zip/Ruby: Zip::ArchiveがGCに回収されるタイミングでclose

Zip/Rubyを使っている人から「Zip::ArchiveがGCに回収されるときに、自動的にcloseしてくれない」というバグ(?)報告が。正直、closeはユーザの責任でやって欲しいなぁ…ということで、次のコードを提案してみる。 require 'rubygems' require 'zipruby' requi…

link: Manpage of MAKECONTEXT

http://www.linux.or.jp/JM/html/LDP_man-pages/man3/makecontext.3.html Cygwinでは動かず。残念。 なんか、実際にアプリで使われているコードはないかな… #include <ucontext.h> #include <stdio.h> #include <stdlib.h> #define handle_error(msg) do { perror(msg); exit(EXIT_FAILURE);</stdlib.h></stdio.h></ucontext.h>…

callccでコルーチン

呼び出し元のスタックフレームまで記憶しているのがワケワカ。 継続とコルーチンは違うのね… def coroutine loop do puts '春' continue = callcc {|c| c } and return(continue) puts '夏' continue = callcc {|c| c } and return(continue) puts '秋' cont…

Ruby1.8でのコルーチンの実装を考える

実装はできそうだけど、ネイティブスレッドを使うのは危険かなぁ。 corutine = Corutine.create do |c| # コルーチンスレッドの生成、メインスレッドの取得 loop do puts '春' c.suspend # メインスレッドに制御を移す puts '夏' c.suspend puts '秋' c.susp…

GNU Pthでコルーチン

Cygwinで動いた。 GNU Pthが一般的なのかな…libfiberもあったけど。 #include <stdio.h> #include <pth.h> void *handler(void *arg) { pth_t mth = (pth_t) arg; while (1) { puts("spring"); pth_yield(mth); puts("summer"); pth_yield(mth); puts("autumn"); pth_yield(m</pth.h></stdio.h>…

共有メモリを使う

OSの差異はどうとでも吸収できそう。 #include <windows.h> #include <stdio.h> #include <stdlib.h> #define SHM_SIZE 256 #define die(fmt, ...) \ do { \ fprintf(stderr, fmt, __VA_ARGS__); \ exit(1); \ } while(0) int main() { HANDLE hShm; void *p; hShm = CreateFileMappingA((H</stdlib.h></stdio.h></windows.h>…

Fiberでコルーチン

RubyじゃなくてWindows APIのほう。 Unixだとノンプリエンティブなスレッドってどうやって使うんだろう? #include <windows.h> #include <stdio.h> #include <stdlib.h> #define die(fmt, ...) \ do { \ fprintf(stderr, fmt, __VA_ARGS__); \ exit(1); \ } while(0) void _stdcall fiber(</stdlib.h></stdio.h></windows.h>…

とりあえず共有メモリを使ってみる

開いて閉じるだけ。munmapは必要なのかな? #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/mman.h> #include <errno.h> #define SHM_NAME "foo" #define SHM_SIZE 256 int main() { int fd; char *p; if ((fd = shm_open(SHM_NAME, O_CREAT | O_RDWR, 0666)) </errno.h></sys/mman.h></sys/types.h></unistd.h></fcntl.h></stdlib.h></stdio.h>…

Zip/Ruby: メモリ上のデータを扱うことを考えているんだけど…

そもそもlibzipがファイルしか扱わない設計なので、使えるようにするには大改造が必要。 メモリ領域をファイルとして操作できないかなー、と調べてみたけど、ヒープを直接操作するようなことはできなさそう。 共有メモリ周りの関数を使えば「メモリ領域をフ…

共有メモリ

それはそれとして、共有メモリは面白そうだから、今度調べてみよう。 shm_openはWindowsではなんだろう?追記 google:Windows 共有メモリ

任意の地域名でじゃらんのエリアコードを検索する

じゃらんのWebサービスは、地域ごとに振られたエリアコードか、地図の座標を引数として情報を引っぱってくるので、任意の地域名から情報を検索しようとするとジオコーディングが必要になる。 ジオコーディングを提供するWebサービスはGoogleをはじめとしてい…