Just a quick note about how to check whether an object is null or not in Objective-C. In java, it is easy to do that through 'null' keyword. While in Objective-C, there are two keywords, 'NULL' and 'nil', to deal with that action. What is the difference? NOTHING. Both keywords point to __DARWIN_NULL which is defined as : #define NULL ((void *)0) . It means, they point to address 0 in memory.
When we release an object using [object release], don't forget to set it to nil or NULL because when we compare it in 'if' statement, it won't be true because it is still pointing to its old address.
For example:
MyViewController c = [[MyViewController alloc] init];
[c release];
If we compare it in 'if' statement if(c), the statement will return true because the pointer is still pointing to its address even tough we have released it before. We need to set it to nil or NULL c = nil to make it point to address 0. After we do that, if(c) will return 0, which is false in C.
Monday, September 13, 2010
Tuesday, August 3, 2010
Objective-C Event Handling Overview
Objective-C manages user input event as responder chain. It goes backward up from the first responder (object that user is interacting with) until application delegate at the top most.

UIResponder contains methods to catch events. When we create a view as subclass of UIView, it inherits methods to access the events.

We can handle the events by implementing those methods. Following MVC pattern, usually we will delegate it to a controller.
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[controller doSomething];
}
UIControl Target Action Events
When we work with events, the UIResponder class holds many of the methods critical for event control. Similarly, we can access a lot of the methods important to SDK controls through the UIControl class. UIControl is a child of UIView (and thus UIResponder).
The UIControl object introduces a whole new event-handling infrastructure that takes touch events and (eventually) converts them into simple actions, without having to worry about the specifics of how a user accessed control.

When a touch event arrives at a UIControl object (via normal dispatching along the responder chain), the control does something unique. Inside the standard UIResponder methods (such as touchesBegan:withEvent:), a UIControl object turns standard touch events into special control events. These control events broadly describe how the user has interacted with the controls rather than just recording gestures. For example, they might report that a button has been pushed or a slider moved.
Once a standard event has been turned into a control event, a sequence of additional methods is called. First, the UIControl object calls sendActionsForControlEvents:. That in turn breaks down the events it’s been sent and calls sendAction:to:forEvent:, once per event. Here the control event is turned into an action, which is a specific method that’s going to be run in a specific target object. Finally the UIApplication method sendAction:to:fromSender:forEvent: is called by the control, again once per event.
That whole process can be slightly exhausting, and fortunately we shouldn’t normally need to know its details. For our purposes, we should be aware that a UIControl object turns a touch event first into a control event and then into an action with a specific recipient. Even better, it’s only the last part of that conversion, from control event into targeted action, which we need to code.
Summary
Events are catched by the view (UIView) and then, following MVC pattern, they are delegated to the controller to be handled.
UIResponder contains methods to catch events. When we create a view as subclass of UIView, it inherits methods to access the events.
We can handle the events by implementing those methods. Following MVC pattern, usually we will delegate it to a controller.
-(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
[controller doSomething];
}
UIControl Target Action Events
When we work with events, the UIResponder class holds many of the methods critical for event control. Similarly, we can access a lot of the methods important to SDK controls through the UIControl class. UIControl is a child of UIView (and thus UIResponder).
The UIControl object introduces a whole new event-handling infrastructure that takes touch events and (eventually) converts them into simple actions, without having to worry about the specifics of how a user accessed control.
When a touch event arrives at a UIControl object (via normal dispatching along the responder chain), the control does something unique. Inside the standard UIResponder methods (such as touchesBegan:withEvent:), a UIControl object turns standard touch events into special control events. These control events broadly describe how the user has interacted with the controls rather than just recording gestures. For example, they might report that a button has been pushed or a slider moved.
Once a standard event has been turned into a control event, a sequence of additional methods is called. First, the UIControl object calls sendActionsForControlEvents:. That in turn breaks down the events it’s been sent and calls sendAction:to:forEvent:, once per event. Here the control event is turned into an action, which is a specific method that’s going to be run in a specific target object. Finally the UIApplication method sendAction:to:fromSender:forEvent: is called by the control, again once per event.
That whole process can be slightly exhausting, and fortunately we shouldn’t normally need to know its details. For our purposes, we should be aware that a UIControl object turns a touch event first into a control event and then into an action with a specific recipient. Even better, it’s only the last part of that conversion, from control event into targeted action, which we need to code.
Summary
Events are catched by the view (UIView) and then, following MVC pattern, they are delegated to the controller to be handled.
Wednesday, July 21, 2010
Delegate
Usually if we want to add new behavior in an existing object, we do inheritance. For example if we have class Apple below:

If we want the Apple class to have a new behavior such as growAppleInDesert(), we have some options:
1. Put the new method in interface or parent class, IFruit. This will apply to all subclasses, however.
2. Put the new method in Apple class. This can be done; however, if our Apple class is a simple UI, adding the action growAppleInDesert() here will break layering pattern.
3. Subclass Apple to create new class, say DesertApple. This is what OO design pattern suggested.
4. Create new class, say AppleGrowAction which contains growAppleInDesert() , growAppleInMeadow(), etc. Our current Apple object can then refer to the new AppleGrowAction class to call its methods. This is known as delegate.
5. Using "Category" feature of Objective-C. This will be explained later.
Another example is if we want to create a new component from an existing one. We have some options:
1. We can inherit the existing component; however, if the component has so many methods, we will end up having those methods in our class.
2. Put the component as delegate, our new component will only need to call methods in existing component.
In Cocoa Framework, delegate usually implemented as protocol. For example if we have a control UITextField, we will need to implement UITextFieldDelegate protocol in order to handle text field event.

