monolog

monora log #=> ものろーぐ

Programming カテゴリのアーカイブ

mod_mruby on FreeBSD

FreeBSD Programming

mod_mrubyをFreeBSDで動かそうとして詰まるの修正点が変わってしまったのと、mod_mrubyが更新されてEvent MPMとWorker MPMでも動くようになったようなので再チャレンジしてみました。

FreeBSDでのmakeのやり方がまた変わってしまったので後述します。
とりあえずベンチマークの結果から。

$ cat test.txt
Hello!

$ cat test.rb
#!/usr/local/bin/ruby

print "Content-type: text/plainnn"
print "Hello"

$ cat test.mrb
Apache.rputs("Hello")
Apache.return(Apache::OK)

検証機のスペック: IBM ThinkCentre A55 (9636-A16)
CPU: Core2 duo E6300@1.86GHz
RAM: DDR2-SDRAM 1GB
LAN: Broadcom Gigabit Ethernet
Apache/2.2.23 (FreeBSD), mod_fcgid/2.3.6

Varnish(3.0.3)がリバースプロキシとして動いているので参考値であることをご了承ください。

abの条件は前回と同じく下記の通りで、3回計測して平均を取っています。

$ ab -n 100000 -c 100
Type req/s
Plain Text 6318.693
Ruby 1.9.3p194(mod_fcgid) 5159.423
mod_mruby 6700.153 4626.193

な……何故か、FastCGIのrubyに負けてますが、このような結果となりました。

2013/2/17 21:15追記:
mod_mrubyの作者である @matsumotory さんがこんな事を仰っていたので最新版をビルドし直して再測定しました。は、速い…

mod_mrubyはApacheのモジュールとかを書くのに面白く使えそうなので、そちらの道を模索してみたいなぁ……と

FreeBSDでmod_mrubyを使うためには、またちょこっと弄る必要があるみたいです。

$ git submodule init && git submodule update
$ cd mruby

mruby本体のビルド設定に-fPICを付ける。

$ nano tasks/toolchains/gcc.rake
4: cc.flags = [ENV['CFLAGS'] || %w(-g -O3 -Wall -Werror-implicit-function-declaration -fPIC)]

makeではなくgmakeを使う。

$ rake
$ cd ..
$ ./configure
$ gmake && gmake install

この2点だけです。エラーが読めない人間には辛い……
もう httpd.conf が mod_mruby を読み込むよう設定されているはずなので、 Apache を再起動させれば終わりです。

$ httpd -k restart

mod_mrubyをFreeBSDで動かそうとして詰まる

FreeBSD Programming

CombConfの発表が2日後に迫っているにも関わらず他の技術に手がでます。

組み込み向けのRubyであるmrubyをApacheに組み込めるようにした、mod_mrubyというものをFreeBSDで動かしてみようかと思って手を出したら大苦戦しました。

とりあえず動いたには動いたという状況ですが、簡単なメモとベンチマークを取ってみました。

2013/2/17追記
mod_mrubyの更新によって手順が変わりました⇒ mod_mruby on FreeBSD

導入はmod_mrubyのページと同じようにやればいいのかと思いきや、makeでエラーを吐いてしまいます。

$ make
make: illegal option -- -
usage: make [-BPSXeiknpqrstv] [-C directory] [-D variable]
        [-d flags] [-E variable] [-f makefile] [-I directory]
        [-j max_jobs] [-m directory] [-V variable]
        [variable=value] [target ...]
rake aborted!
Command failed with status (2): [make -C src --no-print-directory CC='gcc' ...]

Tasks: TOP => default => all
(See full trace by running task with --trace)
*** [libmruby.a] Error code 1

Stop in /root/mod_mruby.

どうもmrubyのRakefileがLinux向けのようで、makeをgmakeに書き換える必要があるようです。

$ nano tmp/mruby/Rakefile
#MAKE = ENV['MAKE'] || 'make'
MAKE = ENV['MAKE'] || 'gmake'

mrubyは1回mod_mrubyをmakeをしないとRakefileが存在しないので注意です。

あとはWarningが出ますがとりあえずスルーして、make installすればApacheにモジュールが登録されます。
あとはhttpd.confに、

AddHandler mruby-script .mrb

と書き加えれば普通にmrubyファイルが動くはずなのですが……

自分の環境(Freebsd 9.1-BETA1 amd64, Apache/2.2.23 Event MPM)な環境では、httpdを起動した直後からCPUをバカ食いする上、リクエストに全く応答しなくなるという状況に陥ってしまい、解決策が分からなくなりました。
そんなことをTwitterで呟いたら、mod_mrubyの作者である、matsumoto-rさんから

という指摘を頂きました。試しに(FreeBSD 9.0 i386, Apache/2.2.22 Prefork MPM)な旧サーバーで試したところ、何も問題がないかのように動きました。
どうもApache 2.2でEvent MPMをやるのはだめみたい……?

read more »

DigitalArts プログラミングコンテスト2012に参加しました!

Programming

タイトルの通りです。
DigitalArts Programming Contest 2012

なんとかA, B問題を解くことが出来ました。流れはこんな感じ。

http://twitter.com/kyonfuee/status/272311520388591616

長いでんがな……
C問題は解けなかったです。時間足らず。

今回は初のRubyで挑戦してみました。getsとsplitとchompでどうにかなりそう?とか思いつつ、ARCで他人のRuby解答を見よう見まねでやってました。

read more »

Kuinでエラトステネスのふるい

Programming

Kuin0.02が公開されたのでエラトステネスのふるいを使って素数を計算してみた。

Kuin0.02でコンパイル, 動作確認してます。

まだKuin用のシンタックスハイライトがない………

constに関するコンパイルエラー、Kuin0.021で修正されました。くいなちゃんに感謝です。 (2012/8/27 22:55)

{
  エラトステネスのふるい

  Author: きょんたん (@kyonline)
}

func Main()
  const N : int :: 10000000

  var isPrime : []bool :: @new [N]bool
  var Prime : []int :: @new [N]int
  var numPrime : int :: 0

  for i(0, N - 1)
    do isPrime[i] :: true
  end for

  do Prime[0] :: 2
  do numPrime :+ 1

  for i(3, N - 1, 2)
    if (!isPrime[(i - 1) / 2 - 1])
      continue i
    end if

    do isPrime[(i - 1) / 2 - 1] :: false
    do Prime[numPrime] :: i
    do numPrime :+ 1

    do Kuin@Dbg(i.ToStr())

    var j : int :: (i - 1) / 2 - 1 + i
    while (j < N)
      do isPrime[j] :: false
      do j :+ i
    end while

  end for

  do Kuin@Stop()
end func

Supercon2012に参加します!

Programming

今日になってまさかの衝撃。

公式サイトには日付しか書かれていなかったりしてメールでの発表なのかな?とか思いながら12時になるもメールなし。

なるほど落ちたのかーと思ったころ、まさかの予選通過通知。

とりあえず前の記事にも書いてあるとおり、何でバグあるはずなのに通ったのかとか色々謎は残りますが…

でも出場できるからには全力で頑張ります!

自分と先輩方2人で参加します。チーム名は後ほど…?

チーム名はhogeになりました。よろしくお願いします。(2012.7.2 2:38追記)