Hatena::ブログ(Diary)

hogeなlog

プロフィール

hogelog

hogelog

小室 直(こむろ すなお)。電気通信大学2003年入学。2010年修士卒業。プログラミングとかしてます。

カレンダー
1984 | 01 |
2006 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 |
2010 | 01 | 06 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 05 | 08 | 09 | 10 | 12 |
2012 | 01 | 04 | 06 |

September 25(Thu), 2008

[][] QuickMarkの機能を拡張するvimperator-plugin moreqmarks.js

そんなものを書きました。

http://coderepos.org/share/browser/lang/javascript/vimperator-plugins/trunk/moreqmarks.js

使う場合は画面一番下のOriginal Formatから。


vimpratorのQuickMarkの機能は便利に使ってたんだけども、Mでmark追加した後なんのメッセージも出さんからわかりにくいとかそういう微妙なところをゴニョゴニョと.vimperatorrcにて改変して使ってました。いいかげん.vimperatorrcでやる範囲でもなくなってきたかなと思ったのでvimperator-pluginとしてアレコレ機能追加してみました。


まず元々QuickMarkで提供してる機能の動作変更としてはマーク情報としてMarksの方と同様に表示位置も記憶するように。あとコマンドとかマッピングとかごちゃごちゃ追加。

あとなんかmarkを使わないで記憶するQuickMarkQueueとQuickMarkStackという謎の領域が追加されています。

追加コマンド

:qmarkpu[sh],:qmpu[sh]
QuickMarkStackの末尾に現在表示してるページを積む
:qmarkpo[p],:qmpo[p]
QuickMarkStackの末尾からページ情報を取ってきてジャンプ
:stackli[st],:stli[st]
QuickMarkStack情報をリスト表示
:qmarkqu[eue],:qmqu[eue]
QuickMarkQueueの先頭に現在表示してるページを追加
:qmarkde[que],:qmde[que]
QuickMarkStackの末尾からページ情報を取ってきてジャンプ
:queueli[st],:quli[st]
QuickMarkQueue情報をリスト表示

追加マッピング

gj?
?キーに関連付けられたページにジャンプ。既にそのページを開いているタブがあればタブ切り替え、無ければ新規タブで開く
gd
現在表示しているページをQuickMarksから削除
gs
:qmarkpushコマンドと同様
gS
:qmarkpopコマンドと同様
gq
:qmarkqueueコマンドと同様
gQ
:qmarkdequeコマンドと同様

使い方としてはあとで読むかなーと思ったページなんかが溜ってきて、でもタブが肥大化すんのが嫌なときにキューにページ突っ込んどくとかそんな感じだと思う。スタックは底のページを二度と開くことが無くなるかもという恐しい罠が……!

September 23(Tue), 2008

[] ruby拡張で作ったクラスで使う自前アロケータとフリーの呼び方

世間の皆々様に至ってはきっと日々ruby拡張を作ったりしてることと思います。

わたしはなんかRuby/SDL使った画像ビューアを作ったりしてました。その適当な画像ビューアはまあどうでもいいんですけど、書いててふと「あれこれRuby/SDLが確保したSDL資源(Surfaceとか)どこで解放してんの?」と思ってソース読んだらGC呼ばれるときちゃんと一緒に解放されるようなので、うんよくできてるなーと思いました。

というわけでその理解が合っているのか、ruby拡張で自前のアロケータとフリーするminimalなコードのテストをしてみんとす。


mystruct.c

#include "ruby.h"

typedef struct {
    int dummy;
} MyStruct;

static VALUE cStruct = Qnil;

static void myfree(MyStruct *buf) {
    static int count = 0;
    printf("call myfree: %d\n", ++count);
    xfree(buf);
}
static VALUE myalloc(VALUE klass) {
    static int count = 0;
    MyStruct *buf = ALLOC(MyStruct);
    printf("call myalloc: %d\n", ++count);
    return Data_Wrap_Struct(klass, 0, myfree, buf);
}

void Init_mystruct() {
    cStruct = rb_define_class("MyStruct", rb_cObject);
    rb_define_alloc_func(cStruct, myalloc);
}

require 'mystruct'でInit_mystruct()が呼ばれ、MyStructクラスをrubyに提供する拡張機能です。

ALLOCというのはruby.hで定義されてるxmallocを呼び出すマクロで、xmallocの実体はruby_xmalloc、xfreeの実体はruby_xfreeです。FREEというマクロは何故か提供されていない。


ビルドにはextconf.rb

require 'mkmf'
create_makefile 'mystruct'

を用意してあげて

$ ls
extconf.rb  mystruct.c  test.rb
$ ruby extconf.rb
creating Makefile
$ ls
Makefile  extconf.rb  mystruct.c  test.rb

と作ったMakefileでビルド

$ make
cc -I. -I/usr/lib/ruby/1.8/i486-linux -I/usr/lib/ruby/1.8/i486-linux -I. -D_FILE_OFFSET_BITS=64  -fPIC -fno-strict-aliasing -g -g -O2  -fPIC   -c mystruct.c
cc -shared -o mystruct.so mystruct.o -L. -L/usr/lib -L.  -rdynamic -Wl,-export-dynamic    -lruby1.8  -lpthread -ldl -lcrypt -lm   -lc
$ ls
Makefile  extconf.rb  mystruct.c  mystruct.o  mystruct.so*  test.rb