In Java it is common to do (3) or (4), but, in Objective-C, (4) is widely used. It is called delegation because we delegate some tasks to another object.
Category
Category is an Objective-C feature that allows us to extend the capability of a given class. This feature works even if we do not have access to the source code of the class we are extending. When we extend a given class through a category, the extension is inherited by all its subclasses. Of course, the additional methods defined by the category are only seen by our program.
To illustrate this feature, let us extend the NSObject class by adding an instance method to it:
If we want the Apple class to have a new behavior such as growAppleInDesert(), we have some options:
1. Put the new method in interface or parent class, IFruit. This will apply to all subclasses, however.
2. Put the new method in Apple class. This can be done; however, if our Apple class is a simple UI, adding the action growAppleInDesert() here will break layering pattern.
3. Subclass Apple to create new class, say DesertApple. This is what OO design pattern suggested.
4. Create new class, say AppleGrowAction which contains growAppleInDesert() , growAppleInMeadow(), etc. Our current Apple object can then refer to the new AppleGrowAction class to call its methods. This is known as delegate.
5. Using "Category" feature of Objective-C. This will be explained later.
Another example is if we want to create a new component from an existing one. We have some options:
1. We can inherit the existing component; however, if the component has so many methods, we will end up having those methods in our class.
2. Put the component as delegate, our new component will only need to call methods in existing component.
In Cocoa Framework, delegate usually implemented as protocol. For example if we have a control UITextField, we will need to implement UITextFieldDelegate protocol in order to handle text field event.
In Java it is common to do (3) or (4), but, in Objective-C, (4) is widely used. It is called delegation because we delegate some tasks to another object.
Category
Category is an Objective-C feature that allows us to extend the capability of a given class. This feature works even if we do not have access to the source code of the class we are extending. When we extend a given class through a category, the extension is inherited by all its subclasses. Of course, the additional methods defined by the category are only seen by our program.
To illustrate this feature, let us extend the NSObject class by adding an instance method to it:
Tuesday, July 20, 2010
Java reference, Objective-C retain count
Java
How Java's garbage collector knows that an object must be destroyed? An object is a candidate for garbage collector if they lose all its references. For example Object B below. It is referred by variable B1 and B2. Once both B1 and B2 lose reference to it, none knows that it exists, then it becomes candidate for garbage collector.

Objective-C
Objective-C on the other hand, uses different approach. Each object holds a variable named retainCount. It is set to 1 the first time the object created. It is incremented anytime the object retained or copied. It is decremented anytime it is released. When the retainCount equals zero, the object is destroyed.
Those differences happen because they use different approach in memory management. Java depends on its garbage collection algorithm to release unused memory, while Objective-C gives programmers more responsibility to release their objects. If you allocate memory, it is your responsibility to release it.
How Java's garbage collector knows that an object must be destroyed? An object is a candidate for garbage collector if they lose all its references. For example Object B below. It is referred by variable B1 and B2. Once both B1 and B2 lose reference to it, none knows that it exists, then it becomes candidate for garbage collector.
Objective-C
Objective-C on the other hand, uses different approach. Each object holds a variable named retainCount. It is set to 1 the first time the object created. It is incremented anytime the object retained or copied. It is decremented anytime it is released. When the retainCount equals zero, the object is destroyed.
Those differences happen because they use different approach in memory management. Java depends on its garbage collection algorithm to release unused memory, while Objective-C gives programmers more responsibility to release their objects. If you allocate memory, it is your responsibility to release it.
However, since XCode 4.2 Apple has put new feature called ARC (Automatic Reference Counting) to ease developers’ job dealing with allocating and releasing memory. It is sort of AOP implementation in Objective-C for me.
Using ARC, we don’t need to release memory we allocated before, in other words we don’t need to deal with retain-release code anymore. The compiler takes care the code of retaining-relasing objects. At compile time, the compiler crosscuts your code and adds some line of retain-release code. Using ARC we now only have to deal with our logic.
Java Environment
The picture above tells us a big picture of Java. Some codes written in Ada, Cobol, and C can be compiled into java byte code. The .class java byte code then translated by JVM into native machine language.
So, what is JVM? Lets see java installation directory:
1. JDK = java programs (java.exe, javac.exe, jar.exe, etc) + JRE
2. JRE = collection of Java API (lang, util, text, io, net, math, nio)
3. JVM = instance of JRE
Another term is JIT which is a part of JVM that compiles java byte codes that have similar functionality at the same compiling time so it will reduce compile time.
Java Heap Space
Heap is a part of memory used by JVM to allocate objects. There are three types of Java heap space:
1. Young Generation: Space to save short-live objects, they are method-scope objects or loop-scope objects.
2. Old/Tenured Generation: Space to save long-live objects, they are class-scope and application-scope objects.
3. Permanent Generation (permgen): Space to save class definition and its metadata.
There are some arguments that can be used to configure heap space:
1. -Xmx256M : Maximum heap space value is 256 MB.
2. -Xms128M: Initial heap space value is 128 MB. It will grow until xmx value is reached.
3. -Xmn64M: Heap space allocated for young generation.
There is nothing mentioned about default java heap space. It varies between machine, but wikipedia says it is 128M.
Saturday, July 17, 2010
Java Block (Static, Non static, Constructor)
Hanya untuk pengingat saja, daripada terus googling
public class TestBlock {
{
System.out.println("This is object block...");
}
public TestBlock() {
System.out.println("This is constructor...");
}
static {
System.out.println("This is static block...");
}
public static void main(String args[]) {
TestBlock obj1 = new TestBlock();
TestBlock obj2 = new TestBlock();
}
}
Hasil :
This is static block...
This is object block...
This is constructor...
This is object block...
This is constructor...
Dari hasilnya, ketahuan urutan eksekusi dan jumlah eksekusi.
public class TestBlock {
{
System.out.println("This is object block...");
}
public TestBlock() {
System.out.println("This is constructor...");
}
static {
System.out.println("This is static block...");
}
public static void main(String args[]) {
TestBlock obj1 = new TestBlock();
TestBlock obj2 = new TestBlock();
}
}
Hasil :
This is static block...
This is object block...
This is constructor...
This is object block...
This is constructor...
Dari hasilnya, ketahuan urutan eksekusi dan jumlah eksekusi.
Sunday, November 1, 2009
Design Pattern in Brief (10)
Facade
Facade digunakan untuk menyembunyikan kompleksitas dan dependency terhadap subsystem. Jika tidak menggunakan facade client akan langsung berhubungan dengan subsystem sehingga terjadi tight couple seperti gambar berikut :

