<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>masputih &#187; Tutorials</title>
	<atom:link href="http://masputih.com/category/tutorials/feed" rel="self" type="application/rss+xml" />
	<link>http://masputih.com</link>
	<description>Coder for Hire</description>
	<lastBuildDate>Mon, 24 May 2010 08:48:37 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Auto-scroll Text Area</title>
		<link>http://masputih.com/2009/06/auto-scroll-text-area</link>
		<comments>http://masputih.com/2009/06/auto-scroll-text-area#comments</comments>
		<pubDate>Tue, 02 Jun 2009 10:20:18 +0000</pubDate>
		<dc:creator>Anggie Bratadinata</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[component]]></category>

		<guid isPermaLink="false">http://masputih.com/?p=469</guid>
		<description><![CDATA[Berikut ini contoh kode untuk membuat scrollbar komponen fl.controls.TextArea otomatis bergerak ke bawah kalo ada penambahan teks sehingga baris-baris terbaru selalu kelihatan. package { import fl.controls.Button; import fl.controls.TextArea; import fl.controls.TextInput; import fl.events.ComponentEvent; import flash.display.MovieClip; import flash.events.Event; import flash.events.MouseEvent; public class Main extends MovieClip { public var console:TextArea; public var input:TextInput public function Main() { console.text [...]]]></description>
			<content:encoded><![CDATA[<p></p><p>Berikut ini contoh kode untuk membuat <em>scrollbar</em> komponen <code>fl.controls.TextArea</code> otomatis bergerak ke bawah kalo ada penambahan teks sehingga baris-baris terbaru selalu kelihatan.</p>
<p><a href="http://labs.masputih.com/autoscroll_ta/index.html" rel="shadowbox"><img src="http://masputih.com/uploads/2009/06/autoscroll1.jpg" alt="autoscroll" title="autoscroll" width="420" height="333" class="aligncenter size-full wp-image-475" /></a></p>
<p><span id="more-469"></span></p>
<pre class="brush:as3">
package  {

	import fl.controls.Button;
	import fl.controls.TextArea;
	import fl.controls.TextInput;
	import fl.events.ComponentEvent;
	import flash.display.MovieClip;
	import flash.events.Event;
	import flash.events.MouseEvent;

	public class Main extends MovieClip {

		public var console:TextArea;
		public var input:TextInput

		public function Main() {

			console.text = "A\nB\nC\nD\nE\nF\nG\nH\nI\nJ\nK\n";

			console.addEventListener(Event.RENDER, updateScrollPosition);

			input.addEventListener(ComponentEvent.ENTER, addText);

		}

		private function updateScrollPosition(e:Event):void {
			console.verticalScrollPosition = console.maxVerticalScrollPosition;
		}

		private function addText(e:Event):void {
			if (input.length > 0 ) {
				console.appendText(input.text + "\n");
			}
		}

	}

}
</pre>
<div class="box dl_box">
Sourcecode : <a href="http://masputih.com/wordpress/wp-content/plugins/download-monitor/download.php?id=autoscrolltextarea.rar" title="Downloaded 381 times">→ AutoScrollTextArea.rar</a>
</div>
]]></content:encoded>
			<wfw:commentRss>http://masputih.com/2009/06/auto-scroll-text-area/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Factory Pattern</title>
		<link>http://masputih.com/2009/05/factory-pattern</link>
		<comments>http://masputih.com/2009/05/factory-pattern#comments</comments>
		<pubDate>Wed, 06 May 2009 10:53:00 +0000</pubDate>
		<dc:creator>Anggie Bratadinata</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Design Patterns]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[actionscript]]></category>
		<category><![CDATA[pattern]]></category>

		<guid isPermaLink="false">http://masputih.com/?p=354</guid>
		<description><![CDATA[Factory Pattern adalah pattern yang digunakan untuk memisahkan (decouple) proses pembuatan/instansiasi sebuah objek (produk) dari objek lain (klien) yang menggunakannya. Tujuannya supaya perubahan pada product class nggak menyebabkan kita harus mengubah kode pada client. Paling nggak akibat dari perubahan itu bisa diminimalisir. Dan juga supaya si factory bisa digunakan oleh banyak class. Factory adalah objek [...]]]></description>
			<content:encoded><![CDATA[<p></p><p><em>Factory Pattern</em> adalah pattern yang digunakan untuk memisahkan (<em>decouple</em>) proses pembuatan/instansiasi sebuah objek (produk) dari objek lain (klien) yang menggunakannya. Tujuannya supaya perubahan pada <em>product class</em> nggak menyebabkan kita harus mengubah kode pada <em>client</em>. Paling nggak akibat dari perubahan itu bisa diminimalisir. Dan juga supaya si <em>factory</em> bisa digunakan oleh banyak class.</p>
<p><em>Factory</em> adalah objek yang berfungsi membuat objek lain (produk). Class ini menyembunyikan proses pembuatan produk dari klien sehingga klien nggak perlu tahu proses pembuatannya, bahkan klien juga nggak perlu tahu nama class dari produk yang dia minta.</p>
<p>Mungkin kita sering menulis function seperti ini: </p>
<pre class="codeblock">
<code>
var coffee:AbstractCoffee = createCoffee("xxx");
function createCoffee(type:String):Coffee{
        if(type == "xxx" ) return new XXXCoffee();
        if(type == "yyy" ) return new YYYCoffee();
        if(type == "zzz" ) return new ZZZCoffee();
        return null;
}</code>
</pre>
<p>Cukup bagus untuk proyek kecil. Tapi coba bayangin kalo kita punya 20 class yang harus bisa bikin kopi dan semuanya harus bisa ditukar-tukar saat <em>run-time</em> plus si produk kemungkinan besar bakal berubah. Repot. Di sini gunanya Factory Pattern.</p>
<p><span id="more-354"></span></p>
<p>Factory Pattern memungkinkan instansiasi sebuah produk didelegasikan ke subclass (<em>concrete factory</em>) dari <em>base-class</em> yang bersifat generik (abstrak) . Keuntungannya adalah si klien hanya perlu tau generik classnya, jadi <em>concrete factory</em> bisa ditukar-tukar secara dinamis (polymorfis) tergantung produk apa yang dibutuhkan dan klien nggak perlu tau detil pembuatan produk.</p>
<div id="attachment_353" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/factory-pattern/factory-methodjpg" rel="attachment wp-att-353"><img src="http://masputih.com/uploads/2009/05/factory-method-300x32.jpg" alt="Diagram Dasar Factory" title="factory-method.jpg" width="300" height="32" class="size-medium wp-image-353" /></a>
	<p class="wp-caption-text">Diagram Dasar Factory</p>
</div>
<p>Ada 2 varian factory pattern yaitu :</p>
<ol>
<li>Factory Method</li>
<li>Abstract Factory</li>
</ol>
<h3>Factory Method (FM)</h3>
<blockquote><p>Define an interface for creating an object, but let the subclasses decide which class to instantiate. The Factory method lets a class defer instantiation to subclasses. (wikipedia)</p>
<p>Factory Method is similar to Abstract Factory but without the emphasis on families. (sourcemaking.com)</p>
</blockquote>
<div id="attachment_360" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/factory-pattern/factorymethod-class-diagram" rel="attachment wp-att-360"><img src="http://masputih.com/uploads/2009/05/factorymethod-class-diagram-300x221.jpg" alt="Factory Method" title="factorymethod-class-diagram" width="300" height="221" class="size-medium wp-image-360" /></a>
	<p class="wp-caption-text">Factory Method</p>
</div>
<p>Dalam <em>Factory Method</em>, setiap <em>concrete factory</em> bertugas membuat satu produk. Jadi ada pemetaaan 1–1 antara <em>factory</em> dan produk yang dibuatnya. Klien menggunakan <em>abstract factory</em> untuk membuat objek tapi jenis objek itu ditentukan oleh <em>concrete factory</em> yang dipilih.</p>
<p>Contoh:</p>
<pre class="brush:as3">
public class Main extends Sprite{

	public var factory:AbstractFactory;
	public var product:AbstractProduct;

	public function Main():void{

		factory = new ABCFactory();
		product = factory.createProduct();

		factory = new DEFFactory();
		product = factory.createProduct();

		factory = new XYZFactory();
		product = factory.createProduct();

	}
}

//abstract factory
public class AbstractFactory {

	public function AbstractFactory() {}

	public function createProduct():AbstractProduct {
		throw new IllegalOperationError("Abstract method. Must be implemented in subclass");
		return null;
	}

}

//abstract product
public class AbstractProduct {
	public function AbstractProduct() {}
}

//concrete factories
public class ABCFactory extends AbstractFactory {
	override public function createProduct():AbstractProduct {
		return new ProductABC();
	}
}
public class DEFFactory extends AbstractFactory {
	override public function createProduct():AbstractProduct {
		return new ProductDEF();
	}
}

//concrete products
public class ProductABC extends AbstractProduct{
	public function ProductABC() {
		trace("ProductABC created");
	}
}

public class ProductDEF extends AbstractProduct {
	public function ProductDEF() {
		trace("ProductDEF created");
	}
}
</pre>
<p>Output:</p>
<pre class="codeblock"><code>
ProductABC created
ProductDEF created

</code></pre>
<p>Dalam contoh di atas, kalo class ProductABC berubah, misalnya konstruktornya harus kita beri parameter “id”, kita nggak perlu utak-atik class Main. Cukup kita modifikasi ABCFactory. Contohnya gini :</p>
<pre class="brush:as3">
public class ProductABC extends AbstractProduct{
	public function ProductABC(id:String) {
		trace("ProductABC created with id " + id);
	}
}

public class ABCFactory extends AbstractFactory {
	override public function createProduct():AbstractProduct {
		var id:String = String(Math.round(Math.random() * 10));
		return new ProductABC(id);
	}
}
</pre>
<pre class="codeblock"><code>
ProductABC created with id 8
ProductDEF created

</code></pre>
<h3>Abstract Factory (AF)</h3>
<blockquote><p>The intent in employing the pattern is to insulate the creation of objects from their usage. This allows for new derived types to be introduced with no change to the code that uses the base class. (wikipedia)</p>
<p>Abstract Factory emphasizes a family of product objects. (sourcemaking.com)</p>
</blockquote>
<div id="attachment_361" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/uploads/2009/05/abstract-factory-class-diagram.jpg" rel="shadowbox"><img src="http://masputih.com/uploads/2009/05/abstract-factory-class-diagram-300x203.jpg" alt="Abstract Factory" title="abstract-factory-class-diagram" width="300" height="203" class="size-medium wp-image-361" /></a>
	<p class="wp-caption-text">Abstract Factory</p>
</div>
<p>Perbedaan utama antara Abstract Factory dengan Factory Method adalah dalam pemetaan antara <em>factory</em> dengan produk. Dalam AF, satu factory bisa membuat banyak produk yang sekelompok.</p>
<p>Biar lebih gampang dipahami, saya buat aplikasi sederhana berikut ini.</p>
<h3>Demo : Warung Factory</h3>
<div class="wp-caption aligncenter" style="width: 295px">
	<a href="http://labs.masputih.com/patterns/abstractfactory/index.html" rel="shadowbox"><img alt="Click to see the demo" src="http://labs.masputih.com/patterns/abstractfactory/screenshot.jpg" title="Warung Factory" width="295" height="244" /></a>
	<p class="wp-caption-text">Click to see the demo</p>
</div>
<div id="attachment_384" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/factory-pattern/warung" rel="attachment wp-att-384"><img src="http://masputih.com/uploads/2009/05/warung-300x224.jpg" alt="Class Diagram" title="warung" width="300" height="224" class="size-medium wp-image-384" /></a>
	<p class="wp-caption-text">Class Diagram</p>
</div>
<div class="box dl_box">Project files : <a href="http://masputih.com/wordpress/wp-content/plugins/download-monitor/download.php?id=abstractfactory.rar" title="Downloaded 468 times">→ AbstractFactory.rar</a></div>
<h4>Factory</h4>
<pre class="brush:as3">package factory {

	import product.AbstractProduct;
	import flash.errors.IllegalOperationError;

	public class AbstractFactory {

		public function AbstractFactory(name:String) {
			trace("Pesan makanan/minuman di " + name);
		}

		public function createProduct(type:String):AbstractProduct {
			throw new IllegalOperationError("Abstract method. Must be implemented in subclass.");
		}

		public function getProducts():Array {
			throw new IllegalOperationError("Abstract method. Must be implemented in subclass.");
		}

	}

}
</pre>
<p>Berikut ini turunannya, yaitu concrete factory yang akan membuat produk berdasarkan pilihan menu.</p>
<pre class="brush:as3">
//WarungBuTini.as
package factory {
	import product.AbstractProduct;
	import product.NasiRawon;
	import product.KopiSusu;
	import product.SodaGembira;

	public class WarungBuTini extends AbstractFactory{

		public static const NAME:String = "Warung Bu Tini";

		public function WarungBuTini() {
			super(NAME);
		}

		override public function createProduct(type:String):AbstractProduct {

			if (type == SodaGembira.NAME) return new SodaGembira(NAME,"4500");
			if (type == NasiRawon.NAME) return new NasiRawon(NAME, "8000");
			if (type == KopiSusu.NAME) return new KopiSusu(NAME, "6000");

			throw Error("Invalid product type");
			return null;
		}

		override public function getProducts():Array {
			return [SodaGembira.NAME,NasiRawon.NAME,KopiSusu.NAME];
		}

	}

}

//DepotAgung.as
package factory {
	import product.AbstractProduct;
	import product.NasiGoreng;
	import product.PangsitMie;
	import product.SodaGembira;

	public class DepotAgung extends AbstractFactory{

		public static const NAME:String = "Depot Agung";

		public function DepotAgung() {
			super(NAME);
		}

		override public function createProduct(type:String):AbstractProduct {
			if (type == NasiGoreng.NAME) return new NasiGoreng(NAME, "5500");
			if (type == PangsitMie.NAME) return new PangsitMie(NAME, "4000");
			if (type == SodaGembira.NAME) return new SodaGembira(NAME, "3000");

			throw Error("Invalid product type");
			return null;
		}

		override public function getProducts():Array {
			return [NasiGoreng.NAME,PangsitMie.NAME,SodaGembira.NAME];
		}

	}

}
</pre>
<h4>Product</h4>
<pre class="brush:as3">package product {
	import flash.display.Sprite;
	import flash.text.TextField;

	public class AbstractProduct extends Sprite{

		//timeline objects
		public var productName:TextField;
		public var price:TextField;
		public var factoryName:TextField;

		public function AbstractProduct(productName:String,price:String,factoryName:String) {
			this.productName.text = productName;
			this.price.text = "Rp " + price;
			this.factoryName.text = factoryName;
			trace("Beli " + productName + " di " + factoryName);
		}

		public function pay():void{
			trace("Bayar " + price.text + " ke " + factoryName.text);
		}

	}

}
</pre>
<p>Concrete Factory akan membuat objek dari concrete product dan mengirimkannya ke klien ( <code>Main</code> )<br />
Berikut ini <em>concrete product </em>nya</p>
<pre class="brush:as3">
//NasiGoreng.as
package product {

	[Embed(source='../assets/assets.swf', symbol='NasGor')]
	public class NasiGoreng extends AbstractProduct {

		public static const NAME:String = "Nasi Goreng";

		public function NasiGoreng(factoryName:String,price:String = "7000") {
			super(NAME,price,factoryName)
		}

	}

}

//SodaGembira.as
package product {

	[Embed(source='../assets/assets.swf', symbol='Sogem')]
	public class SodaGembira extends AbstractProduct {

		public static const NAME:String = "Soda Gembira";

		public function SodaGembira(factoryName:String,price:String = "5000") {
			super(NAME, price, factoryName);
		}

	}

}
</pre>
<h4>Main class</h4>
<pre class="brush:as3">package
{
	import factory.AbstractFactory;
	import factory.DepotAgung;
	import factory.WarungBuTini;
	import factory.WarungPakJaja;
	import product.AbstractProduct;
	import fl.controls.ComboBox;
	import fl.controls.List;
	import flash.display.Sprite;
	import flash.events.Event;

	public class Main extends Sprite{

		public function Main():void{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}

		private var _productPic:Sprite;
		private var _selector:FactorySelector;

		//main class hanya pakai base/abstract class, bukan concrete class
		private var _factory:AbstractFactory;
		private var _product:AbstractProduct;

		private function init(e:Event = null):void {
			removeEventListener(Event.ADDED_TO_STAGE, init);

			//_factory &#038; _products _selector
			_selector = new FactorySelector();
			addChild(_selector);

			_selector.factories.addEventListener(Event.CHANGE, selectFactory);
			_selector.productList.addEventListener(Event.CHANGE, onProductChange);

			_selector.factoryData = [WarungBuTini.NAME, DepotAgung.NAME];

			//product picture holder
			_productPic = new Sprite();
			_productPic.x = 10;
			_productPic.y = _selector.height + 20;
			addChild(_productPic);

		}

//----------------------------------------------------------- FACTORY SELECTION

		private function selectFactory(e:Event = null):void {

			switch(_selector.factories.selectedLabel) {
				case WarungBuTini.NAME:
					_factory = new WarungBuTini();
				break;
				case DepotAgung.NAME:
					_factory = new DepotAgung();
				break;
			}

			_selector.productData = _factory.getProducts();
		}

//----------------------------------------------------------- PRODUCT SELECTION

		private function onProductChange(e:Event):void {
			var type:String = _selector.productList.itemToLabel(_selector.productList.selectedItem);
			_product = _factory.createProduct(type);
			_product.pay();

			setPicture(_product);
		}

//----------------------------------------------------------- DISPLAY PRODUCT IMAGE		

		private function setPicture(product:AbstractProduct):void {

			var i:int = _productPic.numChildren;
			while (i--) {
				_productPic.removeChildAt(i);
			}

			_productPic.addChild(product);
		}
	}
}
</pre>
<h4>Tambah Factory &amp; Produk Baru</h4>
<p>Kalo kita ingin buat factory baru, langkah-langkahnya adalah :</p>
<ol>
<li>Buat sub-class dari AbstractFactory</li>
<li>Sub-class itu harus punya konstanta bernama <code>NAME</code> yang dipakai untuk menampilkan nama factory di dalam combobox</li>
<li>Override <code>createProduct()</code> dan <code>getProducts()</code></li>
<li>Tambahkan ke daftar factory
<pre class="codeblock"><code>_selector.factoryData = [...,..., FactoryBaru.NAME];</code></pre>
</li>
<li>Instansiasi factory di dalam  <code>selectFactory()</code>
<pre class="codeblock"><code>switch(_selector.factories.selectedLabel) {
	....
	case FactoryBaru.NAME:
		_factory = new FactoryBaru();
	break;
}
</code></pre>
</li>
</ol>
<p>Untuk bikin produk baru:</p>
<ol>
<li>Buat subclass dari <code>AbstractProduct </code>dengan <em>parameterized constructor</em> dan konstanta <code>NAME</code>
<pre class="codeblock"><code>
public static const NAME:String = "Produk Baru";
public function ProdukBaru(factoryName:String,price:String = "7000") {
	super(NAME,price,factoryName)
}

</code></pre>
</li>
<li>Daftarkan nama produk di dalam factory pembuatnya, lihat <code>getProducts()</code>
<pre class="codeblock"><code>override public function getProducts():Array {
	return [...,...,ProdukBaru.NAME];
}
</code></pre>
</li>
<li>Instansiasi produk di dalam <code>createProduct()</code>
<pre class="codeblock"><code>override public function createProduct(type:String):AbstractProduct {
	...
	if (type == ProdukBaru.NAME) return new ProdukBaru(NAME,"1200");
	...
}</code></pre>
</li>
</ol>
<p>Contoh:</p>
<p>Produk baru : Kopi Susu</p>
<pre class="brush:as3">
[Embed(source='../assets/assets.swf', symbol='Tarik')]
public class KopiSusu extends AbstractProduct {

	public static const NAME:String = "Kopi Susu";

//----------------------------------------------------------- INIT

	public function KopiSusu(factoryName:String,price:String = "3500") {
		super(NAME, price, factoryName);

	}

}
</pre>
<p>Factory baru : Warung Pak Jaja. Salah satu dagangannya adalah Kopi Susu.</p>
<pre class="brush:as3">
public class WarungPakJaja extends AbstractFactory {

	public static const NAME:String = "Warung Pak Jaja";

//----------------------------------------------------------- INIT

	public function WarungPakJaja() {
		super(NAME);
	}

	override public function createProduct(type:String):AbstractProduct {

		if (type == KopiSusu.NAME) return new KopiSusu(NAME,"1200");
		if (type == SodaGembira.NAME) return new SodaGembira(NAME, "3000");
		if (type == NasiGoreng.NAME) return new NasiGoreng(NAME, "7500");

		throw Error("Invalid product type");
		return null;
	}

	override public function getProducts():Array {
		return [KopiSusu.NAME,SodaGembira.NAME,NasiGoreng.NAME];
	}

}
</pre>
<p>Tambahkan Warung Pak Jaja ke dalam Main class :</p>
<pre class="brush:as3">
private function init(e:Event = null):void {
	removeEventListener(Event.ADDED_TO_STAGE, init);

	//_factory &#038; _products _selector
	_selector = new FactorySelector();
	addChild(_selector);

	_selector.factories.addEventListener(Event.CHANGE, selectFactory);
	_selector.productList.addEventListener(Event.CHANGE, onProductChange);

	_selector.factoryData = [WarungBuTini.NAME, WarungPakJaja.NAME, DepotAgung.NAME];

	//product picture holder
	_productPic = new Sprite();
	_productPic.x = 10;
	_productPic.y = _selector.height + 20;
	addChild(_productPic);

}

//----------------------------------------------------------- FACTORY SELECTION

private function selectFactory(e:Event = null):void {

	switch(_selector.factories.selectedLabel) {
		case WarungPakJaja.NAME:
			_factory = new WarungPakJaja();
		break;
		case WarungBuTini.NAME:
			_factory = new WarungBuTini();
		break;
		case DepotAgung.NAME:
			_factory = new DepotAgung();
		break;
	}

	_selector.productData = _factory.getProducts();
}
</pre>
<p>Di output panel :</p>
<pre class="codeblock"><code>
Pesan makanan/minuman di Warung Bu Tini
Beli Kopi Susu di Warung Bu Tini
Bayar Rp 6000 ke Warung Bu Tini
Pesan makanan/minuman di Depot Agung
Beli Pangsit Mie di Depot Agung
Bayar Rp 4000 ke Depot Agung
Pesan makanan/minuman di Warung Pak Jaja
Beli Soda Gembira di Warung Pak Jaja
Bayar Rp 3000 ke Warung Pak Jaja
Beli Kopi Susu di Warung Pak Jaja
Bayar Rp 1200 ke Warung Pak Jaja

</code></pre>
<p>Di dalam arsip project file di atas, saya ada banyak produk yang bisa Anda pakai untuk utak atik.</p>
<p>Oke, sekian artikel tentang Factory Method &amp; Abstract Factory. Mudah-mudahan bermanfaat. Kalo nggak ngerti silakan tanya.</p>
<h3>Links</h3>
<ul>
<li>Project file : <a href="http://masputih.com/wordpress/wp-content/plugins/download-monitor/download.php?id=abstractfactory.rar" title="Downloaded 468 times">→ AbstractFactory.rar</a></li>
<li><a href="http://www.sourcemaking.com">sourcemaking.com</li>
<li><a href="http://www.as3dp.com">www.as3dp.com</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://masputih.com/2009/05/factory-pattern/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Facebook AS3 API : The Basics</title>
		<link>http://masputih.com/2009/05/facebook-as3-api-the-basics</link>
		<comments>http://masputih.com/2009/05/facebook-as3-api-the-basics#comments</comments>
		<pubDate>Sat, 02 May 2009 17:18:01 +0000</pubDate>
		<dc:creator>Anggie Bratadinata</dc:creator>
				<category><![CDATA[ActionScript 3]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[actionscript]]></category>

		<guid isPermaLink="false">http://masputih.com/?p=266</guid>
		<description><![CDATA[Repost artikel yg sudah pernah saya tulis di blog yang lama Dalam tutorial ini saya akan tunjukkan cara pembuatan aplikasi Flash/Flex untuk Facebook dengan menggunakan Facebook AS3 API yang resmi di-support oleh Facebook &#38; Adobe. Facebook AS3 API adalah library yang memungkinkan kita membuat aplikasi Flash/Flex yang bisa mengakses data dari Facebook tanpa memerlukan skrip [...]]]></description>
			<content:encoded><![CDATA[<p></p><blockquote><p>Repost artikel yg sudah pernah saya tulis di <a href="http://old.masputih.com">blog yang lama</a></p></blockquote>
<p>Dalam tutorial ini saya akan tunjukkan cara pembuatan aplikasi Flash/Flex untuk Facebook dengan menggunakan Facebook AS3 API yang resmi di-support oleh Facebook &amp; Adobe.</p>
<p><a href="http://code.google.com/p/facebook-actionscript-api/">Facebook AS3 API</a> adalah library yang memungkinkan kita membuat aplikasi Flash/Flex yang bisa mengakses data dari Facebook tanpa memerlukan skrip di sisi server. Kalo kita mengeset aplikasi kita sebagai aplikasi “Desktop”, kita bisa langsung menjalankan aplikasi di komputer kita. Jadi nggak perlu upload ke server. Selama proses development, umumnya kita banyak berkutat di sisi desktop , nanti kalo aplikasi sudah siap untuk testing baru kita upload ke server.</p>
<p><span id="more-266"></span></p>
<h3>Set Up</h3>
<p>Langkah pertama yang kita lakukan adalah mengunjungi Facebook Developer Home untuk mengeset aplikasi yang akan kita buat. Buka situs tersebut lalu klik tombol Set Up New Application.</p>
<p>Pada form “Essential Information”, kita isikan nama aplikasi yang akan kita buat. Klik “Agree”, lalu “Save Changes”. </p>
<div id="attachment_267" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/76" rel="attachment wp-att-267"><img src="http://masputih.com/uploads/2009/05/76-300x167.jpg" alt="Create Application" title="Create Application" width="300" height="167" class="size-medium wp-image-267" /></a>
	<p class="wp-caption-text">Create Application</p>
</div>
<p>Di halaman “Basic Settings”, catat API Key dan Secret Key.</p>
<div id="attachment_268" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/77" rel="attachment wp-att-268"><img src="http://masputih.com/uploads/2009/05/77-300x127.jpg" alt="Secret &amp; API Keys" title="Secret &amp; API Keys" width="300" height="127" class="size-medium wp-image-268" /></a>
	<p class="wp-caption-text">Secret &amp; API Keys</p>
</div>
<p>Selanjutnya, kita klik menu “Advanced”. Di sini untuk “Application Type” kita pilih Desktop karena sementara kita hanya menjalankan aplikasi secara lokal dan kalo kita ingin aplikasi kita bisa dicoba oleh orang lain, non-aktifkan juga modus Sandbox. Klik Save Changes. </p>
<div id="attachment_269" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/78" rel="attachment wp-att-269"><img src="http://masputih.com/uploads/2009/05/78-300x127.jpg" alt="Application Type" title="Application Type" width="300" height="127" class="size-medium wp-image-269" /></a>
	<p class="wp-caption-text">Application Type</p>
</div>
<p>Terakhir, kita unduh Facebook AS3 API di Googlecode . Kita bisa mengunduh dalam bentuk .zip atau .swc, namun .zip lebih baik karena kita bisa melihat sourcecode-nya. Kita unduh juga dokumentasinya. Kalo Anda punya SVN client, saya sarankan Anda melakukan SVN check-out supaya mudah untuk mengikuti update terbaru.</p>
<h3>AS3 Project</h3>
<p>Kita buat AS3 project di FlexBuilder atau FlashDevelop ( saya menggunakan FlashDevelop ). Jangan lupa tambahkan Facebook AS3 API ke dalam library path atau kopi direktori <code>source/actionscript/com</code> ke dalam source folder.</p>
<h4>Download Project</h4>
<div class="box dl_box"><a href="http://masputih.com/wordpress/wp-content/plugins/download-monitor/download.php?id=helloas3.rar" title="Downloaded 576 times">→ HelloAS3.rar</a></div>
<p>Dalam project ini, kita menggunakan komponen TextArea dan Button dari Flash CS4 untuk menghemat ukuran file. framework.swc kita kopi dari Flex SDK supaya kita bisa menggunakan class ObjectUtil untuk menampilkan objek dalam format yang lengkap (nama instance dan propertinya) supaya debugging lebih gampang. Tambahkan kedua .swc ke dalam project library ( di FlashDevelop : klik kanan swc → Add To Library ).</p>
<blockquote><p>Saya tidak memasukkan framework.swc ke dalam project file di atas, jadi silakan Anda kopi sendiri dari Flex SDK.</p></blockquote>
<div id="attachment_278" class="wp-caption aligncenter" style="width: 264px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/79" rel="attachment wp-att-278"><img src="http://masputih.com/uploads/2009/05/79.jpg" alt="Tambahkan Flex SWC" title="Tambahkan Flex SWC" width="264" height="162" class="size-full wp-image-278" /></a>
	<p class="wp-caption-text">Tambahkan Flex SWC</p>
</div>
<div id="attachment_279" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/80" rel="attachment wp-att-279"><img src="http://masputih.com/uploads/2009/05/80-300x228.jpg" alt="Direktori Project" title="Direktori Project" width="300" height="228" class="size-medium wp-image-279" /></a>
	<p class="wp-caption-text">Direktori Project</p>
</div>
<p>Kalo Anda ingin mengikuti tutorial ini step-by-step, silakan buka file <code>MainDesktopStart.as</code> dan set file ini sebagai <em>Document Class</em>. Caranya, klik kanan lalu klik “Always Compile” dari context menu seperti gambar di bawah ini. </p>
<div id="attachment_286" class="wp-caption aligncenter" style="width: 295px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/81" rel="attachment wp-att-286"><img src="http://masputih.com/uploads/2009/05/81.jpg" alt="Setting Main Class" title="Always Compile" width="295" height="226" class="size-full wp-image-286" /></a>
	<p class="wp-caption-text">Setting Main Class</p>
</div>
<h3>API &amp; Secret Keys</h3>
<p>Pertama kita set API Key &amp; Secret Key yang kita dapat dari Facebook. Buka file Constants.as, isikan kedua key tersebut.</p>
<pre class="brush:as3">
public static const API_KEY:String = "YOURAPIKEY";
public static const SECRET_KEY:String = "YOURSECRETKEY";
</pre>
<h3>Instansiasi Facebook &amp; Login</h3>
<p>Buka file MainDesktopStart.as.  Lihat <code>initFacebook()</code> . Di dalam function ini kita lakukan instansiasi objek <code>FacebookSessionUtil</code> dan event handling untuk <code>FacebookEvent.WAITING_FOR_LOGIN</code>  dan <code>FacebookEvent.CONNECT</code>. Karena sebelum aplikasi kita bisa mengakses data user di Facebook, user yang menggunakannya harus memberi persetujuan ( otorisasi ) untuk mengakses data, kita panggil juga <code>login()</code> milik class <code>FacebookSessionUtil</code>. </p>
<pre class="brush:as3">
private function initFacebookSession():void {

	_session = new FacebookSessionUtil(Constants.API_KEY, Constants.SECRET_KEY, this.root.loaderInfo);
	_session.addEventListener(FacebookEvent.WAITING_FOR_LOGIN, onWaitingForLogin);
	_session.addEventListener(FacebookEvent.CONNECT, onFacebookConnect);

	_session.login();

}
</pre>
<p>Sekarang kita lakukan Test Movie. </p>
<div id="attachment_287" class="wp-caption aligncenter" style="width: 286px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/92" rel="attachment wp-att-287"><img src="http://masputih.com/uploads/2009/05/92-286x300.jpg" alt="Test Movie 1" title="Test Movie 1" width="286" height="300" class="size-medium wp-image-287" /></a>
	<p class="wp-caption-text">Test Movie 1</p>
</div>
<p>Pada saat eksekusi <code>_session.login()</code>,  <code>_session</code> menyiarkan <code>FacebookEvent.WAITING_FOR_LOGIN</code> yang di-handle oleh <code>onWaitingForLogin()</code> dan browser akan menampilkan popup window seperti gambar di bawah ini setelah Anda login ke Facebook. Ini tandanya aplikasi kita sudah mendapat otorisasi.</p>
<p>Kalo nggak, pastikan API &amp; Secret Key yang Anda masukkan sudah benar dan jangan lupa, kalo Anda punya PopUp Blocker, matikan dulu. </p>
<div id="attachment_290" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/82" rel="attachment wp-att-290"><img src="http://masputih.com/uploads/2009/05/82-300x140.jpg" alt="Logged In" title="Logged In" width="300" height="140" class="size-medium wp-image-290" /></a>
	<p class="wp-caption-text">Logged In</p>
</div>
<p>Sekarang ini, kalo aplikasi Anda dijalankan oleh orang lain atau Anda login ke account lain, bukan account yang Anda gunakan untuk mendaftarkan aplikasi ini, maka Facebook akan menampilkan dialog meminta otorisasi seperti ini, sebelum pemberitahuan seperti gambar di atas:</p>
<div id="attachment_291" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/83" rel="attachment wp-att-291"><img src="http://masputih.com/uploads/2009/05/83-300x102.jpg" alt="Allow Access Dialog" title="Allow Access ?" width="300" height="102" class="size-medium wp-image-291" /></a>
	<p class="wp-caption-text">Allow Access Dialog</p>
</div>
<p>Berikutnya, kita memberi tahu aplikasi bahwa kita sudah login dan aplikasi sudah mendapat otorisasi dengan mengklik tombol “OK” di pojok kanan bawah aplikasi kita.</p>
<p>Kita tambahkan kode untuk validasi login di <code>onLoginBtnClick()</code> sehingga pada saat kita klik OK, <code>_session </code>akan melakukan validasi &amp; koneksi ke Facebook.  <code>validateLogin()</code> berguna untuk memastikan bahwa aplikasi sudah mendapat otorisasi, jadi kalo Anda mengklik OK sebelum Facebook bilang <cite>You may now close this window …</cite>, maka <code>_session.login()</code> otomatis akan dieksekusi lagi. Sebaliknya, kalo aplikasi sudah mendapat otorisasi, maka aplikasi akan melakukan koneksi ke Facebook dan saat aplikasi menerima respons balik dari Facebook, _session akan menyiarkan <code>FacebookEvent.CONNECT</code> yang di-handle oleh <code>onFacebookConnect()</code>.</p>
<pre class="brush:as3">
private function onLoginBtnClick(e:Event):void {
	_console.appendText("\n\n---\nValidating...");

	//validate login and connect to FB
	_session.validateLogin();

}
</pre>
<p>Di dalam <code>onFacebookConnect()</code> kita pastikan bahwa respon yang diterima dari Facebook tidak mengandung pesan kesalahan dengan cara menguji properti <code>success</code> dari <code>FacebookEvent</code>. Jika ada kesalahan, properti ini akan bernilai <code>false</code>. Jika tidak, maka properti ini bernilai <code>true</code>, kita akan mendapat session key, dan kita eksekusi <code>getUserInfo()</code>.</p>
<p>Kita tambahkan beberapa baris kode seperti berikut :</p>
<pre class="brush:as3">
private function onFacebookConnect(e:FacebookEvent):void {

	//if connection fails, reinitiate login
	if (!e.success) {

		_console.appendText("\n\n---\nCannot connect to Facebook!");
		_console.appendText("\n\n---\n" + ObjectUtil.toString(e.error));				

		_session.login()

		return;
	}

	_console.appendText("\n\n---\nYou are now connected to Facebook!");
	_console.appendText("\nYour session key : " + _session.facebook.session_key);

	//hide login btn
	_loginBtn.visible = false;

	getUserInfo();

}
</pre>
<h3>Getting User Data</h3>
<p>Kita lihat function <code>getUserInfo()</code>. Kita akan gunakan function ini untuk mengambil data user yang menggunakan aplikasi ini. Kita tambahkan beberapa baris ke dalam <code>getUserInfo(</code>) seperti ini:</p>
<pre class="brush:as3">
private function getUserInfo():void {
	_console.appendText("\n\n---\nGetting your info");

	var fields:Array = [GetInfoFieldValues.NAME, GetInfoFieldValues.BIRTHDAY];
	var call:FacebookCall = _session.facebook.post(new GetInfo([_session.facebook.uid], fields ));
	call.addEventListener(FacebookEvent.COMPLETE, onComplete_getUserInfo);

}
</pre>
<p>Variabel fields berisi data apa saja yang ingin kita ambil dari data user yang bersangkutan. Di sini kita cukup ambil dua buah data yaitu “name” dan “birthday”. Kita bisa memasukkan <code>String</code> ke dalam variabel fields seperti ini :</p>
<pre class="codeblock"><code>
var fields:Array = ["name","birthday"];

</code></pre>
<p>Tapi lebih baik jika kita menggunakan konstanta yang ada di class GetInfoFieldValues untuk menghindari salah tulis.</p>
<p>Variabel call adalah objek bertipe <code>FacebookCall</code>  yang merepresentasikan eksekusi Facebook API. Karena kita ingin mengambil data user, maka kita buat objek <code>GetInfo</code>, dan kita beri argumen berupa properti <code>_session.facebook.uid</code> yang berisi id dari user yang menggunakan aplikasi ini dan variabel <code>fields</code> di atas.</p>
<p>Pada saat respons dari Facebook diterima, objek call akan menyiarkan <code>FacebookEvent.COMPLETE </code>yang di-handle oleh <code>onComplete_getUserInfo()</code>  yang akan menampilkan nama &amp; tanggal lahir user di Console dan kemudian mengeksekusi <code>getFriendsInfo()</code>. Untuk itu kita tambahkan kode ke dalam function tersebut seperti di bawah ini:</p>
<pre class="brush:as3">
private function onComplete_getUserInfo(e:FacebookEvent):void {

	if (!e.success) {
		_console.appendText("\n\n---\nERROR : " + ObjectUtil.toString(e.error));
		return;
	}

	var user:FacebookUser = GetInfoData(e.data).userCollection.getItemAt(0) as FacebookUser;
	_console.appendText("\n\n---\nHello " + user.name + "!");
	_console.appendText(" You were born on " + user.birthday);

	getFriendIDs(_session.facebook.uid);

}
</pre>
<p>Variabel <code>user</code> merepresentasikan useryang sedang menggunakan aplikasi ini. Tipe datanya adalah <code>FacebookUser</code>. Di sini kita perlu melakukan <em>type-casting</em> terhadap data yang dikirim bersama <code>FacebookEvent</code> menjadi <code>GetInfoData</code> yang memiliki properti <code>userCollection</code>. Karena kita hanya meminta data satu orang user, maka user ini berada di posisi index 0  dari <code>userCollection</code>.</p>
<p>Karena <code>userCollection.getItemAt(0)</code> memberikan data bertipe <code>Object</code> maka kita lakukan <em>type-casting</em> ke tipe data <code>FacebookUser</code>. Baris-baris berikutnya menampilkan data user. Baris terakhir mengeksekusi <code>getFriendIDs()</code>.</p>
<h3>Getting Friends IDs</h3>
<p><code>getFriendIDs() </code>berfungsi untuk meminta daftar semua friends . Jadi di sini, seperti di <code>getUserInfo()</code>, kita buat variabel call yang bertipe <code>FacebookCall</code>. Berbeda dengan <code>getUserInfo()</code>, kita membuat objek <code>GetFriends</code> bukan <code>GetInfo</code>. Kita juga mengeset <code>onComplete_getFriendIDs()</code> sebagai listener untuk <code>FacebookEvent.COMPLETE</code>.</p>
<p>Kita tambahkan kode ke <code>getFriendIDs()</code> seperti berikut:</p>
<pre class="brush:as3">
private function getFriendIDs(uid:String):void {

	var call:FacebookCall = _session.facebook.post(new GetFriends(null, uid ));
	call.addEventListener(FacebookEvent.COMPLETE, onComplete_getFriendIDs);

}
</pre>
<p>Kita lanjutkan ke <code>onComplete_getFriendIDs()</code>.</p>
<p>Di sini data yang diterima bersama <code>FacebookEvent.COMPLETE</code> bertipe <code>GetFriendsData</code>. Jadi, pertama kita buat variabel lokal bernama data yang bertipe <code>GetFriendsData</code> dan mengisinya dengan <em>event data</em> yang sudah di-type-cast menjadi <code>GetFriendsData</code>.  Empat baris berikutnya, menampilkan banyaknya friends  yang bisa kita ketahui dari panjang properti friends.</p>
<p>Baris-baris berikutnya menampilkan semua ID friends, dengan memanfaatkan properti rawResult yang merupakan data bertipe <code>XML</code>. Di sini kita menggunakan sintaks <em>E4X</em> untuk mengakses semua node di dalam <code>XML</code> tersebut.</p>
<p>Baris terakhir, menggabungkan node value yang disimpan di dalam <code>Array</code> menjadi sebuah <code>String</code> dan menampilkannya.</p>
<pre class="brush:as3">
private function onComplete_getFriendIDs(e:FacebookEvent):void {

	if (!e.success) {
		_console.appendText("\n\n---\nERROR : " + ObjectUtil.toString(e.error));
		return;
	}

	var data:GetFriendsData = GetFriendsData(e.data);
	if (data.friends.length > 0) {
		_console.appendText(". You have " + data.friends.length + " friends.");
	}else {
		_console.appendText(". You have no friends.");
		return;
	}

	var xml:XML = new XML(data.rawResult);
	var ids:Array = [];

	for each( var x:XML in xml.*) {
		ids.push(x);
	}

	_console.appendText("Their IDs are : \n"+ ids.join(' , ') +"\n");
}
</pre>
<p>Sekarang kita coba jalankan aplikasi. Kalo semuanya benar, Anda akan lihat aplikasi berjalan seperti gambar di bawah ini. Kalo tidak, silakan cocokkan kode yang Anda tulis dengan<code> MainDesktop.as</code>.</p>
<div id="attachment_294" class="wp-caption aligncenter" style="width: 263px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/84" rel="attachment wp-att-294"><img src="http://masputih.com/uploads/2009/05/84-263x300.jpg" alt="Test Movie 2" title="Test Movie 2" width="263" height="300" class="size-medium wp-image-294" /></a>
	<p class="wp-caption-text">Test Movie 2</p>
</div>
<h3>Going Online</h3>
<p>Pertama saya sarankan Anda bikin satu account Facebook lagi, khusus untuk  simulasi penggunaan aplikasi oleh orang lain. Account ini sangat berguna khususnya waktu kita menguji proses otorisasi &amp; verifikasi karena developer account Anda secara otomatis mengotorisasi aplikasi yang Anda buat sendiri.</p>
<p>Supaya aplikasi kita bisa digunakan/dimuat ke dalam Facebook Canvas, kita perlu sedikit memodifikasi kode. Sebenarnya nggak banyak yang harus diubah, tapi lumayan bikin pusing karena dokumentasi yang nggak lengkap &amp; contoh-contoh aplikasi yang masih menggunakan API versi lama ( versi 2 ).</p>
<p>Ada beberapa cara untuk memuat aplikasi yang kita buat ke dalam Facebook Canvas. Informasi lengkapnya bisa Anda baca sendiri di  Facebook Architecture Overview.  Di sini, kita pilih cara yang paling gampang, dengan menggunakan salah satu tag FBML yaitu <code>fb:swf</code>.</p>
<p>Kita upload dulu file SWF aplikasi yg kita buat ke server. Terus kita buat file “index.php” yg isinya seperti ini:</p>
<pre class="brush:as3">
<fb:swf id="hello"
	swfsrc="http://facebook.masputih.com/hello-as3/HelloAS3.swf"
	swfbgcolor='FFFFFF'
	width="400" height="400"/>
</pre>
<p>Berikut ini struktur direktori di host saya. </p>
<div id="attachment_299" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/85" rel="attachment wp-att-299"><img src="http://masputih.com/uploads/2009/05/85-300x103.jpg" alt="Server Directory" title="FTP " width="300" height="103" class="size-medium wp-image-299" /></a>
	<p class="wp-caption-text">Server Directory</p>
</div>
<p>Kembali ke Application Settings di Facebook. Kita ubah tipe aplikasi menjadi “Web” lalu kita buka menu Canvas  dan kita masukkan juga URL dari file index.php yang sudah kita buat. Terakhir kita pastikan bahwa Render Method adalah FBML, bukan iFrame.</p>
<div id="attachment_302" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/86" rel="attachment wp-att-302"><img src="http://masputih.com/uploads/2009/05/86-300x128.jpg" alt="Application Type : Web" title="Application Type : Web" width="300" height="128" class="size-medium wp-image-302" /></a>
	<p class="wp-caption-text">Application Type : Web</p>
</div>
<div id="attachment_303" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/87" rel="attachment wp-att-303"><img src="http://masputih.com/uploads/2009/05/87-300x187.jpg" alt="Canvas &amp; Render Method" title="Canvas &amp; Render Method" width="300" height="187" class="size-medium wp-image-303" /></a>
	<p class="wp-caption-text">Canvas &amp; Render Method</p>
</div>
<h3>Verifikasi Session</h3>
<p>Pada saat sebuah SWF dimuat ke dalam canvas melalui fb:swf, Facebook akan menginjeksi flashvars. Yang dapat kita gunakan untuk memverifikasi apakah aplikasi sudah mendapat otorisasi untuk mengakses data adalah <code>fb_sig_session_key</code>. Gambar berikut ini menunjukkan isi flashvars yang diinjek oleh Facebook.</p>
<div id="attachment_304" class="wp-caption aligncenter" style="width: 283px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/88" rel="attachment wp-att-304"><img src="http://masputih.com/uploads/2009/05/88-283x300.jpg" alt="Session Key" title="Session Key" width="283" height="300" class="size-medium wp-image-304" /></a>
	<p class="wp-caption-text">Session Key</p>
</div>
<p>Buka file <code>MainWeb.as</code>, perbedaan dengan <code>MainDesktop.as</code>  hanya pada <code>checkSession()</code> yang berfungsi untuk mengecek keberadaan <em>session key</em>. </p>
<p>Kalo <em>session key</em> tidak ditemukan atau bernilai <code>null</code>, berarti user belum pernah menggunakan aplikasi ini sebelumnya, jadi di sini kita perlu memanggil<code> _session.login()</code>. Sebaliknya, kalo session key ditemukan, kita panggil <code>_session.verifySession()</code> yang kemudian akan melakukan koneksi dengan Facebook.</p>
<pre class="brush:as3">
private var _flashvars:Object;
private function initFacebookSession():void {

	_flashvars = this.root.loaderInfo.parameters;

	_console.appendText("\n\n---\Flashvars : " + ObjectUtil.toString(_flashvars));

	_session = new FacebookSessionUtil(Constants.API_KEY, Constants.SECRET_KEY, this.root.loaderInfo);
	_session.addEventListener(FacebookEvent.WAITING_FOR_LOGIN, onWaitingForLogin);
	_session.addEventListener(FacebookEvent.CONNECT, onFacebookConnect);

	checkSession();

}

/**
 * check the flashvars
 * if there's no session key, initiate a login process
 */
private function checkSession():void {

	_console.appendText("\n\n---\nChecking session key...");

	if (_flashvars.fb_sig_session_key != null) {
		_session.verifySession();
	}else {
		_session.login();
	}
}
</pre>
<p>Silakan akses aplikasi Anda melalui URL : http://apps.facebook.com/nama-aplikasi-anda/. Kalo semua sudah benar, Anda bisa melihatnya dimuat ke dalam Facebook Canvas. Teman Anda juga bisa menggunakan aplikasi ini.</p>
<p>Sebagai perbandingan, silakan coba aplikasi yang saya buat di sini : <a href="http://apps.facebook.com/hello-as/">http://apps.facebook.com/hello-as/</a></p>
<div id="attachment_305" class="wp-caption aligncenter" style="width: 232px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/89" rel="attachment wp-att-305"><img src="http://masputih.com/uploads/2009/05/89-232x300.jpg" alt="Facebook Application Test" title="Facebook Application Test" width="232" height="300" class="size-medium wp-image-305" /></a>
	<p class="wp-caption-text">Facebook Application Test</p>
</div>
<div id="attachment_308" class="wp-caption aligncenter" style="width: 205px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/90" rel="attachment wp-att-308"><img src="http://masputih.com/uploads/2009/05/90-205x300.jpg" alt="Application List" title="Application List" width="205" height="300" class="size-medium wp-image-308" /></a>
	<p class="wp-caption-text">Application List</p>
</div>
<p>Ok, mudah-mudahan tutorial ini bisa membantu Anda memahami Facebook ActionScript API.</p>
<p>Pada bagian berikutnya dari artikel ini, saya akan menjelaskan bagaimana saya membuat aplikasi Flex untuk Facebook yaitu :<a href="http://apps.facebook.com/fx-friendbrowser/"> Fx Friend Browser</a>.</p>
<p>Stay tuned! <img src='http://masputih.com/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<div id="attachment_311" class="wp-caption aligncenter" style="width: 300px">
	<a href="http://masputih.com/2009/05/facebook-as3-api-the-basics/attachment/93" rel="attachment wp-att-311"><img src="http://masputih.com/uploads/2009/05/93-300x223.jpg" alt="Fx Friend Browser" title="Fx Friend Browser" width="300" height="223" class="size-medium wp-image-311" /></a>
	<p class="wp-caption-text">Fx Friend Browser</p>
</div>
<h3>Links</h3>
<ul>
<li>Project file : <a href="http://masputih.com/wordpress/wp-content/plugins/download-monitor/download.php?id=helloas3.rar" title="Downloaded 576 times">→ HelloAS3.rar</a></li>
<li><a href="http://www.adobe.com/devnet/facebook/">Adobe Developer Connection : Facebook</li>
<li><a href="http://code.google.com/p/facebook-actionscript-api/" title="http://code.google.com/p/facebook-actionscript-api/">Facebook ActionScript API</a></li>
<li><a href="http://www.facebook.com/developers/">Facebook Developer Home</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://masputih.com/2009/05/facebook-as3-api-the-basics/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
