というわけで遊んでみた。

秋元@サイボウズラボ・プログラマー・ブログ: codepad - ブラウザ上で言語を編集・実行
codepad.orgは、ブラウザ上のフォームから各種プログラミング言語のソースコードを打ち込んで、綺麗に色づけして表示したり、なんと実行して結果を表示させることができるというウェブサイト。

といっても現在時間貧乏につきperlのみ。

とりあえずFizzBuzz

http://codepad.org/cgV42TL9
$\="\n";print $_%15?$_%5?$_%3?$_:Fizz:Buzz:FizzBuzz for(1..100)

無限ループもしっかり検出する。Timeoutは30秒ほどか?

http://codepad.org/X0f9WMME
1 while 1;
Timeout

Perlのバージョンがちょっと古い。5.10.0とは言わないまでも、5.8.8にして欲しいところ。

http://codepad.org/QPE1eJqz
print $]
5.008

それでも、Encodeも動く。

http://codepad.org/WO6dP9Td
use Encode;
binmode STDOUT, ':utf8';
print decode('eucjp', "\xbe\xae\xbb\xf4\xc3\xc6");
小飼弾

サイトの仕組みは、こう解説されている。まあ常識的。PythonとHaskellで実装というのが今風。

about - codepad

How it works

Code execution is handled by a supervisor based on geordi. The strategy is to run everything under ptrace, with many system calls disallowed or ignored. Compilers and final executables are both executed in a chroot jail, with strict resource limits. The supervisor is written in Haskell.

具体的なディレクトリー構成はこんな風にして見る事が出来る。

http://codepad.org/n3gvmdhE
sub tree {
    my ( $dir, $depth ) = @_;
    opendir my $dh => $dir or return;
    for my $f ( sort grep !/^\.\.?/, readdir($dh) ) {
        my $path = "$dir/$f";
        my $d = -d $path ? '/' : '';
        print "  " x $depth, $f, $d, "\n";
        tree( $path, $depth + 1 ) if $d;
    }
}

tree(".");
lib/
  ld-linux.so.2
  libc.so.6
  libcrypt.so.1
  libdl.so.2
  libm.so.6
  libnsl.so.1
  libutil.so.1
lock
t.pl
usr/
  bin/
    perl
....

モジュールの実演が出来ないところが残念だが、以下のようにiframe経由でもアクセスできるので、今後コードサンプルを見せる場として結構使えそうだ。

どう書く?orgにこの仕組みを導入できないのかなあ....

Dan the Sandboxed