株式会社はてなでは日々、開発者が持ち回りでひとつの技術トピックについて発表を行っており、公開可能なものについては、その内容を音声と動画で公開しています。
3月22日に行われました技術発表会の内容を撮影した動画ファイル/資料を公開いたしました。内容は以下のとおりです。
| テーマ | ActionScript3 / Flex / Apollo 勉強会 |
|---|---|
| 発表者 | d:id:secondlife |
やっぱこれからは Flash Da Yo Ne!(flash厨期)
flash 作ったりするやつだよね、というのはなんとなく解るけど、具体的にどんなことができるのか解らない LLer かつ Web アプリケーションエンジニアのための勉強会
Adobe が Mozilla Foundation に AVM2 のソースコードを提供
わりと興味なくてスルー
というわけで初めて約一ヶ月、解ったことを整理するというのもかねて勉強会
使い方を知ってないとアイディアが浮かばない(自分は…)。
でもべつに AS2 でできるよね。
AS2 と AS3 は割と違うので、いまから AS2 というのは…。
SSE (Streaming SIMD Extensions : ストリーミング SIMD 拡張) を提供するプロセッサで実行するときに処理が高速化されるフィルタ仕様もあります。畳み込み操作が高速される基準は次のとおりです。
でもこれらはわりと AS2 でもがんばればどうにかなるじゃん?
AS2 だとどうがんばっても(たぶん)できないこと
ActionScript3 = Flex2 みたいに、ごちゃ混ぜにしてるのを見る
Flex2 SDK を使うと ActionScript3 を swf にコンパイルできる!
じゃあ Flex2 って?
AdobeR Flex 2は、Adobe FlashRをベースにしたリッチインターネットアプリケーションのためのフレームワークです。Flex 2を利用すれば、あらゆるプラットフォームのユーザに対応できる、見ばえの良いスケーラブルなアプリケーションが効率良く開発できます。
http://www.adobe.com/jp/products/flex/
自分たちに嬉しいのは
コンポーネントのレイアウトは基本 mxml という xml に書くよ。css も書けるよ。
ActionScript3 を始めたいけどどうすればいいの?
本気でやるなら
を最後まで続けると AS3 の基本はだいたい覚えられる。オススメ。下手にオフィシャル以外のドキュメントを読むと混乱しがちだよ。
ここまでの実際の習得コストは 40時間ぐらい?
Eclipce や統合開発環境スキー使ってください。裏側で自動コンパイルがうらやましかった(過去形)。
$ mxmlc Example.as
大きな問題点
コンパイル時にメモリ展開しておくことで、二回目からのコンパイルをちょっぱやに。便利!
swf ができあがるまでに手動ですること
めんどい!
fcsh wrapper の fcwrap を使うと
インストール方法
svn co svn://rubyforge.org/var/svn/hotchpotch/fcwrap fcwrap cd fcwrap rake install_gem
Linux/OSX なら動くよ。win はこの方法だとうまく入らないらしい。
より詳しく(?)は Shibuya.es で。
log.as を使うと、Object#inspect みたいにでき、かつ console.log に出力できて便利!
http://subtech.g.hatena.ne.jp/secondlife/20070219/1171872801
連携方法いろいろ
普通の方法
コネクションつなぎっぱであれこれ。
comet っぽいことも簡単に。
Action Message Format
Rails での実装もあるよ。
これで ruby 側のインスタンスのメソッドが簡単に呼び出せる!ベンリング!!!
例: 絵を描いてサーバサイドに保存
Paint.mxml
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%" initialize="init()" backgroundColor="#ffffff">
<mx:Script source="main.as" />
<mx:VBox width="60%" horizontalAlign="center">
<mx:Panel id="mainPanel" title="Paint" styleName="mainPanel" width="100%">
<mx:Box width="100%" horizontalAlign="center" paddingTop="15">
<mx:UIComponent width="300" height="300" id="canvas"/>
</mx:Box>
<mx:Form width="100%">
<mx:Box width="100%" horizontalAlign="center">
<mx:HBox>
<mx:Label text="Pen Size"/>
<mx:HSlider minimum="0" maximum="100" id="lineWidth" width="100" value="5" />
</mx:HBox>
<mx:HBox>
<mx:Label text="Alpha"/>
<mx:HSlider minimum="0" maximum="1" id="lineAlpha" width="100" value="1" />
</mx:HBox>
<mx:HBox>
<mx:ColorPicker id="lineColor" />
</mx:HBox>
<mx:HBox>
<mx:Button id="save" click="saveImage();" label="save" />
</mx:HBox>
</mx:Box>
</mx:Form>
</mx:Panel>
</mx:VBox>
</mx:Application>
import flash.events.*;
import flash.net.navigateToURL;
import flash.net.URLRequest;
import mx.rpc.remoting.RemoteObject;
import mx.rpc.events.ResultEvent;
import com.adobe.images.PNGEncoder;
private var _click:Boolean = false;
private function init():void {
canvas.parent.addEventListener(MouseEvent.MOUSE_MOVE, moveHandler);
canvas.parent.addEventListener(MouseEvent.MOUSE_DOWN, downHandler);
canvas.parent.addEventListener(MouseEvent.MOUSE_UP, upHandler);
}
private function moveHandler(e:MouseEvent):void {
if(_click) {
var p:Point = new Point(e.stageX, e.stageY);
p = canvas.globalToLocal(p);
canvas.graphics.lineTo(p.x, p.y);
}
}
private function downHandler(e:MouseEvent):void {
_click = true;
canvas.graphics.lineStyle(lineWidth.value, lineColor.selectedColor, lineAlpha.value, true);
var p:Point = new Point(e.stageX, e.stageY);
p = canvas.globalToLocal(p);
canvas.graphics.moveTo(p.x, p.y);
}
private function upHandler(e:MouseEvent):void {
_click = false;
}
private function saveImage():void {
var b:BitmapData = new BitmapData(canvas.width, canvas.height);
b.draw(IBitmapDrawable(canvas));
var png:ByteArray = PNGEncoder.encode(b);
// リモートオブジェクトの呼び出し処理
var remoteObject:RemoteObject = new RemoteObject();
remoteObject.destination = 'ImageSaveService';
remoteObject.addEventListener(ResultEvent.RESULT, openImage);
remoteObject.savePng(png);
}
private function openImage(e:ResultEvent):void {
var req:URLRequest = new URLRequest(String(e.result));
navigateToURL(req, '_blank');
}
require 'digest/sha1' class ImageSaveService def savePng(png) image = png.pack('c*') name = Digest::SHA1.hexdigest(image) + '.png' open(RAILS_ROOT + '/public/images/' + name, 'w') {|f| f.puts image } '/images/' + name end end
関係ないけど
AVM2 が速いので Flash で 3D ぽい表現するライブラリもすごいよ
つかいやすい!
http://labs.adobe.com/technologies/apollo/
http://rails2u.com/misc/swf/HatenaLogo3d.air
超簡単に移植!
http://unknownplace.org/memo/2007/03/19#e001
Apollo SDK 展開して Flex2 SDK に上書きで OK
Shell.shell.addEventListener(InvokeEvent.INVOKE, onInvoke);
を追加
NativeWindow (< DisplayObjectContainer) の子クラスを作成
.air ファイルの実体は ZIP ファイル。これを win/mac のアプリがおのおののプラットフォームの exe へとコンパイルする。
かんたん!(ちょっとうそ)
ActionScript3 を覚えることで表現できる事は増えるよ!
はじめてみるのもいいかも
申請職務:Flexプログラム要員
忙しい時にお邪魔します。会社は全部にFlexプログラム要員の30名ぐらいにいる。費用は600円/時間しかないです。ご連絡してください。よろしくお願い致します。会社のホームページhttp://www.busycode.jp。メールアドレスcogoing@gmail.com。
どうもありがとうございます、
田中
芸能関係のニュースを続々更新!!HOTな芸能情報を公開!!美人芸能人画像、セクシー画像がいっぱい、倉科カナおっぱい画像