Flex勉強会 in 仙台

Adobe の MAX ティーシャツもらいました。
さっそく、Seaser勉強会に着ていってみたりしました。
宗形さんはそれに気がついてくれて「いいTシャツ着てる」と言ってくれました。
さすが。


事例紹介とかは、ほんとに使ってるんだぁ。凄いなと思いました。
野呂さんは、すごいんだなぁっと。
i creationとかなんとかの若い人たちはめちゃくちゃ固くがんばってました。
でも、かなり厳しく、いろいろ問題点を指摘してました。
でも、ちょっと眠くなってみたり。


画面が狭い場合に、Flexで気軽にZooming User Interfaceを作っておいて、
それを利用すれば、画面が広く使えるようになっていいなぁと最近、思ってました。


たとえば、左ドラッグは今までと同じウィンドウの拡大縮小。
右ドラッグはウィンドウ内のスケールの拡大縮小などができるとよいかなと思いました。
で、TitledWindowあたりをカスタマイズすればできそうだなぁって感じです。
Flashは右のマウスがつかえないから何かボタンを押しながらだったらかな???
で、それを作ったノウハウをもって、AIR化してやると、なんか、
すばらしい世界が広がるかなと思いました。


VBからFlexへのコンバータとか使うといいのかなぁとか。

Seaser勉強会 in 仙台

Seaserはぜんぜん触ってなかったのですが、すばらしいなと思いました。
あっちを直すとこっちに反映できたり、こっちを直すとあっちに反映できるとかすごいなと。
あと、プレゼンするときはうろうろ手を上げたり下げたりしながら話すといい感じだなと思いました。Slim3のソースを読んでみたいと思ったのですが、まだ公開されてないみたいなので残念です。

あとすばらしいなぁと思うところは、ほんとにユーザーのことを考えて細かいところまで
よく考えて開発効率をUpできるようにしてあるところです。

AOPっていうと、なんもかかんでもなんとかできるんじゃとか思ったのだけどもいろいろあるらしい。
DIとAOPがごっちゃだなと。DI Configuration ファイルみたいなのがあって、
dicon掘るとかいうのがセンスあるなぁとか。
やっぱ、xmlは書きたくないなぁとか思ったり。
アノテーションが謎だったのだけど、教えてもらった。


あと、外国で作ってるのかと思ったのだけど、カビーはぬラボでつくってるらしい。
カービーではないらしい。


懇談会はなんか、しみじみとしてしまった。ので帰ってきた。
イベント情報サイトを作るとか何とかって話をしてたので昔考えてたことをいろいろ話したり。
ストリートミュージシャンがいたので聞いてみる。
で、歌いたくなってカラオケ行く。
1時間800円で、平日なら下手するとフリータイムになる値段なので、
失敗したとおもいつつ、まぁ、飲み会行くより安いからいいなと思ったのでした。

なんにせよ、2日連続はきついよ、と思うのでした。
おなかいっぱい。

cs2java.pl

CyanをJavaに移植するのに定型的作業はプログラムにやらせるほうが楽なので、
とネットでコンバータ探してみたのですがなかなか見つからないので作ってみました。


正規表現で作ってるだけなので適当にしかコンバートできないですが。


使い方

csファイルのあるディレクトリに置いて、実行するだけです。
csファイルを読み込んで同名のjavaファイルを吐き出します。

cs2java.pl

use strict;

reflexiveFile('.');

sub reflexiveFile{
	my $dir = shift;
	my @list = ();

	opendir(DIR, $dir) or die("Can not open directory:$dir ($!)");
	@list = readdir(DIR);
	closedir(DIR);

	foreach my $file (sort @list){
		next if( $file =~ /^\.{1,2}$/ );

		if( -d "$dir/$file" ){
			reflexiveFile("$dir/$file");
		} else {
			if ($file =~ /\.cs$/) {
				print "$dir/$file\n";
				open(DT, "$dir/$file");
				my $data = join("",<DT>);
				$data = cs2java($data);
				close(DT);
				$file =~ s/\.cs$/.java/;
				open(DT, ">$dir/$file");
				print DT $data;
				close(DT);
			}
		}
	}
}

