Category: Troubleshooting

Penyelesaian masalah programming

  • Bug Y2K38 pada Fungsi date() PHP

    Agar tidak bertele-tele, coba saja kode PHP berikut ini.

    <?php
    echo date('l d F Y H:i:s', strtotime('2038-02-19 3:14:07'));
    

    Seperti yang kita tau, fungsi date() pada kode PHP di atas akan mengembalikan sebuah string waktu sesuai format ‘l d F Y H:i:s’. Harusnya pada browser akan tercetak:

    Friday 19 February 2038 03:14:07

    Namun jika waktu yang tercetak tidak seperti di atas, berarti aplikasi PHP Anda mempunyai kemungkinan terkena bug Y2K38.

    Apa yang dimaksud bug Y2K38? Y2K38 yang disebut juga sebagai Unix Millenium Bug, dapat mempengaruhi sistem yang menggunakan 32-bit signed integer untuk merepresentasikan waktu (hari, tanggal, bulan, tahun, jam, menit, dsb). Sebagai patokan awalnya adalah Kamis, 1 Januari 1970 00:00:00 UTC dan akan berakhir pada Selasa, 19 Januari 2038 03:14:07 UTC. Jika waktu sudah melewati 19 Januari 2038 03:14:07 UTC, akan terjadi integer overflow. Semua bit sudah terpakai, kecuali bit pertama yang tidak boleh digunakan karena sebagai signed bit (0 = positif, 1 = negatif).

    Kondisi signed bit yang diinkremen (ditambah dengan 1) selama proses perhitungan maju ini mengakibatkan nilainya mendadak berubah menjadi negatif, dalam kasus integer overflow ini nilainya menjadi negatif yang maksimum (angka paling kecil). Kemudian proses perhitungan maju berlanjut sampai negatif 0. Hal ini akan mengacaukan perhitungan waktu pada sistem. Gambar yang diambil dari Wikimedia ini menjelaskan dengan sempurna proses tersebut.

    Bug Y2K38

    Tahun 2038 masih lebih dari 20 tahun lagi, seharusnya masalah ini tidak perlu dikuatirkan. Pada tahun itu mungkin aplikasi yang Anda buat sekarang sudah usang dan tidak digunakan. Akan tetapi sebagai seorang programer yang baik sudah seharusnya memikirkan segala kemungkinan. Mungkin saja ada orang yang memakai kode yang Anda buat untuk aplikasi lain yang membutuhkan perhitungan waktu sampai 30 tahun ke depan.

    Menggunakan sistem 64-bit mungkin dapat menyelamatkan Anda, karena bagaimanapun juga 64-bit signed integer jauh lebih lebar jangkauannya dibanding 32-bit signed integer. Tapi saya belum pernah mencoba sejauh itu. Alternatif lain yang lebih mudah yaitu dengan menggunakan class PHP DateTime yang diperkenalkan mulai PHP versi 5.2.

    <?php
    $mydate = new DateTime('2038-02-19 3:14:07');
    echo $mydate -> format('l d F Y H:i:s');
    

    Dengan menggunakan DateTime aplikasi PHP tidak terkena bug Y2K38, karena mampu menangani waktu sampai pada 31 Desember 9999! Mungkin Anda berniat mewariskan kode ini untuk generasi berikutnya 😀

  • Troubleshooting “Unexpected T_ECHO” pada Operator Ternary

    Satu kesalahan yang kerap dijumpai pada penggunaan operator ternary adalah

    Unexpected T_ECHO

    Pesan kesalahan di atas akan muncul jika pada pernyataan kedua dan ketiga berisi perintah/eksekusi suatu pernyataan. Perhatikan contoh berikut:

    <?php
    $angka = 10;
    $angka % 2 === 0 ? echo "genap" : echo "ganjil";
    

    Pernyataan 2 dan 3 berisi perintah echo yang berfungsi mencetak tulisan “genap”/”ganjil” pada browser. Operator ternary tidak sepenuhnya identik dengan pernyataan if/else. Pada if/else kita dapat mengeksekusi suatu perintah, seperti yang ditunjukkan pada kode berikut:

    <?php
    $angka = 10;
    if ($angka % 2 === 0)
      echo "genap"
    
    else echo "ganjil";
    

    Berbeda dengan if/else, setelah kondisi dievaluasi, operator ternary harus mengembalikan suatu nilai dari pernyataan 2 atau 3. Nilai di sini bisa berupa string, number, atau boolean. Jika masih ingin menggunakan operator ternary, kode di atas harus diubah menjadi sebagai berikut:

    <?php
    $angka = 10;
    echo $angka % 2 === 0 ? "genap" : "ganjil";
    
  • Menangani Browser dengan JavaScript Disable

    JavaScript dibutuhkan pada hampir semua website modern. Tanpanya, maka sebuah website tidak akan berjalan sesuai keinginan. Namun apa yang harus dilakukan jika client men-disable dukungan terhadap JavaScript? Solusi yang paling sederhana adalah dengan memberikan peringatan pada client untuk mengizinkan browser menjalankan JavaScript.

    Pada sebuah dokumen HTML, JavaScript disisipkan di antara tag <script> dan </script>. Selain itu juga ada tag <noscript>, yang akan dijalankan pada saat JavaScript di-disable pada browser.

    <script>kode di dalam sini akan dieksekusi saat javascript enable</script>
    <noscript>kode di dalam sini akan dieksekusi saat javascript disable</noscript>
    

    Untuk menangani client yang men-disable JavaScript maka perlu me-redirect-nya ke sebuah halaman yang berisi peringatan untuk meng-enable JavaScript. Namun, bagaimana untuk me-redirect halaman tanpa menggunakan sebuah script? Yaitu dengan menggunakan HTML meta tag yang bernama meta refresh. Meta tag ini akan me-redirect user ke halaman lain dalam interval yang sudah ditentukan pada header.

    <noscript>
      <meta http-equiv="Refresh" content="1; url=warning.html">
    </noscript>
    

    Snippet yang ada di dalam tag <noscript> di atas adalah sebuah meta refresh yang menginstruksikan browser untuk me-refresh halaman website secara otomatis dalam interval yang sudah ditentukan dalam atribut content (dalam satuan detik). Atribut url berisi halaman yang dituju untuk menampilkan pesan peringatan.

  • Menghilangkan Versi WordPress dari Kode HTML

    Menghilangkan informasi tentang versi berapa WordPress yang digunakan adalah ide yang bagus. Adanya informasi yang menunjukan versi WordPress yang diinstal, dapat sedikit membantu hacker untuk menyelidiki kelemahan sebuah blog. Dengan sedikit trik, kita bisa menyembunyikan fakta bahwa WordPress yang diinstal bukan merupakan versi terbaru.

    Sebelumnya kita pelajari dulu bagaimana untuk melihat versi WordPress. Klik view source atau tekan ctrl + u untuk melihat kode html yang dihasilkan WordPress. Perhatikan ada

    <meta name="generator" content="WordPress 3.2.1" />

    Cara termudah yang disarankan untuk menghilangkan versi WordPress adalah dengan menginstal sebuah plugin. Namun trik berikut ini menurut saya lebih mudah, tanpa plugin. Edit dan tambahkan langsung di file function.php pada folder themes yang digunakan.

    remove_action('wp_head', 'wp_generator');

    Setelah ditambahkan sebaris kode di atas pada file function.php, coba kita periksa dengan mengklik view source pada browser. Jika generator meta tidak hilang, mungkin ditulis hard-coded di file header.php. Cari dan hapus kode di bawah ini:

    <meta name="generator" content="WordPress <?php bloginfo('version'); ?>" />

    Sebagai tambahan untuk trik yang pertama, dapat diganti menggunakan kode di bawah ini untuk menghapus semua generator meta versi WordPress, termasuk untuk menghapus tanda http://wordpress.org/?v=3.2.1 pada RSS feed. Bagi yang belum tau, tanda ini terletak pada source code RSS feed WordPress, pada bagian atas. Tanda ini tidak terhapus jika hanya menggunakan kode pada trik pertama di atas.

    function remove_version() {  
       return '';  
    }  
    add_filter('the_generator', 'remove_version');
    

    Terakhir, coba buka alamat blog Anda ditambah dengan readme.html (misal: http://blogsaya.com/readme.html). Halaman tersebut berisi deskripsi lengkap versi WordPress yang digunakan.
    readme version wordpress

    Saya rasa semua juga sudah tau, tinggal hapus saja file readme.html di direktori utama WordPress. Jika tidak ingin menghapusnya, cukup hapus nomor versi yang terletak di atas.

  • Mengatasi Masalah Undefined Index di PHP 5

    undefined index
    Bagi yang beralih dari PHP 4.x ke PHP 5.x mungkin pernah menjumpai peringatan seperti ini:

    Notice: Use of undefined constant mod – assumed ‘mod’ in /var/www/blogsaya/index.php on line 7

    atau seperti ini:

    Notice: Undefined index: mod in /var/www/blogsaya/index.php on line 7

    atau seperti ini:

    Notice: Undefined variable: mod in /var/www/blogsaya/index.php on line 8

    Ketiganya hanyalah pesan peringatan (notice), bukan kesalahan (error). Namun nampak tidak elegan jika pesan seperti itu muncul di halaman website kita. Untuk menyembunyikan pesan peringatan tersebut cukup dengan menambahkan sebaris kode berikut di bagian paling awal kode PHP.

    error_reporting(E_ALL ^ (E_NOTICE | E_WARNING));

    Kode tersebut hanya akan menyembunyikan semua pesan peringatan level Notice dan Warning yang muncul, pesan kesalahan yang lain, misal error, tetap muncul.

    Namun tentu saja menyembunyikan pesan peringatan bukan solusi yang baik. Notice message tersebut muncul karena penanganan register global di PHP 5.x yang sedikit berbeda dengan PHP 4.x, dan juga ada variable atau konstanta yang tidak diinisialisasi sebelum digunakan. Pelanggaran yang umum dalam bahasa pemrograman PHP tetapi penegakan hukumnya kurang ketat.

    Perhatikan contoh berikut:



    $_POST[‘mod’] ada isinya, maka $_POST['mod'] akan disalin ke $mod , jika tidak maka $mod akan berisi string kosong.

    Tulisan ini adalah kategori baru yang ingin saya catat di blog, yaitu tentang troubleshooting (penyelesaian masalah) dalam pemrograman. Troubleshooting adalah salah satu aspek paling penting dalam mempelajari bahasa pemrograman apapun.