July 2009 Archives

HDEラボの桜井です。
お昼に土用の丑の日してきました。

さて、HTML5対応ブラウザも出てきて、タグや機能の追加もあちらこちらでレポートされています。
しかし、ふと思ったのですが、ある時点から微妙なタグとされてきた「blink」と「marquee」はどうしてるのでしょうか?
気になったので、手元にある限りのWebブラウザで調べてみました。

ブラウザblinkmarquee
IE8xo
Chrome2xo
Firefox3.5oo
Safari4xo
Opera9oo
Lunascape5xo
Sleipnirxo
lynxxx
w3mxx

何故かmarqueeタグはすべて実装されている...。
#テキストブラウザは除く

ご存じのとおり、Perlのsplit関数は、指定したセパレーターで文字列を分割してリストにします。
使い方とサンプルは下記の通り。

■使い方
split /PATTERN/, EXPR, LIMIT
split /PATTERN/, EXPR
split /PATTERN/
split
■サンプル
$var_before = "Sato:Suzuki:Kimura";
@list = split(/:/, $var_before);

@listの内容は、下のようになっています。※Data::Dumperを使用した出力。
$VAR1 = 'Sato';
$VAR2 = 'Suzuki';
$VAR3 = 'Kimura';

そして、この逆の処理をしてくれるのが、join関数です。
$var_before = "Sato:Suzuki:Kimura";
@list = split(/:/, $var_before);
$var_after = join(":", @list);

$var_afterの内容は、下のようになって$var_beforeと同じになりました。
$VAR1 = 'Sato:Suzuki:Kimura';


でも、splitしてjoinして元に戻すのは、はたしてこの方法で良いのでしょうか?

(本調査は、HDEが非公式に、毎月20日頃に日経225採用銘柄のドメインに対し、SPFレコードが設定されているかどうかを独自調査し、主要企業の対応動向を毎月レポートするものです)
 2009年7月22日時点での日経225採用銘柄におけるSPFレコード登録の状況は、全体で40件となりました。6月時点の40件から変化は無く、設定率は17.8%となっています。

20090722_225spf.png

<主なトピックス>
・KDDIが設定IPアドレスを追加



プログラムを書く際に処理をタイムアウトさせたい場合というのはよくあると思います。
そんなときに便利なのが、alarmです。
今回は、Perlプログラムでalarmを使ってタイムアウト処理を実装したいと思います。

alarmは対象の処理が指定した時間(秒)たっても終了しない場合、SIGALRMシグナルを発生させます。
例として、ユーザからの入力を30秒でタイムアウトさせるプログラムを書いてみます。

#!/usr/bin/perl

use strict;

# タイムアウトするまでの時間(秒数)
my $TIMEOUT = 30;

print "What your name??: ";
alarm($TIMEOUT);
my $name = ;
my $timeleft = alarm(0);
print "Hello! $name";


alarmで囲った部分、ユーザからの入力待つ部分がタイムアウト処理の対象になります。
ユーザが30秒以上入力しない場合、SIGALRMシグナルが発生しプログラムが終了します。
実際に30秒放置しておくと以下のような画面になります。

[hiroki@capybara]~% ./sig_alarm.pl
What your name??: zsh: alarm      ./sig_alarm.pl
[hiroki@capybara]~%

このままでもプログラムを終了させることはできるのですが、SIGALRM発生後に後処理を行いたいということが多いと思います。
# このプログラムでは特にこのままでも問題ないのですが...
上記のプログラムを改良しタイムアウトした際にメッセージを表示するようにしたいと思います。
evalとdieを組み合わせることで後処理を実装することができます。
下記が実装例です。

#!/usr/bin/perl

use strict;

my $TIMEOUT = 30;

print "What your name??: ";
my $name = '';
eval {
local $SIG{ALRM} = sub {die};
alarm($TIMEOUT);
$name = ;
my $timeleft = alarm(0);
};

if ($@) {
# タイムアウト
print "\nERROR: TIMEOUT\n";
}else{
# 正常終了
print "Hello! $name";
}


まず、タイムアウト処理をしたい対象をevalで囲んでdieしたときでもプログラム自体を終了しないようにします。
dieなどの割り込みが発生した場合には、$@にエラーメッセージが代入されるのでそれによって処理がタイムアウトしたかを判定しています。

eval内では、SIGALRMシグナルが発生したときでもプログラムが終了しないようにSIGALRMのシグナルハンドラを設定しています。
シグナルハンドラには関数のリファレンスを渡す必要があります。
上記例では、SIGALRMが発生した際にはdieするようにしています。
シグナルハンドラはlocalをつけて指定することで、スコープ内で発生した該当のシグナルだけつかまえることができます。
localを指定していない場合、プログラム全体の該当のシグナルハンドルを指定することになります。

上記のプログラムを実際にタイムアウトさせると下記のようになります。

[hiroki@capybara]~% ./sig_alarm.pl
What your name??:
ERROR: TIMEOUT
[hiroki@capybara]~%

今度はシェルからのメッセージではなく、きちんと自分自身のプログラムからのメッセージが表示されているのがわかると思います。


最後にalarmとsleepを併用することは推奨されません。
sleepがalarmを使って実装されていることが多く、正しく動かないことがあるからです。


alarmとevalとdieを組み合わせることでタイムアウトがないような処理にもタイムアウトが実装できるようになります。

HDEラボの桜井です。
関東甲信越は梅雨明けのようです。

7/15にOpenSSL 1.0.0 Beta3が出てました。
ダウンロードはこちらから。

さっそく試してみようと思います。
最近めっきり飲料水系の記事を上げていませんでしたが、久しぶりに投稿します。
今回はオフィスの自販機に新たに加わっていたKIRIN COLAを飲んでみました。

さて、まず見た目ですが赤が目を引くデザインです。
自販機の多くは緑や青、黒といった缶が多いので意外と目立ちます。
缶には"コーラ好きのためのキリン初オリジナルコーラ"とあります。
確かに、キリンの炭酸飲料といえばキリンレモンのイメージがありますよね。
"キリン初"というところに私の期待は高まります。

さて、早速開けてみました。
香りはコカコーラより少し甘めな感じです。
ルートビアーのような強烈でインパクトのある香りではありません。

一口飲んでみました。
通常のコカコーラよりも甘めかつ炭酸も弱めです。
コーラの炭酸がちょっと強くて苦手...という方にはおススメです。

ちなみにこのKIRIN COLA、オフィスの自販機に入ったとたん大人気で、自販機はすでに売り切れでした。
暑くなるこれからの季節、最適な飲み物になりそうです。

KIRINCOLA.jpg

HDEラボの桜井です。
梅雨の時期ですねぇ。

ちょっと目を離してたら6/27にPython3.1がリリースされていました。
http://python.org/download/releases/3.1/

主な変更点は、
* ordered dictionary型の追加
* int型の最適化
* ユニットテストにテストのスキップと新しいアサーションのメソッドが追加
* IOモジュールの高速化
* TkinterがTileをサポート(Javaのルックアンドフィールみたいなもの?)
* importlibパッケージの追加
* ネストされたwithステートメントの新しい文法

使ってみようかな?

About this Archive

This page is an archive of entries from July 2009 listed from newest to oldest.

June 2009 is the previous archive.

August 2009 is the next archive.

Find recent content on the main index or look in the archives to find all content.