Ismail Hamzah

.NET
See also: Other Geeks@INDC

December 2007 - Posts

ANFIS, EWS dan Trauma Pribadi

Beberapa hari ini, saya merasakan jakarta memiliki suhu yang sudah sangat familiar sekali dengan tubuh saya. Yep, beberapa hari ini saya merasakan suhu di jakarta seperti suhu di bandung, sejuk. Mungkin karena seringnya suasana berawan yang diikuti angin kencang dan bahkan diselingi dengan hujan pada siang harinya. Sambil "nyengir" keheranan saya mengatakan pada diri saya sendiri, koq jakarta jadi dingin gini ya, jadi pengen beli "surabi imut" di gerlong, hehehe.

Namun tidak lama setelah itu, sensor trauma dalam diri saya menyala. Saya tiba-tiba teringat pengalaman seru yang cenderung menyebalkan yang pernah saya alami. Beberapa bulan setelah saya menginjakan kaki dijakarta, i've got my first banjir. Hehehe yep, saat itu adalah suatu pagi ketika saya berangkat dari kostan menuju lokasi projek pertama saya di Astra Internasional didaerah sunter jakarta utara. Sepanjang jalan Yos Sudarso saya mendorong motor berplat D kesayangan saya. Si sayang cuman keliatan Stang nya doang, sedangkan dari jok sampai kebawah bener2 nggak keliatan ditelen air banjir, buset!!!. Dengan fikiran yang butek sebutek air banjir, saya mendorong motor saya dari carefour cempaka mas sampai AI sunter. Gila.. saya dorong motor dari jam 7 pagi dan sampai ke AI sekitar jam 11, saya ingat hari itu adalah hari jum'at.

Selepas menikmati sensor traumatic, kemudian insting Geo Science saya bangkit mirip sebuah Event yang pasrah di perdaya oleh sang Handler perkasa. Sang Handler cuman berisi statement Response.Redirect yang mengalihkan perhatian saya pada Prof. The Houw Liong dan metode ANFIS nya. Pak The (dibaca te bukan deu), begitu biasa kami memanggilnya, adalah salah seorang Professor nyentrik kebanggaan orang fisika. Sedangkan ANFIS adalah kependekan dari "Adaptive Neuro-Fuzzy Inference Systems" yang merupakan sebuah metode yang mengkombinasikan artificial neural network dan Fuzzy. Metode ini dikembangkan oleh J.S Roger Jang yang digunakan untuk mengolah informasi "rancu". Saya nggak ada masalah dengan hal2 yang "rancu" yang nggak "precise" ini, karena setahun bermain dengan teori fractal dan non-euclidean geometry menjadikan saya sadar bahwa alam ini "tidak teratur secara teratur". I think its enough with SoftComputing thing and kembali ke laptop, hehehe.

Pak The menggunakan ANFIS untuk memprediksi periode banjir besar dengan menggunakan deret waktu bilangan bintik matahari. Oke, penjelasan ilmiah cukup bisa menenangkan lahir batin plus informasi tambahan tentang tahun-tahun berapa saja yang termasuk periode banjir, namun... hehehe this is where the fun begin, untuk kasus banjir di wilayah indonesia, hujan is not the defining factor, dan saya yakin temen2 dari teknik sipil dan temen2 dari planologi memiliki argumen yang lebih cantik mengenai hal ini. Jangankan diguyur oleh hujan akibat aktifitas matahari maksimum, diguyur oleh hujan normal saja sudah cukup banyak menimbulkan genangan di mana-mana. Saya sempat "nyengir" ketika berjalan di sekitar Sudirman akibat pengamatan sotoy saya tentang sistem drainage disekitar jalan dan berakhir pada bayangan sekelompok kura-kura ninja yang sedang asik berlatih sambil makan pizza di sebuah kota di luar sana. that's just my imagination.

Pengembaraan berakhir ketika ada MSN dari belanda, "Hi Ismail" hehehehe begitulah message yang muncul and i'm going back to work. silent voice in my heart: "Indonesia is a great and a cool country, letak geografis Indonesia mengharuskan Indonesia memiliki sistem tata kota yang super canggih dan sistem Early Warning Systems (EWS) yang outstanding, what can you do for that ismail huh, what can you do ismail"    :-)

