|
GA | GW | G | A / amL | S | |
Fedora Schedule 14によると、リリースが1週間ずれて、11月2日の予定 とのこと
Fedora Schedule 14によると、リリースが1週間ずれて、11月2日の予定
とのこと 。F14はPerl 5.12になるので、ちょっと期待している。
Perlも含めFedora 14はインフラ系が多いので、インフラリリース、
という感じ。
MIME::Toolsの取説 (perldoc MIME::Tools)には テキストで図が入っていてびっくりした 。複雑だった。Windows版のスクリプトを書くときの注意
Windows版のスクリプトを書くときの注意 。
Test::Moreのlike()の正規表現判定で、 自作/他作CGIの動作テストを書いてみた
Test::Moreのlike()の正規表現判定で、
自作/他作CGIの動作テストを書いてみた 。
CGIが20本以上と多かったのと、条件に応じた動作が
いくつか決まっていたので、それぞれを一気に動作確認
できるようにしてみた。
ますます正規表現が好きになった。 Linux/FreeBSD上では、 Perlは/bin/shで書いたスクリプトはperl some.shのようにして、 そのまま実行できる 。values() というのがあったのか 。Storableが1つのファイルに保存できるシンボルは一つ 。Google, mixiなどが対応している2-legged OAuthの 練習問題でハマりつつ、PerlのOAuth::Liteがいけてることを確認した
Google, mixiなどが対応している2-legged OAuthの
練習問題でハマりつつ、PerlのOAuth::Liteがいけてることを確認した 。
Google Developers Conference参加申し込みで 出題された問題。OAuthの公開鍵を使った3-legged認証ではなく、 共有鍵を使って鍵つきダイジェスト認証をする、著者不在の 2-legged(足)な認証をする。devquizという比較的簡単な問題 なのだけれども、いままで使ったことがないので練習のつもりでやってみた。 自分でGoogle Apps premierを使っていれば、利用したかもしれないが、 そうでもないし。3-legged OAuthを見て、あーめんど、と思って 敬遠していたのもある。 自分の理解のために、手でseed作成とHMAC-SHA1ダイジェスト作成を コーディングしていたが、どうもうまくいかない。しかたなく PythonのコードやPHPのコードを探してみると、いくつかあるが 今回のGoogleのdevquizのようにPOSTで、realmをつけて、Authorization ヘッダで認証する、というコードがない。Pythonのマニュアルの 読み方を調べる直前で、PerlのOAuth::Liteがいい、というのを見て やってみると、関数に引数を与えるだけであっさり認証が完了した。
#!/usr/bin/perl
use 5.0.8;
use strict;
use warnings;
use Data::Dumper;
use OAuth::Lite;
use OAuth::Lite::Consumer;
my $consumer = OAuth::Lite::Consumer->new(
consumer_key => 'YOUR_CONSUMER_KEY',
consumer_secret => 'YOUR_CONSUMER_SECRET',
realm => 'devquiz',
);
my $response = $consumer->request(
method => 'POST',
url => 'http://gdd-2010-quiz-japan.appspot.com/oauth/YOUR_CONSUMER_KEY',
params => {
hello => 'world'
});
if ($response->is_success) {
print Dumper($response->decoded_content);
} else {
warn $response->status_line;
}
PerlのOAuth::Liteは、nonceを自動的に生成し、time()も自動的につけてくれる。 デフォルトはPOSTのAuthorization:ヘッダの、HMAC_SHA1でそろっている。 というわけで、手でコーディングしていたダイジェストの問題は以下のとおりだった。
mixiの説明は、Googleの説明資料の日本語訳になっていてわかりやすい。 が、PerlのOAuth::Liteを使えば、seedに関連する半分以上の説明は理解しなくてもよい。 IANAのipv4-address-spaceというページをXMLでパースするのに、 TreePPを使ってみた
IANAのipv4-address-spaceというページをXMLでパースするのに、
TreePPを使ってみた 。自分の非力なマシンのせいか、以下のコードを実行すると
550msかかる(Celeron M 900MHz, 512MB memory, 130MB free)。重い。
#!/usr/bin/perl
use strict;
use warnings;
use XML::TreePP;
my $treepp = XML::TreePP->new();
my $hash = $treepp->parsefile( "ipv4-address-space" );
my @i = grep {
$_->{status} eq 'UNALLOCATED' && $_->{designation} eq 'IANA'
}
@{$hash->{registry}->{record}};
print scalar(@i) . "\n";
JSONの配列をperlのJSON.pmで読み込ませてみた
JSONの配列をperlのJSON.pmで読み込ませてみた 。
配列の最後の要素にカンマ(,)があると、読み込めない。
C言語と同じだが、ほんとに不便。UTF-8の文字をHexでしか表示
できないData::Dumperも困る。
PerlのJSON.pmはutf8(1)とutf8(0)を使い分けないと文字化けするとの指摘あり。 このへんもPHPやPythonではどうなのか?という疑問あり。 "json utf8"でGoogle検索すると、トップにこの指摘ページの候補が 表示されるところに問題が。以下のように指摘されている。
JSON->new->utf8(0)->decode($string) ⇒ OK! JSON->new->utf8(1)->decode($string) ⇒ エラー! JSON->new->utf8(1)->decode($octets) ⇒ OK! 「エラー」というのは、JSONのdecode()を呼び出すと、 decode()の内部でエラーになり、Perlスクリプトが終了してしまう。 utf8 フラグがある文字列$stringをdecode()したとき、 結果として返るハッシュ内の文字列はutf8フラグがあった。 utf8フラグがない$octetsのdecode()は試していない。 Perlのコマンドライン引数にUTF-8文字を入れたいときは Perlのコマンドラインオプションに-CAを使う
Perlのコマンドライン引数にUTF-8文字を入れたいときは
Perlのコマンドラインオプションに-CAを使う 。
って、細かいというか、面倒というか。しかし、 -CAオプションなしで、$ARGV[0] = Encode::encode("utf-8", $ARGV[0]) すると、文字化けするのは何なんだ。 Perlのヘキサダンプ(16進数ダンプ, HexDump)は unpack()を使うものだと思う
Perlのヘキサダンプ(16進数ダンプ, HexDump)は
unpack()を使うものだと思う 。コマンドライン引数を
ヘキサダンプする場合に一行で書けば、こう。
% perl -e 'map { printf("%#02x ",$_) } unpack("C*", $ARGV[0]);
print "\n"' はれ
0xe3 0x81 0xaf 0xe3 0x82 0x8c
上記の例はコマンドライン環境はUTF-8の場合の実行例(Perl 5.10.0)。 "はれ"というコマンドライン引数をヘキサダンプした。 もっと長い場合は改行したりしなければならないが。 上記の例でわかるのは、素のコマンドライン引数は CUI端末のプロセス実行用の文字コードをそのままひきついでいること。 この場合はUTF-8。一方、Perlの内部の文字コードはUnicode (UCS-2) なので、変換する必要がある。 perl の Storableで保存した、perlの実行中のデータイメージの かな漢字部分の文字列はUCS-2だった
perl の Storableで保存した、perlの実行中のデータイメージの
かな漢字部分の文字列はUCS-2だった 。Data::Dumper で一括して
表示しようとすると、UCS-2のバイナリ文字列が16進数の数値で
表示されてしまって意味がわからなかった。UTF-8のコンソール上で、
echo 文字 | iconv -f UTF-8 -t UCS-2 | od -t x1cとすると、
同じヘキサ文字列が表示されるていた。結局、Storableで
作ったデータの読込み確認を以下のようにした。
use Encode;
use Storable;
my $hashRef = retrieve "index.storable";
binmode(STDOUT, ":encoding(utf-8)");
foreach my $k (keys(%{$hashRef})) {
print "$k => {\n\t"
. join(",\n\t", @{$$hashRef{$k}})
. "\n\t}\n\n";
}
けっこうめんどくさい。 Perl内部でUTF-8フラグがついた文字列データを Data::Dumperでエスケープさせない方法に、 Data::Dumperのqquote()メソッドの中身を捨てる方法があった。 Useperlという変数を1にするところがまためんどう。 YAML::Dumperがいいですよ、という指摘を受け、 Data::Dumper とYAML モジュールでデータをダンプするを見ると、 Data::Dumperではなく、YAMLを使えば一行にできることがやっとわかった。
perl -MStorable -MYAML -e 'print(Dump(retrieve "index.storable"))'
Fedora 12の場合、YAMLはRPMになっているので、 perlではライブラリのほうでもuse utf8;しないと、 かな漢字の正規表現が効かない 。Perl 5.12.0リリースとのこと 。数字にカンマを入れる、Perl正規表現での文字列置き換え
数字にカンマを入れる、Perl正規表現での文字列置き換え 。
1 while $numeric =~ s/(\d)(\d\d\d)(?!\d)/$1,$2/g; (sub, Comma, comma, perl, regex) Perlで配列の積集合(intersection)を求めるベンチマークがおもしろかったので自分でもやってみた
Perlで配列の積集合(intersection)を求めるベンチマーク
がおもしろかったので自分でもやってみた 。
List::などのクラスは遅いそうなので、除外して、
連想配列(hash)を使った方法だけに絞った。
use strict;
use warnings;
use Benchmark;
my @l1 = map { int rand 1000 } 1..1000;
my @l2 = map { int rand 1000 } 1..1000;
timethese(10000, {
q/hash-map-grep-exists/ => sub {
my (%in_l1);
map { $in_l1{$_}++ } @l1;
grep { exists $in_l1{$_} } @l2;
},
q/hash-map+keys/ => sub {
my (%union, %isect);
map { $union{$_}++ && $isect{$_}++ } @l1, @l2;
keys(%isect);
},
q/hash-foreach-keys/ => sub {
my (%union, %isect);
foreach my $e (@l1, @l2) { $union{$e}++ && $isect{$e}++ }
keys(%isect);
},
q/hash-grep/ => sub {
my %in_l1 = map { $_ => 1 } @l1; ### こういう書き方は遅い
grep { $in_l1{$_} } @l2;
},
q/hash-grep-exists/ => sub {
my %in_l1 = map { $_ => undef } @l1;
grep { exists $in_l1{$_} } @l2;
},
});
hash を利用しているので、hashの作り方の違いで速さが
変わった。hash-map-grep-exists(33 secs)と
hash-grep-exists(54 secs) の違いは、連想配列 %in_l1 への
値の代入方法にある。hashを作るときに、
また、hash の中の特定のメンバの値を取り出すよりも、 存在を確認するだけなら exists のほうがほんの少し速い。 遅いのは、hash-map-keysで、map {} の処理ブロック内で 条件分岐をしているところのもよう。 また、= 1 と = undef は速度変わらず。=1 よりも ++ のほうが速い。 というわけで、2つの配列の間で積集合を求めるのにいちばん速かったコードを 関数にするとこうなる。
sub array_intersection($$) {
my (%_u);
map { $_u{$_}++ } @{$_[0]};
grep { exists $_u{$_} } @{$_[1]};
}
一方、python で配列の積集合を求めるときは、setsというのを 使って抽象的に書ける。こういうところはPerlにはない、教育系でも 使われているpythonにメリットがある。教育系で使われるから、 卒業してもpythonを使う、ということなのだろう。 速さは調べていないが、python の配列・ 行列機能は数値計算処理にも使われているので、けっこう速い のではないか? import sets a_set = sets.Set([3, 2]) b_set = sets.Set([4, 3]) print a_set & b_set # or a_set.intersection(b_set) Effective Perl のメモは、たいへんよい 。正規表現のコメント文は //x;のように すれば、// の間に改行できて、# の後ろにコメントが書ける
正規表現のコメント文は
//x; のように
すれば、// の間に改行できて、# の後ろにコメントが書ける 。
(?# ... ) でもコメント文になる。しかし、やはり、コメント文の
中に / が入ると、文法エラーになる。
perl -e '$a="abc";$a=~/(a)(?# comment / )bc/;' use utf8のとき、split()は全角スペースも分割に使う
use utf8のとき、split()は全角スペースも分割に使う 。
#!/usr/bin/perl
use utf8;
binmode STDOUT => ":utf8"; # これがないと警告される
my $str ="全角 ス ペ ー ス が入った テキ\tス\nト";
print join(",", split(/\s/, $str), "\n");
実行結果: 全角,ス,ペ,ー,ス,が入った,テキ,ス,ト, Perlカテゴリ
1ページ >> |
Perlカテゴリ
1ページ >> [Googleガジェット]残IPv4ガジェット/RSSカテゴリのしぼり込み最新日記一覧おすすめ
セキュリティの神話日々変化を続けるウイルスと、ウイルス対策メーカ、ソフト開発会社の 事情と都合を紹介しつつ、これからあるべきウイルス対策をSaaSで 展開する"AV 2.0"(一見さんお断り方式)を提唱。
Linkers & LoadersELF/a.out/COFFなどの実行ファイルの構造の詳細、メモリとアドレスの再配置の仕組み、共有ライブラリの実現方法など。(2001年)
ハイパフォーマンスWebサイト - 高速サイトを実現する14のルールWebクライアントから見た、Webサイト高速表示のためのポイント。 14の各ルール内に、いくつかバリエーションもある。
プロフェッショナル・セキュリティ・レビューパソコン、無線LAN、電子署名などのPKI(電子証明書)の動向が よくまとまっている。(JNSA編集協力
PLANEX GW-NS300N2 802.11n無線LANカードLinux用ドライバがRalink社から配布 ( 関連記事)。 Linux上のWPA-PSKでもサーバレスで利用できて便利。
マスタリングTCP/IP RTP編「作りたくなる」本。マルチメディア制御の基礎もわかる、翻訳本とは わからないほどのこなれた日本語。
C/C++ セキュアコーディングC/C++言語で脆弱性のないコーディングのための基本テクニック。グーグル八分とは何か告発サイトがGoogleから締め出される現実と検索エンジンのありかたを問う。
無線通信とディジタル変復調技術64QAM, OFDM, CDMA などのデジタル無線変調の教科書
お魚かるた「あんこうは 大口 なんでも食べる」「ひらめの目は 左側」など、
No Place To Hide行動、職歴、財産など、あらゆる個人情報が収集され、売買される現実。 「隠れ場所なし」
Ethereal Packet Sniffingパケット解析の強力ツール Ethereal の紹介。マスタリングTCP/IP(IPv6編)IPv6 ルーティング、認証プロトコルもあり。組み込みを意識した本。
GANDHI - ガンジーインド独立の指導者、マハトマ・ガンジー怒涛の偉業をたどる。
アンナと王様[DVD]子供時代のチュラロンコン・タイ国王とイギリス人家庭教師の交流と葛藤をアジアの目から描く。
エニグマ[DVD]第二次大戦中に活躍したドイツの暗号器「エニグマ」の解読に挑む。 ハードウェアだけでもすばらしいユーザインターフェースが実現できる。リンク
対応規格広告 |
|
お便りはこちらへ (sshida@gmail.com) |
見出し一覧は RSS で
|