sub cs2java {
	my $data = shift;
	$data =~ s/class\s+(\w+)\s+:/class $1 extends/g;
	$data =~ s/\bstring\b/String/g;
	$data =~ s/\busing\b/import/g;
	$data =~ s/\btoString\b/toString/g;
	$data =~ s/\bEquals\b/equals/g;
	$data =~ s/\s*\n\s*{/ {/g;

	
	if($data =~ s/\bDictionary\b/HashMap/g){
		$data = "import java.util.HashMap;\n$data";
	}
	if($data =~ /\bStack\b/){
		$data = "import java.util.Stack;\n$data";
		$data =~ s/\b\.Pop\b/.pop/g;
		$data =~ s/\b\.Peek\b/.peek/g;
		$data =~ s/\b\.Push\b/.push/g;
	}
	$data =~ s/import System\.IO;/import java.io.*;/g;
	$data =~ s/\bis\b/instanceof/g;

	if($data =~ s/\bTextReader\b/BufferedReader/g) {
		$data = "import java.io.BufferedReader;\n$data";
		$data =~ s/\b\.Read\b/.read/g;
		$data =~ s/\b.Peek\b/.peek/g;
	}
	$data =~ s/(\[STAThread\])/\/* $1 *\//g;
	$data =~ s/static void Main/static void main/g;
	$data =~ s/bool/boolean/g;
	if ($data =~ /String.Format/) {
		$data = "import text.MessageFormat;\n$data";
		$data =~ s/String.Format/MessageFormat.format/g;
	}
	$data =~ s/\s*:\s*base([^{]+)\s*{\n(\s*)/{\n$2this$1;\n$2/g;
	 
	#String.Format => 
	if ($data =~ /\bnamespace\b/) {
	print "namespace\n";
		$data =~ s/\bnamespace\s*([^\s{]+)\s*{//g;
		my $package = $1;
		$data =~ s/^\t//mg;
		$data =~ s/}\s*$//;
		$data = "package $package;\n".$data;
	}
	$data = setterGetter($data);
	$data =~ s/foreach\s*\(([^)]+)in/for ($1:/g;

	sub ucsub {
		my $a = shift;
		$a =~ s/\b./uc$&/ge;
		$a;
	}
	sub lcsub {
		my $a = shift;
		$a =~ s/^./lc$&/ge;
		$a;
	}
	$data =~ s/([\w_\.]*?)([\w_]+)([\s\n]*\()/$1.lcsub($2).$3/ge;
	$data =~ s/(\.)([\w_]+)/$1.lcsub($2)/ge;
	$data =~ s/(new[\s\n]+[\w_\.]*?)([\w_]+)([\s\n]*\()/$1.ucsub($2).$3/ge;
	$data =~ s/(public|private|protected)([\s\n]+[\w_\.]*?)([\w_]+)([\s\n]*\()/$1.$2.ucsub($3).$4/ge;
	$data =~ s/(import)([\s\n]+[\w_\.]*?)([\w_]+)([\s\n]*;)/$1.$2.ucsub($3).$4/ge;
	$data;
}

sub setterGetter {
	my $data = shift;
if(1){
	while ($data =~ /\bset[\s\n]+{/) {
		my $prev = $`;
		my $affter = $';
		if ($prev =~ /([^{};]+)\s+(\w+)\s*{[\n\s]*$/) {
			my $data1 = $1;
			my $data2 = $2;
			
			$data =~ s/\bset\s+{/$data1 set$data2($data2 value) {/;
		} else {
			if ($prev =~ /(\bget\s*{)/g) {
				$prev = $`;
				if ($prev =~ /([^{};]+)\s+(\w+)\s*{[\n\s]*$/) {
					my $data1 = $1;
					my $data2 = $2;
#					print "data1 = [[ $data1 ]];";
#					print "data2 = [[ $data2 ]];";
					$data =~ s/\bset\s+{/$data1 set$data2($data2 value) {/;
					next;
				}
			}
			print $prev;
			exit(0);
		}
	}
}
if(1){
	while ($data =~ /\bget[\s\n]+{/) {
		my $prev = $`;
		my $affter = $';
		if ($prev =~ /([^{};]+)\s+(\w+)\s*{[\n\s]*$/) {
			my $dta = $1;
			my $data2 = $2;
			my $p2 = $`;
#		print "data1 [[ $data1 ]]\n";
#		print "data2 [[ $data2 ]]\n";
#			if($data2 =~ /FileName/) {
#				exit(0);
#			}
#			$prev =~ s/\bget\s+{/$dta get$data2() {/;
			$data = $p2 . "/* prop */{ $dta get$data2() {$affter";
		} else {
			print $prev;
		print "error get";
			exit(0);
		}
	}
}
	while($data =~ /(\/\* prop \*\/{)/) {

		my $p = $`;
		my $n = $';
		my($a,$b,$out,$data2) = removeParen($n);
		$out =~ s/^\t//mg;
		$out =~ s/^(private|public|protected)/\t$1/mg;
		$data = $p . $out . $data2;
	}

	$data =~ s/(private|public|protected)[\s\n]+(private|public|protected)/$1/g;
	$data;
}

#print "$a;;; $out;;; $data";
sub removeParen {
#print "removeParen";
	my $data = shift;
	my $out = "";
	my $lexreg = '^((([ \r\n\t]*)|(\#|\/\/)[^\r\n]*([ \r\n\t]+|$)|\/\*[.\r\n]*?\*\/)*)("(\\\\.|[^"])*"|[\(\)\[\]{}]|[^\(\)\[\]{}"'."'".'\s\r\n]+|$)';
	while ($data =~ /$lexreg/) {
#		print "[[$1$6]]\n";
		my $da = $1;
		my $dt = $6;
		$data = $';
		if($dt eq ")" || $dt eq "}" || $dt eq "]") {
			return ($da,$dt,$out,$data);
		}
		$out .= "$da$dt";
		if($dt eq "(" || $dt eq "{" || $dt eq "[") {
			my $start = $dt;
			my $end1;
			if ($start eq "(") { $end1 = ")"; }
			if ($start eq "[") { $end1 = "]"; }
			if ($start eq "{") { $end1 = "}"; }
			my ($da,$end, $out2, $data2) = removeParen($data);
			if($end1 ne $end) {
				print "paren error \n";
				exit(0);
			}
			$data = $data2;
			$out .= $out2.$da.$end;
		}
		if("$da$dt" eq "") { return("",$data); }
	}
}