2006年10月アーカイブ

※追記があります。最新バージョンは1.1です。

先日作った mod_loadaverage_redirect にもう少し機能を追加して mod_loadaverage_action という名前でリリースします。名前が変ったのでディレクティブ名もLoadAverageRedirect***からLoadAverageAction***に変わっているので注意してください。

Source:
mod_loadaverage_action-1.0.tar.gz
Repository
http://svn.clouder.jp/repos/public/mod_loadaverage_action/tags/REL-1.0/

追加された機能は、今までは一つのリダイレクト先しか指定できなかった(LoadAverageActionURL)のですが今回からは LoadAverageActionRule というのを指定すると mod_rewrite の RewriteRule みたいに正規表現でリダイレクト先を動的に変更できるようにしました。

つまり、下記のように書くとサーバのload averageが1.00以上のときには、/foo/barというURLにアクセスした際に http://example.com/bar にリダイレクトをさせることができます。
ちなみにLoadAverageActionURLとLoadAverageActionRuleの両方が指定されていた場合には、LoadAverageActionRuleが優先されます。

LoadAverageAction On
LoadAverageActionThreshold 1.00
LoadAverageActionRule ^/foo/(.*)$ http://example.com/$1

これ以外にも、LoadAverageAction On としておくだけでも、SERVER_LOAD_AVERAGEという環境変数にload averageがセットされるようになっているので、それを見てrewriteでごにょごにょできるようにもしてみました(id:ikebe案)。

ただ、今はこのRuleは1つしか指定できないので、今後は複数指定できるようにできたらいいなと考えちうです。

追記(Mon Oct 30 19:17:33 2006)
はてブで弾さんがコメントしてた通り、getloadavg()を使うようにしてみた。これでBSDでも動くはず。
http://svn.clouder.jp/repos/public/mod_loadaverage_action/tags/REL-1.2/

milanoさんから始まった空前のload averageブーム!かどうかわからないけど、各所で話題になっているので自分もApacheモジュールを練習がてら作ってみました。ちなみにこのモジュールはmilanoさんがやりたそうな複雑なものにはまだ対応していません。。。

http://svn.clouder.jp/repos/public/mod_loadaverage_redirect/trunk/

LoadAverageRedirectThresholdで指定した数よりもそのマシンのload averageが高くなったら、LoadAverageRedirectURLで指定したURLにリダイレクトをするというものです。インストールは、make && make install でオッケイ。あとは、httpd.confに

LoadModule loadaverage_redirect_module libexec/mod_loadaverage_redirect.so
LoadAverageRedirect On
LoadAverageRedirectThreshold 0.1
LoadAverageRedirectURL http://www.livedoor.com/

と書いておけば、なんとなく動きます。

この例では、load average が 0.1 より大きくなったときに http://www.livedoor.com/ にリダイレクトするようになっています。
load averageを求めるコードはspiritlooseのはてなダイアリーからしっけいしました。

もうちょっといろんな昨日を付ければ結構便利になりそうな予感もする。
パス毎に設定ができたりとかすぐできそうなので、後で実装してみようかな。あとはApache2にも対応したりしたい。

#コードが汚い or おかしい部分はご指摘ください。まだ修行中の身なのでご容赦の程…。

さて、前回の予告したように、今回はImagerを使って読み込んだ画像をいろいろな方法で加工する方法をご紹介しようと思います。画像の加工といっても色々な方法があると思いますが、まずは拡大縮小、回転、切り抜き、反転、他の画像を貼り付けあたりから説明していきます。
なお、今回でてくる$imgというのは前回紹介した画像を読み込んだImagerのインスタンスだと思ってください。

今回サンプルとして加工に使う画像は下記になります。

