About dealforest

| Add my circles on Google+ :

perlをワンライナーで便利な使い方(compcを使う時に便利)

By | 2008年9月29日

どうも。久しぶりにエントリー書きます。
今回は compc を使って swc ファイルの作成を行います。
その際になんと、、、、
Class ファイルをすべてコマンドラインから指定してやらないといけないみたいなのです。

1
compc compc -output [作成されるファイル名] -source-path [sourceのある場所] --include-classes [すべてのクラスファイル]

これを実行すると swc ファイルを自分で作成することができます。

ただ何が問題かっていうと、
–include-classes にすべてのクラスファイルを指定しないといけないんです。
org.libspark.asreflect.errors.ASReflectError こんなフォーマットで。
これをファイルパスから取り出すのなんてめんどくさすぎる。
しかも / でなくて . 区切り。

というわけで、そこで perl の登場です。(※ここでは ASReflect を使用しています)
まず file だけを出力し、さらに .svn 以下のファイルを省きます。

1
find -type f | grep -v svn

この結果、出力される形式がこんな感じ

./org/libspark/asreflect/errors/ASReflectError.as
./org/libspark/asreflect/errors/NotFoundError.as
./org/libspark/asreflect/Method.as
./org/libspark/asreflect/Property.as
./org/libspark/asreflect/Parameter.as
./org/libspark/asreflect/Member.as
./org/libspark/asreflect/MetadataAware.as
./org/libspark/asreflect/Metadata.as
./org/libspark/asreflect/Type.as
./org/libspark/asreflect/ASReflect.as
./org/libspark/asreflect/TypeFactory.as
./org/libspark/asreflect/builders/BasicConstantHandler.as
./org/libspark/asreflect/builders/BasicTypeFactory.as
./org/libspark/asreflect/builders/BasicVariableHandler.as
./org/libspark/asreflect/builders/ImplementsInterfaceHandler.as
./org/libspark/asreflect/builders/ExtendsClass.as
./org/libspark/asreflect/builders/ImplementsInterface.as
./org/libspark/asreflect/builders/ParseContext.as
./org/libspark/asreflect/builders/BasicConstructorHandler.as
./org/libspark/asreflect/builders/BasicFactoryHandler.as
./org/libspark/asreflect/builders/ElementHandler.as
./org/libspark/asreflect/builders/BasicTypeHandler.as
./org/libspark/asreflect/builders/BasicAccessorHandler.as
./org/libspark/asreflect/builders/BasicParameterHandler.as
./org/libspark/asreflect/builders/BasicMethodHandler.as
./org/libspark/asreflect/builders/Arg.as
./org/libspark/asreflect/builders/BasicMetadataHandler.as
./org/libspark/asreflect/builders/ArgHandler.as
./org/libspark/asreflect/builders/XmlParser.as
./org/libspark/asreflect/builders/ExtendsClassHandler.as
./org/libspark/asreflect/impls/BasicType.as
./org/libspark/asreflect/impls/MetadataAwareSupport.as
./org/libspark/asreflect/impls/BasicMember.as
./org/libspark/asreflect/impls/BasicParameter.as
./org/libspark/asreflect/impls/BasicProperty.as
./org/libspark/asreflect/impls/BasicMetadata.as
./org/libspark/asreflect/impls/BasicMethod.as

これを整形します。
1. ./ を削除
2. .as を削除
3. / を . に変換
4. 空白区切りで連結して出力
この肯定を行えばいいわけです。

そこで登場するのが perl -p です。 perl -n でもいいです。
違いは改行あるかないか程度です。
これを使うことで

1
2
while(<>){
}

これと等価になるわけです。

つまりは、

1
2
3
4
5
6
7
8
perl -ple 'chomp; s{\./}{};s{\.as$}{}s;s{/}{.}g';
 
whild(<>) {
  chomp;
  s{\./}{};
  s{\.as$}{}s;
  s{/}{.}g';
}

ということですね。
簡単で便利です。

これでコマンドラインからの作業が軽減されました。

