Mar 6

Beberapa decompiler untuk swf 9 / actionscript 3.0 sudah mulai bertebaran :

- Imperator Fla 4.0
- SoThink SWF Decompiler 4.0
- ASV 6.0

Tidak ada tempat yang benar-benar aman untuk coding..

Oct 12

Meski terasa sulit mengucapkannya, tetapi tetaplah tulus kami menghaturkannya :

/**
* @langversion Actionscript 3.0
*
*/
function selamatLebaranUntuk(penerima:Person):String{
 
   var teks:String = "Assalamualaikum " + 
      penerima.getNama() + "\n";
   teks += "Kami sekeluarga mengucapkan : \n";
   teks += "Minal Aidin Wal Faidzin\n";
 
 
   var arrayKhilaf:Array = 
      BukuKesalahanDanKhilaf.getKhilafTo(penerima);
 
 
   for(var i:int = 0; i<= arrayKhilaf.length; i++){
 
 
      var khilaf:Khilaf = arrayKhilaf[i] as Khilaf;
      teks += "Mohon Maaf Lahir dan Batin,\n";
      teks += "bila ada kesalahan berupa " + khilaf.detail + "\n";
      teks += "sewaktu " + khilaf.getTime() + "\n";
      teks += (khilaf.isSengaja) ? 
         "yang tersengaja \n" : 
         "yang tidak kami sadari\n\n" ;
   }
 
 
   teks += "\n\n";
   teks += "Di Idul Fitri 1428 H ini,";
   teks += "semoga tetap terjaga silaturahmi\n";
   teks += "dan kebersamaan kita\n";
   teks += "Wassalamualaikum Wr. Wb\n";
   teks += "Deden Ramadhan sekeluarga.";
 
 
   return teks;   
 
 
}
 
 
trace(selamatLebaranUntuk(anda));

Jul 30

Minggu kemarin pulang dari pelosok,
Setelah 20 km naik motor melewati jalan berpasir dan agak rusak.
Akhirnya sampai di jembatan pertama, berhenti sebentar di desa (Lampuyang) itu untuk mencari makan.
Baru turun dari motor, ternyata baru sadar kalo jalan didepan sudah dipenuhi banjir setinggi lutut.
Mestinya selama 20 km berikutnya aku pasti akan terjebak banjir.

Di hari-hari normal pun untuk melewati jalan Desa Lampuyang - Seranggas akan penuh perjuangan, karena rusak berat dan dipenuhi oleh kubangan disana-sini. Dan batang kayu banyak melintang disetiap badan jalan yang tertutup lumpur!
Apalagi sekarang banjir setinggi itu? Kasian motor dinasku! Kalo badan sih gak perlu dikasiani!

Akhirnya gak jadi makan, mending uangnya untuk ongkos nyewa perahu.
Ongkosnya, untuk 1 orang dengan 1 motor ditawarin oleh bapak yang punya perahu Rp. 40.000,-
Sebenarnya bisa ditawar sih. Tapi aku malas saja untuk nawar.
Apalagi bapaknya tahu kalo aku dokter yang tugas dikecamatan ini.

Kemudian selama perjalanan 15 km berikutnya, aku dan motorku numpang perahu, kemudian berhenti di desa Kuin.
Aku kira sudah terbebas banjir. Gak taunya masih ada, setinggi lutut lagi!! Terpaksalah dengan bersusah payah selama 1 jam, akhirnya bisa lega.
Selanjutnya 55 km sisanya bisa menikmati kembali perjalanan pulang yang dihiasi pemandangan kebun kelapa tiada henti-hentinya, diselingi hutan karet.

Katanya spesifikasi file SWF versi 9 sudah mulai di release ya?
(Taunya pas baca blognya Emmy Huang, kemarin).
Aku belum menyimak secara jelas, tapi kalo arsitektur SWF 9 termasuk spesifikasi file abc (actionscript byte code ) sudah diketahui secara jelas oleh publik, jadi akan tinggal menunggu waktu paling lama setengah tahun untuk mendapatkan decompiler file swf ya?