selamat datang 2008

selamat tinggal 2007

life is cool huh :-)

Share this post: | | | |
Posted: Dec 29 2007, 08:57 AM by go2ismail | with 6 comment(s)
Filed under:
AJAX Sys.WebForms.PageRequestManagerParserErrorException

Kira-kira begitulah teriakan AJAX ketika dia lagi kebingungan.

Asynchronous (independent) postbacks melalui jalur "life cycle" yang sama dengan regular pages. Perbedaan terjadi pada saat rendering. Dengan AJAX, rendering terjadi secara partial yaitu rendering terjadi pada bagian yang berada di UpdatePanel saja. Proses render menggunakan "special format" yang hanya dimengerti oleh JavaScript di client.

Ketika ada interfensi terhadap data yang dikirimkan ke si client (yang dalam bentuk special format itu), maka format yang special tersebut akan rusak dan pada akhirnya si client jadi tidak memahami lagi format data yang diterimanya itu. Proses parsing gagal terjadi dan kemudian munculah error diatas.

Saya menemukan error diatas ketika mengerjakan sebuah module DNN yang terpaksa harus sedikit mengganggu "response stream" sehingga melakukan rendering di luar phase rendering. Luckily, saya menemukan blognya Eilon Lipton yang membahas hal ini dengan sangat bagus sekali. Saya mengikuti sarannya untuk tidak melakukan asynchronous postbacks, tapi melakukan regular postback dengan cara menambahkan PostBackTrigger.

note: DNN akan mendukung AJAX automatically jika ascx yang didaftarkan via module definitions di cek bagian supports partial rendering nya. Dengan men-cek checkbox tersebut maka DNN akan menambahkan scriptmanager dan updatepanel pada module secara "ajaib". saran Eilon yang nomor dua lah yang saya pilih karena alasan yang diungkapkan pada nomor satunya.    

Share this post: | | | |
Posted: Dec 18 2007, 03:15 PM by go2ismail | with no comments
Filed under:
DotNetNuke Page Rendering Process

Sebuah aplikasi web akan terdiri dari banyak halaman (file .aspx) dalam usaha menampilkan content dari aplikasi web tersebut. Berbeda dengan aplikasi web pada umumnya, sebuah aplikasi web DotNetNuke hanya menggunakan sebuah file aspx saja yaitu file Default.aspx. Ilusi yang terjadi ketika user mengklik menu item untuk berpindah dari satu halaman ke halaman yang lainnya di peroleh dengan suatu teknik yang disebut “Dynamic Page Rendering”. Jadi, meskipun hanya menggunakan sebuah file aspx saja (yaitu Default.aspx), user “seolah-olah” menjelajahi banyak halaman.

 

Sebuah halaman aplikasi web DotNetNuke terdiri dari satu atau lebih module. Module adalah sebuah entitas fungsional terkecil. Contoh-contoh module adalah: Module Hit counter, Module users online, Module User Account, Module Google Adsense, Module Blog, Module FAQ, Module Feedback, Module e-Commerce dan banyak lagi. Module bisa sangat sederhana dan bisa sangat rumit, bisa sesederhana module hit counter dan bisa serumit module e-Commerce. Truth to be told, module terdiri dari kumpulan file-file ascx yang memanfaatkan API dari DotNetNuke dan ASP.NET. (note: inilah alasan mengapa DotNetNuke disebut sebagai sebuah Framework bukan sekedar CMS biasa).

 

Informasi tentang sebuah halaman beserta module-module apa saja yang terkandung di halaman tersebut disimpan dalam database. Halaman yang satu dengan halaman yang lain bersifat unik. Sebuah halaman dapat diidentifikasi dan dibedakan dari halaman yang lainnya dengan menggunakan apa yang disebut “tabid” (dibaca: tab-id). Sebuah nilai tabid yang unik hanya untuk sebuah halaman saja. Sama seperti halaman, module-module dalam aplikasi web DotNetNuke diidentifikasi dan dibedakan dengan sebuah nilai unik yang disebut ModuleID. Module-module mana saja yang mengisi sebuah halaman dapat ditentukan dengan mudah karena didalam database, ModuleId dengan tabid memiliki relationship.