sample-image.jpg
  • 拡大縮小
  • まずはオーソドックスな拡大縮小です。コードは以下。
    $new_img = $img->scale(scalefactor => 0.5); # 縦横を元画像の半分にする(scale01.jpg)
    $new_img = $img->scale(scalefactor => 1.5); # 縦横を元画像の2倍にする(scale02.jpg)
    $new_img = $ima->scale(xpixels => 400, ypixels => 200); # 横を400px、縦を200pxに縮小する
    こんな感じです。scale()でいろいろな引数を取ることができます。この他にもscaleX()、scaleY()メソッドなどもあります。

    scale01.jpg
    scale01.jpg
    scale02.jpg
    scale02.jpg

  • 回転
  • 次に回転です。コードは以下。
    $new_img = $img->rotate(degrees => 30); # 30度時計回りに回転(rotate01.jpg)
    $new_img = $image->rotate(radians => 3.141592/4); # 同じ回転ですが、ラジアンで指定することもできます
    $new_img = $image->rotate(degrees => 30, back => '#ffff00'); # 背景を黄色にして30度回転(rotate02.jpg)
    回転はrotate()メソッドを使うことでできます。また、backという引数を指定することで、回転したあとの新しく描画しなければならない背景の色も渡せます。

    rotate01.jpg
    rotate01.jpg
    rotate02.jpg
    rotate02.jpg

  • 切り抜き
  • 画像のある部分を切り抜けます。コードは以下。
    $new_img = $img->crop(left => 50, right => 100, top => 50, bottom => 100);
    $new_img = $img->crop(left => 50, top => 50, width => 100, height => 100);(crop01.jpg)
    画像の左上からの相対的な(x,y)座標をleftとtopという値で指定し、右下の(x,y)座標を指定したい場合にはrightとbottomを、縦横の長さで指定したい場合にはheightとwidthを指定します。

    crop01.jpg
    crop01.jpg

  • 反転
  • 鏡で反転させた感じの効果です。コードは以下。
    $new_img = $img->flip(dir => 'h'); # 左右逆転(flip01.jpg)
    $new_img = $img->flip(dir => 'vh'); #上下 & 左右逆転
    'h'はhorizontal(左右)、'v'はvertical(上下)ですね。その組み合わせをdirという値で引数として渡します。

    flip01.jpg
    flip01.jpg

  • 他の画像を貼り付け
  • ある画像の上にある画像を貼り付ける方法です。コードは以下。
    $img1->paste(left => 20, top => 20, src => $img2); # (paste01.jpg)
    今までとちょっと違いますね。今までは$img->method()のリターンで新しい画像を受けとっていましたが、今回は $img1->paste() を呼ぶとそのまま $img1 が新しい画像になります。leftとtopは元画像($img1)の左上からの(x,y)座標になります。そしてsrcが貼り付ける画像のImagerのインスタンスになります。

    paste01.jpg
    paste01.jpg


さて、いろいろな加工を紹介してみましたがどうだったでしょうか。Imagerにはこれ以外にもいろいろな加工のためのメソッドが用意してあります。色の変更や画像をぐにゃぐにゃしたり、もうちょっと細かい加工もできます。また自分で加工する処理を追加(作成)することもできるようです。

もう少し高度な加工については次回以降、徐々に紹介していくことにします。
次回は、なににしようかな。

…えーと「文字を書く」を紹介しようと思います。
今仕事で激しくImagerを使っていて、ImageMagickなどにも劣らない機能を持っているなあと感じている今日この頃なのですが、せっかく使っていて覚えたテクニックを自分の中で終らせるのはもったいないし、日本語でのドキュメントもあまりないみたいなのでまとめてみようと思いました。ということで、これから数回に渡ってImagerでできることを紹介していきたいと思います。(まぁ、podを読めという話なんですけど、Imagerはドキュメントも多いし、よく使う機能だけまとめておいてもいいかなと思い今回こういうのを始めてみました)

まず第1回目は、とりあえず画像を読み書きの方法から。

