Perl

[ガラケー版(QRコード)]
アクセス記録[推移 / PV内訳(過去1日 / 過去1週間) / 外部アクセス元 (昨日 / 過去1週間) / ログイン論客足跡]
プロフィール私書(メール)
   /   /送済
評価(一覧   /)
投票   /共:   /
ファン登録
作品/情報/
DB構築()
ブログ
[書く]
攻略記事リンク集
My Play List
 作成日時分類記事タイトル
12013/01/01PerlImage::Magickのインストール..
22012/05/13PerlPerlのソースからのインストール手順..
32010/02/02Perl文字コード::Encode.pmが対応してない文字コ..
42009/12/03Perl正規表現::gesxオプション v.s. while..
52009/11/11Perl文字コード::jocode.pl, Jcode.pm..
=>古記事
 反応日時来客名来客者の最近のメッセージ
12017/02/25Merciこんばんは。サーバー移転後からだと思いますが、以前は見られた..
22017/02/17ねこじゃらしブログ投稿やコメントをしようとすると、たまにエラーになります..
32017/02/16Barnirunお世話になっております。https対応の影響か(またはhtm..
42016/11/10伏魔の剣こんばんわ。形式変更お疲れ様でした。 ところでこの改定につい..
52016/10/31雪霞いつもありがとうございます。ところで、ログアウトした時にポッ..
その他最近のコメント
1.
2013/01/01 Perl > Image > Magickのインストール」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]拍手:1個

VERSION=6.8.4-6;
wget http://www.imagemagick.org/download/ImageMagick-$VERSION.tar.gz;
tar xvfz ImageMagick-$VERSION.tar.gz;
cd ImageMagick-$VERSION;

# for mod_perl and apache with worker mode

make clean;;

# マルチスレッド環境で安定稼働させる為disable指定

./configure --disable-openmp --disable-opencl --enable-shared --with-perl;
make;
make install;
cd ..;

コメントする1個

2.
2012/05/13 Perl > Perlのソースからのインストール手順」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. バイナリーの用意まで
2. モジュール群の為に事前に必要なライブラリ
3. モジュールの事前用意
4. システムへの反映

1. バイナリーの用意まで

# perl
# とりあえず現行のmod_perl2.0.7とperl5.16系が相性に不具合があるので、保守期間のperl5.14系で
VER=5.14.4
wget -N http://www.perl.com/CPAN/src/perl-$VER.tar.gz
tar xvfz perl-$VER.tar.gz
cd perl-$VER
make clean;
rm -f config.sh Policy.sh
# 64bit環境
sh ./Configure -de -Accflags='-fPIC' -Dloclibpth="/usr/lib64" -Dusethreads
make test
make
make install

これしか使わないのなら
cd /usr/bin
mv perl perl.old
ln -s /usr/local/bin/perl /usr/bin/perl

yumで更新されないように
vi /etc/yum.conf
して
exclude=*perl*
を追加
2. モジュール群の為に事前に必要なライブラリ

yum -y install expat-devel
yum -y install libpng
yum -y install libpng-devel

VERSION=2.0.33;
wget http://www.boutell.com/gd/http/gd-$VERSION.tar.gz;
tar xvfz gd-$VERSION.tar.gz;
cd gd-$VERSION;
./configure;
make;
make install;
cd ..;

3. モジュールの事前用意

installで反映すると、版が上がってモジュールがなくてエラーとなってしまうので、installする前にモジュールを入れる。

perl -e shell -MCPAN

を打ってから

install YAML
force install Date::Simple
install Algorithm::Diff
install Encode::EUCJPMS
install Encode::JP::Emoji
install Encode::JP::Mobile
install Encode::JP::H2Z
install HTTP::MobileAgent
install HTTP::MobileAgent::Plugin::Charset
install XML::Parser
install XML::DOM
install LWP::UserAgent
install List::Util
install Time::HiRes

# perl本体に含まれているけど、ある程度リスク許容してでも最新版にしたければ

install CGI
install Encode

# 以下環境特有

# gdlibがある環境で

install GD::Graph

# Chasenがある環境で

install Text::ChaSen

