スマートポインタのキャスト

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が少なすぎる.

メモ:Linux Mint 12でApache Tomcat 6のメモリ使用量を増やす

/etc/default/tomcat6 にある

AVA_OPTS="-Djava.awt.headless=true -Xmx128m -XX:+UseConcMarkSweepGC"

  • Xmx128mという部分を,以下のように増やしたい分だけに書き換える

AVA_OPTS="-Djava.awt.headless=true -Xmx512m -XX:+UseConcMarkSweepGC"

Debian系では,/etc/init.d 以下にある起動スクリプトは,/etc/default 以下にある設定ファイルを読みに行くっぽい.

DNSポイゾニングによる児童ポルノ検閲を体験してみよう!

DNSのポイゾニング方式で児童ポルノサイトがブロッキングされたみたいなので,体験してみた.今回はSo-netDNSサーバを利用して体験してみようと思う.アクセスするサイトは,http://dvdkodomo.com/ となる(閲覧注意).

So-netDNSサーバは,以下となる.

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/ とは違うホームページにアクセスするのは,バーチャルホストになっているんだろう.


OCNやODNなど他のISPが提供するDNSサーバでも,やはり正しいIPアドレスは返ってこないようだ.

メモ: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
...

Emacs上でgdbを動かす.

$ ./bin/cerl -gdb -debug

Emacsが起動したら,runと入力するとErlangVMである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"
launchdに登録して起動
$ sudo port load unbound
$ sudo launchctl start org.macports.unbound


あとは,環境設定のネットワークから,DNSサーバに127.0.0.1を指定してやればOK