Ketika seorang user mengklik sebuah menu item untuk menuju pada sebuah halaman tertentu, proses behind the scene nya adalah:

  1. File Default.aspx di panggil
  2. Sebuah querystring dengan parameter tabid dilewatkan ke web server
  3. Nilai querystring tabid kemudian digunakan oleh DNN database server untuk memperoleh informasi moduleid yang ber-relasi dengan tabid tersebut.
  4. Informasi yang diperoleh DNN database server kemudian diberikan kepada web server
  5. Web server kemudian menggunakan informasi yang diperoleh dari database server untuk merender file Default.aspx (dynamic page rendering)
  6. User memperoleh halaman yang diinginkan.

 

 

 

Note: Fitur HumanFriendlyURL yang dibawa oleh DNN 4.7 akan lebih merampingkan tampilan URL aplikasi DotNetNuke. Tabid tidak akan lagi terlihat di address bar dari web browser. Informasi lebih lanjut mengenai HumanFriendlyURL dapat di lihat di blognya sang master DotNetNuke, Agung Riyadi.

Share this post: | | | |
Posted: Dec 16 2007, 02:41 PM by go2ismail | with 6 comment(s)
Filed under:
ASP.NET 2.0 Page Life Cycle
 

Menghafal page life cycle bukan merupakan hal yang mudah (setidaknya untuk saya), tapi beruntung ada artikel ini di codeproject yang mencoba memberikan ide bagaimana cara menghapal page life cycle melalui singkatan. Di artikel tersebut, page life cycle disingkat menjadi SILVER-U. 

 

 

S: Start

I: Initialize

L: Load

V: Validate

E: Event handling

R: Render

U: Unload

 

 Start

Pada fase ini properties page di set. Aksi meng-set Master page untuk user tertentu untuk meng-achieve “user preference settings” dapat dilakukan pada fase ini dengan cara menambahkan code pada handler dari event PreInit.

 

 Initialize

Pada fase ini, ID untuk control sudah di generate, namun properties yang lainnya belum ada. Initialization dapat di override dengan menggunakan method OnInit.

 

 Load

Fase ini sangat tepat digunakan untuk memanggil functions dan perform some logic. Pada fase ini control diisi data-data yang diperoleh dari view state dan control state (thanks to LoadViewState event dan LoadPostData event). Penambahan code dapat juga dilakukan pada handler dari event OnLoad karena pada fase inilah event tersebut dibangkitkan.

 

 Validate

Control di validasi dan terdapat event Validate yang dapat digunakan.

 

 Event Handling

Event handling server control terjadi pada fase ini. Modifikasi final dapat dilakukan dengan memanfaatkan event OnPreRender. Event SaveViewState digunakan untuk menyimpan value pada view state object. (note: event SaveViewState hanya akan menyimpan value pada view state object bukan pada control, karena modifikasi final pada control terjadi pada event OnPreRender).

 

 Render

Method Render menggunakan objek HtmlTextWriter sebagai parameter. Objek tersebut digunakan untuk meng-output HTML untuk ditampilkan di browser. Pada fase ini, page akan “memerintahkan” semua object yang dimilikinya untuk me-render dirinya sendiri menjadi HTML.

 

 Unload

Setelah HTML di render, semua object di-disposed yang diawali dengan pemanggilan event OnUnload pada setiap control di page yang kemudian pemanggilan event OnUnload pada page itu sendiri. Pada fase ini aman untuk men-dispose semua object yang masih tersisa (eg: open database connections dan open file streams).

 

 

Share this post: | | | |
Posted: Dec 10 2007, 02:24 PM by go2ismail | with 2 comment(s)
Filed under:
Custom Paging di ASP.NET 2.0 GridView

Paging di ASP.NET 2.0 GridView adalah sangat mudah karena ASP.NET 2.0 menyediakan default paging untuk GridView. Dengan men-check checkbox Enable Paging via Smart Tag atau menge-set properties AllowPaging dari si GridView menjadi True maka GridView sudah bisa support paging tanpa code sedikitpun. Namun demikian, kemudahan tersebut harus dibayar oleh berkurangnya performance aplikasi. Hal tersebut dikarenakan, default paging akan selalu mengambil semua records meskipun yang ditampilkan hanya sebagiannya saja (note: GridView akan menyeleksi data yang ditampilkan namun data source tatap akan selalu meretrieve seluruh records). Untuk scenario data yang sangat sedikit, default paging ini akan sangat membantu sekali tapi untuk scenario data yang berjumlah banyak akan berdampak pada turunnya performance. (note: scenario data banyak ini bisa “diakali” dengan teknik “caching data” dengan menggunakan SqlDataSource). 

 

