[トップ][一覧][最近の更新]

archives/2005/09/25

Memo/captcha

巷ではcaptchaと呼んでいるらしい(Wikipedia:Captcha, Google:captcha)。

completely automated public Turing test to tell computers and humans apartの略なんだって。 こんなところでチューリングテストの話題が。へー。

OpenBSD-cvs:ports/graphics/p5-GDとAPIが違うみたいなのでいじってみた。 このバージョンだとアルファブレンドできないっぽいな。

--- captcha.pl.orig     Sun Sep 25 09:36:47 2005
+++ captcha.pl  Sun Sep 25 09:48:12 2005
@@ -23,8 +23,9 @@
     my $im = new GD::Image($width, $height);

     # 背景色と文字色
-    my $bg = $im->colorAllocateAlpha(255, 255, 255, 127);
+    my $bg = $im->colorAllocate(255,255,255);
     my $fg = $im->colorAllocate(0, 0, 0);
+    $im->transparent($bg);

     # TrueType fontで文字を描画
     my @bounds = $im->stringFT($fg, $font, 9, 0, 0, 14, $string);
@@ -37,11 +38,11 @@

     # 出力用画像を別に作り、元画像から文字の部分のみをコピー
     my $outim = new GD::Image($owidth + 2, $oheight + 2);
-    $outim->colorAllocateAlpha(255, 255, 255, 127);
+    $outim->colorAllocate(255, 255, 255);
     $outim->copy($im, 1, 1, $srcx, $srcy,  $owidth, $oheight);

     # 画像をファイルへ出力
-    my $png_data = $outim->png(9);
+    my $png_data = $outim->png;
     open (OUT, ">$png_file") or die;
     binmode OUT;
     print OUT $png_data;

sf:jocrの腕試し。 昔MSが配っていたcour.ttf(今はsf:corefontsとして再配布中)で試してみた。

$ ls test?.png | xargs -L 1 gocr -m 124 -C ".0123456789@abcdefghijklmnopqrstuvwxyz"
t l___d i nt _ __ n_t
__tc_0n0_.dcyt . 0c_0
intec_estin0_.dsit.c0m
rle6__e_.dm0c_e .inf0
tc_0utle_.di__ .my.ti_

さすがに字が小さ過ぎてダメ。 14pointにすると、

$ ls test?.png | xargs -L 1 gocr -m 124 -C ".0123456789@abcdefghijklmnopqrstuvwxyz"
...

お、全部認識した。

しかし、絵で認証すると著しくアクセシビリティが落ちそうだ。 本家captcha版なんてもっとクネクネしてるし、 画像自体もdpi固定なので、閲覧者にページの見栄えを強制することになりそう。 最低でも音声サポートと人力ヘルプセンターは必須か。

あ、画像関連はSVGで、という手もありか。

人間が認識できて、機械に認識できないことがある、 という仮定がそもそも微妙な気がする。

参考:

Scheme/Gauche/Gauche-lazy-ffi

Category of Scheme

とりあえず自前でポインタ型を作った: files:Gauche-lazy-ffi-20050925.tar.gz

使い方はScheme/Gauche/Gauche-lazy-ffi参照。

ポインタを扱う手続きのアイデアはCLiki:UFFIから頂いてきた。

このことで、Scheme/Gauche/2005/09/21/Gauche-lazy-ffiのときの問題、

  • 破壊的代入ができない(gethostname(3)みたいなのはアウト)
  • void*が表現できない

の両方が解決。

ここまででほとんど用は足りるのだけど、少し欲が出てきたので、以下TODO。

  • ヒープをダンプする手続きを書くこと(名前はpointer-to-vectorかなあ)
  • 構造体をパックする手続きを書くこと(今でも要素をベタ書きすれば動くと思うけど面倒)