Namun dengan memanfaatkan facade maka antara client dan subsystem menjadi lebih loose coupling seperti gambar berikut :

Berikut adalah contoh untuk lebih memahami pattern facade : Misalkan kita memiliki tiga bean yaitu Address, Account, dan CreditCard. Kita ingin menyimpan data ketiganya tanpa client harus mengetahui ketiga bean tersebut. Di sinilah facade berperan. Berikut adalah gambar ketiga bean dan facade tersebut :


Berikut beberapa catatan penting tentang facade :
- Facade seharusnya tidak didesain untuk menyediakan fungsi tambahan
- Jangan pernah mengembalikan return value berupa komponen dalam subsystem kepada client. Sebagai contoh jangan pernah memiliki method seperti CreditCard getCreditCard() karena client akan mengetahui isi subsystem dan penggunaan facade menjadi tidak jelas.
- Penggunaan facade seharusnya untuk melakukan business service, bukan individual task.
Facade digunakan untuk menyembunyikan kompleksitas dan dependency terhadap subsystem. Jika tidak menggunakan facade client akan langsung berhubungan dengan subsystem sehingga terjadi tight couple seperti gambar berikut :

Namun dengan memanfaatkan facade maka antara client dan subsystem menjadi lebih loose coupling seperti gambar berikut :

Berikut adalah contoh untuk lebih memahami pattern facade : Misalkan kita memiliki tiga bean yaitu Address, Account, dan CreditCard. Kita ingin menyimpan data ketiganya tanpa client harus mengetahui ketiga bean tersebut. Di sinilah facade berperan. Berikut adalah gambar ketiga bean dan facade tersebut :