Siapa yang paling beruntung dengan di-release-nya spesifikasi swf-9 ini?

Yang pertama; Vendor-vendor lain yang selama ini mempunyai tool untuk meng-export animasi dan multimedia ke file SWF 8 dan sebelumnya, untuk di upgrade ke SWF 9.

Yang kedua; Para pembuat SWF alternative untuk aplikasi seperti Nicolas Cannase (HaXe), dan OpenLaszlo.

Yang ketiga; Para pembuat decompiler, deassembler, obfuscator flash dari yang proprietary sampai free, seperti Sothink, ASVGuy (Burak. K) dan Igor Kogan (Flasm dan Flare).

Selain itu para developer dan pemerhati flash awam seperti kita perlu mengetahui spesifikasi SWF 9 untuk sekedar menambah wawasan.

Jun 26

Pada penerapan OOP di Actionscript 3.0, konsep inheritance mempunyai dua kelemahan utama :

  • Kita tidak bisa mengubah ciri bawaan dari suatu object class sewaktu runtime. Contohnya sebuah class DesimalKorektor. Kita tidak akan bisa mengubah sebuah DesimalKorektor menjadi DesimalKorektorDuaDigit sewaktu runtime bila kita memakai konsep inherintace secara klasik.
  • Semakin kita banyak menggunakan permutasi, akan semakin susah memakai beberapa class di package kita. Lebih jelasnya begini ; jika anda ingin meng-extend-kan sebuah class DesimalKorektor supaya lebih scalable, anda mungkin akan membuat subclass ScalableDesimalKorektor dari DesimalKorektor. Untuk membuat DesimalKorektor yang bisa di-undo, anda mungkin akan membuat subclass UndoableDesimalKorektor. Tetapi, bagaimana caranya bila kita ingin mengkombinasikan fitur-fitur dari beberapa subclass tadi menjadi satu subclass (sewaktu runtime)? Dengan inheritance anda harus mendeklarasikan subclass tadi untuk menambahkan fitur baru. Setiap fitur baru akan meningkatkan jumlah class yang diperlukan, sehingga akan diperlukan usaha lebih dalam management-nya.

Pada beberapa “aliran” developer, ada yang melakukan beberapa metode untuk menanggulangi kelemahan dari inheritance ini. Diantaranya dengan menggunakan “Decorator Pattern”. Untuk menambahkan fitur baru pada suatu subclass, Decorator Pattern lebih menerapkan konsep komposisi dibandingkan pewarisan dari inheritance. Sehingga akan menjadi mungkin untuk menambahkan ciri baru dan mengubah perilaku (behavior) dari class tersebut sewaktu runtime.
Prinsip utama dari Decorator Pattern adalah setiap object decorator dengan type tertentu dapat menambahkan atau merubah behavior dari object yang di “decor”. Sang class Decorator dan class yang di “décor” harus meng-implement interface yang sama.

Decorator Pattern terdiri dari :

  • Decorator / decorated (interface)
  • Concrete decorated (class)
  • Absctract decorator (class)
  • Concrete decorator (class-class)

Di posting berikutnya akan kita bahas masing-masing elemen diatas.

Jun 8

Kapan sebaiknya kita memilih menggunakan antara get/set atau public variable di class kita?
Dalam beberapa situasi, penggunaan get/set mempunyai keuntungan tersendiri.
Sebaliknya pada situasi lain public variable akan lebih efektif dibandingkan get/set

Sedangkan dalam penggunaannya, bentuk pemanggilan keduanya mempunyai kesamaan.

//Contoh penggunaan public variable dan get/set
myClass.myPublicVariable = true;
//atau
trace(myClass.myPublicVariable);

 

Pendeklarasian public variable :

/** 
* Contoh deklarasi public var di myClass
*/
[Bindable]
public var myPublicVariable:Boolean = true;

Pada kondisi bila tidak ada tindak lanjut tambahan (additional actions) ketika variable berubah value, maka penulisan public variable lebih baik dibandingkan get/set.

