2006年11月アーカイブ

1つのサーバでmysqlを2台動かしてmy.cnfを分けたときに、DBIから接続する際にそのmy.cnfをdata sourceとして読み込ませる方法を初めて知った。。。(see also DBD::mysql)

my $dbh = DBI->connect('dbi:mysql:foo;mysql_read_default_file=/path/to/my.cnf', 'root', '') or die $!;

こうやるとできるみたい。もちろんmy.cnfの[client]セクションに接続したいmysqldの起動してあるポートとかを指定する必要があります。まぁ最近はサーバのコストも低くなってきているので、1台で複数のmysqlを動かすなんて機会がないっちゃないんですけどね…。

これは個人サーバでやりたかっただけです。

MTのCaptchaプラグインってあるんですね。

http://code.as-is.net/wiki/Captcha_Plugin.ja_JP
http://www.nnistar.com/archives/200611111245.php

↑ここら辺にいろいろ書いてある。試すためにAuthen::CaptchaとGDをインストールしようと思ったのですが、GDをインストールしようとおもったけど手間かかりそうでやめてしまったw。libgdをちゃんとインストールしてないからだけど…。

ImagerでAuthen::Captchaみたいのできればいいのにな。Imagerの方がインストール楽だからインストールの手間省けるしー。そういうニーズってあるんですかね。

ちなみに、このCaptchaプラグインってアクセス毎にCaptcha用のイメージを生成してるようですので、DoS攻撃を受けたらCaptcha用イメージが大量に生成されてディスク容量を圧迫するんじゃないかと思ったり思わなかったり。気になったので計算してみた。

Captcha画像1枚が5KBとして、1秒で1000アクセスあると

5KB * 1000アクセス = 5000KB

5000KBの画像が生成されます。そしてそれが1時間続くと、1時間は3600秒だから

5000KB * 3600秒 = 18000000KB ≒ 18000MB ≒ 18GB

18GBになるのかー、大変だ大変だー!






…ふぅ。ま、ちょっと気になっただけです。実際はそれだけのアタックがあったら、弱いサーバだと固まったりするんじゃないかと。それに画像ファイルは、cronで定期的に削除しろって話ですね。

ちなみにAuthen::Captchaのpodのcheck_code()のところには、下記のように書いてあります。

If the $code and $md5sum are correct, the image file and database entry will be removed.

If the $md5sum matches one in the database, and "keep_failures" is false (the default), the image file and database entry will be removed to avoid repeated attempts on the same captcha.

check_code()したときには画像は削除されるようです。


そんなことより、Imagerの連載の続きを書かなければ…orz

よくワンライナで、

% perl -pi -e 's/foo/bar/' file

とかやって、fileの中身の foo を bar に置換するけど、それをスクリプトでやりたいときはどうするんだと同僚に聞かれて実験してみた。当たり前だけど、下記のようにしたら出来た。これって正しいのだろうか。

#!/usr/local/bin/perl -pi

use strict;
s/foo/bar/;
追記:
Perlクックブックに載っていた模様。
場所は7章の「レシピ7.9 ファイルを-iスイッチを使って、その場で更新する」。

やり方は↑のやつでいいみたい。shebangにオプションでよいようです。
ちなみにあなたが漢であるならば必要ないが、「-i」オプションを「-i.orig」とするとバックアップのファイル(filename.orig)を勝手に作ってくれるので吉。


Perlクックブック〈VOLUME1〉
トム クリスチャンセン ネイザン トーキントン Tom Christiansen Nathan Torkington Shibuya Perl Mongers ドキュメントシステム
オライリージャパン
売り上げランキング: 142559
おすすめ度の平均: 5.0
5 Perlプログラマ必携本(ご存知でしょうけど)


Perlクックブック〈VOLUME2〉
トム クリスチャンセン ネイザン トーキントン Tom Christiansen Nathan Torkington Shibuya Perl Mongers ドキュメントシステム
オライリージャパン
売り上げランキング: 85814
おすすめ度の平均: 3.0
3 あまり使わない部分が集まってしまった下巻

ずっとなんかで使ってみようと思ってたのですが、時間がなくてできなかったので使ってみようと思う。
とりあえず、perldocとYappoさんのとこのを見てみた。