Berikut beberapa catatan penting tentang facade :
- Facade seharusnya tidak didesain untuk menyediakan fungsi tambahan
- Jangan pernah mengembalikan return value berupa komponen dalam subsystem kepada client. Sebagai contoh jangan pernah memiliki method seperti CreditCard getCreditCard() karena client akan mengetahui isi subsystem dan penggunaan facade menjadi tidak jelas.
- Penggunaan facade seharusnya untuk melakukan business service, bukan individual task.
Sunday, October 25, 2009
Not another nice story
Nyeruput teh dulu di sini, Neng. Panas banget,” ajak Kusnan (47) sambil menuju lapak warung minuman di sudut Pasar Cipulir, Jakarta Selatan, Selasa (20/10). Setumpuk celana pendek dagangannya disampirkan di sandaran kursi plastik. Tas pinggang dibukanya, hanya tampak empat lembar uang ribuan dan buku catatan kecil kumal.
Kusnan mencomot sepotong tempe goreng dan meneguk teh hangat, makan siangnya hari itu. ”Beginilah, sudah dari jam delapan keliling pasar, baru empat orang yang bayar kredit celana. Kalau lagi untung, setengah hari begini sudah dapat Rp 15.000, bisa makan nasi saya,” katanya.
Kusnan salah satu dari banyak penjual pakaian secara kredit dengan daerah operasi di pasar-pasar dan perkampungan di Jakarta. Selain celana pendek, dagangan mereka antara lain daster, pakaian anak-anak, celana jin, busana muslim, hingga pakaian dalam perempuan.
Konsumen mereka mulai dari pekerja di pasar, pemilik lapak-lapak kecil, hingga ibu-ibu rumah tangga. Harga dagangan mulai dari Rp 10.000 untuk tiga pakaian dalam anak-anak sampai Rp 200.000 untuk satu setel busana muslim plus kerudung atau jilbab. Waktu dan besar cicilan disesuaikan dengan kemampuan konsumen.
Harga celana pendek dagangan Kusnan, misalnya, rata–rata Rp 10.000-Rp 20.000. Yang berminat cukup membayar Rp 1.000 per hari. ”Setiap hari, paling tidak ada satu sampai 20 celana bisa saya jual. Cicilan pertama dibayar saat itu juga. Pemasukan lain dari nagih ke pembeli sebelumnya. Sayangnya, selalu saja ada yang menunggak, bahkan tidak bayar karena pindah atau benar-benar tidak punya uang. Mau ditarik barangnya tidak mungkin, sudah telanjur dipakai,” katanya.
Kusnan menambahkan, ia mengambil celana itu dari perajin konveksi yang juga tetangga sebelah rumah petak kontrakannya, tak jauh dari Pasar Cipulir. Bergantung model, bahan, dan ukuran, celana jualannya dipatok Rp 6.000-Rp 12.000 per potong. Kalau lancar, Kusnan sebenarnya bisa untung Rp 4.000-Rp 8.000 setiap satu celana yang lunas terbayar.
Sekitar enam tahun lalu, Kusnan mengaku memiliki lapak kecil tempat ia dan istrinya berdagang pakaian di dekat Pasar Kebayoran Lama. Namun, nasib membawanya menjadi korban gusuran. Lusinan pakaian dan lapak disita petugas, tak pernah kembali. Tanpa modal, Kusnan kesulitan memulai lagi membuka usahanya.
”Saya sudah dari umur 15 tahun merantau dari Tegal, Jawa Tengah, ke sini. Pernah jadi tukang batu sebelum akhirnya bisa buka lapak. Setelah digusur, istri dan tiga anak saya masih butuh makan. Ya sudah, jadi tukang kredit celana. Pendapatan turun, tetapi antigusuran,” katanya tergelak.
Bagi Kusnan, tidak ada alasan untuk tidak tertawa di sela-sela keletihan akibat berkeliling Pasar Cipulir dan kampung-kampung di sekitarnya. Selasa kemarin, jika nasib baik belum menghinggapinya, dipastikan hanya kurang dari Rp 4.000 yang bisa diberikannya kepada sang istri. Yang penting usaha, tegasnya.
Belum tersentuh
”Mau tidak mau, harus mau. Tidak ada yang menolong. Kucuran kredit dari pemerintah kata Neng? Tidak pernah ditawarkan ke kami. Tempat untuk pedagang kecil saja susah, apalagi bantuan modal. Mungkin karena kami enggak punya, jadi enggak pernah ditanyain maunya apa?” tambah Kusnan.
Pekerja nonformal seperti Kusnan hanyalah segelintir orang yang terselip di antara jutaan warga miskin. Di jalanan Ibu Kota, sudut-sudut perempatan, hingga kolong jembatan, tampak kehidupan orang-orang yang tidak punya jalan keluar menggantungkan hidup dari mengemis.
Berdasarkan data Badan Pusat Statistik 2009, tingkat kemiskinan sekarang mencapai 15,4 persen dari sekitar 220 juta penduduk Indonesia. Bagaimana mengentaskan mereka dari kemiskinan?
Tentu ini menjadi pekerjaan rumah bagi kepemimpinan Presiden dan Wakil Presiden baru, Susilo Bambang Yudhoyono dan Boediono. Apalagi dalam pidato kenegaraan saat dilantik di Gedung MPR/DPR, Selasa kemarin, SBY menekankan bahwa target utama kinerja pemerintahan dalam lima tahun ke depan adalah meningkatkan kesejahteraan rakyat.
Masyarakat masih menunggu bisakah target periode pemerintahan terdahulu mereduksi angka kemiskinan menjadi 8,2 persen terpenuhi dalam lima tahun ke depan? Lihat saja nanti. (NELI TRIANA)
Kusnan mencomot sepotong tempe goreng dan meneguk teh hangat, makan siangnya hari itu. ”Beginilah, sudah dari jam delapan keliling pasar, baru empat orang yang bayar kredit celana. Kalau lagi untung, setengah hari begini sudah dapat Rp 15.000, bisa makan nasi saya,” katanya.
Kusnan salah satu dari banyak penjual pakaian secara kredit dengan daerah operasi di pasar-pasar dan perkampungan di Jakarta. Selain celana pendek, dagangan mereka antara lain daster, pakaian anak-anak, celana jin, busana muslim, hingga pakaian dalam perempuan.
Konsumen mereka mulai dari pekerja di pasar, pemilik lapak-lapak kecil, hingga ibu-ibu rumah tangga. Harga dagangan mulai dari Rp 10.000 untuk tiga pakaian dalam anak-anak sampai Rp 200.000 untuk satu setel busana muslim plus kerudung atau jilbab. Waktu dan besar cicilan disesuaikan dengan kemampuan konsumen.
Harga celana pendek dagangan Kusnan, misalnya, rata–rata Rp 10.000-Rp 20.000. Yang berminat cukup membayar Rp 1.000 per hari. ”Setiap hari, paling tidak ada satu sampai 20 celana bisa saya jual. Cicilan pertama dibayar saat itu juga. Pemasukan lain dari nagih ke pembeli sebelumnya. Sayangnya, selalu saja ada yang menunggak, bahkan tidak bayar karena pindah atau benar-benar tidak punya uang. Mau ditarik barangnya tidak mungkin, sudah telanjur dipakai,” katanya.
Kusnan menambahkan, ia mengambil celana itu dari perajin konveksi yang juga tetangga sebelah rumah petak kontrakannya, tak jauh dari Pasar Cipulir. Bergantung model, bahan, dan ukuran, celana jualannya dipatok Rp 6.000-Rp 12.000 per potong. Kalau lancar, Kusnan sebenarnya bisa untung Rp 4.000-Rp 8.000 setiap satu celana yang lunas terbayar.
Sekitar enam tahun lalu, Kusnan mengaku memiliki lapak kecil tempat ia dan istrinya berdagang pakaian di dekat Pasar Kebayoran Lama. Namun, nasib membawanya menjadi korban gusuran. Lusinan pakaian dan lapak disita petugas, tak pernah kembali. Tanpa modal, Kusnan kesulitan memulai lagi membuka usahanya.
”Saya sudah dari umur 15 tahun merantau dari Tegal, Jawa Tengah, ke sini. Pernah jadi tukang batu sebelum akhirnya bisa buka lapak. Setelah digusur, istri dan tiga anak saya masih butuh makan. Ya sudah, jadi tukang kredit celana. Pendapatan turun, tetapi antigusuran,” katanya tergelak.
Bagi Kusnan, tidak ada alasan untuk tidak tertawa di sela-sela keletihan akibat berkeliling Pasar Cipulir dan kampung-kampung di sekitarnya. Selasa kemarin, jika nasib baik belum menghinggapinya, dipastikan hanya kurang dari Rp 4.000 yang bisa diberikannya kepada sang istri. Yang penting usaha, tegasnya.
Belum tersentuh
”Mau tidak mau, harus mau. Tidak ada yang menolong. Kucuran kredit dari pemerintah kata Neng? Tidak pernah ditawarkan ke kami. Tempat untuk pedagang kecil saja susah, apalagi bantuan modal. Mungkin karena kami enggak punya, jadi enggak pernah ditanyain maunya apa?” tambah Kusnan.
Pekerja nonformal seperti Kusnan hanyalah segelintir orang yang terselip di antara jutaan warga miskin. Di jalanan Ibu Kota, sudut-sudut perempatan, hingga kolong jembatan, tampak kehidupan orang-orang yang tidak punya jalan keluar menggantungkan hidup dari mengemis.
Berdasarkan data Badan Pusat Statistik 2009, tingkat kemiskinan sekarang mencapai 15,4 persen dari sekitar 220 juta penduduk Indonesia. Bagaimana mengentaskan mereka dari kemiskinan?
Tentu ini menjadi pekerjaan rumah bagi kepemimpinan Presiden dan Wakil Presiden baru, Susilo Bambang Yudhoyono dan Boediono. Apalagi dalam pidato kenegaraan saat dilantik di Gedung MPR/DPR, Selasa kemarin, SBY menekankan bahwa target utama kinerja pemerintahan dalam lima tahun ke depan adalah meningkatkan kesejahteraan rakyat.
Masyarakat masih menunggu bisakah target periode pemerintahan terdahulu mereduksi angka kemiskinan menjadi 8,2 persen terpenuhi dalam lima tahun ke depan? Lihat saja nanti. (NELI TRIANA)
Thomas Alva Edison
“Jenius adalah 1 persen ide cemerlang dan 99 persen kerja keras”