Untuk scenario data yang berjumlah sangat besar diperlukan teknik lain untuk paging ini. Artikel ini akan mencoba untuk sedikit mengulas custom paging dengan menggunakan ObjectDataSource. Ide dari custom paging ini adalah teknik “selective data retrieving” yang dilakukan oleh stored procedure. Dengan menggunakan fitur ROW_NUMBER() dari MS SQL Server 2005, pembuatan stored procedure yang dikhususkan untuk custom paging akan menjadi sangat mudah. Berikut adalah dua hal yang harus dilakukan untuk meng-achieve custom paging:

  1. Mengkonfigurasi ObjectDataSource agar support custom paging
  2. Membuat stored procedure yang mendukung custom paging
 Konfigurasi ObjectDataSource 

ObjectDataSource adalah sebuah data source control yang didesain untuk mengakses data via sebuah object. Si object menyediakan data bisa dari web service, database dan juga bisa dari file XML. ObjectDataSource adalah penghubung antara web control (eg: GridView) dengan data yang disediakan oleh si object. Object yang hendak di bind ke ObjectDataSource harus memiliki method yang dapat mengakses stored procedure yang diperlukan untuk custom paging. Cara paling mudah untuk membuat object semacam ini adalah melalui pembuatan DataSet. TableAdapter dari DataSet memberikan kemudahan untuk mengkases stored procedure yang mana konfigurasinya dapat dilakukan secara visual. Karena konsep layering sudah umum digunakan dalam pembuatan aplikasi web, maka dalam artikel ini akan digunakan sebuah object dari Business Logic Layer (BLL) untuk di-bind ke ObjectDataSource.

   

Berikut adalah konfigurasi ObjectDataSource yang harus dilakukan untuk mendukung custom paging:

 

-         Set properties TypeName pada object yang hendak di-bind dengan ObjectDataSource.  

-         Set properties EnablePaging menjadi True.

-         Set properties SelectMethod pada method yang mengakses stored procedure untuk custom paging. Note: method tersebut harus berada pada object yang hendak di-bind dengan ObjectDataSource.  

-         Isikan nama parameter dari method yang digunakan pada properties SelectMethod ke properties StartRowIndexParameterName. Nama parameter yang diisikan adalah parameter yang menginput starting index. Note: stored procedure yang akan dibuat memiliki dua buah parameter, pertama: parameter untuk menginput starting index dan kedua: parameter untuk menginput jumlah records maksimal yang hendak di tampilkan.

-         Isikan nama parameter yang menginput jumlah maksimal records yang hendak di paging ke properties MaximumRowsParameterName.

-         Set properties SelectCountMethod pada method yang mengakses stored procedure untuk menghitung jumlah total records.

 

Berikut adalah conteh kode aspx dari ObjectDataSource:

 
<asp:ObjectDataSource 
            ID="ObjectDataSource1" 
            runat="server" 
            EnablePaging="True" 
            StartRowIndexParameterName="startRowIndex" 
            MaximumRowsParameterName="maximumRows"
            SelectCountMethod="GetJumlahRecordTerritories"
            SelectMethod="GetTerritoriesForPaging" 
            TypeName="TerritoriesManager">
            
 </asp:ObjectDataSource>
 
 

TerritoriesManager adalah nama object BLL yang hendak di-bind ke ObjectDataSource. SelectMethod yang digunakan adalah GetTerritoriesForPaging yang menggunakan dua buah parameter input. SelectCountMethod yang dipilih adalah GetJumlahRecordTerritories. Parameter input yang digunakan pada SelectMethod adalah startRowIndex dan maximumRows.

 

  Membuat stored procedure 