まずPullとPushを選ばらないといけないぽ。
検索クローラーを作ろうかなと思っているので、Pull型を選択。

→今ここ。

ちょっと間があいてしまいましたが、第3回を公開します。今回は画像に文字を書く方法をご紹介したいと思います。(決っして熱が冷めたわけではないで、いやほんとにほんとにw)

Imagerには、文字を書くためのモジュールとAPIが用意されていて使い方も簡単。それでいて、いろいろな細かい設定ができたりします。

とりあえずサンプルコードと生成された画像を見てみましょう。
※ちなみに文字を書く(フォントを扱う)にはImagerの他にfreetype1.x(freetype2.xでもok)をインストールしておく必要があります。詳しくはImager::Fontを参照のこと。

#!/usr/local/bin/perl

use strict;
use Imager;

my $string = "Let's use Imager.";
my $font = Imager::Font->new(
    file  => '/path/to/ImUgly.ttf',
    color => '#000000',
    size  => 20,
);
my $bbox = $font->bounding_box(string => $string); # 文字情報を取得
my $img = Imager->new(xsize => $bbox->total_width, ysize => $bbox->font_height);
$img->box(color => '#ffffff', filled => 1); # 背景を白くする
$img->string(
    font => $font,
    text => $string,
    x => 0,
    y => $bbox->font_height + $bbox->descent,
    aa => 1,
);
$img->write(file => 'font01.gif');

これで下記のように文字を書くことができます。
font01.gif
font01.gif

おおまかに処理を説明すると、Imager::Fontオブジェクトのインスタンスを生成($font)し、その後Imagerのインスタンスを生成、最後に$img->string() を使って文字を描画しています。どうです?簡単でしょ。

さて、この説明だけだと意味不明だと思いますので、もうちょっと詳しく説明しましょう。

まず、$fontに代入しているImager::Fontというのは、描画する文字のためのフォント情報のためのクラスで、上記のプログラムでは、描画に使うTrueTypeのフォントファイル、文字の色、そして文字のフォントサイズをしています。(フォントは、Imagerのパッケージに入っているフォントを使いました)

次に、$font->bounding_box()という関数で、生成したImager:Fontのインスタンスで描画されるであろう文字の各情報(フォントの高さや横幅などなど)を取得しています。この情報はあとで空のイメージを生成する際の縦横幅などに必要となります。

そして、そのbounding_boxの情報を元に描画しようとしている文字の縦横幅に合わせた空イメージ(Imagerクラスのインスタンス)を生成し、$img->string()関数でテキストの描画を指示しています。$img->string()では、描画のためのImager::Fontのインスタンス、描画するテキスト、描画する文字の左上の(x, y)座標、そしてaa(アンチエイリアス)処理をするかどうかのフラグを渡しています。

これだけで文字を書くことができます。この文字はフォントさえあれば日本語も簡単に描画することができます。注意する点は文字コードをflaggedなutf-8で渡してやるだけです。実際に日本語を描画したコードと画像は以下です。

#!/usr/local/bin/perl

use strict;
use Imager;
use Encode;

my $string = decode('utf-8', 'Imagerを使おう');
my $font = Imager::Font->new(
    file  => 'sazanami-mincho.ttf',
    color => '#000000',
    size  => 24,
);
my $bbox = $font->bounding_box(string => $string);
my $img = Imager->new(xsize => $bbox->total_width, ysize => $bbox->font_height);
$img->box(color => '#ffffff', filled => 1);
$img->string(
    font => $font,
    text => $string,
    x => 0,
    y => $bbox->font_height + $bbox->descent,
    aa => 1,
);
$img->write(file => 'font02.gif');
これで下記のように文字を書くことができます。
font02.gif
font02.gif

基本的にやっていることは最初のコードと同じです。違うところは、日本語の文字コードをflaggedなutf-8に変更して、日本語のフォント(今回日本語のフォントにはさざなみフォントを使わせて頂きました)を使っているだけです。

さて、Imagerでの文字も書く方法を紹介しましたが、いかがだったでしょうか。
次は、なにをやろう…。んー、んー、そうだなぁ、「イメージの各種情報を取得する方法」を書きたいと思います。

次回はできるだけ早くやりたす。

検索

広告

OpenID対応しています OpenIDについて
Powered by Movable Type 4.22-ja