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

<channel>
	<title>Muhammad Alvin</title>
	<atom:link href="http://www.muhammadalvin.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.muhammadalvin.net</link>
	<description></description>
	<lastBuildDate>Thu, 19 Jan 2012 10:36:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>Pengurutan (Sorting) Multi Kolom dengan Java</title>
		<link>http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/</link>
		<comments>http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 17:19:20 +0000</pubDate>
		<dc:creator>Muhammad Alvin</dc:creator>
				<category><![CDATA[Algoritma dan Pemrograman]]></category>
		<category><![CDATA[Software Development]]></category>
		<category><![CDATA[multi-columns-sorting]]></category>
		<category><![CDATA[pengurutan]]></category>
		<category><![CDATA[pengurutan-multi-kolom]]></category>
		<category><![CDATA[sorting]]></category>

		<guid isPermaLink="false">http://www.muhammadalvin.net/?p=727</guid>
		<description><![CDATA[Pengurutan merupakan sesuatu yang umum dan sering diperlukan. Saat belajar algoritma dan pemrograman, topik pengurutan biasanya selalu ada. Masalah pengurutan ini juga sering muncul dalam programming, baik itu dalam programming ilmu komputer (seperti soal-soal ICPC, TopCoder, dll) maupun dalam programming dunia industri. Andaikan kita seorang software developer yang sedang mengerjakan proyek web sepak bola. Dalam &#8230; </p><p><a class="more-link block-button" href="http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/">Continue reading &#187;</a>
<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;t=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D727%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;title=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java&amp;notes=Pengurutan+merupakan+sesuatu+yang+umum+dan+sering+diperlukan.+Saat+belajar+algoritma+dan+pemrograman%2C+topik+pengurutan+biasanya+selalu+ada.+Masalah+pengurutan+ini+juga+sering+muncul+dalam+programming%2C+baik+itu+dalam+programming+ilmu+komputer+%28seperti" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;title=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java&amp;bodytext=Pengurutan+merupakan+sesuatu+yang+umum+dan+sering+diperlukan.+Saat+belajar+algoritma+dan+pemrograman%2C+topik+pengurutan+biasanya+selalu+ada.+Masalah+pengurutan+ini+juga+sering+muncul+dalam+programming%2C+baik+itu+dalam+programming+ilmu+komputer+%28seperti" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;title=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/" onclick="addBookmark(event);" title="Pengurutan (Sorting) Multi Kolom dengan Java" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Pengurutan (Sorting) Multi Kolom dengan Java&amp;body=Pengurutan merupakan sesuatu yang umum dan sering diperlukan. Saat belajar algoritma dan pemrograman, topik pengurutan biasanya selalu ada. Masalah pengurutan ini juga sering muncul dalam programming, baik itu dalam programming ilmu komputer (seperti - http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></description>
			<content:encoded><![CDATA[<p>Pengurutan merupakan sesuatu yang umum dan sering diperlukan. Saat belajar algoritma dan pemrograman, topik pengurutan biasanya selalu ada. Masalah pengurutan ini juga sering muncul dalam programming, baik itu dalam programming ilmu komputer (seperti soal-soal ICPC, TopCoder, dll) maupun dalam programming dunia industri.</p>
<p>Andaikan kita seorang software developer yang sedang mengerjakan proyek web sepak bola. Dalam web tersebut, kita akan menampilkan klasmen suatu liga. Nah, buat yang belum mengerti apa itu klasmen, begini penjelasannya.</p>
<p>Klasmen merupakan tabel berisi data hasil pertandingan. Hasil pertandingan yang dimaksud adalah:</p>
<ul>
<li>jumlah pertandingan yang sudah dijalani (Wins + Draws + Loses [lihat 3 item selanjutnya!])</li>
<li>jumlah pertandingan yang berakhir dengan dimenangkan (<strong>Wins</strong>, disingkat menjadi <strong>W</strong>)</li>
<li>jumlah pertandingan yang berakhir seri (<strong>Draws</strong>, disingkat menjadi <strong>D</strong>)</li>
<li>jumlah pertandingan yang berakhir dengan kekalahan (<strong>Loses</strong>, disingkat menjadi <strong>L</strong>)</li>
<li>jumlah gol ke gawang lawan (<strong>Goals For</strong>, disingkat menjadi <strong>GF</strong>)</li>
<li>jumlah gol ke gawang sendiri (<strong>Goals Against</strong>, disingkat menjadi <strong>GA</strong>)</li>
<li>selisih gol (<strong>Goals Difference</strong>, disingkat menjadi <strong>GD</strong>, yaitu GF &#8211; GA)</li>
<li>poin (<strong>Points</strong>, disingkat menjadi <strong>Pts</strong>, yaitu 3 * W + D)</li>
</ul>
<p>Klasmen disusun berdasarkan poin. Tim yang memiliki poin lebih besar akan berada di atas, demikian sebaliknya. Jika poin kedua sama, diurutkan berdasarkan selisih gol. Tim yang memiliki selisih gol lebih besar akan berada di atas, demikian sebaliknya.</p>
<p>Perhatikan data hasil pertandingan (pertengahan Januari 2012) dari enam klub <a title="Official Site of the Premier League" href="http://www.premierleague.com/" target="_blank">English Premier League</a> berikut:</p>
<pre class="brush: text; gutter: true">Klub/Tim             Wins  Draws  Loses  Goals-For  Goals-Against
-----------------------------------------------------------------
Arsenal              11    3      6      36         28
Chelsea              12    4      5      40         25
Liverpool            9     8      4      24         18
Manchester City      15    3      2      56         16
Manchester United    15    3      3      52         20
Tottenham Hotspur    14    4      3      39         21</pre>
<p>Tabel di atas masih berisi data mentah dan belum diurutkan (urutan sementara berdasarkan nama klub). Untuk mengurutkannya, kita harus menghitung poin dan selisih goal, sebagai berikut:</p>
<pre class="brush: text; gutter: true">Klub                 W   D  L  GF  GA  Pts(1)  GD(2)
----------------------------------------------------
Arsenal              11  3  6  36  28  36      8
Chelsea              12  4  5  40  25  40      15
Liverpool            9   8  4  24  18  35      6
Manchester City      15  3  2  56  16  48      40
Manchester United    15  3  3  52  20  48      32
Tottenham Hotspur    14  4  3  39  21  46      18

Keterangan
(1) Pts = points = poin
(2) GD = goals difference = selisih gol</pre>
<p>Maka klasmen akan diperoleh sebagai berikut:</p>
<pre class="brush: text; gutter: true">Klub                 W   D  L  GF  GA  Pts  GD
----------------------------------------------
Manchester City      15  3  2  56  16  48   40
Manchester United    15  3  3  52  20  48   32
Tottenham Hotspur    14  4  3  39  21  46   18
Chelsea              12  4  5  40  25  40   15
Arsenal              11  3  6  36  28  36   8
Liverpool            9   8  4  24  18  35   6</pre>
<p>Perhatikan bahwa data sekarang telah diurut berdasarkan poin (Pts) dan selisih gol (GD). Ada dua klub yang memiliki poin sama, yaitu <strong>Manchester City</strong> dan <strong>Manchester United</strong>. Tetapi, karena selisih gol <strong>Manchester City</strong> lebih besar, klub tersebut berada di atas.</p>
<p>Sekarang, anggap data hasil pertandingan tersebut disimpan di tabel <strong>tbl_klasmen</strong> dalam database. Tabel tersebut memiliki struktur seperti ini:</p>
<pre class="brush: text; gutter: true">Field            Type
------------------------
team_name        VARCHAR
wins             INTEGER
draws            INTEGER
loses            INTEGER
goals_for        INTEGER
goals_against    INTEGER</pre>
<p>Dan berisi enam data seperti yang diperlihatkan pada tabel pertama di atas.</p>
<p>Jika menggunakan query SQL, maka untuk mendapatkan klasmen akan semudah ini:</p>
<pre class="brush: sql; gutter: true">SELECT *, (3 * wins + draws) AS points, (goals_for - goals_against) AS goals_difference
  FROM `tbl_klasmen`
  ORDER BY points DESC, goals_difference DESC;</pre>
<p>Masalah selesai.</p>
<p>Bagaimana kalau datanya tidak berasal dari tabel database?</p>
<p><span id="more-727"></span>Jika Anda punya akses ke database, lalu juga punya akses untuk membuat tabel sementara (temporary table), maka Anda bisa membuat tabel sementara, kemudian memasukkan (insert) data ke tabel tersebut, lalu menjalankan query SQL di atas. Terakhir, hapus (drop) tabel sementara yang Anda buat tersebut.</p>
<p>Nah, bagaimana jika tidak memiliki akses ke database sama sekali?</p>
<p>Tentu saja kita harus mengurutkannya dari kode yang kita buat.</p>
<p>Di sini, saya tidak akan menjelaskan algoritma sorting secara detail, melainkan hanya menggunakan sesuatu yang sudah disediakan oleh bahasa pemrograman. Adapun bahasa pemrograman yang akan digunakan adalah Java. Berdasarkan kode Java ini, diharapkan Anda bisa mengimplementasikannya ke dalam bahasa pemrograman berorientasi objek lain, seperti C++, C#.</p>
<p>Sebagai pengganti tabel, tentu saja kita buatkan sebuah class. Pertama, kita akan membuat class berikut:</p>
<pre class="brush: java; gutter: true">public class Klasmen
{
    public String teamName;
    public int wins, draws, loses, goalsFor, goalsAgainst;
}</pre>
<p>Class <strong>Klasmen</strong> di atas memiliki variabel (member) yang sama seperti yang ada di tabel database, bedanya menggunakan bentuk penulisan camelCase. Selain itu, variabel tersebut dibuat public untuk menyingkat kode di pembahasan ini. Karena dengan public, kita nggak perlu setter ataupun getter.</p>
<p>Selanjutnya, kita buat constructor yang akan mengisi keenam variabel tersebut:</p>
<pre class="brush: java; gutter: true">public class Klasmen
{
    public String teamName;
    public int wins, draws, loses, goalsFor, goalsAgainst;

    public Klasmen(String teamName, int wins, int draws, int loses, int goalsFor, int goalsAgainst)
    {
        this.teamName = teamName;
        this.wins = wins;
        this.draws = draws;
        this.loses = loses;
        this.goalsFor = goalsFor;
        this.goalsAgainst = goalsAgainst;
    }
}</pre>
<p>Maka dengan hasil di atas, nantinya kita bisa menggunakan class Klasmen sebagai berikut:</p>
<pre class="brush: java; gutter: true">Klasmen manc = new Klasmen(&quot;Manchester City&quot;, 15, 3, 2, 56, 16);
Klasmen mu = new Klasmen(&quot;Manchester United&quot;, 15, 3, 3, 52, 20);</pre>
<p>Lebih tepatnya, nantinya kita akan menggunakannya seperti ini (sebagai array):</p>
<pre class="brush: java; gutter: true">Klasmen[] premierLeague = new Klasmen[] {
    new Klasmen(&quot;Manchester City&quot;, 15, 3, 2, 56, 16),
    new Klasmen(&quot;Manchester United&quot;, 15, 3, 3, 52, 20)
};</pre>
<p>Sebelum kita bisa mengurutkannya, kita harus menghitung poin dan selisih gol terlebih dulu. Banyak cara yang bisa digunakan, misalnya dengan membuat method untuk menghitung poin dan selisih gol. Di sini, kita akan melakukan perhitungan di dalam constructor. Ini untuk menghemat kode yang dibuat:</p>
<pre class="brush: java; gutter: true">public class Klasmen
{
    public String teamName;
    public int wins, draws, loses, goalsFor, goalsAgainst;

    // variabel utk menampung poin dan selisih gol
    public int points, goalsDifference;

    public Klasmen(String teamName, int wins, int draws, int loses, int goalsFor, int goalsAgainst)
    {
        this.teamName = teamName;
        this.wins = wins;
        this.draws = draws;
        this.loses = loses;
        this.goalsFor = goalsFor;
        this.goalsAgainst = goalsAgainst;

        // hitung poin dan selisih gol
        this.points = 3 * wins + draws;
        this.goalsDifference = goalsFor - goalsAgainst;
    }
}</pre>
<p>Dengan tambahan kode seperti di atas, poin dan selisih gol akan langsung dihitung saat membuat object.</p>
<p>Sekarang masuk ke bagian utama, pengurutan.</p>
<p>Di Java, kita dapat mengurutkan array dengan cara ini:</p>
<pre class="brush: java; gutter: true">Arrays.sort(variabel);</pre>
<p>Sebagai contoh kita memiliki variabel ini:</p>
<pre class="brush: java; gutter: true">int[] nilai = new int[] { 2, 0, 0, 6, 1, 4, 0, 1, 0, 8, 8 };</pre>
<p>Maka kita bisa mengurutkannya seperti ini:</p>
<pre class="brush: java; gutter: true">Arrays.sort(nilai);</pre>
<p>Jika kita tampilkan hasilnya:</p>
<pre class="brush: java; gutter: true">System.out.println(Arrays.toString(nilai));</pre>
<p>akan diperoleh:</p>
<pre class="brush: text; gutter: true">{0, 0, 0, 0, 1, 1, 2, 4, 6, 8, 8}</pre>
<p>Nah, itu untuk array sederhana (array dari tipe data primitif). Bagaimana jika array dari class tertentu (seperti Klasmen[] tadi?).</p>
<p>Di Java, ada <strong>interface Comparable</strong>. Dengan membuat suatu class yang meng-implement <strong>Comparable</strong>, lalu melakukan implementasi method <strong>compareTo()</strong>, maka kita bisa memanggil Arrays.sort() pada array dari class tersebut. Dengan kata lain, jika kita memiliki:</p>
<pre class="brush: java; gutter: true">class T implements Comparable&lt;T&gt;
{
    T(int nilai)
    {
        // kode
    }

    public int compareTo(T x)
    {
        // logika pengurutan
    }
}</pre>
<p>dan kita membuat array ini:</p>
<pre class="brush: java; gutter: true">T[] data = new T[] {
    new T(2), // data ke-1
    new T(0), // data ke-2
    new T(0), // data ke-3
    ...
    new T(8) // data ke-N
};</pre>
<p>Kita bisa mengurutkannya dengan cara:</p>
<pre class="brush: java; gutter: true">Arrays.sort(data);</pre>
<p>Bagaimana item-item dalam variabel data tersebut diurutkan, bergantung pada hasil implementasi method <strong>compareTo()</strong>.</p>
<p>Kode apa yang perlu ditulis di dalam method tersebut?</p>
<p>Method <strong>compareTo()</strong> menerima sebuah parameter, yaitu <strong>T x</strong> (object x dari class T). Class T ini adalah class yang didefinisikan saat melakukan <strong>implements Comparable&lt;T&gt;</strong>. Kembalian (return value) dari method ini adalah <strong>integer</strong> dengan ketentuan sebagai berikut:</p>
<ul>
<li>Apabila item ini lebih kecil daripada item x (lebih tepatnya berada sebelum item x di hasil pengurutan), kembalikan nilai negatif (&lt; 0).</li>
<li>Apabila item ini sama dengan item x, kembalikan nilai 0.</li>
<li>Apabila item ini lebih besar daripada item x (lebih tepatnya berada setelah item x di hasil pengurutan), kembalikan nilai positif (&gt; 0).</li>
</ul>
<p>Kembangkan class <strong>Klasmen</strong> di atas menjadi seperti ini:</p>
<pre class="brush: java; gutter: true">// implement Comparable&lt;T&gt;
public class Klasmen implements Comparable&lt;Klasmen&gt;
{
    public String teamName;
    public int wins, draws, loses, goalsFor, goalsAgainst;

    public int points, goalsDifference;

    public Klasmen(String teamName, int wins, int draws, int loses, int goalsFor, int goalsAgainst)
    {
        this.teamName = teamName;
        this.wins = wins;
        this.draws = draws;
        this.loses = loses;
        this.goalsFor = goalsFor;
        this.goalsAgainst = goalsAgainst;

        this.points = 3 * wins + draws;
        this.goalsDifference = goalsFor - goalsAgainst;
    }

    // dan kita harus mengisi implementasi dari method ini.
    public int compareTo(Klasmen o)
    {
        // logika pengurutan
    }
}</pre>
<p>Ada dua hal yang mau dibandingkan, yaitu <strong>poin</strong> dan <strong>selisih gol</strong>.</p>
<p>Jika poin tim A &gt; poin tim B, maka tim A berada di atas tim B. Jika kita melihat dari atas, maka kita akan menjumpai tim A lalu tim B. Dengan kata lain, tim A berada sebelum tim B di hasil pengurutan, sehingga kembalikan nilai negatif (misalnya -1). Jika sebaliknya (poin tim A &lt; poin tim B), berlaku juga sebaliknya, sehingga kembalikan nilai positif (misalnya 1). Jika sama (poin tim A = poin tim B), lakukan pengurutan berdasarkan kriteria kedua, yaitu selisih gol.</p>
<p>Jika selisih gol tim A &gt; selisih gol tim B, maka tim A berada sebelum tim B di hasil pengurutan, sehingga kembalikan nilai negatif. Jika sebaliknya (selisih gol tim A &lt; selisih gol tim B), berlaku juga sebaliknya, sehingga kembalikan nilai positif. Jika sama (selisih gol tim A = selisih gol tim B), kita anggap sama (kembalikan nilai 0). Di sini kita membatasi masalah pada pengurutan dengan dua kriteria, sehingga kita tidak membahas apabila selisih gol tim A = selisih gol tim B. Anda boleh saja menambahkan kriteria lainnya.</p>
<p>Kasus uji yang kita gunakan juga dibatasi pada dua kriteria ini. Artinya tidak ada kasus uji di mana poin tim A = poin tim B dan selisih gol tim A = selisih gol tim B.</p>
<p>Berdasarkan penjelasan di atas, bisa kita tuliskan sebagai berikut sebagai implementasi method <strong>int compareTo(Klasmen o)</strong>:</p>
<pre class="brush: java; gutter: true">public int compareTo(Klasmen o)
{
    // -- kriteria pertama --
    if (this.points != o.points)
    {
        if (this.points &gt; o.points) {
            return -1;
        } else {
            return 1;
        }

        // kalau mau singkat, 5 baris di atas bisa diganti jadi:
        //   return (this.points &gt; o.points ? -1 : 1);

        // karena this.points &gt; o.points, maka berlaku sebaliknya yaitu o.points &lt; this.points.
        // karena o.points &lt; this.points, maka o.points - this.points pasti &lt; 0.
        // sehingga 5 baris di atas bisa juga diganti dengan:
        //   return (o.points - this.points);
    }
    else
    {
        // -- kriteria kedua --
        if (this.goalsDifference != o.goalsDifference)
        {
            return (o.goalsDifference - this.goalsDifference);
        }
        else
        {
            return 0; // batasan masalah, tidak ada kriteria ketiga.
        }
    }
}</pre>
<p>Sehingga jika digabungkan, hasil akhir class <strong>Klasmen</strong> adalah sebagai berikut:</p>
<pre class="brush: java; gutter: true">public class Klasmen implements Comparable&lt;Klasmen&gt;
{
    public String teamName;
    public int wins, draws, loses, goalsFor, goalsAgainst;

    public int points, goalsDifference;

    public Klasmen(String teamName, int wins, int draws, int loses, int goalsFor, int goalsAgainst)
    {
        this.teamName = teamName;
        this.wins = wins;
        this.draws = draws;
        this.loses = loses;
        this.goalsFor = goalsFor;
        this.goalsAgainst = goalsAgainst;

        this.points = 3 * wins + draws;
        this.goalsDifference = goalsFor - goalsAgainst;
    }

    public int compareTo(Klasmen o)
    {
        if (this.points != o.points)
        {
            return (o.points - this.points);
        }
        else
        {
            if (this.goalsDifference !=o.goalsDifference)
            {
                return (o.goalsDifference - this.goalsDifference);
            }
            else
            {
                return 0;
            }
        }
    }
}</pre>
<p>Selesai. sekarang saatnya melakukan pengujian. Tuliskan kasus uji berikut:</p>
<pre class="brush: java; gutter: true">Klasmen[] premierLeague = new Klasmen[] {
    new Klasmen(&quot;Arsenal&quot;, 11, 3, 6, 36, 28),
    new Klasmen(&quot;Chelsea&quot;, 12, 4, 5, 40, 25),
    new Klasmen(&quot;Liverpool&quot;, 9, 8, 4, 24, 18),
    new Klasmen(&quot;Manchester City&quot;, 15, 3, 2, 56, 16),
    new Klasmen(&quot;Manchester United&quot;, 15, 3, 3, 52, 20),
    new Klasmen(&quot;Tottenham Hotspur&quot;, 14, 4, 3, 39, 21)
};</pre>
<p>Tampilkan isi array <strong>premierLeague</strong> sebelum diurutkan:</p>
<pre class="brush: java; gutter: true">for (Klasmen klub : premierLeague) {
    System.out.format(&quot;- %s [poin = %d, selisih gol = %d]\n&quot;, klub.teamName, klub.points, klub.goalsDifference);
}</pre>
<p>Maka hasilnya seperti ini:</p>
<pre class="brush: text; gutter: true">- Arsenal [poin = 36, selisih gol = 8]
- Chelsea [poin = 40, selisih gol = 15]
- Liverpool [poin = 35, selisih gol = 6]
- Manchester City [poin = 48, selisih gol = 40]
- Manchester United [poin = 48, selisih gol = 32]
- Tottenham Hotspur [poin = 46, selisih gol = 18]</pre>
<p>Lakukan pengurutan:</p>
<pre class="brush: java; gutter: true">Arrays.sort(premierLeague);</pre>
<p>Tampilkan isi array <strong>premierLeague</strong> setelah diurutkan:</p>
<pre class="brush: java; gutter: true">for (Klasmen klub : premierLeague) {
    System.out.format(&quot;- %s [poin = %d, selisih gol = %d]\n&quot;, klub.teamName, klub.points, klub.goalsDifference);
}</pre>
<p>Maka hasilnya seperti ini:</p>
<pre class="brush: java; gutter: true">- Manchester City [poin = 48, selisih gol = 40]
- Manchester United [poin = 48, selisih gol = 32]
- Tottenham Hotspur [poin = 46, selisih gol = 18]
- Chelsea [poin = 40, selisih gol = 15]
- Arsenal [poin = 36, selisih gol = 8]
- Liverpool [poin = 35, selisih gol = 6]</pre>
<p>Terlihat bahwa data sudah diurut berdasarkan poin terbesar ke poin terkecil. Jika poin sama, data diurut berdasarkan selisih gol terbesar ke selisih gol terkecil.</p>

<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;t=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D727%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;title=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java&amp;notes=Pengurutan+merupakan+sesuatu+yang+umum+dan+sering+diperlukan.+Saat+belajar+algoritma+dan+pemrograman%2C+topik+pengurutan+biasanya+selalu+ada.+Masalah+pengurutan+ini+juga+sering+muncul+dalam+programming%2C+baik+itu+dalam+programming+ilmu+komputer+%28seperti" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;title=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java&amp;bodytext=Pengurutan+merupakan+sesuatu+yang+umum+dan+sering+diperlukan.+Saat+belajar+algoritma+dan+pemrograman%2C+topik+pengurutan+biasanya+selalu+ada.+Masalah+pengurutan+ini+juga+sering+muncul+dalam+programming%2C+baik+itu+dalam+programming+ilmu+komputer+%28seperti" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fpengurutan-multi-kolom-dengan-java%2F&amp;title=Pengurutan+%28Sorting%29+Multi+Kolom+dengan+Java" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/" onclick="addBookmark(event);" title="Pengurutan (Sorting) Multi Kolom dengan Java" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Pengurutan (Sorting) Multi Kolom dengan Java&amp;body=Pengurutan merupakan sesuatu yang umum dan sering diperlukan. Saat belajar algoritma dan pemrograman, topik pengurutan biasanya selalu ada. Masalah pengurutan ini juga sering muncul dalam programming, baik itu dalam programming ilmu komputer (seperti - http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></content:encoded>
			<wfw:commentRss>http://www.muhammadalvin.net/2012/01/pengurutan-multi-kolom-dengan-java/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Mengenal Cross-Site Scripting (XSS)</title>
		<link>http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/</link>
		<comments>http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/#comments</comments>
		<pubDate>Mon, 16 Jan 2012 11:56:51 +0000</pubDate>
		<dc:creator>Muhammad Alvin</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[cross-site-scripting]]></category>
		<category><![CDATA[xss]]></category>

		<guid isPermaLink="false">http://www.muhammadalvin.net/?p=710</guid>
		<description><![CDATA[Cross-site scripting (untuk selanjutnya akan disebut sebagai XSS) merupakan celah keamanan (security vulnerability)  yang biasa ditemukan di aplikasi berbasis web. Celah keamanan ini memungkinkan penyerang memasukkan (inject) kode tertentu yang bersifat client-side (misalnya JavaScript, CSS). Kode yang di-inject oleh penyerang tersebut akan dilihat dan dijalankan juga oleh pengguna lain. Akibat dari celah keamanan ini cukup &#8230; </p><p><a class="more-link block-button" href="http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/">Continue reading &#187;</a>
<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;t=Mengenal+Cross-Site+Scripting+%28XSS%29" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Mengenal+Cross-Site+Scripting+%28XSS%29%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D710%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;title=Mengenal+Cross-Site+Scripting+%28XSS%29&amp;notes=Cross-site+scripting+%28untuk+selanjutnya+akan+disebut+sebagai+XSS%29+merupakan+celah+keamanan+%28security+vulnerability%29%C2%A0+yang+biasa+ditemukan+di+aplikasi+berbasis+web.+Celah+keamanan+ini+memungkinkan+penyerang+memasukkan+%28inject%29+kode+tertentu+yang+bers" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;title=Mengenal+Cross-Site+Scripting+%28XSS%29&amp;bodytext=Cross-site+scripting+%28untuk+selanjutnya+akan+disebut+sebagai+XSS%29+merupakan+celah+keamanan+%28security+vulnerability%29%C2%A0+yang+biasa+ditemukan+di+aplikasi+berbasis+web.+Celah+keamanan+ini+memungkinkan+penyerang+memasukkan+%28inject%29+kode+tertentu+yang+bers" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;title=Mengenal+Cross-Site+Scripting+%28XSS%29" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/" onclick="addBookmark(event);" title="Mengenal Cross-Site Scripting (XSS)" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Mengenal Cross-Site Scripting (XSS)&amp;body=Cross-site scripting (untuk selanjutnya akan disebut sebagai XSS) merupakan celah keamanan (security vulnerability)  yang biasa ditemukan di aplikasi berbasis web. Celah keamanan ini memungkinkan penyerang memasukkan (inject) kode tertentu yang bers - http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></description>
			<content:encoded><![CDATA[<p>Cross-site scripting (untuk selanjutnya akan disebut sebagai XSS) merupakan celah keamanan (security vulnerability)  yang biasa ditemukan di aplikasi berbasis web. Celah keamanan ini memungkinkan penyerang memasukkan (inject) kode tertentu yang bersifat client-side (misalnya JavaScript, CSS). Kode yang di-inject oleh penyerang tersebut akan dilihat dan dijalankan juga oleh pengguna lain. Akibat dari celah keamanan ini cukup bervariasi, mulai dari sekedar mengganggu, merusak tampilan web, hingga pencurian data seperti cookie.</p>
<p>Contoh halaman web yang memiliki celah keamanan ini bisa dilihat <a title="Demo Cross-Site Scripting" href="http://files.muhammadalvin.net/demo-xss/" target="_blank">di sini</a>.</p>
<p>Pertama, coba isikan sesuatu secara normal (misalnya nama = alvin, komentar = hello world). Apa yang terjadi? Tentu saja tidak ada masalah. Nama dan komentar akan  muncul sesuai dengan apa yang diinputkan.</p>
<p>Sekarang, coba isikan komentar yang &#8216;sedikit aneh&#8217;. Masukkan komentar yang berisi tag HTML, misalnya sebagai berikut:</p>
<pre class="brush: text; gutter: true">Halo... ini contoh teks &lt;b&gt;bold&lt;/b&gt; dan &lt;u&gt;underline&lt;/b&gt;...</pre>
<p>Apa yang terjadi? Komentar Anda muncul seperti ini:</p>
<blockquote><p>Halo&#8230; ini contoh teks <strong>bold</strong> dan <span style="text-decoration: underline;">underline</span>.</p></blockquote>
<p>Nah, kode HTML yang kita sisipkan diproses oleh browser. Cobalah minta teman Anda untuk membuka halaman tersebut (dari komputer lain). Maka ia akan memperoleh hasil yang sama. Ini berarti si penyerang (dalam contoh ini adalah kita) berhasil meng-inject-kan kode buatannya. Hal seperti ini yang disebut celah keamanan <strong>Cross-Site Scripting</strong>. Ini harusnya tidak boleh terjadi. Bayangkan jika si penyerang menyisipkan kode berikut:</p>
<pre class="brush: text; gutter: true">Halo...
&lt;script type=&quot;text/javascript&quot;&gt;
window.onload = function() {
    document.getElementsByTagName(&quot;body&quot;)[0].innerHTML = &#039;&lt;h1&gt;This web is hacked!&lt;/h1&gt;&#039;;
}
&lt;/script&gt;</pre>
<p>Atau komentar berikut yang sangat mengganggu pengguna lain (pengguna lain akan mendapatkan alert/popup yang tidak pernah berakhir):</p>
<pre class="brush: text; gutter: true">&lt;script type=&quot;text/javascript&quot;&gt;
while (true) {
    alert(&#039;Sekarang jam &#039; + (new Date()).toUTCString());
}
&lt;/script&gt;</pre>
<p>Atau mungkin seperti ini:</p>
<pre class="brush: text; gutter: true">Web ini bagus.
&lt;script type=&quot;text/javascript&quot;&gt;
if (confirm(&#039;Tapi sayang ada celah keamanannya! Klik OK untuk mempelajari celah keamanan tsb!&#039;)) {
  document.location.href = &#039;http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/&#039;;
}
&lt;/script&gt;</pre>
<p>Yang mengarahkan pengguna ke halaman lain.</p>
<p>Cara mengatasinya cukup sederhana. Jika menggunakan PHP, tambahkan <strong>htmlentities()</strong> sebelum menampilkan hasil inputan dari pengguna. Misalnya kode berikut:</p>
<pre class="brush: php; gutter: true">echo &#039;Nama : &#039; . $nama;</pre>
<p>Diubah menjadi:</p>
<pre class="brush: php; gutter: true">echo &#039;Nama : &#039; . htmlentities($nama);</pre>
<p>Pastikan Anda menggunakan fungsi tersebut di setiap bagian yang bertugas menampilkan hasil inputan dari pengguna.</p>
<p>Buat yang ingin tahu secara detail tentang XSS, simak pembahasan berikut.</p>
<p>Andaikan Anda membuat halaman HTML (index.html) berikut:</p>
<pre class="brush: html; gutter: true">&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Demo Cross-Site Scripting&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;form action=&quot;hasil.php&quot; method=&quot;post&quot;&gt;
            &lt;p&gt;&lt;label for=&quot;nama&quot;&gt;Nama:&lt;/label&gt;&lt;br /&gt;
            &lt;input type=&quot;text&quot; name=&quot;nama&quot; id=&quot;nama&quot; /&gt;&lt;/p&gt;
            &lt;p&gt;&lt;label for=&quot;komentar&quot;&gt;Komentar:&lt;/label&gt;&lt;br /&gt;
            &lt;textarea name=&quot;komentar&quot; id=&quot;komentar&quot; cols=&quot;40&quot; rows=&quot;5&quot;&gt;&lt;/textarea&gt;&lt;/p&gt;
            &lt;p&gt;&lt;input type=&quot;submit&quot; value=&quot;Kirim&quot; /&gt;&lt;/p&gt;
        &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Kemudian halaman PHP berikut (hasil.php) yang bertugas memproses hasil input dari halaman index.html:</p>
<pre class="brush: php; gutter: true">&lt;?php
$nama = (isset($_POST[&#039;nama&#039;]) ? $_POST[&#039;nama&#039;] : &#039;&#039;);
$komentar = (isset($_POST[&#039;komentar&#039;]) ? $_POST[&#039;komentar&#039;] : &#039;&#039;);

echo &#039;&lt;p&gt;Nama:&lt;br /&gt;&#039; . $nama . &#039;&lt;/p&gt;&#039;;
echo &#039;&lt;p&gt;Komentar:&lt;br /&gt;&#039; . $komentar . &#039;&lt;/p&gt;&#039;;</pre>
<p>Saat Anda menjalankan index.html, akan muncul sebuah form dengan dua field. Jika Anda mengisi <strong>nama</strong> dengan <strong>test</strong> dan <strong>komentar</strong> dengan <strong>hello world</strong>, maka ketika di-submit (dengan menekan tombol <strong>Kirim</strong>), hasil.php akan memprosesnya sebagai berikut:</p>
<pre class="brush: php; gutter: true">$nama = (isset($_POST[&#039;nama&#039;]) ? $_POST[&#039;nama&#039;] : &#039;&#039;);
// maka $nama berisi: test

$komentar = (isset($_POST[&#039;komentar&#039;]) ? $_POST[&#039;komentar&#039;] : &#039;&#039;);
// dan $komentar berisi: hello world

echo &#039;&lt;p&gt;Nama:&lt;br /&gt;&#039; . $nama . &#039;&lt;/p&gt;&#039;;
// sesuai dengan nilai di variabel $nama di atas,
// maka akan di-echo: &lt;p&gt;Nama:&lt;br /&gt;test&lt;/p&gt;

echo &#039;&lt;p&gt;Komentar:&lt;br /&gt;&#039; . $komentar . &#039;&lt;/p&gt;&#039;;
// sesuai dengan nilai di variabel $komentar di atas,
// maka akan di-echo: &lt;p&gt;Komentar:&lt;br /&gt;hello world&lt;/p&gt;</pre>
<p>Di sini tidak ada masalah. Jika Anda coba jalankan, maka hasil sesuai dengan yang diharapkan.</p>
<p>Masalah muncul ketika misalnya <strong>komentar</strong> yang dimasukkan adalah <strong>ini adalah contoh teks &lt;b&gt;bold&lt;/b&gt;</strong>. Halaman hasil.php akan memprosesnya sebagai berikut:</p>
<pre class="brush: php; gutter: true">$komentar = (isset($_POST[&#039;komentar&#039;]) ? $_POST[&#039;komentar&#039;] : &#039;&#039;);
// $komentar berisi: ini adalah contoh teks &lt;b&gt;bold&lt;/b&gt;

echo &#039;&lt;p&gt;Komentar:&lt;br /&gt;&#039; . $komentar . &#039;&lt;/p&gt;&#039;;
// sesuai dengan nilai di variabel $komentar di atas,
// maka akan di-echo: &lt;p&gt;Komentar:&lt;br /&gt;ini adalah contoh teks &lt;b&gt;bold&lt;/b&gt;&lt;/p&gt;</pre>
<p>Browser tidak pernah tau bahwa <strong>ini adalah contoh teks &lt;b&gt;bold&lt;/b&gt;</strong> datangnya dari web developer yang membuat halaman atau dari isian pengguna yang iseng. Hasilnya, browser akan memproses kode HTML yang ada di dalamnya, sehingga akan menampilkan tulisan &#8220;bold&#8221; dalam keadaan bercetak tebal, hasil dari tag HTML &lt;b&gt; dan &lt;/b&gt; tersebut.</p>
<p>Hal yang sama terjadi untuk JavaScript. Pengguna yang iseng bisa menyisipkan kode JavaScript yang diapit oleh tag HTML <strong>&lt;script type=&#8221;text/javascript&#8221;&gt;</strong> dan <strong>&lt;/script&gt;</strong>. Hasilnya tentu saja kode JavaScript tersebut akan dijalankan oleh browser.</p>
<p>Cara mengatasinya adalah dengan meng-escape karakter-karakter spesial HTML, seperti:</p>
<ul>
<li>&amp; menjadi &amp;amp;</li>
<li>&lt; menjadi &amp;lt;</li>
<li>&gt; menjadi &amp;gt;</li>
<li>&#8221; menjadi &amp;quot;</li>
</ul>
<p>Anda bisa melakukan find-replace secara manual, atau menggunakan fungsi yang disediakan oleh bahasa pemrograman yang digunakan. Sebagai contoh fungsi <strong>htmlentities()</strong> yang disediakan oleh PHP.</p>
<p>Nah, XSS ini terjadi saat menampilkan sesuatu ke web browser. Celah keamanan sebaliknya, terjadi saat menyimpan sesuatu dari web browser (hasil input pengguna) ke database biasa dikenal dengan <a title="SQL Injection di Wikipedia" href="http://en.wikipedia.org/wiki/SQL_injection" target="_blank">SQL injection</a>. Selain kedua jenis tersebut, masih ada lagi celah keamanan yang lain, misalnya <a title="Cross-Site Request Forgery di Wikipedia" href="http://en.wikipedia.org/wiki/Cross-site_request_forgery" target="_blank">Cross-site Request Forgery (CSRF)</a>.</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>Referensi:</p>
<ul>
<li><a title="Cross-Site Scripting di Wikipedia" href="http://en.wikipedia.org/wiki/Cross-site_scripting" target="_blank">Cross-Site Scripting di Wikipedia</a></li>
</ul>

<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;t=Mengenal+Cross-Site+Scripting+%28XSS%29" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Mengenal+Cross-Site+Scripting+%28XSS%29%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D710%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;title=Mengenal+Cross-Site+Scripting+%28XSS%29&amp;notes=Cross-site+scripting+%28untuk+selanjutnya+akan+disebut+sebagai+XSS%29+merupakan+celah+keamanan+%28security+vulnerability%29%C2%A0+yang+biasa+ditemukan+di+aplikasi+berbasis+web.+Celah+keamanan+ini+memungkinkan+penyerang+memasukkan+%28inject%29+kode+tertentu+yang+bers" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;title=Mengenal+Cross-Site+Scripting+%28XSS%29&amp;bodytext=Cross-site+scripting+%28untuk+selanjutnya+akan+disebut+sebagai+XSS%29+merupakan+celah+keamanan+%28security+vulnerability%29%C2%A0+yang+biasa+ditemukan+di+aplikasi+berbasis+web.+Celah+keamanan+ini+memungkinkan+penyerang+memasukkan+%28inject%29+kode+tertentu+yang+bers" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fmengenal-cross-site-scripting%2F&amp;title=Mengenal+Cross-Site+Scripting+%28XSS%29" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/" onclick="addBookmark(event);" title="Mengenal Cross-Site Scripting (XSS)" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Mengenal Cross-Site Scripting (XSS)&amp;body=Cross-site scripting (untuk selanjutnya akan disebut sebagai XSS) merupakan celah keamanan (security vulnerability)  yang biasa ditemukan di aplikasi berbasis web. Celah keamanan ini memungkinkan penyerang memasukkan (inject) kode tertentu yang bers - http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></content:encoded>
			<wfw:commentRss>http://www.muhammadalvin.net/2012/01/mengenal-cross-site-scripting/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#JLEBmoment #SRM529</title>
		<link>http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/</link>
		<comments>http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/#comments</comments>
		<pubDate>Sat, 14 Jan 2012 18:37:36 +0000</pubDate>
		<dc:creator>Muhammad Alvin</dc:creator>
				<category><![CDATA[Umum]]></category>

		<guid isPermaLink="false">http://www.muhammadalvin.net/?p=704</guid>
		<description><![CDATA[SELECT * FROM right_sidebar WHERE title = &#039;Twitter - @mhdalvin&#039; AND topic = &#039;TopCoder SRM 529&#039; ORDER BY timestamp; Malam yg penuh kesialan -_-&#8221; (25 minutes ago) #JLEBmoment itu saat mengikuti #SRM sama sekali nggak ngerti maksud problem easy (19 minutes ago) #JLEBmoment itu saat mengikuti #SRM terpaksa close problem easy lalu open problem medium &#8230; </p><p><a class="more-link block-button" href="http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/">Continue reading &#187;</a>
<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;t=%23JLEBmoment+%23SRM529" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=%23JLEBmoment+%23SRM529%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D704%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;title=%23JLEBmoment+%23SRM529&amp;notes=SELECT+%2A+FROM+right_sidebar+WHERE+title+%3D+%26%23039%3BTwitter+-+%40mhdalvin%26%23039%3B+%0D%0A++AND+topic+%3D+%26%23039%3BTopCoder+SRM+529%26%23039%3B+ORDER+BY+timestamp%3B%0D%0A%0D%0A%09Malam+yg+penuh+kesialan+-_-%22+%2825+minutes+ago%29%0D%0A%09%23JLEBmoment+itu+saat+mengikuti+%23SRM+sama+sekali+nggak+ngert" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;title=%23JLEBmoment+%23SRM529&amp;bodytext=SELECT+%2A+FROM+right_sidebar+WHERE+title+%3D+%26%23039%3BTwitter+-+%40mhdalvin%26%23039%3B+%0D%0A++AND+topic+%3D+%26%23039%3BTopCoder+SRM+529%26%23039%3B+ORDER+BY+timestamp%3B%0D%0A%0D%0A%09Malam+yg+penuh+kesialan+-_-%22+%2825+minutes+ago%29%0D%0A%09%23JLEBmoment+itu+saat+mengikuti+%23SRM+sama+sekali+nggak+ngert" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;title=%23JLEBmoment+%23SRM529" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/" onclick="addBookmark(event);" title="#JLEBmoment #SRM529" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=#JLEBmoment #SRM529&amp;body=SELECT * FROM right_sidebar WHERE title = &#039;Twitter - @mhdalvin&#039; 
  AND topic = &#039;TopCoder SRM 529&#039; ORDER BY timestamp;

	Malam yg penuh kesialan -_-" (25 minutes ago)
	#JLEBmoment itu saat mengikuti #SRM sama sekali nggak ngert - http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></description>
			<content:encoded><![CDATA[<pre class="brush: sql; gutter: true">SELECT * FROM right_sidebar WHERE title = &#039;Twitter - @mhdalvin&#039;
  AND topic = &#039;TopCoder SRM 529&#039; ORDER BY timestamp;</pre>
<ul>
<li>Malam yg penuh kesialan -_-&#8221; (25 minutes ago)</li>
<li>#JLEBmoment itu saat mengikuti #SRM sama sekali nggak ngerti maksud problem easy (19 minutes ago)</li>
<li>#JLEBmoment itu saat mengikuti #SRM terpaksa close problem easy lalu open problem medium dlm keadaan sama sekali belum coding problem easy. (17 minutes ago)</li>
<li>#JLEBmoment itu saat di tengah coding, tiba-tiba lupa cara pakai java.util.HashMap dan java.util.ArrayList (16 minutes ago)</li>
<li>#JLEBmoment itu saat coding problem medium tiba2 &#8216;Connection to the server is lost. Logging off&#8217; (14 minutes ago)</li>
<li>#JLEBmoment itu saat tidak bisa login lagi setelah ter-logout karena internet putus. Ternyata internet nya masih putus. (12 minutes ago)</li>
<li>#JLEBmoment itu saat punya smartphone n ada paket intenet tapi gk bisa tethering, karena berada di daerah yg sulit sinyal Telkom53l (10 minutes ago)</li>
<li>#JLEBmoment itu saat nggak pulang ke rumah demi koneksi internet 5 Mbps, tiba2 koneksi nya putus (8 minutes ago)</li>
<li>#JLEBmoment itu saat ini. Titik. (3 minutes ago)</li>
</ul>
<p>Oke, satu lagi tambahan:</p>
<p>#JLEBmoment itu adalah saat problem medium hampir solve, lalu muncul &#8216;Coding phase is ended&#8217;</p>

<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;t=%23JLEBmoment+%23SRM529" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=%23JLEBmoment+%23SRM529%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D704%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;title=%23JLEBmoment+%23SRM529&amp;notes=SELECT+%2A+FROM+right_sidebar+WHERE+title+%3D+%26%23039%3BTwitter+-+%40mhdalvin%26%23039%3B+%0D%0A++AND+topic+%3D+%26%23039%3BTopCoder+SRM+529%26%23039%3B+ORDER+BY+timestamp%3B%0D%0A%0D%0A%09Malam+yg+penuh+kesialan+-_-%22+%2825+minutes+ago%29%0D%0A%09%23JLEBmoment+itu+saat+mengikuti+%23SRM+sama+sekali+nggak+ngert" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;title=%23JLEBmoment+%23SRM529&amp;bodytext=SELECT+%2A+FROM+right_sidebar+WHERE+title+%3D+%26%23039%3BTwitter+-+%40mhdalvin%26%23039%3B+%0D%0A++AND+topic+%3D+%26%23039%3BTopCoder+SRM+529%26%23039%3B+ORDER+BY+timestamp%3B%0D%0A%0D%0A%09Malam+yg+penuh+kesialan+-_-%22+%2825+minutes+ago%29%0D%0A%09%23JLEBmoment+itu+saat+mengikuti+%23SRM+sama+sekali+nggak+ngert" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fjlebmoment-srm529%2F&amp;title=%23JLEBmoment+%23SRM529" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/" onclick="addBookmark(event);" title="#JLEBmoment #SRM529" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=#JLEBmoment #SRM529&amp;body=SELECT * FROM right_sidebar WHERE title = &#039;Twitter - @mhdalvin&#039; 
  AND topic = &#039;TopCoder SRM 529&#039; ORDER BY timestamp;

	Malam yg penuh kesialan -_-" (25 minutes ago)
	#JLEBmoment itu saat mengikuti #SRM sama sekali nggak ngert - http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></content:encoded>
			<wfw:commentRss>http://www.muhammadalvin.net/2012/01/jlebmoment-srm529/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kalender Maya</title>
		<link>http://www.muhammadalvin.net/2012/01/kalender-maya/</link>
		<comments>http://www.muhammadalvin.net/2012/01/kalender-maya/#comments</comments>
		<pubDate>Mon, 02 Jan 2012 09:28:41 +0000</pubDate>
		<dc:creator>Muhammad Alvin</dc:creator>
				<category><![CDATA[Algoritma dan Pemrograman]]></category>
		<category><![CDATA[acm-icpc]]></category>
		<category><![CDATA[icpc]]></category>

		<guid isPermaLink="false">http://www.muhammadalvin.net/?p=692</guid>
		<description><![CDATA[Pagi ini, 2 Januari 2012, jalanan begitu sunyi. Sepertinya banyak yang cuti bersama. Mungkin karena itu juga, saya tiba di kantor terlalu awal, sebelum jam 8.00. Masih terlalu pagi, jadi saya buka-buka twitter, lihat-lihat timeline, ketemu beberapa twit berita yang cukup menarik. Salah satunya tentang isu kiamat di Desember 2012 (yang katanya sebagai efek dari &#8230; </p><p><a class="more-link block-button" href="http://www.muhammadalvin.net/2012/01/kalender-maya/">Continue reading &#187;</a>
<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;t=Kalender+Maya" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Kalender+Maya%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D692%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;title=Kalender+Maya&amp;notes=Pagi+ini%2C+2+Januari+2012%2C+jalanan+begitu+sunyi.+Sepertinya+banyak+yang+cuti+bersama.+Mungkin+karena+itu+juga%2C+saya+tiba+di+kantor+terlalu+awal%2C+sebelum+jam+8.00.+Masih+terlalu+pagi%2C+jadi+saya+buka-buka+twitter%2C+lihat-lihat+timeline%2C+ketemu+beberapa+t" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;title=Kalender+Maya&amp;bodytext=Pagi+ini%2C+2+Januari+2012%2C+jalanan+begitu+sunyi.+Sepertinya+banyak+yang+cuti+bersama.+Mungkin+karena+itu+juga%2C+saya+tiba+di+kantor+terlalu+awal%2C+sebelum+jam+8.00.+Masih+terlalu+pagi%2C+jadi+saya+buka-buka+twitter%2C+lihat-lihat+timeline%2C+ketemu+beberapa+t" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;title=Kalender+Maya" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/kalender-maya/" onclick="addBookmark(event);" title="Kalender Maya" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Kalender Maya&amp;body=Pagi ini, 2 Januari 2012, jalanan begitu sunyi. Sepertinya banyak yang cuti bersama. Mungkin karena itu juga, saya tiba di kantor terlalu awal, sebelum jam 8.00. Masih terlalu pagi, jadi saya buka-buka twitter, lihat-lihat timeline, ketemu beberapa t - http://www.muhammadalvin.net/2012/01/kalender-maya/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></description>
			<content:encoded><![CDATA[<p>Pagi ini, 2 Januari 2012, jalanan begitu sunyi. Sepertinya banyak yang cuti bersama. Mungkin karena itu juga, saya tiba di kantor terlalu awal, sebelum jam 8.00. Masih terlalu pagi, jadi saya buka-buka twitter, lihat-lihat timeline, ketemu beberapa twit berita yang cukup menarik. Salah satunya tentang isu kiamat di Desember 2012 (yang katanya sebagai efek dari berakhirnya sistem penanggalan pada kalender suku Maya) yang ditolak oleh suku Maya sendiri. Ada seorang peneliti yang cukup mengerti dengan suku Maya. Menurut informasi yang ia peroleh, suku Maya sendiri tidak pernah memprediksi itu. Memang benar salah satu siklus penanggalan akan berakhir di Desember 2012, tetapi itu hanyalah merupakan akhir dari siklus penanggalan, bukan akhir dunia. Setelah akhir itu, akan ada siklus penanggalan berikutnya. Dan katanya, ini bukan yang pertama terjadi. Apapun itu, sebagai muslim, saya tetap percaya bahwa datangnya kiamat tidak akan ada yang tahu, selain Allah SWT.</p>
<p>Seperti biasa, keingintahunan saya mendadak muncul. Saya googling tentang sistem penanggalan suku Maya tersebut. Tentu saja saya mendapatkan artikel dari Wikipedia tentang itu. Tetapi yang membuat saya tertarik adalah ini:</p>
<p><a title="Maya Calendar di ACM-ICPC Live Archive" href="http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=459&amp;page=show_problem&amp;problem=3516" target="_blank">http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&amp;Itemid=8&amp;category=459&amp;page=show_problem&amp;problem=3516</a></p>
<p>Setelah membaca dan melihat batasan soal tersebut, saya berpikir ini soal yang cukup mudah. Soal ini tidak butuh algoritma-algoritma rumit untuk menyelesaikannya.</p>
<p>Jenis soal: ad-hoc</p>
<p>Analisis: Sistem penanggalan Haab memiliki 365 hari dalam setahun, dengan batasan tahun adalah 5000. Itu berarti total hari sejak hari pertama sampai hari terakhir masih kurang dari 2 juta. Bukan angka yang besar, dan tipe data integer (32 bit) masih memiliki banyak tempat untuk itu.</p>
<p>Oke, mari kita coding!</p>
<p>Awalnya mau pakai Java, tetapi karena belum pernah submit dengan Java di <a title="ACM-ICPC Live Archive" href="http://livearchive.onlinejudge.org" target="_blank">LiveArchive</a>, saya pilih bahasa yang dulu sering saya gunakan, C++.</p>
<pre class="brush: cpp; gutter: true">#include &lt;iostream&gt;
#include &lt;cstdio&gt;
#include &lt;cstdlib&gt;
using namespace std;

int main()
{
    string haab[19] = { &quot;pop&quot;, &quot;no&quot;, &quot;zip&quot;, &quot;zotz&quot;, &quot;tzec&quot;, &quot;xul&quot;, &quot;yoxkin&quot;,
        &quot;mol&quot;, &quot;chen&quot;, &quot;yax&quot;, &quot;zac&quot;, &quot;ceh&quot;, &quot;mac&quot;, &quot;kankin&quot;, &quot;muan&quot;, &quot;pax&quot;,
        &quot;koyab&quot;, &quot;cumhu&quot;, &quot;uayet&quot; };    
    string tzolkin[20] = { &quot;imix&quot;, &quot;ik&quot;, &quot;akbal&quot;, &quot;kan&quot;, &quot;chicchan&quot;, &quot;cimi&quot;,
        &quot;manik&quot;, &quot;lamat&quot;, &quot;muluk&quot;, &quot;ok&quot;, &quot;chuen&quot;,  &quot;eb&quot;, &quot;ben&quot;, &quot;ix&quot;, &quot;mem&quot;,
        &quot;cib&quot;, &quot;caban&quot;, &quot;eznab&quot;, &quot;canac&quot;, &quot;ahau&quot; };

    int nTC; cin &gt;&gt; nTC; cin.ignore();
    cout &lt;&lt; nTC &lt;&lt; endl; // output-nya butuh ini!
    string input;
    while (nTC-- &gt; 0) {
        getline(cin, input);

        int d = 0;
        string m = &quot;&quot;;
        int y = 0;

        int flag = 1;
        for (int i = 0, n = input.size(); i &lt; n; i++) {
            char c = input[i];
            if (c == &#039;.&#039;) {
                flag = 2;
            } else if (c == &#039; &#039; &amp;&amp; flag == 2) {
                flag = 3;
            } else if (c == &#039; &#039; &amp;&amp; flag == 3) {
                flag = 4;
            } else if (flag == 1) {
                d *= 10; d += c - &#039;0&#039;;
            } else if (flag == 3) {
                m += c;
            } else if (flag == 4) {
                y *= 10; y += c - &#039;0&#039;;
            }
        }

        int indeksBulan = -1;
        for (int i = 0; i &lt; 19; i++) {
            if (haab[i] == m) {
                indeksBulan = i;
                break;
            }
        }

        unsigned int jumlahHari = (y * 365) + (20 * indeksBulan) + d;
        // cout &lt;&lt; jumlahHari &lt;&lt; endl;

        unsigned tahunTzolkin = jumlahHari / 260;
        unsigned sisa = jumlahHari % 260;

        int a = 0, b = 0;
        for (int i = 0; i &lt; sisa; i++) {
            a = (a + 1) % 13;
            b = (b + 1) % 20;
        }

        cout &lt;&lt; (a + 1) &lt;&lt; &quot; &quot; &lt;&lt; tzolkin[b] &lt;&lt; &quot; &quot; &lt;&lt; tahunTzolkin &lt;&lt; endl;
    }

    // system(&quot;pause&quot;);
}</pre>
<p>Array <strong>haab</strong> dan <strong>tzolkin</strong> tidak diketik satu persatu itemnya. Ada cara cepat dengan bantuan Notepad++ dan regular expression.</p>
<p>Cara memparsing input nya juga cukup &#8216;bodoh&#8217; <img src='http://www.muhammadalvin.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> . Tapi that&#8217;s OK lah, itu gak jadi persoalan. Hasil parsing adalah mengisi 3 variabel berikut:</p>
<ul>
<li>d = tanggal di kalendar Haab (input), dimulai dari 0.</li>
<li>m = bulan di kalender Haab (input).</li>
<li>y = tahun di kalender Haab (input), dimulai dari 0.</li>
</ul>
<p>Langkah pertama: Kalender Haab terdiri dari 365 hari dalam setahun. Jika y = 0, maka tanggal tersebut belum setahun. Jika y = 1, maka tanggal tersebut sudah lebih setahun. Jika y = 2, maka tanggal tersebut sudah lebih 2 tahun. Artinya, berapapun nilai y, tanggal tersebut sudah melebihi y tahun, atau y * 365 hari.</p>
<p>Langkah kedua: Kalender Haab terdiri dari 19 bulan. 18 bulan pertama (<strong>pop</strong> s.d. <strong>cumhu</strong>) memiliki 20 hari, dan bulan terakhir (<strong>uayet</strong>) memiliki 5 hari. Suatu tanggal di bulan pertama, berarti tanggal tersebut belum sebulan pada tahun tersebut. Suatu tanggal di bulan kedua, berarti tanggal tersebut sudah lebih 1 bulan pada tahun tersebut. Suatu tanggal di bulan ketiga, berarti tanggal tersebut sudah lebih 2 bulan pada tahun tersebut. Dan seterusnya sampai suatu tanggal di bulan ke-19, berarti tanggal tersebut sudah lebih 18 bulan pada tahun tersebut. Nah, karena kebetulan bulan pertama sampai bulan ke-18 terdiri dari 20 hari, maka kalikan saja dengan 20 berapa bulan yg sudah dilewati.</p>
<p>Langkah ketiga: Tambahkan angka tanggal.</p>
<p>Hasil akhirnya begini:</p>
<pre class="brush: text; gutter: true">jumlahHari = (y * 365) + (20 * indeksBulan) + d;</pre>
<p>indeksBulan = 0 untuk bulan pertama (<strong>pop</strong>), 1 untuk bulan kedua (<strong>no</strong>), 2 untuk bulan ketiga (<strong>zip</strong>), dst.</p>
<p>Sebenarnya ini nggak begitu pas. Kenapa? Coba perhatikan tanggal <strong>0. pop 0</strong> yang merupakan tanggal pertama di kalender Haab. Menggunakan rumus di atas, maka:</p>
<pre class="brush: text; gutter: true">jumlahHari = (0 * 365) + (20 * 0) + 0 = 0</pre>
<p>Hari pertama, kenapa 0? Bukannya 1? Ya pertanyaan bagus. Jawabannya adalah karena kita akan menghitung dari 0, bukan 1. Ini akan memudahkan kita dalam baris kode selanjutnya jika dibandingkan dengan menghitung dari 1.</p>
<p>Kalender Tzolkin memiliki 13 periode dan 20 hari. Berdasarkan permutasi yang dicontohkan di soal, kita bisa mengetahui bahwa ada maksimum 13 * 20 hari = 260 hari di kalender Tzolkin.</p>
<p>1 hari di kalender Haab berarti 1 hari (kurang dari setahun) di kalender Tzolkin, 2 hari di kalender Haab berarti 2 hari (kurang dari setahun) di kalender Tzolkin, &#8230;, 260 hari di kalender Haab berarti 1 tahun di kalender Tzolkin, 261 hari di kalender Haab berarti 1 tahun lebih 1 hari di kalender Tzolkin, dst. Dengan kata lain, 1 hari sampai dengan 260 hari belum melewati setahui kalender Tzolkin. Karena kita menghitung dari 0, maka berapa tahun di kalender Tzolkin yang sudah dilewati dapat dengan mudah diperoleh dengan membaginya dengan 260 lalu mengambil bagian integernya. 0 / 260 = 0; 1 / 260 = 0; 259 / 260 = 0. Akan sedikit lebih sulit jika menghitung dari 1, karena 260 / 260 = 1, padahal 260 hari belum melewati setahun tahun Tzolkin.</p>
<p>Setelah mendapatkan berapa tahun Tzolkin, hitung sisanya dengan jumlahHari % 260. Tentukan tanggal dan bulan apa yang tepat dari sisa tersebut. Di sini lagi-lagi saya menghitung dari 0. Ini sangat membantu, karena ada operasi modulo dan penggunaan array (indeks array juga dimulai dari 0).</p>
<p>Saat menampilkan, pastikan untuk menambahkan tanggal dengan 1, karena tanggal pertama di kalender Tzolkin adalah 1, bukan 0.</p>
<p>&#8212;&#8212;&#8212;-</p>
<p>Mestinya soal ini <strong>Accepted</strong> dalam submission pertama, tetapi gara2 tidak teliti membaca apa yang diminta di output, jadi <strong>Wrong Answer</strong> beberapa kali. Masalahnya sepele: baris pertama output adalah banyaknya output, yang nilainya sama dengan jumlah test case. Setelah itu, barulah output.</p>
<p>Yang lebih parahnya lagi, hal tersebut lama disadari. Bahkan sampai mencoba hal-hal ini:</p>
<pre class="brush: cpp; gutter: true">if (d &gt;= 20) {
    cout &lt;&lt; 1/0; // pembagian dengan 0 untuk memancing Runtime Error
}</pre>
<p>Karena di soal nggak dijelaskan kalau input-an pasti valid, maka&#8217;a sampai repot-repot ngecek itu. Dan ternyata setelah di-submit, memang benar nggak Runtime Error, karena input-an nya valid.</p>
<p>Akhirnya setelah disadari, 1 baris berikut ditambahkan:</p>
<pre class="brush: cpp; gutter: true">cout &lt;&lt; nTC &lt;&lt; endl;</pre>
<p>Dan hasil submit-pun berubah menjadi <strong>Accepted</strong>. <em>Tanpamu, semua itu tak berarti!</em> Tanpa baris tersebut, semua jawaban yang sudah benar tetap sia-sia.</p>

<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;t=Kalender+Maya" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Kalender+Maya%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D692%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;title=Kalender+Maya&amp;notes=Pagi+ini%2C+2+Januari+2012%2C+jalanan+begitu+sunyi.+Sepertinya+banyak+yang+cuti+bersama.+Mungkin+karena+itu+juga%2C+saya+tiba+di+kantor+terlalu+awal%2C+sebelum+jam+8.00.+Masih+terlalu+pagi%2C+jadi+saya+buka-buka+twitter%2C+lihat-lihat+timeline%2C+ketemu+beberapa+t" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;title=Kalender+Maya&amp;bodytext=Pagi+ini%2C+2+Januari+2012%2C+jalanan+begitu+sunyi.+Sepertinya+banyak+yang+cuti+bersama.+Mungkin+karena+itu+juga%2C+saya+tiba+di+kantor+terlalu+awal%2C+sebelum+jam+8.00.+Masih+terlalu+pagi%2C+jadi+saya+buka-buka+twitter%2C+lihat-lihat+timeline%2C+ketemu+beberapa+t" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2012%2F01%2Fkalender-maya%2F&amp;title=Kalender+Maya" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2012/01/kalender-maya/" onclick="addBookmark(event);" title="Kalender Maya" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Kalender Maya&amp;body=Pagi ini, 2 Januari 2012, jalanan begitu sunyi. Sepertinya banyak yang cuti bersama. Mungkin karena itu juga, saya tiba di kantor terlalu awal, sebelum jam 8.00. Masih terlalu pagi, jadi saya buka-buka twitter, lihat-lihat timeline, ketemu beberapa t - http://www.muhammadalvin.net/2012/01/kalender-maya/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></content:encoded>
			<wfw:commentRss>http://www.muhammadalvin.net/2012/01/kalender-maya/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Menggunakan Web API</title>
		<link>http://www.muhammadalvin.net/2011/12/menggunakan-web-api/</link>
		<comments>http://www.muhammadalvin.net/2011/12/menggunakan-web-api/#comments</comments>
		<pubDate>Sat, 10 Dec 2011 15:27:17 +0000</pubDate>
		<dc:creator>Muhammad Alvin</dc:creator>
				<category><![CDATA[Software Development]]></category>
		<category><![CDATA[web api]]></category>

		<guid isPermaLink="false">http://www.muhammadalvin.net/?p=672</guid>
		<description><![CDATA[Postingan kali ini akan membahas bagaimana menggunakan web API. Apabila sudah memahami bagaimana menggunakan web API, maka akan mudah untuk memahami bagaimana menggunakan web service. Pada dasarnya, web service juga merupakan web API. Web service merupakan bentuk khusus dari web API. Ada aturan dan standar tertentu dalam web service. Web API yang akan kita gunakan &#8230; </p><p><a class="more-link block-button" href="http://www.muhammadalvin.net/2011/12/menggunakan-web-api/">Continue reading &#187;</a>
<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;t=Menggunakan+Web+API" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Menggunakan+Web+API%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D672%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;title=Menggunakan+Web+API&amp;notes=Postingan+kali+ini+akan+membahas+bagaimana+menggunakan+web+API.+Apabila+sudah+memahami+bagaimana+menggunakan+web+API%2C+maka+akan+mudah+untuk+memahami+bagaimana+menggunakan+web+service.+Pada+dasarnya%2C+web+service+juga+merupakan+web+API.+Web+service+mer" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;title=Menggunakan+Web+API&amp;bodytext=Postingan+kali+ini+akan+membahas+bagaimana+menggunakan+web+API.+Apabila+sudah+memahami+bagaimana+menggunakan+web+API%2C+maka+akan+mudah+untuk+memahami+bagaimana+menggunakan+web+service.+Pada+dasarnya%2C+web+service+juga+merupakan+web+API.+Web+service+mer" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;title=Menggunakan+Web+API" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2011/12/menggunakan-web-api/" onclick="addBookmark(event);" title="Menggunakan Web API" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Menggunakan Web API&amp;body=Postingan kali ini akan membahas bagaimana menggunakan web API. Apabila sudah memahami bagaimana menggunakan web API, maka akan mudah untuk memahami bagaimana menggunakan web service. Pada dasarnya, web service juga merupakan web API. Web service mer - http://www.muhammadalvin.net/2011/12/menggunakan-web-api/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></description>
			<content:encoded><![CDATA[<p>Postingan kali ini akan membahas bagaimana menggunakan web API. Apabila sudah memahami bagaimana menggunakan web API, maka akan mudah untuk memahami bagaimana menggunakan web service. Pada dasarnya, web service juga merupakan web API. Web service merupakan bentuk khusus dari web API. Ada aturan dan standar tertentu dalam web service.</p>
<p>Web API yang akan kita gunakan adalah web API untuk mengambil data dari Info Billing PLN yang sudah pernah kita bahas <a title="Mengambil Data dari Info Billing PLN" href="http://www.muhammadalvin.net/2011/12/mengambil-data-dari-info-billing-pln/" target="_blank">di sini</a>. Langsung saja kita lakukan coding.</p>
<p>Pertama, buat halaman HTML berisi form untuk meminta ID pelanggan, misalnya sebagai berikut:</p>
<pre class="brush: html; gutter: true">&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;
&lt;html&gt;
    &lt;head&gt;
        &lt;title&gt;Cek Tagihan Listrik&lt;/title&gt;
    &lt;/head&gt;
    &lt;body&gt;
        &lt;form action="" method="post"&gt;
            &lt;table border="0"&gt;
                &lt;tbody&gt;
                    &lt;tr&gt;
                        &lt;td&gt;ID Pelanggan&lt;/td&gt;
                        &lt;td&gt;&lt;input type="text" name="id" value="" /&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr&gt;
                        &lt;td&gt;Tahun&lt;/td&gt;
                        &lt;td&gt;&lt;input type="text" name="tahun" value="" /&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                    &lt;tr&gt;
                        &lt;td&gt;&lt;/td&gt;
                        &lt;td&gt;&lt;input type="submit" value="Lihat" /&gt;&lt;/td&gt;
                    &lt;/tr&gt;
                &lt;/tbody&gt;
            &lt;/table&gt;
        &lt;/form&gt;
    &lt;/body&gt;
&lt;/html&gt;</pre>
<p>Berikutnya, siapkan skrip PHP untuk membaca input dari halaman tersebut, misalnya seperti ini:</p>
<pre class="brush: php; gutter: true">$id = (isset($_POST['id']) ? $_POST['id'] : '');
$tahun = (isset($_POST['tahun']) ? $_POST['tahun'] : date('Y'));</pre>
<p>Selanjutnya, lengkapi skrip PHP tersebut menjadi seperti ini:</p>
<pre class="brush: php; gutter: true">if ($id != '' &amp;&amp; $tahun != '')
{
    // panggil web API dgn membawah data id pelanggan dan tahun.
    // utk sekedar request GET bisa dengan file_get_contents(). utk request yg lebih rumit, pakai CURL.
    $url = 'http://apps.muhammadalvin.net/pln.php?id_pelanggan=' . $id . '&amp;tahun=' . $tahun;
    $hasilApi = @file_get_contents($url);

    // proses response dari hasil pemanggilan web API tsb.
    $hasil = json_decode($hasilApi);
    if (!is_null($hasil))
    {
        if ($hasil-&gt;status)
        {
            // kalo 'status' bernilai true, berarti sukses. ambil nama pelanggan dan data tagihannya.

            // apakan ada data tagihan utk tahun yg diminta?
            if (isset($hasil-&gt;result-&gt;tagihan-&gt;{$tahun}))
            {
                $namaBulan = array(
                    '1'  =&gt; 'Januari',
                    '2'  =&gt; 'Februari',
                    '3'  =&gt; 'Maret',
                    '4'  =&gt; 'April',
                    '5'  =&gt; 'Mei',
                    '6'  =&gt; 'Juni',
                    '7'  =&gt; 'Juli',
                    '8'  =&gt; 'Agustus',
                    '9'  =&gt; 'September',
                    '10' =&gt; 'Oktober',
                    '11' =&gt; 'November',
                    '12' =&gt; 'Desember'
                );

                ?&gt;
                &lt;p&gt;
                    Tagihan listrik atas nama &lt;strong&gt;&lt;?php echo $hasil-&gt;result-&gt;nama; ?&gt;&lt;/strong&gt;
                    untuk tahun &lt;strong&gt;&lt;?php echo $tahun; ?&gt;&lt;/strong&gt; adalah sebagai berikut:
                &lt;/p&gt;
                &lt;ul&gt;
                &lt;?php
                foreach ($hasil-&gt;result-&gt;tagihan-&gt;{$tahun} as $bulan =&gt; $tagihan)
                {
                    ?&gt;&lt;li&gt;&lt;?php echo $namaBulan[$bulan]; ?&gt; = Rp &lt;?php echo number_format($tagihan, 0, ',', '.'); ?&gt;&lt;/li&gt;&lt;?php
                }
                ?&gt;&lt;/ul&gt;&lt;?php
            }
            else
            {
                ?&gt;&lt;p style="color: #00f"&gt;Tidak ada data tagihan untuk tahun ini!&lt;/p&gt;&lt;?php
            }
        }
        else
        {
            ?&gt;&lt;p style="color: #f00"&gt;Error &lt;?php echo $hasil-&gt;faultCode; ?&gt;: &lt;?php echo $hasil-&gt;faultString; ?&gt;&lt;/p&gt;&lt;?php
        }
    }
    else
    {
        ?&gt;&lt;p style="color: #f00"&gt;Unknown Error: &lt;?php echo htmlentities($hasilApi); ?&gt;&lt;/p&gt;&lt;?php
    }
}</pre>
<p>Contoh skrip jadi (halaman berisi form HTML + skrip PHP) bisa dilihat <a href="http://www.muhammadalvin.net/wp-content/uploads/2011/12/tagihan-listrik-php.txt" target="_blank">di sini</a>.</p>
<p>Simpan lalu jalankan skrip tersebut. Ini adalah contoh hasilnya:</p>
<p><img class="alignnone size-large wp-image-677" title="1" src="http://www.muhammadalvin.net/wp-content/uploads/2011/12/1-500x343.png" alt="" width="500" height="343" /></p>
<p><img class="alignnone size-large wp-image-678" title="2" src="http://www.muhammadalvin.net/wp-content/uploads/2011/12/2-500x343.png" alt="" width="500" height="343" /></p>

<!-- Start WP Socializer - Social Buttons - Output -->
 &bull; <a href="http://www.facebook.com/share.php?u=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;t=Menggunakan+Web+API" title="Share this on Facebook" target="_blank" rel="nofollow">Facebook</a> &bull; <a href="http://twitter.com/home?status=Menggunakan+Web+API%20-%20http%3A%2F%2Fwww.muhammadalvin.net%3Fp%3D672%20" title="Tweet this !" target="_blank" rel="nofollow">Twitter</a> &bull; <a href="http://delicious.com/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;title=Menggunakan+Web+API&amp;notes=Postingan+kali+ini+akan+membahas+bagaimana+menggunakan+web+API.+Apabila+sudah+memahami+bagaimana+menggunakan+web+API%2C+maka+akan+mudah+untuk+memahami+bagaimana+menggunakan+web+service.+Pada+dasarnya%2C+web+service+juga+merupakan+web+API.+Web+service+mer" title="Post this on Delicious" target="_blank" rel="nofollow">Delicious</a> &bull; <a href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;title=Menggunakan+Web+API&amp;bodytext=Postingan+kali+ini+akan+membahas+bagaimana+menggunakan+web+API.+Apabila+sudah+memahami+bagaimana+menggunakan+web+API%2C+maka+akan+mudah+untuk+memahami+bagaimana+menggunakan+web+service.+Pada+dasarnya%2C+web+service+juga+merupakan+web+API.+Web+service+mer" title="Submit this to Digg" target="_blank" rel="nofollow">Digg</a> &bull; <a href="http://www.google.com/buzz/post?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F" title="Post this on Google Buzz" target="_blank" rel="nofollow">Google Buzz</a> &bull; <a href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.muhammadalvin.net%2F2011%2F12%2Fmenggunakan-web-api%2F&amp;title=Menggunakan+Web+API" title="Submit this to StumbleUpon" target="_blank" rel="nofollow">StumbleUpon</a> &bull; <a href="http://www.muhammadalvin.net/2011/12/menggunakan-web-api/" onclick="addBookmark(event);" title="Menggunakan Web API" target="_blank" rel="nofollow">Add to favorites</a> &bull; <a href="mailto:wordpress.id@muhammadalvin.net?subject=Menggunakan Web API&amp;body=Postingan kali ini akan membahas bagaimana menggunakan web API. Apabila sudah memahami bagaimana menggunakan web API, maka akan mudah untuk memahami bagaimana menggunakan web service. Pada dasarnya, web service juga merupakan web API. Web service mer - http://www.muhammadalvin.net/2011/12/menggunakan-web-api/" title="Email this" target="_blank" rel="nofollow">Email</a> &bull; <a href="http://www.muhammadalvin.net/feed/rss/" title="Subscribe to RSS" target="_blank" rel="nofollow">RSS</a>
<!-- End WP Socializer - Social Buttons - Output -->
]]></content:encoded>
			<wfw:commentRss>http://www.muhammadalvin.net/2011/12/menggunakan-web-api/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