後はサイト特有のperlモジュールをインストール
自分の場合は
/tmp/perl$VER/perl install.pl
で基本は全部入るしくみにしてある。

その他
Image::Magickのインストール
http://sakuhindb.com/pj/6_B4C9CDFDBFCDA4B5A4F3/20130101.html
4. システムへの反映

cd /tmp/perl$VER;
make install
cd ..
strip /usr/local/bin/perl

後は
/usr/local/bin/perl
に来てからではないと正常に入れられないモジュールをインストールする。

自分の場合には
・BerkeleyDB + (BDB::Wrapper)
・皆声関連

コメントする

3.
2010/02/02 Perl > 文字コード > Encode.pmが対応してない文字コード変換への対応」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

1. 機種依存文字対応モジュールEncode::EUCJPMSを使っても発生する文字化け
2. 対応方法(自分で改変)
3. その他別の道対応もあるわけだけど

1. 機種依存文字対応モジュールEncode::EUCJPMSを使っても発生する文字化け

『﨑』『鄧』『髙』といった文字は、「EUC-JPから」の他文字コードへの変換は、Encode.pmを使ってもEncode::EUCJPMSを使っても、本日現在の最新版では文字化けして壊れてしまう。
Encode::EUCJPMS(ダウンロード元)はMS WindowsのEUC-JPの機種依存文字対応用のモジュールだが、そっちでもEUC-JPからその文字の変換は上手くいかない。
2. 対応方法(自分で改変)

これはEncode::EUCJPMSを使って対応する場合には
Encode-EUCJPMS-0.07/ucm/eucJP-ms.ucm
を自分で修正してインストールする事で対応出来る。

以下差分。
行頭の「<」が追加、「>」が削除。
平たく言えば
UCS2の文字コード EUC-JPの文字コード
という並びで並んでいるが、その対応がマズい行を書き換えている。

<UFA11> \xF9\xF5 |0 # 﨑
<U9127> \xFB\xFD |0 # 鄧
<U9AD9> \xFC\xE2 |0 # 髙
<U6852> \xFA\xC9 |0 # 桒

注意: 書き換えはEUCの文字コードの方で合致させて行う。

PC版がEUC-JPで携帯版がShift_JISといったように文字コード変換をしていて、perl + Encode.pm系を使っても文字コード変換をしている方は、こういう対応をしてみると良いと思います。
Hey! Say! JUMPのメンバーの一人の髙木雄也君でこの問題にはまったので、今更ながらソースと文字コードの対応を眺めてみて対応してみました。
3. その他別の道対応もあるわけだけど

勿論文字コードの変換自体がトラブルの元、ということで、一番文字対応種が多いUTF-8で統一してしまい文字コード変換とおさらば、というのもありな選択肢だと思います。

こちらのサイトは
・携帯版でShift_JISしかサポートしていない携帯&パケット代節約の為にどうせShift_JISにするのだから、そのスーパーセットとなるUTF8は回避する
・日本語1文字に3バイト使うより2バイトにしておきたい(ネットワーク帯域とディスク容量節約&速度の為)
ので、EUC-JPをPC版では使い、携帯版はShift_JISにしていますが、世の中の多くのところはそこらへんはもう気にしないでUTF-8、というところも多くなってきています。
文字コードがUTF8のHPの比率は年々高まってきていて、今だと約50%に達しているそうです。

http://googleblog.blogspot.com/2010/01/unicode-nearing-50-of-web.html


勿論UTF8でしか文字コード表せられない言語や、他文字コードを使うメリットが有る/無しによって状況は違うので、日本語だとどうかは分かりませんが、ブログがMTとかの系譜であるところが多いことも有り多くはUTF8なので、日本でもUTF8のHPの比率はかなり高まっているでしょうね。

コメントする


管理人さん さんのコメント (2010/02/05) [編集/削除(書込み者/所有者が可能)]
herba さん、コメントどうもです。
なるほど圧縮(deflate)対応している環境の場合はネットワーク帯域の方への影響は相当分軽減される可能性がありますね。
ただ、UTF8化で圧縮前の情報量が増える事には変わりないので、ディスク使用量と、圧縮対象となる作業対象量(CPU使用量)は増える事は避けられませんが。

