スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

File::Temp 

そもそも詳しくはperldoc File::Tempだが、結構簡単便利に使える。

File::Temp
安全にテンポラリファイルのファイル名とファイルハンドルを返す。

File::Tempは安全にテンポラリファイルを作成、open()する。File::Tempのコンストラクタ及び関数tempfile()はテンポラリファイル名とopen()したファイルハンドルを返す。追加のセキュリティレベルがセキュリティ確保のために用意されている。例えばworld writableなディレクトリにsticky bitが立っていないか、等。safe_levelを参照。
テンポラリディレクトリも扱える。

コンストラクタ

$tmp = File::Temp->new(
TEMPLATE => 'tempXXXXX',
DIR => 'mydir',
SUFFIX => '.dat');


コンストラクタが引数なしで呼び出された際のデフォルトの振る舞いは、関数tempfile()がオプションなしで呼び出されたものと同じで、オブジェクトがデストラクタによって削除される際にテンポラリファイルが削除される点が異なっている。
引数に使用できるオプションはtempfile()と同じ。

UNLINK(デフォルトで真)、DIREXLOCKSUFFIX。追加でファイル名テンプレートはオプションTEMPLATEを使用することで指定できる。オプションOPENはサポートされず常にファイルはオープンされる。
引数の大文字と小文字は区別されない。失敗時にはcroak()を呼び出す。

DIRはデフォルトではカレントディレクトリ。

TEMPLATEはファイル名のテンプレート文字列で、文字列末尾の連続した文字"X"部分をランダムな文字に置き換えられてテンポラリファイル名が作成される。"X"は少なくとも4文字以上であるべき。

SUFFIXはファイル名としてTEMPLATEの後ろに付け加えられる文字列。

デストラクタ

オブジェクト指向インタフェースで生成されたオブジェクトがスコープ外に出ると自動的にデストラクタDESTROY()が実行される。オブジェクト生成時にコンストラクタがUNLINKを1にセットして呼び出されていれば、デストラクタはテンポラリファイルを(unlink1()を使用して)unlink()する。(UNLINKはデフォルトで1)
オブジェクトがfork()によって親プロセスから受け継いだものである場合には、親プロセスでオブジェクトがスコープ外に出れば削除されてしまうはず。
ただしグローバル変数$KEEP_ALLが真であれば全てのテンポラリファイルは削除されずに残される。

スポンサーサイト

perlでマルチスレッド 

perlでマルチスレッドをやってみたい。

なのでとりあえず参考資料を集めてみた。

perlthrtut和訳

どんぞこ日記
ずんWiki
結城浩さんとこ

シンプルな例:

実に馬鹿だな
Life with IT
drk7.jp
小飼弾さんとこ

古いかもなサンプル

blog.woremacx.com

理由は百MBytesを越えるログの高速解析を行いため。
最近のマシンはシングルコアでないからマルチスレッドにすれば簡単に高速化するはず。

当然高速化できるのはログの読み込み処理の部分と期待しているのだけど、

while(<FH>)
{
}

でのファイル読み込みをどうやってスレッドに分けてやればよいのか分からん。ファイルハンドルFHをスレッド間で共有してスレッドそれぞれが何も考えずに

while(<FH>)
{
}

とすればよいのだったら楽なんだけど、そんな訳なさそう。1行ごとにqueueとかで受け渡しするのは遅いに決まっているし、どこかでファイルを分割するにも分割位置まで到達したことを知る手段がないような。seek()か?

Sys::Syslog 

use Sys::Syslogするときのメモ。

use Sys::Syslog;
openlog($tag, "ndelay,pid", $facility);
syslog($priority, "%s", $msg);
closelog();

こんな感じ。

openlog()が失敗するとcroak()する。この場合の失敗とはsyslogdとconnect()できない事を指す。
syslog()は返り値を返さないので成功か失敗かの区別を行えない。(perldoc Sys::Syslogによれば)
closelog()は成功すると真を返す。失敗するとたぶん、偽を返すのだろう。

Firefoxプリフェッチ 

Firefox3.5では表示したページ内のURLのドメイン名部分を、ページ表示の時点でクリックされなくても事前に名前解決しておくというDNSプリフェッチの機能がデフォルトで有効になっています。
Firefoxのwikiなどに説明があります。

ただGoogle chromeのDNSプリフェッチと同様に、このDNSプリフェッチには今の所実装に問題があるようで、プリフェッチの実行を短時間の間に大量に実施します。これは要求を受け付けるDNSサーバ側から見ると場合によってはDoSの様に見えるような要求になるケースもあるでしょう。

解決のためにDNSプリフェッチは同時にはN件しか実行しないよう実装で制限を掛けて欲しいものです。OSのレゾルバライブラリ(nscdも合わせて)でアプリケーションからは透過的に解決できるのであればそれがよりよいのかもね。

また、(DNSではない)次のページのプリフェッチについてはMozilla Developer Centerに説明がありますね。ページのプリフェッチは<a>を対象とせず、<Link>を対象とするものだそうで、全てのページで実行されるかというとそうではないようです。(だから期待しているものとは違う)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。