Archive for 3月, 2009
タブの実体を調べる
タブの実体と、TabNavigatorを調べるためにそのソースを調べていくことにします。
ソースはflexをインストールした場所で
framework/src/mx/containers/TabNavigator.as
のような感じであるので、見てみてください。
画面の構成を調べるには・・・
画面の構成を調べるのにたいていは createChildren() という関数内を調べていきます。
[AS]
if (!tabBar)
{
tabBar = new TabBar();
tabBar.name = “tabBar”;
[/AS]
のような記述があります。
この関数内は非常に短いのでわかりやすいと思います。
つまり、TabNavigatorのタブの場所だということがわかります。
TabBarは単独でも使用できるので、そちらの詳細が知りたい方は、Flexのドキュメントで調べることができると思います。
さて、タブを拡張するには、TabBarの中身を見なければわからないということで、この中身を見ていきましょう。
同様に、TabBar.as 内の createChildren() を探していくと・・・ ない。。。。。
んー、では、親クラスを見ていかなければ・・・ということで、このクラスの関係を改めて見てみると・・・
TabBar → ToggleButtonBar → ButtonBar → NavBar → Box → Container → UIComponent
さすがにUIComponent以降は、Flexではあまり関係がないので、ここまでで記述はしません。
さて、最初にcreateChildren()がある場所を探していくと・・・・
ありました!
NavBarクラスになってありました。
[AS]
override protected function createChildren():void
{
super.createChildren();
if (dataProviderChanged)
{
createNavChildren();
dataProviderChanged = false;
}
}
[/AS]
でも、結局中身は createNavChildren() だとわかりました。
このメソッドをしらべると、privateメソッドのようです。
中身を調べていくと・・・・・
ありました。何やら怪しい記述が
[AS]
navItem = Button(createNavItem(label, icon));
[/AS]
おー、タブって、結局ボタン関連か・・・ということがわかってきましたね。
でも、中身は何やら craeteNavItem というメソッドで作成しているらしい。
このcreateNavItemはTabBarの中でどうなっているか調べる必要がありそうです。
[AS]
override protected function createNavItem(
label:String,
icon:Class = null):IFlexDisplayObject
{
var navItem:IFlexDisplayObject = super.createNavItem(label, icon);
DisplayObject(navItem).addEventListener(
MouseEvent.MOUSE_DOWN, tab_mouseDownHandler);
DisplayObject(navItem).addEventListener(
MouseEvent.DOUBLE_CLICK, tab_doubleClickHandler);
return navItem;
}
[/AS]
うん。大したことをやっているわけではなさそうだな。
これを書き換えれば、タブの部分を変更できそうだという感触がついてきました。
でも肝心のButtonのインスタンスを作成しているところが見つかりません。
これは、createNavItemをまた、親クラスをたどってみつけていくしかありませんね。
で、ButtonBarに見つかりました。
[AS]
override protected function createNavItem(
label:String,
icon:Class = null):IFlexDisplayObject
{
var newButton:Button = Button(navItemFactory.newInstance());
// Set tabEnabled to false so individual buttons don’t get focus.
[/AS]
んー、どうやら、navItemFactoryというClassオブジェクトから作成しているようです。
お、これは拡張できそうですね。
TabBar に戻ってみると、
[AS]
public function TabBar()
{
super();
buttonHeightProp = “tabHeight”;
buttonStyleNameProp = “tabStyleName”;
firstButtonStyleNameProp = “firstTabStyleName”;
lastButtonStyleNameProp = “lastTabStyleName”;
buttonWidthProp = “tabWidth”;
navItemFactory = new ClassFactory(Tab);
selectedButtonTextStyleNameProp = “selectedTabTextStyleName”;
}
[/AS]
とコンストラクタで、Tabクラスを指定しているじゃないですか。
つまり、ここを書き換えれば独自のTabが作成できるということだということがわかりました。
ここまででわかった拡張するためのまとめ
1.Tabを継承し新しいクラスを定義する。
2.TabBarを継承し新しいクラスを定義する。
このクラスでは、コンストラクタで
[AS]
navItemFactory = new ClassFactory([1で作成したクラス]);
[/AS]
を定義する。
3.TabNavigatorを継承し、createChildren()ないでTabBarではなく、2で作成したクラスのオブジェクトを使用する。
ということです。
では、次回は各クラスを作成していくことにします。
ItemRenderer を同じmxml内に
そもそも、調べる時のキーワードがよくわからなかったが、 outerDocumentを使えばいいことがわかった。
詳しくは
http://livedocs.adobe.com/flex/201_jp/html/wwhelp/wwhimpl/common/html/wwhelp.htm?context=LiveDocs_Book_Parts&file=cellrenderer_072_24.html
にのっています。

munin_tomcat_threads
tomcatのスレッドを監視しておかしなスレッドがたまっていないか調べる必要がでてきた。
そこで、muninで監視するスクリプトを見つけたが、ちょっとちがったのと、個別のスレッドの状態までは確認できなかったので、自作しました。
ただ、perlがよくわからんので、そこはまねっこです。
use strict;
use Switch '__';
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://%s:%s\@127.0.0.1:%d/manager/status?XML=true";
my $PORT = exists $ENV{'ports'} ? $ENV{'ports'} : 8080;
my $USER = exists $ENV{'user'} ? $ENV{'user'} : "user";
my $PASSWORD = exists $ENV{'password'} ? $ENV{'password'} : "password";
my $TIMEOUT = exists $ENV{'timeout'} ? $ENV{'timeout'} : 30;
my $CONNECTOR = exists $ENV{'connector'} ? $ENV{'connector'} : "jk-8009";
my $url = sprintf $URL, $USER, $PASSWORD, $PORT;
if(exists $ARGV[0] and $ARGV[0] eq "autoconf") {
if($ret) {
print "no ($ret)\n";
exit 1;
}
my $au = LWP::UserAgent->new(timeout => $TIMEOUT);
my $repsonse = $au->request(HTTP::Request->new('GET',$url));
if($repsonse->is_success and $repsonse->content =~ /<status>.*< \/status>/im) {
print "yes\n";
exit 0;
} else {
print "no (no tomcat status)\n";
exit 1;
}
}
if(exists $ARGV[0] and $ARGV[0] eq "config") {
print "graph_title Tomcat current threads ($CONNECTOR) \n";
print "graph_args --base 1000 -l 0\n";
print "graph_vlabel current thread / count \n";
print "graph_category tomcat\n";
print "parse.label Parse and prepare request \n";
print "parse.max 150\n";
print "parse.min 0\n";
print "service.label Service\n";
#print "service.type DERIVE\n";
print "service.max 150\n";
print "service.min 0\n";
print "finishing.label Finishing\n";;
print "finishing.max 150\n";
print "finishing.min 0\n";
print "ready.label Ready \n";
print "ready.max 150\n";
print "ready.min 0\n";
print "keepalive.label Keepalive\n";
print "keepalive.max 150\n";
print "keepalive.min 0\n";
exit 0;
}
my $ua = LWP::UserAgent->new(timeout => $TIMEOUT);
my $response = $ua->request(HTTP::Request->new('GET',$url));
my $xml = XML::LibXML->new->parse_string($response->content);
my $pNum = 0;
my $sNum = 0;
my $fNum = 0;
my $rNum = 0;
my $kNum = 0;
my @nodeList = $xml->getElementsByTagName('connector');
foreach my $conn (@nodeList){
my $name = $conn->getAttribute('name');
if($name eq $CONNECTOR){
my @workers = $conn->getElementsByTagName('worker');
foreach my $worker (@workers){
my $stage = $worker->getAttribute("stage");
switch ($stage){
case 'P' { $pNum++; }
case 'S' { $sNum++; }
case 'F' { $fNum++; }
case 'R' { $rNum++; }
case 'K' { $kNum++; }
else { }
}
}
}
}
print "parse.value $pNum\n";
print "service.value $sNum\n";
print "finishing.value $fNum\n";
print "ready.value $rNum\n";
print "keepalive.value $kNum\n";
FlexでTabNavigator を使った時に各タブにアイコンを表示するにはどうすればいいのか、
ちょっと迷ってしまった。
結局、ソースを見たら各コンテナのiconを設定すればいいということがわかった。
[AS]
[/AS]
ってな感じです。
これって、どこかのマニュアルとかに書いてあるのかな・・・・
下の図は、アイコンのところにメールの画像をいれてみました。
各タブで別なものを指定できます。
ちなみに、バツボタンはTabNavigatorを拡張して表示できるようにしたものです。
これも整理したら記述する予定です。
メールのアイコンを表示したところ
むかーし、むかーし、SmartDocというXMLを使ってよくドキュメントを描いていたのだが、それをPDF等に簡単にできないものかと、iTextというものを使ってPDF出力するようにプログラムを作成してみたことがあった。
SmartDocは標準でPDF出力(といっても、TexからPDF出力)でき、また、きれいにできるのだが、どうしてもTexにすると、フォントやらなにやらわからないことが多すぎ、また、自分の環境ではエラーになってしまうので、直接PDFにできないものかとおもっていたのだ。
それで2003年ごろにiTextというJavaのPDF出力のライブラリの勉強も兼ねてプログラムを作ってみた。
しかし、当時借りていた500円/月レンタルサーバで契約が切れたのを忘れていて、どこかに行ってしまったのだが、パソコンの整理とともに見つかった。
しかし、バージョンがいつのだかわからない!
まあ、とりあえず現状で、パッケージ名などを変えて更新してみた。
久しぶりに、変換してみたら んー!?な内容です。
あれ、こんなレベルだっけ?
こちらからダウンロード可能です。
Canvasとやらでメニューを作っていると、思いがけずツールバーが表示されてしまう。
おかげで、表示されるサイズが変わってきてしまう。
Flexって、プロパティがありすぎてどこをどうすれば、どうなる?ってのがすぐにはわからないんだよね。
まあ、スクロールバーの表示ポリシーを変えるには
[AS]
horizontalScrollPolicy=”auto|on|off”
verticalScrollPolicy=”auto|on|off”
[/AS]
で変えられるようです。
これは、Containerを継承しているすべてで基本的には使えるはずです。
パネルのリサイズをした時に、タイトルがパネルのサイズよりも小さくなってしまうとおかしくなってしまう。
このあたりで、縮小したときに 「ああああ…」 とか出るやつはどうやっているのかなと調べたら、
[AS]
UITextField.truncateToFit ();
[/AS]
を使っていた。
パネルのタイトルバーは Panelクラスの中では
[AS]
protected var titleTextField:IUITextField;
[/AS]
と定義されているので、これを使えばいいわけですね。
まだ、実際には試していませんが。
簡単です。
flash.events.EventDispatcher
を継承すればいいだけです。
[AS]
class Foo extends EventDispatcher{
private void fireCustomEvent(){
var event:Event = new Event(“customEvent”);
dispatchEvent(event);
}
}
[/AS]
これで、fireCutomeEventをどこかで実行すればイベントが発行されます。
expectを使ってSSHのパスワードを自動的に入力する。
ただし、この方法はどこかにプレーンでパスワードを持っておく必要があるのでその点は、注意。
以下のサンプルはリモートのホームディレクトリをバックアップ
#!/usr/bin/expect -f
set timeout 20
spawn /home/hoge/exec.sh
expect "*?assword:*"
send "********\r"
expect eof
/home/hoge/exec.shの内容
#!/bin/sh
ssh -l hoge hoge.hoge.jp tar - cfz /home/hoge/ > /home/hoge/hoge.tar.gz
vi /etc/ssh/sshd_config
PermitRootLogin no
/etc/init.d/sshd reload
これでOK