UTF8は国際化対応や文字対応がとても楽なのは事実なので、一番はそうしたデメリットと比較してUTF8化するメリットが相当分あると判断するかどうかかな、と思っています。
自分も英語版の方はiso-8859-1ではなくUTF8にしよう...と作業をしつつあります。
herba さんのコメント (2010/02/04) [編集/削除(書込み者/所有者が可能)]
こんばんは
私も自分の環境では必要な時以外 EUC/shift-jis は捨てて UTF8 に統一してますね。
EUC/shift jis でも UTF8 でも圧縮後の容量にはあまり大きな差は無いように思われるので(UTF8 の方が若干大きい?)、もし大方のクライアント側が HTTP Content-Encoding を利用した圧縮転送に対応していれば(どの程度対応しているのかはっきりしませんが)、ディスク容量やネットワーク帯域に限れば EUC/shift jis のメリットはさほどではないかも。

4.
2009/12/03 Perl > 正規表現 > gesxオプション v.s. while文」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]

use strict;
my $a="1234567890abcdefg0123456789";
$a=~ s{([a-z\d])}{
  my $char=$1;
  if($char=~ m!^\d$!){
    print "Number"."\n";
   }
   else{
     print "Ascii"."\n";
  }
}gesx;
g=繰り返し
e=正規表現の置換部分をプログラムとして実行
s=改行で切らずに処理
x=コメント可能に

といった正規表現の処理は
use strict;
my $a="1234567890abcdefg0123456789";
while($a=~ s!([a-z\d])!!s){
  my $char=$1;
  if($char=~ m!^\d$!){
    print "Number"."\n";
  }
  else{
    print "Ascii"."\n";
  }
}
と簡単に書き直す事が可能です。

とりわけ条件によってループの途中で抜けたい場合には、抜ける処理が使えるwhile文を使いたくなるでしょう。
geオプションを使った正規表現では、元々ループ文ではないというのがあるからでしょうが、lastで抜けることは出来ませんし、それを関数の中に入れてreturnしてもgotoで抜けてもそうした途中抜け記述をすると処理がされていないことになってしまうので。

但し、
$a=~ s{...}{...}gesx;
に比べ
while($a=~ s!...!!s){...}
は凄く処理時間が増します。
場合によっては途中でlastしてループを抜ける事で短縮出来る時間よりもより遙かに多くの時間をその処理の仕方で消費してしまうことになります。
...という罠に近頃はまりました。
正規表現の実行し直しのコストがwhile文だともろに大きく掛かってきて、またそのコストがかなり大きいということでしょう(gesxでやるとそのやり直しコストが省かれる)。

なので、可能な限りwhile文で処理するより、gesxオプションで1つの正規表現内で処理をする事を優先するという基準を、正規表現の当てはめでは持つようにした方が良いでしょう。
結果的に同じことをしていても処理コストは随分変わります。

eオプションは余り使ったことが無い方が多いかも知れませんが、単なる置換だけでなくプログラミングも内部出来るようになり、正規表現の枠を超えた処理が可能になるので、使ったことが無い方はトライされてみる事をお勧め致します。
勿論、上記のようにwhile文で代替して結果的に同じ事+αをすることが可能ですが、処理コストがwhile文より遙かに安いので、そうした処理をする時のFirst Choiceになります。

コメントする

5.
2009/11/11 Perl > 文字コード > jocode.pl, Jcode.pm, Encode.pmのパフォーマンス比較/一番速いのはどれ?」
[この書込みのみ表示(記事URL紹介用) / 編集 / 削除 / トラバ送信 / 共有分類に追加(タグ付け)]拍手:1個

1. Perlの文字コード変換モジュールのパフォーマンス比較をしてみようと思ったきっかけ
2. 比較テスト結果
3. パフォーマンス比較テスト結果からの結論
4. 各モジュールのパフォーマンス比較プログラム

1. Perlの文字コード変換モジュールのパフォーマンス比較をしてみようと思ったきっかけ