Stored procedure yang dibuat sebanyak dua buah. Yaitu GetTerritoriesForPaging dan GetJumlahRecordTerritories. Kedua buah stored procedure tersebut harus dapat diakses via object yang hendak di-bind dengan ObjectDataSource. Berikut adalah script stored procedure GetTerritoriesForPaging:

 
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
 
 
CREATE PROCEDURE [dbo].[GetTerritoriesForPaging]
(
      @startRowIndex          int,
      @maximumRows            int
)
AS
 
 
      SET @startRowIndex = @startRowIndex + 1
 
      SELECT 
            TerritoryID, 
            TerritoryDescription, 
            RegionID
      FROM
            (SELECT 
                  TerritoryID, 
                  TerritoryDescription, 
                  RegionID, 
                  ROW_NUMBER() OVER(ORDER BY TerritoryID) as RowNum
             FROM 
                  Territories
                  
            ) as TerrInfo
      WHERE 
      RowNum 
            BETWEEN @startRowIndex 
            AND (@startRowIndex + @maximumRows) - 1
 
  

Dapat dilihat bahwa ROW_NUMBER() akan menomori semua record yang telah diurutkan berdasarkan TerritoryID. Meskipun TerritoryID tidak berurutan, ROW_NUMBER() akan memberikan nomor yang berurutan pada setiap record. Nomor record yang berurutan disimpan pada kolom RowNum yang kemudian akan disaring menggunakan klausa WHERE.

 

Stored procedure yang kedua yang harus dibuat adalah stored procedure untuk menghitung jumlah total record.

 
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
 
 
CREATE PROCEDURE [dbo].[GetJumlahRecordTerritories]
AS
 
      SELECT COUNT(*)
      FROM Territories
 
 

Jumlah total records diperlukan untuk pembuatan index paging.

 

 

 

Share this post: | | | |
Posted: Dec 09 2007, 02:08 PM by go2ismail | with no comments
Filed under:
Event Handling ASP.NET 2.0 Part 2
  

Pada bagian satu telah dibahas pola fikir dari konsep Event Handling ini. Pembahasan dimulai dari penjelasan apa itu event dan diakhiri dengan bagaimana cara mengkonsumsi event tersebut. Karena delegate memiliki peranan yang sangat penting bagi event handling maka pada bagian satu dibahas juga sedikit mengenai delegate. Proses pelemparan event oleh event sender dan proses penggunaan event oleh event receiver telah digambarkan juga pada bagian satu secara sederhana dan menggunakan contoh.

 

Sekarang, pada bagian dua ini, akan dicoba untuk memaparkan sedikit konsep yang masih tertinggal di bagian satu. Konsep yang tertinggal itu adalah mengenai transfer data melalui event. Yes, event dapat membawa data.


 

 Sedikit Teori 

 

.NET telah menyediakan sebuah event delegate standar untuk digunakan yaitu delegate System.EventHandler. Delegate System.EventHandler ini menggunakan kelas System.EventArgs sebagai parameter yang akan membawa data.

 
delegate void EventHandler(object sender, EventArgs e);
 

Karena data yang dilewatkan melalui event ini akan sangat bervariasi maka pada kasus khusus kelas System.EventArgs tidak digunakan secara langsung. Tetapi, digunakan sebagai base class untuk sebuah kelas sesungguhnya yang sangat merepresentasikan data yang dibutuhkan. Sehingga dapat dikatakan, untuk kebutuhan data tertentu maka diperlukan sebuah kelas custom yang diturunkan langsung dari kelas System.EventArgs.

 

Jadi pada bab ini ada dua hal yang akan dilakukan:

  1. Membuat kelas custom yang merupakan kelas turunan dari kelas System.EventArgs. Kelas custom inilah yang akan membawa data via si event. Konvensi penamaan dari kelas custom ini adalah NamaEventEventArgs. Kelas custom ini kemudian akan digunakan menjadi parameter untuk event delegate.
  2. Membuat event delegate baru dengan menggunakan kelas dari point satu. Event delegate yang baru ini akan mengikuti konvensi penamaan sebagai berikut: “NamaEventEventHandler”. Event delegate yang baru ini akan digunakan untuk membuat sebuah event sehingga event yang terbuat dapat membawa data dari objek kelas custom dari point satu diatas.   

 

  Let’s See How “Rubber Meets the Road” 

 