mystruct.soができたのでテストコードtest.rbを走らせてみる。


test.rb

#!/usr/bin/ruby

require 'mystruct'
3.times do
    a = MyStruct.new
end
GC.start
puts 'end'
$ ruby test.rb
call myalloc: 1
call myalloc: 2
call myalloc: 3
call myfree: 1
call myfree: 2
call myfree: 3
end

GCが呼ばれるタイミングでMyStructが解放され、自前で用意したmyfreeが呼ばれてますね。安心。

September 20(Sat), 2008

[] また放置してた

院試だなんだとあって放置が続いていた。

書くべきことがある。そう、AlohakunKotobaZemeの感想戦である。ひどいな。8/31のことですよ、はいはいしかできなかった子が逆立ちできるようになるよもう。そんなわけでよし書こう。ただ今はひどく眠い。

トラックバック - http://d.hatena.ne.jp/hogelog/20080920

September 01(Mon), 2008

[] 8/29 VIM等Hackathon

Googleトランジット先生が言うとおりの電車にのって南町田まで。そこからgeekhouseがまあ駅からどっちの方向性にあるのか聞いて、あと適当に勘で歩く。この時、俺は自分の勘をかなり無根拠に信じる癖があるなと気付いた。なんかこう勘でたどりつけそうな気がしたんだけど中々時間かかった。結局ふらふらしてる途中にujihisaから寄せられたヒントにより到着。geekhouse着いてからは自分の.vimrcを整理したり、意味を調べたりしていた。gvimかどうかはhas('gui')、Windowsかどうかはhas('win32')とかで調べれるんだなーとか(よくみりゃkaoriyaのvimのデフォルトgvimrcに書いてあった)。

あとはかなりチマチマC++からSDLに触れてた。どうも俺はSDLに触れるプログラムを書く際には、全く同じような用途であっても毎回最初から書きなおすという癖(以前書いたもの忘れてる)があったのでよくないなと反省したりしていた。


id:malaさんのティラミスおいしかったです。id:phaさんの料理の数々おいしかったです。id:hajimehoshiとujihisaのテンションが噛み合って非常に危険な化学反応をおこしてました。


geekhouseへの献上品は小泉真里の「ジンクホワイト」と「健全恋愛ライフ」、あと福満しげゆきの「ぼくの妻ってどうでしょう?」。こっそり本棚に挿入しておきました。あとたまたま持ち歩いてただけの「ゲテ食大全」*1をgeekhouseに忘れてきました。geekhouse書籍の一部になるとそれはそれでおもしろいかな。一部の方にはかなり受け入れがたい写真とかまで入ってる素晴しい書籍なのでその命運は不明ですね。


帰るときは雷雨がひどく大変なことになりました。傘というものは鞄の中の精密機器を守るための道具なのだなあとしみじみ。全身ずぶ濡れ。geekhouseから駅までの道程をちゃんと把握してないがために帰りでもふらふらしまくって適当に電車のったり遅延しまくったりしててなんか知らんが帰れなくなってたので漫画喫茶に退避。次の日LL Futureだから眠るべきかなと思ったけど漫画を読まずにいられず、始発の時間まで起き続ける。まいった。「高校デビュー」とか面白かったです。

[][] 8/30 LL Future

忘却の彼方にある古の記憶を掘り起こす作業を開始する。この日はまず始発で帰宅し眠りこけ、ひどいことにLL Future会場なかのZEROにたどりついたのはもゴルフセッションはじまるあたり。*2


Golfとか「古い言語、新しい言語」はみなさん割と書いてるけど、なんかこうもったいない感が強い。普通におもしろくはあったんですけど。LTはやっぱり好きだなあ。最初から300秒と決めることで発表内容がよく練られてる。


あとまあ色々な人に会った。ゴルフセッション終わり、前の方の席に移動すっかーとしたところでnaoya_tさんとid:higeponさんに遭遇。一番前のブロックの適当な席に位置取り「alohakunのET講義たのしみですねー」とかそんな話など。休憩時間にフラフラしてたらTheoriaさんに遭遇。トイレでid:ranhaさんに。知ってる人エンカウント率が高い。終わったあとはこう、会場でid:masa_edwさんやid:hayamizさんなどいるあたりでうろうろすることで、雰囲気で適当に非公式懇親会にまぎれこむことに成功。公式スタッフ側懇親会にも参加できるであろうhigeponさんなども何故かまじえつつ飲み屋で色々。飲み屋では二つある机が不思議とSchemer机とSIer哀愁譚席に分かれた。「サーバが淡々とログを吐き続ける様子を眺め、問題が発生しないか監視するお仕事」*3など聞いてて笑うしかない本当の話などをたくさん聞けてかなりおもしろかった。

*1:"あらゆる生物は人間の食材として平等である"という筆者の信念に基づき様々な生物(カブト虫から犬までなんでもござれ)のレシピが載ってる本

*2:だったはずだがLL Futureの昼食時にalohakunによるhogelog目撃談が挙げられており、真実は闇の中

*3:「C-Sはいいんですか?」と聞いたら「ダメ。というか操作は一切許されてなかった」と。

最近のコメント