ちなみにこんなこともできるみたいです。

1
2
3
4
5
6
7
8
perl -ple 'push @a, $_; }{ print @a;';
 
whild(<>) {
  push @a, $_;
}
{
  print @a;
}

すげぇ~便利!!!
これで出力された値を –include-classes に指定して実行すれば
swc ファイルが生成されます。
これで毎度毎度の作業が楽になりそうです。

perl の特殊変数のメモ
$\ => printの末尾に出力される。 (perl -l だと “\n” のはず??)
$, => printを使った時のセパレータ
$” => リストコンテキスト変数展開をダブルクォートの中で行った時の区切り文字
$/ => ファイルハンドルからとってくる区切り文字

参考資料
特殊変数一覧
Perlコマンドラインオプション

actionscirptで変数のブロックスコープを実現する

By | 2008年9月17日

昔にactionscriptの変数のスコープがfunctionスコープということを知らずに凄いハマったことがあって
それ以来は気をつけてはいたんですが、どうやらブロックスコープを実現できるみたいなので試してみた。

結論から言うと、withを使う。
actionscirpt1のころからwithの存在を知ってはいたけどコード量を短くする以外に使い道もわからなく
そんなに困ることもなく存在すら忘れ去れそうになっていましたw

でも、この子は非常に優秀です。できる子でした。
perlでいうlocalみたいなことができるんです。
素晴らしすぎます。今まで知らなかったことが残念で仕方ありません。

actionscript、javascript共に試したコードをつるしときます。

ver FlashIDE

1
2
3
4
5
6
7
8
9
10
11
var hoge:Number = 8;
 
trace("default:" + hoge);               // 8
(function():void {
    var hoge:Number = 10;
    trace("function:" + hoge);               // 10
})();
 
with( {hoge:1} ) {
    trace("with:" + hoge);               // 1
}

ver flex SDK(上のFlashIDEと対してかわりはありません。)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package {
    import flash.display.Sprite;
 
    public class Hoge extends Sprite{
        public function Hoge() {
            var hoge:Number = 8;
            trace("default:" + hoge);               // 8
 
            (function():void {
                var hoge:Number = 10;
                trace("function:" + hoge);               // 10
            })();
 
            with( {hoge:1} ) {
                trace("with:" + hoge);                // 8 <- これがおかしい
            }
        }
    }
}

ver javascript

1
(function(){var hoge=10;with({hoge:4}){alert(hoge);}alert(hoge);})();   // 4が表示され、次に10が表示される

Flash IDEから使用した場合は問題なくブロックスコープが実現されています。

ただ、、、、
Flex SDKを使ってコンパイルする際には、withを使ってのブロックスコープが実現されません。
FlashPlayerのせいでもなさそうですし、おそらくはコンパイル時のSDKの実装によるものだと思います。

ちなみにSDKのバージョンはVersion 3.1.0 build 2710です。
普段はSDKをメインに開発してるので結局はfuncionを使っての方法でやるしかなさそう。。。

FlashDevelopも確かSDKのはずだからできないのかな??
windowsないんで試せる人いたら教えてほしーっす。
テンションあがったのになぁー

standaloneのflashplayerで起動しない

By | 2008年9月7日

wiiFlashの接続があるswfをstandaloneのflashplayer(debug player)で起動すると
下記みたいなエラーが表示され起動しない。

1
2
3
4
5
6
SecurityError: Error #2010: ローカルファイルシステムの SWF ファイルはソケットの使用が許可されません。
        at flash.net::Socket/connect()
        at WiiSocket/connect()
        at org.wiiflash::Wiimote/connect()
        at uranodai.display::Document()
        at uranodai.slides::Slides()

twitterにpostするとuranodaiさんが教えてくれた。
「Flash Playerのグローバルセキュリティのせいかも」と。
URLも教えてもらい試した結果、一時的にErrorはでなくなった。
正確にいうと、あるflash playerのバージョン(9.0.45.0)だとErrorがでない。ただし起動はするが実行されない。
それ以外だと上記のSecurityErrorがでる。

