« 2007年4月 | メイン | 2007年6月 »

2007年5月 アーカイブ

2007年5月18日

debianのemacsでUTF-8を扱う

覚書。普段はMeadowを使ってるがシェル環境でもUTF-8を使いたかったので。 まずはmule-ucsが必要なので入れる。

$ sudo apt-get install mule-ucs

そして、以下を.emacsに追加。

(require 'un-define)
(set-language-environment "Japanese")
(prefer-coding-system 'utf-8-unix)
(set-keyboard-coding-system 'utf-8-unix)
(set-terminal-coding-system 'utf-8-unix)
(auto-compression-mode t)

XML::Simpleで機種依存な文字を扱う

とあるeuc-jpなXMLをXML::Simpleでパースしようとしたら、以下のようなエラーが出た。

input conversion failed due to input error, bytes 0xAD 0xD4 0xA4 0xD8

これはタイトルなどに「Д」という機種依存な文字が含まれていたのがいけないらしい。 同じ機種依存文字「⊿(\Delta)」で困っている人もいたみたい→日記やblogのタイトルに機種依存文字や長文を入れるのはやめてほしいなあという話 - HsbtDiary (2006-05-30)

XML::LibXMLではmiyagawaさんがその辺を解決しているようで、それを参考にXML::Simpleを使ってでも「euc-jpのフィールドに出現する機種依存な文字」を扱ってみる。 ってかただ以下なだけの話。

  • XMLテキスト全体をEncodeのfrom_toを用いてeuc-jpからutf-8に変換
  • 正規表現でXML宣言部のencoding="euc-jp" とあるのをencoding="utf-8" に置換
  • XML::Simpleで読み込ませる

コード。

#!/usr/bin/perl

use LWP::Simple;
use XML::Simple;

my $url = "http://hoge.hoge/kishuizon.xml"; #機種依存文字を含むeuc-jpなXML
my $content = get($url);
die "Couldn't get it!" unless defined $content;
Encode::from_to($content, 'euc-jp', 'utf-8');
$content =~ s/<¥?xml version="1¥.0" encoding="euc-jp"/<?xml version="1¥.0" encoding="utf-8"/;
my $parser = XML::Simple->new();
my $xml = $parser->XMLin($content);

#以後の処理

マシュペディアによるとPearlという言語があるらしい

MASHUPEDIA - マッシュペディアでひどい誤字を見つけた。

MASHUPEDIA

追記

pearlという言語、ほんとにあるようです(汗 Perl - Wikipediaより引用

Perl言語の正式なリリースの前に、すでに「pearl」という名前のプログラミング言語が存在することに気づき、綴りを変更して「Perl」とした。

2007年5月26日

Webから画像をとってきてリサイズする処理のベンチマーク

use Imager; - 今日のCPANモジュール[まぐまぐ!]」を読んでImagerを使いたくなったのとImage::Imlib2が気になったので、Image::MagickとGD::Imageをあわせて4つのモジュールの処理速度を比べるベンチマークをとってみた(初use Benchmark;)。 題材はあるURLにあるWeb上の画像をとってきて横幅120pxにリサイズしてファイルに書き出すというよく使うもの。 Image::MagickだとReadメソッドに直接URLを渡せて便利だけど、他のモジュールにはそんな便利な機能はないのでLWP::Simpleのgetを使ってデータをとってきて渡す。さらにImage::Imlib2では生データの渡し方がぼくには難しくてわからなかったので(ってかできるかな?)、一度ファイルに保存してから再び読み込む。コードはこんな感じ。めんどくさいのでGDのリサイズにImage::Resizeを使った。

use strict;
use warnings;
use Benchmark;
use Imager;
use Image::Magick;
use LWP::Simple;
use GD::Image;
use Image::Resize;
use Image::Imlib2;

my $url = "http://yusukebe.com/archives/files/040729/DSC08431.jpg";
my $width = 120;

Benchmark::timethese(100, {
    'Image::Magick' => \&with_ImageMagick,
    'Imager' => \&with_Imager,
    'GD::Image' => \&with_GDImage,
    'Image::Imlib2' => \&with_ImageImlib2
});

sub with_ImageMagick {
        my $img = Image::Magick->new;
        $img->Read($url);
        my($source_width,$source_height) = $img->Get('width','height');
        my $height = $width/$source_width*$source_height;
        $img->Resize( width => $width , height => $height);
        $img->Write('out.jpg');
}

sub with_Imager {
        my $data = get($url);
        my $img = Imager->new;
        $img->read( data => $data );
        $img = $img->scale( xpixels => $width );
        $img->write( file => 'out.jpg');
}

sub with_GDImage {
        my $data = get($url);
        my $gd = GD::Image->newFromJpegData($data);
        my $img = Image::Resize->new($gd);
        my $height = $width/$img->width*$img->height;
        $gd = $img->resize($width, $height);
        open( OUT, "> out.jpg");
        print OUT $gd->jpeg;
        close OUT;
}

sub with_ImageImlib2 {
        my $data = get($url);
        open( OUT, "> in.jpg");
        print OUT $data;
        close OUT;
        my $img = Image::Imlib2->load("in.jpg");
        my $height = $width/$img->width*$img->height;
        $img = $img->create_scaled_image($width,$height);
        $img->save("out.jpg");
}

で、いざベンチマーク、100回ずつまわしてみる。画像を毎回Webから読むので相手方のWebサーバーのレスポンスに結果が左右されるがだいたいこんな感じ。

GD::Image: 16 wallclock secs ( 4.09 usr +  0.16 sys =  4.25 CPU) @ 23.53/s (n=100)
Image::Imlib2: 21 wallclock secs ( 0.56 usr +  0.10 sys =  0.66 CPU) @ 151.52/s (n=100)
Image::Magick: 27 wallclock secs ( 6.02 usr +  0.63 sys =  6.65 CPU) @ 15.04/s (n=100)
Imager: 29 wallclock secs ( 7.27 usr  0.32 sys +  0.01 cusr  0.11 csys =  7.71 CPU) @ 13.18/s (n=100)

おおお、Image::Imlib2確かに超絶速い。 というわけで1位がダントツでImage::Imlib2、それ以下2位GD::Image、3位Image::Magick、4位Imagerでした。

About 2007年5月

2007年5月にブログ「Yusukebe::Tech」に投稿されたすべてのエントリーです。過去のものから新しいものへ順番に並んでいます。

前のアーカイブは2007年4月です。

次のアーカイブは2007年6月です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。


ブログSEO対策:track word seo