Contoh yang digunakan masih sama seperti contoh pada bagian satu. Method Rename akan memanggil method yang akan membangkitkan event. Hal yang baru dari bagian dua ini adalah definisi kelas custom yang akan diturunkan langsung dari kelas System.EventArgs. Kelas baru tersebut akan menampung data Boolean yang akan mengindikasikan persetujuan untuk merubah nama atau tidak. Sebuah event akan dideklarasikan dengan menggunakan event delegate yang baru.

 

Berikut adalah kerangka source code yang akan dikembangkan:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class EventHandlerWithData : System.Web.UI.Page
{
 
}
// custom EventArgs class
public class GantiNamaEventArgs : EventArgs
{
 
}
// custom event delegate
public delegate void GantiNamaEventHandler(object sender, GantiNamaEventArgs e);
 
public class KelasSumber
{
    
}

 

 

Kelas GantiNamaEventArgs

 

Kelas ini diturunkan dari kelas System.EventArgs. Kelas GantiNamaEventArgs merupakan kelas custom yang akan membawa data tertentu. Pada contoh kali ini, kelas ini hanya akan membawa data Boolean yang akan mengindikasikan tentang persetujuan perubahan nama.

// custom EventArgs class
public class GantiNamaEventArgs : EventArgs
{
    private bool _approved = true;
    // constructor
    public GantiNamaEventArgs(bool approved)
    {
        _approved = approved;
    }
 
    public bool Approved
    {
        get
        {
            return _approved;
        }
    }
}
 

Delegate GantiNamaEventHandler

 

Agar event yang dibuat dapat membawa data yang dibungkus oleh kelas GantiNamaEventArgs, maka harus dibuat sebuah delegate dengan menggunakan kelas GantiNamaEventArgs sebagai parameternya. (Note: kemampuan sebuah event ditentukan oleh delegate pembentuknya. Sedangkan delegate ditentukan oleh parameter EventArgs nya.)

// custom event delegate

public delegate void GantiNamaEventHandler(object sender, GantiNamaEventArgs e);

 

Kemudian, event GantiNama akan dibuat dengan menggunakan  event delegate diatas.

 
// deklarasi event

    public event GantiNamaEventHandler GantiNama;

 

Karena event GantiNama didesain untuk membawa data maka method yang akan membangkitkan event ini sedikit dimodifikasi dengan menambahkan parameter. Parameter tersebut kemudian digunakan untuk meng-invoke delegate.

 
// method yang akan membangkitkan si event
    protected void OnGantiNama(GantiNamaEventArgs e)
    {
        GantiNamaEventHandler eh = GantiNama;
        if (eh != null)
        {
            // invokes the delegate
            eh(this, e);
        }

    }

 

Dalam contoh ini, data yang dibawa oleh si event akan digunakan oleh method handler. Pada method tersebut akan dilakukan pemeriksaan terhadap data persetujuan yang dibawa oleh event melalui kelas GantiNamaEventArgs.

 
// handler
    protected void test(object sender, GantiNamaEventArgs e)
    {
        // ekspresi e.Approved merupakan contoh penggunaan
        // data yang dibawa dari si event
        if (e.Approved)
        {
            Label1.Text = "Perubahan disetujui";
        }
        else
        {
            Label1.Text = "Perubahan TIDAK disetujui";
        }

    }

 

Adapun source code lengkapnya adalah sebagai berikut:

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class EventHandlerWithData : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
 
    }
    // handler
    protected void test(object sender, GantiNamaEventArgs e)
    {
        // ekspresi e.Approved merupakan contoh penggunaan
        // data yang dibawa dari si event
        if (e.Approved)
        {
            Label1.Text = "Perubahan disetujui";
        }
        else
        {
            Label1.Text = "Perubahan TIDAK disetujui";
        }
    }
 
    protected void Button1_Click(object sender, EventArgs e)
    {
        KelasSumber TestClass = new KelasSumber();
        // handler registration
        TestClass.GantiNama +=new GantiNamaEventHandler(test);
        TestClass.ApprovedPerubahan = false;
        Label2.Text = "Nama Default:" + TestClass.Nama;
        TestClass.Rename("Muhammad Irfan");
        Label3.Text = "Nama Baru:" + TestClass.Nama;
        
        
    }
}
// custom EventArgs class
public class GantiNamaEventArgs : EventArgs
{
    private bool _approved = true;
    // constructor
    public GantiNamaEventArgs(bool approved)
    {
        _approved = approved;
    }
 
