Perl

カレントディレクトリに対してファイル名にある文字列を含まないファイルを削除

Perlうめえ。は、カレントディレクトリからファイルとディレクトリを全て抽出してくれる。 ワンライナーに便利です。 strを含まないファイル名をunlinkする。 for(){unlink if !/str/} 正規表現だと柔軟でいい。逆にstrを含むなら "!" をはずす。 正規表現を…

文字コードの変換

今まで文字コードを意識しなくても問題なかったんで、Encode.pmってのをあまり使ってなかったんですが、 WEBからコンテンツを拾ってきて、その文字コードを判別して、一意の文字コードに変換しないといけない場面が出てきたので、 Encode.pmとかその辺につい…

each

eachはハッシュリストからキーと値のペアを返す。 "最後まで取り出す"と、内部でもっている読み出し位置を先頭に戻す。 最初に呼び出した時に、読み出し位置がリセットされるという事ではない。

オブジェクト指向

Perlでちょっとしたデータ読み取りの実装で、ファイルでもメモリ上に展開されたデータでも使える汎用readerがほしくなったので、 オブジェクト指向を使って頑張って書いてみました。

JPEGのExifとかの余計な情報を消す。

JFIFを消すのはまずいかもしれんので、APP0だけは許容する。 以前にJPEGの仕様を見て、パーサーを作って、HTMLのテーブルをドットに使ってコピペできない画像みたいに出力した事があるので、 JPEGに関してはあまり苦労せずにできたが、バイナリ文字列を数値…

Perlの連想配列に使うハッシュ関数

http://perldoc.perl.org/5.10.0/perlguts.htmlより引用 The hash algorithm is defined in the PERL_HASH(hash, key, klen) macro: hash = 0; while (klen--) hash = (hash * 33) + *key++; hash = hash + (hash >> 5); /* after 5.6 */ The last step was …

sort

Perlの組み込み関数であるsortは安定なのか?とふと思い、perldocを引いてみる。

clone

かなり前にオセロみたいなゲームを作ろうと思ったことを思い出して、せっせと作り始める。 そんなわけでPerlでオブジェクト指向っぽくプログラミングをしていたら、 どうしてもcloneっぽい機能がほしくなった。 正しいかわからないけど、cloneっぽく機能する…

1<<31 は 1 より大きい?小さい?

perl -e "print 1 perl -M"integer" -e " print 1 前者は1を出力、後者は何も出力されない。 C言語で32bitなint型であれば、1 しかしPerlでは型が厳しく決まっていないので、数値の演算はほとんど浮動小数点演算で行われるらしい。 integerプラグマを使うこ…

Perlで離散コサイン変換

唐突にPerlのみでJpegを解析できるようなものを作ろうと思ったわけですが、挫折しそうです。 Jpegでは量子化のために離散コサイン変換(DCT)を行います。 通常の公式をそのまま使うと結構な時間がかかるので最適化を考えます。 参考文献 画像圧縮アルゴリズ…

Free to wrong pool ...

LWPを使ってGETメソッドでリクエストを送りまくるというプログラムを作りたくなり、 threadsを連続で50個程生成しようとしたら以下のようなエラー。 Free to wrong pool ... not ... at .../XSLoader.pm line -1. 大体30個強のスレッドを作ろうとしたところ…

Tie::Hashで作ったもの 比較

検証方法 それぞれの関数へハッシュのリファレンスを渡して、処理の早さを見る。 以下の仮名を与えて、それをベンチマーク時のラベルとしている。 h_def: 普通のHash h_tix: Tie::IxHash h_ths: Tie::Hash::Sample(仮)(前回作ったもの)

Tie::Hashを使って、Hashに追加順序を記憶する機能を追加する。

Tie::Hashっていうモジュールがあって、それを読み込むと、Hashの機能を拡張できる。 その機能拡張に、Hashの追加順を記憶するって事もでき、 Tie::HashのドキュメントやTie::IxHashのコードを参考に、どんなもんか作ってみた。 参考って書いてるけど、ほと…

