スマートポインタのキャスト
boostのshared_ptrは非常に便利で常日頃からお世話になっているが,派生クラスへのキャストを行いたい時はどうすればいいのかと思っていたら,dynamic_pointer_castというものを使えばよいらしい.
#include <boost/shared_ptr.hpp> class base { public: base() { } virtual ~base() { } } class derived : public base { public: derived() { } virtual ~derived() { } } void func() { boost::shared_ptr<base> p_base(new base); boost::shared_ptr<derived> p_derived; p_derived = boost::dynamic_pointer_cast<derived>(p_base); }
しかし,boost::dynamic_pointer_castってのはちょっと長すぎやしませんかね.
FreeBSDにBoostを入れるのにハマる
Portsから入れようとするとエラーが出て上手くインストールできないので,ソースをとってきてコンパイルしても,やっぱりエラーになる.
$ tar xzfv boost_1_51_0.tar.bz2 $ cd boost_1_51_0 $ ./bootstrap.sh $ ./b2 ... gcc.compile.c++ bin.v2/libs/wave/build/gcc-4.2.1/release/link-static/threading-multi/cpplexer/re2clex/cpp_re.o gcc.archive bin.v2/libs/wave/build/gcc-4.2.1/release/link-static/threading-multi/libboost_wave.a common.copy stage/lib/libboost_wave.a ...failed updating 4 targets... ...skipped 6 targets... ...updated 284 targets...
どうやら,wave,graph,graph_parallelでこけているっぽいので,ビルドしないように指定したらうまくいった.
$ ./bootstrap.sh --without-libraries=wave,graph,graph_parallel $ ./b2 Building the Boost C++ Libraries. Performing configuration checks - 32-bit : no - 64-bit : yes - x86 : yes - iconv (libc) : no - iconv (separate) : yes - icu : yes - gcc visibility : yes - long double support : no warning: skipping optional Message Passing Interface (MPI) library. note: to enable MPI support, add "using mpi ;" to user-config.jam. note: to suppress this message, pass "--without-mpi" to bjam. note: otherwise, you can safely ignore this message. warning: No python installation configured and autoconfiguration note: failed. See http://www.boost.org/libs/python/doc/building.html note: for configuration instructions or pass --without-python to note: suppress this message and silently skip all Boost.Python targets - has_icu builds : yes Component configuration: - chrono : building - context : building - date_time : building - exception : building - filesystem : building - graph : not building - graph_parallel : not building - iostreams : building - locale : building - math : building - mpi : building - program_options : building - python : building - random : building - regex : building - serialization : building - signals : building - system : building - test : building - thread : building - timer : building - wave : not building ...patience... ...patience... ...patience... ...found 4877 targets... The Boost C++ Libraries were successfully built! ...
Portsでもbootstrap.shに引数を渡せれば,上手く行くんだろうけれど,やり方が良くわからない・・・
libevent2のタイマー
libeventのバージョン2系では,バージョン1系の時と幾ばくか御作法が異なっていた.バージョン2系でのタイマーは以下のようにするらしい.バージョン1系のときは,event_baseは指定する必要はなかったけれど,バージョン2系では指定する必要があり,さらに,event_setがなくなったっぽい.
3秒後にhello world!を表示するプログラム.
#include <stdio.h> #include <event.h> void hello(evutil_socket_t fd, short events, void *arg) { printf("hello world!\n"); } int main(int argc, char *argv[]) { struct event_base *ev_base; struct event *ev; struct timeval tval; ev_base = event_base_new(); ev = evtimer_new(ev_base, hello, NULL); tval.tv_sec = 3; tval.tv_usec = 0; evtimer_add(ev, &tval); event_base_dispatch(ev_base); event_free(ev); event_base_free(ev_base); return 0; }
この例ではevtimer_newを使っているけれど,自前でevent構造体をアロケートした場合はevtimer_assignを使うようだ.libeventは使いやすいけれどexampleが少なすぎる.
DNSポイゾニングによる児童ポルノ検閲を体験してみよう!
DNSのポイゾニング方式で児童ポルノサイトがブロッキングされたみたいなので,体験してみた.今回はSo-netのDNSサーバを利用して体験してみようと思う.アクセスするサイトは,http://dvdkodomo.com/ となる(閲覧注意).
dnss1.so-net.ne.jp (202.238.95.24) dnss2.so-net.ne.jp (202.238.95.26)
digでdvdkodomo.comをひいてみると以下のようになる.
$ dig @202.238.95.24 dvdkodomo.com ; <<>> DiG 9.6.0-APPLE-P2 <<>> @202.238.95.24 dvdkodomo.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38958 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2 ;; QUESTION SECTION: ;dvdkodomo.com. IN A ;; ANSWER SECTION: dvdkodomo.com. 3600 IN A 202.238.95.73 ;; AUTHORITY SECTION: dvdkodomo.com. 3600 IN NS dnss1.so-net.ne.jp. dvdkodomo.com. 3600 IN NS dnss2.so-net.ne.jp. ;; ADDITIONAL SECTION: dnss1.so-net.ne.jp. 2784 IN A 202.238.95.24 dnss2.so-net.ne.jp. 2910 IN A 202.238.95.26 ;; Query time: 15 msec ;; SERVER: 202.238.95.24#53(202.238.95.24) ;; WHEN: Thu Apr 21 18:28:51 2011 ;; MSG SIZE rcvd: 131
http://202.238.95.73/ にアクセスしてみると下のようなSo-netのページに飛ばされる.
ちなみに,自分はMacはローカルにUnboundというDNSキャッシュサーバをあげており,通常は名前解決にそれを使っている.Unboundを用いて名前をひいてみると,以下のようになる.
$ dig @localhost dvdkodomo.com ; <<>> DiG 9.6.0-APPLE-P2 <<>> @localhost dvdkodomo.com ; (3 servers found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20549 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1 ;; QUESTION SECTION: ;dvdkodomo.com. IN A ;; ANSWER SECTION: dvdkodomo.com. 144 IN A 67.219.12.130 ;; AUTHORITY SECTION: dvdkodomo.com. 85224 IN NS ns1.dvdkodomo.com. ;; ADDITIONAL SECTION: ns1.dvdkodomo.com. 144 IN A 67.219.12.130 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Thu Apr 21 18:38:52 2011 ;; MSG SIZE rcvd: 81
ちゃんと,正しいIPアドレスである67.219.12.130が返ってきていることが分かる.http://67.219.12.130/ へアクセスしても,http://dvdkodomo.com/ とは違うホームページにアクセスするのは,バーチャルホストになっているんだろう.
メモ:ErlangのVMをgdb上で動かす
Erlangのソースを取って来て解凍する.
$ wget 'http://www.erlang.org/download/otp_src_R14B01.tar.gz' $ tar xzfv otp_src_R14B01.tar.gz
コンパイルする.
$ cd otp_src_R14B01 $ ./configure $ make
デバッグ用のフラグを立ててbeamをコンパイルする.FLAVOR=plainでbeam.debug,FLAVOR=smpでbeam.debug.smpが作成される.
$ export ERL_TOP=$PWD $ cd erts/emulator $ make debug FLAVOR=plain $ make debug FLAVOR=smp
beam.debugとbeam.debug.smpが作成されているのを確認する.
$ cd ../../ $ ls bin/i686-pc-linux-gnu/ ... beam.debug beam.debug.smp ...
$ ./bin/cerl -gdb -debug
Emacsが起動したら,runと入力するとErlangのVMであるbeamが実行される.あとは普通のgdbによるデバッグと同じ.
メモ・MacPortsからDNSキャッシュサーバのUnboundを入れる
インストール
$ sudo port install unbound
設定ファイルの雛形をコピー
$ cd /opt/local/etc/unbound $ sudo cp unbound.conf-dist unbound.conf
設定ファイルを変更
$ sudo vi unbound.conf
変更箇所は以下のとおり
port: 53 interface: 127.0.0.1 access-control: 127.0.0.0/8 allow pidfile: "/opt/local/etc/unbound/unbound.pid"