Thomas Alva Edison, seorang penemu terbesar di dunia, menemukan sekitar 3000 penemuan dan 1.093 diantaranya telah dipatenkan. Edison dilahirkan pada tanggal 11 Februari 1847 di Milan, Ohio, Amerika Serikat dari pasangan suami-Istri Samuel Ogden seorang tukang kayu dan Nancy Elliot seorang guru. Keduanya merupakan keturunan Belanda. Pada usia 7 tahun, edison kecil pindah ke kota Port Huron, Michigan dan bersekolah di Port Huron. Namun tidak lama, 3 bulan kemudian ia dikeluarkan dari Sekolah karena menurut gurunya “Dia terlalu bodoh” sehingga tidak mampu menerima pelajaran apa pun, dia pun sering dipanggil idiot oleh gurunya.
Sang ibu, Nancy Elliot memutuskan untuk berhenti sebagai guru dan kemudian berkonsentrasi mengajari Edison baca tulis dan hitung menghitung.
“My mother was the making of me. She was so true, so sure of me; and I felt I had something to live for, someone I must not disappoint.”
Begitulah perkataan Edison kecil yang menunjukkan motivasi dalam diri Edison yang cukup kuat dalam belajar. Setelah dia bisa membaca, Edison jadi gemar membaca, ia membaca apa saja yang dapat dijumpainya ia membaca ensiklopedia, Sejarah Inggris, Kamus IPA karangan Ure, Principia karangan Newton dan juga Ilmu Kimia karangan Richard G. Parker. kegemarannya yang menonjol adalah membaca, berpikir dan berkeksperimen.
Pada umur 12 Tahun Edison menjadi penjual koran, permen, kacang dan kue di kereta api, sama seperti penjual asongan yang sering kita temui di kereta api ekonomi di Indonesia. Keuntungan dari berdagang itu sebagiannya dia berikan kepada orang tuanya dan sebagiannya dia simpan sebagai modal. Di dalam kereta api, ia menerbitkan koran Weekly Herald sembari mengadakan eksperimen di salah satu gerbong kereta api, setelah sebelumnya meinta ijin perusahaan kereta api “Grand Trunk Railway”.
Pada suatu malam Edison tidak sengaja menumpahkan sebuah cairan kimia sehingga menyebabkan sebuah gerbong hampir terbakar. Karena kasus ini Edison ditampar kondektur hingga pendengarannya rusak, kemudian dia dilarang bekerja di kereta api. Namun Edison tidak menganggap pendengarannya yang rusak sebagai cacat, namun justru dia menganggapnya secara positif sebagai sebuah keuntungan sehingga ia memiliki lebih banyak waktu untuk berfikir daripada mendengarkan omongan – omongan kosong.
Pada usia 15 tahun Edison remaja menyelamatkan nyawa anak kepala stasiun yang hampir tergilas gerbong kereta api. Karena merasa berhutang jasa, sang kepala stasiun tersebut akhirnya mengajarkan cara pengiriman telegram, Edison hanya memerlukan waktu 3 bulan untuk menguasai pelajaran gratis tersebut. Sesudah itu, ia mendapat pekerjaan sebagai operator telegraf.
Penemuan pertama yang dia patenkan adalah electric vote recorder, namun karena tidak laku, Edison akhirnya beralih ke penemuan yang lebih komersial. Edison kemudian menemukan stock ticker atau mesin telegraf. Peralatan itu dijualnya dan laku 40.000 dollar Amerika serikat (Sekitar 390 juta rupiah). Edison hampir – hampir pingsan melihat uang sebanyak itu. Uang ini dipakai Edison untuk mendirikan pabrik di Newark dan merekrut 300 orang pekerja sekaligus, disini ia mengembangkan telegraf sehingga mampu mengirimkan 4 berita sekaligus.
Pada umur 29 tahun, Edison mendirikan laboratorium riset untuk industri di Menlo Park, New Jersey. dan dalam 13 bulan ia menemukan 400 macam penemuan yang kemudian mengubah pola hidup sebagian besar orang-orang di dunia.
Tahun 1877 ia berkonsentrasi pada lampu pijar. Edison sadar bahwa betapa pentingnya sumber cahaya ini bagi manusia. Dia menghabiskan 40.000 dollar dalam kurun waktu dua tahun untuk eksperimen lampu pijar. Yang menjadi masalah adalah menemukan bahan yg bisa berpijar ketika dialiri arus listrik namun tidak terbakar. Total ada sekitar 6000 bahan yang dicobanya. Melalui usaha keras Edison, akhirnya pada tanggal 21 Oktober 1879 lahirlah lampu pijar listrik pertama yang mampu menyala selama 40 jam. Tahun 1882, untuk pertama kalinya dalam sejarah lampu-lampu listrik di pasang di jalan-jalan dan di rumah rumah
Sungguh patut direnungkan ketika saat keberhasilan dicapainya, dia sempat ditanya: Apa kunci kesuksesannya. Thomas Alfa Edison menjawab:
“Saya sukses, karena saya telah kehabisan apa yang disebut dengan kegagalan”
Ketika dia telah banyak sekali mengalami kegagalan yang berulang-ulang. Bahkan saat dia ditanya apakah dia tidak bosan dengan kegagalannya, Thomas Alfa Edison menjawab:
“Dengan Kegagalan Tersebut, Saya malah mengetahui ribuan cara agar lampu tidak menyala”
This is Amazing!!, Edison memandang sebuah kegagalan sebagai sebuah hal yang sangat positif. Kegagalan bukan kekalahan tapi sebagai sebuah keuntungan. Cara memandang yang positif ini membuat Edison mampu meyakinkan orang lain untuk tetap mendanai proyeknya meskipun gagal berulang – ulang kali. Mungkin prinsip Edison inilah yang patut kita terapkan dalam kehidupan kita sehari. Bahwa sebenarnya kita tidak pernah mengalami kerugian, dan sesungguhnya kerugian itu bermula dari sikap dan cara pandang kita sendiri yang negatif.
Edison telah banyak menghasilkan berbagai penemuan yang sangat berharga bagi perkembangan umat manusia. Telegraf cetak, pulpen elektrik, proses penambangan magnetik, torpedo listrik, karet sintetis, baterai alkaline, pengaduk semen, mikrofon, transmiter telepon karbon dan proyektor gambar bergerak adalah beberapa dari penemuan Edison.
Melewati tahun 1920-an kondisi kesehatannya kian memburuk dan Edison meninggal dunia tanggal 18 Oktober 1931 pada usia 84 tahun.