Imagerで画像を読み込むには、read()というメソッドを使用します。
my $img = Imager->new->read(file => 'foo.jpg', type => 'jpg');
このようにfileにファイル名を、typeにその画像の形式を渡すと、foo.jpgという画像ファイルをjpg形式で読み込んでImagerのインスタンスを生成することができます。この例ではカレントディレクトリにfoo.jpgというファイルがあることが前提となります。当たり前ですが絶対パスも指定することができます。typeはファイル名に拡張子がある場合には省略することもできます。

上の例はファイルを指定して画像データを読み込んでいますが、Imagerではファイルを指定して読み込む以外にも、ファイルハンドル、ファイルディスクリプタ、生データなどからもインスタンスを生成することができます。
my $img = Imager->new->read(fh => $fh, type => 'jpg');
my $img = Imager->new->read(fd => $fd, type => 'jpg');
my $img = Imager->new->read(data => $data, type => 'jpg');
余談ですが、Imagerでは生データであるdataが使えるので、例えばmemcachedに画像データを一時キャッシュしてそれを利用するなんてこともできます。変換を何度もしなければならないような要件のときに、いちいち/tmpなどに書き出さなくてもmemcachedなどに一時保存することでI/Oを減らすことができたりしますね。


次に書き込みの方について紹介します。画像の書き込みは、write()というメソッドを使います。
$img->write(file => 'bar.jpg', type => 'jpg');
これもread()メソッドと同様にfileとtypeという値を渡しています。そしてこれまたtypeはfileに拡張子があれば省略することが可能です。もちろん、file以外にも fh, fd, data に出力すること可能です。この辺の詳細については、Imager::Files をご覧ください。

さて、これで基本的な読み書きができるようになりましたが、忘れてならないのがアニメーションGIFです。アニメーションGIFの場合には何枚かの画像が1つになっているものですので、このインターフェイスでは対応できませんね(といっても実は上記の方法でも読み込みは出来てしまいますが)。ということでアニメーションGIFの読み込み方法をご紹介します。

アニメーションGIFを読み込むときには read_multi()というメソッドを使用します。具体的な使い方は下記になります。
my @imgs = Imager->read_multi(file => 'foo.gif', type => 'gif');
この例では、foo.gifというアニメーションGIFを読み込んで、それぞれのフレーム毎のインスタンスが@imgsに代入されます。 基本的にはread()をread_multi()に変えた以外は先程とほぼ同じですね。ただクラスメソッドになっているのに注意です。

そして書き込むときにはもちろん write_multi()メソッドを使います。
Imager->write_multi({ file => 'foo.gif', type => 'gif'}, @imgs);
write()メソッドとは引数がちょっと違います。またread_multi()と同様にクラスメソッドになっていますので、Imager->write_multiという風に呼出す必要があります。


とりあえずこれで読み書きができるようになりましたので、次回は読み込んだ画像を加工するところをやろうと思います。
#いつまで続くのやら…。

ずっと案件が忙しくてreaderとかを見てなかったので情報が遅れてしまった。
これからたまった2622エントリーを見る…。

そして案件でImagerを使っていて、またバグを発見したので patch を送ってみた。

out.jpg

secondlifeさんが紹介していたのを試してみた。うほ、まじリアル世界との融合っていいね。
写真を見ると現地はどうやら夜が明けてきたっぽい。

って、dRubyってなに!?と思って調べたら、こんなのらしい。XML::RPCとか、SOAPとかそういう類い?。このページの「JavaのRMIやHORBをイメージすると…」ってすごい古い感じを受けたのは俺だけだろうか…。よくわからないですけど、RMIとかHORBって現役で活躍してるものなの?

モバイルSuica対応のクレジットカードが明らかに

工エエェェ(´д`)ェェエエ工工
モバイルSuicaのために半月前にビューカード作っちゃったよ!!!
そういうのは早く言ってもらわないとこまるっちゅーに。

検索

広告

月別 アーカイブ

OpenID対応しています OpenIDについて
Powered by Movable Type 5.12