    public bool Approved
    {
        get
        {
            return _approved;
        }
    }
}
// custom event delegate
public delegate void GantiNamaEventHandler(object sender, GantiNamaEventArgs e);
 
public class KelasSumber
{
    // data private
    private string _nama = "Ismail Hamzah";
    // properties untuk mengakses data private
    public string Nama
    {
        get
        {
            return _nama;
        }
    }
    // data private
    private bool _approvedPerubahan = true;
    // properties untuk mengakses data private
    public bool ApprovedPerubahan
    {
        set
        {
            _approvedPerubahan = value;
        }
    }
    // deklarasi event
    public event GantiNamaEventHandler GantiNama;
 
    // method yang akan membangkitkan si event
    protected void OnGantiNama(GantiNamaEventArgs e)
    {
        GantiNamaEventHandler eh = GantiNama;
        if (eh != null)
        {
            // invokes the delegate
            eh(this, e);
        }
    }
    // konsumsi
    public void Rename(string NewName)
    {
        GantiNamaEventArgs e = new GantiNamaEventArgs(_approvedPerubahan);
 
        if (_approvedPerubahan)
        {
            _nama = NewName;
            OnGantiNama(e);
        }
        else
        {
            OnGantiNama(e);
        }
       
    }
}
  

 

Share this post: | | | |
Posted: Dec 08 2007, 11:30 AM by go2ismail | with no comments
Filed under:
My "Ex", Outsourcing, and Cramer Method beat by Gauss-Seidel

Yes!!! week end. My week end dikagetkan oleh fakta-fakta makin "ngebutnya" India di dunia outsourcing. Bagaimana tidak, setelah IT, Call Center dan Back Office mereka kuasai, sekarang Equity Analyst untuk saham wall street pun di outsource kan ke India, phieuwhhh!!!. TATA Group, per 6 Desember 2007 memiliki nilai market capitalisation sebesar 72.2 billion USD!!! buseeet!!!  Saya harus bisa menjual minimal 32 buah "1000 MW nuclear power plant" dulu tuh untuk dapat membeli TATA Group, weleh weleh. (note: sebuah nuclear power plant berkekuatan 1000 MW dapat dibangun dengan harga 2 billion dan membutuhkan waktu lima tahun untuk jadi).

Ngomong-ngomong soal TATA Group, jadi inget lagi niy sama mantan pacar dulu yang seorang Civil Engineer. Once upon a time, pernah saya mencoba untuk membuat she kagum sama kemampuan programming ku yang sederhana. Dengan bangganya saya perlihatkan software simulasi reaktor nuklir PWR yang telah mengantarkanku untuk mendapatkan  nilai B pada mata kuliah pilihan: "Topik Khusus Reaktor Nuklir". She said: "oh.. good". Buat saya kata-kata "oh...good" itu not enough, passion nya nggak kerasa. Kemudian saya datang lagi dengan gambar-gambar fractal yang indah yang dihasilkan oleh Software Fractal Generator. Tapi masih saja she mengatakan "oh.. good". Lalu saya bilang "sayang, software ini saya buat sendiri loh, with my own library, i'm not using OpenGL". Dan she kemudian bilang "great". Masih, that's not enough for me, hambar, koq nggak ada "Wow" nya siy. Lalu dia nyeletuk: "sayang, kenapa siy masih pake Pascal". Hati langsung spontan mengatakan "what???", apakah ini masalahnya ya, apakah karena Pascal, I love Pascal, sampai sekarang. Apakah karena dia udah coding pake C++, mmhh...

