<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-6231031171309673290</atom:id><lastBuildDate>Thu, 25 Feb 2010 14:11:10 +0000</lastBuildDate><title>digitalXPerience</title><description /><link>http://arthur.purnama.de/</link><managingEditor>noreply@blogger.com (Arthur Purnama)</managingEditor><generator>Blogger</generator><openSearch:totalResults>30</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/digitalxperience" /><feedburner:info uri="digitalxperience" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>digitalxperience</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-902410558504609050</guid><pubDate>Sun, 07 Dec 2008 22:01:00 +0000</pubDate><atom:updated>2008-12-08T12:02:13.441+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Publication</category><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Object Cloning di PHP 5</title><description>&lt;div class="separator" style="float: left; clear: both;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/STz6qtVeutI/AAAAAAAAApM/F6HubzqF1HQ/s1600-h/914335_85510317_2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 116px;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/STz6qtVeutI/AAAAAAAAApM/F6HubzqF1HQ/s200/914335_85510317_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5277368475002518226" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;script language="javascript" src="http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shCore.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script language="javascript"&gt;window.onload = function () {  dp.SyntaxHighlighter.ClipboardSwf = 'http://syntaxhighlighter.googlecode.com/svn/trunk/Scripts/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');}&lt;/script&gt;
Beberapa waktu lalu sempat ada yang bertanya tentang &lt;a href="http://tech.groups.yahoo.com/group/id-php/message/22522" target="_blank"&gt;apa efektifnya menggunakan object cloning di PHP 5&lt;/a&gt;. Untuk mengetahui efektifitasnya, maka mungkin ada baiknya untuk mengetahui kenapa PHP 5 support object cloning. &lt;br /&gt;&lt;br /&gt;

&lt;a href="http://tech.groups.yahoo.com/group/id-php/message/22536" target="_blank"&gt; Jawaban gue atas thread ini&lt;/a&gt;, gue masukin ke blog gue sebagai referensi gue. Dan gue harap juga bisa membantu yang lain kalau sedang belajar tentang object cloning di PHP 5. Apabila ada yang perlu di koreksi, ditambahkan atau dikritik, gue terima dengan senang hati.&lt;br /&gt;

&lt;span class="fullpost"&gt;&lt;br /&gt;
Pada dasarnya informasi tentang object cloning bisa dibaca di &lt;a href="http://www.php.net/manual/en/language.oop5.cloning.php" target="_blank"&gt;dokumentasi PHP 5&lt;/a&gt;. Untuk mengetahui kenapa ada clone object, perlu kita ketahui, bahwa di php 5 sekarang object itu sudah gak &lt;span style="font-style:italic;"&gt;pass by value&lt;/span&gt;, tapi &lt;span style="font-style:italic;"&gt;pass by reference&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;

Apa artinya itu? Mungkin bisa gue jelaskan seperti ini. Misalnya kita bekerja di sebuah gudang Laptop. Apabila kita menyimpan sebuah laptop, maka kita dapat secarik kertas kecil yang berisi catatan laptop tersebut ada di bagian mana di gudang. Misalnya Blok 5, Rak 3, Kotak nomer 8. Catatan ini kita bisa istilahkan sebagai "referensi" kita pada obyek laptop tersebut.&lt;br /&gt;&lt;br /&gt;

Apabila kita ingin memberikan obyek tersebut kepada orang lain (variabel lain). Maka kita sebenarnya membuat fotokopi dari catatan kita, dan memberikannya kepada orang tersebut. Disini kita lihat, kita hanya mengkopi "referensi" kita. Obyeknya tetap mengacu pada laptop yang sama. Artinya apabila orang lain melakukan perubahan pada laptop tersebut, maka sewaktu kita melihat kembali laptop tersebut, kondisinya sudah berubah.&lt;br /&gt;&lt;br /&gt;

Object Cloning dalam contoh ini berarti. Kita membuat satu cloning dari laptop tersebut. Bentuk dan kondisinya sama persis. Akan tetapi, karena Kotak nomer 8 pada Rak 3 di Blok 5 sudah diisi sama laptop pertama tadi, maka laptop cloningan ini harus ditaruh di kotak yang lain. Misalnya saja Kotak nomer 2 pada Rak 4 di Blok 5. Setelah itu kita membuat catatan kecil tentang alamat laptop tersebut, dan memberikannya pada teman kita. Dengan ini apabila teman kita melakukan perubahan pada laptop tersebut, dia tidak merubah laptop (obyek) kita, tapi laptop kloningan.&lt;br /&gt;&lt;br /&gt;

Sekarang mari kita coba mengggunakan contoh code.&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
class Account {
    public $balance;

    function __construct($balance) {
        $this-&gt;balance = $balance;
    }
}

class Person {
    private $name;
    private $age;
    private $id;
    public $account;

    function __construct($name,$age, Account $account) {
        $this-&gt;name = $name;
        $this-&gt;age = $age;
        $this-&gt;account = $account;
    }

    function setId($id) {
        $this-&gt;id = $id;
    }

    function getId() {
        return $this-&gt;id;
    }