Thomas Alva Edison, seorang penemu terbesar di dunia, menemukan sekitar 3000 penemuan dan 1.093 diantaranya telah dipatenkan. Edison dilahirkan pada tanggal 11 Februari 1847 di Milan, Ohio, Amerika Serikat dari pasangan suami-Istri Samuel Ogden seorang tukang kayu dan Nancy Elliot seorang guru. Keduanya merupakan keturunan Belanda. Pada usia 7 tahun, edison kecil pindah ke kota Port Huron, Michigan dan bersekolah di Port Huron. Namun tidak lama, 3 bulan kemudian ia dikeluarkan dari Sekolah karena menurut gurunya “Dia terlalu bodoh” sehingga tidak mampu menerima pelajaran apa pun, dia pun sering dipanggil idiot oleh gurunya.
Sang ibu, Nancy Elliot memutuskan untuk berhenti sebagai guru dan kemudian berkonsentrasi mengajari Edison baca tulis dan hitung menghitung.
“My mother was the making of me. She was so true, so sure of me; and I felt I had something to live for, someone I must not disappoint.”
Begitulah perkataan Edison kecil yang menunjukkan motivasi dalam diri Edison yang cukup kuat dalam belajar. Setelah dia bisa membaca, Edison jadi gemar membaca, ia membaca apa saja yang dapat dijumpainya ia membaca ensiklopedia, Sejarah Inggris, Kamus IPA karangan Ure, Principia karangan Newton dan juga Ilmu Kimia karangan Richard G. Parker. kegemarannya yang menonjol adalah membaca, berpikir dan berkeksperimen.
Pada umur 12 Tahun Edison menjadi penjual koran, permen, kacang dan kue di kereta api, sama seperti penjual asongan yang sering kita temui di kereta api ekonomi di Indonesia. Keuntungan dari berdagang itu sebagiannya dia berikan kepada orang tuanya dan sebagiannya dia simpan sebagai modal. Di dalam kereta api, ia menerbitkan koran Weekly Herald sembari mengadakan eksperimen di salah satu gerbong kereta api, setelah sebelumnya meinta ijin perusahaan kereta api “Grand Trunk Railway”.
Pada suatu malam Edison tidak sengaja menumpahkan sebuah cairan kimia sehingga menyebabkan sebuah gerbong hampir terbakar. Karena kasus ini Edison ditampar kondektur hingga pendengarannya rusak, kemudian dia dilarang bekerja di kereta api. Namun Edison tidak menganggap pendengarannya yang rusak sebagai cacat, namun justru dia menganggapnya secara positif sebagai sebuah keuntungan sehingga ia memiliki lebih banyak waktu untuk berfikir daripada mendengarkan omongan – omongan kosong.
Pada usia 15 tahun Edison remaja menyelamatkan nyawa anak kepala stasiun yang hampir tergilas gerbong kereta api. Karena merasa berhutang jasa, sang kepala stasiun tersebut akhirnya mengajarkan cara pengiriman telegram, Edison hanya memerlukan waktu 3 bulan untuk menguasai pelajaran gratis tersebut. Sesudah itu, ia mendapat pekerjaan sebagai operator telegraf.
Penemuan pertama yang dia patenkan adalah electric vote recorder, namun karena tidak laku, Edison akhirnya beralih ke penemuan yang lebih komersial. Edison kemudian menemukan stock ticker atau mesin telegraf. Peralatan itu dijualnya dan laku 40.000 dollar Amerika serikat (Sekitar 390 juta rupiah). Edison hampir – hampir pingsan melihat uang sebanyak itu. Uang ini dipakai Edison untuk mendirikan pabrik di Newark dan merekrut 300 orang pekerja sekaligus, disini ia mengembangkan telegraf sehingga mampu mengirimkan 4 berita sekaligus.
Pada umur 29 tahun, Edison mendirikan laboratorium riset untuk industri di Menlo Park, New Jersey. dan dalam 13 bulan ia menemukan 400 macam penemuan yang kemudian mengubah pola hidup sebagian besar orang-orang di dunia.
Tahun 1877 ia berkonsentrasi pada lampu pijar. Edison sadar bahwa betapa pentingnya sumber cahaya ini bagi manusia. Dia menghabiskan 40.000 dollar dalam kurun waktu dua tahun untuk eksperimen lampu pijar. Yang menjadi masalah adalah menemukan bahan yg bisa berpijar ketika dialiri arus listrik namun tidak terbakar. Total ada sekitar 6000 bahan yang dicobanya. Melalui usaha keras Edison, akhirnya pada tanggal 21 Oktober 1879 lahirlah lampu pijar listrik pertama yang mampu menyala selama 40 jam. Tahun 1882, untuk pertama kalinya dalam sejarah lampu-lampu listrik di pasang di jalan-jalan dan di rumah rumah
Sungguh patut direnungkan ketika saat keberhasilan dicapainya, dia sempat ditanya: Apa kunci kesuksesannya. Thomas Alfa Edison menjawab:
“Saya sukses, karena saya telah kehabisan apa yang disebut dengan kegagalan”
Ketika dia telah banyak sekali mengalami kegagalan yang berulang-ulang. Bahkan saat dia ditanya apakah dia tidak bosan dengan kegagalannya, Thomas Alfa Edison menjawab:
“Dengan Kegagalan Tersebut, Saya malah mengetahui ribuan cara agar lampu tidak menyala”
This is Amazing!!, Edison memandang sebuah kegagalan sebagai sebuah hal yang sangat positif. Kegagalan bukan kekalahan tapi sebagai sebuah keuntungan. Cara memandang yang positif ini membuat Edison mampu meyakinkan orang lain untuk tetap mendanai proyeknya meskipun gagal berulang – ulang kali. Mungkin prinsip Edison inilah yang patut kita terapkan dalam kehidupan kita sehari. Bahwa sebenarnya kita tidak pernah mengalami kerugian, dan sesungguhnya kerugian itu bermula dari sikap dan cara pandang kita sendiri yang negatif.
Edison telah banyak menghasilkan berbagai penemuan yang sangat berharga bagi perkembangan umat manusia. Telegraf cetak, pulpen elektrik, proses penambangan magnetik, torpedo listrik, karet sintetis, baterai alkaline, pengaduk semen, mikrofon, transmiter telepon karbon dan proyektor gambar bergerak adalah beberapa dari penemuan Edison.
Melewati tahun 1920-an kondisi kesehatannya kian memburuk dan Edison meninggal dunia tanggal 18 Oktober 1931 pada usia 84 tahun.
Sunday, October 18, 2009
Design Pattern in Brief (9)
Chain of Responsibility
Pattern ini mirip dengan model layering dalam arsitektur software. Pattern ini menjelaskan bahwa antara object pengirim request dan object-object yang menangani request sebaiknya terpisah bahkan benar-benar tidak saling terkait (loosely coupling).
Jika ada lebih dari satu object yang bertugas menangani request, maka prosesnya dilakukan secara berurutan. Urutan tersebut membentuk sebuah rantai di mana setiap object mempunyai pointer yang merujuk ke chain selanjutnya.
Object pertama yang menerima request bisa memutuskan apakah akan menghandle request atau meneruskannya ke object selanjutnya. Request tersebut berjalan terus sampai dihandle oleh salah satu object atau request sampai di ujung rantai tanpa ada yang menghandlenya. Dengan kata lain, setelah melewati serangkaian rantai tersebut, request bisa saja tidak ada yang menghandlenya.
Berikut adalah karakteristik dari Chain of Responsibility :
- Sekumpulan request handler, dan urut-urutannya sehingga membentuk sebuah rantai dapat dilakukan secara dinamis saat runtime oleh klien.
- Klien bisa memiliki rantai request handler yang berbeda-beda tergantung jenis requestnya.
- Baik klien maupun masing-masing object request handler tidak perlu tahu object handler mana yang akhirnya menghandle request.
- Setelah melalui rantai request handler, request bisa saja tidak ada yang menghandlenya.
Untuk aplikasinya perhatikan contoh berikut :
Misal kita mempunyai sebuah purchase request.

