Tag: Catatan

  • Pembagian dengan Nol dan Kesalahan Kalkulator Google

    Ketika duduk di bangku sekolah (baik dasar ataupun menengah), kita diajarkan bahwa pembagian dengan angka nol adalah tak hingga, atau infinity, dan biasanya ditulis dengan lambang ∞. Dengan menggunakan logika sederhana saja, kita dapat membuktikan bahwa pernyataan tersebut salah.

    Satu dibagi empat dapat dianalogikan dengan membagi sepotong kue kepada 4 orang, artinya adalah masing-masing orang mendapatkan 1/4 bagian. Sekarang jika satu kue dibagi 0 orang, bagaimana mungkin masing-masing mendapat tak hingga bagian? Orang yang menerima kue saja tidak ada.

    Lalu bagaimana jika 0/0? Biasanya setiap bilangan yang dibagi dengan dirinya sendiri hasilnya adalah 1. Namun itu tidak berlaku untuk angka 0. Bagaimana mungkin membagi 0 kue kepada 0 orang dan masing-masing mendapat 1 bagian? Kue dan orang yang menerima sama-sama tidak ada, jadi mustahil bisa muncul angka 1. Dalam matematika kemustahilan dari pembagian dengan angka nol disebut tak terdefinisi (undefined).

    Jika dihitung menggunakan kalkulator, pembagian dengan nol akan menghasilkan error. Namun, hasil yang mengejutkan diperoleh dari kalkulator Google. Menurut Google, 1 dibagi 0 adalah Infinity. Programer aplikasi kalkulator Google melakukan kesalahan! Lain halnya jika 0 dibagi 0, kalkulator Google menghasilkan Error.

    kalkulator google

    Analogi di atas mungkin berguna jika kita ingin menjelaskan pembagian dengan nol kepada orang awam atau anak kecil. Konsep matematika tidak bisa hanya dijelaskan dengan analogi, namun membutuhkan definisi atau aksioma.

  • Belajar Tipe Data Primitif pada Java

    Tipe data adalah salah satu konsep dasar pemrograman. Sebagai seorang programer, seharusnya menguasai hal ini dengan baik. Untuk mempelajari tipe data, sebaiknya menggunakan bahasa pemrograman yang strongly typed, misalnya Java.

    Tidak seperti pada bahasa PHP, Java adalah bahasa pemrograman yang strongly typed. Kita tidak bisa tidak acuh terhadap tipe data. Kita harus mengetahui data seperti apa yang disimpan ke dalam variabel. Misalnya untuk menyimpan umur kita gunakan variabel yang bertipe Integral, karena umur hanya berupa angka bulat tanpa pecahan.

    Selain itu, Java juga bersifat statically typed. Maksudnya adalah setiap variabel harus dideklarasikan sebelum digunakan. Java akan mengecek tipe data pada compile-time.

    int i = 0;
    

    Tipe data primitif adalah tipe data standar yang tidak diturunkan dari objek manapun. Java memiliki 8 tipe data primitif, yaitu: byte, short, int, long, float, double, boolean, char. Berikut ini adalah pembahasan untuk masing-masing tipe data.

    1. boolean. Tipe data boolean adalah tipe data Logical, yang hanya memiliki 2 nilai literal, yaitu true dan false.

    boolean nilai = true;
    

    2. char. Tipe data char adalah tipe data Textual, yang merepresentasikan karakter unicode 16-bit. Nilai literalnya harus diapit dengan tanda petik tunggal (‘).

    char huruf = 'a';
    

    3. byte. Tipe data byte adalah tipe data Integral 8-bit. Memiliki rentang nilai antara -27 sampai 27 – 1 atau dari -128 sampai 127.

    byte angka = 100;
    

    4. short. Tipe data short adalah tipe data Integral 16-bit. Memiliki rentang nilai antara -215 sampai 215 – 1 atau dari -32768 sampai 32768.

    short angka = 1000;
    

    5. int. Tipe data int adalah tipe data Integral 32-bit. Memiliki rentang nilai antara -231 sampai 231 – 1 atau dari -2,147,483,648 sampai 2,147,483,647.

    int angka = 1000000;
    

    6. long. Tipe data long adalah tipe data Integral 64-bit. Memiliki rentang nilai antara -263 sampai 263 – 1 atau dari -9,223,372,036,854,775,808 sampai 9,223,372,036,854,775,807.
    Tipe data Integral (byte, short, int, long) memiliki default nilai literal int, kecuali diberi akhiran L yang berarti bertipe long. Tipe data Integral dapat menggunakan sistem bilangan desimal, oktal, atau heksadesimal.

    int desimal = 26; // angka 26 dalam desimal
    int oktal = 032; // angka 26 dalam oktal (diberi awalan 0)
    int heksa = 0x1a; // angka 26 dalam heksadesimal (diberi awalan 0x)
    long angkaBesar = 1000000000000L; // angka desimal bertipe long
    

    7. float. Tipe data float adalah tipe data Floating Point 32-bit. Nilai literalnya mengandung pecahan (dipisahkan dengan tanda titik ‘.’)

    float pi = 3.14F;
    

    8. double. Tipe data double adalah tipe data Floating Point 64-bit. Nilai literal default untuk float dan double adalah double, kecuali diberi akhiran F seperti pada contoh nomor 7 di atas.

    float pecahan = 7.65F;
    double pecahanDouble = 1.2345;
    

    Jika variabel float yang diinisialisasi dengan suatu nilai tanpa akhiran F, akan muncul pesan kesalahan: “possible loss of precision“.

    Nilai literal untuk Floating Point juga bisa menggunakan notasi E (10n).

    // ketiga variabel di bawah ini memiliki nilai yang sama 123.4
    float f1 = 123.4F;
    double d1 = 123.4;
    double d2 = 1.234E2;
    

    Sebenarnya tipe data primitif sudah memiliki nilai default pada saat dideklarasikan (meskipun tanpa inisialisasi), kecuali untuk variabel lokal. Nilai default untuk masing-masing tipe data adalah sebagai berikut:

    Tipe Data   Nilai Default
    --------------------------------------------------
    boolean     false
    char        '\u0000' (merepresentasikan ASCII null)
    byte        0
    short       0
    int         0
    long        0L
    float       0.0F
    double      0.0
    

    Pada variabel lokal, deklarasi tipe data harus disertai dengan inisialisasi. Jika tidak, pastikan untuk memberikan nilai kepada variabel tersebut sebelum digunakan. Mengakses lokal variabel tanpa inisialisasi akan menghasilkan pesan kesalahan pada saat meng-compile (compile-time error).

  • Mencari Nilai Maksimum Per Kategori SQL

    Salah satu masalah paling umum yang melibatkan query database adalah mencari nilai terbesar/terkecil pada tiap kategori/tipe. Sebagai contoh adalah mencari pencetak gol terbanyak pada masing-masing dari 4 klub teratas sepak bola Liga Inggris berikut ini.

    Nama                    Klub           Gol
    ------------------------------------------
    Sergio Agüero           Man City       23
    Edin Džeko              Man City       14
    Mario Balotelli         Man City       13
    Wayne Rooney	        Man United     27
    Javier Hernández        Man United     10
    Robin Van Persie        Arsenal        30
    Emmanuel Adebayor       Tottenham      17
    Jermain Defoe           Tottenham      11
    Rafael Van der Vaart    Tottenham      11
    

    Berikut ini adalah hasil yang diinginkan.

    Nama                    Klub           Gol
    ------------------------------------------
    Robin Van Persie        Arsenal        30
    Wayne Rooney	        Man United     27
    Sergio Agüero           Man City       23
    Emmanuel Adebayor       Tottenham      17
    

    Untuk menghasilkan keluaran seperti di atas, paling tidak kita membutuhkan dua langkah. Mencari jumlah gol yang diinginkan, kemudian tampilkan field lainnya berdasarkan gol yang sudah dicari tadi.

    Langkah pertama adalah mencari gol terbanyak pada masing-masing klub tanpa melihat siapa pencetak golnya.

    SELECT Klub, MAX(Gol) as maxGol 
    FROM `skorer` 
    GROUP BY Klub
    
    Klub           maxGol
    ---------------------
    Arsenal        30
    Man City       23
    Man United     27
    Tottenham      17
    

    Hasil bisa berbeda tergantung teknik penyortingan yang digunakan. Pada contoh di atas penyortingan menaik (ascending) berdasarkan field “Klub”.

    Langkah kedua adalah menampilkan field sisanya (Nama) dengan cara menggabungkan table hasil query pertama dengan table mula-mula (skorer).

    SELECT b.Nama, b.Klub, b.Gol
    FROM (
      SELECT Klub, MAX(Gol) AS maxGol
      FROM `skorer` 
      GROUP BY Klub
    ) AS a
    INNER JOIN `skorer` AS b ON 
      a.Klub = b.Klub AND a.maxGol = b.Gol
    
    Nama                    Klub           Gol
    ------------------------------------------
    Sergio Agüero           Man City       23
    Wayne Rooney	        Man United     27
    Robin Van Persie        Arsenal        30
    Emmanuel Adebayor       Tottenham      17
    

    Jika ingin diurutkan sesuai contoh, tinggal tambahkan ORDER BY Gol DESC pada akhir query.

    Sebenarnya ada query yang lebih singkat untuk menampilkan hasil seperti di atas, yaitu dengan menggunakan sub-query untuk mencari gol terbanyak pada masing-masing klub.

    SELECT * 
    FROM `skorer`
    WHERE Gol = (
      SELECT MAX(Gol) 
      FROM `skorer` AS a 
      WHERE a.Klub = skorer.Klub
    )
    
  • 5 Teknik Dasar HTML5 yang Wajib Anda Ketahui

    Dalam berbagai artikel dan contoh kode pada blog ini sudah diterapkan beberapa fitur baru yang ada di HTML5. Saat ini sebagian besar browser terbaru sudah mendukung fitur-fitur tersebut. Berikut ini adalah 5 teknik dasar HTML5 untuk membuat dokumen HTML Anda menjadi lebih singkat dan bersih.

    1. Penulisan doctype pada awal sebuah dokumen HTML yang lebih singkat dan sederhana.

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    

    Dulu, hampir tidak mungkin ada seorang web developer yang hafal di luar kepala kode untuk menuliskan doctype di atas. Sekarang Anda dapat menggantinya dengan doctype berikut ini.

    <!doctype html>
    

    Sederhana sekali dan tidak perlu menuliskannya dengan huruf besar seperti orang sedang marah.

    2. Penggunaan XML namespace dan atribut-atribut XML lain pada elemen html tidak diperlukan.

    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    

    Pada HTML5 cukup ditulis:

    <html lang="en">
    

    3. Pada HTML5 diperkenalkan cara baru untuk menyebutkan charset dokumen.

    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
    

    Pada HTML5 menjadi:

    <meta charset="utf-8">
    

    4. Pada HTML5 kita bisa menulis tag script, style, dan link tanpa atribut type="text/javascript" dan type="text/css".

    <script type="text/javascript">
      // kode javascript Anda di sini
    </script>
    

    Pada HTML5 cukup dituliskan seperti berikut:

    <script>
      // kode javascript Anda di sini
    </script>
    

    5. Dokumen HTML5 tetap valid tanpa adanya slash ‘/’ pada self closing tag.

    <img src="" alt="" />
    <br />
    

    Pada HTML5, tanda slash bisa dihilangkan.

    <img src="" alt="">
    <br>
    

    Itulah 5 teknik dasar untuk membuat sebuah dokumen HTML5 yang valid dan memiliki syntax yang kompatibel dengan HTML4 dan XHTML1. Jadi tidak ada salahnya untuk menggunakannya dalam setiap website yang kita buat. Seperti yang Anda lihat, HTML5 membuat kode menjadi lebih singkat dan bersih, sehingga menghasilkan ukuran file yang lebih kecil. Ukuran file yang lebih kecil akan membuat website menjadi lebih ringan untuk diakses.

  • Memahami SQL Join dengan Diagram Venn

    Query JOIN pada bahasa SQL berfungsi untuk menggabungkan data dari 2 atau lebih tabel dalam sebuah database. Syntax SQL mempunyai 4 tipe JOIN, yaitu: INNER, OUTER, LEFT, dan RIGHT.

    Diagram Venn adalah diagram yang menunjukan semua kemungkinan relasi logis antara sekelompok variabel yang berbeda. Di sekolah dasar, Diagram Venn dikenalkan pada saat mempelajari teori himpunan pada Matematika. Diagram Venn biasanya dilambangkan dengan 2 atau lebih lingkaran yang saling berpotongan (meskipun tidak harus selalu demikian).

    Misalkan kita mempunyai 2 buah tabel pada database, TabelA dan TabelB. TabelA di sebelah kiri dan TabelB di sebelah kanan. Kemudian kita akan mengisi masing-masing dengan 4 buah data.

    id nama       id  nama
    -- ----       --  ----
    1  Andik      1   Andik
    2  Binta      2   Bambi
    3  Carli      3   Conan
    4  Didut      4   Didut
    

    Sekarang kita coba gabungkan kedua tabel di atas menggunakan tipe-tipe JOIN yang ada.

    1. INNER JOIN

    SELECT * FROM TabelA INNER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id nama       id  nama
    -- ----       --  ----
    1  Andik      1   Andik
    4  Didut      4   Didut
    

    INNER JOIN hanya akan menampilkan data yang cocok satu sama lain (berpasangan) pada kedua tabel. Diagram Venn-nya adalah sebagai berikut.

    inner join

    2. OUTER JOIN
    Pada dasarnya OUTER JOIN dibagi menjadi 3, FULL OUTER JOIN, LEFT OUTER JOIN, dan RIGHT OUTER JOIN.

    2.a. FULL OUTER JOIN

    SELECT * FROM TabelA FULL OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id    nama       id    nama
    --    ----       --    ----
    1     Andik      1     Andik
    2     Binta      null  null
    3     Carli      null  null
    4     Didut      4     Didut
    null  null       2     Bambi
    null  null       3     Conan
    

    FULL OUTER JOIN menghasilkan semua data yang ditemukan dan cocok satu sama lain pada kedua tabel, jika ada yang tidak cocok, bagian yang tidak ada tersebut akan berisi null. Jadi bisa dikatakan FULL OUTER JOIN ini akan menampilkan semua data yang ada di kedua tabel termasuk yang tidak cocok satu sama lain. Diagram Venn-nya adalah sebagai berikut.

    full outer join

    2.b. LEFT OUTER JOIN

    SELECT * FROM TabelA LEFT OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    
    id    nama       id    nama
    --    ----       --    ----
    1     Andik      1     Andik
    2     Binta      null  null
    3     Carli      null  null
    4     Didut      4     Didut
    

    LEFT OUTER JOIN menghasilkan semua data yang ada pada TabelA (tabel sebelah kiri), dengan pasangannya (jika ada) pada TabelB (tabel sebelah kanan). Jika pasangannya tidak ditemukan, tabel sebelah kanan akan berisi null. Diagram Venn-nya adalah sebagai berikut.

    left outer join

    Lalu bagaimana jika kita menginginkan data yang hanya ada pada TabelA (tabel sebelah kiri)? Untuk itu kita membutuhkan bantuan klausa WHERE.

    2.c. LEFT OUTER JOIN dengan klausa WHERE

    SELECT * FROM TabelA LEFT OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    WHERE TabelB.id IS null
    
    id    nama       id    nama
    --    ----       --    ----
    2     Binta      null  null
    3     Carli      null  null
    

    Query LEFT OUTER JOIN di atas menghasilkan data yang hanya ada pada TabelA (tabel sebelah kiri). Diagram Venn-nya adalah sebagai berikut.

    left outer join where

    Untuk tipe RIGHT OUTER JOIN tidak perlu dijelaskan lagi karena hasilnya hanya kebalikan dari LEFT OUTER JOIN. Terakhir, ada satu bentuk diagram lagi, yaitu jika yang diinginkan hanya data yang tidak memiliki pasangan satu sama lain, alias data tersebut berada di luar bagian yang berpotongan.

    2.d. FULL OUTER JOIN dengan klausa WHERE

    SELECT * FROM TabelA FULL OUTER JOIN TabelB
    ON TabelA.nama = TabelB.nama
    WHERE TabelA.id IS null OR
    TabelB.id IS null
    
    id    nama       id    nama
    --    ----       --    ----
    2     Binta      null  null
    3     Carli      null  null
    null  null       2     Bambi
    null  null       3     Conan
    

    Query FULL OUTER JOIN di atas menghasilkan data yang unik (tidak ada yang berpasangan) dari TabelA dan TabelB. Diagram Venn-nya adalah sebagai berikut.

    full outer join where

    Artikel ini merupakan terjemahan bebas dari artikel yang ditulis oleh Jeff Atwood dengan ditambah penjelasan seperlunya.