Archive for 4月, 2009
FlexでユニークなIDを生成する方法を探したが、完全なユニークなIDを生成する方法はないらしい。
mac addressとかでもとれないかなと思ったが、それも無理らしい。
一応、代替案として
UIDUtil.createUID();
で作成できます。
ドキュメントには
ActionScript の擬似乱数生成プログラムと現在の時刻に基づいて UID(一意の識別子)を生成します。
UID の形式は “XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX” で、X は 16 進数字 (0 ~ 9、A ~ F) です。
とあります。
Flex3のドキュメントはここです。
また、どうしてもmac addressなどを取りたかったら、Javaなどと連携して取ればいいようですが・・・
ちなみにJavaと連携するプログラムとしてMerapiというものがあるようです。
マイコミでも紹介されていました。
よくHTML+CSSでロールオーバーするような時に下のような画像を使って、位置を変えることでその効果を出すようにしていた。
こうすることで、画像が1枚ですみ、管理が楽になる。
ということで作ってみました。
![]() |
+ |
で、以下のようになりました。
マウスを上にすると2段目の画像が、クリックすると3段目の画像が表示されます。
ソース等のダウンロードはこちらから
左から右へドラッグ&ドロップしようとするときに、右がフォルダだったらば自動的に開きます。
下からダウンロードしてください。
ダウンロード
ソースは、TreeDragDrop.mxml のファイルひとつです。
実装はおもったよりも簡単でした。
みそは、dragOverHandler(event:DragEvent) の中で、現在どのアイテムの上にいるのかを見て、
そのアイテムで開けばいいというわけです。
今回、アイテムがXMLですので、子供の数でそこにドロップできるか決めていますが、
このitemのプロパティなんかで、フォルダかファイルかなどがわかれば、それで判断もできると思います。
private function dragOverHandler(event:DragEvent):void{
var r:int = tree.calculateDropIndex(event);
tree.selectedIndex = r;
var node:XML = tree.selectedItem as XML;
if(node.children().length() > 0){
DragManager.showFeedback(DragManager.MOVE);
tree.expandItem(node,true,true);
}
else{
DragManager.showFeedback(DragManager.NONE);
}
}
追記:
最初、TreeItemRenderを継承してMouseOverでやろうとしましたが、なんかドラッグ&ドロップの状態では、
動きがぎこちなくなってしまいました。

mx:Tree with checkbox
Tree上にチェックボックスを表示させるには・・・・
tree.itemRenderer = new IClassFactory(TreeCheckBoxRenderer);
のように、新たに作成するItemRendererを設定する。
次に、TreeCheckBoxRendererを実装。
class TreeCheckBoxRenderer extends TreeItemRenderer
のように、TreeItemRenderer を継承することがポイント!!
次に、ItemRendererのcreateChildren()メソッドでは
override protected function createChildren():void{
super.createChildren();
checkBox = new CheckBox();
checkBox.setStyle("verticalAlign","middle");
this.addChild(checkBox);
}
とする。要するにCheckBoxが追加できればいいのと、ここでは、setStyleでverticalAlignがmiddleのときしか考慮していない。
このままでは、表示する際にチェックボックスの位置がおかしい。
したがって、updateDisplayList()で位置を調整する。