    $account = new Account(0);
    $person = new Person('Oka', 21, $account);
    $person-&gt;setId(2);
    $person2 = $person;
    $person2-&gt;setId(4);
    echo $person-&gt;getId().' '.$person2-&gt;getId();
?&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
Di PHP 4 hasil dari echo tersebut adalah "2 4"; Akan tetapi di PHP 5 hasil dari echo tersebut adalah "4 4"; ini disebabkan di PHP 5 pada statement $person2 = $person
object Person pada $person di  &lt;span style="font-style:italic;"&gt;pass by reference&lt;/span&gt; ke $person2, dalam arti di dalam variable $person2 isinya bukan copy (clone) dari object $person, tapi isinya hanyalah sebuah pointer yang menunjuk ke memory, dimana object $person di simpan.&lt;br /&gt;&lt;br /&gt;

Oleh karena itu setiap perubahan yang dilakukan di object $person2 akan ikut mempengaruhi object $person. Kenapa dibuat seperti ini di php5? nampaknya php5 berusaha untuk menyamakan behaviour syntax nya pada bahasa2 berparadigma OOP lainnya. CMIIW. supaya orang yang biasa kerja di java, .net atau sejenisnya tidak kaget waktu kerja ber OOP pakai PHP dan sudah biasa dengan asumsi bahwa statement "=" untuk object itu, pasti parse by reference.&lt;br /&gt;&lt;br /&gt;

Tambahan info. Dalam bahasa pemrogramman berorientasi obyek. Biasanya orang mengenal tipe data "primitiv" dan tipe data "obyek". Tipe data primitiv seperti integer itu selalu &lt;span style="font-style:italic;"&gt;pass by value&lt;/span&gt;, sedangkan tipe data obyek itu &lt;span style="font-style:italic;"&gt;pass by reference&lt;/span&gt;.

Oleh karena ini, apabila kita di PHP5 ingin memiliki copy utuh dari sebuah object, dimana apabila kita merubah state dari object kopian tersebut tidak mempengaruhi object aslinya, kita diberikan solusi clone.&lt;br /&gt;&lt;br /&gt;

Mari kita coba merubah code gue diatas dengan clone:&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
$account = new Account(0);

$person = new Person('Oka', 21, $account);

$person-&gt;setId(2);

$person2 = clone $person;

$person2-&gt;setId(4);

echo $person-&gt;getId().' '.$person2-&gt;getId();
?&amp;gt;
&lt;/pre&gt;&lt;br /&gt;
Dengan ini di PHP 5 hasil echonya bisa sama dengan PHP 4 yaitu "2 4".

Di thread milist ada yang bertanya, kenapa gak di instance ulang saja seperti ini?&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
$person = new Person("Oka", 21, new Account(200));
$person2 = new Person("Oka", 21, new Account(200));
$person3 = new Person("Oka", 21, new Account(200));
?&amp;gt;
&lt;/pre&gt;&lt;br /&gt;

Mari kita lihat keefektivan dari clone. Dengan clone kita mendapat copy yang sama persis dari object yang di clone. sedangkan contoh pada contoh diatas, untuk membuat 3 object yang statenya sama, kita harus memasukkan kembali nilai dari parameter tersebut.&lt;br /&gt;&lt;br /&gt;

Kasusnya mungkin bisa seperti ini. Bayangkan kalau object $person yang kita bikin itu mau digunakan di sebuah class yang bukan tanggung jawab kita. Misalnya (lagi2) kolega kerja kita.&lt;br /&gt;&lt;br /&gt;

Bekerja Object Oriented yang baik adalah dimana kolega kerja kita tidak perlu tahu menahu seluk beluk yang terjadi di dalam object yang kita bikin (loose coupled). Bisa jadi misalnya, ini misal ya, bahwa state dalam object tersebut seperti nama, umur dan account balancenya didapat dari $_POST (informasi yang diberikan user lewat
user interface). Dan karena satu dan lain hal, kolega kita tidak bisa membaca atau tidak tahu menahu soal $_POST. Yang dia tahu hanya object yang di dapat dari kita. Satu-satunya state yang bisa dia ganti misalnya adalah Id nya dengan menggunakan public method setId().&lt;br /&gt;&lt;br /&gt;

Disini dia gak punya lagi kesempatan untuk bikin instance baru dari class Person yang statenya sama persis sama object $person yang kita berikan. Dia kan gak tahu bahwa waktu menginstance object $person kita memberikan nilai "Oka", 21 dan account balance 200 pada masing2 class attributenya. Maka dari itu, digunakanlah tehnik clone ini.&lt;br /&gt;&lt;br /&gt;

Mari kita coba ya pakai contoh code. Sebagai contoh kita bertanggung jawab untuk UI (Presentation Tier), dan kolega kita yang bertanggung jawab di bagian Database (Persistent Tier).&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
$person = new Person ($_POST['name'], $_POST['age'], new
Account($_POST['balance']));
$person-&gt;setId($_POST['id']);

$persistancePerson-&gt;insertNewPerson($person);
?&amp;gt;
&lt;/pre&gt;

Sampai disini tugas kita kelar dan kita memberikan object $person kepada kolega kita yang ngurusin insert ke database. Soal SQL statement mah dia jagonya lah, kita gak peduli.

Nah sekarang sebelum die melakukan insert ke database, dia pengen coba-coba dulu periksa, udah ada belon data dengan id tersebut di database, kalau memang sudah ada maka akan diberikan id baru, lalu di save. Supaya dia gak mengganggu object state yang diterima dari kita, maka untuk coba-coba, dia bikin clone dari object tersebut.&lt;br /&gt;&lt;br /&gt;

Misalnya isi dari methode insertNewPerson(Person $person) seperti berikut:
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
public function insertNewPerson(Person $person){
   $person2 = clone $person;

  while($this-&gt;idAlreadyExist($person2-&gt;getId())){
         $person2-&gt;setId($this-&gt;getNextId());
  }

  $DBObject::getInstance()-&gt;execute('INSERT INTO person ......');
}
?&amp;gt;
&lt;/pre&gt;&lt;br /&gt;

Dengan ini dia mencoba-coba menggunakan object kopian dari $person. Pada $person2-&gt;setId() hanya object $person2 saja yang terganti statenya. Object $person tetap seperti sediakala, sewaktu dia menerima dari kita.&lt;br /&gt;&lt;br /&gt;

Manakah yang lebih cepat, membuat instance baru, atau mencopy. Disini kita bisa &lt;a href="http://www.php.net/manual/en/language.oop5.cloning.php" target="_blank"&gt;membaca kembali dokumentasinya&lt;/a&gt;. Disitu ditulis:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;
When an object is cloned, PHP 5 will perform a shallow copy of all of the object's properties. Any properties that are references to other variables, will remain references.
&lt;/blockquote&gt;&lt;br /&gt;
Menurut pemahaman gue tentang Computer system, untuk bikin instance baru itu pasti lebih ribet, mungkin ngecheck nilai dari parameternya bener tidak, nama classnya exist tidak, terus generate segalanya dalam bentuk object, lalu cari memory yang kosong untuk di simpan. Kalau copy object kan dia gak perlu ngejalanin semuanya itu. tinggal cari memory kosong, terus kopi ajah mentah-mentah (shallow copy) dari memory object aslinya.&lt;br /&gt;&lt;br /&gt;

Gue harap informasi ini bisa memberikan pencerahan. &lt;br /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-902410558504609050?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/83jUByvsbc0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/83jUByvsbc0/object-cloning-di-php-5.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/STz6qtVeutI/AAAAAAAAApM/F6HubzqF1HQ/s72-c/914335_85510317_2.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">9</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/12/object-cloning-di-php-5.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-4163004126555207938</guid><pubDate>Sun, 07 Dec 2008 20:00:00 +0000</pubDate><atom:updated>2008-12-07T22:15:20.624+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Publication</category><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Pengecualian di PHP 5</title><description>&lt;div class="separator" style="float: left; clear: both;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/STw6RU3OyZI/AAAAAAAAApE/mzZpT6AEhSE/s1600-h/995000_46458615_2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 123px;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/STw6RU3OyZI/AAAAAAAAApE/mzZpT6AEhSE/s200/995000_46458615_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5277156932703930770" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shCore.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script language="javascript"&gt;window.onload = function () {  dp.SyntaxHighlighter.ClipboardSwf = 'http://purnama.de/SyntaxHighlighter/JS/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');}&lt;/script&gt;
Beberapa waktu lalu di milist id-php ada yang sempat bertanya tentang &lt;a href="http://tech.groups.yahoo.com/group/id-php/message/22437" target="blank"&gt;Exception di PHP 5&lt;/a&gt;. Beberapa contoh yang diberikan, menurut gue masih kurang menunjukkan kemampuan dari exception itu sendiri, maka dari itu gue mencoba untuk ikutan memberikan jawaban dan contoh.&lt;br /&gt;&lt;br /&gt;

&lt;a href="http://tech.groups.yahoo.com/group/id-php/message/22478" target="_blank"&gt;Tulisan gue di milist&lt;/a&gt;, gue coba tulis kembali di blog gue, untuk sekedar jadi arsip gue. Mungkin juga bisa membantu yang lain apabila ada yang cari-cari informasi tentang exception di PHP 5. Beberapa dari contoh yang gue kasih di tulisan gue waktu itu gue perbaiki karena ada kesalahan di syntaxnya. Apabila masih ada yang perlu di koreksi atau kritik dan saran, gue terima dengan senang hati.&lt;br /&gt;

&lt;span class="fullpost"&gt;&lt;br /&gt;
Secara umum penggunaan exception bisa &lt;a href="http://www.php.net/manual/en/language.exceptions.php" target="_blank"&gt;dibaca di dokumentasi PHP 5&lt;/a&gt;. Beberapa dari contoh yang disebutkan di milist, menunjukkan bahwa exception dapat digunakan untuk melihat backtrace error. Memang benar dengan exception kita bisa melihat backtrace error dari programmnya. Tapi untuk backtrace sendiri PHP sebenarnya sudah punya &lt;a href="http://de3.php.net/manual/en/function.debug-backtrace.php" target="_blank"&gt;debug_backtrace&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;

Bukan berarti kita tidak boleh menggunakan Exception untuk melakukan backtrace. Tentu saja boleh, malah kalau kita bekerja menggunakan orientasi obyek, kita justru dipermudah dalam hal backtrace menggunakan Exception. Akan tetapi gue pengen kasih contoh tujuan yang sebenarnya dari exception itu sendiri.&lt;br /&gt;&lt;br /&gt;

Sebelum itu gue mau mencoba mengutip satu contoh yang diberikan di milist dalam thread ini.

&lt;pre class="php" name="code"&gt;
&amp;lt;?php
if (!is_writable($this-&gt;file)) {
    throw new Exception("file '{$file}' is not writeable");
}
file_put_contents($file,$xmlObj-&gt;asXML());

//apa bedanya klo saya buat seperti ini ? :
if (!is_writable($this-&gt;file)) {
    echo "Aduuwwhhh filenya ndak bisa ditulisi!";
    exit();
}
file_put_contents($file,$xmlObj-&gt;asXML());`
?&amp;gt;
&lt;/pre&gt;

Contoh tersebut membuat PHP mengeluarkan error message "uncaught exception". Ini sebenarnya sebuah error yang tidak boleh ada. Kalau di java, hal seperti ini membuat
code java nya sendiri gak bisa di compile, sampai sang programmer membuat try-catch block pada programm code yang berpotensi untuk melempar exception tersebut.&lt;br /&gt;&lt;br /&gt;

Seperti yang gue bilang diatas, kita bisa menggunakan exception, sebagai error handler, tapi bukan berarti exception itu melulu merupakan sebuah "error". Dengan exception kita diberi kesempatan untuk melakukan sesuatu (handle) terhadap exception tersebut.&lt;br /&gt;&lt;br /&gt;

Gue akan memberikan contoh yang mengacu pada contoh diatas. Dan gue coba berikan sebuah skenario dimana penggunaan exception bisa digunakan.&lt;br /&gt;&lt;br /&gt;
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Gue harus membuat sebuah methode (dalam class) yang dapat menulis xml kedalam sebuah file.&lt;/li&gt; 
&lt;li&gt;Untuk menulis file kedalam xml, maka gue butuh 2 parameter, yaitu file, dan string.&lt;/li&gt; 
&lt;li&gt;Parameter file tersebut harus sebuah file resource, harus bisa dibaca dan
harus bisa ditulis.&lt;/li&gt;
&lt;li&gt;Parameter string tersebut harus sebuah string, dan merupakan xml yang conform.&lt;/li&gt;
&lt;li&gt;Apabila semua prosedur itu dipenuhi maka xml tersebut bisa ditulis kedalam file.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
Berikut adalah contoh kelasnya.&lt;br/&gt;
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
class PutXMLToFile{

   public function putThatThing($file, $xml){
        if(!is_file($file)){
           throw new ExceptionIsNotAFile('Resource is not a File!');
        }

        if(!is_readable($file)){
           throw new ExceptionFileNotReadable('File not readable.');
        }

        if(!is_writeable($file)){
           throw new ExceptionFileNotWriteable('File not writeable');
        }

        if(!is_string($string)){
           throw new ExceptionIsNotAString('not a string');
        }

        if(!is_xml_conform($string)){
           throw new ExceptionIsNotXMLConform('not xml conform');
        }

        file_put_contents($file,$string);
   }
}
?&amp;gt;
&lt;/pre&gt;

Dengan ini kita akan memberikan code ini - misalnya - kepada kolega kerja kita, yang bertanggung jawab untuk user interface. Katakanlah ada 2 kolega kita yang bertanggung jawab untuk UI, yang satu UI untuk browser biasa, yang satu UI untuk mobile browser.&lt;br /&gt;&lt;br /&gt;

Requirementnya sebagai berikut.
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Apabila file, bukan sebuah file, maka buka UI file management untuk
memilih atau mengupload file.&lt;/li&gt;
&lt;li&gt;Apabila file tidak dapat dibaca, atau tidak dapat ditulis, maka buka
UI file access management untuk mengedit file access.&lt;/li&gt;
&lt;li&gt;Apabila string bukan string, tampilkan error message.&lt;/li&gt;
&lt;li&gt;Apabila string tidak xml conform, maka tampilkan UI xml editor untuk
mengedit xml file tersebut.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

Sekarang gue bukin contoh untuk UI mobile browser. Gue anggap user interface
object nya sudah jadi saja.&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
$userInterface = new MobileUserInterface();

try{
   $putXMLToFile = new PutXMLToFile();
   $putXMLToFile-&gt;putThatThing($file, $string);
}catch (ExceptionIsNotAFile $e){
    $userInterface-&gt;openFileManager();
}catch (ExceptionFileNotReadable $e){
     $userInterface-&gt;openFileAccessManager();
}catch (ExceptionFileNotWriteable $e){
     $userInterface-&gt;openFileAccessManager();
}catch (ExceptionIsNotAString $e){
     $userInterface-&gt;showError($e-&gt;getMessage());
}catch (ExceptionIsNotXMLConform $e){
     $userInterface-&gt;openXMLEditor();
}
?&amp;gt;
&lt;/pre&gt;
Seperti yang bisa kita lihat, fungsi pada contoh pertama untuk put xml to file jadi
lebih loose coupled dan mudah diimplementasikan di berbagai macam kebutuhan. Kolega kita yang ingin mengerjakan UI untuk browser biasa misalnya bisa melakukan seperti code diatas, hanya saja object nya bukan new MobileUserInterface() tapi new StandardUserInterface() misalnya.&lt;br /&gt;&lt;br /&gt;

Dalam try{} block kolega kita juga bisa untuk tidak hanya menulis code yang akan menangkap exception dari object kita, tapi juga dari object lain. Dalam arti di dalam try{} block bisa terjadi algoritma yang cukup komplex.&lt;br /&gt;&lt;br /&gt;

Misalnya saja requierement yang diatas ditambahkan lagi: 
&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Setelah berhasil put xml to string, maka save informasi tersebut ke
dalam database,&lt;/li&gt; 
&lt;li&gt;lalu kirimkan email kepada orang yang bersangkutan.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

Database object dan email object, bisa jadi memiliki exception mereka sendiri yang sudah selayaknya ditangkap entah itu connection not avaliable, column or table not exist, database not exist, sql statement syntax error dan sejenisnya.&lt;br /&gt;&lt;br /&gt;

Pada email object bisa jadi, mail server not responding, atau email address invalid atau email address not exist in database, dan sejenisnya.&lt;br /&gt;&lt;br /&gt;

Exception tersebut juga bisa ditangkap dan dilakukan sesuatu(handle) terhadap exception tersebut. Bisa jadi hanya menampilkan error. Tapi seperti contoh di atas, tidak selalu exception itu merupakan sebuah error.

Berikut adalah contoh pengembangan code yang diatas:
&lt;pre class="php" name="code"&gt;
&amp;lt;?php
$db = DBObject::getInstance();

try{
   $putXMLToFile = new PutXMLToFile();
   $putXMLToFile-&gt;putThatThing($file, $string);

   $db-&gt;beginTransaction();
   $modelSomething-&gt;insertSomething();
   $modelAnything-&gt;updateAnything();

   $email = Email::getInstance();
   $email-&gt;setTo($emailAddressTo);
   $email-&gt;setSubject($emailSubject);
   $email-&gt;setMessage(emailMessage);
   $email-&gt;send();

   $db-&gt;endTransaction();

}catch (ExceptionIsNotAFile $e){
    $userInterface-&gt;openFileManager();
}catch (ExceptionFileNotReadable $e){
     $userInterface-&gt;openFileAccessManager();
}catch (ExceptionFileNotWriteable $e){
     $userInterface-&gt;openFileAccessManager();
}catch (ExceptionIsNotAString $e){
     $userInterface-&gt;showError($e-&gt;getMessage());
}catch (ExceptionIsNotXMLConform $e){
     $userInterface-&gt;openXMLEditor();
}catch (ExceptionDBException $e){
     $db-&gt;rollbackTransaction();
     $userInterface-&gt;showError($e-&gt;getMessage());
}catch (ExceptionEmailException $e){
     $db-&gt;rollbackTransaction();
     $userInterface-&gt;showError($e-&gt;getMessage());
}
?&amp;gt;
&lt;/pre&gt;

Semoga tulisan gue bisa memberi sedikit pencerahan.&lt;br /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-4163004126555207938?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/Ys9Id-xxWGU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/Ys9Id-xxWGU/pengecualian-di-php-5.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_lP1lCI-HIqo/STw6RU3OyZI/AAAAAAAAApE/mzZpT6AEhSE/s72-c/995000_46458615_2.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/12/pengecualian-di-php-5.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-6560053668191780410</guid><pubDate>Sun, 07 Dec 2008 17:46:00 +0000</pubDate><atom:updated>2008-12-07T20:54:05.309+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Publication</category><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Konsep Visibility pada PHP 5</title><description>&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shCore.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script language="javascript"&gt;window.onload = function () {  dp.SyntaxHighlighter.ClipboardSwf = 'http://purnama.de/SyntaxHighlighter/JS/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');}&lt;/script&gt;&lt;div class="separator" style="float: left; clear: both;"&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/STwiRoHeoKI/AAAAAAAAAo8/RoZeegs3j80/s1600-h/961824_85419476_2.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;width: 200px; height: 117px;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/STwiRoHeoKI/AAAAAAAAAo8/RoZeegs3j80/s200/961824_85419476_2.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5277130549593284770" /&gt;&lt;/a&gt;&lt;/div&gt;
Beberapa waktu lalu di milist PHP-UG ada yang nanya tentang &lt;a href="http://tech.groups.yahoo.com/group/phpug/message/37977" target="_blank"&gt;konsep Visibility pada PHP 5&lt;/a&gt;. Banyak juga yang sudah menjawab. Dan menurut gue jawabannya juga bagus-bagus. Tapi gue juga ikutan jawab, karena sebagian besar jawabannya tidak mengacu pada konsep dasar tentang Visibility secara umum dalam pemrograman berorientasi objekt.&lt;br /&gt;&lt;br /&gt;

&lt;a href="http://tech.groups.yahoo.com/group/phpug/message/38148" target="_blank"&gt;Tulisan gue di milist&lt;/a&gt;, gue masukin di blog sebagai arsip gue pribadi. Mungkin juga berguna buat yang lain kalau-kalau satu saat ingin cari tahu mengenai konsep visibility. Kalau ada kritik, koreksi atau tambahan, tentunya gue dengan senang hati menerima.&lt;br /&gt;

&lt;span class="fullpost"&gt;&lt;br /&gt;
Secara umum penggunaan Visibility pada PHP 5 bisa dilihat langsung di &lt;a href="http://www.php.net/manual/en/language.oop5.visibility.php" target="_blank" &gt;dokumentasinya PHP 5&lt;/a&gt;. Setelah kita tahu bagaimana visibility berfungsi pada function, atau member variabel, gue rasa penting juga sebenarnya bertanya, kenapa
sebenarnya ada visibility? Kapan pakainya? Buat kalian yang beranjak dari PHP &amp;lt; 5, maka pertanyaan yang sebenarnya juga cukup menarik, kenapa PHP sekarang support visibility?&lt;br /&gt;&lt;br /&gt;

Private, public, protected merupakan bagian dari prinsip "information hiding" dalam ilmu komputer. Kalau ingin tahu apa itu prinsip "information hiding" silahkan lihat di &lt;a href="http://en.wikipedia.org/wiki/Information_hiding" target="_blank"&gt;wikipedia&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;

Disitu hanya dijelaskan secara gamblang saja. Ada banyak sekali hal yang bersangkutan
dengan "information hiding", dan pada kesempatan ini gue pengen coba untuk menjelaskan hanya pada bagian visibility.&lt;br /&gt;&lt;br /&gt;

Menjelaskan topik informatika paling enak pake analogi, jadi gue berusaha beranalogi. Gue coba2 cari di google analogi yang lebih pas, tapi gue gak ketemu. Kalau ada yang bisa memberikan analogi yang lebih pas, silahkan dibagi ^^.&lt;br /&gt;&lt;br /&gt;

Analogi gue kali ini adalah mobil. Mobil punya setir, punya starter, punya perseneling, dan minimal punya pedal gas dan rem (kopling untuk transmisi manual). Semua mobil punya "fungsi" ini. Dan semua pengemudi tahu dan "berharap" bahwa fungsi tersebut ada di dalam sebuah mobil. Keberadaan fungsi2 tersebut dalam sebuah mobil bisa kita lihat sebagai bentuk "public visibility".&lt;br /&gt;&lt;br /&gt;

Mobil bisa jalan karena ada mesinnya. Masalahnya disini adalah, bagaimana bentuk mesinnya, bagaimana cara kerjanya. atau. apakah sebenarnya mobil tersebut jalan pakai mesin? Hal itu semua sudah bukan urusan pengemudi mobil. Hal itu sudah urusan perusahaan yang bikin itu mobil. Bisa jadi mas &lt;a href="http://www.google.com/search?source=ig&amp;hl=en&amp;rlz=&amp;=&amp;q=joko+suprapto&amp;btnG=Google+Search&amp;aq=0&amp;oq=joko+suprapto" target="_blank"&gt;Joko Suprapto&lt;/a&gt; punya methode lain buat bikin mobil bisa jalan ^^ (Ilmu gaib mungkin? ^^ ). &lt;br /&gt;&lt;br /&gt;

Fungsi mesin tidak hanya sekedar urusan perusahaan, akan tetapi mesin merupakan bagian paling penting dari inovasi perusahaan. Apakah mobil tersebut bisa ngebut, irit bensin, tidak berisik, ramah lingkungan, semuanya ditentukan dari kerja mesin
tersebut. Karena semua jerih payah berpikir para insinyur automobile ada di dalam situ, perusahaan melindungi informasi tersebut, dan ingin agar fungsi tersebut tidak digunakan untuk kepentingan lain, selain untuk menjalankan mobil, ^^ dengan menggunakan fungsi2 "publik" yang sudah didefinisikan (setir, perseneling, pedal, dsb). Pokoknya pengemudi hanya tahu, untuk jalanin sebuah mobil, kudu starter dulu,
masukin perseneling. dan kalo injek gas, mobilnya jalan, kalo di rem berhenti. Fungsi mesin disini bisa kita lihat sebagai bentuk "private visibility".&lt;br /&gt;&lt;br /&gt;

Perusahaan pembuat mobil tahu, bahwa dia gak akan bisa membuat mobil yang sesuai sama selera seluruh umat manusia ^^. Yang satu ingin mobilnya lebih nyaman, yang satu pengen bisa lebih cepat, yang satu ingin lebih irit, yang satu ingin lebih ramah lingkungan, dan lain sebagainya. Maka dari itu perusahaan pembuat mobil membuat beberapa komponen mobil memiliki kesempatan untuk di expand atau dimodifikasi. Entah itu pasang AC, pasang, Nitro, pasang katalisator, ganti jok
mobil, ganti velg, diceperin dan lain sebagainya. Spesifikasi dan informasi komponen-komponen yang bisa di expand atau dimodifikasi tersebut diberikan oleh perusahaan mobil, ke bengkel2 mobil. Apakah itu bengkel resmi ato bukan untuk sementara tidak relevan ^^. &lt;br /&gt;&lt;br /&gt;

Seperti halnya mesin pada perusahaan mobil. sebagai pengemudi, kita tetap tidak tahu menahu tentang komponen ini. Kita tetap hanya mengetahui fungsi-fungsi publik. Kita tetap mengendarai mobil seperti biasanya. Hanya saja mobil kita mungkin sekarang lebih cepat, lebih irit, lebih nyaman, atau lebih-lebih yang lainnya. ^^. Analogi yang ini bisa kita lihat sebagai bentuk "protected visibility".&lt;br /&gt;&lt;br /&gt;

So itu analoginya visibility. Kalo dilihat dari &lt;a href="http://tech.groups.yahoo.com/group/phpug/message/37977" target="_blank" &gt;subject threadnya&lt;/a&gt; ada yang nanya tentang visibility jenis "global". Jenis itu sepertinya spesifik di php doang, dimana function berdiri sendiri, tidak dalam sebuah kelas. CMIIW. Agak sulit menganalogikannya dalam kasus mobil diatas, karena paradigma object oriented itu melihat semuanya berupa object. Kalau gue memisalkan fungsi dengan visibility "global" sebagai kunci stang (yang jaman dulu tuh, yang buat dipasang dari setir ke pedal, tauk deh ada yang bisa bayangin kah) gak bisa juga. Karena kunci stang adalah object ^^ yang punya fungsi yaitu - seperti namanya - ngunci setir. ^^ &lt;br /&gt;&lt;br /&gt;

Setelah panjang berteori fundamental visibility pada pemrogramman berorientasi obyek. sekarang mari kita coba menjawab pertanyaan kenapa ada visibility? Kapan pakainya, dan kenapa PHP sekarang support visibility?&lt;br /&gt;&lt;br /&gt;

PHP berkembang dari sekedar Personal Home Page &lt;span style="font-style:italic;"&gt;pre-processor&lt;/span&gt; tools yang dibuat Rasmus Lerdorf, menjadi sebuah &lt;span style="font-style:italic;"&gt;Full Blown Web Application language&lt;/span&gt;. Gue gak bilang enterprise ^^, karena untuk menjadikannya enterprise gak cukup pengetahuan PHP doang seperti layaknya sodara kita di java dan .net ^^. &lt;br /&gt;&lt;br /&gt;

Untuk membuat aplikasi, banyak komponen2 yang akan sering digunakan berulang-ulang di setiap project. Daripada setiap kali harus tulis ulang, mendingan dipakai lagi. Muncullah berbagai macam jenis framework di PHP yang umumnya punya tujuan yang sama, yaitu membuat pembangunan aplikasi web menjadi lebih cepat, mudah, dan bug free.&lt;br /&gt;&lt;br /&gt;

Membuat framework, sama halnya dengan membuat mobil, para developer framework menentukan melalui fungsi apa framework tersebut digunakan (public), fungsi-fungsi apa yang critical dan tidak boleh digunakan untuk kepentingan lain (private), dan fungsi-fungsi apa yang punya kemungkinan untuk di expand atau diganti (protected). Pengguna framework hanya akan dihadapkan dengan fungsi2 yang memiliki visibility public dalam membangun web aplikasinya.&lt;br /&gt;&lt;br /&gt;

Karena visibility baru di support setelah PHP 5, pembuatan framework memiliki problem dalam penggunaan visibility. Untuk mengantisipasi hal ini, Segala macam
bentuk &lt;span style="font-style:italic;"&gt;code convention&lt;/span&gt; digunakan dalam komunitas framework. Salah satunya adalah &lt;a href="http://pear.php.net/manual/en/standards.naming.php" target="_blank"&gt;PEAR convention&lt;/a&gt; yang memberikan tanda strip bawah ( _ ) untuk setiap private member variabel dan private method.&lt;br /&gt;&lt;br /&gt;

Framework gak selalu harus pakai punya orang. Buat mereka yang bekerja &lt;span style="font-style:italic;"&gt;product developing&lt;/span&gt;, umumnya punya methode dan fungsi2 proprietary yang juga digunakan dalam pekerjaan sehari-hari. Dalam hal ini bisa jadi masing-masing memiliki &lt;span style="font-style:italic;"&gt;code convention&lt;/span&gt; sendiri-sendiri.&lt;br /&gt;&lt;br /&gt;

Sekarang gue mo coba memberikan contoh praktis dalam bentuk code untuk belajar memahami kapan menggunakan dan memilih visibility. Code ini jauh dari sempurna dalam konteks design-nya. Diantara kalian pasti bisa membuat yang jauh lebih baik dari ini. Akan tetapi menurut gue ini bagus untuk membantu memahami prinsip visibility.&lt;br /&gt;&lt;br /&gt;

Gue mau tetap bergerak di lingkup analogi gue, yaitu mobil. Gue mau membuat sebuah kelas "mobil". Untuk bisa memahami lebih baik, perlu diketahui bahwa dalam bekerja menggunakan paradigma berorientasi obyek, programmer harus berpikir bahwa code yang dia tulis suatu saat akan "digunakan" oleh orang lain, gue kasih tanda kutip, karena maksudnya disini bukan dimodifikasi atau dirubah.&lt;br /&gt;&lt;br /&gt; 

Untuk itu gue buat skenario sebagai berikut.&lt;br /&gt;&lt;br /&gt;

&lt;blockquote&gt;
Kelas mobil yang gue tulis disini adalah bagian dari sebuah aplikasi game. Anggap saja game balap mobil. Tanggung jawab gue adalah menulis kelas mobil ini dan kelas ini satu saat nanti akan digunakan oleh kolega kerja gue yang memprogramm kelas "pengemudi". Untuk itu gue udah berdiskusi sama dia, apa fungsi yang harus ada, yang perlu dia ketahui. lalu sama2 bikin daftarnya.

&lt;ul&gt;
&lt;li&gt;Fungsi setir. Menerima informasi kiri atau lurus atau kanan (-1, 0 atau 1)&lt;/li&gt;
&lt;li&gt;Fungsi startEngine. Mengirimkan informasi kembali apakah mesin berhasil di starter (true atau false)&lt;/li&gt;
&lt;li&gt;Fungsi stopEngine. mengirimkan informasi kembali apakah mesin berhasil dimatikan (true atau false)&lt;/li&gt;
&lt;li&gt;Fungsi setPerseneling. menerima informasi perseneling (0 sampai 5)&lt;/li&gt;
&lt;li&gt;Fungsi gas. menerima informasi tekanan seberapa besar gas diinjak (0-5)&lt;/li&gt;
&lt;li&gt;Fungsi rem. menerima informasi tekanam seberapa besar rem diinjak (0-5)&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

So cukup. Sisanya dia gak perduli bagaimana gue mengimplementasikannya. Dia sebenarnya juga tidak berhak tahu ^^. Tapi gue berpikir agak jauh ke depan. bisa jadi code gue nanti bagus dan ingin terus dipakai, tapi karena satu dan lain hal, beberapa komponen sudah tidak begitu relevan lagi, baik itu kurang bagus, kurang cepat, atau kurang-kurang yang lainnya. Untuk itu gue akan mencoba mendefinisikan
komponen apa yang kira-kira bisa diganti atau ditambah.&lt;br /&gt;&lt;br /&gt;

Setelah berpikir, maka gue menulis daftarnya.&lt;br /&gt;&lt;br /&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;Fungsi tangkiBensin&lt;/li&gt;
&lt;li&gt;Fungsi knalpot&lt;/li&gt;
&lt;li&gt;Fungsi airConditioner&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

So setelah ini kalo ada fungsi lain yang gue butuh, gue bebas berkreatifitas. Mau berapa banyak kek fungsinya dan namanya apa. Itu sudah terserah gue. Sekarang mari kita buat kelasnya.&lt;br /&gt;&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
class Mobil{

   private $engineStart = false;
   private $warna = 'putih';
   private $brand = 'bmw';
   private $perseneling = 0;

   public function __construct(){
       echo 'objek mobil dibuat';
       $this-&gt;tangkiBensin();
       $this-&gt;airConditioner();
       $this-&gt;knalpot();
   }

   public function setWarna($warna){
       $this-&gt;warna = $warna;
   }

   public function getWarna(){
       return $this-&gt;warna;
   }

  public function setBrand($brand){
      $this-&gt;brand = $brand;
  }

  public function getBrand(){
      return $this-&gt;brand;
  }

  public function engineStart(){
      $this-&gt;engineStart = true;
  }

  public function engineStop(){
      $this-&gt;engineStart = false;
  }

  public function isEngineStart(){
      return $this-&gt;engineStart;
  }

  public function setPerseneling($perseneling){
      $this-&gt;perseneling = $perseneling;
  }

  public function gas($gas){
      echo "nge-gas dengan tekanan pedal ".$gas;
      $this-&gt;knalpot();
  }

  public function rem($rem){
     echo "nge-rem dengan tekanan pedal ".$rem;
  }

  public function setir($arah){
       switch($arah){
            case -1:
                $this-&gt;moveLeft();
                break;
            case 0:
                $this-&gt;moveStraight();
                break;
           case 1:
                $this-&gt;moveRight();
                break;
           default:
                throw new Exception('hanya bisa 
                      menerima nilai -1, 0 atau 1');
       }
  }

  protected function tangkiBensin(){
        echo "tangki bensin muat 60 liter";
  }

  protected function knalpot(){
       echo "knalpot standard";
  }

 protected function airConditioned(){
     echo "gak punya AC";
 }

 private function moveLeft(){
     //TODO: implement how to move left
 }

 private function moveRight(){
     //TODO: implement how to move right
 }

 private function moveStraight(){
     //TODO: implement how to move Straight
 }

}
&lt;/pre&gt;
Okay, mari kita lihat dengan seksama. Pertama-tama member variabel. Gue nambahin warna dan brand, hanya sekedar tambahan saja untuk mendefinisikan personalitas sebuah objekt. Yang mau gue tunjukin disini adalah penggunaan visibility private pada getter dan setter (misal setBrand dan getBrand). &lt;br /&gt;&lt;br /&gt;

Tentu saja kita bisa pasang visibility apa saja pada member variabel. Tapi sudah merupakan best practice, bahwa member variabel itu sebaiknya private atau protected, dan member variabel tersebut hanya bisa dibaca dan ditulis melalui getter dan setter methodenya (kalo gue gak salah, best practice ini pelopornya java beans CMIIW). Apa alasannya? Dengan ini kita memiliki kontrol penuh atas nilai yang diberikan kepada member variabel tersebut. Sebagai contoh, apabila kita hanya punya warna atau merk tertentu, kita bisa bikin validator di dalam set methode untuk menentukan apakah warna yang diberikan pada argument tersebut valid atau tidak.&lt;br /&gt;&lt;br /&gt;

Mungkin contoh warna dan merk tidak begitu critical. Tapi coba bayangkan kalau perseneling member variabel gue pasang public, terus temen gue pasang angka 6, dengan cara $mobilObj-&gt;perseneling = 6; padahal mobil gue cuma bisa nerima sampe 5. Gue gak mau bayangin apa yang akan terjadi ^^. Apabila memang dibutuhkan, maka gue dengan mudah bisa implementasikan if atau switch statement di methode setPerseneling untuk menghindari hal seperti ini.&lt;br /&gt;&lt;br /&gt; 

Selain itu, untuk perseneling, gue gak memberikan methode getPerseneling. dalam hal ini, gue gak punya alasan konkrit. Tapi bisa saja terjadi dalam pekerjaan, bahwa kita tidak mau orang membaca kembali nilai yang sudah dia berikan ^^.&lt;br /&gt;&lt;br /&gt;

Seperti yang bisa dilihat, gue membuat fungsi tangkiBensin, knalpot dan airConditioned sebagai protected karena gue merasa bagian itu satu saat bisa di modifikasi oleh orang lain. Sisanya fungsi moveLeft, -Right, dan -Straight merupakan contoh implementasi gue tentang bagaimana gue menjalankan mobil. Mungkin bisa lebih dari ini fungsinya. Tapi ini sekedar contoh saja. Fungsi ini digunakan oleh methode setir dimana dia memvalidasi argument yang diberikan menggunakan switch statement,
dan melempar exception apabila argument tersebut tidak valid.&lt;br /&gt;&lt;br /&gt;

Exception gak akan gue jelasin disini ^^, jadi makin banyak entar ^^. Gue sudah pernah &lt;a href="http://tech.groups.yahoo.com/group/id-php/message/22478" target="_blank"&gt;jelasin tentang exception&lt;/a&gt; deh ^^.&lt;br /&gt;&lt;br /&gt;

Setelah kelas mobil gue kelar, gue kasih ke temen gue. Dan akhirnya dia bisa pake deh. Bagaimana dia makenya, kira2 begini:
&lt;pre class="php" name="code"&gt;
class Pengemudi{

      //member variabel pengemudi
      private $mobilObj;

     //lots of code implementing pengemudi

    public function setMobil(Mobil $mobilObj){
        $this-&gt;mobilObj = $mobilObj;
    }

    public function nyetirUgalUgalan(){
         if(!$this-&gt;mobilObj-&gt;isEngineStart()){
              $this-&gt;mobilObj-&gt;engineStart();
         }
         $this-&gt;mobilObj-&gt;setPerseneling(1);
         $this-&gt;mobilObj-&gt;gas(5);
         try{
             $this-&gt;mobilObj-&gt;setir(-1);
             $this-&gt;mobilObj-&gt;setir(1);
             $this-&gt;mobilObj-&gt;setir(-1);
             $this-&gt;mobilObj-&gt;setir(1);
         }catch(Exception $e){
             echo $e-&gt;getMessage();
             print_r($e-&gt;getTrace());
         }
         $this-&gt;mobilObj-&gt;rem(5);
         $this-&gt;mobilObj-&gt;setPerseneling(0);
         $this-&gt;mobilObj-&gt;engineStop();
    }

}
&lt;/pre&gt;
Ok gue harap semua tahu apa yang code diatas lakukan. Sedikit informasi, bahwa gue melakukan &lt;span style="font-style:italic;"&gt;Type Hinting&lt;/span&gt; pada methode setMobil. Untuk jelasnya bisa baca &lt;a href="http://www.php.net/language.oop5.typehinting" target="_blank"&gt;dokumentasinya PHP&lt;/a&gt;. &lt;span style="font-style:italic;"&gt;Type Hinting&lt;/span&gt; berguna sekali, membuat code jadi lebih robust dan stabil. Di tempat lain (biasanya istilahnya controller atau main methode kalo di java, di php katakanlah index.php) ada code yang membuat objekt sang pengemudi, membuat objekt mobil dan memberikannya kepada si pengemudi. Kira-kira begini:
&lt;pre class="php" name="code"&gt;
$mobilObj = new Mobil();
$mobilObj-&gt;setWarna('orange');
$mobilObj-&gt;setBrand('Metro Mini');
$pengemudi = new Pengemudi();
$pengemudi-&gt;setMobil($mobilObj);
$pengemudi-&gt;nyetirUgalUgalan();
&lt;/pre&gt;
Di kemudian hari, kelas gue sudah mulai banyak dipakai di dalam system. Akan tetapi system tersebut butuh satu mobil lagi. Bedanya sekarang, mobil tersebut harus pasang AC, punya knalpot remus ^^ dan tangki bensin nya bisa isi 100 liter. Lebih canggihnya lagi, mobil tersebut gak cuma bisa belok ke kiri, kanan dan lurus, tapi sekarang bisa keatas dan kebawah (bisa terbang ^^. Ga usah protes. Suka-suka gue. Aplikasi gue kok :P). Mobil tersebut akan digunakan oleh pengemudi baru yang jauh lebih berpengalaman. Istilahnya sekarang "pilot". Mobil-mobil yang sudah dimiliki oleh pengemudi lainnya tidak boleh diganggu-gugat. Mereka sudah senang dengan keadaannya tersebut (prinsip &lt;span style="font-style:italic;"&gt;never touch a running system&lt;/span&gt;). So apa yang gue lakukan? Gue akan bikin satu class mobil baru yang mewarisi fungsi-fungsi class mobil gue yang lama. Yang suka pake bahasa inggris, pasti kenal yang istilahnya &lt;span style="font-style:italic;"&gt;inheritance&lt;/span&gt;.^^&lt;br /&gt;&lt;br /&gt;

So mari, coba kita bikin.
&lt;pre class="php" name="code"&gt;
class MobilBaru extends Mobil{

  public function setir($arah){
       switch($arah){
            case -1:
                $this-&gt;terbang('kiri');
                break;
            case 0:
                $this-&gt;terbang('kanan');
                break;
           case 1:
                $this-&gt;terbang('atas');
                break;
           case -2:
                 $this-&gt;terbang('bawah');
                 break;
           case 2:
                 $this-&gt;terbang('lurus');
                 break;
           default:
                throw new Exception('hanya bisa menerima nilai -2,
-1, 0, 1 atau 2');
       }
  }

  protected function tangkiBensin(){
        echo "tangki bensin muat 100 liter";
  }

  protected function knalpot(){
       echo "knalpot remus";
  }

 protected function airConditioned(){
     echo "pake AC Central Daikin ^^";
 }

 private function terbang($arah){
     //TODO: implement how to fly
 }

}
&lt;/pre&gt;
So mari kita cerna pelan-pelan. Code gue sekarang agak lebih sedikit. Kenapa? Karena sebagian besar fungsi, sudah di implementasikan di parent class. Bahkan gue ga nulis constructor. Yang gue lakukan adalah memodifikasi methode sesuai tugas gue. Perhatikan bahwa gue meng-&lt;span style="font-style:italic;"&gt;override&lt;/span&gt; methode setir, tangkiBensin dan knalpot. Perlu diperhatikan disini, apabila gue melakukan override pada methode setir, maka fungsi setir disini tidak dapat membaca private method yang ada di kelas mobil. Ini bukan sesuatu yang buruk, tapi justru baik. Karena private methode tersebut diperuntukkan khusus pada kelas Mobil.&lt;br /&gt;&lt;br /&gt;

Sekarang kita membuat kelas MobilBaru dimana behaviornya berbeda sekali (bisa terbang ^^) meskipun masih masuk definisi mobil. Maka dari itu, bagaimana setir
di implementasikan supaya mobil tersebut bisa bersikap sesuai yang diharapkan (terbang ^^), ditulis method baru, dan diberikan visibility private.&lt;br /&gt;&lt;br /&gt;

Disini sebenarnya, sekali lagi bebas saja mau berapa methodenya, namanya apa, dsbnya. Sebagai contoh gue bikin satu methode namanya terbang. Sekarang bagaimana bentuk kelas pengemudinya? yaa kira2 begini lah:
&lt;pre class="php" name="code"&gt;
class Pilot{

      //member variabel pilot
      private $mobilObj;

     //lots of code implementing pilot

    public function setMobil(MobilBaru $mobilObj){
        $this-&gt;mobilObj = $mobilObj;
    }

    public function terbangUgalUgalan(){
         if(!$this-&gt;mobilObj-&gt;isEngineStart()){
              $this-&gt;mobilObj-&gt;engineStart();
         }
         $this-&gt;mobilObj-&gt;setPerseneling(1);
         $this-&gt;mobilObj-&gt;gas(5);
         try{
             $this-&gt;mobilObj-&gt;setir(1);
             $this-&gt;mobilObj-&gt;setir(-2);
             $this-&gt;mobilObj-&gt;setir(1);
             $this-&gt;mobilObj-&gt;setir(-2);
         }catch(Exception $e){
             echo $e-&gt;getMessage();
             print_r($e-&gt;getTrace());
         }
         $this-&gt;mobilObj-&gt;rem(5);
         $this-&gt;mobilObj-&gt;setPerseneling(0);
         $this-&gt;mobilObj-&gt;engineStop();
    }

}
&lt;/pre&gt;
So sekarang agak ribet. Mohon dicerna pelan-pelan. Perhatikan pada setMobil, type hint gue sekarang MobilBaru, artinya, object yang dioper pada argument cuma boleh berupa instanz dari kelas MobilBaru. Ini berguna sekali. Coba bayangkan kalau type hint nya tetap Mobil. Dia bakal sama sekali gak protes, ketika tuh pilot kita kasih objekt MobilBaru karena MobilBaru adalah sebuah mobil ^^ (inherit class Mobil).
Berikutnya, waktu kita kasih dia object Mobil, pada bagian setMobil(), dia masih gak protes, karena Mobil adalah sebuah mobil (astaga...). Tapi giliran dia mo terbangUgalUgalan(). Mobilnya bakal protes. kenapa? karena dia gak mengenal argument -2 ^^.

Kalo masih bingung. mari kita lihat code yang menggunakan kelas ini :

&lt;pre class="php" name="code"&gt;
//Mari kita anggap methode setMobil pada kelas Pilot bentuknya begini:
//   public function setMobil(Mobil $mobilObj){
//        $this-&gt;mobilObj = $mobilObj;
//    }

//Perhatikan type hint nya Mobil.

//so sekarang main method atau controller atau index.php nya

$mobilObj = new MobilBaru();
$mobilObj-&gt;setWarna('orange');
$mobilObj-&gt;setBrand('Metro Mini');
$pengemudi = new Pilot();
$pengemudi-&gt;setMobil($mobilObj);
$pengemudi-&gt; terbangUgalUgalan(); // &lt;&lt; No error

$mobilObj = new Mobil();
$mobilObj-&gt;setWarna('orange');
$mobilObj-&gt;setBrand('Metro Mini');
$pengemudi = new Pilot();
$pengemudi-&gt;setMobil($mobilObj);
$pengemudi-&gt; terbangUgalUgalan(); // &lt;&lt; error: 
                                  // hanya bisa menerima
                                  // nilai -1, 0 atau 1
&lt;/pre&gt;
So gue sudah selesai. panjang juga ya? ^^ Sekali lagi, gue harap semoga bermanfaat.&lt;br /&gt;&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-6560053668191780410?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/OCb7-7_WBIM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/OCb7-7_WBIM/konsep-visibility-pada-php-5.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/STwiRoHeoKI/AAAAAAAAAo8/RoZeegs3j80/s72-c/961824_85419476_2.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/12/konsep-visibility-pada-php-5.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-7222188647511650027</guid><pubDate>Wed, 16 Jul 2008 07:18:00 +0000</pubDate><atom:updated>2008-12-09T05:03:57.398+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>File Upload Progress dengan PHP 5 dan APC</title><description>&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shCore.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shBrushJScript.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shBrushXml.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script language="javascript"&gt;window.onload = function () {  dp.SyntaxHighlighter.ClipboardSwf = 'http://purnama.de/SyntaxHighlighter/JS/clipboard.swf';dp.SyntaxHighlighter.HighlightAll('code');}&lt;/script&gt;&lt;div class="separator" style="float: left; clear: both;"&gt;
&lt;a href="http://2.bp.blogspot.com/_lP1lCI-HIqo/SH2hVIMarKI/AAAAAAAAAe0/PIc8090SrX0/s1600-h/progress_php.png" imageanchor="1" style="border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://2.bp.blogspot.com/_lP1lCI-HIqo/SH2hVIMarKI/AAAAAAAAAe0/8YJ5upwK3vs/s400-R/progress_php.png" style="border: 0pt none ;" /&gt;&lt;/a&gt;&lt;/div&gt;Beberapa hari lalu, secara nggak sengaja gue baca-baca &lt;a href="http://www.php.net/releases/5_2_0.php" target="_blank"&gt;PHP 5.2.0 Release Announcement&lt;/a&gt; (tumben ^^) dan ngelihat kalimat ini di daftar &lt;i&gt;key features&lt;/i&gt; nya "&lt;i&gt;Hooks for tracking file upload progress were introduced&lt;/i&gt;". Ho ho ho &lt;i&gt;was ist das&lt;/i&gt;? Penasaran banget, gue coba tanya-tanya kang google, dan mampir di &lt;a href="http://the-stickman.com/web-development/php/upload-progress-tracking-in-php52/" target="_blank"&gt;satu blog&lt;/a&gt; yang bertanya di PHP Development mailing list tentang fungsi tracking yang dijanjikan tersebut. Yang menjawab tidak lain dan tidak bukan adalah &lt;a href="http://lerdorf.com/" target="_blank"&gt;Rasmus Lerdorf&lt;/a&gt; sendiri, dan menyatakan bahwa fungsi tersebut masih berada pada level C dan membutuhkan fungsi pendukung untuk digunakan dalam php.&lt;span class="fullpost"&gt;
&lt;br /&gt; 
&lt;br /&gt;
Sudah lama gue coba cari-cari cara untuk bisa menampilkan laporan tentang kemajuan proses sewaktu meng-&lt;i&gt;upload&lt;/i&gt; file. Gue sebenarnya cari cara, dimana menulis codenya itu murni dalam PHP. Tapi sayangnya kebanyakan yang gue temuin itu &lt;a href="http://webscripts.softpedia.com/script/Internet-Browsers-C-C/FTP/LightLoader-44313.html" target="_blank"&gt;menggunakan cgi dan ditulis dalam Perl&lt;/a&gt;. Sayangnya gue gak begitu ngerti Perl, dan gue kurang suka sama bahasanya karena "terlalu dinamis", sehingga membuat code yang ditulis cepat untuk menjadi  sulit dibaca.&lt;br /&gt; 
&lt;br /&gt;
Gue juga sempat coba pakai &lt;a href="http://digitarald.de/project/fancyupload/" target="_blank"&gt;Fancyupload &lt;/a&gt;yang ditulis oleh &lt;a href="http://digitarald.de/" target="_blank"&gt;Harald Kirschner&lt;/a&gt;, sebuah &lt;i&gt;multi file uploader&lt;/i&gt; yang bekerja menggunakan Flash. Fancyupload ini gue lihat juga dipakai sama &lt;a href="http://www.joomla.org/" target="_blank"&gt;Joomla!&lt;/a&gt; CMS. Sayangnya ada 2(dua) kekurangan yang menurut gue cukup penting. Fancyupload ini tidak jalan di mac, dan setiap data yang di upload&lt;i&gt; content-type&lt;/i&gt; nya pasti "application/octet-stream", bikin sebel. Biasanya gue kalo periksa file yang di upload, gue pasti periksa berdasarkan &lt;i&gt;extension &lt;/i&gt;dan &lt;i&gt;content-type&lt;/i&gt; nya, kalo beda biasanya filenya tidak gue terima.&lt;br /&gt; 
&lt;br /&gt;
Rasmus sendiri, menurut blog tersebut, langsung menyatakan bahwa dia telah menulis fungsi pendukung tersebut di dalam &lt;a href="http://www.php.net/apc" target="_blank"&gt;&lt;i&gt;Alternative PHP Cache&lt;/i&gt;&lt;/a&gt;, sebuah PHP &lt;i&gt;library &lt;/i&gt;yang merupakan bagian dari &lt;i&gt;PHP Extension Community Library &lt;/i&gt;(PECL). &lt;a href="http://progphp.com/progress.php" target="_blank"&gt;Contohnya&lt;/a&gt;, beserta &lt;a href="http://progphp.com/progress.phps" target="_blank"&gt;&lt;i&gt;source code&lt;/i&gt;&lt;/a&gt; nya pun langsung diberikan. Tapi, menurut gue, sialnya, dia menulis contohnya menggunakan &lt;a href="http://developer.yahoo.com/yui/" target="_blank"&gt;Yahoo! User Interface Framework&lt;/a&gt; dan gak pake komentar. Bukannya gue gak suka sama framework. Tapi menurut gue, kurang bijaksana sekali memberikan contoh code menggunakan framework, gak peduli se&lt;i&gt;-straightforward&lt;/i&gt; apapun contohnya. Dan untuk sebuah contoh code, menurut gue lagi, komentar itu luar biasa pentingnya untuk mengerti &lt;i&gt;step-by-step&lt;/i&gt; apa saja yang terjadi, atau mengapa terjadi, di dalam code tersebut.&lt;br /&gt; 
&lt;br /&gt;
Oleh karena itu, gue mau mencoba untuk membuat versi yang lebih sederhana, tanpa framework apapun dan penuh komentar ^^. Dalam kesempatan ini gue mau coba jabarkan dari awal, mulai dari menginstall APC modul itu sendiri, mengkonfigurasi modul tersebut, hingga menggunakannya.&lt;br /&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Instalasi dan Konfigurasi APC&lt;/b&gt;&lt;br /&gt; 
&lt;br /&gt;
Untuk menggunakan fungsi &lt;i&gt;file upload tracker&lt;/i&gt; menggunakan APC, kita butuh php 5.2+. Gue sudah mencoba menginstall APC ini diatas Windows dan Debian &lt;i&gt;based &lt;/i&gt;Linux. Untuk Windows kita harus mendownload APC library secara &lt;a href="http://pecl4win.php.net/ext.php/php_apc.dll" target="_blank"&gt;manual&lt;/a&gt;.  &lt;a href="http://www.php.net/downloads.php" target="_blank"&gt;PECL zip package&lt;/a&gt; yang disediakan oleh php.net tidak mengikutsertakan library APC dalam distribusinya.&lt;br /&gt; 
&lt;br /&gt;
Setelah di download php_apc.dll tersebut tinggal dimasukkan ke dalam &lt;i&gt;extension directory&lt;/i&gt; yang telah di definisikan di dalam php.ini. Untuk menginstall APC di dalam Debian based Linux gue menggunakan &lt;a href="http://baheyeldin.com/technology/linux/installing-php-apc-on-ubuntu-dapper-and-debian.html" target="_blank"&gt;tutorial yang ini&lt;/a&gt;. Untuk install di distribusi linux yang lain dan &lt;i&gt;Operating System&lt;/i&gt; yang lain silahkan cari di google. Kesuksesan dan kegagalan instalasi biasanya dipengaruhi berbagai macam aspek, yang tidak semuanya gue tahu dan tidak bisa gue jabarkan panjang lebar disini.&lt;br /&gt; 
&lt;br /&gt;
Pokoknya setelah kalian berhasil menginstall APC tersebut, maka kita harus mengatur konfigurasinya di dalam php.ini. Yang pertama adalah mendaftarkan &lt;i&gt;library &lt;/i&gt;tersebut dalam daftar extension supaya dikenal oleh PHP.&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
extension=php_apc.dll
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
Di linux tidak berbeda jauh&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;extension=apc.so
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
Setelah ini, kita harus menyalakan fungsi RFC 1867, dan tergantung kalian ingin mencoba file upload dimana, lokal server atau remote server, ada beberapa perbedaan dalam konfigurasinya supaya nanti codenya bisa di test. Gue akan kasih lihat disini konfigurasi lokal server gue yang gue sadur dari IBM yang &lt;a href="http://www.ibm.com/developerworks/library/os-php-v525/index.html" target="_blank"&gt;membahas thema yang sama&lt;/a&gt;.&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;...
post_max_size = 400M
...
upload_max_filesize = 400M
...
[APC]
apc.rfc1867 = on
apc.max_file_size = 200M
...
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
Mari kita lihat, gue merubah nilai maximum file size diatas 200M, kenapa? Karena apabila kita mengupload file di lokal server, maka file tersebut ter-upload begitu cepatnya, sehingga APC tidak sempat bereaksi untuk menghitung kemajuannya. Oleh karena itu untuk mengetest di lokal server kita butuh file yang cukup besar, biasanya diatas 150M. Oleh karena itu juga, kita butuh merevisi nilai maximum file size di php.ini. Untuk remote server atau produktif server, kita hanya perlu menyalakan fungsi RFC 1867 saja, dalam arti, kita hanya perlu menambahkan  "apc.rfc1867 = on" di dalam php.ini kita. Selebihnya bisa dibiarkan sesuai nilai standardnya.&lt;br /&gt; 
&lt;br /&gt;
Untuk mengetest apakah semua instalasi dan konfigurasi berjalan dengan baik dan benar, maka setelah restart apache kita harung menengok phpinfo(). Apabila disitu terdapat informasi tentang APC seperti &lt;i&gt;screenshot&lt;/i&gt; dibawah, maka apc sudah terinstall dengan benar dan kita bisa mulai menggunakannya.&lt;br /&gt; 
&lt;br /&gt;
&lt;div class="separator" style="text-align: center; clear: both;"&gt;
&lt;a href="http://4.bp.blogspot.com/_lP1lCI-HIqo/SH3UKACQP7I/AAAAAAAAAfE/DnlxxFJVFEg/s1600-h/apc_info_php.png" imageanchor="1" style="border: 0pt none ; background-color: transparent; margin-left: 1em; margin-right: 1em;"&gt;&lt;img src="http://4.bp.blogspot.com/_lP1lCI-HIqo/SH3UKACQP7I/AAAAAAAAAfE/vIm1JnzRzeU/s400-R/apc_info_php.png" style="border: 0pt none ;" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt; 
&lt;br /&gt;
Kalau kalian ingin tahu lebih lanjut tentang arti dan fungsi dari masing-masing konfigurasi APC silahkan membaca &lt;a href="http://www.php.net/manual/en/apc.configuration.php" target="_blank"&gt;dokumentasinya&lt;/a&gt;. Sekarang kita bisa memulai untuk bereksperimen menampilkan informasi proses upload file. Sekedar informasi, semua code yang akan gue tulis, baik itu php, html atau javascript code, berada dalam satu file, yaitu upload_progress.php. Hal ini gue lakukan sebenarnya hanya untuk kemudahan saja dalam mengerti penggunaan APC. Kalau kalian sudah mengerti, silahkan implementasikan dengan cara kalian sendiri-sendiri, dan gunakan Framework apa saja yang kalian suka.&lt;br /&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Upload Form&lt;/b&gt;&lt;br /&gt; 
&lt;br /&gt;
Mari kita bikin upload form yang sederhana saja.&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="html" name="code"&gt;
&amp;lt;form action="upload_progress.php" enctype="multipart/form-data" 
      id="upload_form" method="post" 
      onsubmit="postForm('upload_form'); 
      return false;" target="hiddenframe"&amp;gt;
&amp;lt;input id="progress_key" name="APC_UPLOAD_PROGRESS" 
       value="&amp;lt;?php echo uniqid()?&amp;gt;" type="hidden"&amp;gt;
&amp;lt;input id="test_file" name="test_file" type="file"&amp;gt;
&amp;lt;input value="Upload!" type="submit"&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;div id="progress_win"&amp;gt;
&amp;lt;/div&amp;gt;
&amp;lt;iframe name="hiddenframe" style="display: none;"&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
So, selesai. Sekarang mari lihat satu-satu. di baris pertama untuk form tag, kita punya atribut action yang mengacu pada dirinya sendiri apabila form tersebut di submit. Atribute enctype, karena kita ingin mengupload file, atribut method seperti biasa, post. Kita memiliki atribut Id yang pada atribut onsubmit di berikan sebagai parameter kepada fungsi javascript postForm. Dan kita memiliki atribut target, yang memiliki nilai "hiddenframe". Nilai ini mengacu pada nama iFrame yang didefinisikan di baris 8(delapan).&lt;br /&gt; 
&lt;br /&gt;
Dengan menggunakan atribut target pada form tag, maka apabila form tersebut di &lt;i&gt;submit&lt;/i&gt;, proses submit tersebut akan dijalankan di Iframe, sehingga halaman dimana form tersebut berada tidak akan di reload. Dengan atribut onsubmit, maka sebelum form tersebut di submit, maka fungsi yang ada di dalam onsubmit tersebut dijalankan. &lt;i&gt;Return false&lt;/i&gt; sebenarnya menyatakan bahwa setelah menjalankan fungsi tersebut maka gagalkan operasi submit form. Kenapa digagalkan? nanti gue kasih tahu di bagian javascript.&lt;br /&gt; 
&lt;br /&gt;
Baris berikutnya kita punya satu hidden input field. Field ini &lt;b&gt;WAJIB&lt;/b&gt; ada apabila kalian ingin menggunakan APC untuk mendeteksi kemajuan upload file. Atribut Id pada input field ini bisa kalian definisikan sesuka kalian, gue definisikan sebagai progress_key. Atribut name harus sesuai dengan konfigurasi APC pada apc.rfc1867_name yang bisa dilihati di phpinfo(). setelah itu kita memiliki atribut value yang gue beri nilai yang unik. Nilai yang unik ini penting untuk orientasi APC ketika memproses kemajuan upload file. Apabila pada waktu bersamaan ada beberapa orang yang mengupload file, katakanlah user A dan B dan kalian memberikan id pada atribut value nya sama, maka APC bisa bingung, 2 progress dari 2 orang berbeda, tapi idnya sama, yang mana punya siapa? ^^&lt;br /&gt; 
&lt;br /&gt;
Di baris 6 kita punya div tag. Ini fungsinya sebagai container untuk menampilkan &lt;i&gt;progress bar&lt;/i&gt; nya. Disini gue gak akan menjabarkan cara membentuk progress bar, karena untuk itu sudah banyak tutorialnya, gue hanya akan menunjukkan total prosesnya dalam persen. Sekarang mari kita lihat javascriptnya.&lt;br /&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Javascript&lt;/b&gt;&lt;br /&gt; 
&lt;br /&gt;
Karena kita akan bekerja menggunakan AJAX, maka mari kita buat fungsi yang mempersiapkan sebuah &lt;i&gt;instance &lt;/i&gt;dari HTTP Request Object, supaya nanti tinggal dipakai. Thema AJAX sendiri gak akan gue bahas panjang lebar. Contoh dan Tutorial bisa lihat di salah satu &lt;a href="http://arthur.purnama.de/2007/09/ajax-tutorial_14.html" target="_blank"&gt;artikel dalam blog gue&lt;/a&gt; atau cari di google.&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="js" name="code"&gt;function createRequestObject()
   var requestObject;
   requestObject = false;
   if( window.ActiveXObject ){
       for( var i = 5; i; i-- ){
           try{
              if( i == 2 ){
               requestObject = 
                     new ActiveXObject( "Microsoft.XMLHTTP" );   
           }else{       
               requestObject =
                     new ActiveXObject( "Msxml2.XMLHTTP." + i + ".0" );
           }
           break;
         }catch( excNotLoadable ){                       
               requestObject = false;
         }
       }
   }else{
       requestObject = new XMLHttpRequest();
   }
   return requestObject;
}

var http = createRequestObject();
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
So, dengan ini kita sudah mempersiapkan sebuah &lt;i&gt;instance&lt;/i&gt; dari HTTP Request Object. Sekarang kita buat fungsi postForm() yang akan dipanggil ketika html form yang barusan kita buat di submit.&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="js" name="code"&gt;function postForm(formName){
 document.getElementById(formName).submit();
 setTimeout('updateProgress()', 100);
}
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
Isinya mudah saja. HTML form dengan nama yang didefinisikan di submit. setelah itu kita menunggu 100ms sebelum menjalankan fungsi updateProgress(). Kenapa harus menunggu? Karena file yang di upload butuh waktu untuk mencapai server. Apabila kita tidak menunggu, maka APC tidak memiliki informasi apapun untuk dikirimkan kembali ke kita, dalam hal ini APC akan mengirimkan nilai false. Dan itu sangat tidak baik.&lt;br /&gt; 
&lt;br /&gt;
Interval 100ms gue gunakan hanya untuk lokal server. Untuk remote server ada baiknya untuk mendefinisikan interval yang lebih besar, satu hingga dua detik (2000ms) karena pengiriman data dari client hingga ke server bisa memakan waktu lama tergantung kecepatan internet.&lt;br /&gt;
&lt;br /&gt;
Sekarang mari kita lihat apa isi di dalam fungsi updateProgress().&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="js" name="code"&gt;function updateProgress(){
 progress_key = document.getElementById('progress_key').value;
 http.open("GET", 'upload_progress.php?progress_key='+progress_key, true);
   http.onreadystatechange = function () {
       if (http.readyState == 4) {
           if (http.status == 200) {
             the_object = eval("(" + http.responseText + ")");           
             if(!the_object.done){
               result = Math.round(
                         (the_object.current/the_object.total) * 100);
               document.getElementById('progress_win').innerHTML = 
                         result +'%';
               setTimeout("updateProgress()",500);
             }else{
               document.getElementById('progress_win').innerHTML = '100%';
             }
           }
       }
   }
 http.send(null);
}
&lt;/pre&gt;&lt;br /&gt; 
&lt;br /&gt;
Disini kita lihat bahwa kita mengirimkan GET Request ke server dengan parameter progress_key yang diambil dari input hidden field yang unik tadi. Server nantinya akan mengirimkan response text berupa &lt;a href="http://en.wikipedia.org/wiki/JSON" target="_blank"&gt;JSON&lt;/a&gt;. Response text tersebut akan dirubah menjadi javascript object dengan eval(). Lalu kita check apakah object atribut "done" didefinisikan dalam object. Apabila tidak, maka hitung kemajuannya dalam persen, lalu tampilkan nilainya dalam div container. Setelah itu tunggu beberapa saat, dalam hal ini gue memasang interval 500ms, dan ulangi proses tersebut. &lt;br /&gt; 
&lt;br /&gt;
Server akan menambahkan atribut "done" apabila proses upload sudah selesai. Dan apabila ini terjadi, maka angka persen di div container akan ditulis "100%". Mengenai definisi return array oleh APC silahkan baca &lt;a href="http://www.php.net/manual/en/apc.configuration.php" target="_blank"&gt;manualnya &lt;/a&gt;pada bagian RFC1867. Dengan ini javascript kita kelar. Sekarang kita bisa lihat PHP scriptnya.&lt;br /&gt; 
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;PHP script&lt;/b&gt;&lt;br /&gt; 
&lt;br /&gt;
Disini script kita akan meng-&lt;i&gt;handle &lt;/i&gt;2 macam proses, yang pertama adalah upload file itu sendiri, dan yang kedua adalah membaca kemajuan proses upload.&lt;br /&gt; 
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;if($_SERVER['REQUEST_METHOD']=='POST') {
  //implement your upload code here
  //e.g. @move_uploaded_file($filename, $destination)
  exit;
} else if(isset($_GET['progress_key'])) {
  $status = apc_fetch(ini_get('apc.rfc1867_prefix').
                         $_GET['progress_key']);
  echo json_encode($status);
  exit;
}else{
  //you can implement some code to display error here
}
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Scriptnya mudah saja apabila request method yang diterima adalah post, maka upload filenya. disini kita bisa memasukkan code yang biasa kita implementasikan kalau kita ingin mengupload file.&lt;br /&gt; 
&lt;br /&gt;
Apabila request method nya bukan post, maka periksa apakah GET parameter dengan nama "progress_key" di definisikan, jika ya maka ambil informasi tentang status upload file dengan apc_fetch(). Fungsi ini_get() disini adalah untuk mengambil prefix yang didefinisikan di konfigurasi apc (bisa dilihat di phpinfo()). Setiap file yang di upload dan memiliki hidden field "APC_UPLOAD_PROGRESS" pada formnya, APC bisa mengidetentifisikan kembali melalui prefix yang didefinisikan di php.ini dan value yang didefinisikan di hidden field tersebut.&lt;br /&gt; 
&lt;br /&gt;
Fungsi apc_fetch() akan mengirimkan array atau boolean false. Apabila dia mengirimkan array, maka kita akan merubah array tersebut menjadi JSON dengan json_encode() function dan mengirimkannya kembali ke client dalam bentuk plain text.
&lt;br /&gt;&lt;br /&gt;
Jadi deh. Tinggal di test. Source code yang kumplit bisa kalian dapatkan &lt;a href="http://purnama.de/upload_progress.phps" target="_blank"&gt;disini&lt;/a&gt; dan di bawah ini hasilnya, kalian bisa langsung coba ^^.&lt;br /&gt; 
&lt;br /&gt;
Happy coding.&lt;br /&gt; 
&lt;br /&gt;
&lt;iframe src="http://vs1098.webplus24.de/upload_progress.php" name="upload_progress" width="300" height="100" align="center"
        scrolling="no" marginheight="0" marginwidth="0" frameborder="0"&gt;&lt;/iframe&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-7222188647511650027?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/QaudVKdAAZw" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/QaudVKdAAZw/file-progress-upload-dengan-php-5-dan.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_lP1lCI-HIqo/SH2hVIMarKI/AAAAAAAAAe0/8YJ5upwK3vs/s72-Rc/progress_php.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/07/file-progress-upload-dengan-php-5-dan.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-4196396079904141243</guid><pubDate>Fri, 20 Jun 2008 21:02:00 +0000</pubDate><atom:updated>2008-12-09T05:03:57.666+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Zend PHP 5 Certified Engineer</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/SFwhuLg8ioI/AAAAAAAAAd8/VI3di70C_Bw/s1600-h/zend_logo.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/SFwhuLg8ioI/AAAAAAAAAd8/VI3di70C_Bw/s400/zend_logo.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5214079545836866178" /&gt;&lt;/a&gt;
Well, from today i am a proud Zend PHP 5 Certified Engineer. It was not easy though, even with the fact that i already worked with PHP for about 5 years ^^. But there was just some question i not familiar with, because i never use it in my daily work with PHP. Difference between PHP 4 and PHP 5 was asked but it is not so difficult to answer. But some of the PHP specific questions is really hard to answer, especially the questions related to stream functions ^^. The New Object Oriented Paradigm and Security issues was for me the easiest one. &lt;br /&gt; 
&lt;br /&gt;
&lt;span class="fullpost"&gt;
I took the Exam in Frankfurt am Main, in a Training Center named Brand EDV Training located in Ostbahnhof area. Well from the outside looks not so promising, the building seems so old and dusty. But well Frankfurt is an old town actually, and this is not the downtown.&lt;br /&gt;
&lt;br /&gt;
As i entered the office, it's looked more and more promising. ^^ Well the reception was very kind. He asked about my ID and asked me to sign some forms about Terms and Condition, Privacy Policy and something like that. He said, i'm not like an Indonesian, more like Chinese. I said, "how can you say that?". And he said, "because my MOTHER COME FROM INDONESIA." Huh? cool, well he looks like an Indonesian to me, but more like East Indonesian, maybe Maluku, Timor or somewhere around there. ^^ Definitely not from Java.&lt;br /&gt;
&lt;br /&gt;
Well after some more chit chat, he brought me into some kind of a class room and prepare the exam for me. I had 90 minutes to finish the exam, and i was finish in about 45 minutes. I took a mock exam a week before, and can answer it in about 30 minutes, but the real exam is actually tougher than that.&lt;br /&gt;
&lt;br /&gt;
Anyway this icon is just nice to put on my blog ^^. What about the ZCE title? Should i put that on my name to? along with the German Dipl. Inf.? Boah, it will be too much show off, will it not? &lt;br /&gt;&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/SFwgnn8z4eI/AAAAAAAAAds/IV6IfSZCGeE/s1600-h/php5_zce_logo.gif"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/SFwgnn8z4eI/AAAAAAAAAds/IV6IfSZCGeE/s400/php5_zce_logo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5214078333699219938" /&gt;&lt;/a&gt; 
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-4196396079904141243?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/bxkEZIcGfjM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/bxkEZIcGfjM/zend-php-5-certified-engineer.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/SFwhuLg8ioI/AAAAAAAAAd8/VI3di70C_Bw/s72-c/zend_logo.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/06/zend-php-5-certified-engineer.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-3400404045523046540</guid><pubDate>Thu, 10 Apr 2008 18:07:00 +0000</pubDate><atom:updated>2008-12-09T05:03:57.817+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>My Google App Engine Account</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/SAOdgpgKAcI/AAAAAAAAAao/TDFcQ9gSYnk/s1600-h/google_app_engine.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/SAOdgpgKAcI/AAAAAAAAAao/TDFcQ9gSYnk/s400/google_app_engine.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5189164379883045314" /&gt;&lt;/a&gt; Google App Engine enables you to build web applications on the same scalable systems that power Google applications. No assembly required. It's easy to scale. AND It's free to get started.  How's that sounds, huh? That's the new Google App Engine.&lt;br /&gt;
&lt;br /&gt;
On April 7th, 2008 i read an article on ZDNet.com telling that &lt;a href="http://blogs.zdnet.com/Google/?p=999"&gt;Google announces App Engine&lt;/a&gt;. I thinked: "WOW! this is great news". I really want to try it. Well the problem is the service is being opened up to the first 10,000 developers that request an account. Of course its free, but 10, 000 is not much. But i try to request an account anyway. In fact, at that time Google can not accept account request anymore. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
But, Google give an option that, if there is another chance to request an account, you will be informed. And there it is 3 days later, i got an email from google that informed me, i have the opportunity to try one of the newest google service. ^^
&lt;br /&gt;
&lt;quote&gt;
Hello,&lt;br /&gt;&lt;br /&gt;

Thanks for signing up to try Google App Engine!  Your account has been activated, so you can begin building applications!&lt;br /&gt;&lt;br /&gt;

To start creating applications with Google App Engine, simply follow this link (you may need to sign in with your xxxxxx.xxxxxx@gmail.com Google Account):&lt;br /&gt;&lt;br /&gt;

http://appengine.google.com/&lt;br /&gt;&lt;br /&gt;

Thanks!&lt;br /&gt;
The Google App Engine Team&lt;br /&gt;
&lt;/quote&gt;&lt;br /&gt;

I can just say YES! At that time. Quick browse the tutorial and download the App Engine for local test. Google did his homework and create a nice &lt;a href="http://www.youtube.com/watch?v=bfgO-LXGpTM"&gt;video tutorial&lt;/a&gt; and &lt;a href="http://code.google.com/appengine/docs/gettingstarted/"&gt;Getting Started Guide&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Kevin Gibbs says on &lt;a href="http://www.youtube.com/watch?v=3Ztr-HhWX1c"&gt;Google Campfire One&lt;/a&gt; that Python are the first language for Google App. Well I say, I am waiting for PHP to be Next!!&lt;br /&gt;
&lt;br /&gt;
Okay folks!! Just wait my next Masterpiece on Google App Engine ^^.

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-3400404045523046540?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/tzyJlawB7bg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/tzyJlawB7bg/my-google-app-engine-account.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_lP1lCI-HIqo/SAOdgpgKAcI/AAAAAAAAAao/TDFcQ9gSYnk/s72-c/google_app_engine.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/04/my-google-app-engine-account.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-6740493483280961498</guid><pubDate>Wed, 26 Mar 2008 17:31:00 +0000</pubDate><atom:updated>2008-12-09T05:03:59.245+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Tutorial</category><title>Install PHP Extension untuk Zend Debugger</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R_ACpx_xvPI/AAAAAAAAAZY/0v2mWyNR6P4/s1600-h/zend_debugger_mysql.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R_ACpx_xvPI/AAAAAAAAAZY/0v2mWyNR6P4/s400/zend_debugger_mysql.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5183646087922171122" /&gt;&lt;/a&gt;Biasanya kalo gue nge-debug PHP-code yang gue tulis, gue pasti kalo gak pake fungsi &lt;a href="http://de3.php.net/manual/en/function.printf.php" &gt;print_f()&lt;/a&gt; ya pake &lt;a href="http://de3.php.net/manual/en/function.echo.php" &gt;echo&lt;/a&gt;. Tapi sejak pake Zend Studio for Eclipse gue ngerasa sudah saatnya gue cobain pake Zend Debugger. Itung-itung biar kelihatan lebih professional, dan tentunya disiplin diri sedikit. Dan juga gue cukup kenal dengan Debugger Panel-nya Eclipse waktu memprogram aplikasi Java.&lt;br /&gt;
&lt;br /&gt;
Hal lain yang tentunya gue kesengsem banget pengen cobain, ya... PHPUnit-nya jek. Mantep banget kan tuh, gak perlu repot-repot lagi Unit-Testing di browser. Bisa lebih semangat ber-&lt;i&gt;Test Driven Development&lt;/i&gt; ria. Bikin test filenya atau jalanin testnya juga tidak sulit, tinggal ceklak-ceklik beres.&lt;br /&gt;
&lt;br /&gt;
Tapi! Tidak disangka-sangka, baru klik &lt;i&gt;Run &amp;gt; Debug as &amp;gt; PHP Script&lt;/i&gt; lah langsung error &lt;i&gt;Call to undefined function mysql_connect()&lt;/i&gt;. Ternyata tidak semua PHP Extension merupakan bawaannya Zend Debugger. Beberapa kudu install sendiri. Setelah ubek-ubek google coba ini itu. Akhirnya nyala juga. Nah supaya yang lain gak punya masalah juga seperti gue, gue pengen bagi-bagi pengalaman gue install PHP-Extension buat Zend Debugger.&lt;span class="fullpost"&gt;&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shCore.js"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://purnama.de/SyntaxHighlighter/JS/shBrushPhp.js"&gt;&lt;/script&gt;
&lt;script language="javascript"&gt;
window.onload = function () {
    dp.SyntaxHighlighter.ClipboardSwf = 'http://purnama.de/SyntaxHighlighter/JS/clipboard.swf';
    dp.SyntaxHighlighter.HighlightAll('code');
}
&lt;/script&gt;
&lt;br /&gt;
&lt;br /&gt;
Referensi gue waktu cari-cari di google saat itu bisa dilihat &lt;a href="http://benramsey.com/archives/zend-executable-debugger-eclip se-plugin/"&gt;disini&lt;/a&gt;, &lt;a href="http://www.phpforum.de/forum/showthread.php?p=1129160"&gt;disini&lt;/a&gt;, &lt;a href="http://www.thierryb.net/pdtwiki/index.php?title=Using_PDT_:_Installation_:_Installing_the_Zend_Debugger"&gt;disini&lt;/a&gt; dan &lt;a href="http://www.zend.com/forums/index.php?t=msg&amp;th=4554&amp;start=0&amp;S=ad125f65a32b36cda0658f8bfba16281"&gt;disini&lt;/a&gt;. Dari 4 sumber itu, sebenarnya semuanya tidak membuahkan hasil, tapi setidaknya sudah menunjukkan jalan, musti utak-atik dimana. Yang terakhir adalah forum dari Zend sendiri. Dan gue sempet posting saking &lt;i&gt;desperate&lt;/i&gt;-nya. Tapi sampai gue ketemu sendiri titik masalahnya dimana, tidak ada yang response pertanyaan gue.&lt;br /&gt;
&lt;br /&gt;
Sebelum gue mulai, mungkin ada baiknya kalau kalian tahu bahwa ada 2 macam Zend Debugger. Yang satu untuk IDE, kita bilangnya Client Debugger, dan yang satu lagi untuk Web Server, atau kita bilangnya Server Debugger. Yang akan gue bahas kali ini sebenarnya tentang Client Debugger, tapi Server Debugger bakal gue singgung juga sedikit.&lt;br /&gt;
&lt;br /&gt;
Contoh yang gue pakai buat Tutorial ini semuanya menggunakan Zend Studio, tapi gue yakin PDT juga sama saja. Jadi tunggu apalagi, download &lt;i&gt;PDT All in one package&lt;/i&gt; &lt;a href="http://downloads.zend.com/pdt/all-in-one/"&gt;disini&lt;/a&gt;. Distribusi ini sudah dilengkapi dengan Zend Debugger Client.&lt;br /&gt;
&lt;br /&gt;
Untuk mencoba paket yang sudah ada Server Debuggernya, ada baiknya kalian install &lt;a href="http://www.zend.com/en/products/core/downloads"&gt;Zend Core&lt;/a&gt;. Tidak usah takut, meskipun trial, Zend Core tidak akan expired, karena untuk Zend Core, Zend menjual support, bukan softwarenya.&lt;br /&gt;
&lt;br /&gt;
So gue langsung ajah, gue gak akan ngebahas installnya, karena ini bukan tutorial untuk install software tapi untuk install PHP Extension di Zend Client Debugger.&lt;br /&gt;&lt;br /&gt;

Bikin PHP Project baru, lalu buat satu php file, kita beri nama index.php. Dengan file ini kita coba untuk membuka koneksi ke mysql. Gue anggap kalian semua sudah install mysql server, dan punya test database. So kita tulis script untuk connect ke mysql di index.php yang kita buat tadi:&lt;br /&gt;

&lt;pre name="code" class="php"&gt;
&amp;lt;?php

$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Not connected : ' . mysql_error());
}

// connect to database
$db_selected = mysql_select_db('database', $link);
if (!$db_selected) {
    die ('Can\'t use foo : ' . mysql_error());
}

?&amp;gt;
&lt;/pre&gt;
So sekarang coba &lt;i&gt;Run &amp;gt; Run As &amp;gt; PHP Script&lt;/i&gt;. Hasilnya pasti bakal kayak gini: &lt;br/&gt;
&lt;div style="background: #CCCCCC;"&gt; 
&lt;b&gt;Fatal error&lt;/b&gt;:  Call to undefined function mysql_connect() in &lt;b&gt;K:\root\test\index.php&lt;/b&gt; on line &lt;b&gt;3&lt;/b&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R_U2OR_xvQI/AAAAAAAAAZg/pAJ_G7Loi_I/s1600-h/mysql_error.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R_U2OR_xvQI/AAAAAAAAAZg/pAJ_G7Loi_I/s400/mysql_error.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5185110164963966210" /&gt;&lt;/a&gt;&lt;br /&gt;
Ok untuk lebih yakin bahwa Zend Debugger tidak di install MySQL extension, mari kita coba bikin phpinfo(). Kita ganti script di index.php yang tadi dengan phpinfo(). Lalu  coba lagi &lt;i&gt;Run &amp;gt; Run as &amp;gt; PHP Script&lt;/i&gt;. Sekarang kalian bisa lihat halaman phpinfo, dan kalau kalian cari disitu, tidak akan ketemu informasi tentang mysql. Ada beberapa extension juga yang tidak ada disitu. Dan dalam kesempatan ini kita akan coba install extension tersebut.&lt;br /&gt;
&lt;br /&gt;

Dari tutorial-tutorial referensi gue diatas, semuanya kasih tahu bahwa gue harus buka  plugin Zend Debugger untuk eclipse. Tergantung installasi plugin tersebut dapat ditemukan di &lt;br&gt;
&lt;div style="background: #CCCCCC"&gt; [install_dir]\plugins\org.zend.php.debug.debugger.[operating_system]_5.2.12.v20071210\resources\
&lt;/div&gt;&lt;br /&gt;
Di dalam situ ada 2 direktori, yang satu &lt;i&gt;php4&lt;/i&gt; yang satu &lt;i&gt;php5&lt;/i&gt;. Buka yang &lt;i&gt;php5&lt;/i&gt; isinya kira-kira begini: &lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R_U6cx_xvRI/AAAAAAAAAZo/0NZDdPl8gm0/s1600-h/client_debugger_file.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R_U6cx_xvRI/AAAAAAAAAZo/0NZDdPl8gm0/s400/client_debugger_file.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5185114812118580498" /&gt;&lt;/a&gt;&lt;br /&gt;
Kalau kalian buka php.ini nya pakai text editor, isinya cuma ini:&lt;br /&gt;
&lt;pre name="code" class="php"&gt;
zend_extension_ts=.\ZendDebugger.dll
&lt;/pre&gt;&lt;br /&gt;

Mulai dari sini, menurut referensi gue, gue bisa ambil kesimpulan ada 2 kemungkinan:
&lt;ol&gt;
   &lt;li&gt;Menggunakan Zend Server Debugger extension&lt;/li&gt;
   &lt;li&gt;Mengcopy extension file ke plugin directory&lt;/li&gt;
&lt;/ol&gt;
Gue sekarang mau coba bahas 2 kemungkinan itu dan masalah-masalah yang sempat gue hadapi saat itu.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Menggunakan Zend Server Debugger extension&lt;/strong&gt;&lt;br /&gt;
Karena server kita sudah disetting semuanya untuk koneksi ke mysql, extension yang diperlukan juga sudah di install, apalagi disana juga sudah diinstall ZendDebugger. Kenapa juga tidak dipakai juga untuk Client Debugging.&lt;br /&gt; 
&lt;br /&gt;
Untuk menggunakan Zend Server Debugger extension, caranya mudah saja. Di Eclipse, buka Window &amp;gt; Preferences... &amp;gt; PHP &amp;gt; PHP Executables. Disana klick Add. Terus isi kira-kira seperti ini. Ingat ini settingan gue. Address path kalian bisa lain.&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R_VEMx_xvSI/AAAAAAAAAZw/pyrUGhBWYa4/s1600-h/add_zend_debugger.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R_VEMx_xvSI/AAAAAAAAAZw/pyrUGhBWYa4/s400/add_zend_debugger.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5185125532356951330" /&gt;&lt;/a&gt;&lt;br /&gt;
Setelah klickt Finish, set default setting yang loe tadi bikin, kira-kira seperti ini:&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R_VFMB_xvTI/AAAAAAAAAZ4/rbUF7pnm5ps/s1600-h/debugger_gue.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R_VFMB_xvTI/AAAAAAAAAZ4/rbUF7pnm5ps/s400/debugger_gue.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5185126618983677234" /&gt;&lt;/a&gt;&lt;br /&gt;
Sekarang coba lagi Run as &amp;gt; PHP Script index.php-nya. Kali ini pasti berhasil. Beberapa dari kalian pasti ada yang mengalami keluarnya pop-up ini:&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R_VGCR_xvUI/AAAAAAAAAaA/YyQiGDJ9gIg/s1600-h/old_zend_debugger.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R_VGCR_xvUI/AAAAAAAAAaA/YyQiGDJ9gIg/s400/old_zend_debugger.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5185127550991580482" /&gt;&lt;/a&gt;&lt;br /&gt;
Ini disebabkan karena Plugin zend debugger Eclipse dibuat untuk php versi 5.2.5 dan Zend Core memiliki php versi 5.2.4. Apabila diantara kalian Web servernya menggunakan versi yang sama dengan Eclipse Zend Debugger, maka pop-up warning tersebut tidak akan muncul.&lt;br /&gt;
&lt;br /&gt;
Cara ini sebenarnya sangat tidak disarankan, karena bisa menimbulkan "hal-hal yang tidak diinginkan" lebih jelasnya apa gue sendiri saat ini tidak tahu, tapi yang pasti Zend tidak akan extra membuat 2 Debugger apabila toh semuanya sama saja.&lt;br /&gt;
&lt;br /&gt;
Maka dari itu sangat disarankan cara yang kedua.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Mengcopy extension file ke plugin directory&lt;/b&gt;&lt;br/&gt;
Copy directory ext dari directory php - untuk zend core ada di [install_dir]/lib/phpext - ke Zend Debugger Plugin. copy juga libmysql.dll dan lib .dll yang lainnya yang dibutuhkan. Kira-kira akhirnya seperti ini:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R_VLkR_xvVI/AAAAAAAAAaI/XMct9lZGGOs/s1600-h/copy_ext.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R_VLkR_xvVI/AAAAAAAAAaI/XMct9lZGGOs/s400/copy_ext.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5185133632665271634" /&gt;&lt;/a&gt;&lt;br /&gt;
INGAT: Perhatikan versi data yang ada di directory ext, bandingkan dengan angka yang tertera di php5ts.dll (PHP Interpreter). Pada contoh gambar diatas php5ts.dll memiliki versi 5.2.5.5. Apabila extension library yang ada di directory ext tidak memiliki versi yang sama, maka dijamin tidak akan berhasil. Informasi ini tidak dihimbau di referensi yang gue baca. Dan sempat bikin gue bingung waktu itu, kenapa kok tidak nyala-nyala extension-nya.

Selanjutnya tinggal menyesuaikan php.ini yang ada di plugin. Gue kasih contoh bagaimana konfigurasi php.ini gue.&lt;br /&gt;
&lt;pre name="code" class="php"&gt;
zend_extension_ts=.\ZendDebugger.dll
extension_dir=".\ext"
extension=php_soap.dll
extension=php_sockets.dll
extension=php_mysql.dll
extension=php_pdo.dll
extension=php_pdo_mysql.dll
extension=php_pdo_pgsql.dll
extension=php_zip.dll
extension=php_xsl.dll
extension=php_xmlrpc.dll
extension=php_mhash.dll
extension=php_mcrypt.dll
extension=php_mbstring.dll
extension=php_calendar.dll
extension=php_bz2.dll
extension=php_bcmath.dll
extension=php_curl.dll
extension=php_exif.dll
extension=php_ftp.dll
extension=php_gd.dll
extension=php_fdf.dll
extension=php_gd2.dll
extension=php_gettext.dll
extension=php_imap.dll
extension=php_ldap.dll
extension=php_mime_magic.dll
extension=php_ming.dll
extension=php_mysqli.dll
extension=php_openssl.dll
extension=php_pdo_odbc.dll
extension=php_pdo_sqlite.dll
extension=php_pgsql.dll
extension=php_sqlite.dll
extension=php_tidy.dll
&lt;/pre&gt;&lt;br/&gt;
Beberapa orang mungkin lebih sedikit, beberapa lebih banyak, tapi yang penting cuma 3  yang diatas:
&lt;ul&gt;
&lt;li&gt;Address Path dari zend_extension_ts&lt;/li&gt;
&lt;li&gt;Address Path dari extension_dir&lt;/li&gt;
&lt;li&gt;extension apa yang mau di install&lt;/li&gt;
&lt;/ul&gt;
Setelah semua selesai. Silahkan dicoba lagi run index.php scriptnya dan check phpinfo() apakah kali ini extension tersebut terinstall dengan benar. Menurut gue sih mestinya sekarang sudah jalan. Selamat mencoba.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-6740493483280961498?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/L_i_moMucmk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/L_i_moMucmk/install-php-extension-untuk-zend.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R_ACpx_xvPI/AAAAAAAAAZY/0v2mWyNR6P4/s72-c/zend_debugger_mysql.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/03/install-php-extension-untuk-zend.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-2594684404664161974</guid><pubDate>Thu, 13 Mar 2008 20:44:00 +0000</pubDate><atom:updated>2008-12-09T05:03:59.412+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>My Zend Studio for Eclipse License</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R9mYvBHQJmI/AAAAAAAAAXc/7OEw7BTFwaA/s1600-h/zend_studio.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R9mYvBHQJmI/AAAAAAAAAXc/7OEw7BTFwaA/s400/zend_studio.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5177337180159223394" /&gt;&lt;/a&gt;
Akhirnya setelah menunggu sekian lama (tepatnya 1 bulan kurang 2 hari), sambil ngeliatin &lt;i&gt;trial warning popup&lt;/i&gt; yang bikin deg-degan, gue bisa dapetin &lt;a href="http://www.zend.com/de/products/studio/"&gt;Zend Studio for Eclipse&lt;/a&gt; &lt;a href="http://www.zend.com/de/store/software/studio/"&gt;License&lt;/a&gt; dengan harga yang sangat terjangkau.&lt;br /&gt;&lt;br /&gt;
Terima kasih gue sebesar-besarnya buat Perwakilan &lt;a href="http://www.zend.com"&gt;Zend&lt;/a&gt; di indonesia &lt;a href="http://www.rynet.co.id/"&gt;PT. Rynet Cipta Teknologi&lt;/a&gt; dan tentunya buat mas &lt;a href="http://risnandar.wordpress.com/"&gt;Riki Risnandar&lt;/a&gt; sebagai &lt;i&gt;contact person&lt;/i&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;
Beberapa waktu lalu di milist sempat ada kabar bahwa perwakilan Zend di indonesia memberikan kesempatan untuk Komunitas PHP Indonesia membeli Zend Studio for Eclipse dengan harga yang sangat terjangkau: $99, atau tepatnya pada saat gue bayar €65,17 saja. Harga yang menurut gue luar biasa murahnya untuk produkt secanggih ini.
&lt;br /&gt;&lt;br /&gt;
Prosesnya cukup cepat, Selama di kantor hari ini, cuma email-emailan saja sama mas Riki sebagai &lt;i&gt;contact person&lt;/i&gt;, bayar lewat paypal, eh malam ini sudah bisa menikmati Zend Studio tanpa warning popup windows yang bikin deg-degan (angkanya turun terus tuh, belon kelar cobain semua featurenya ^^).&lt;br /&gt;&lt;br /&gt;

Gue harap dengan adanya penawaran ini, komunitas PHP di indonesia bisa dapat semakin berkembang, dan bisa bekerja lebih efektiv dalam pengembangan produkt aplikasi web yang menggunakan PHP.&lt;br /&gt;&lt;br /&gt;

Keep up the good work bro ^^.&lt;br /&gt; &lt;br /&gt;

PS: Kalo udah abis gue bedah ini tools, gue posting dah trik-trik menarik.

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-2594684404664161974?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/WSVWOC3y2ho" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/WSVWOC3y2ho/my-zend-studio-for-eclipse-license.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lP1lCI-HIqo/R9mYvBHQJmI/AAAAAAAAAXc/7OEw7BTFwaA/s72-c/zend_studio.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/03/my-zend-studio-for-eclipse-license.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-5565281160010152910</guid><pubDate>Fri, 29 Feb 2008 15:51:00 +0000</pubDate><atom:updated>2008-12-09T05:03:59.484+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Zend Webinar</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R8gq3v2W8sI/AAAAAAAAAW0/AH4My7UOSog/s1600-h/logo.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R8gq3v2W8sI/AAAAAAAAAW0/AH4My7UOSog/s400/logo.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5172431309260649154" /&gt;&lt;/a&gt; Heute habe ich meine erste Webinar besucht. Diese Webinar würde von Zend veranstaltet und Organisiert. Es geht um seine neue Produkt aus der IDE reihe. Es heißt &lt;i&gt;Zend Studio For Eclipse&lt;/i&gt;. Ich habe dieses Produkt schon seit es noch in beta phase bereits probiert, aber ich habe noch nicht alle seine neue Funktionen ausprobiert, von daher dachte ich es lohnt sich diese Webinar zu besuchen. Das Webinar war sehr Interessant und hilfreich, abgesehen von der technisches Panne die mitten im Webinar passiert ist.&lt;br /&gt;&lt;br /&gt;
&lt;span class="fullpost"&gt;
Unsere Sprecher war Jan Burkl, ein Zend PHP Berater aus Stuttgart. Sein Vortrag finde ich sehr gut strukturiert. Da ich das neue Zend Studio bereits benutze seit der noch in beta Phase war, habe ich ein paar dinge bereits erkannt.&lt;br /&gt;&lt;br /&gt;

Was ich ziemlich interessant finde sind die neue Funktionen wie &lt;i&gt;Refactoring&lt;/i&gt;, &lt;i&gt;Unit-Testing&lt;/i&gt; und &lt;i&gt;Code profiling&lt;/i&gt;. Das hat er ganz schön und systematisch mit Beispielen erklärt.&lt;br /&gt;&lt;br /&gt;

Ich glaube ich sollte solche Webinaren öfter besuchen ^^. 
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-5565281160010152910?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/hkU-wcagFx0" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/hkU-wcagFx0/zend-webinar.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R8gq3v2W8sI/AAAAAAAAAW0/AH4My7UOSog/s72-c/logo.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/02/zend-webinar.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-6274675600655559129</guid><pubDate>Tue, 05 Feb 2008 23:46:00 +0000</pubDate><atom:updated>2008-12-09T05:03:59.617+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Acid Test, Zat asam untuk Browser</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R6j8n16yLAI/AAAAAAAAAV0/SbADv0qBNlY/s1600-h/corrosive_small.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R6j8n16yLAI/AAAAAAAAAV0/SbADv0qBNlY/s400/corrosive_small.jpg" alt="" id="BLOGGER_PHOTO_ID_5163654734199008258" border="0" /&gt;&lt;/a&gt;So buat kalian-kalian atau kita-kita para &lt;span style="font-style: italic;"&gt;Web Application Developer&lt;/span&gt;, istilah &lt;span style="font-style: italic;"&gt;Cross Browser Compatibility &lt;/span&gt;sudah bukan kosakata baru dalam kamus. Semua pasti pernah ngerasain yang namanya lembur cuma gara-gara layout yang sudah cantik indah nan rapi di browser yang satu, berantakan gak karuan di browser yang lain.&lt;br /&gt;
&lt;br /&gt;
Ya ya, &lt;span style="font-style: italic;"&gt;tough job huh?&lt;/span&gt; Kadang-kadang gue mikir, kenapa mereka(Browser Vendor) kok gak punya standarisasi sih buat bikin HTML Interpreter Engine? kenapa harus lain-lain interpretasinya? sudah kayak agama ajah. Padahal sudah ada organisasi seperti &lt;a href="http://w3c.org/"&gt;W3C&lt;/a&gt; yang jelas-jelas sudah bikin  standard-nya.&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
Untuk lebih menyemarakkan acara penyeramagaman Interpretasi pada browser -astaga bahasanya- sebuah organisasi yang menamakan dirinya  &lt;a href="http://webstandards.org/"&gt;The Web Standards Project&lt;/a&gt;, menerbitkan beberapa &lt;span style="font-style: italic;"&gt;code snippet&lt;/span&gt; yang berfungsi untuk mengetest apakah sebuah browser menginterpretasikan HTML, CSS, dan Javascript sesuai standard W3C. &lt;span style="font-style: italic;"&gt;Code Snippet&lt;/span&gt; ini mereka beri nama Acid.&lt;br /&gt;
&lt;br /&gt;
Hingga saat ini sudah &lt;a href="http://www.acidtests.org/"&gt;3 versi Acid&lt;/a&gt; yang diterbitkan oleh Web Standards Project. Acid yang &lt;a href="http://www.w3.org/Style/CSS/Test/CSS1/current/test5526c.htm"&gt;pertama &lt;/a&gt;bahkan diterbitkan langsung oleh W3C. Dengan adanya test ini, setiap &lt;span style="font-style: italic;"&gt;browser vendor&lt;/span&gt; berlomba-lomba memperbaiki browser mereka supaya "lulus" acid test.&lt;br /&gt;
&lt;br /&gt;
Belum lama ini &lt;a href="http://channel9.msdn.com/showpost.aspx?postid=367207"&gt;Channel9&lt;/a&gt; dengan bangga melaporkan bahwa Internet Explorer 8 akan lulus &lt;a href="http://www.webstandards.org/files/acid2/test.html" &gt;acid2&lt;/a&gt; test. Acid2 dirilis April 2005, sekarang tanggal berapa? Halo Microsoft, baru bangun ya? Oh, tenang dulu, ternyata Firefox 2.x pun belum mendukung sepenuhnya, meskipun tidak separah IE 6 atau IE 7. Browser vendor besar lainnya seperti Safari, Konqueror dan Opera, saat ini sudah sanggup &lt;a href="http://en.wikipedia.org/wiki/Acid2"&gt;menginterpretasikan acid2 dengan benar&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
Dengan adanya test ini, dan melihat bahwa setiap browser berlomba untuk memperbaiki produkt mereka supaya dapat menginterpretasikan acid test secara baik dan benar, kita sebagai web developer bisa sedikit bernapas lega. Setidaknya kita bisa lebih memfokuskan waktu kita untuk memperbaiki kesalahan dalam logik dan proses, daripada kesalahan dalam layout.
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-6274675600655559129?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/UB9nDkPDBNg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/UB9nDkPDBNg/acid-test-zat-asam-untuk-browser.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lP1lCI-HIqo/R6j8n16yLAI/AAAAAAAAAV0/SbADv0qBNlY/s72-c/corrosive_small.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/02/acid-test-zat-asam-untuk-browser.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-7998015350572187073</guid><pubDate>Tue, 22 Jan 2008 14:19:00 +0000</pubDate><atom:updated>2008-12-09T05:03:59.847+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Sun acquires MySQL</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R5X8CL-BNoI/AAAAAAAAAVU/-Dq3RhUHH2s/s1600-h/sunmysql2.gif"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R5X8CL-BNoI/AAAAAAAAAVU/-Dq3RhUHH2s/s400/sunmysql2.gif" border="0" alt=""id="BLOGGER_PHOTO_ID_5158306062725625474" /&gt;&lt;/a&gt;This journal from &lt;a href="http://www.golem.de/0801/57061.html"&gt;Golem.de&lt;/a&gt; on 16th January 2008 is a surprise for me. The title on my RSS reader makes me want to klick it and read more about it.&lt;br /&gt; 
&lt;br /&gt;
Actually i don't know how to react at that moment. I have a certain feeling that i can't described it. Well i just try to googled a little bit on that theme, and found the blog from &lt;a href="http://blogs.mysql.com/kaj/2008/01/16/sun-acquires-mysql/"&gt;Kaj Arnö&lt;/a&gt; the Vice President Open Source Community Relations for MySQL. He is trying to give some answers about this event and the impact to the MySQL users, community members, customers, partners, and employees.&lt;br /&gt;
&lt;br /&gt;&lt;span class="fullpost"&gt;
The deal is worth about $1 billion USD and at the same day &lt;a href="http://www.golem.de/0801/57063.html"&gt;Oracle acquires BEA for $8,5 billion USD&lt;/a&gt;. Compare with BEA, MySQL ist very cheap. I think MySQL should be worth more than that, since it has more than $70 million or so in revenue. &lt;br /&gt;
&lt;br /&gt;
Kaj Arnö writes:
&lt;blockquote&gt;Depending on one’s relationship to MySQL, the immediate reaction upon hearing the news may be a mixture of various feelings, including excitement, pride, disbelief and satisfaction, but also anxiety.&lt;/blockquote&gt;&lt;br /&gt;

Well i do feel a mixed of "excitement, pride, disbelief, satisfaction, and anxiety", haha, because i don't really know what's the impact in that time.

Actually i want to post this to &lt;a href="http://tech.groups.yahoo.com/group/phpug/"&gt;phpug&lt;/a&gt; and &lt;a href="http://tech.groups.yahoo.com/group/id-php/"&gt;id-php&lt;/a&gt; but its already late at the office and i really want to go home. I considering to post it the next day at the morning. But someone post it already ^^. &lt;br /&gt;
&lt;br /&gt;
The discussion in the groups and at the office is almost the same. Will the MySQL do better in Solaris and Java in the future? Will the other OS and programming language (such as PHP ^^) be given less attention? How about the LAMP stack, will it be SAMJ(Solaris Apache MySQL Java) stack instead of LAMP stack in the future?&lt;br /&gt;
&lt;br /&gt;
Espescially about LAMP Stack, &lt;a href="http://arstechnica.com/news.ars/post/20080116-sun-targets-open-source-lamp-stack-with-mysql-acquisition.html"&gt;Ryan Paul writing for Art Technica&lt;/a&gt; have a brief analyse to that matter.&lt;br /&gt;
&lt;br /&gt;
What's makes me comfortable in the end, is that Kaj said
&lt;blockquote&gt;But I don’t expect that in any way to be at the cost of other popular operating systems (Linux, Windows, Mac OS/X, other Unixes etc.) or development environments (PHP, Ruby on Rails, Perl, Python, ODBC, C++, C#, VB etc.). MySQL grew with LAMP and MySQL without LAMP at its core is simply unimaginable. It was MySQLs part of LAMP that interested Sun in the first place.&lt;/blockquote&gt;&lt;br/&gt;

Well thats damn true, never takes "My"-SQL away from my LAMP ^^. And in the mean time, maybe i should play with &lt;a href="http://www.opensolaris.org/os/"&gt;OpenSolaris&lt;/a&gt; a little bit, just in case ^^. 
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-7998015350572187073?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/VaXDnipytxU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/VaXDnipytxU/sun-acquires-mysql.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_lP1lCI-HIqo/R5X8CL-BNoI/AAAAAAAAAVU/-Dq3RhUHH2s/s72-c/sunmysql2.gif" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2008/01/sun-acquires-mysql.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-5342478497035504329</guid><pubDate>Sun, 30 Dec 2007 10:46:00 +0000</pubDate><atom:updated>2008-12-09T05:03:59.985+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Publication</category><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Standard orang "PHP"</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R4ZYw7-BNnI/AAAAAAAAAVM/s5D-iRm7P_w/s1600-h/ie_error.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R4ZYw7-BNnI/AAAAAAAAAVM/s5D-iRm7P_w/s400/ie_error.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5153904421326894706" /&gt;&lt;/a&gt;Beberapa waktu lalu di milist &lt;a href="http://tech.groups.yahoo.com/group/id-php/"&gt;id-php&lt;/a&gt; sempat ramai ngebahas tentang pekerjaan, gaji, dan kriteria seorang programmer PHP. Milist ini menurut gue emang cukup cuek soal OOT subject. Setiap kali ada orang posting lowongan pekerjaan pasti ajah dikomentarin. Gaji gak jelas lah, nyari superman lah, dsb.&lt;br /&gt;
&lt;br /&gt;
Pada akhirnya ada orang yang bertanya sebenarnya standard seorang programmer PHP itu apa sih? Apa yang sepatutnya diperhatikan dalam merekrut seorang programmer PHP. Apakah seorang programmer PHP sebaiknya tamatan S1? Harus bisa linux? Harus ini, harus itu? Cukup panas memang, dan gue sendiri sempat menyampaikan pendapat gue dalam diskusi ini.&lt;br /&gt;
&lt;span class="fullpost"&gt; &lt;br /&gt;
Berikut ini adalah email gue yang gue tulis untuk milist &lt;a href="http://tech.groups.yahoo.com/group/id-php/"&gt;id-php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;

Hallo teman2,

gue pengen ikutan ngebahas tentang Standar orang "PHP". Sebelum mulai, ini gue ada satu kutipan posting dari milist tetangga. Posting ini sudah dijawab. Gue kasih kutipan ini bukan untuk menjelek-jelek-kan nama orang atau membodohi, tapi hanya untuk contoh saja menunjang pendapat gue.&lt;br /&gt;
&lt;br /&gt;
So ini kutipannya:
&lt;blockquote&gt;
halo masters...&lt;br /&gt;&lt;br /&gt;
saya ada masalah nih..&lt;br /&gt;&lt;br /&gt;
saya punya 2 tabel tblartikel dan tblfoto&lt;br /&gt;&lt;br /&gt;
TBLARTIKEL&lt;br /&gt;
idartikel&lt;br /&gt;
judul&lt;br /&gt;
headline&lt;br /&gt;
isi&lt;br /&gt;
tgl&lt;br /&gt;&lt;br /&gt;
TBLFOTO&lt;br /&gt;
idfoto&lt;br /&gt;
idartikel&lt;br /&gt;
filefoto&lt;br /&gt;&lt;br /&gt;

saya ingin memanggil artikel dengan idartikel tertentu dan menampilkan
fotonya (foto dengan idartikel yg sama dengan artikel yg dipanggil).&lt;br /&gt;&lt;br /&gt;
tiap foto punya idartikel.&lt;br /&gt;&lt;br /&gt;

saya menggunakn "select A.idartikel, A.judul, A.headline, A.isi, A.tgl,&lt;br /&gt;
B.idartikel, B.filefoto from tblartikel A, tblfoto B where A.idartikel =&lt;br /&gt;
B.idartikel and A.idartikel = $id"&lt;br /&gt;&lt;br /&gt;
tapi kok kalo ada artikel yg ga punya foto malah jadi ga tampil, padahal
kan harusnya foto itu cm ditampilin kalo ada n kalo ga ada ya artikelnya aja
yg ditampilin.&lt;br /&gt;&lt;br /&gt;
atau saya harus membuat tabel baru? tblartikel_foto misalnya... ato dengan&lt;br /&gt;
subquery (saya blm bisa)?&lt;br /&gt;&lt;br /&gt;
mohon pencerahannya. ..&lt;br /&gt;&lt;br /&gt;
terima kasih
&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;
Pertanyaan seperti itu gak jarang. Itu satu pertanyaan yang umum sekali di milist kita tercinta, betul tidak? Pada akhirnya milist ini ada kan untuk saling membantu satu sama lain. Dijawab sekali, berfungsi, selesai. case closed.&lt;br /&gt;
&lt;br /&gt;
tapi apa kita bakal sampe situ terus?&lt;br /&gt;
&lt;br /&gt;
Pernah denger orang bilang:&lt;br /&gt;
- Pengalaman adalah guru yang terbaik&lt;br /&gt;
- Belajar dari pengalaman.&lt;br /&gt;
&lt;br /&gt;
Yang kadang agak rancu menurut gue disini, definisi pengalaman itu apa? Kita belajar dari pengalaman kita sendiri? atau belajar dari pengalaman orang lain?&lt;br /&gt;
&lt;br /&gt;
Menurut gue, kenapa kita sekolah? Atau kuliah? Apakah itu bukanya satu wujud belajar dari pengalaman orang lain? Ilmu itu sudah ada, dan kita gak bisa nunggu sampe kita sadar sendiri, kita harus tahu dari orang lain.&lt;br /&gt;
&lt;br /&gt;
Melihat kutipan post diatas, atau kutipan yang mirip seperti itu, gue yakin, poster lagi belajar sql, atau tepatnya belajar sql syntax. Tapi sampe dimana kita bisa mengerti dan mengimplementasi sql syntax?&lt;br /&gt;
&lt;br /&gt;
Mungkin disini kita bisa bikin definisi pengalaman. Pengalaman karena sering berkutat dengan sql query? Mau sampe kapan?&lt;br /&gt;
&lt;br /&gt;
Gue coba bikin analogi. Kalian pasti pernah denger "don't reinvented the wheel". menurut gue, dengan "hanya" rajin berkutat dengan sql query syntax, kita gak ada bedanya dengan menciptakan ban dari awal. Sampe kita "aha!!! begini toh" maka terciptalah ban tersebut.&lt;br /&gt;
&lt;br /&gt;
Kalau kita mau niat sedikit, sebenernya ban tersebut sudah ada, dan gue yakin kita sudah diajarin dari SD bahwa ban itu ada. Gak percaya? kita yang pernah makan bangku sekolahan pasti pernah belajar himpunan dong?&lt;br /&gt;&lt;br /&gt;
buat yang lupa:&lt;br /&gt;
&lt;a href="http://id.wikipedia.org/wiki/Himpunan"&gt;http://id.wikipedia.org/wiki/Himpunan&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
Gue jujur dah, gue juga dulu males banget, ngapain juga belajar ginian, buat apa?
Di kampus gue belajar relational aljabar sampe jungkir balik, gak ada bedanya sama himpunan, lebih dalem ajah dan menusuk ^^.&lt;br /&gt;
&lt;br /&gt;
buat yang penasaran:&lt;br /&gt;
&lt;a href="http://en.wikipedia.org/wiki/Relational_algebra"&gt;http://en.wikipedia.org/wiki/Relational_algebra&lt;/a&gt;
&lt;br /&gt;&lt;br /&gt;
Tujuannya apa sebenarnya? Setelah mengenal dunia kerja, baru sadar, sql syntax itu hanya tools, sql syntax bisa saja tidak seperti yang kita kenal sekarang, bisa jadi lain, tapi konsepnya itu selalu sama. Bahkan, dengan mengerti relational aljabar, sql query kita lebih optimal, karena sudah diperhitungkan dengan baik.&lt;br /&gt;
&lt;br /&gt;
Terkadang pengalaman itu relatif sekali, orang yang berkecimpung 3 tahun di php, tapi gak pernah mengenal dasar2 relational aljabar, bisa saja dilewati oleh orang yang baru kenal php 1 tahun tapi punya dasar yang kuat.&lt;br /&gt;
&lt;br /&gt;
Ini bukan hanya untuk database, juga untuk &lt;i&gt;Object Oriented Programming&lt;/i&gt;
atau yang lainnya. Kalau paradigma OOP paham sampai ke akar2nya, php itu hanya tools untuk bekerja, bahasa bisa macam2, syntax bisa lain, tapi konsepnya sama.&lt;br /&gt;
&lt;br /&gt;
Sekarang, coba kita pikir2 :D. kalo kita mengerti konsep relational aljabar, table jelas, keinginan jelas, maunya dapat apa dari table-table ini, sql syntax kita pun semestinya sudah jelas arahnya mo kemana.&lt;br /&gt;
&lt;br /&gt;
Gue setuju kita gak akan henti2nya belajar, apalagi kita orang IT, perkembangan Teknologinya bisa dihitung permenit, bahkan perdetik. Setiap saat pasti ada hal baru. Sekarang tinggal belajar seperti apa?&lt;br /&gt;
&lt;br /&gt;
Langsung terjun ke dunia kerja, dan belajar dari pengalaman pribadi (trial and error) gak bisa selalu dijadikan alasan yang bijaksana. gue setuju juga, banyak orang yang sukses tanpa ijasah, tapiiii, ada lebih banyak lagi orang yang sukses dengan ijasah.
&lt;br /&gt;&lt;br /&gt;
Ijasah itu nilai tambah yang cukup besar, dan udah bukan rahasia lagi untuk setiap orang, bahwa perusahaan besar itu lebih mendahulukan orang yang memiliki ijasah dalam merekrut pegawai. Salah satu alasannya? ya itu tadi, mereka yang punya ijasah, dianggap memiliki dasar yang lebih kuat. Strateginya, meskipun pegawai baru tersebut gak tahu apa yang bakal disodorin di depan muka dia, pegawai baru tersebut mempunyai kemampuan memahami, bereaksi dan membuat solusi lebih cepat.&lt;br /&gt;
&lt;br /&gt;
Sekali lagi tolong jangan dianggap ijasah itu segala2nya ya, seperti yang gue bilang tadi, tanpa ijasah pun banyak yang sukses. hanya saja untuk menerima pegawai itu kan pasti butuh perhitungan yang jelas. Masing2 pelamar harus dinilai dan dipertimbangkan. orang bagian personalia atau yang memang belajar recruiting pasti lebih ngerti gimana tehniknya.&lt;br /&gt;
&lt;br /&gt;
Entah bagaimana caranya kita tetap harus bisa menunjukkan kemampuan kita, dan jumlah pengalaman itu gak bisa selalu dijadikan pegangan untuk memberikan standardarisasi ke setiap orang.&lt;br /&gt;
&lt;br /&gt;
So sekarang gue coba balikin deh ke kitasemua PHPers. Kita itu Standard orang PHP yang seperti apa? Sampe sejauh mana kita mengerti pekerjaan kita? apakah sekedar pengalaman? sampai sejauh mana kita paham segala macam bentuk konsep atau paradigma yang ada?&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
Mit freundlichen Grüßen&lt;br /&gt;
Arthur Purnama
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-5342478497035504329?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/1jgQ60w3lxQ" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/1jgQ60w3lxQ/standard-orang-php_30.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_lP1lCI-HIqo/R4ZYw7-BNnI/AAAAAAAAAVM/s5D-iRm7P_w/s72-c/ie_error.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/standard-orang-php_30.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-6132289013280235096</guid><pubDate>Sat, 29 Dec 2007 16:07:00 +0000</pubDate><atom:updated>2008-12-09T05:04:00.148+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Journal</category><title>Tweak the Fox</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R3Qz07-BNmI/AAAAAAAAAVE/GADtcxNGH2s/s1600-h/firefox.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R3Qz07-BNmI/AAAAAAAAAVE/GADtcxNGH2s/s400/firefox.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5148797258535351906" /&gt;&lt;/a&gt; Buat gue, Firefox gak cuma sekedar sebuah Browser. Buat gue, Firefox gak cuma sekedar Aplikasi. Browser yang satu ini sudah jadi teman setia gue sejak.. hmm.. katakanlah 2004. Awalnya memang gue pakai hanya sebagai browser. Tapi, semakin gue kenal, semakin gue gak bisa lepas dari browser satu ini.&lt;br /&gt;
&lt;br /&gt;
Firefox sudah membantu gue dalam bekerja membangun berbagai macam aplikasi web. Berkat berbagai macam &lt;i&gt;AddOn&lt;/i&gt; yang dimiliki, Firefox sudah membantu gue untuk bekerja lebih efektiv dan optimal. Kesalahan dalam menulis aplikasi lebih mudah untuk ditemukan, diatasi atau bahkan mungkin dihindari.&lt;br /&gt;
&lt;br /&gt;
Dalam kesempatan ini gue pengen berbagi informasi tentang beberapa &lt;i&gt;Firefox AddOn&lt;/i&gt; yang umum gue pakai untuk menunjang kerja gue dalam membangun aplikasi web.&lt;br /&gt;
&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/60"&gt;Web Developer&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Ini &lt;i&gt;AddOn&lt;/i&gt; paling penting. Setelah install Firefox, ini &lt;i&gt;AddOn&lt;/i&gt; pertama yang pasti gue install.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;Addon&lt;/i&gt; ini memiliki beberapa komponen esensial yang dibutuhkan untuk membangun aplikasi web. Beberapa yang menurut gue penting, gue urutin dari yang paling sering gue pake:&lt;br /&gt;&lt;br/&gt;
&lt;div style="padding-left: 20px;"&gt;
&lt;strong&gt;Resize&lt;/strong&gt;&lt;br/&gt;
Apakah itu website buat indonesia (800x600) atau standard (1024x768), gue bisa lihat bagaimana bentuk website gue kalo dilihat di berbagai macam resolusi. Setidaknya resolusi yang lebih kecil dari resolusi monitor yang kita pakai untuk bekerja.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;Outline&lt;/strong&gt;&lt;br/&gt;
Dengan komponen ini, gue bisa melihat semua posisi dan prilaku &lt;i&gt;div&lt;/i&gt; atau &lt;i&gt;table&lt;/i&gt; gue. Buat kalian yang suka bekerja menggunakan css untuk menciptakan Dynamic HTML, komponen ini sangat membantu sekali.&lt;br /&gt;
&lt;br /&gt;
&lt;strong&gt;CSS&lt;/strong&gt;&lt;br /&gt;
Komponen ini kebanyakan gue pake buat nyontek CSS orang ^^. Maklum CSS kan suka disimpan di beberapa &lt;i&gt;file&lt;/i&gt; yang berbeda, atau kadang ditulis langsung sebagai &lt;i&gt;tag attribute&lt;/i&gt;.&lt;br /&gt;
&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Must Have Debugger&lt;/i&gt;.  Biasanya gue pake buat debug Javascript, terutama buat kalian yang hobi bikin aplikasi menggunakan teknologi AJAX. Kita bisa melihat dibaris keberapa error kita, &lt;i&gt;jump to code&lt;/i&gt;, menampilkan pesan error, dan menginformasikan segala macam bentuk &lt;i&gt;HTTP-Request&lt;/i&gt;. Tanpa dia, sulit menghasilkan aplikasi Web 2.0 secara efektiv dan efisien.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/249"&gt;HTML Validator&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Buat mereka para HTML or XHTML perfeksionis, ini &lt;i&gt;Addon&lt;/i&gt; buat kalian semua. Kita dapat memilih, bagaimana halaman website kita divalidasi, Tidy atau SGML &lt;i&gt;Parser&lt;/i&gt;. Buat mereka yang sering menciptakan aplikasi web untuk &lt;i&gt;mobile handheld&lt;/i&gt; -apa tuh bahasa indonesianya, err... piranti bergerak?^^- pasti juga butuh &lt;i&gt;Addon&lt;/i&gt; ini.&lt;br/&gt;
&lt;br/&gt;
Gue pribadi lebih suka menggunakan SGML &lt;i&gt;Parser&lt;/i&gt; untuk memvalidasi halaman website gue. Mungkin kelihatannya seperti perfeksionis, karena SGML &lt;i&gt;Parser&lt;/i&gt; memvalidasi sesuai definisi DTD atau XSD yang ada tanpa toleransi apapun. Jadi kalau website kalian dapet tanda centang hijau sama SGML &lt;i&gt;Parser&lt;/i&gt;, berarti website kalian memiliki struktur yang "baik dan benar" kayak berbicara bahasa indonesia saja ^^.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1269"&gt;Fasterfox&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
gue pake &lt;i&gt;Addon&lt;/i&gt; ini sebenarnya hanya untuk mendapatkat &lt;i&gt;page load timer&lt;/i&gt;-nya. Untuk melihat seberapa cepat server memproses &lt;i&gt;request&lt;/i&gt; dari client.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/271"&gt;Colorzilla&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Solusi cepat untuk mencari tahu warna yang dipakai pada website yang sedang dikunjungi. Cocok untuk yang hobi cari inspirasi design baru.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5648"&gt;Fireshot&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
&lt;i&gt;Addon&lt;/i&gt; ini gue pakai untuk bekerja dalam tim. Dalam fase &lt;i&gt;frontend&lt;/i&gt; test, biasanya banyak design atau fungsi yang berjalan tidak sesuai dengan yang diharapkan. Menggunakan ini kita bisa ambil &lt;i&gt;screenshot&lt;/i&gt; dari website yang dimaksud, dan kita dapat mengedit &lt;i&gt;screenshot&lt;/i&gt; tersebut untuk memberi tanda dan komentar pada bagian yang harus diperbaiki.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2064"&gt;Dummy Lipsum&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Buat kalian yang bikin aplikasi seperti CMS. Ini termasuk &lt;i&gt;Addon&lt;/i&gt; penting. &lt;i&gt;Addon&lt;/i&gt; ini memproses dummy text untuk digunakan dalam &lt;i&gt;textarea&lt;/i&gt;. Dengan ini kita bisa mendapatkan gambaran sebuah artikel yang di post.&lt;br /&gt;
&lt;br /&gt;
Kutipan dari wikipedia tentang dummy text:
&lt;blockquote&gt;Lorem ipsum, atau ringkasnya lipsum, adalah teks standar yang ditempatkan untuk mendemostrasikan elemen grafis atau presentasi visual seperti font, tipografi, dan tata letak. Maksud penggunaan lipsum adalah agar pengamat tidak terlalu berkonsentrasi kepada arti harfiah per kalimat, melainkan lebih kepada elemen desain dari teks yang dipresentasi.&lt;/blockquote&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1419"&gt;IE Tab&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Kadang-kadang gue males buka 2 browser sekaligus untuk mengetest design HTML. Dengan ini gue bisa melihat design HTML gue di IE tanpa harus membuka IE.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/966"&gt;Tamper Data&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;
Dengan ini kita dapat membaca dan memanipulasi setiap HTTP Header dan Post parameter. Cocok untuk mengetest apakah aplikasi kita mudah di hack atau tidak.&lt;br /&gt;
&lt;br /&gt;

Sampai saat ini, itu tadi beberapa &lt;i&gt;Addon&lt;/i&gt; yang umum gue pakai dalam bekerja. Mungkin kalau gue nemu lagi yang baru, bakal gue tulis. Atau mungkin kalian ada yang bisa memberi penawaran &lt;i&gt;Addon&lt;/i&gt; yang bagus tapi gue belon tahu.

&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-6132289013280235096?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/tQOtfRyrUwU" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/tQOtfRyrUwU/tweak-fox_29.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R3Qz07-BNmI/AAAAAAAAAVE/GADtcxNGH2s/s72-c/firefox.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/tweak-fox_29.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-8493387688868064734</guid><pubDate>Tue, 18 Dec 2007 23:00:00 +0000</pubDate><atom:updated>2008-12-09T05:04:00.362+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>KMKI.Net 4.0</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2hSQ7-BNVI/AAAAAAAAASg/rhugi0q-Hys/s1600-h/kmki_40.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2hSQ7-BNVI/AAAAAAAAASg/rhugi0q-Hys/s320/kmki_40.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145453025199994194" /&gt;&lt;/a&gt; Vierte version von dem &lt;a href="http://www.digit4all.net"&gt;KMKI Website&lt;/a&gt; mit vielen neuen &lt;i&gt;Feature&lt;/i&gt; und Konzepte. Dieses Projekt befindet sich zur zeit noch in entwicklungsphase. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;KMKI Germany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;KMKI Germany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, MySQL, HTML, Javascript, CSS, AJAX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Eclipse PDT&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-8493387688868064734?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/F3kv7usb77k" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/F3kv7usb77k/kmkinet-40.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2hSQ7-BNVI/AAAAAAAAASg/rhugi0q-Hys/s72-c/kmki_40.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/kmkinet-40.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-9166396611689390502</guid><pubDate>Tue, 18 Dec 2007 21:39:00 +0000</pubDate><atom:updated>2008-12-09T05:04:00.509+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Jobcluster</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R2g-tb-BNUI/AAAAAAAAASY/xWl5qzQMFr8/s1600-h/jobcluster.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R2g-tb-BNUI/AAAAAAAAASY/xWl5qzQMFr8/s320/jobcluster.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145431524593710402" /&gt;&lt;/a&gt; &lt;a href="http://www.jobcluster.de"&gt;Jobcluster&lt;/a&gt; ist eine Jobportal der Firma &lt;a href="http://www.gbg-ag.net"&gt;Global Business Group AG&lt;/a&gt; mit sitzt in Fulda. Für dieses Projekt bin ich als &lt;i&gt;Core&lt;/i&gt; Entwickler verantwortlich für Datenbank- und Softwarentwurf. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;Global Business Group AG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;Silicon-Saxony e.V., UV-Th&amp;uuml;ringen, u.v.m.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, PostgreSQL, MySQL, HTML, DHTML, Javascript, CSS, AJAX&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Zend Development Environment&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;
Das Prinzip:&lt;br /&gt;
&lt;br /&gt;
JOBCLUSTER&amp;reg; ist nicht nur eine große Stellenbörse; JOBCLUSTER&amp;reg; ermöglicht vielmehr die umfassende Bewerberansprache und stellt die Unternehmen und deren Publikationsstrategie in den Mittelpunkt.&lt;br /&gt;
&lt;br /&gt;
JOBCLUSTER&amp;reg; besteht aus vielen selbstständigen Clustern in Regionen, Wirtschaftsräumen und -verbänden.&lt;br /&gt;
&lt;br /&gt;
Mit JOBCLUSTER&amp;reg; haben Organisationen jetzt erstmalig die Plattform, ihre Stellenangebote einfach zu formulieren und ohne Einschränkungen überall und zielgerichtet zu publizieren! Umfangreiche Funktionen ermöglichen eine hervorragende Bewerberansprache und den Aufbau einer Arbeitgebermarke, einem „Employer Branding“.&lt;br /&gt;
&lt;br /&gt;
JOBCLUSTER&amp;reg; bietet die Umsetzung unterschiedlicher Publikationsstrategien und ergänzt die einfache Visualisierung der Stellenanzeige durch aktive und gezielte JOB-Kampagnen! So belegen Sie nicht einfach visuell einen Nischenplatz im Internet, sondern nutzen aktiv alle Möglichkeiten und Mittel optimal, um eine prominente Position einzunehmen und zu festigen. JOBCLUSTER&amp;reg; hilft ihnen, ihre Einzigartigkeit erfolgreich darzustellen und sie in einer Führungsposition ins Recruiting-Geschehen einzubinden. Die Stellenanzeige wird zum Produkt aufgewertet, das entsprechend positiv und werthaltig präsentiert wird!&lt;br /&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-9166396611689390502?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/ps3HrEe-9hs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/ps3HrEe-9hs/jobcluster.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_lP1lCI-HIqo/R2g-tb-BNUI/AAAAAAAAASY/xWl5qzQMFr8/s72-c/jobcluster.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/jobcluster.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-3132274061710856194</guid><pubDate>Tue, 18 Dec 2007 21:13:00 +0000</pubDate><atom:updated>2008-12-09T05:04:00.688+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Opuzz</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2g6t7-BNTI/AAAAAAAAASQ/u43rsqj3RIA/s1600-h/opuzz.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2g6t7-BNTI/AAAAAAAAASQ/u43rsqj3RIA/s320/opuzz.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145427135137133874" /&gt;&lt;/a&gt; Opuzz ist eine marke der Firma &lt;a href="http://www.adaptis.de/index.php?id=673"&gt;Adaptis GmbH&lt;/a&gt; eine Tochterunternehmen der Personaldienstleistung &lt;a href="http://www.jobag.de/"&gt;Job AG&lt;/a&gt; mit sitzt in Fulda. Opuzz ist eine Webbasiertes Zeitwirtschaftsystem. Im rahmen eine studienbegleitende Tätigkeiten habe ich die gelegenheit dieses System mitzuentwickeln. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;Adaptis GmbH&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;Job AG, Silver Plastics GmbH u.v.m.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, PostgreSQL, HTML, DHTML, Javascript, CSS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Zend Development Environment&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-3132274061710856194?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/P3UTgx_sSWk" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/P3UTgx_sSWk/opuzz.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2g6t7-BNTI/AAAAAAAAASQ/u43rsqj3RIA/s72-c/opuzz.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/opuzz.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-2659108326579733445</guid><pubDate>Mon, 17 Dec 2007 22:56:00 +0000</pubDate><atom:updated>2008-12-09T05:04:02.416+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Gundam 3D</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R27_Y7-BNZI/AAAAAAAAATc/ucwM8mIVGC0/s1600-h/freedom1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R27_Y7-BNZI/AAAAAAAAATc/ucwM8mIVGC0/s400/freedom1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147332228010816914" /&gt;&lt;/a&gt; Gundam Seed Destiny as a 3D model. This project is a combination between a "dream comes true" ambition and "i want my credit" ambition.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; On one side i give all my effort to make this project as good as it can get, but on the other side, i don't have much time for that. &lt;br /&gt;
&lt;br /&gt;
I work with 2 other colleague on this project, and the main idea behind all of this, is actually a nursery or a play room or whatever you can say it. It's a room where a child used to play with his toy.&lt;br /&gt;
&lt;br /&gt;
Well actually i'm expecting a space for this with lots of space station, space shuttle and something like that, but then again, i am in a group for this project, and i am not the only one that makes decision. We choose the easiest way to finish this project because for the other, the credit is  more important. &lt;span class="fullpost"&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Developed for :&lt;/td&gt;&lt;td &gt;Hochschule Fulda&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Client :&lt;/td&gt;&lt;td &gt;Hochschule Fulda&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technologie :&lt;/td&gt;&lt;td &gt;Computer Generated Imagery&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;Tools :&lt;/td&gt;&lt;td &gt;Lightwave 3D, Adobe Premiere&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br/&gt;&lt;br /&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28E17-BNaI/AAAAAAAAATk/DsYPit6lw84/s1600-h/justice-freedom.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28E17-BNaI/AAAAAAAAATk/DsYPit6lw84/s400/justice-freedom.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147338223785162146" /&gt;&lt;/a&gt;&lt;br/&gt;
I think my interest on CGI come from &lt;a href="http://www.gamespot.com/pc/strategy/warcraft2tidesofdarkness/review.html?om_act=convert&amp;om_clk=tabs&amp;tag=tabs;reviews"&gt;&lt;i&gt;Warcraft 2 - Tides of Darkness&lt;/i&gt;&lt;/a&gt;. At that time, i really want to be one of Blizzard employee and participate on developing the cutscene. Why i choose to studying Multimedia Computer Science, is all about 3D, CGI and something like that.&lt;br /&gt;
&lt;br /&gt;
Now i realize that my major is not only about 3D, but a lot more than that. And i realize too that i'm actually not so good on creating, designing and developing a 3D Animation. As i make the proposal for the project, i already realize that my model will be a though one and i will need to invest times for this one. But i don't care, this is a dream come true, it can't be better than that.&lt;br /&gt;
&lt;br /&gt;
The first month filled with Tutorials, brain storming, creating story board, and collecting/finding materials to be modelled. Well i'm not so good on drawing objects or pinch the object out of my mind, so i buy this plastic toy from &lt;a href="http://www.ebay.de"&gt;ebay&lt;/a&gt; to be used my model.&lt;br/&gt;
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28Jsr-BNbI/AAAAAAAAATs/Wz4FzK1mZdc/s1600-h/gundam-modell1.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28Jsr-BNbI/AAAAAAAAATs/Wz4FzK1mZdc/s400/gundam-modell1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147343562429511090" /&gt;&lt;/a&gt; For just €20 and 2 weeks of waiting patiently  i have my &lt;i&gt;Freedom Gundam&lt;/i&gt;. Well &lt;i&gt;Freedom&lt;/i&gt; come from Hongkong thats why i must wait for 2 weeks.&lt;br /&gt;
&lt;br /&gt;
The model is not enough. I need a tools, and reference. For tools our CGI Labor have 2 kind of 3D modeling software:
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://newtek.com/lightwave"&gt;Lightwave 3D&lt;/a&gt; from &lt;a href="http://newtek.com"&gt;Newtek&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.autodesk.com/maya"&gt;Maya&lt;/a&gt; from &lt;a href="http://www.autodesk.com"&gt;Autodesk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt; 
Our group choose Lightwave, because at that time, there is more tutorial scattered around Multimedia Students on campus. For literature reference i use &lt;i&gt;Inside Lightwave from Dan Ablan&lt;/i&gt;.&lt;br/&gt;
&lt;br/&gt;
I surfed the internet and hoped that i can find someone that already have a project about developing a Gundam 3D model. And that is how i meet &lt;a href="http://anaheimmachines.blogspot.com/"&gt;Ivan Sanchez&lt;/a&gt;. At that time he is working as an English Teacher in Japan and modeled the Gundam on his free time. He help me a lot in Texturing and Lightning technique.&lt;br/&gt;
&lt;br/&gt; 
Well I have the toy, i have the book and others reference. Now it's time to get started. I don't have much time to learn about spline modeling technique, so i do everything with box modeling technique. I started with the body:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R28ZYb-BNcI/AAAAAAAAAT0/XB1o4SAiDzk/s1600-h/brust8.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R28ZYb-BNcI/AAAAAAAAAT0/XB1o4SAiDzk/s400/brust8.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147360806723204546" /&gt;&lt;/a&gt;
The cockpit part is a little bit hard to modeled, because it has an elipse area. I need a little bit more polygon and subpatched it to make it more smooth.&lt;br/&gt;
&lt;br /&gt;
The next part will be the waist:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28avr-BNdI/AAAAAAAAAT8/WqkPzyTFdjU/s1600-h/bauch8.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28avr-BNdI/AAAAAAAAAT8/WqkPzyTFdjU/s400/bauch8.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147362305666790866" /&gt;&lt;/a&gt;
followed with the arms:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R28bAb-BNeI/AAAAAAAAAUE/kEcPz2atSlI/s1600-h/arm10.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R28bAb-BNeI/AAAAAAAAAUE/kEcPz2atSlI/s400/arm10.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147362593429599714" /&gt;&lt;/a&gt;
and the legs:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28bf7-BNfI/AAAAAAAAAUM/wIbRfDzq6gQ/s1600-h/fuss13.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28bf7-BNfI/AAAAAAAAAUM/wIbRfDzq6gQ/s400/fuss13.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147363134595479026" /&gt;&lt;/a&gt;
Well this tree parts is consider the easiest from all, just used some blocks and subpatch method. In the end, you need to mirror the object to make a duplicate copy of the object. The hardest part of the model will be the legs part, where i need to use many of capsule or disc object.&lt;br /&gt;
&lt;br/&gt;
The next part will be the wing:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28hqr-BNgI/AAAAAAAAAUU/ORAJJCn3-ug/s1600-h/sayap6.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28hqr-BNgI/AAAAAAAAAUU/ORAJJCn3-ug/s400/sayap6.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147369916348839426" /&gt;&lt;/a&gt;
The shield:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28h47-BNhI/AAAAAAAAAUc/EWAKK5jcPYk/s1600-h/shield3.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28h47-BNhI/AAAAAAAAAUc/EWAKK5jcPYk/s400/shield3.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147370161161975314" /&gt;&lt;/a&gt;
And the Weapon:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R28iFL-BNiI/AAAAAAAAAUk/5fuqXaToUCY/s1600-h/waffe5.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R28iFL-BNiI/AAAAAAAAAUk/5fuqXaToUCY/s400/waffe5.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147370371615372834" /&gt;&lt;/a&gt;&lt;br/&gt;
The last hardest part will be the hands:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R28igb-BNjI/AAAAAAAAAUs/OzeSAanTAkE/s1600-h/hand1.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R28igb-BNjI/AAAAAAAAAUs/OzeSAanTAkE/s400/hand1.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147370839766808114" /&gt;&lt;/a&gt;
And the Head:
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28iwr-BNkI/AAAAAAAAAU0/OWmD7W3Fkw4/s1600-h/kopf13.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R28iwr-BNkI/AAAAAAAAAU0/OWmD7W3Fkw4/s400/kopf13.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147371118939682370" /&gt;&lt;/a&gt;
I spent about 160 hours of work in about one and a half month to do the modeling. Of course i want to shape it better, but i just don't have time for that.&lt;br/&gt;
&lt;br/&gt;
To prepare the model for the animation sequence, i need to set up bones for the model. And from that bone, i need to set the limits for every bone movement. In this part i'm struggling with some Lightwave bugs, because the limits doesn't work the way i want. Well this is the Gundam bones.
&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28kf7-BNlI/AAAAAAAAAU8/Z-sqQMqCNG0/s1600-h/bones.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R28kf7-BNlI/AAAAAAAAAU8/Z-sqQMqCNG0/s400/bones.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5147373030200129106" /&gt;&lt;/a&gt;
I don't do much in texturing, because i don't have much time for the animation and rendering. I create 2 versions of the Gundam. one with his original texture, and the other with the &lt;i&gt;Justice&lt;/i&gt; texture.&lt;br/&gt;
&lt;br/&gt;
The next best part is of course the animation. Well i don't have many rooms to improvise, since my gundam will be on a nursery room. Actually it should only stay there and do nothing. But it will be to boring and affect my credit. So i decided to make it flying around the room.&lt;br/&gt;
&lt;br/&gt;
The rendering took about two and a half weeks. Rendered will be around Christmas Holiday on 2005. At that time, i have 2 PCs and one Laptop in my 16qm dorm. 2 Pcs is a 2,2 Ghz AMD Athlon XP with each 1,5 Gb and 1 Gb DDR RAM. The Laptop have 1,6 Gb. Intel Celeron Modile with 1 Gb. Of DDR RAM. The First two day of rendering makes me realize that is not enough. So i borrowed another AMD PC from my dorm-mate who wants to go on a Christmas Holiday.&lt;br/&gt;
&lt;br/&gt;
Lets say i 'm pleased with the result, but not satisfied. Well maybe if i have more time, i will make my own scene until i'm really satisfied. Who knows. But right now you can enjoy the end result.&lt;br/&gt;&lt;br/&gt;
&lt;object width="425" height="355" style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;"&gt;&lt;param name="movie" value="http://www.youtube.com/v/iQI6M_Xo-sU&amp;rel=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6&amp;border=0"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/iQI6M_Xo-sU&amp;rel=1&amp;color1=0x2b405b&amp;color2=0x6b8ab6&amp;border=0" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-2659108326579733445?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/QOqg5aP2LJc" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/QOqg5aP2LJc/gundam-3d.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_lP1lCI-HIqo/R27_Y7-BNZI/AAAAAAAAATc/ucwM8mIVGC0/s72-c/freedom1.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/gundam-3d.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-5955411768374633247</guid><pubDate>Mon, 17 Dec 2007 22:55:00 +0000</pubDate><atom:updated>2008-12-09T05:04:02.598+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Online Ticket System</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2pWeb-BNWI/AAAAAAAAASo/pCx0SH6_kD0/s1600-h/bg-karlsruhe_farbe.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2pWeb-BNWI/AAAAAAAAASo/pCx0SH6_kD0/s320/bg-karlsruhe_farbe.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5146020605128160610" /&gt;&lt;/a&gt; Im Sommer 2005, habe ich die Gelegenheit eines Online Ticket System für ein Basketball Verein &lt;a href="http://www.bg-karlsruhe.de"&gt;BG Karlsruhe&lt;/a&gt; zu entwickeln. Diese Online Ticket System sollte eines teil des gesamten Website Portal der Verein integriert werden. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;Navigate AG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;BG Karlsruhe&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, MySQL, HTML, Javascript, CSS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Zend Development Environment&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-5955411768374633247?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/hlmZJto3pWM" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/hlmZJto3pWM/online-ticket-system.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2pWeb-BNWI/AAAAAAAAASo/pCx0SH6_kD0/s72-c/bg-karlsruhe_farbe.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/online-ticket-system.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-4727943900304052775</guid><pubDate>Mon, 17 Dec 2007 22:54:00 +0000</pubDate><atom:updated>2008-12-09T05:04:02.760+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>KMKI.Net 3.0</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R2b-Rr-BNSI/AAAAAAAAASI/x6WpGX3IjY4/s1600-h/kmki30.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R2b-Rr-BNSI/AAAAAAAAASI/x6WpGX3IjY4/s320/kmki30.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145079204131452194" /&gt;&lt;/a&gt; Im Jahr 2004, habe ich die gelegenheit Einen Webportal für eine Indonesische Studenten Verbindung zu entwickeln. Diese Webportal sollte die statische Website des Studenten Verbindung ersetzen. Für dieses Projekt würde eine eigene Content Management System entwickelt. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Website ist unter &lt;a href="http://www.kmki.net"&gt;http://www.kmki.net&lt;/a&gt; zu erreichen. 
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;KMKI Germany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;KMKI Germany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, MySQL, HTML, DHTML, Javascript, CSS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Zend Development Environment, Macromedia Dreamweaver, Fireworks, Photoshop&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-4727943900304052775?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/BhOV1D_ibYg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/BhOV1D_ibYg/kmkinet-30.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lP1lCI-HIqo/R2b-Rr-BNSI/AAAAAAAAASI/x6WpGX3IjY4/s72-c/kmki30.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/kmkinet-30.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-1680398658059056117</guid><pubDate>Mon, 17 Dec 2007 22:39:00 +0000</pubDate><atom:updated>2008-12-09T05:04:02.937+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>COMP4site Content Management System</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_lP1lCI-HIqo/R2b7Br-BNRI/AAAAAAAAASA/t7mHy_EG8aY/s1600-h/comp4site.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://4.bp.blogspot.com/_lP1lCI-HIqo/R2b7Br-BNRI/AAAAAAAAASA/t7mHy_EG8aY/s320/comp4site.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145075630718661906" /&gt;&lt;/a&gt; Im Rahmen meines Praktikums an der firma COM.Positum GmbH, habe ich die Gelegenheit die Firmeneigene Entwicklung des Content-Managament Systems "COMP4site" weiterzuentwickeln. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die Kunden, die dieses CMS benutzen, sind u.a:
&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.kabelbw.de"&gt;http://www.kabelbw.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.stadtwerke-hef.de"&gt;http://www.stadtwerke-hef.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mediana.de"&gt;http://www.mediana.de&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bickhardt-bau.de"&gt;http://www.bickhardt-bau.de&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt; 
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;COM.Positum Multimedia Agentur GmbH&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;Kabel BW, Mediana, u.v.m.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, MySQL, HTML, Javascript, CSS, DHTML&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Zend Development Environment, Apache HTTP Server&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-1680398658059056117?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/oi_vhHv51OE" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/oi_vhHv51OE/comp4site.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_lP1lCI-HIqo/R2b7Br-BNRI/AAAAAAAAASA/t7mHy_EG8aY/s72-c/comp4site.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/comp4site.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-2127994257250130870</guid><pubDate>Mon, 17 Dec 2007 22:25:00 +0000</pubDate><atom:updated>2008-12-09T05:04:03.035+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Weihenstephan Online Shop</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R2b4WL-BNQI/AAAAAAAAAR4/MlFAigWiY0Y/s1600-h/weihenstephan.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R2b4WL-BNQI/AAAAAAAAAR4/MlFAigWiY0Y/s320/weihenstephan.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145072684371096834" /&gt;&lt;/a&gt; Im Rahmen meines Praktikum bei Digital Advertising AG (jetzt Elephant Seven AG), habe ich die Möglichkeit eine Online Shop System für die Kunden Firma Molkerei Weihenstephan zu entwickeln. In diesem Projekt bin ich zuständig für die Realisierung der vorgegebenen Konzept und Layout. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;Molkerei Weihenstephan&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;Elephant Seven AG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, MySQL, HTML, Javascript, CSS, DHTML&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;Tools :&lt;/td&gt;&lt;td &gt;Zend Development Environment, Code Charge Studio, Apache HTTP Server&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-2127994257250130870?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/Vp5Kofc4Aqs" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/Vp5Kofc4Aqs/weihenstephan-online-shop.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_lP1lCI-HIqo/R2b4WL-BNQI/AAAAAAAAAR4/MlFAigWiY0Y/s72-c/weihenstephan.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/weihenstephan-online-shop.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-7786084766451662818</guid><pubDate>Mon, 17 Dec 2007 22:17:00 +0000</pubDate><atom:updated>2008-12-09T05:04:03.278+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Newsletter System</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_lP1lCI-HIqo/R2b2J7-BNPI/AAAAAAAAARw/rRykXhZgocs/s1600-h/newsletter.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_lP1lCI-HIqo/R2b2J7-BNPI/AAAAAAAAARw/rRykXhZgocs/s320/newsletter.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145070274894443762" /&gt;&lt;/a&gt; Im Rahmen meines Praktikum bei Digital Advertising AG (jetzt Elephant Seven AG), habe ich die Möglichkeit die firmeninterne Newsletter System zu entwickeln. In diesem Projekt bin ich zuständig für die Realisierung der vorgegebenen Konzept und Layout.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
Das große Herausforderung liegt an die Anforderung der Kapazität des Systems, die über 3000 Empfänger belastet werden können.&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;Elephant Seven AG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;Elephant Seven AG&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;PHP, MySQL, HTML, Javascript, CSS, DHTML&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="vertical-align: top;"&gt;Tools :&lt;/td&gt;&lt;td&gt;Zend Development Environment, Code Charge Studio, Apache HTTP Server, Major DOMO Mailing List Server&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-7786084766451662818?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/whoCDg4AMV8" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/whoCDg4AMV8/newsletter-system.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_lP1lCI-HIqo/R2b2J7-BNPI/AAAAAAAAARw/rRykXhZgocs/s72-c/newsletter.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/newsletter-system.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-4416759135648791329</guid><pubDate>Mon, 17 Dec 2007 22:11:00 +0000</pubDate><atom:updated>2008-12-09T05:04:03.553+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>KMKI.Net 2.0</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2b0nb-BNOI/AAAAAAAAARo/RPakVy43gz4/s1600-h/kmkiv2.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2b0nb-BNOI/AAAAAAAAARo/RPakVy43gz4/s320/kmkiv2.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145068582677329122" /&gt;&lt;/a&gt; Einen Präsentation Website für eine Indonesische Studenten Verbindung. Ich habe die Gelegenheit die Website neu zu entwickeln. Für diesen Projekt habe ich die Möglichkeit das gesamte Layout und Navigation neu zu Konzipieren.&lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die website ist leider unter &lt;a href="http://www.kmki.net"&gt;http://www.kmki.net&lt;/a&gt; nicht mehr verfügbar. 
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;KMKI Germany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;KMKI Germany&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;HTML, DHTML, Javascript, CSS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Macromedia Dreamweaver, Fireworks, Photoshop, Paint Shop Pro&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-4416759135648791329?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/n7q5yS0Q-hA" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/n7q5yS0Q-hA/kmkinet-20.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2b0nb-BNOI/AAAAAAAAARo/RPakVy43gz4/s72-c/kmkiv2.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/kmkinet-20.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-2519030690022918425</guid><pubDate>Mon, 17 Dec 2007 19:23:00 +0000</pubDate><atom:updated>2008-12-09T05:04:03.844+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Internetauftritt Firma Hoelz Software</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2bMyb-BNNI/AAAAAAAAARg/Jv4fpoIKOco/s1600-h/hoelz.png"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2bMyb-BNNI/AAAAAAAAARg/Jv4fpoIKOco/s320/hoelz.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5145024791190779090" /&gt;&lt;/a&gt;Einen Präsentation Website für die Firma Hoelz Software. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Die website ist leider unter &lt;a href="http://www.hoelzsoftware.de" target="_blank"&gt;http://www.hoelzsoftware.de&lt;/a&gt; nicht mehr verfügbar. 
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;Hoelz Software&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;Hoelz Software&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;HTML, DHTML, Javascript, CSS&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Macromedia Dreamweaver, Fireworks, Photoshop, Paint Shop Pro&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-2519030690022918425?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/JUh-VzbGb6w" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/JUh-VzbGb6w/internetauftritt-firma-hoelz-software.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_lP1lCI-HIqo/R2bMyb-BNNI/AAAAAAAAARg/Jv4fpoIKOco/s72-c/hoelz.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/internetauftritt-firma-hoelz-software.html</feedburner:origLink></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-6231031171309673290.post-557572922746392018</guid><pubDate>Mon, 17 Dec 2007 13:17:00 +0000</pubDate><atom:updated>2008-12-09T05:04:03.991+01:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Portfolio</category><title>Programmierung eines Bild Konverter</title><description>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_lP1lCI-HIqo/R2Z3wL-BNMI/AAAAAAAAARY/MZLQlNPd2aM/s1600-h/softech.png"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer;" src="http://2.bp.blogspot.com/_lP1lCI-HIqo/R2Z3wL-BNMI/AAAAAAAAARY/MZLQlNPd2aM/s320/softech.png" alt="" id="BLOGGER_PHOTO_ID_5144931294047712450" border="0" /&gt;&lt;/a&gt;Im Rahmen meines Vorpraktikums, habe ich die Möglichkeit eine Applikation mit Programmierersprache C durchzuführen. Meine Aufgabe ist: Entwicklung eines Bild Konverters für eine CAAD Apllikation Spirit 10. &lt;span class="fullpost"&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;table style="width: 100%;" cellpadding="0"  &gt;&lt;tr&gt;&lt;td style="width: 110px;"&gt;Entwickelt für :&lt;/td&gt;&lt;td &gt;SoftTech GmbH, Neustadt,a.d.W&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Kunde :&lt;/td&gt;&lt;td &gt;SoftTech GmbH&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Technik :&lt;/td&gt;&lt;td &gt;C++&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td &gt;Tools :&lt;/td&gt;&lt;td &gt;Visual Studio C++&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6231031171309673290-557572922746392018?l=arthur.purnama.de' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/digitalxperience/~4/seMcGI2Y4yg" height="1" width="1"/&gt;</description><link>http://feedproxy.google.com/~r/digitalxperience/~3/seMcGI2Y4yg/programmierung-eines-bild-konverter.html</link><author>noreply@blogger.com (Arthur Purnama)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_lP1lCI-HIqo/R2Z3wL-BNMI/AAAAAAAAARY/MZLQlNPd2aM/s72-c/softech.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://arthur.purnama.de/2007/12/programmierung-eines-bild-konverter.html</feedburner:origLink></item></channel></rss>