ちょっと貧弱な環境でやってみたら、Jcodeの呼び出しの処理のところでOut of memoryでプログラムが落ちてしまうということがあった。
そこで、この際Encode.pmへの乗り換えを検討したのですが、結局Out of memoryになることには変わりなかった。
しかし、ちょっとでもパフォーマンス等が改善するのならば、Encode.pmに切替えておこうと思った。

とりあえず検索してみたところ
jcode.plが最速でした
というかんじのレポートが検索結果の上の方に見つかり拝見させて頂いたのですが、その結論と理由に納得感が得られなかったので(書いている方も他の人ももっと処理がかかると思っている処理が速い/しかしその理由がない)、自分でパフォーマンス比較するプログラムを作ってみて検証してみることにしました。

結論から言うと、こちらでのベンチマーク結果だと、そっちの結論の「jcode.pl最強伝説」とは違い「Encodeモジュールが最強」となっています。

何故かなと思ってそっちのサイトのベンチマークプログラムを見てみましたが、そちらのプログラムではjcode.plの呼び出し方が変換しているつもりが実は変換していない為、実際には正常処理しないまま次から次の処理へと計測されていただけのようでした。
処理が異常に速いと書かれているjcode.plの型グロブの処理のところを
jcode::convert(*text, 'sjis');
print $text;
とprintして$textの中身を確認してみるとShift_JISに変換されていないことが分かります。
これは、型グロブでの変換には
require 'jcode.pl';
my text = "....";
jcode::convert(*text, 'sjis');
という風にmyをグロブする変数に付けてしまうと名前空間がmainとしてつき変わり、別の名前空間(jcode)にある関数に型グロブとして上手く引き渡せない為です(myを外すと変換できる / でも綺麗じゃないからそもそもそういう風には使わない方が良い)。

もしかして本当にjcode.plが最速なのか...と期待したのでちょっと残念でもありますが、一般的に想定されるであろう妥当な結論にはなりました。
jcode系列で最新版のEncodeが最速というのはソフトの進化の仕方として正しいということで、この結果はEncode.pmを使っていく上で安心出来る結果なのではないかと思います。
2. 比較テスト結果

条件
ループ回数100回
eucの入力ファイルのサイズ1.19MB
utf8の入力ファイルのサイズ1.65MB
jcode.plのバージョン2.13
Jcodeのバージョン0.83
Encodeのバージョン2.13
Encode::EUCJPMSのバージョン0.07
Encode::JP::H2Zのバージョン2.02

EUC-JP→Shift_JISの文字コード変換(携帯版への対応でよく使う変換)
jcode.pl44秒
Jcode54秒
Encode41秒

全角文字を半角文字に変換(携帯版への対応でよく使う変換)
jcode.pl56秒
Jcode42秒
Encode::JP::H2Z5秒

UTF8→EUC-JPへの変換(外部サイトのAPI対応でよく使う変換)
Jcode8秒
Encode6秒

3. パフォーマンス比較テスト結果からの結論

EUC→Shift_JISに変換する処理でEncodeはJcodeの1.31倍速、jcode.plに比べると1.07倍速
UTF8→EUC-JPに変換する処理でEncodeはJcodeの1.33倍速
全角→半角に変換する処理でEncode::JP::H2ZはJcode.pmの8.4倍速、jcode.plに比べると11.2倍速

全パターンでEncode.pmが最善のパフォーマンスなので、迷わずEncode(Encode::EUCJPMS), Encode::JP::H2Zを選んで良いようです。
とりわけ全角文字を半角文字に変換する処理のパフォーマンス向上が著しいので、そこの処理に旧来のモジュールが文字コード変換なみの時間がかかっていることを考えると、携帯用に全角文字を半角にしたり、検索の為に文字コードを全角に統一したりする時に、大きなパフォーマンス向上が得られそうです。

なお、プログラムだけで処理出来るEUC-JP→Shift_JISより対応表が必要なUTF8→EUC-JPの方が7倍近く速いというのはちょっと予想外だったので、暇があったら後でどうしてそうなっちゃっているのか理由を調べてみようかなと思いました。
4. 各モジュールのパフォーマンス比較プログラム

