Rubyにはデータを出力するためのメソッドに

print
puts
p
pp(require 'pp'が必要)

と、たくさんあるが、'p'や'pp'は主にデバッグ用のメソッドで実際のプログラムで使用するのはあまり行儀のいいことではないとされている。

だが'p'メソッドがめちゃめちゃ便利なときがある。
配列リテラルの文字列がほしいだ。
例えばある配列'ary'があったとして

ary = %w/Perl Ruby Python PHP/

このデータを

puts ary

と、すると

Perl
Ruby
Python
PHP

てな感じで配列内の要素がそれぞれに改行を足して出力される。 これを

p ary

とすると

["Perl", "Ruby", "Python", "PHP"]

と、配列リテラルの形式で出力してくれる。
この形式は他の言語(Perl、Python、Javascript)でもおなじみの形式なので、この出力結果をevalすることでそれら言語からも配列として使うことが出来るようになる。

これが出来るとJavascriptを使った写真のスライドショーなんかを簡単に作ることが出来る。
例えばあるディレクトリの中に写真が何枚か入っていたとしてその写真すべてを一つの配列に入れて出力するには

p Dir.new('images').select{|f|f =~ /\.jpg$/i}

もしくは

p Dir.new('images').grep(/\.jpg/i)

とRubyプログラムではこの1行だけでいい('images'というフォルダに写真が入っている)。
あとはJavascript側(prototype.js使用)で

document.observe('dom:loaded', function(event) {
    new Ajax.Request('imgs.rbx', { //imgs.rbxがサーバ上のRubyプログラム
        method: 'get',
        onSuccess: function(req) {
            var imgs = req.responseText.evalJSON();
            var img = new Element('img');
            $('imgDisplay').insert(img);
            var idx = 0;
            img.src = 'images/medium/' + imgs[idx];
            $('result').innerHTML = imgs[idx];
            setTimeout(function() {
                idx++;
                img.src = 'images/medium/' + imgs[idx];
                $('result').innerHTML = imgs[idx];
                if (idx < imgs.length - 1) setTimeout(arguments.callee, 1000);
            }, 1000);
        }
    })
});

こう書けば1秒ごとに写真が切り替わるページを作ることが出来る(サンプル)。

PHPでもバージョン5.2.0からは'json_encode'という関数が使える。
同じような出力が欲しいときは

<?php
$path = 'images/';
$dir = opendir($path);
$tmp = array();
while ($f = readdir($dir)) {
    if (preg_match("/\.jpg$/i", $f)) array_push($tmp, $f);
}
echo json_encode($tmp);
?>

こんなコードでいいだろう。

Javascript側であれこれ書き足すと、写真の切り替わる秒数を変えたり、逆再生するような応用的なページも作ることが出来る。

カテゴリ:

トラックバック(0)

トラックバックURL: http://blog.beanz-net.jp/beanz_mtos/mt-tb.cgi/49

コメントする