Oke, i'll surprise her. Saya tanya temen deketnya dia dan asking apa siy problem kuliah pacarku itu yang belum ketauan solusinya. Lalu si temen menjawab, she lagi bingung dengan tugas tentang "Persamaan Linear Simultan". Dengan sombongnya saya berkicau, yes, metoda numeric, matrix matrix and matrix, "i've been doing Tensor in my Quantum Physics class" masa array 2D aja nggak bisa. Tanpa pikir panjang, saya gunakan metoda Cramer untuk solve the problem. Yes, saya masih tetep pake Pascal. Gila!!! susah banget, it took one whole week to solve the problem. Saya perlihatkan hasilnya, and again she said: "oh..great". Bete dong, langsung aja saya tanya: "kenapa siy nggak ada WOW nya?" sambil senyum she menjawab: "everybody know kalau Cramer kurang pas untuk mencari variable yang lebih dari 4 buah, i'm prefer using Gauss-Seidel iteration and i've already found the solution". Upss... i didn't know that :-) . Kemudian she nyeletuk lagi "kenapa siy masih pake Pascal aja", lalu saya jawab: "sayang nonton yuk" dan akhirnya she menjawab: "WOW that's great, yuk", hahaha.

mmhh... that's long time ago. sekarang pacarku seorang perawat Intensive Care Unit di Bandung, what should i do ya untuk membuat dia lebih terkesan lagi? ;-)

note: hehehe, stop trying!!! hahaha.

Share this post: | | | |
Posted: Dec 08 2007, 08:13 AM by go2ismail | with 6 comment(s)
Filed under:
Event Handling ASP.NET 2.0 Part 1
What is Event? 

Event adalah sebuah message yang dikirim oleh sebuah object untuk menandai kejadian sebuah aksi. Object yang membangkitkan event disebut sebagai Event Sender. Sedangkan object yang menangkap dan merespon pada event tersebut disebut sebagai Event Receiver. Kelas yang merupakan event sender tidak tahu object mana atau method mana yang akan menerima atau menangani event yang dia keluarkan. Yang dibutuhkan adalah perantara antara sender dan receiver. Perantara yang dimaksud kurang lebih sama seperti mekanisme pointer. .NET framework memperkenalkan tipe data “Delegate” yang akan memberikan fungsionalitas function pointer.

 

Delegate adalah sebuah kelas yang dapat menampung referensi (yaitu memory address) sebuah method. Beda dengan kelas-kelas lainnya, sebuah delegate memiliki signature. Referensi method yang dapat ditampung adalah referensi sebuah method dengan signature yang sama dengan signature yang dia miliki. Delegate memiliki banyak kegunaan dan Event Delegate adalah istilah yang digunakan untuk mengacu pada delegate yang digunakan untuk menangani Event Handling.

 

Event Delegate pada .NET framework memiliki dua buah parameter. Pertama adalah object yang merupakan sumber (sender/source) si event  dan kedua adalah data yang akan digunakan oleh event. Berikut adalah deklarasi dari delegate System.EventHandler.

 

delegate void EventHandler(object sender, EventArgs e);

 

What are the Ingredients? 

Dari sedikit introduction diatas maka terdapat dua buah kelas yang terlibat dalam event handling ini, yaitu pertama kelas yang merupakan sumber event dan kedua adalah kelas yang akan mengkonsumi atau menggunakan si event.

 
  1. Kelas Sumber Event (Sender/Source)
 

-         Mengandung deklarasi Event

-         Mengandung method yang akan membangkitkan Event. Method ini biasa diberi nama dengan tata cara penamaan sebagai berikut: “OnNamaEvent”

-         Method yang akan mengkonsumsi method “OnNamaEvent”

 
  1. Kelas Pengguna Event (Receiver)
 

-         Mengandung definisi handler. Handler adalah sebuah method yang akan diisikan (atau diikatkan) pada event. Oleh karena itu, handler harus memiliki signature yang sama dengan delegate yang digunakan oleh si event ( dengan kata lain harus memiliki signature yang sama dengan Event Delegate nya)

-         Mengandung method yang akan mengkonsumsi event. Satu hal yang harus ditekankan adalah di method inilah proses register (atau wiring) terjadi. Wiring adalah proses mengisikan alamat memory si handler ke si event.

   

Berikut adalah contoh proses Event Handling. Terdapat dua kelas yaitu pertama kelas KelasSumber yang merupakan source dan yang kedua adalah kelas EventHandlerNoData yang merupakan receiver.

 

using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
 
public partial class EventHandlerNoData : System.Web.UI.Page
{
    
}
 
public class KelasSumber