ご自分の環境でも試してみて下さい。
使ったことがない方には文字コード操作の実例として参考になるかもしれません。

jcode.plのダウンロードはこちらから
他は
su -
でrootになってから
perl -MCPAN -e shell
と打って、そこで
install $MODULE_NAME
でインストール出来ます。

#!/usr/bin/perl -w
=pod
Script for comparing the performance of jcode.pl, Jcode and Encode
Created by Hajime Kurita
Distributed at http://www.accessup.org/pj/6_B4C9CDFDBFCDA4B5A4F3/4/list.html

Usage:
perl bench_moji.pl $UTF8_FILE;
=cut
use strict;
use Benchmark;
use Encode::EUCJPMS; # MS拡張に対応したEUCを使えるように
use Encode::JP::H2Z;
use FileHandle;
use Jcode;
require './jcode.pl'; # jcode.plはこのスクリプトと同じディレクトリにあると想定 / このディレクトリ内でスクリプトは実行すること

my $file='/www/search/public_html/dev/j_diary.xml';
foreach my $ARGV (@ARGV){
  $file=$ARGV[0]; # utf8のファイル
}
die "Please specify file encded in utf8" unless $file;

my $max=100;
my %orig=();
if(my $fh=new FileHandle($file)){
  local $/=undef;
  $orig{'utf8'}=<$fh>;
  $fh->close();
}
else{
  die $file." doesn't exist.";
}
my $jc=new Jcode('');
my %length=();
$orig{'euc'}=$jc->set($orig{'utf8'}, 'utf8')->euc();
$length{'utf8'}=length($orig{'utf8'});
$length{'euc'}=length($orig{'euc'});

my @mod=('jcode', 'Jcode', 'Encode');
my @from_to=('euc_sjis','utf8_euc');
my @todo=('conv', 'z2h');

print "Loop\t".$max."\n";
foreach my $from_to (@from_to){
  if($from_to eq 'utf8_euc'){
    print 'utf8 input length'."\t".$length{'utf8'}."\n";
  }
  else{
    print 'euc input length'."\t".$length{'euc'}."\n";
  }
}

foreach my $from_to (@from_to){
  foreach my $todo (@todo){
    foreach my $mod (@mod){
      next if($from_to eq 'utf8_euc' && $mod eq 'jcode');
      next if($from_to eq 'utf8_euc' && $todo eq 'z2h');
      my $start=new Benchmark;
      for(my $i=0;$i<$max;$i++){
        if($mod eq 'Encode'){
          if($from_to eq 'utf8_euc'){
            my $con=$orig{'utf8'};
            if($todo eq 'conv'){
              Encode::from_to($con, 'utf8', 'eucJP-ms');
            }
          }
          else{
            my $con=$orig{'euc'};
            if($todo eq 'conv'){
              Encode::JP::H2Z::z2h(\$con);
            }
            else{
              Encode::from_to($con, 'eucJP-ms', 'cp932');
            }
          }
        }
        elsif($mod eq 'jcode'){
          my $con=$orig{'euc'};
          if($todo eq 'conv'){
            &jcode::sjis($con, 'euc');
          }
          else{
     &jcode::z2h_euc(\$con)
          }
        }
        else{
          if($from_to eq 'utf8_euc'){
            my $con=$orig{'utf8'};
            if($todo eq 'conv'){
              $jc->set(\$con, 'utf8')->euc();
            }
          }
          else{
            my $con=$orig{'euc'};
            if($todo eq 'conv'){
              $jc->set(\$con, 'euc')->sjis();
            }
            else{
              $jc->set(\$con, 'euc')->z2h();
            }
          }
        }
      }
      my $end=new Benchmark;
      $from_to='euc_euc' if($todo eq 'z2h');
      my $ver='';
      my $show_mod=$mod;
      if($mod eq 'Encode'){
        if($todo eq 'z2h'){
          $show_mod='Encode::JP::H2Z';
          $ver=qq{$Encode::JP::H2Z::VERSION};
        }
        else{
          $ver=qq{$Encode::VERSION};
        }
      }
      elsif($mod eq 'jcode'){
        if($jcode::rcsid=~ m!\s(\d+\.\d+)\s!){
          $ver=$1;
        }
      }
      else{
        $ver=qq{$Jcode::VERSION};
      }
      print join("\t", $show_mod.' '.$ver, $todo, $from_to, timestr(timediff($end, $start)))."\n";
    }
  }
}