さっぱりわかんねー
どれか起動してくれたらいいのにな。

一応Flash IDEかAIRにすれば動いてるからいいけど、どーにかしてほしい。
ローカルのでは動かしたいな。ここも試したけど上手くいかず。
flash playerのセキュリティややこしいな。

誰か解決方法分かる人いれば教えて下さい。

StreetView使ってみた

uranodaiさんがsparkにコミットしたStreetviewを使って試してみた。

雑感だけど凄い便利にさわれた。
簡単にstreetviewをいじって遊べた。
んでwiiハンドルで操作するのは気になるのは何点かあるけど、
とりあえず形にはなった感じ。

あとは修正して問題なければ公開する予定。

ちなみに今回使用したconfigファイル。
(※)ソースは汚いのでおいおい公開します。

1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8"?>
<application xmlns="http://ns.adobe.com/air/application/1.0">
    <id>StreetViewWii</id>
    <filename>StreetViewWii</filename>
    <name>StreetViewWii</name>
    <initialWindow>
        <content>StreetViewWii.swf</content>
    </initialWindow>
</application>

公開証の作り方

1
adt -certificate -cn SelfSigned 1024-RSA [証明書名] [パスワード]

テスト

1
adl [大元のソースコード]

air用swf作成

1
amxmlc [大元のソースコード]

airファイル作成

1
adt -package -storetype pkcs12 -keystore [証明書名] [作成するairファイル名] [configファイル] [air化したいswfファイル]

これでおk。
ちなみに全てFlex SDKでターミナルから叩いてやりました。
uranodaiさんどもっす!!

viでctagsをつかってsparkする件

By | 2008年9月4日

ctagsが便利そうだったので使ってみることにする。
簡単に説明するとメソッドやクラスから簡単に定義元のソースへ jump できる感じです。

まず default のままだと ctags の language には actionscript がないので追加します。
~/.ctags をつくればいいので下記をコピペします。

--langdef=actionscript
--langmap=actionscript:.as
--regex-actionscript=/^[ \t]*[(private| public|static) ( \t)]*function[ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1/f, function, functions/
--regex-actionscript=/^[ \t]*[(public) ( \t)]*function[ \t]+(set|get) [ \t]+([A-Za-z0-9_]+)[ \t]*\(/\1 \2/p,property, propertis/
--regex-actionscript=/^[ \t]*[(private| public|static) ( \t)]*var[ \t]+([A-Za-z0-9_]+)[ \t]*/\1/v,variable, variables/
--regex-actionscript=/.*\.prototype \.([A-Za-z0-9 ]+)=([ \t]?)function( [ \t]?)*\(/\1/ f,function, functions/
--regex-actionscript=/^[ \t]*class[ \t]+([A-Za-z0-9_]+)[ \t]*/\1/c,class, classes/

あとは簡単。

!/bin/sh
 
echo 'Generating tags for spark ...'
SPARK_DIR=~/repos/svn/spark/as3
ctags -f ~/.vim/tags/actionscript/spark.tags --recurse --totals \
    --exclude=blib \
    --exclude=.svn \
    --exclude='*~' \
    --languages=actionscript \
    $SPARK_DIR/*/trunk/src $SPARK_DIR/as3/*/src

こんな shell を作ります。
ちなみに sample や変なソースも見るとめんどうなので
{project}/src, {project}/trunk/src 以下のみを読み込むようにしました。
svn upしたタイミング、もしくは1日1回とかで更新すればいいと思います。

autocmd FileType actionscript :set tags=~/.vim/tags/actionscript/spark.tags

あとは .vimrc に追記すると使えます。

感想は、まぢで便利!!!!!!!
ほんと Spark!!!!!!!!!!!!! できますw
デモ画像をのっとくんでイメージわくと幸いです。
デモ画像では Thread を使ってやってます。おかりいたします。。。

いあ〜満足!!!

test1

test1

*参考資料
http://vim-taglist.sourceforge.net/extend.html
http://archiva.jp/web/tool/vim_ctags.html