CheckBoxの位置がおかしい
super.updateDisplayList(unscaledWidth,unscaledHeight);
if(super.data){
if(icon != null){
checkBox.x = icon.x;
icon.x = checkBox.x + checkBox.width + 20;
label.x = icon.x + icon.width + 5;
}
else{
checkBox.x = super.label.x;
label.x = checkBox.x + checkBox.width + 20;
}
checkBox.y = ( unscaledHeight - checkBox.height ) /2;
}
このあたりは、TreeItemRendererのメソッドを見れば参考になると思います。
HTTPのレスポンスをmuninで監視するためにプラグインをperlで作成しました。
監視できるのは、
- レスポンスの成功率:レスポンスの本文が指定した文字列が本文にあること
- 平均レスポンス秒:レスポンスの秒数
- 指定した秒数以上にレスポンスがかかっている率
のようなものが監視できます。
以下のような環境変数の設定が必ず必要です。
それ以外は、ソースをご参照ください。
| URL | カンマ区切りで設定すれば、複数のURLがチェックできます。 |
|---|---|
| USER_AGENTS | リクエストするときのUser-Agent カンマ区切りで複数していできます。 |
また、成功率、失敗率などを出しますが、分母は
(URLの数) × (User-Agent) になります。
#!/usr/bin/perl -w
use strict;
use Switch '__';
use Time::HiRes;
use Sys::Syslog;
my $ret = undef;
if(!eval "require LWP::UserAgent;") {
$ret = "LWP::UserAgent not found";
}
if(!eval "require XML::LibXML;") {
$ret .= "XML::Simple not found";
}
my $URL = exists $ENV{'URL'} ? $ENV{'URL'} : "http://localhost/check.php";
my $TIMEOUT = exists $ENV{'TIMEOUT'} ? $ENV{'TIMEOUT'} : 10;
my $WARNSEC = exists $ENV{'WARNSEC'} ? $ENV{'WARNSEC'} : 1;
my $USER_AGENTS = exists $ENV{'USER_AGENTS'} ? $ENV{'USER_AGENTS'} : "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
my $CHECK_STR = exists $ENV{'CHECK_STR'} ? $ENV{'CHECK_STR'} : "OK";
if(exists $ARGV[0] and $ARGV[0] eq "autoconf"){
print "yes\n";
exit;
}
if(exists $ARGV[0] and $ARGV[0] eq "config"){
## 設定
print "graph_title HTTP status check \n";
print "graph_scale no\n";
print "graph_vlabel time(msec) or percent\n";
print "graph_category HTTP\n";
print "success.label OK(percent)\n";
print "success.max 100\n";
print "success.min 0\n";
print "failure.label NG(percent)\n";
print "failure.max 100\n";
print "failure.min 0\n";
print "warn.label slow response(percent) ($WARNSEC sec ) \n";
print "warn.max 100\n";
print "warn.min 0\n";
print "time.label cost ( msec ) \n";
print "time.min 0\n";
exit;
}
sub checkHTTP{
(my $url,my $userAgent,my $timeout) = @_;
my $browser = LWP::UserAgent->new(timeout => $timeout);
my $res = $browser->request(HTTP::Request->new('GET',$url,[User_Agent => $userAgent]));
return $res;
}
my $success = 0;
my $failure = 0;
my $warn = 0;
my $try = 0;
my $total = 0;
my $cost = 0;
my $browser;
openlog("MUNIN_AGENT_HTTP","pid","local0");
my @AGENTS = split(',',$USER_AGENTS);
my @URLS = split(',',$URL);
foreach my $_url (@URLS){
foreach my $ua (@AGENTS){
my $st = Time::HiRes::time();
my $ok = 0;
my $cnt = 0;
$try++;
while($ok == 0){
#syslog("crit","%s","check $_url - $ua");
my $res = &checkHTTP($_url,$ua,$TIMEOUT);
if($res->is_success){
my $et = Time::HiRes::time();
$cost = $et - $st;
$total = $total + $cost;
$ok = 1;
if($res->content =~ /$CHECK_STR/i){
if($cost > 1 ){
$warn++;
}
$success++;
}
else{
syslog("crit","%s","Content check error $_url - $ua");
$failure++;
}
}
else{
# エラーコードは・・・
my $c = $res->code;
# 再度実行する
$cnt++;
sleep(2);
if($cnt > 2){
# 諦める
syslog("crit","%s","Can't connect $_url - $ua [ STATUS:$c ] ");
$ok = 1;
$failure++;
}
}
}
}
}
if($success > 1 ){
$total = $total / $success;
$total = $total * 1000;
}
$success = $success / $try * 100;
$failure = $failure / $try * 100;
print "success.value $success\n";
print "warn.value $warn\n";
print "failure.value $failure\n";
print "time.value $total\n";
closelog();