実行結果例
Loop    100
euc input length        1193879
utf8 input length       1650264
jcode 2.13      conv    euc_sjis        44 wallclock secs (43.64 usr +  0.04 sys = 43.68 CPU)
Jcode 0.83      conv    euc_sjis        55 wallclock secs (54.92 usr +  0.00 sys = 54.92 CPU)
Encode 2.37     conv    euc_sjis        42 wallclock secs (42.18 usr +  0.00 sys = 42.18 CPU)
jcode 2.13      z2h     euc_euc 55 wallclock secs (54.85 usr +  0.03 sys = 54.88 CPU)
Jcode 0.83      z2h     euc_euc 42 wallclock secs (42.30 usr +  0.00 sys = 42.30 CPU)
Encode::JP::H2Z 2.02    z2h     euc_euc  5 wallclock secs ( 4.58 usr +  0.00 sys =  4.58 CPU)
Jcode 0.83      conv    utf8_euc         8 wallclock secs ( 8.32 usr +  0.00 sys =  8.32 CPU)
Encode 2.37     conv    utf8_euc         6 wallclock secs ( 6.06 usr +  0.00 sys =  6.06 CPU)


コメントする1個

=>古記事
RSS購読
RSS
ブログ表示スタイル
リスト/携帯(QRコード)
画像/動画/音声/リンク
表示開始年月
分類
全て
1.このサイトについて
2.作品DB開発/運用
3.ホームページ制作技術
4Perl
5.C言語 / C++
6.検索エンジン&SEO
7.サッカー
8.自分のこと
9.Linux
10.旅行
11.思ったこと
12.パソコン
13.Berkeley DB
14.その他技術系
15.企画
16.スマートフォン
17.鑑賞
18.皆声.jpニュース
19.インターネット業界
20.運用マニュアル(自分用)
21.技術系以外実用書
22.料理
23.ALEXA
24.アニメ
25.会計
26.漫画
27.設計書
28.色々サイト作成
29.サーバー
30.自分専用
31.生活
32.OP/ED/PV
33.ゲーム
34.DB整備
35.新規開始作品紹介
36.英語圏の話題
37.大道芸
38.映画
39.PHP
40.ダイエット
41.Mac
42.JavaScript
43.MySQL
44.介護
45.作品DB作品追加作業
46.BI
47.Web API
48.パフォーマンス
49.インターネットの活用方法
50.Riak
51.Androidアプリ開発
52.Cassandra
53.スパム
54.写真
55.iOSアプリ開発
56.AWS
57.マーケティング
58.Web漫画
59.法律
60.mongodb
61.開発環境整備
62.Google Apps Script
63.meteor
64.Pentaho
65.Ansible
66.VPS
67.技術書メモ
68.Vagrant
69.Docker
70.dokuwiki
71.Apple Watch
72.Webサービス
73.セキュリティ
74.Elastic Search
75.Wordpress
76.クラウド
77.英語
78.MVNO
79.シンガポール
80.マレーシア
81.管理人さん
82.管理人さん
日記の主な内容
サイト運営/開発
検索エンジン情報
・技術ネタ(Berkeley DB,
Linux, Perl, サイト作成)等

サイト管理
全まとめ
サーバー管理
定期処理状況
開発予定
削除提案
作品追加依頼
OP/ED追加依頼
OP/ED not found
作品提案承認欄

格言 fromスクライド
この世の理は即ち速さ
20年かければ馬鹿でも
傑作小説を書ける

助けられたら助け返す
それが俺のルール

強くなるには
一番弱い考えをする事だ
そしてその考えに反逆する




右側に何か入れてみるテスト


仕事でのサイト
介護DB
Helpyou
Doctor career
Nurse career
上へ ↑上へ 最速検索作品DB皆声