LWPで楽してPOSTしたいけど、動的にリファラーもつけたい!

use LWP::UserAgent; my $ua = LWP::UserAgent->new(agent=>'Mozilla/5.0', timeout=>60); my $re = $ua->post( "対象URL", [name1=>'value1', name2=>'value2'], Referer => "リファラーURL");LWPは手軽で便利。

共有変数を使ったらInvalid value for shared scalar at 〜になったでござる

今日も楽しくPerlをいじっていたら、実行中に、 Invalid value for shared scalar at ... こんなエラー。

use threads; use threads::shared; ... {lock(%h) ... }

ファイルなどの一般的な共有資源に対して排他制御をするときは、flock()もしくは、 use Thread::Semaphore;をしてセマフォを生成する。 スレッド間の共有変数に対して排他制御を掛ける時はlock()。 簡単なlockを使った排他制御を試してみた。

GDを使う

GDとはオープンソースなグラフィックライブラリ。 WindowsのActivePerl上で使うための導入手順。 Linuxなら cpan install GD でよさそう。

並列処理その2

threadsに関する事。 間違ってても誰かが指摘してくれる。

並列処理

forkするよりthreadを使ったほうが便利っぽい。 なぜか。 変数の共有も簡単。排他制御もできる。 forkしてパイプで・・・とか考えなくていいのです。 今日からforkしないでthreadsすることにします。 というわけで、threadsモジュールを触る。 もちろんスー…

Perlで何かを書いてて思った。

仕事でプログラミング言語でコレ使えっていわれるなら別だけど、 慣れた・好きな言語を使うのがいいね。 Perlでforkでモジュールに頼らずに変数共有できないかな、と思って少し考えた事をやってみた。 参照を取ればいけるんじゃね? 参照を取ればその参照の…

Perlの正規表現のcオプション

Perlを使うとしばしば正規表現を使う。 僕はwhileでマッチング処理をぶん回す時、 while($x=~/(xxx)/cg){ # 〜処理〜 } みたいな使い方をするときがある。

Perlのちょっとしたメモ

くだらないメモ。

LWP::UserAgentを使った通信の時、Refererを指定してgetしたい。

refererを指定しないとはじかれるページからGETしたい時に。 やりかたは、普通にHTTP::Requestのコンストラクタ呼び出しの時に、ヘッダを指定するだけ。 LWP::UserAgent http://homepage3.nifty.com/hippo2000/perltips/LWP/UserAgent.html HTTP::Request ht…

DiCE代用品

ふと、Linuxのtopコマンドを見ると。 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2756 root 20 0 4108 416 300 R 9.7 0.0 14:35.45 diced DiCEがなぜかCPUを食べているので、変わりになるものをperlで書いてみた。

mod_perlでサーバによるシャットダウン時に後始末用の関数を呼び出すようにする。

といっても、オブジェクト指向で書いて、DESTROYを呼び出すようにするだけなんですが。server_shutdown_cleanup_registerとかなんかいろいろありますが、 外部モジュールをあまり叩きたくないので、この方法は使わないで、 自分の作ったモジュールだけでどう…

mod_perl その3

わかったことや、やったことをメモメモ。

mod_perl その2

とりあえず自作モジュールをuseで読み込めなかった原因がわかった。

mod_perl

急にmod_perlを少し勉強したいと思いました。 使い勝手とか導入のしやすさからSpeedyCGIでいいじゃんって思ってたけど、 なんかのちょっと大きいシステムでPerlを使うときは、 大抵がmod_perlが使われている(Mixi、slashdotとか)し、 SpeedyCGIと違う、良い…

めも。

substrを使って、ある一定サイズ(100byte)を超えた文字列を省略するモノを書いた。

7wiki

ちょっと豆知識的なページをつくりたいけど、 一つ一つをHTMLでページを作るのがだるく感じたため、 どうにかできんもんかなーと思ってたら、Wikiと言うものがありまして。 Wikiってのは、最低限なアプリで、誰でも参照でき、誰でも変更することができ、 記…