Pada contoh diatas bila myPublicVariable diubah value-nya maka binding akan di-update, dan segala object component yang ter-bound dengan binding variable tadi juga ter-update. Sehingga tidak perlu menggunakan get/set disini.

Pendeklarasian get/set function :

/**
* Contoh deklarasi public get/set di myClass
*/ 
[Bindable(event="publicVarUpdated")]
public function set myPublicVariable(val:Boolean):void{
 
_myVar = val;
 
_counterSet++;
 
otherFunction();
 
dispatchEvent(new FlexEvent("publicVarUpdated"));
 
}  
 
public function get myPublicVariable():Boolean{
 
_counterGet++;
 
otherFunction2();
 
    return _myVar;
 
}
 
private var _myVar:Boolean;
private var _counterSet:int;
private var _counterGet:int;

Pada contoh diatas baris [Bindable(event=”publicVarUpdated“)] menunjukkan bahwa setiap component / object lain yang ter-bound ke property myPublicVariable akan langsung meng-update value-nya ketika event dengan type “publicVarUpdated” di-dispatch. Anda perhatikan di function setter-nya terdapat baris untuk dispatchEvent ketika myPublicVariable di-set, yang akan langsung memberitahukan ke semua component/ object yang ter-bound ke property myPublicVariable ini untuk segera meng-update value sesuai nilai terbaru.

Keuntungan utama dari get/set adalah mereka memungkinkan serangkaian perintah tambahan dieksekusi dalam satu pemanggilan function get/set. Anda dapat membuat class/component anda untuk langsung memanggil fungsi tertentu ketika get/set dipanggil, seperti contoh diatas.

Dalam framework Adobe Flex component, get/set banyak dipakai terutama untuk dispatch custom event, mengganti style component, layout, measure dan lain-lain.

May 16

Overloading & Rest parameters.

Overloading adalah suatu kondisi dimana sebuah object / class mempunyai 2 (dua) atau lebih metode / fungsi dengan nama sama tetapi berbeda argument (parameter). Overloading kerap kita temui di pemrograman java.