Agar purchase request ini bisa dikirim maka harus melewati serangkaian pemeriksaan batas pembelian oleh 4 manajerial level.


Perhatikan diagram dan kode berikut :

Kita memiliki PRHandler sebagai parent dari keempat manajerial class request handler di atas. Berikut adalah codenya
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public abstract class RequestHandler {
protected RequestHandler nextHandler;
public abstract boolean authorize(PurchaseRequest request);
public RequestHandler getNextHandler() {
return nextHandler;
}
public void setNextHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class BranchManager extends RequestHandler {
private static final int LIMIT = 25000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by branch manager...");
return true;
} else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class PresidentCOO extends RequestHandler {
private static final int LIMIT = 400000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by president coo...");
return true;
} else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class RegionalDirector extends RequestHandler {
private static final int LIMIT = 100000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by regional director...");
return true;
} else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class VicePresident extends RequestHandler {
private static final int LIMIT = 200000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by vice president...");
return true;
}else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.request;
public class PurchaseRequest {
private String id;
private String description;
private double amount;
public PurchaseRequest(String id, String description, double amount) {
super();
this.id = id;
this.description = description;
this.amount = amount;
}
public String getId() {
return id;
}
public String getDescription() {
return description;
}
public double getAmount() {
return amount;
}
}
package edu.mat.pattern.main;
import edu.mat.pattern.chain.BranchManager;
import edu.mat.pattern.chain.PresidentCOO;
import edu.mat.pattern.chain.RegionalDirector;
import edu.mat.pattern.chain.VicePresident;
import edu.mat.pattern.request.PurchaseRequest;
public class Main {
public static void main(String args[]) {
BranchManager branchManager = new BranchManager();
PresidentCOO presidentCOO = new PresidentCOO();
RegionalDirector regionalDirector = new RegionalDirector();
VicePresident vicePresident = new VicePresident();
branchManager.setNextHandler(regionalDirector);
regionalDirector.setNextHandler(vicePresident);
vicePresident.setNextHandler(presidentCOO);
presidentCOO.setNextHandler(null);
PurchaseRequest request = new PurchaseRequest("one", "request one", 300000);
branchManager.authorize(request);
}
}
Jika dijalankan :
Authorized by president coo...
Pattern ini mirip dengan model layering dalam arsitektur software. Pattern ini menjelaskan bahwa antara object pengirim request dan object-object yang menangani request sebaiknya terpisah bahkan benar-benar tidak saling terkait (loosely coupling).
Jika ada lebih dari satu object yang bertugas menangani request, maka prosesnya dilakukan secara berurutan. Urutan tersebut membentuk sebuah rantai di mana setiap object mempunyai pointer yang merujuk ke chain selanjutnya.
Object pertama yang menerima request bisa memutuskan apakah akan menghandle request atau meneruskannya ke object selanjutnya. Request tersebut berjalan terus sampai dihandle oleh salah satu object atau request sampai di ujung rantai tanpa ada yang menghandlenya. Dengan kata lain, setelah melewati serangkaian rantai tersebut, request bisa saja tidak ada yang menghandlenya.
Berikut adalah karakteristik dari Chain of Responsibility :
- Sekumpulan request handler, dan urut-urutannya sehingga membentuk sebuah rantai dapat dilakukan secara dinamis saat runtime oleh klien.
- Klien bisa memiliki rantai request handler yang berbeda-beda tergantung jenis requestnya.
- Baik klien maupun masing-masing object request handler tidak perlu tahu object handler mana yang akhirnya menghandle request.
- Setelah melalui rantai request handler, request bisa saja tidak ada yang menghandlenya.
Untuk aplikasinya perhatikan contoh berikut :
Misal kita mempunyai sebuah purchase request.

Agar purchase request ini bisa dikirim maka harus melewati serangkaian pemeriksaan batas pembelian oleh 4 manajerial level.


Perhatikan diagram dan kode berikut :

Kita memiliki PRHandler sebagai parent dari keempat manajerial class request handler di atas. Berikut adalah codenya
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public abstract class RequestHandler {
protected RequestHandler nextHandler;
public abstract boolean authorize(PurchaseRequest request);
public RequestHandler getNextHandler() {
return nextHandler;
}
public void setNextHandler(RequestHandler nextHandler) {
this.nextHandler = nextHandler;
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class BranchManager extends RequestHandler {
private static final int LIMIT = 25000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by branch manager...");
return true;
} else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class PresidentCOO extends RequestHandler {
private static final int LIMIT = 400000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by president coo...");
return true;
} else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class RegionalDirector extends RequestHandler {
private static final int LIMIT = 100000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by regional director...");
return true;
} else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.chain;
import edu.mat.pattern.request.PurchaseRequest;
public class VicePresident extends RequestHandler {
private static final int LIMIT = 200000;
@Override
public boolean authorize(PurchaseRequest request) {
// do authorization
if(request.getAmount() <= LIMIT) {
System.out.println("Authorized by vice president...");
return true;
}else
return nextHandler.authorize(request);
}
}
package edu.mat.pattern.request;
public class PurchaseRequest {
private String id;
private String description;
private double amount;
public PurchaseRequest(String id, String description, double amount) {
super();
this.id = id;
this.description = description;
this.amount = amount;
}
public String getId() {
return id;
}
public String getDescription() {
return description;
}
public double getAmount() {
return amount;
}
}
package edu.mat.pattern.main;
import edu.mat.pattern.chain.BranchManager;
import edu.mat.pattern.chain.PresidentCOO;
import edu.mat.pattern.chain.RegionalDirector;
import edu.mat.pattern.chain.VicePresident;
import edu.mat.pattern.request.PurchaseRequest;
public class Main {
public static void main(String args[]) {
BranchManager branchManager = new BranchManager();
PresidentCOO presidentCOO = new PresidentCOO();
RegionalDirector regionalDirector = new RegionalDirector();
VicePresident vicePresident = new VicePresident();
branchManager.setNextHandler(regionalDirector);
regionalDirector.setNextHandler(vicePresident);
vicePresident.setNextHandler(presidentCOO);
presidentCOO.setNextHandler(null);
PurchaseRequest request = new PurchaseRequest("one", "request one", 300000);
branchManager.authorize(request);
}
}
Jika dijalankan :
Authorized by president coo...
Subscribe to:
Posts (Atom)