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

<channel>
	<title>gedex's blog</title>
	<atom:link href="http://gedex.web.id/feed/" rel="self" type="application/rss+xml" />
	<link>http://gedex.web.id</link>
	<description>Web 2.0, Server Side Scripting, PHP, HTML, MySQL, CSS, web Design, Stylesheet, electronic, embedded system, digital circuit, microcontroller, 8051 microcontroller, assembler</description>
	<pubDate>Mon, 14 Jun 2010 06:43:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Design Pattern Dalam PHP (Bagian I)</title>
		<link>http://gedex.web.id/archives/2010/06/13/design-pattern-dalam-php/</link>
		<comments>http://gedex.web.id/archives/2010/06/13/design-pattern-dalam-php/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 13:57:48 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[coding]]></category>

		<category><![CDATA[adapter]]></category>

		<category><![CDATA[design pattern]]></category>

		<category><![CDATA[observer]]></category>

		<category><![CDATA[oop]]></category>

		<category><![CDATA[php php5]]></category>

		<category><![CDATA[registry]]></category>

		<category><![CDATA[singleton]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=333</guid>
		<description><![CDATA[
Design Pattern? Mungkin bagi yang pernah mendengarnya tentu familiar dengan bukunya Gang of Four &#8220;Design Patterns: Elements of Reusable Object-Oriented Software&#8221;. Lalu apa itu design pattern? Konsep sederhana dibalik design pattern adalah solusi untuk masalah umum yang didokumentasikan oleh seorang yang berpengalaman dalam pengembangan aplikasi. Umumnya masalah yang ada sering ditemui dalam beberapa proses pengembangan [...]
]]></description>
			<content:encoded><![CDATA[<p>Design Pattern? Mungkin bagi yang pernah mendengarnya tentu familiar dengan bukunya Gang of Four &#8220;Design Patterns: Elements of Reusable Object-Oriented Software&#8221;. Lalu apa itu design pattern? Konsep sederhana dibalik design pattern adalah solusi untuk masalah umum yang didokumentasikan oleh seorang yang berpengalaman dalam pengembangan aplikasi. Umumnya masalah yang ada sering ditemui dalam beberapa proses pengembangan sehingga dinamai pola (<em>pattern</em>). Sedangkan desain yang digunakan untuk mengatasi pola masalah tersebut umumnya digunakan agar kode menjadi <em>less-coupled</em> (tidak terlalu mempengaruhi kode lainnya jika ada perubahan ke depannya), mudah dimantain, portabel, mudah dibaca, dapat diterapkan dalam tim yang dinamis dan untuk skala proyek yang kompleks. Design Pattern dapat digunakan dalam bahasa pemrograman apa saja, khususnya bahasa pemrograman yang OOP, tak terkecuali PHP. Ada banyak design pattern, saya akan bahas empat design pattern (Singleton, Registry, Adapter dan Observer) terlebih dahulu dan akan saya lanjutkan pattern lainnya di tulisan lainnya.<br />
<span id="more-333"></span></p>
<h2>Singleton</h2>
<p>Singleton digunakan jika hanya diperbolehkan satu obyek terinisialisasi dari sebuah class. Misalnya sebuah class database, dimana objek yang dibuat dari class tersebut akan menginisialisasi koneksi ke database server. Untuk memastikan hanya ada satu koneksi saja yang tercipta (tentunya agar menghemat pemakaian memori) maka dapat digunakan pendekatan singleton. Berikut pseudo code dari pengimplementasian singleton pattern:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> SingletonDB <span style="color: #009900;">&#123;</span>
  <span style="color: #666666; font-style: italic;">// digunakan untuk menyimpan obyek</span>
  <span style="color: #666666; font-style: italic;">// dari SingletonDB.</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #990000;">static</span> <span style="color: #000088;">$__instance</span><span style="color: #339933;">;</span> 
&nbsp;
  <span style="color: #666666; font-style: italic;">// dengan membuat konstruktor private</span>
  <span style="color: #666666; font-style: italic;">// maka penciptaan obyek tidak dapat dilakukan</span>
  <span style="color: #666666; font-style: italic;">// di luar class.</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$param}</span>: Object diinisialisasi...<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #666666; font-style: italic;">// untuk memungkin penciptaan satu objek saja</span>
  <span style="color: #666666; font-style: italic;">// diperlukan method publik yang menginisialisasi</span>
  <span style="color: #666666; font-style: italic;">// SingletonDB jika belum terinisialisasi lalu simpan</span>
  <span style="color: #666666; font-style: italic;">// di properti class yang private. Selanjutnya obyek</span>
  <span style="color: #666666; font-style: italic;">// tidak akan diinsialisasi lagi.</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #990000;">static</span> <span style="color: #000000; font-weight: bold;">function</span> getInstance<span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">''</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$__instance</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$__instance</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SingletonDB<span style="color: #009900;">&#40;</span><span style="color: #000088;">$param</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;<span style="color: #006699; font-weight: bold;">{$param}</span>: Object selesai diinisialisasi.<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$__instance</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// sekarang kita test</span>
<span style="color: #000088;">$db1</span> <span style="color: #339933;">=</span> SingletonDB<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB1'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db2</span> <span style="color: #339933;">=</span> SingletonDB<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$db3</span> <span style="color: #339933;">=</span> SingletonDB<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'DB3'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Oke, save kode di atas dengan nama file singleton.php, lalu coba jalankan:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">akeda<span style="color: #000000; font-weight: bold;">@</span>akeda-laptop:~<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>design_pattern$ php singleton.php 
DB1: Object diinisialisasi...
DB1: Object selesai diinisialisasi.
akeda<span style="color: #000000; font-weight: bold;">@</span>akeda-laptop:~<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>design_pattern$</pre></div></div>

<p>Dapat dilihat $db2 dan $db3 tidak menginisialisasi obyek baru. Penggunaan singleton tidak hanya terbatas pada class database tapi dapat digunakan untuk situasi apapun yang membutuhkan hanya satu saja inisialisasi obyek.</p>
<h2>Registry</h2>
<p>Registry mempunyai konsep seperti <em>phonebook</em> di HP Anda. Untuk mencari no HP Budi, Anda tinggal ketik Budi maka dapatlah nomornya (dan juga informasi lainnya). Untuk memasukkan kontak baru, Anda tinggal masukkan kata kuncinya (dalam hal ini nama teman Anda) dan juga nilai yang ingin disimpan (dalam hal ini no HP teman Anda). Jika Anda familiar dengan <em>setter</em> dan <em>getter</em>, maka Anda akan mudah memahami Registry. Situasi serupa dapat diterapkan dalam konfigurasi sistem. Konfigurasi sistem meyimpan properti aplikasi seperti nama aplikasi, koneksi database, <em>theme</em> yang digunakan, dsb. Kita akan membuat sebuah class Configure yang digunakan untuk men-<em>set</em> dan men-<em>get</em> properti dari konfigurasi, berikut kode-nya:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> Configure <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__config</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #990000;">static</span> <span style="color: #000088;">$__instance</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__config <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Dapatkan objek dari Configure yang juga Singleton
 * @param array $config Array konfigurasi
 * @return object Obyek dari Configure
 */</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getInstance<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">is_null</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$__instance</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$__instance</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Configure<span style="color: #009900;">&#40;</span><span style="color: #000088;">$config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #000088;">$__instance</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Dapatkan nilai dari $key
 * @param mixed $key Key dari array konfigurasi yang ingin di
 *                   dapatkan nilainya
 * @return mixed
 */</span>  
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> get<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">null</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__config<span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$val</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__config<span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$val</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009933; font-style: italic;">/**
 * Menset nilai $val dengan key $key ke konfigurasi
 * @param mixed $key
 * @param mixed $val
 * @return bool Selalu true
 */</span>  
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> set<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$val</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__config<span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$val</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// test configure</span>
<span style="color: #000088;">$conf_array</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
  <span style="color: #0000ff;">'app_name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'Aplikasi Ku'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'theme'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'biru_muda'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'debug'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000000; font-weight: bold;">FALSE</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> Configure<span style="color: #339933;">::</span><span style="color: #004000;">getInstance</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$conf_array</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">echo</span> <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'app_name'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">echo</span> <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'theme'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">set</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'debug'</span><span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">TRUE</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">echo</span> <span style="color: #0000ff;">'debug:'</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$config</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">get</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'debug'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Sekarang test jalankan:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">akeda<span style="color: #000000; font-weight: bold;">@</span>akeda-laptop:~<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>design_pattern$ php registry.php
Aplikasi Ku
biru_muda
debug:<span style="color: #000000;">1</span></pre></div></div>

<p>Pada contoh class Configure di atas dapat kita lihat bahwa kita juga menerapkan Singleton. Ini dilakukan agar data konfigurasi konsisten, jadi diperlukan hanya ada satu obyek dari Configure.</p>
<h2>Adapter</h2>
<p>Misalkan Anda sedang membangun sebuah sistem CMS dimana ada fitur plugin. Anda menyediakan sebuah interface plugin dimana para developer plugin harus mengikutinya. Di core CMS Anda memiliki PluginManager yang akan mengeksekusi setiap plugin. Dalam pengembangan ke depan Anda perlu mengubah core CMS dan PluginManager pun ikut berubah. Anda tentunya tidak ingin kan setiap plugin menjadi tidak berfungsi kembali? Nah karena tidak mungkin menyentuh semua plugin yang di buat oleh developer di luar pengembang inti, Anda dapat membuat sebuah Adapter disini untuk menjembatani API dari core sebelumnya untuk kompatibel dengan API yang baru. Ini merupakan cara yang banyak digunakan proyek open source yang merilis API baru dan ingin mempertahankan kompabilitas dengan API lama. Disaat API baru dirilis mereka akan melabelkan beberapa method sebagai usang (<em>deprecated</em>), barulah diversi stabil setelahnya mereka membuang method yang usang tersebut.</p>
<p>Oke contoh yang akan kita buat adalah PluginManager sederhana yang fungsinya mengeksekusi semua plugin yang ada di dalam direktori plugins. Konvensi penamaan file plugin adalah plugin_nama_plugin.php, maka di dalam nya perlu didefinisikan sebuah class dengan nama PluginNamaPlugin yang mengimplementasi interface PluginInterface. Untuk mempermudah mengikuti contoh gunakan struktur seperti ini:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">plugins.php
plugins\plugin_a.php
plugins\plugin_b.php
plugins\plugin_akeda_b.php</pre></div></div>

<p>Buka file plugins.php yang masih kosong. Berikut adalah interface PluginManager yang akan diimplementasi oleh class BackendPluginManager di core plugin Anda :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">interface</span> PluginManager <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeAllPlugins<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Dan class BackendPluginManager yang mengimplementasi PluginManager (masih dalam file plugins.php) :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> BackendPluginManager implements PluginManager <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__author</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__content</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__plugins</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_info</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__author <span style="color: #339933;">=</span> <span style="color: #000088;">$author_info</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__content <span style="color: #339933;">=</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$plugin_directory</span> <span style="color: #339933;">=</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> DIRECTORY_SEPARATOR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'plugins'</span>
                      <span style="color: #339933;">.</span> DIRECTORY_SEPARATOR<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugins<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">opendir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_directory</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">false</span> <span style="color: #339933;">!==</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">readdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;.&quot;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$file</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;..&quot;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">strstr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'plugin_'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$plugin_directory</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$file</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_name</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_name</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_name</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_names</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$plugin_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_name_class_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Plugin'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$plugin_names</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$w</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000088;">$plugin_name_class_name</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_name_class_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugins<span style="color: #009900;">&#91;</span><span style="color: #000088;">$plugin_name_class_name</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$plugin_name_class_name</span><span style="color: #339933;">;</span> 
            <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #990000;">closedir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeAllPlugins<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugins <span style="color: #b1b100;">as</span> <span style="color: #000088;">$plugin</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #990000;">echo</span> <span style="color: #000088;">$plugin</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterAuthorInfo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__author<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">echo</span> <span style="color: #000088;">$plugin</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterContent</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__content<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Yang dilakukan BackendPluginManager saat method <code>__construct</code> (konstruktor) dipanggil adalah mencek semua file di direktori plugins dengan prefix nama file &#8216;plugin_&#8217;. Lalu cek di file tersebut apakah ada class plugin yang sesuai dengan konvensi penamaan plugin. Jika terdapat class tersebut maka inisialisasi menjadi obyek dan kumpulkan dalam properti array yang <code>private</code>. Method <code>executeAllPlugins()</code> akan mengeksekusi method <code>filterAuthorInfo</code> dan <code>filterContent</code> dari obyek plugin yang telah dikumpulkan di konstruktor. Untuk membuat plugin mengikuti arsitektur plugin core, Anda perlu mendefinisikan interface yang perlu diikuti oleh pengembang plugin. Berikut adalah interface PluginInterface (masih dalam file plugins.php):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> PluginInterface <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterContent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterAuthorInfo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<pre>
</pre>
<p>Sedangkan berikut adalah salah satu contoh plugin dengan nama plugin &#8216;PluginA&#8217; (berarti nama filenya adalah &#8216;plugin_a.php&#8217;) :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">class</span> PluginA implements PluginInterface <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterContent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;Plugin A - Content: <span style="color: #006699; font-weight: bold;">{$content}</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterAuthorInfo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_info</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #0000ff;">&quot;Plugin A - Author : <span style="color: #006699; font-weight: bold;">{$author_info}</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>Dalam contoh saya buat 3 contoh plugin, yaitu PluginA (plugins/plugin_a.php), PluginB (plugins/plugin_b.php) dan PluginAkedaB (plugins/plugin_akeda_b.php). Ok sekarang contoh implementasi-nya (dalam file plugins.php):</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// Misalkan data ini telah ditarik dari db</span>
<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Ini adalah content yang di filter dari setiap plugin&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$author</span>  <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;Akeda Bagus; admin@gedex.web.id&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// pseudo code di core CMS..</span>
<span style="color: #000088;">$plugin_manager</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> BackendPluginManager<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$plugin_manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">executeAllPlugins</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Kita jalankan untuk mengetes semua plugin dan plugin manager nya bekerja seperti apa:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">akeda<span style="color: #000000; font-weight: bold;">@</span>akeda-laptop:~<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>design_pattern$ php plugins.php
Plugin Akeda B - Author : Akeda Bagus; admin<span style="color: #000000; font-weight: bold;">@</span>gedex.web.id
Plugin Akeda B - Content: Ini adalah content yang di filter dari setiap plugin
Plugin A - Author : Akeda Bagus; admin<span style="color: #000000; font-weight: bold;">@</span>gedex.web.id
Plugin A - Content: Ini adalah content yang di filter dari setiap plugin
Plugin B - Author : Akeda Bagus; admin<span style="color: #000000; font-weight: bold;">@</span>gedex.web.id
Plugin B - Content: Ini adalah content yang di filter dari setiap plugin</pre></div></div>

<p>Dalam pengembangan Anda perlu mengubah BackendPluginManager dan PluginInterface. Apa yang harus dilakukan sementara banyak plugin diluar kendali kita? Berikut adalah interface plugin yang baru:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> NewPluginInterface <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterContent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterAuthorEmail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_email</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterAuthorName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Jika sebelumnya hanya ada method <code>filterAuthorInfo($author_info)</code>, kini plugin perlu mengimplementasi method <code>filterAuthorEmail($author_email)</code> dan <code>filterAuthorName($author_name)</code>. Di BackendPluginManager kini hanya menerima dua method tersebut. Berikut adalah class NewBackendPluginManager:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> NewBackendPluginManager <span style="color: #000000; font-weight: bold;">extends</span> BackendPluginManager <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__author_email</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__author_name</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__plugins</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_info</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_info</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$author</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">';'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$author_info</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__author_email <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$author</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__author_name <span style="color: #339933;">=</span> <span style="color: #990000;">trim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$author</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__content <span style="color: #339933;">=</span> <span style="color: #000088;">$content</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000088;">$plugin_directory</span> <span style="color: #339933;">=</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> DIRECTORY_SEPARATOR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'plugins'</span>
                      <span style="color: #339933;">.</span> DIRECTORY_SEPARATOR<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugins<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span> <span style="color: #339933;">=</span> <span style="color: #990000;">opendir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_directory</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #000000; font-weight: bold;">false</span> <span style="color: #339933;">!==</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #990000;">readdir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
          <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$file</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;.&quot;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$file</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">&quot;..&quot;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">strstr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'plugin_'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #b1b100;">require_once</span> <span style="color: #000088;">$plugin_directory</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$file</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_name</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_name</span>  <span style="color: #339933;">=</span> <span style="color: #990000;">substr</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_name</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span> <span style="color: #339933;">-</span><span style="color: #cc66cc;">4</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_names</span> <span style="color: #339933;">=</span> <span style="color: #990000;">explode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'_'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$plugin_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #000088;">$plugin_name_class_name</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'Plugin'</span><span style="color: #339933;">;</span>
            <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$plugin_names</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$w</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000088;">$plugin_name_class_name</span> <span style="color: #339933;">.=</span> <span style="color: #990000;">ucfirst</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$w</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #990000;">class_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin_name_class_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
              <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugins<span style="color: #009900;">&#91;</span><span style="color: #000088;">$plugin_name_class_name</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #000088;">$plugin_name_class_name</span><span style="color: #339933;">;</span> 
            <span style="color: #009900;">&#125;</span>
          <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #990000;">closedir</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$handle</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> executeAllPlugins<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugins <span style="color: #b1b100;">as</span> <span style="color: #000088;">$plugin</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$interfaces</span> <span style="color: #339933;">=</span> class_implements<span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
      <span style="color: #666666; font-style: italic;">// jika interface yang digunakan bukan</span>
      <span style="color: #666666; font-style: italic;">// interface yang baru</span>
      <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span><span style="color: #990000;">array_key_exists</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'NewPluginInterface'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$interfaces</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$plugin</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> PluginAdapter<span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #009900;">&#125;</span>
&nbsp;
      <span style="color: #990000;">echo</span> <span style="color: #000088;">$plugin</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterAuthorEmail</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__author_email<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">echo</span> <span style="color: #000088;">$plugin</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterAuthorName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__author_name<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
      <span style="color: #990000;">echo</span> <span style="color: #000088;">$plugin</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterContent</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__content<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Anda menginginkan plugin baru mengikuti interface ini tapi plugin lama tetap dapat berjalan. Solusi mudah adalah dengan Adapter. Berikut adalah contoh Adapter yang menjadi jembatan antara plugin dan NewBackendPluginManager:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> PluginAdapter implements NewPluginInterface <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__plugin</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$plugin</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugin <span style="color: #339933;">=</span> <span style="color: #000088;">$plugin</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterContent<span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugin<span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterContent</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterAuthorEmail<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_email</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugin<span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterAuthorInfo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_email</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> filterAuthorName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__plugin<span style="color: #339933;">-&gt;</span><span style="color: #004000;">filterAuthorInfo</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$author_name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Sekarang kita test plugin manager dan Adapter tersebut :</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000088;">$plugin_manager</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> NewBackendPluginManager<span style="color: #009900;">&#40;</span><span style="color: #000088;">$author</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$plugin_manager</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">executeAllPlugins</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span></pre></div></div>

<p>Berikut hasilnya:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">akeda<span style="color: #000000; font-weight: bold;">@</span>akeda-laptop:~<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>design_pattern$ php plugins.php
Plugin A - Author : Akeda Bagus
Plugin A - Author : admin<span style="color: #000000; font-weight: bold;">@</span>gedex.web.id
Plugin A - Content: Ini adalah content yang di filter dari setiap plugin
Plugin Akeda B - Author : Akeda Bagus
Plugin Akeda B - Author : admin<span style="color: #000000; font-weight: bold;">@</span>gedex.web.id
Plugin Akeda B - Content: Ini adalah content yang di filter dari setiap plugin
Plugin B - Author : Akeda Bagus
Plugin B - Author : admin<span style="color: #000000; font-weight: bold;">@</span>gedex.web.id
Plugin B - Content: Ini adalah content yang di filter dari setiap plugin</pre></div></div>

<p>Selain untuk menjadi jembatan antara API yang tidak saling kompatibel, Adapter juga dapat digunakan untuk jembatan antara model (tabel dalam bentuk objek) dan database. Karena banyaknya jenis database yang perlu disupport Anda dapat menggunakan pendekatan Adapter dalam hal ini.</p>
<h2>Observer</h2>
<p>Observer mempunyai konsep seperti notifikasi di Facebook dan notifikasi layanan SMS. Di facebook pada saat kita mengomentari <em>posting</em> di <em>wall</em> seseorang maka kita secara tidak langsung akan mendaftarkan diri kita menerima notifikasi jika ada komentar baru. Dalam layanan content di SMS, pada saat kita mendaftarkan diri kita ke suatu layanan via REG DAFTAR, maka kita akan mendapatkan notifikasi/balasan SMS jika ada suatu event berkaitan dengan layanan SMS tersebut. Design pattern Observer terdiri dari dua entitas, yaitu subyek yang di observasi dan <em>observer</em> yang mendaftarkan diri untuk diberitahu jika suatu event terjadi terhadap subyek yang diobservasi. Dalam kasus Facebook, <em>wall posting</em> seseorang disebut sebagai subyek yang di observasi, sedangkan observer-nya adalah teman yang berkomentar di <em>wall posting</em> tersebut. Kita akan ambil contoh class WallPost sebagai subyek yang diobservasi. Pertama kita buat dahulu interface ObservableSubject agar setiap class yang ingin terobservasi harus mengimplementasi interface ini:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000000; font-weight: bold;">interface</span> ObservableSubject <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> reg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> unreg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> notify<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Pada interace ObservableSubject, method <code>reg($key, $obj)</code> digunakan oleh <em>observer</em> yang tertarik mendapatkan notifikasi. Method <code>unreg($key)</code> digunakan jika <em>observer</em> sudah tidak tertarik lagi mendapatkan notifikasi. Sedangkan method <code>notify()</code> digunakan untuk mem-<em>broadcast</em> notifikasi ke semua <em>observer</em> yang telah mendaftar. Sekarang kita perlu membuat interface Observer untuk class yang tertarik menjadi <em>observer</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>8
9
10
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">interface</span> Observer <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getNotification<span style="color: #009900;">&#40;</span><span style="color: #000088;">$wall_owner</span><span style="color: #339933;">,</span> <span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$act</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Berikut contoh class WallPost yang mengimplementasikan ObservableSubject:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> WallPost implements ObservableSubject <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__owner</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__username</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__act</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__observers</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$owner</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__owner <span style="color: #339933;">=</span> <span style="color: #000088;">$owner</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> reg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #339933;">,</span> <span style="color: #000088;">$obj</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__observers<span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$obj</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> unreg<span style="color: #009900;">&#40;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">unset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__observers<span style="color: #009900;">&#91;</span><span style="color: #000088;">$key</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> notify<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__observers <span style="color: #b1b100;">as</span> <span style="color: #000088;">$observer</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
      <span style="color: #000088;">$observer</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getNotification</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__owner<span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__username<span style="color: #339933;">,</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__act<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> fav<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__username <span style="color: #339933;">=</span> <span style="color: #000088;">$username</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__act <span style="color: #339933;">=</span> <span style="color: #0000ff;">'favorites'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">notify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> comment<span style="color: #009900;">&#40;</span><span style="color: #000088;">$username</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__username <span style="color: #339933;">=</span> <span style="color: #000088;">$username</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__act <span style="color: #339933;">=</span> <span style="color: #0000ff;">'comments'</span><span style="color: #339933;">;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">notify</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Pada class WallPost terdapat method <code>reg($key, $obj)</code>, <code>unreg($key)</code> dan <code>notify()</code> yang merupakan hasil kontrak dengan interface ObservableSubject. Semua obyek yang mendaftar melalui method <code>reg($key, $obj)</code> akan dikumpulkan dalam properti array <code>$__observers</code>. Method <code>fav($username)</code> dan <code>comment($username)</code> merupakan aksi (<code>$__act</code>) yang terjadi di WallPost. Jika aksi tersebut terjadi di WallPost, maka method <code>notify()</code> akan dipanggil untuk memberi notifikasi ke semua <em>obervser</em> yang telah terdaftar. Sekarang kita perlu membuat class yang mengimplementasikan Observer. Pada contoh saya akan buat tiga class dengan tujuan yang berbeda-beda, yaitu class UserNotification (untuk menotifikasi pengguna via dashboard), MailerNotification (untuk menotifikasi pengguna via email) dan SystemLog (untuk menotifikasi system logger). Berikut class-class tersebut:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">class</span> UserNotification implements Observer <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__my_name</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$my_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__my_name <span style="color: #339933;">=</span> <span style="color: #000088;">$my_name</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getNotification<span style="color: #009900;">&#40;</span><span style="color: #000088;">$wall_owner</span><span style="color: #339933;">,</span> <span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$act</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;UserNotification: Hi <span style="color: #006699; font-weight: bold;">{$this-&gt;__my_name}</span>! <span style="color: #006699; font-weight: bold;">{$username}</span> <span style="color: #006699; font-weight: bold;">{$act}</span> on <span style="color: #006699; font-weight: bold;">{$wall_owner}</span>'s wall<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> MailerNotification implements Observer <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000088;">$__my_name</span><span style="color: #339933;">;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$my_name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>__my_name <span style="color: #339933;">=</span> <span style="color: #000088;">$my_name</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getNotification<span style="color: #009900;">&#40;</span><span style="color: #000088;">$wall_owner</span><span style="color: #339933;">,</span> <span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$act</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;MailerNotification: Hi <span style="color: #006699; font-weight: bold;">{$this-&gt;__my_name}</span>! <span style="color: #006699; font-weight: bold;">{$username}</span> <span style="color: #006699; font-weight: bold;">{$act}</span> on <span style="color: #006699; font-weight: bold;">{$wall_owner}</span>'s wall<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">class</span> SystemLog implements Observer <span style="color: #009900;">&#123;</span>
  <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getNotification<span style="color: #009900;">&#40;</span><span style="color: #000088;">$wall_owner</span><span style="color: #339933;">,</span> <span style="color: #000088;">$username</span><span style="color: #339933;">,</span> <span style="color: #000088;">$act</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">echo</span> <span style="color: #0000ff;">&quot;SystemLog: <span style="color: #006699; font-weight: bold;">{$username}</span> <span style="color: #006699; font-weight: bold;">{$act}</span> on <span style="color: #006699; font-weight: bold;">{$wall_owner}</span>'s wall<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Sekarang kita tes jalankan :</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
</pre></td><td class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// inisialisasi subyek yang akan diobservasi</span>
<span style="color: #000088;">$my_wall</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> WallPost<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Akeda Bagus&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// daftarkan notifikasi ke semua teman</span>
<span style="color: #000088;">$my_friends</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Budi'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Eko'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Paul'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span> <span style="color: #000088;">$my_friends</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$friend</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  $<span style="color: #009900;">&#123;</span><span style="color: #000088;">$friend</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_dashboard'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> UserNotification<span style="color: #009900;">&#40;</span><span style="color: #000088;">$friend</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  $<span style="color: #009900;">&#123;</span><span style="color: #000088;">$friend</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_mail'</span><span style="color: #009900;">&#125;</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> MailerNotification<span style="color: #009900;">&#40;</span><span style="color: #000088;">$friend</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">reg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$friend</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_dashboard'</span><span style="color: #339933;">,</span> $<span style="color: #009900;">&#123;</span><span style="color: #000088;">$friend</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_dashboard'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">reg</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$friend</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_mail'</span><span style="color: #339933;">,</span> $<span style="color: #009900;">&#123;</span><span style="color: #000088;">$friend</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'_mail'</span><span style="color: #009900;">&#125;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// notifikasikan juga sistem log</span>
<span style="color: #000088;">$sys_log</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> SystemLog<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">reg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'system_log'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$sys_log</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
&nbsp;
<span style="color: #666666; font-style: italic;">// Yuli memfavoritkan postingan di wall Akeda Bagus</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fav</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Yuli'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Jono mengomentari postingan di wall Akeda Bagus</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comment</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Jono'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// Budi dan Eko tidak tertarik lagi mendapatkan notifikasi</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unreg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Budi_dashboard'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unreg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Budi_mail'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unreg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Eko_dashboard'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">unreg</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Eko_mail'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// John berkomentar, tapi kini hanya Paul dan SystemLog yang</span>
<span style="color: #666666; font-style: italic;">// akan menerima notifikasi</span>
<span style="color: #000088;">$my_wall</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">comment</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'John'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>Dan berikut adalah hasilnya:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">akeda<span style="color: #000000; font-weight: bold;">@</span>akeda-laptop:~<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>design_pattern$ php observer.php
UserNotification: Hi Budi<span style="color: #000000; font-weight: bold;">!</span> Yuli favorites on Akeda Bagus<span style="color: #ff0000;">'s wall
MailerNotification: Hi Budi! Yuli favorites on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
UserNotification: Hi Eko<span style="color: #000000; font-weight: bold;">!</span> Yuli favorites on Akeda Bagus<span style="color: #ff0000;">'s wall
MailerNotification: Hi Eko! Yuli favorites on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
UserNotification: Hi Paul<span style="color: #000000; font-weight: bold;">!</span> Yuli favorites on Akeda Bagus<span style="color: #ff0000;">'s wall
MailerNotification: Hi Paul! Yuli favorites on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
SystemLog: Yuli favorites on Akeda Bagus<span style="color: #ff0000;">'s wall
UserNotification: Hi Budi! Jono comments on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
MailerNotification: Hi Budi<span style="color: #000000; font-weight: bold;">!</span> Jono comments on Akeda Bagus<span style="color: #ff0000;">'s wall
UserNotification: Hi Eko! Jono comments on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
MailerNotification: Hi Eko<span style="color: #000000; font-weight: bold;">!</span> Jono comments on Akeda Bagus<span style="color: #ff0000;">'s wall
UserNotification: Hi Paul! Jono comments on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
MailerNotification: Hi Paul<span style="color: #000000; font-weight: bold;">!</span> Jono comments on Akeda Bagus<span style="color: #ff0000;">'s wall
SystemLog: Jono comments on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
UserNotification: Hi Paul<span style="color: #000000; font-weight: bold;">!</span> John comments on Akeda Bagus<span style="color: #ff0000;">'s wall
MailerNotification: Hi Paul! John comments on Akeda Bagus'</span>s <span style="color: #c20cb9; font-weight: bold;">wall</span>
SystemLog: John comments on Akeda Bagus<span style="color: #ff0000;">'s wall</span></pre></div></div>

<h2>Kesimpulan</h2>
<p>Kita sudah membahas tentang Singleton, Registry, Adapter dan Observer. Singleton digunakan untuk situasi dimana dibutuhkan satu obyek saja yang terinisialisasi dari sebuah class (seperti class Database). Registry diibaratkan seperti sebuah phonebook HP, dimana dibutuhkan sebuah class yang dapat menyimpan dan mendapatkan nilai berdasarkan kunci tertentu. Adapter digunakan sebagai jembatan antara dua buah API yang sudah tidak kompatibel atau jembatan antara API yang beragam. Dan yang terakhir adalah Observer yang mempunyai konsep seperti wall post di Facebook, dimana subyek yang menjadi sentral pemberi notifikasi ke obyek yang tertarik terhadap notifikasi subyek tersebut. Di tulisan lain, saya akan bahas design pattern lainnya. Happy Coding!</p>
<h2>Referensi</h2>
<ul>
<li>E. Gamma, R. Helm, R. Johnson, and J. Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, Reading, MA, 1995.
</li>
<li>Steve Holzner. Design Patterns. VTC Videos, 2007.
</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/06/13/design-pattern-dalam-php/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Quick Tips to Help You get Accepted on Google Summer of Code</title>
		<link>http://gedex.web.id/archives/2010/06/01/quick-tips-to-help-you-get-accepted-on-google-summer-of-code/</link>
		<comments>http://gedex.web.id/archives/2010/06/01/quick-tips-to-help-you-get-accepted-on-google-summer-of-code/#comments</comments>
		<pubDate>Tue, 01 Jun 2010 11:55:23 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[coding]]></category>

		<category><![CDATA[Google Summer of Code 2010]]></category>

		<category><![CDATA[GSoC]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=328</guid>
		<description><![CDATA[
I&#8217;ve great news that, AFAIK, there are two students from Indonesia that have been accepted on Google Summer of Code 2010. They are (drum roll please) Akeda and Dwi. I&#8217;ve been posted a message on gsoc student mailing list to alert other Indonesian students, but no one replying. So, I guess there&#8217;s only me and [...]
]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve great news that, AFAIK, there are two students from Indonesia that have been accepted on Google Summer of Code 2010. They are (drum roll please) <a href="http://docs.google.com/View?id=dd78s8mr_5cs8x3shh">Akeda</a> and <a href="http://wiki.github.com/ginatrapani/thinktank/dwi-widiastuti-installation-simplification-and-auto-updates">Dwi</a>. I&#8217;ve been posted a message on gsoc student mailing list to alert other Indonesian students, but no one replying. So, I guess there&#8217;s only me and dwi get accepted this year. Since, I&#8217;ve accepeted I&#8217;ll give my own tips on how to get accepted as a student of Google Summer of Code. The key is write a good proposal and communicate with your mentoring project oftenly. A good proposal is not your first try proposal. When you writing your proposal for the first time oftenly it&#8217;s just a draft proposal. You need to ask your mentoring project some feedbacks and iterate the process by rewrite and ask again until the mentoring project says okay. This year is a little bit different, some mentoring organisations posts some bugs tagged for applicants and each applicant should work, on bug(s) by submitting patch for that bug. I did this. Doing this means your chance to get attentions from mentoring organisation is higher. So, you need to touch the codebase of the project which you have interest on it. Because of this you shouldn&#8217;t have to submit a proposal as much as you think to get accepted. The increased quantity of your proposals may even decreased overall proposal qualities, since you have to split your focus. </p>
<p>Okay, you&#8217;ve got the picture? Alright, how about the content of good proposal? Some mentoring organisations were kind enough to give us templates of proposal to work on. The templates are general as it should have a brief description about the project you have interested in, implementation plans, timeline and short biography about yourself. You should focus (IMHO) on writing your implementation plans and timeline. A google summer of code project is around 3 or 4 months duration, so it can be said as a medium project for a single developer. The key is how good you describe the problem and its solution. When you touched the codebase of a project for submitting patch, you get the benefits on how you&#8217;ll describe the software on your proposal. Use the name of the classes, methods, libraries that related to your project and how you&#8217;ll using it to solve the problem. Mentoring organisations will pick up student that already familiar with their codebase. Don&#8217;t write too much, use screenshots if available. If your project is a complex one, divide your project into three or four subprojects then define the timeline of each subprojects. Well, that&#8217;s my own quick tips. I hope Indonesian students will aware about this event on the next year <img src='http://gedex.web.id/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/06/01/quick-tips-to-help-you-get-accepted-on-google-summer-of-code/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Hari Baru yang Perlu Diingat</title>
		<link>http://gedex.web.id/archives/2010/05/20/hari-baru-yang-perlu-diingat/</link>
		<comments>http://gedex.web.id/archives/2010/05/20/hari-baru-yang-perlu-diingat/#comments</comments>
		<pubDate>Thu, 20 May 2010 09:31:02 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[etc]]></category>

		<category><![CDATA[family]]></category>

		<category><![CDATA[my life]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=326</guid>
		<description><![CDATA[
Hari itu adalah 16 Mei, dan perlu saya ingat agar &#8220;Nyonya&#8221; juga tidak mengkencangkan otot mata. Sebenarnya saya juga bingung mau menulis apa, ini hanya tulisan asal agar blog ini terlihat terkini. Btw, komentar di blog ini tetap saja ada yang masuk dan paling banyak ke tulisan saya mengenai penipuan undian telkomsel. Hal ini membuktikan [...]
]]></description>
			<content:encoded><![CDATA[<p>Hari itu adalah 16 Mei, dan perlu saya ingat agar &#8220;Nyonya&#8221; juga tidak mengkencangkan otot mata. Sebenarnya saya juga bingung mau menulis apa, ini hanya tulisan asal agar blog ini terlihat terkini. Btw, komentar di blog ini tetap saja ada yang masuk dan paling banyak ke tulisan saya mengenai <a href="http://gedex.web.id/archives/2008/03/24/penipuan-berkedok-undian-motor-telkomsel/">penipuan undian telkomsel</a>. Hal ini membuktikan modus penipuan seperti ini masih menjamur.</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/05/20/hari-baru-yang-perlu-diingat/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Pergeseran Waktu dalam Perjuangan</title>
		<link>http://gedex.web.id/archives/2010/03/05/pergeseran-waktu-dalam-perjuangan/</link>
		<comments>http://gedex.web.id/archives/2010/03/05/pergeseran-waktu-dalam-perjuangan/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 23:58:12 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[my life]]></category>

		<category><![CDATA[belajar]]></category>

		<category><![CDATA[engineer]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=317</guid>
		<description><![CDATA[
Beberapa bulan ini saya merasakan pergeseran waktu kembali. Yup, hari terasa begitu cepat berlalu tahun ini, siang kini terasa semakin cepat dan malam menjelang pagi terasa begitu lama. Beberapa bulan ini saya kembali menjadi kalong, tidur dikala para pekerja terjebak macet menuju kantor mereka dan bangun dikala pekerja hendak makan siang. Well, sejak kuliah (dan [...]
]]></description>
			<content:encoded><![CDATA[<p>Beberapa bulan ini saya merasakan pergeseran waktu kembali. Yup, hari terasa begitu cepat berlalu tahun ini, siang kini terasa semakin cepat dan malam menjelang pagi terasa begitu lama. Beberapa bulan ini saya kembali menjadi kalong, tidur dikala para pekerja terjebak macet menuju kantor mereka dan bangun dikala pekerja hendak makan siang. Well, sejak kuliah (dan bahkan sejak SMA) saya sudah terinfeksi dengan pola hidup seperti ini. Belajar dan bekerja disaat semua orang terlelap bagi saya mempunyai nuansa tersendiri. Kadang jika kita ingin meraih sesuatu ada hal yang harus kita korbankan, entah itu kebersamaan atau waktu tidur. Dan sayangnya saya selalu ingin meraih sesuatu sehingga ada saja yang harus dikorbankan. Apa yang ingin saya raih saat ini? Hmm.. hanya satu, yaitu ilmu (saya bohong, plus uang tentunya). Berbicara tentang keinginan yang diraih, saya jadi teringat percakapan dengan teman saya malam kemarin, seseorang yang ingin bekerja dibidang yang disukai (tapi dengan <em>salary</em> yang setimpal). <span id="more-317"></span>Sebenarnya itu mudah, bahkan kita tidak perlu mencari pekerjaan itu. Jika memang ingin bekerja dibidang yang kita sukai plus gaji yang setimpal atau berlebih maka bekerjalah di bidang tersebut terlebih dahulu karena kecintaan terhadap bidang yag digeluti. Bangun <em>experience</em> di bidang tersebut sehingga orang dapat langsung menilai kualitas Anda karena experience. Tentunya experience perlu pengorbanan terlebih dahulu, baik waktu dan uang. Saya senang melihat profil Software Engineer di Facebook, Google dan Yahoo. Mereka benar-benar engineer yang mencintai pekerjaannya dan menginsparasi orang lain. Terkadang <a href="http://www.catonmat.net/blog/my-job-interview-at-google/" rel="external nofollow">proses udangan <em>interview</em> di Google</a> adalah dengan mencari di internet atau karena nama kita cukup terdengar di internet. Jadi membangun portfolio di internet sangat membantu mengenalkan diri Anda ke perusahaan yang Anda incar.</p>
<p>Well, membangun portfolio di internet tidak dapat instan. Mungkin kita bisa lihat perjalanan Guido van Rossum&mdash;mengembangkan Python&mdash;bekerja sebagai <em>engineer</em> di Google,  Rasmus Lerdorf&mdash;mengembangkan PHP&mdash;yang menjadi <em>Distinguished Engineer</em> Yahoo, dan banyak engineer lainnya. Oh ya, mempunyai <em>influence</em> merupakan <em>starting point</em> untuk dapat menjadi sukses seperti mereka. Oh ya, tentunya siap dengan pergeseran waktu.</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/03/05/pergeseran-waktu-dalam-perjuangan/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ls direktori dalam format tree</title>
		<link>http://gedex.web.id/archives/2010/03/04/ls-direktori-dalam-format-tree/</link>
		<comments>http://gedex.web.id/archives/2010/03/04/ls-direktori-dalam-format-tree/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 22:40:07 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[linux]]></category>

		<category><![CDATA[tips & tricks]]></category>

		<category><![CDATA[ls]]></category>

		<category><![CDATA[tree]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=304</guid>
		<description><![CDATA[
Apabila kita bekerja dengan konsol dan ingin mengetahui struktur direktori tertentu biasanya kita melakukannya dengan perintah ls nama_direktori, lalu kita ls lagi direktori di dalamnya. Jika kita bekerja di desktop, kita dapat mengetahui struktur direktori tertentu dengan membuka penjelajah berkas (file browser). Sebenarnya di konsol, ada perintah tree untuk melihat senarai direktori dalam format tree.
tree [...]
]]></description>
			<content:encoded><![CDATA[<p>Apabila kita bekerja dengan konsol dan ingin mengetahui struktur direktori tertentu biasanya kita melakukannya dengan perintah <code>ls nama_direktori</code>, lalu kita <code>ls</code> lagi direktori di dalamnya. Jika kita bekerja di desktop, kita dapat mengetahui struktur direktori tertentu dengan membuka penjelajah berkas (<em>file browser</em>). Sebenarnya di konsol, ada perintah <code>tree</code> untuk melihat senarai direktori dalam format <em>tree</em>.</p>
<blockquote><p>tree - list contents of directories in a tree-like format.</p></blockquote>
<p>Saya menggunakan ubuntu, cukup mudah menginstalnya jika perintah <code>tree</code> belum tersedia.</p>
<p><code>sudo apt-get install tree</code></p>
<p>Lalu kita lihat seperti apa keluarannya:</p>
<pre>
akeda@akeda-desktop:~$ tree ~/www/keuangan/app/models
/home/akeda/www/keuangan/app/models
|-- activity.php
|-- activity_child.php
|-- behaviors
|   |-- empty
|   |-- formatable.php
|   `-- money.php
|-- budget.php
|-- budget_detail.php
|-- budget_detail_description.php
|-- city.php
|-- datasources
|   `-- empty
|-- funding_source.php
|-- group.php
|-- groups_module_action.php
|-- journal_bank.php
|-- journal_cash.php
|-- journal_tax.php
|-- menu.php
|-- menu_type.php
|-- module.php
|-- module_action.php
|-- province.php
|-- site_setting.php
|-- tax_type.php
|-- transaction.php
|-- transaction_revision.php
|-- unit.php
|-- unit_code.php
|-- user.php
|-- user_log.php
`-- volume.php

2 directories, 30 files
</pre>
<p></p>
<p>Sebernarnya keluaran hasil <code>tree</code> di atas berwarna tergantung tipe berkas dan ekstensinya (yang terdefinsi dalam <code>dircolors</code>). Untuk penggunaan lebih lanjut silahkan coba-coba dan baca <code>man tree</code>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/03/04/ls-direktori-dalam-format-tree/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Copy dari clipboard konsol (X11)</title>
		<link>http://gedex.web.id/archives/2010/02/26/copy-dari-clipboard-konsol-x11/</link>
		<comments>http://gedex.web.id/archives/2010/02/26/copy-dari-clipboard-konsol-x11/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 22:48:44 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[linux]]></category>

		<category><![CDATA[tips & tricks]]></category>

		<category><![CDATA[xclip]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=295</guid>
		<description><![CDATA[
Suatu saat Anda berada dalam konsol server yang tidak memiliki tetikus (mouse). Katakanlah Anda perlu mengkopi suatu berkas ke berkas lain, mungkin langkahnya seperti berikut:

membuka suatu berkas (misal dengan vim), dan
memblok seluruh baris lalu melakukan kopi (Ctrl-C), tutup berkas, dan
membuka berkas lainnya untuk mem-paste-nya.

Ups, mungkin Anda lupa bagaimana perintah di Vim untuk memblok keseluruhan baris. [...]
]]></description>
			<content:encoded><![CDATA[<p>Suatu saat Anda berada dalam konsol server yang tidak memiliki tetikus (<em>mouse</em>). Katakanlah Anda perlu mengkopi suatu berkas ke berkas lain, mungkin langkahnya seperti berikut:</p>
<ol>
<li>membuka suatu berkas (misal dengan vim), dan</li>
<li>memblok seluruh baris lalu melakukan kopi (Ctrl-C), tutup berkas, dan</li>
<li>membuka berkas lainnya untuk mem-paste-nya.</li>
</ol>
<p>Ups, mungkin Anda lupa bagaimana perintah di Vim untuk memblok keseluruhan baris. Disini xclip membantu Anda. Hal yang umum dilakukan kita adalah mengkopi isi dari berkas SSH Public Key di dalam berkas ~/.ssh/id_rsa.pub. Contohnya:</p>
<p><code>cat ~/.ssh/id_rsa.pub | xclip -sel clip</code></p>
<p>Silahkan klik Ctrl-V di tempat yang Anda inginkan. Untuk yang belum terinstall xclip, silahkan unduh di <a href="http://sourceforge.net/projects/xclip/" rel="external nofollow">sini</a>. Untuk pengguna Ubuntu:</p>
<p><code>sudo apt-get install xclip</code></p>
<p>Referensi:<br />
<a href="http://sourceforge.net/projects/xclip/" rel="external nofollow">http://sourceforge.net/projects/xclip/</a><br />
<a href="http://help.github.com/linux-key-setup/" rel="external nofollow">http://help.github.com/linux-key-setup/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/02/26/copy-dari-clipboard-konsol-x11/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Sebelum Menggunakan Email Component CakePHP</title>
		<link>http://gedex.web.id/archives/2010/02/05/sebelum-menggunakan-email-component-cakephp/</link>
		<comments>http://gedex.web.id/archives/2010/02/05/sebelum-menggunakan-email-component-cakephp/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 22:18:49 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[coding]]></category>

		<category><![CDATA[tips & tricks]]></category>

		<category><![CDATA[cakephp]]></category>

		<category><![CDATA[mta]]></category>

		<category><![CDATA[sendmail]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=276</guid>
		<description><![CDATA[
Yang umum dalam halaman pendaftaran adalah selesai mendaftar akan ada konfirmasi telah mendaftar. Halaman konfirmasi tersebut bisa saja dengan halaman web atau dikirim ke email pendaftar. Kebetulan saya sedang mengerjakan hal serupa dimana konfirmasi juga dikirimkan ke email pendaftar. Saya menggunakan CakePHP untuk mengembangkan aplikasi, dimana telah tersedia komponen Email untuk memudahkan pekerjaan seperti ini. [...]
]]></description>
			<content:encoded><![CDATA[<p>Yang umum dalam halaman pendaftaran adalah selesai mendaftar akan ada konfirmasi telah mendaftar. Halaman konfirmasi tersebut bisa saja dengan halaman web atau dikirim ke email pendaftar. Kebetulan saya sedang mengerjakan hal serupa dimana konfirmasi juga dikirimkan ke email pendaftar. Saya menggunakan CakePHP untuk mengembangkan aplikasi, dimana telah tersedia komponen Email untuk memudahkan pekerjaan seperti ini. Penjelasan di <a href="http://book.cakephp.org/view/176/Email">cookbook CakePHP, bagian Email Component</a> itu sudah cukup jelas dan sudah saya coba. Tapi jika Anda mengalami kendala tidak terkirimnya Email, mungkin saja sistem operasi Anda belum terinstall MTA (Mail Transfer Agent). Anda bisa gunakan sendmail. Instalasi MTA dan asosiasinya dengan DNS Server-nya tidak akan saya jelaskan disini, saya sendiripun belum pernah mencoba <img src='http://gedex.web.id/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Untuk coba-coba saat pengembangan, Anda bisa menggunakan MTA sendmail. Saya menggunakan Ubuntu, untuk menginstall-nya gunakan perintah ini:</p>
<p><code>sudo apt-get install sendmail mailutils</code></p>
<p>Untuk mencoba mengirim email bisa gunakan utiliti mail :</p>
<p><code>mail -s "Test" me@example.net < /var/log/email.info</code></p>
<p>Ini akan mengirim email ke me@example.net dengan subject Test dan isi pesannya adalah isi dari berkas <code>/var/log/email.info</code>. Kebetulan server development di tempat saya MTA-nya sudah terasosiasi dengan DNS Server-nya jadi saya bisa menerima email tersebut ke inbox gmail saya, tanpa masuk ke spam, from-nya otomatis terisi oleh nama_user_di_server_development@nama_domain. Jika belum terasosiasi dengan DNS-Server-nya akan nyangkut di spam. Jika sudah terinstall MTA dan bisa terkirim emailnya ke tujuan, saatnya mencobanya dengan CakePHP. Good luck!</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/02/05/sebelum-menggunakan-email-component-cakephp/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rencana Menulis Buku dan Mengajar</title>
		<link>http://gedex.web.id/archives/2010/02/05/rencana-menulis-buku-dan-mengajar/</link>
		<comments>http://gedex.web.id/archives/2010/02/05/rencana-menulis-buku-dan-mengajar/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 21:30:16 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[bekasi problems]]></category>

		<category><![CDATA[just FYI]]></category>

		<category><![CDATA[my life]]></category>

		<category><![CDATA[buku]]></category>

		<category><![CDATA[mengajar]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=264</guid>
		<description><![CDATA[
Ketika seseorang bertanya hal teknis, saya sering memberi jawaban untuk googling (mungkin sedang tidak mood untuk menjelaskan) tapi terkadang saya memberi jawaban panjang lebar  (yang mungkin malah membuat sipenanya semakin bingung). Saya yakin kesalahan ada pada saya dalam hal menjelaskan. Untuk itu saya berusaha mengasah cara penyampaian dengan mulai berbicara di depan banyak orang. [...]
]]></description>
			<content:encoded><![CDATA[<p>Ketika seseorang bertanya hal teknis, saya sering memberi jawaban untuk <em>googling</em> (mungkin sedang tidak <em>mood</em> untuk menjelaskan) tapi terkadang saya memberi jawaban panjang lebar  (yang mungkin malah membuat sipenanya semakin bingung). Saya yakin kesalahan ada pada saya dalam hal menjelaskan. Untuk itu saya berusaha mengasah cara penyampaian dengan mulai <a href="http://gedex.web.id/archives/2009/12/05/seminar-go-open-source-di-sma-sudirman-bekasi/">berbicara di depan banyak orang</a>. Jika tidak halangan, insyaallah, hari sabtu dan minggu saya akan membawakan materi di acara bertema Joomla di Paramadina. Dengan membiasakan diri menyampaikan materi di depan banyak orang, saya berharap ke depannya akan lebih mudah menyampaikan suatu materi kepada orang lain. Di waktu saya yang tidak terlalu sibuk ini, saya terpikir ingin menulis buku dan mengajar. Untuk menulis buku ada beberapa tema yang ingin saya tuliskan, antara lain: Python atau Django, cakePHP, jQuery dan HTML5+CSS3. Saya tidak tahu apakah tema-tema tersebut sudah banyak bukunya atau belum di Indonesia. Mungkin saya akan survey dulu untuk mencari tahu. Saya juga tidak tahu penerbit buku mana yang tepat untuk tema komputer. Rencana saya (kalau memungkinkan) adalah menggratiskan pengunduhan buku dalam format pdf atau HTML, tapi memungkinkan orang lain untuk mendapatkan <em>hardcopy</em> buku tersebut di toko buku. Ini seperti buku <a href="http://diveintopython3.org/">Dive Into Python</a>. Saya tidak tahu apakah ada penerbit buku di Indonesia seperti <a href="http://apress.com/">Apress</a>. Apakah memungkinkan di Indonesia jika tulisan kita lisensikan di bawah lisensi <a href="http://creativecommons.org/licenses/by-sa/3.0/"><em>Creative Common</em></a> tapi penerbit mau mencetaknya?</p>
<p>Dulu saat saya rajin ke Gramedia, saya sering menumpang membaca buku-buku komputer. Ada hal yang mengagetkan saya dari salah seorang penulis buku komputer Indonesia. Penulis ini banyak menulis buku komputer dan buku yang ditulis bukan buku terjemahan. Temanya meliputi elektronika dan bahasa pemrograman. Yang membuat saya kaget adalah tulisan yang ada di buku ini sudah saya baca semuanya di internet, dengan kata lain apa yang ada di buku-bukunya itu ada semua di internet, hanya saja berbeda bahasa. Ini bukan lagi kutipan, tapi kumpulan terjemahan halaman situs berbahasa Inggris ke bahasa Indonesia. Pantas saja buku komputer yang ditulisnya banyak sekali. Memang sekilas tidak ada yang salah, tapi seharusnya di buku tersebut di jelaskan bahwa tulisan bab sekian merupakan terjemahan dari halaman situs blablabla. Menurut saya mengambil referensi dari buku lain atau halaman situs itu tidak ada yang salah selama pengutip tidak menyalahi hak cipta penulis. Tapi ini menjadi tidak wajar jika banyaknya halaman yang diterjemahkan tanpa mengubah gaya penulisan. Buku-buku luar , seperti buku pemrograman Python atau HTML+CSS itu banyak sekali. Tapi mereka semua menulis dengan gaya yang berbeda dan mereka menyusun <em>chapter</em>-nya berbeda pula. Apakah penerbit Indonesia meloloskan buku seperti ini dengan mudah? Atau saya saja yang lebay? Dan juga kebanyakan buku komputer di Indonesia itu tidak di jaga kelanjutannya oleh penulisnya sendiri. Beberapa penerbit luar seperti O&#8217;reilly dan Apress menyediakan halaman resource tersendiri untuk buku yang diterbitkan, ini meliputi errata, halaman unduh dan bahkan penulisnya membuatkan situs khusus untuk buku tersebut sebagai wadah diskusi, saran dan kritik dari pembaca. Sepertinya berat juga jadi penulis *berpikir kembali sebelum menulis*.</p>
<p>Selain berkeinginan menulis, kenapa tiba-tiba juga ingin mengajar? Well, menulis itu mudah. Kita tidak langsung mengetahui apakah pembaca memahami atau tidak. Sedangkan dengan mengajar kita langsung bertatap muka, sehingga setidaknya bisa diketahui apakah penyimak memahami apa yang kita sampaikan atau tidak. Ada beberapa ide yang terpikir oleh saya dalam mengajar, antara lain:</p>
<ol>
<li>Jika saya mengajar yang berkaitan dengan bahasa pemrograman, saya ingin yang saya ajarkan nanti membuat kelompok, merencakan membuat suatu proyek sumber terbuka lalu mengunggahnya di repositori dengan sistem kontrol versi (seperti di github.com, code.google.com atau sf.net). Mereka akan menjalani siklus pengembangan aplikasi sumber terbuka. Jika hitungan mengajar materi pemrograman ini selama 6 bulan, maka cukup bagi mereka untuk merilis sampai beberapa versi stabil. Saya lihat belum ada (CMIIW) perguruan tinggi berbasis IT di Indonesia yang mempunyai repositori sistem kontrol versi sendiri seperti github atau sf.net. Padahal ini bisa menjadi pemicu mahasiswanya untuk berkarya dan berkontribusi di dunia aplikasi sumber terbuka.</li>
<li>Di kampus saya ada kompetisi membuat perangkat lunak, tapi saya tidak tahu bagaimana proses pengembangan di belakangnya. Terkait dengan point no. 1, pastinya juri dapat memantau proses pengembangannya, juri dapat mengetahui siapa programmer yang paling aktif meng-<em>commit</em>. Selain penilaian secara fungsionalitas dan kekreatifan ide, seharusnya aplikasi juga dinilai dari kualitas kode yang dibuat. Mungkin ini agak sulit bagi juri jika harus mereview kualitas kode, tapi bisa digunakan skrip yang membaca dari repositori untuk melihat frekuensi baris komentar, membaca seberapa banyak log commit, frekuensi keaktifan programmer dalam commit — seperti <em>Ohloh Analysis Summary</em>. Dan baiknya setiap aplikasi menyediakan unit testing, sehingga juri bisa langsung melihat seberapa banyak unit test mencangkup aspek fungsionalitas aplikasi.</li>
</ol>
<p>Ya ini hanya rencana yang saya ingin wujudkan, insyaallah.</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/02/05/rencana-menulis-buku-dan-mengajar/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Kesuksesan, Kegagalan dan Tanggung Jawab</title>
		<link>http://gedex.web.id/archives/2010/01/18/kesuksesan-kegagalan-dan-tanggung-jawab/</link>
		<comments>http://gedex.web.id/archives/2010/01/18/kesuksesan-kegagalan-dan-tanggung-jawab/#comments</comments>
		<pubDate>Sun, 17 Jan 2010 19:51:32 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[etc]]></category>

		<category><![CDATA[family]]></category>

		<category><![CDATA[just FYI]]></category>

		<category><![CDATA[my life]]></category>

		<category><![CDATA[my opinion]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=246</guid>
		<description><![CDATA[
Sejak pertengahan desember saya sudah tidak lagi bekerja di perusahaan. Saya sempat berpindah ke content provider juga, dan hanya empat hari saya bekerja. Lho kenapa? Jawabannya akan saya berikan nanti. Ada beberapa alasan yang membuat saya &#8220;untuk sementara ini&#8221; menjadi pekerja lepas saja. Sebelum memulai bercerita, kita flashback dulu di masa saat saya menjelang lulus [...]
]]></description>
			<content:encoded><![CDATA[<p>Sejak pertengahan desember saya sudah tidak lagi bekerja di perusahaan. Saya sempat berpindah ke <em>content provider</em> juga, dan hanya empat hari saya bekerja. Lho kenapa? Jawabannya akan saya berikan nanti. Ada beberapa alasan yang membuat saya <strong>&#8220;untuk sementara ini&#8221;</strong> menjadi pekerja lepas saja. Sebelum memulai bercerita, kita <em>flashback</em> dulu di masa saat saya menjelang lulus kuliah. Faktor pertama yang membuat saya ingin bekerja di suatu perusahaan adalah uang, tapi itu dulu, saat saya baru pertama kali ingin bekerja. Saya sempat mengalami masa luntang-lantung hanya dengan datang ke kampus, ngobrol bersama teman, dan sesekali mengoprek robot tanpa menghasilkan uang sama sekali. Saya mulai mengkesampingkan idealisme saya dan berencana bekerja di perusahaan saja. Tanpa pikir panjang tawaran yang ada di depan mata saat itu pun saya ambil. Jelas saat itu, alasan utama adalah karena uang. Selain alasan uang, tentunya saya juga ingin mencari pengalaman dan ilmu. Saat bekerja disuatu perusahaan, saya merasakan idealisme yang mulai luntur. Saya tidak pernah lagi berpikir tentang kualitas karena saat bekerja saya lebih dituntut oleh waktu. Saya tidak sempat lagi untuk mencoba-coba hal baru, menerapkan hal baru bahkan untuk menulis kode secara rapih dan <em>decoupling</em>. Saya mulai berpikir &#8220;kapan saya bisa maju jika hanya berkutat dengan hal seperti ini terus&#8221;. Saat bekerja diperusahaan, saya harus menerima apapun pekerjaan yang diberikan. Meskipun gaya menulis kode saya tidak sesuai, saya harus tetap menerima. Saat merapikan pekerjaan lama, saya harus memilih diantara pekerjaan saya tidak selesai sesuai waktu atau memaksakan gaya menulis dengan yang sudah ada.<br />
<span id="more-246"></span><br />
Akhirnya saya memutuskan untuk keluar dari pekerjaan saya. Tidak terpikir oleh sayapun akan bekerja dimana nanti, hanya saya tidak ingin <em>stack</em>. Saya masih ingin mencari ilmu lagi. Akhirnya untuk sementara saya putuskan bekerja lepas saja, toh saya masih bisa bereksperimen bebas. Jika Anda yakin dengan bekerja lepas dapat membuat Anda lebih maju sambil menuntut ilmu, Anda tidak sendiri karena saya berpikir yang sama dengan Anda. Tidak semua bekerja di perusahaan itu membuat <em>stack</em>, ada beberapa orang yang beruntung dapat bekerja sambil bereksperimen. Beberapa perusahaan ada yang menghasilkan produk sumber terbuka dimana mengharuskan pekerjanya berkontribusi di produk sumber terbuka tersebut. Setelah keluar dari satu perusahaan saya sempat berpindah ke perusahaan <em>content provider</em>. Kenapa hanya sampai empat hari? Baiklah, mungkin ini kesalahan saya. Kita tidak pernah tahu apakah tempat bekerja kita nantinya akan membuat kita nyaman atau tidak. Saya berinsiatif mengundurkan diri secepatnya, karena jika saat saya tak nyaman tentunya akan berpengaruh terhadap kinerja. Saya sadari jika ini terlalu egois dan idealis, OK itu salah saya.</p>
<p>Kembali ke <del datetime="2010-01-17T19:19:51+00:00">laptop</del> masa kuliah. Sejak duduk di bangku kuliah, saya ingin sekali berkontribusi dalam banyak hal, salah satunya yang belum kesampaian adalah membuat proyek sumber terbuka. Karena saya sudah mempunyai banyak waktu luang, saya mencoba belajar untuk membuat <a href="https://www.ohloh.net/accounts/gedex">proyek sumber terbuka</a>. Jangan takut dengan kualitas kode kita saat ini, karena seiring waktu jika Anda terus belajar dengan benar kualitas kode yang Anda hasilkan pasti akan meningkat. Kunci dalam proyek sumber terbuka adalah <em>release early, release often</em>. Jadi mulailah kontribusikan skrip sederhana Anda, jangan takut dengan bug-bug yang akan muncul nantinya. Saya percaya dengan kita banyak berkontribusi bagi banyak orang pekerjaan akan datang dengan sendirinya. Sambil menulis kode secara bebas, saya bisa memanfaatkan situs untuk <em>freelancer</em> yang melelang pekerjaan lepas.</p>
<p>Pada saat berada dalam kondisi seperti ini, saya terlalu terngiang dengan pikiran &#8220;Apakah saya telah gagal? Apakah saya bisa sukses dengan cara seperti ini? Apakah saya tidak bertanggung jawab dengan <strong>tidak bekerja tetap</strong>? Saya yakin, orang-orang dekat Anda akan bertanya &#8220;Bagaimana keluarga mu kelak nak?&#8221;. Saya tidak punya jawaban yang tepat dengan pertanyaan itu, karena hal itu butuh pembuktian dan belum terjadi. Pertanyaan seperti itu sebenarnya sama seperti &#8220;Bagaimana nanti kamu saat umur 40?&#8221; Tidak tahu bukan. Tapi saya punya rencana saat ini. Hehe.. jadi saya hanya bisa sebutkan rencana. Mari kita baca kembali paragraf ini dari awal, perhatikan kalimat &#8220;Apakah saya <strong>telah gagal</strong>?&#8221;. Ini menunjukkan suatu kejadian lampau. Ya, kejadian ini mungkin akan terulang lagi di masa depan, mungkin juga tidak. Lalu kalimat setelahnya &#8220;Apakah saya bisa sukses dengan cara seperti ini?&#8221;. Ini menunjukkan ketidakpastian mengenai sesuatu yang kita tempuh. Pernah mendengar kalimat &#8220;Gagal adalah suatu kejadian, sukses adalah jalan / cara&#8221;? Lalu apa kaitannya dengan tanggung jawab? Menurut saya, tanggung jawab disini adalah bagaimana strategi kita menghadapi kejadian gagal dan mencapai jalan sukses. Dan satu lagi, sukses itu relatif, bukan uang. Orang mempunyai perspektif yang berbeda mengenai sukses. Saya mempunyai gambaran yang mungkin sama dengan Anda tentang sukses. Saat kita mempunyai beberapa target kedepan dan kita bisa sukses mencapai target tersebut, bisa dikatakan kita telah sukses. Saat saya mempunyai target membuat proyek sumber terbuka dan belum tercapai, bisa dikatakan saya sedang menjalani cara sukses saya. Saat saya telah membuat proyek sumber terbuka, saya mempunyai target mempopulerkan dan terus mengembangkan proyek tersebut. Dan seterusnya target itu akan terus ada.</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/01/18/kesuksesan-kegagalan-dan-tanggung-jawab/feed/</wfw:commentRss>
		</item>
		<item>
		<title>svn:ignore yang menjengkelkan</title>
		<link>http://gedex.web.id/archives/2010/01/05/svnignore-yang-menjengkelkan/</link>
		<comments>http://gedex.web.id/archives/2010/01/05/svnignore-yang-menjengkelkan/#comments</comments>
		<pubDate>Tue, 05 Jan 2010 05:17:22 +0000</pubDate>
		<dc:creator>gedex</dc:creator>
		
		<category><![CDATA[coding]]></category>

		<category><![CDATA[just FYI]]></category>

		<category><![CDATA[my life]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[subversion]]></category>

		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://gedex.web.id/?p=237</guid>
		<description><![CDATA[
Saat melihat blog Pak Budi Rahardjo saya jadi terpacu untuk menulis kembali. Konten blog tidak perlu selalu berisi hal teknis yang memerlukan waktu untuk menulisnya, tapi bisa kondisi hari ini. Yup hari ini saya dijengkelkan dengan sistem kontrol versi Subversion. Saya mulai membiasakan pekerjaan dan proyek pribadi untuk dikontrol versinya sejak saya bekerja di SIG. [...]
]]></description>
			<content:encoded><![CDATA[<p>Saat melihat blog Pak Budi Rahardjo saya jadi terpacu untuk menulis kembali. Konten blog tidak perlu selalu berisi hal teknis yang memerlukan waktu untuk menulisnya, tapi bisa kondisi hari ini. Yup hari ini saya dijengkelkan dengan sistem kontrol versi Subversion. Saya mulai membiasakan pekerjaan dan proyek pribadi untuk dikontrol versinya sejak saya bekerja di SIG. Yang menjengkelkan dari Subversion adalah <em>exclude</em> berkas yang tidak perlu di rekam versinya. Dalam Subversion digunakan perintah <code>svn propedit svn:ignore</code> untuk mengabaikan berkas di direktori kerja kita. </p>
<p>Tapi apabila kita banyak menggunakan berkas konfigurasi yang terpisah di beberapa direktori dan juga berkas temporari yang dihasilkan aplikasi, pekerjaan ini menjadi menjengkelkan. Belum lagi pengguna Subversion yang melupakan hal ini dan meng-<em>commit</em> berkas yang kita abaikan. Lalu kita ulang lagi <code>svn rm</code> dan menggunakan <code>svn propedit svn:ignore</code> kembali. Apakah ada solusi untuk ini ? Atau gunakan sistem kontrol versi lainnya seperti <a href="http://git-scm.com/">Git</a>? Untuk Git, saya belum begitu paham. Tapi saya sudah coba gunakan <a href="http://github.com/">github</a> untuk <a href="http://github.com/gedex/World-University-Names-Database/">skrip sederhana saya</a> sekaligus untuk belajar. Jika saya tertarik, saya akan pindahkan <a href="http://code.google.com/u/gedex.adc/">proyek iseng saya</a> ke <a href="http://github.com/gedex/">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://gedex.web.id/archives/2010/01/05/svnignore-yang-menjengkelkan/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