Salah satu contoh overloading di java :

 
    /**
     * @langversion java
     *
     *
     * Tutup koneksi cara 1
     * @param ps
     * @param c
     */
    public static void closeConnection(PreparedStatement ps,
Connection c)
    {
        try
        {
            if (ps != null)
            {
                ps.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        try
        {
            if (c != null)
            {
                c.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    } 
 
/**
     * Tutup koneksi cara 2
     * @param c
     */
    public static void closeConnection(Connection c)
    {
        try
        {
            if (c != null)
            {
                c.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
 

Sampai saat ini, Actionscript masih belum mendukung overloading. Tetapi ada bentuk penulisan lain sebagai alternatif untuk overloading yang ada di Actionscript 3.0 yaitu rest parameters. Rest parameter memperbolehkan kita menggunakan 0 (nol) atau lebih parameter tambahan dengan “unknown types” kepada suatu fungsi.
Anda mendeklarasikan rest parameter dengan menggunakan nama parameter yang didahului dengan 3 titik.
Didalam badan metode, nilai dari rest parameter diakses sebagai sebuah array.
Salah satu contoh rest parameter di Actionscript 3.0 :

/**
* @langversion Actionscript 3.0
*
*/
 
function contoh(...rest):String { 
var b:String = "rest terdiri dari :";
 
// akses isi dari rest parameter (Array)
for(var i:uint = 0; i < rest.length; i++) {
 
b += " " + rest[i];
 
}
return b;
}
 
 
// pemanggilan
 
contoh("test");
// output :
// rest terdiri dari : test
 
contoh("test", "satu", "dua", "tiga");
// output :
// rest terdiri dari : test satu dua tiga

Note : Overloading disini tidak sama dengan overloading operator di C++

May 13

Tanya Datum?

Untuk menunjukkan suatu posisi di bumi kita, sudah pasti diperlukan koordinat. Satu titik koordinat terdiri atas latitude dan longitude (garis lintang dan garis bujur). Penggambaran garis-garis latitude dan longitude akan berupa jaring (tile) bidang-bidang kotak bila dilihat dari peta / map 2D. Tetapi untuk peta yang lebih baik biasanya mampu menunjukkan tile dari latitude dan longitude yang bervariasi bentuk bidangnya (agak membulat), dari yang kotak sampai trapesium sampai segitiga, ini dimaksudkan untuk menunjukkan perhitungan matematis permukaan bumi yang membulat (geosphere)! Sampai disini bisa dibayangkan?

Bentuk bidang (yang dibentuk tile latitude dan longitude) yang berbeda-beda tadi digunakan untuk memetakan area-area ditempat yang berbeda dipermukaan bumi. Konsep ini dikenal sebagai ellipsoid. Sebuah Datum akan bereferensi kepada bentuk bidang tertentu tadi dipermukaan bumi, ini disebut dengan Rujukan Ellipsoid. Dari semua Datum yang dikenal, semuanya memiliki dua perbedaan utama, yaitu posisi asal (origins) tempat referensi dipermukaan bumi, dan rotasi (terhadap kelengkungan permukaan bumi), akibatnya kedua faktor ini akan mempengaruhi representasi numerik dari suatu posisi.

Kenapa anda mesti repot dengan Datum?

Bila anda memiliki 2 peta suatu wilayah, dan keduanya memiliki grid latitude dan longitude yang digambar dengan Datum yang berbeda, maka bentuk ellipsoid dari setiap tile di grid yang terdapat dikedua peta tersebut akan berbeda. Misalnya suatu wilayah di Australia bila dibandingkan di kedua peta yang masing-masing memakai Datum AGD66 dan WGS 84 akan menunjukkan perbedaan posisi yang mencapai 200 meter (0,1 mil). Bayangkan bila sebuah rudal salah sasaran hanya karena perbedaan Datum antara komandan dan juru tembak.

Untungnya setiap GPS devices sudah mempunyai kebijakan tentang Datum dalam penggunaan navigasinya. Pada merk Garmin dan Magellan, konstanta Datum yang digunakan selalu WGS 84 (default), sedangkan Lowrance/Eagle sebagian besar mengkuti WGS 84.

Salah satu penerapan Datum yang berguna : Pengukuran jarak antara 2 posisi di geosphere.

Pengukuran jarak antara 2 posisi di objek bulat-absolut tidak persis sama dengan permukaan bumi. Dan pasti sangat berbeda bila dibandingkan dengan pengukuran posisi di bidang datar yang cukup memakai Pythagoras. Dikarenakan bumi tidak bulat sempurna karena bentuknya yang sedikit mendatar di kedua kutubnya terhadap radius ekuator.

Sebuah Rujukan Ellipsoid (Reference Ellipsoid) yang diwakili Datum biasanya terdiri dari 4 parameter :

  • Radius Ekuatorial (a)
  • Faktor Flattening/ perataan (f) (berbanding terbalik, sehingga dituliskan 1/f).
  • Delta a (selisih Radius Ekuatorial suatu Datum dengan Radius Ekuatorial Datum WGS 84) dalam meter
  • Delta f (selisih Faktor Flattening suatu Datum dengan Faktor Flattening Datum WGS 84) dikalikan dengan 10^4.

WGS 84 mempunyai Radius Ekuatorial 6378137.0 dan Faktor Flattening 1/298.257223563.
Sampai saat ini aku mengetahui ada sekitar 23 Datum yang terdaftar di Reference Ellipsoid List

Selanjutnya cara perhitungan jarak antara 2 posisi di geosphere akan hampir sama dengan perhitungan di objek bulat-absolut, tinggal memperhitungkan faktor parameter yang berpengaruh diatas.

Case 1 : Pengukuran jarak 2 posisi di geosphere dengan Datum WGS 84 di Actionscript 3.0

Ringkasnya kita langsung membuat static class dengan nama Distance (Class ini kupakai pada proyek pembuatan Map Vector Sampit di Flex 2.0.1), dan Flash Player API yang diperlukan adalah flash.geom.Point (Nggak perlu panjang lebar lagi kan? Ntar malah dikira mau bikin Wiki entries, he3x!).

package com.dy.utils
{
    import flash.geom.Point;
 
    /**
     * Class Distance untuk mengukur jarak 2 posisi di Geosphere.
     * Datum WGS 84
     */
    public class Distance
    {
 
 
        /**
        * Static var : Radius Ekuatorial
        */
        private static const a:Number = 6378137;
 
 
        /**
        * Static var : Faktor Flattening/ perataan 
        */
 
 
        private static const f:Number = 1/298.257223563;
 
        private static const f2:Number = 2*f - f*f;
 
 
        /**
         * Fungsi utama untuk pengukuran.
         * Point.y = latitude dengan format dd.ddddd
         * Point.x = longitude dengan format dd.ddddd
         * @param point1 Posisi awal pengukuran
         * @param point2 Posisi akhir pengukuran
         * 
         * @return Jarak
         */
 
 
        public static function measure( point1:Point, 
point2:Point):Number{
 
/*
* Cari representasi 3D dari posisi awal
*/
var fSinB1:Number = Math.sin(point1.y * Math.PI/180);
var fCosB1:Number = Math.cos(point1.y * Math.PI/180);
var fSinL1:Number = Math.sin(point1.x * Math.PI/180);
var fCosL1:Number = Math.cos(point1.x * Math.PI/180);
//perhitungkan Radius Ekuatorial terhadap posisi awal            
var N1:Number = a /Math.sqrt(1 - f2 * fSinB1 * fSinB1);
var X1:Number = N1*fCosB1*fCosL1;
var Y1:Number = N1*fCosB1*fSinL1;
var Z1:Number = (1 - f2)*N1*fSinB1;
 
 
/*
* Cari representasi 3D dari posisi akhir
*/
 
 
var fSinB2:Number = Math.sin(point2.y*Math.PI/180);
var fCosB2:Number = Math.cos(point2.y*Math.PI/180);
var fSinL2:Number = Math.sin(point2.x*Math.PI/180);
var fCosL2:Number = Math.cos(point2.x*Math.PI/180);
//perhitungkan Radius Ekuatorial terhadap posisi akhir
var N2:Number = a/Math.sqrt(1 - f2*fSinB2*fSinB2);
var X2:Number = N2*fCosB2*fCosL2;
var Y2:Number = N2*fCosB2*fSinL2;
var Z2:Number = (1 - f2)*N2*fSinB2;
 
 
//cari selisih jaraknya
 
 
var D:Number = Math.sqrt((X1 - X2)*(X1 - X2) + 
(Y1 - Y2)*(Y1 - Y2) + (Z1 - Z2)*(Z1 - Z2));
var R:Number = N1;
var D2:Number = 2*R* Math.asin(.5*D/R);
 
return D2;
        }
    }
}

Download Class Distance di-sini

Coba di aplikasi di bawah ini (Flash Player 9 required):

 

 

Case 2 : Hasil Pengukuran Benchmark.

 

Pengukuran posisi antara Point(lon:36.91672, lat:55.73837) dan Point(lon:37.35804, lat:57.14513) menghasilkan 158989.00805546957 meter atau 158.99 km di Actionscript 3.0. Dibawah ini hasil perbandingan pengukuran jarak yang identik dari beberapa mapping software untuk cross cek :

  • MapSource : 156,10 km
  • OZI : 159,07 km
  • GPSMapEdit : 158.7 km
  • Actionscript 3.0 : 158.99 km

Tuh kan beda? Untuk Actionscript 3.0 perbedaan mungkin karena hasil penanganan float yang diwakili oleh type variable Number oleh Flash Payer yang tidak persis sama dengan di bahasa native C/C++ kali? Lha yang bikin bingung, bukannya MapSource, OZI dan GPSMapEdit sama-sama native? malah ikutan beda satu sama lain? Ada penjelasan?

« Previous Entries Next Entries »