Isnin, 9 September 2013

#71: Photoshop: Adding more sky

Gambar asal yang lebar dan tak tinggi.
Sebelah ini adalah satu foto yang ambe edit pada disember tahun lepas. Ambe telah crop gambar ni yang sepatutnya mengikut saiz standard menjadi gambar yang pendek tetapi lebar bagi memberikan perspektif panorama. Gambar ni ambe dok save pada kualiti tinggi kerana ambe edit ni bukan untuk sesuatu yang serius, tapi hanya untuk gilap semula teknik PS ambe yang dah berkarat. Langit ambe birukan dan ambe beri filter motion blur untuk memberikan efek pergerakan awan yang biasanya didapati dari long exposure photography. Ambe rasa gambar ni ok, tapi ada satu masaalah. Disebabkan gambar ni lebar tetapi pendek, bila ambe guna gambar ni untuk dimasukkan dalam slide Power Point, ia nampak sangat kecil. Bila ambe resize height jadi lebih tinggi, kelebaran gambar ni dah melebihi slide Power Point. Jadi, ambe takde pilihan lain, ambe kena adjust gambar ni menjadi lebih tinggi untuk menjadikan lebar dan tinggi gambar ni lebih seimbang.

Ideanya adalah untuk menambah bahagian langit menjadi lebih besar. Details bangunan sangat susah untuk dibuat. Jadi saya mengambil jalan mudah dengan membina langit lebih luas. Dengan menggunakan Photoshop CS2 Pertama sekali ambe resize canvas menjadi lebih besar di bahagian langit dan ruang kosong canvas ambe kenakan filter Clouds yang boleh diakses dari Filter > Render > Clouds. Ambe gunakan sample warna awan yang sedia ada iaitu biru gelap dan biru cerah untuk render awan ini. Lepas tu ambe kenakan pula Gaussian Blur yang kuat di awan yang baru render ini diikuti dengan Motion Blur. Angle Motion Blur adalah berpandukan angle Motion Blur sebelum ini. Gabungan tool Dodge dan Burn, ambe cuba berikan efek awan yang berlopong-lopong memberikan kesan awan yang lebih realistik. Smudge tool juga digunakan untuk memberikan distortion pada aliran pergerakan awan dan ini hasilnya:
Hasilnya, gambar dengan lebar dan tinggi yang lebih seimbang.

Rabu, 10 Julai 2013

#70: Using Nikkor and other lens on Canon EF/EF-S camera!

Canon EF-S 18-55mm f/3.5-5.6 IS
Lens kamera DSLR moden sangat mahal? Saya juga sebagai penggemar fotografi menghadapi masaalah bajet seperti kebanyakan penggemar fotografi lain. Pada waktu awal saya mula berjinak-jinak dengan fotografi beberapa tahun lepas, saya hanya menggunakan kamera SLR filem kerana tidak mampu untuk memiliki kamera DSLR kerana harganya yang mahal. Bila kewangan saya lebih stabil, saya mula mendapatkan sebuah used DSLR model Canon 40D yang datang bersama kitlens (Canon EF-S 18-55mm f/3.5-5.6 IS). Ia adalah kitlens yang ok dan mempunyai focal range yang bagus untuk wide dan potrait. Ia ada fungsi IS iaitu Image Stabilizer. Ia juga agak sharp jika menggunakan aperture yang lebih kecil. Tetapi, fotografi menggunakan kitlens menghasilkan foto yang lame dan tidak ada apa-apa yang menarik. Hasilnya lebih kurang sahaja seperti foto yang shoot menggunakan kamera compact. Sebelum memiliki kamera DSLR, saya menggunakan SLR filem model Nikon F3. Saya ada memiliki beberapa lens yang digunakan bersama kamera Nikon F3 ini antaranya Nikkor 85mm f/1.8 dan Nippon Kogaku Nikkor-S 50mm f/1.4. Saya suka hasil dari lens lama Nippon Kogaku kerana walaupun ia lens yang dah berumur puluhan tahun, tapi optiknya bagus dan mempunyai aperture f/1.4. Dengan aperture f/1.4 saya boleh mendapatkan foto dengan DOF (depth of field) yang shallow menjadikan hasilnya lebih "dramatik" dan boleh seperate main subject dengan latar belakang.

Shallow depth of field. Shot using Nikkor 85mm f/1.8 shot using Nikon F90X
Alangkah bagusnya kalau Nikon, Canon dan pengeluar kamera lain berkongsi satu mount yang sama. Ini kerana, dengan adanya mount yang berbeza menyebabkan pengguna kamera lain tidak boleh menggunakan lens dari pengeluar kamera jenama lain. Nikon tak boleh guna lens Canon. Canon tak boleh guna lens dari Olympus. Leica tak boleh guna lens Nikon. Olympus tak boleh mount semua lens dari Nikon, Canon dan Leica. Semuanya mempunyai mount sendiri. Ia seperti satu kunci untuk pintu. Jika lekok-lekok dan diameter pada belakang lens tidak menyamai lekok-lekok dan diameter pada kamera, maka lens itu tak dapat dipasang pada kamera tersebut. Bukan hanya mengenai lekok-lekok dan diameter pada mount kamera dan lens, sesetengah kamera juga meletakkan chip, enjin servo dan level didalam kamera atau didalam lens untuk fungsi autofocus, pengawalan aperture dan data-data mengenai lens (informasi untuk data EXIF). Fungsi-fungsi ini memerlukan physical contact antara kamera dan lens secara eletronik atau mekanikal.

Shot using an old Nippon Kogaku 50mm f/1.4 lens mounted on my Canon 40D. Aquaria Kuala Lumpur.
Shot using an old Nippon Kogaku 50mm f/1.4 lens mounted on my Canon 40D. National Zoo.
Shot using an old Nippon Kogaku 50mm f/1.4 lens mounted on my Canon 40D. Danga Bay, Johor Bahru.
Saya bernasib baik kerana saya tak bersendirian kerana masaalah ini sebenarnya dikongsi ramai orang di seluruh dunia. Oleh sebab ini ramai orang mencari jalan untuk menyelesaikan masaalah ini. Ada cara yang susah dan senang. Ada orang menggantikan besi pada mount lens dengan mount yang boleh dipadankan dengan kamera. Ada juga yang menggunakan adapter yang dipasang pada lens yang menukar mount asal kepada mount yang dikehendaki. Saya pilih untuk menggunakan adapter kerana ia mudah dan murah serta tidak melibatkan modification pada lens.

Nikon lens to Canon lens adapter.
Sebuah kamera Canon dengan lens Zuiko OM Mount.
Sebelah ini adalah rupa adapter untuk membolehkan lens Nikon dipasang pada kamera Canon EF dan EF-S. Ia dipasang pada belakang lens Nikon dimana adapter ini mempunyai mount sama seperti pada kamera SLR Nikon (Nikon-F Mount) dan sebelah lagi sama seperti mount lens Canon EF. Adapter disebelah ini adalah lebih istimewa kerana ia mempunyai "chip" yang menyimpan data-data mengenai lens. Dengan adanya chip ini, ia membenarkan kamera Canon untuk membuat pengiraan exposure supaya fungsi-fungsi Aperture Priority dan mode-mode lain boleh digunakan. Tanpa chip ini, anda mungkin hanya boleh menggunakan Manual exposure. Untung bagi pengguna kamera Canon EF dan EF-S kerana terdapat banyak adapter seperti ini untuk kamera Canon EF dan EF-S tetapi hanya terdapat sebilangan kecil sahaja adapter seperti ini untuk kamera Nikon kerana Nikon-F Mount mempunyai flange focal distance yang lebih panjang. Untuk pengguna kamera mirrorless anda lebih bernasib baik kerana kamera anda mempunyai flange focal distance yang lebih pendek berbanding DSLR bermakna kamera anda akan mempunyai lebih banyak adapter untuk berbagai lens yang direka untuk kamera dengan flange focal distance yang lebih panjang. Untuk lebih lanjut mengenai flange focal distance, bolehlah baca mengenai flange focal distance di wikipedia. Dengan adanya adapter seperti ini, makan lens-lens lama antaranya dari Nikon, Zuiko, Pentax dan lain-lain boleh digunakan semula. Terdapat banyak lens-lens hebat dikeluarkan oleh pengeluar-pengeluar kamera utama ini, sayangnya akibat ditelan zaman, ia dilupakan. Amat sayang jika lens profesional yang bagus-bagus seperti lens yang beraperture besar seperti lens 50mm f/1.4, 50mm f/1.2, 85mm f/1.8 dan lain-lain dibiarkan sebagai perhiasan sahaja kerana tak dapat digunakan dengan kamera moden. Dapatkanlah adapter seperti ini untuk kamera anda dan tunjukkanlah appreciation anda kepada lens-lens yang bagus yang semakin ditelan zaman.

Terdapat banyak adapter dijual di online store dengan harga yang berpatutan.

Isnin, 8 Julai 2013

#69: Freelensing to Infinity and Beyond (Melensa Percuma)

Freelensing. A visual guide
Lama saya dok menyentuh tentang fotografi. Sebelum ini saya sangat aktif dalam bidang fotografi, malangnya akhir-akhir ini saya kekurangan masa semenjak kelahiran anak sulung saya. Skill ambe pun dah makin berkarat, jadi sebelum ambe kehilangan semua yang ambe tahu tentang fotografi, ambe dokumenkan disini supaya benda ni manalah tahu boleh menjadi bahan yang berguna kepada sesetengah orang. Okeh, hari ini ambe nok sebut tentang "freelensing" atau ambe panggil "melensa percuma".

Freelensing. Pertama kali ambe mendengar tentang ini adalah melalui seorang kawan baik ambe yang dikenali sebagai Apin atau lebih popular dengan nama Norah Zain. Pada waktu itu ambe sangat obses dengan foto-foto yang mempunyai bokeh dan LOMO. Pada waktu itu ambe menggunakan gear Canon 40D bersama lens Nikkor dan Zuiko (ambe menggunakan adapter untuk mount lens Nikkor dan Zuiko kepada Canon 40D). Diceritakan kepada ambe, ada satu teknik fotografi dimana lens dicabut dari body kamera dan lens dipegang dengan tangan didepan kamera sambil lens itu dipusing-pusing atau dicondongkan kearah-arah tertentu. Teknik ni agak susah untuk dicontrol kerana hanya menggunakan tangan (sangat tidak stabil) dan teknik ini akan menjadikan depth of field sangat sempit (hampir seperti macro photography). Teruja dengan penerangan dari rakan saya ini, saya terus mencari maklumat tentang teknik ini dan mencubanya pada kamera Canon 40D saya.

Memang amat susah untuk mengawal lens dengan hanya memegang dengan tangan yang lepas diudara. Lebih merumitkan lagi, depth of field yang sangat sempit menjadikan teknik freelensing hampir mustahil boleh menghasilkan foto yang baik. Ambe kecewa. Sepatutnya foto yang dihasilkan adalah bagus, penuh bokeh, ala tilt-shift, tetapi apa yang ambe dapat hanyalah foto gelap tak ada fokus dan hanya foto blur semata-mata.

Melensa Percuma, freelensing to infinity and beyond!
Pada suatu petang, sewaktu ambe sedang melepak di ruang tamu rumah ambe, ambe ada "mengelamun" tentang dalaman kamera. Tentang pergerakan cahaya, dari luar, memasuki lens dan jatuh ke atas filem/sensor kamera. Tentang pergerakan lens bila diputar dimana lens akan bergerak kedepan dan kebelakang. Tentang  extension tube untuk macro photography sehingga ambe membuat satu kesimpulan, bila lens berada jauh daripada sesor/filem, ia depth of field akan makin sempit dan focusing lens adalah makin dekat. Bila lens berada dekat dengan filem/sensor, depth of field menjadi lebih besar dan focusing lens ke infinity boleh dicapai. Ambe dapati semua ini berkaitan (lens bergerak depan belakang bila focus, extension tube etc) Wikipedia menjadi rujukan ambe dan ada satu artikel mengenai "flange distance" iaitu jarak antara lens dan permukaan sensor/filem membenarkan perkara ini. Ambe akhirnya dapat relate teknik freelensing yang memerlukan lens dicabut dari kamera memberi foto yang sangat blur. Ia secara teknikalnya adalah seperti menggunakan extension tube. Ambe akhirnya dapat focus pada objek yang sangat dekat dengan teknik freelensing. Untuk lebih memudahkan teknik ini, lens mestilah diletakkan pada focus "infinity". Be extra careful, kerana bila anda pulas lens kepada infinity, glass belakang lens mungkin akan exposed dan berisiko untuk tercalar.

My Reverse-Freelensing Prototype.
Gambaran tentang freelensing bolehlah dibayangkan seperti foto disebelah, iaitu "reverse freelensing prototype". Bagaimana cahaya dengan garisah hijau memasuki lens dan terpancar pada permukaan filem yang tidak rata (dalam kes ini, sebelah tinggi dan sebelah rendah) yang menghasilkan foto potrait sebelah blur dan sebelah lagi sharp. Dalam kes freelensing, permukaan filem/sensor adalah rata, tetapi lens dicondongkan yang akan menghasilkan efek yang sama.

Masih terdapat satu masaalah mengenai freelensing ini, dimana, bila lens sudah tidak di mount pada kamera, untuk fokus pada infinity adalah sesuatu yang mustahil. Infinity boleh dicapai dengan membawa lens dekat pada lens dan mencabut lens dari mount akan menambah jarak lens dengan permukaan filem/sensor. Ini menjadikan freelensing seakan hanya sesuai untuk sekadar macro photography.

Walaubagaimanapun, secara tidak sengaja, ambe telah terjumpa satu cara untuk membolehkan freelensing untuk focus jarak dekat untuk macro photography dan juga membolehkan freelensing untuk focus kepada infinity dan secara teorinya menlangkaui infinity (theoretically infinity and beyond!).

Ambe secara tak sengaja telah berjaya focus ke infinity sewaktu mencuba lens-lens lama (lens Nippon Kogaku dan Zuiko) pada body kamera Canon 40D. Saya selalu menggunakan lens-lens lama pada kamera saya ini kerana lens-lens lama yang berkualiti masih dapat menghasilkan imej yang cantik. Untuk mount lens-lens lama ini, saya memerlukan satu adapter untuk convert mount lens Nikkor atau Zuiko pada badan kamera canon dengan mount EF-S. Adapter ini adalah berbentuk bulatan dengan ketebalan 3-4mm untuk membolehkan lens Nikkor/Zuiko focus kepada infinity pada body kamera EF-S. Ketebalan adapter ini adalah bergantung kepada perbezaan flange focal distance pada kamera Nikon dan Olympus kepada body kamera Canon EF-S.

Flange focal distance
Terdapat satu artikel di wikipedia mengenai Flange focal distance yang menerangkan tentang jarak lens dengan permukaan sensor/filem. Setiap jenis/jenama kamera mempunyai flange focal distance sendiri yang menjadikan setiap jenama kamera unik. Kamera DSLR/SLR mempunyai flange focal length yang lebih panjang berbanding dengan kamera jenis mirrorless kerana kamera mirrorless tidak ada cermin pemantul untuk viewfinder. Kamera SLR medium format pula mempunyai flange focal distance yang sangat panjang kerana cermin pemantulnya sangat besar.

Secara teknikalnya, jika sesebuah kamera mempunyai flange focal distance yang pendek, kamera tersebut boleh menggunakan lens untuk kamera yang mempunyai flange focal distance yang panjang. Contohnya jika sebuah kamera jenis Sony E-Mount dengan flange focal distance 18mm, ia boleh dipasang dengan lens kamera Nikon kerana kamera DSLR Nikon-F Mount mempunyai 46.5mm dengan syarat adapter perlu dipasang pada kamera Sony E-Mount untuk memegang lens Nikon-F Mount pada jarak 28.5mm dari mount kamera Sony E-Mount (46.5mm-18mm=28.5mm). Bila adapter ini dipasang, lens Nikon-F Mount ini akan boleh focus pada infinity kerana lens Nikon-F Mount yang direka untuk flange focal distance 46.5mm dapat mencapai jarak 46.5mm dengan perantara adapter berketebalan 28.5mm.

Memandangkan freelensing akan menyebabkan jarak lens dengan sensor/filem akan terlebih, oleh sebab itu lens tersebut tidak akan boleh fokus ke infinity. Penyelesaian yang ambe temui, untuk membolehkan freelensing dilakukan ke infinity, anda mestilah menggunakan lens yang direka untuk kamera yang mempunyai flange focal distance yang panjang! Contohnya, menggunakan lens Nikon-F pada kamera Canon EF-S. Inilah yang saya temui secara tak sengaja, bila saya cuba melakukan freelensing dengan menggunakan lens Nikkor Nikon-F Mount dan lens Zuiko OM Mount secara terus tanpa menggunakan adapter, ambe akhirnya mampu focus kepada infinity dengan teknik freelensing! Bukan sahaja focus kepada infinity, tapi sebenarnya ambe berjaya focus kepada infinity and BEYOND (kerana secara teorinya ambe telah focus melebihi infinity kerana ambe boleh gerakkan lens lebih dekat kepada sensor/filem melebihi had yang ditetapkan). Untuk rujukan anda, jadual di bawah ini adalah flange focal distance dari beberapa jenis mount kamera:
Flange focal distance
Secara kesimpulannya, jika anda mahu focus ke infinity (and beyond) dengan teknik freelensing, gunakanlah lens yang berbeza jenama dengan kamera anda. Lens Nikkor dan body kamera Canon EF-S menjadi pasangan yang baik untuk ambe buat freelensing. Dengan beza flange focal distance 28.5mm memberi ruang yang selesa untuk ambe control focusing dan memegang lens. Dengan teknik yang saya namakan "Melensa Percuma" ini saya mampu mengawal freelensing dengan baik dan focus ke infinity... And beyond!

Hasil "Melensa Percuma", a modified freelensing technique. Focus ke infinity, bahagian lain masih dengan bokeh!

Rabu, 3 Julai 2013

#68: New Cloud Storage!

Simpan file dalam awan?
Sewaktu belum adannya teknologi cloudstorage ini, untuk menyimpan file secara online saya selalu menyimpan dengan cara draft email. Maksud saya, dengan menggunakan storage email (gmail menyediakan beberapa GB storage untuk email). File diattach kepada email dan bila file sudah siap diupload, saya hanya tekan "Save" untuk save email bersama file yang di attached ke dalam draft email. Untuk download semula, saya perlu buka email draft tadi dan download attachment email tersebut.

Tapi ini adalah cara yang tidak propper untuk menyimpan file. Cara yang lebih propper untuk menyimpan file adalah seperti menggunakan FTP dimana FTP mempunyai sistem hierarki file sepertimana yang ada pada filesystem windows dan unix (file disimpan dalam folder etc). Masa berganti masa, sistem FTP juga jarang digunakan di zaman moden ini, ramai lebih memilih untuk user interface yang lebih mesra pengguna. Banyak syarikat berlumba-lumba memberi perkhidmatan yang terbaik dan tak ketinggalan dalam menyediakan perkhidmatan penyimpanan file secara online. Antara yang paling terkenal adalah DropBox yang menyediakan perkhidmatan sehingga 2GB storage secara percuma. 2GB adalah satu kapasiti yang sangat besar pada waktu itu (komputer pertama saya hanya ada hard disk 400MB).

Dari mana google dapat hardisk space?
Persaingan makin menjadi-jadi akhir-akhir ini. Saya fikir langkah pertama yang membuatkan persaingan "storage besar" ini bermula dengan google memperkenalkan GMail dengan storage 1GB. Saya masih ingat pada waktu launching GMail, satu dunia tak percaya yang Google boleh menyediakan storage 1GB untuk berjuta-juta pelanggannya sehingga ada orang berlawak mengatakan Google telah menggunakan kerak bumi sebagai hard disk LOL!

Terbaru, flickr dengan wajah baru, telah pergi lebih ekstrim dengan memperkenalkan storage 1 TB kepada setiap penggunanya (1024 kali ganda lebih banyak dari GMail!) tetapi hanya terhad untuk penyimpanan foto-foto sahaja.

Saya tidak memilih untuk stick pada satu perkhimatan sahaja kerana semua persaingan antara pemberi perkhidmatan storage ini akan menguntungkan pengguna dalam apa cara pun. Kalau DropBox masih mengekalkan free storage hanya pada 2GB, saya akan beralih pada perkhidmatan baru yang memberikan lebih storage secara percuma.

Saya baru sahaja find out mengenai satu penyedia cloudstorage baru iaitu Copy yang boleh dicapai melalui www.copy.com yang mana Copy menyediakan storage sebanyak 15GB secara percuma. Ia baru sahaja dilancarkan dan ada melakukan promosi storage tambahan bagi pengguna Copy yang mengajak rakannya untuk mendaftar akaun baru di Copy. So far so good, saya menyukai interface di Copy yang simple dan minimal. Terdapat desktop client disediakan untuk sistem operasi Windows, Mac OSX 10.7+ dan Linux.

This is how we browse file in Copy.com
CopyAgent, a Copy client on Linux.

Ahad, 23 Jun 2013

#67: Prettify - Syntax highlighting of source code snippets in an html page

Emacs with syntax highlighting
Google Code Prettify adalah satu projek di google code yang boleh dicapai di link ini. Saya baru sahaja memasukkan skrip Prettify pada blog ini untuk membantu saya untuk highlight source code yang saya masukkan kedalam blog ini. Ia boleh mengenal dan melakukan syntax highlighter untuk beberapa bahasa seperti termasuk C and friends, Java, Python, Bash, SQL, HTML, XML, CSS, Javascript, Makefiles, dan Rust. It works passably on Ruby, PHP, VB, and Awk and a decent subset of Perl and Ruby. Ada beberapa lagi programming language yang boleh di support dengan menggunakan extension iaitu Apollo, Basic, Clojure, CSS, Dart, Erlang, Go, Haskell, Lisp, Scheme, Llvm, Lua, Matlab, MLs:F#, Ocaml,SML, Mumps, Nemerle, Pascal, Protocol buffers, R, S, RD, Scala, SQL, TCL, Latek, Visual Basic, CHDL, Wiki, XQ dan YAML. Cara untuk install script ini adalah amat mudah. Hanya perlu load script ini dengan menambahkan line <script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?autoload=true"></script> pada bahagian atas page (samaada di dalam <head> atau di permulaan <body>) dan ia sudah sedia untuk digunakan!

VIM pun ada syntax highlight
Untuk memasukkan snippet source code dengan syntax highlighter ini, anda perlu masukkannya diantara tag <pre class="prettyprint"> dan </pre>. Anda tak perlu memberitahu apakah language yang anda guna untuk pemilihan syntax highlighter kerana script ini akan cuba meneka secara automatik kod apakah yang anda gunakan. Tapi jika anda mahu lebih pasti (kerana bimbang script ini akan salah meneka kod anda, anda bolehlah tambahkan "language hint" pada bahagian class (contohnya <pre class="prettyprint lang-scm">. Untuk mengetahui lebih lanjut tentang ini, sila navigate ke link ini). Terdapat beberapa theme/skin yang boleh dipilih. Theme kesukaan saya adalah "Sunburst" kerana ia berlatarbelakang hitam seperti pada terminal dan mempunyai syntax highliter dengan warna yang lembut. Untuk menetapkan skin/theme pilihan anda, anda boleh specify pilihan anda dengan menambah ?skin=[skin pilihan anda] (contohnya ?skin=sunburst) pada akhir src dalam barisan load script tadi (jika anda memilih skin sunburst, maka <script src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js?autoload=true&skin=sunburst"></script>).

Ini adalah beberapa contoh source code snippets yang saya masukkan untuk tujuan demonstrasi script syntax highlighter ini. Saya tidak meletakkan "language hints" pada class kerana script ini mampu meneka apakah kod yang ia sedang proses. Ini adalah contoh dalam source code dalam bash, python, C dan HTML.

#!/bin/bash

# Fibonacci numbers
# Writes an infinite series to stdout, one entry per line
function fib() {
  local a=1
  local b=1
  while true ; do
    echo $a
    local tmp=$a
    a=$(( $a + $b ))
    b=$tmp
  done
}

# output the 10th element of the series and halt
fib | head -10 | tail -1

#!/usr/bin/python2.4

def fib():
  '''
  a generator that produces the elements of the fibonacci series
  '''

  a = 1
  b = 1
  while True:
    a, b = a + b, a
    yield a

def nth(series, n):
  '''
  returns the nth element of a series,
  consuming the earlier elements of the series
  '''

  for x in series:
    n = n - 1
    if n <= 0: return x

print nth(fib(), 10)

#include <stdio.h>

/* the n-th fibonacci number.
 */
unsigned int fib(unsigned int n) {
  unsigned int a = 1, b = 1;
  unsigned int tmp;
  while (--n >= 0) {
    tmp = a;
    a += b;
    b = tmp;
  }
  return a;
}

main() {
  printf("%u", fib(10));
}

<html>
  <head>
    <title>Fibonacci number</title>
    <style><!-- BODY { text-decoration: blink } --></style>
    <script src="foo.js"></script>
    <script src="bar.js"></script>
  </head>
  <body>
    <noscript>
      <dl>
        <dt>Fibonacci numbers</dt>
        <dd>1</dd>
        <dd>1</dd>
        <dd>2</dd>
        <dd>3</dd>
        <dd>5</dd>
        <dd>8</dd>
        &hellip;
      </dl>
    </noscript>

    <script type="text/javascript"><!--
function fib(n) {
  var a = 1, b = 1;
  var tmp;
  while (--n >= 0) {
    tmp = a;
    a += b;
    b = tmp;
  }
  return a;
}

document.writeln(fib(10));
// -->
    </script>
  </body>
</html>

#66: Static IP using freedns.afraid.org

IP saya berubah-ubah setiap kali saya memulakan sambungan baru ke ISP saya. Ini dipanggil Dynamic IP. Contohnya, IP saya sekarang adalah 111.212.122.121, selepas saya memutuskan sambungan dan sambung semula, bila periksa kembali IP saya menjadi 214.253.241.110 dan bila putus dan sambung kembali ke ISP, ia akan berubah lagi ke IP lain. Ia sangat random dan ditentukan oleh ISP saya sendiri. Tiada algorithm untuk meneka nombor IP seterusnya, jadi bagi sesiapa yang perlu tahu IP mereka sendiri, ia adalah menjadi satu masaalah yang rumit. Bayangkan, kalau anda mahu ke google.com dan instead hanya perlu taip "google.com" di address bar, anda perlu menaip 74.125.135.100 untuk ke google. Dan bila google menukar IP kepada nombor lain, anda tidak lagi dapat mengakses google di 74.125.135.100. Anda akan terkial-kial untuk meneka apakah nombor IP terbaru google.com. Berbanding menggunakan Static IP, bila anda taip "google.com" di address bar, anda akan dapat akses google walau apa pun IP google yang terbaru. "google.com" mungkin buat masa sekarang akan mengakses 74.125.135.100 dan bila google telah mengubah IP kepada 56.112.65.121, bila anda akses google.com, ia akan terus di redirect ke IP google terbaru 56.112.65.121.

Terdapat banyak perkhidmatan penyedia static IP di luar sana, tetapi kebanyakannya adalah berbayar. Bayaran biasanya tidaklah mahal, kebiasaannya dalam lingkungan $30 untuk setahun. Saya recommend anda diluar sana untuk menggunakan perkhidmatan IP berbayar kerana anda biasanya boleh memilih domain anda sendiri seperti google.com (anda boleh memilih domain anda sendiri "yournamehere.com", "nasi-ambeng.com", "pecel-lele.com" dan lain-lain). Tetapi jika anda perlukan IP untuk kerja-kerja biasa yang tidak serius, tak perlulah keluarkan wang untuk dapatkan static IP kerana ada beberapa servis yang boleh menyediakan anda static IP secara percuma. Anda boleh mempunyai static IP dengan menjadi sub-domain untuk domain lain. Instead mempunyai domain sendiri e.g "yournamehere.com", anda boleh mendapat sub-domain seperti "yournamehere.company.com". Ini sudah cukup bagus untuk kerja-kerja yang simple dan tidak serius (saya amat recommend anda untuk menggunakan domain sendiri untuk kerja-kerja serius dan commercial).

Add new account at freedns.afraid.org
Salah satu penyedia Static IP percuma adalah boleh didapati di laman web freedns.afraid.org. Saya sendiri telah berdaftar di lawan ini kerana ia mempunyai banyak domain yang saya boleh pilih untuk menjadi sub-domainnya. Antaranya adalah jumpingcrab.com, chickenkiller.com, crabdance.com, mooo.com, strangled.net dan beberapa lagi domain dengan nama yang teruk. Ya, nama yang teruk sebagai hukuman anda tidak menggunakan domain berbayar LOL! Tapi bagi saya tak apalah kerana hasrat untuk mendapat static IP sendiri tercapai walau menggunakan nama domain yang teruk. 

Sign-up di laman freedns.afraid.org adalah percuma. Bila anda sudah selesai mendaftar, bolehlah anda buat satu subdomain baru dengan klik "Subdomains" di menu sebelah kiri laman. Untuk saya, saya telah memilih domain mooo.com kerana ia adalah yang paling pendek. Terpulanglah anda nak pilih yang mana satu. LOL! Untuk Type, saya memilih "A". Taip pada ruang "Subdomain" bagi subdomain mengikut kehendak anda (dimana static IP anda adalah "[subdomain].mooo.com"). Di ruang "Destination" adalah ruang untuk anda letakkan IP komputer anda (tak tahu IP sendiri? periksa IP komputer anda di http://checkip.dyndns.com/). Klik "Save!" dan taniah, anda telah mempunyai static IP anda sendiri yang beralamatkan nombor IP komputer anda (nombor IP komputer anda "untuk masa sekarang". Ingat, IP boleh berubah-ubah setiap kali disambung ISP). 

Anda sekarang sudah boleh cuba ping static IP anda dan boleh lihat ia mengeluarkan IP komputer anda seperti contoh dibawah, ping bibubibu.mooo.com akan mengeluarkan IP 183.171.169.157 (seperti yang di isi di ruang "Destination" sewaktu register subdomain tadi).
mrharmonies@harmonium ~ $ ping bibubibu.mooo.com
PING bibubibu.mooo.com (183.171.169.157) 56(84) bytes of data.
64 bytes from 183.171.169.157: icmp_req=1 ttl=55 time=301 ms
64 bytes from 183.171.169.157: icmp_req=2 ttl=55 time=349 ms
64 bytes from 183.171.169.157: icmp_req=3 ttl=55 time=285 ms
Anda tentu gembira kerana bibubibu.mooo.com sekarang telah di redirect ke IP komputer anda. Sekarang anda boleh run apache di komputer rumah anda dan anda boleh lihat laman localhost anda di internet dengan mengakses bibubibu.mooo.com.

Tetapi, apa akan jadi kalau IP komputer anda sekarang telah bertukar? Jika bibubibu.mooo.com sekarang pointing kepada 183.171.169.157, ia akan tetap terus point ke IP 183.171.169.157 itu walaupun IP anda terlah bertukar ke nombor IP baru. Contohnya jika IP anda sekarang adalah 22.112.231.224, bila anda melakukan ping kepada bibubibu.mooo.com, output ping adalah masih pada 183.171.169.157. Ini bukanlah apa yang kita mahukan kerana sepatutnya bibubibu.mooo.com sekarang pointing ke IP baru anda sekarang iaitu 22.112.231.224.

Jadi, untuk update bibubibu.mooo.com yang hanya point 183.171.169.157 setiap masa kepada bibubibu.mooo.com yang akan sentiasa point kepada IP terkini anda, ia memerlukan sedikit workaround (walaubagaimanapun, ia amat senang dengan freedns.afraid.org). Logon ke akaun freedns.afraid.org anda dan navigate ke menu "Dynamic DNS". Di laman ini, anda boleh lihat di bahagian bawah page terdapat ruang yang menglistkan subdomain yang telah anda buat tadi (dynamic update candidates). Disitu anda dapat lihat ada 4 link yang terdiri dari "Direct URL", "Wget Script", "Curl Script", "Edit Record". Ini adalah beberapa cara untuk update IP anda untuk diassign pada subdomain anda tadi. Jika tadi bibubibu.mooo.com point kepada 183.171.169.157 sedangkan IP anda sekarang adalah 156.112.213.128, bila anda klik link "Direct URL", secara automatik freedns.afraid.org akan update bibubibu.mooo.com kepada 156.112.213.128. Anda boleh cuba ping semula untuk kepastian:
mrharmonies@harmonium ~ $ ping bibubibu.mooo.com
PING bibubibu.mooo.com (156.112.213.128) 56(84) bytes of data.
64 bytes from 156.112.213.128: icmp_req=1 ttl=55 time=301 ms
64 bytes from 156.112.213.128: icmp_req=2 ttl=55 time=349 ms
64 bytes from 156.112.213.128: icmp_req=3 ttl=55 time=285 ms
Nah! bibubibu.mooo.com sekarang telah point ke IP terbaru anda! Setiap kali IP anda berubah, hanya perlu klik link "Direct URL" tadi untuk update (yang sebenarnya membawa kepada masaalah lain). Adakah anda mampu untuk klik link "Direct URL" setiap kali IP anda berubah?

Disinilah "Wget Script" dan "Curl Script" berguna! Download salah satu file ini dan pastikan komputer anda ada aplikasi wget atau curl kerana 2 skrip ini adalah DOS batch script yang akan execute wget atau curl setiap 10 minit untuk update subdomain anda tadi. Saya sebagai pengguna Linux hanya perlu tambahkan cron job untuk setiap 10 minit:
*/10 * * * * wget -q -N --read-timeout=0.0 --waitretry=5 --tries=400 http://freedns.afraid.org/dynamic/update.php?ABC123abc123qwerty789QWERTY789== > /dev/null

Rabu, 19 Jun 2013

#65: OpenWrt, USB 3G Modem and MicroSD

Ruang untuk SimCard dan MicroSD card pada kebanyakan modem 3G
Modem 3G yang saya gunakan bersama router TP-Link TL-MR3420 adalah model ZTE MF180. Ia adalah modem 3G dwi fungsi yang mana ia boleh menjadi modem untuk servis 3G dan juga storage device bila kad MicroSD dimasukkan kedalamnya. Ia adalah fungsi yang baik kerana modem saya yang sebelum ini hanya modem semata-mata. Sekurang-kurangnya saya boleh menyimpan sedikit data/file didalam modem yang juga boleh bertindak sebagai pendrive.

Walaubagaimanapun, sewaktu pertama kali saya plug modem saya pada router saya yang telah saya flash OpenWrt, modem saya gagal untuk membuat sambungan. Lampu hijau berkelip-kelip, tapi ia tidak bersambung. Secara normalnya, sewaktu saya memakai stock firmware dari TP-Link, setelah 1 minit plug in pada router, sambungan 3G/HSDPA akan bersambung secara automatik. Di OpenWrt pula, seakan modem saya tidak dapat dikenali. Saya cuba menyiasat tentang ini dan akhirnya saya terjumpa satu artikel berkaitan masaalah ini. Katanya, hal ini terjadi kerana OpenWrt mengenali 3G modem saya sebagai CD drive (storage device). Modem dwi fungsi (3G dan MicroSD storage) mewujudkan satu "konflik" didalam OpenWrt kerana OpenWrt mengenali modem jenis ini sebagai storage sebelum mengenalnya sebagai 3G modem. Jadi, artikel itu mengesyorkan untuk "menghapuskan" fungsi storage pada 3G modem ini. Caranya ialah dengan meng"eject" device CD melalui command line sdparm --command=eject //dev/sg0. Dengan itu, storage device telah di unmount dan sekarang hanya tinggal 3G modem. Rujuk link ini untuk mengetahui lebih lanjut tatacara ini.

#64: Network Router - A CPU without display with only 4MB storage

TP-Link TL-MR3420
Setelah berjaya menukar firmware router saya kepada OpenWrt, saya akhirnya berjaya boot kedalam firmware baru yang berasaskan Linux. Web interface juga baru yang boleh di themekan mengikut kemahuan saya(default untuk router saya adalah theme twitter bootstrap) dan juga boleh menggunakan telnet serta SSH melalui ip router, saya mula merasakan router saya ini sebenarnya bukan hanya network router, tapi sebuah komputer yang lengkap! Ia ada storage, RAM, processor, network card dengan 1 WAN dan 4 LAN, wifi transmitter, dan untuk TL-MR3420, ia juga ada 1 port USB 2.0!

Timbul satu kepuasan dalam diri saya bila berjaya menukar stock firmware kepada firmware berasaskan Linux ini kerana akhirnya router saya dapat menunjukkan potensi serta kemampuan sebenarnya yang sebelum ini hanya terhad untuk aktiviti routing network sahaja. Disebabkan ini juga fikiran saya mulai terbuka untuk melihat hardware-hardware seperti ini sebenarnya mempunyai banyak potensi tetapi dihadkan oleh software. Saya hanya melihat router saya ini sebagai satu alat yang passive dan tak boleh buat apa-apa selain network routing dan sekarang setelah di flash dengan firmware baru, saya mula melihatnya sebagai sebuah CPU yang sentiasa bersambung dengan internet, boleh run application seperti apache web server, openvpn, tor dan ia boleh hidup dengan tenaga eletrik sebanyak hanya 9 volt!
mrharmonies@harmonium ~ $ ssh root@192.168.1.1
root@192.168.1.1's password:


BusyBox v1.19.4 (2013-01-08 15:26:10 WIT) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
               U N L E A S H E D - Kernel 3.3.8 --->>>>
 ATTITUDE ADJUSTMENT (bleeding edge) ------------------
  * 1/4 oz Beras
  * 1/4 oz Kencur
  * 1/4 oz Kunir
  * 1/4 oz Jane
 --------------------cindy.wijaya----------------------
                   FORSAT | KASKUS
           www.facebook.com/groups/openwrt
   http://www.kaskus.us/showthread.php?t=10124215
             http://forum.openwrt-id.org
 ******************************************************
                      website:
               openwrt.hackshare.org (int)
               openwrt.agromapia.com (iix)
 ------------------------------------------------------

root@OpenWrt:~#
Setelah boot router, anda sudah boleh connect ke router anda melalui ssh atau telnet. Gunakan apa sahaja client telnet atau ssh yang anda mahu, dan connect ke IP address router (untuk saya, IP router adalah 192.168.1.1) contohnya dengan command telnet 192.168.1.1 untuk connect ke port 23 atau ssh root@192.168.1.1 untuk connect ke port 22 dengan username "root". Jika tidak ada apa-apa masaalah, skrin seperti diatas akan terpapar dan anda telahpun enter command line di router anda. Banyak command line telah tersedia didalam terminal ini kerana firmware telah disediakan bersama pakej BusyBox. Untuk install package baru, anda hanya perlu menggunakan package manager (ala apt-get di Debian) dengan command opkg. Contohnya, untuk install hanya perlu guna command opkg install openvpn dan secara automatik opkg akan install applikasi baru OpenVPN di router anda tanpa anda perlu bimbang tentang dependency yang melibatkan package-package lain. Ini adalah sangat menyenangkan dan menjimatkan banyak masa!

Install application Linux di router adalah amat mudah dengan bantuan opkg, walaubagaimanapun, terdapat 1 masaalah. Default storage pada router adalah hanya 4MB! Saiz firmware OpenWrt adalah lebih kurang 3.8MB dan ini bermakna, storage pada router hanya ada beberapa ratus kilobyte sahaja. Oleh itu, adalah mustahil untuk install apa-apa package (walaupun mempunyai tool yang cukup untuk install, tapi keadaan storage tidak membenarkan) didalam default storage pada router.

Tapi, bagi pengguna TP-Link TL-MR3420, anda bernasib baik kerana anda mempunyai 1 USB port! USB port 2.0 ini sebenarnya boleh digunakan (selain untuk menyambung modem 3G) boleh digunakan untuk menyambung external storage. Hanya perlu cucuk sahaja USB Pendrive pada USB port di router, USB Pendrive anda akan dikenal sebagai storage baru. Akan tetapi, beberapa workaround perlu dilakukan antaranya pendrive anda perlulah di format kepada partition linux swap dan partition ext2. Untuk lebih lanjut, sila ikuti workaround yang ditulis oleh Cindy Wijaya (kudos) mengenai cara untuk tambah storage pada router dan menjadikan USB Pendrive anda sebagai root storage (pendrive anda boleh di mount sebagai "/") dan anda boleh memiliki storage mengikut kapasiti pendrive anda (prosedur exroot).

Saya ada 2.54 GB storage pada router.
Anda tidak perlu space yang sangat besar untuk router. Memadai 1 atau 2 GB sudah cukup untuk install banyak application didalamnya dan menyimpan banyak data. Banyak aplikasi boleh didapati melalui opkg, dan antara beberapa aplikasi yang saya install adalah openvpn, tor dan vsftpd. Aplikasi openvpn adalah untuk menyambung sambungan ke Virtual Private Network, tor adalah untuk internet anonymity dan vsftpd adalah satu daemon ftp server untuk membolehkan anda connect router anda melalui ftp (memudahkan urusan upload dan download file dari komputer ke router).

#63: Network Routers - A CPU without display

Hi, berjumpa lagi kita. Dalam selang lebih 2 minggu dengan post sebelum ini, saya sebenarnya banyak perkara telah berlaku. Anak saya Omar Shahnaz telah diadmitkan di wad (alhamdulillah telah sembuh sepenuhnya sekarang), saya juga telah mendapat serangan arthritis (alhamdulillah juga telah sembuh), saya telah melanggan perkhidmatan VPN (Virtual Private Network) dan juga saya telah mengubah sistem operasi network router saya daripada stock firmware dari TP-Link kepada firmware OpenWRT.

TP-Link TL-MR3420
Sewaktu mendaftar untuk servis VPN saya telah mendapat satu idea untuk setkan router saya sebagai satu access point yang tersedia menggunakan sambungan VPN. Saya merupakan pengguna komputer yang sangat mementingkan isu keselamatan dan VPN adalah inisiatif saya untuk internet yang lebih selamat (sebelum ini saya menggunakan Tor Onion Router). Berbanding untuk setting setiap komputer/telefon bagi menggunakan sambungan VPN, saya fikir adalah lebih baik jika saya setting VPN pada router yang saya connect pada semua komputer/telefon (melalui wifi). Di belakang router saya terdapat 4 sambungan LAN, jadi saya boleh sambungkan 4 komputer saya kepada VPN tanpa perlu saya setting VPN di setiap komputer (termasuk juga wifi). Saya telah bertanya pada support service perkhidmatan VPN yang saya langgani tentang perkara ini dan mereka memberikan jawapan positif. Katanya, ia boleh dilakukan dengan menjalankan aplikasi openvpn di router dan setiap sambungan di router akan menikmati sambungan VPN. Ia boleh dilakukan dengan "reflash" semula router dengan firmware third party yang menggunakan sistem operasi Linux menggantikan stock firmware dari TP-Link yang datang bersama router yang mempunyai fungsi terhad. Teknik ini sebenarnya adalah seperti memformat komputer untuk menukar operating system asal kepada operating system baru.

Setelah menjalankan research di internet, saya telah simpulkan bahawa terdapat 2 firmware yang compatible kepada model router saya iaitu, TP-Link TL-MR3420. Firmware tersebut adalah DD-WRT dan OpenWRT. Setelah menyelami lebih lanjut mengenai "flashing" router ini, saya dapati prosedur ini adalah sangat berisiko dan mungkin boleh merosakkan router (atau dipanggil "brick". ya, router boleh rosak dan langsung tak berfungsi seperti "batu-bata"). Pemilihan firmware yang betul juga penting kerana terdapat banyak model router diluar sana yang mempunyai no model yang hampir sama. Inilah yang berlaku pada saya. Awalnya saya fikir DD-WRT boleh digunakan pada model router saya. No model TL-MR3420 terpapar dalam list router yang compatible dengan DD-WRT. Bila saya selidik lebih mendalam, rupa-rupanya TP-Link mengeluarkan 2 model router yang mempunyai no model yang sama, TL-MR3420 version 1 dan TL-MR3420 version 2. Router TL-MR3420 version 1 menggunakan processor AP99 Atheros AR7241 manakala TL-MR3420 version 2 menggunakan processor AP121 Atheros AR9341. Kesilapan mengenalpasti seperti ini boleh mengundang router anda menjadi brick! Saya bernasib baik kerana secara tidak sengaja find out tentang ini.

Setelah mengenalpasti model router, bolehlah pergi ke http://downloads.openwrt.org/ untuk download firmware mengikut model router anda. Saya menggunakan firmware OpenWrt Attitude Adjustment 12.09-rc1 yang disediakan oleh Cindy Wijaya (kudos) seorang programmer dari Indonesia (openwrt-ar71xx-generic-tl-mr3420-v2-squashfs-factory.bin).

Teknik untuk flash adalah mudah. Cuma perlu buka alamat router di browser (untuk model router saya, default adalah 192.168.0.1) dan masukkan user/password admin untuk router. Setelah itu pilih menu sebelah kiri System Tools > Firmware Upgrade. Pilih file yang didownload tadi (untuk router saya, file openwrt-ar71xx-generic-tl-mr3420-v2-squashfs-factory.bin) dan klik Upgrade. Setelah lebih kurang 5 minit, router telah siap boot operating system baru buat pertama kali dan ia boleh diakses dengan default ip 192.168.1.1.

OpenWrt Attitude Adjustment 12.09-rc1. Webinterface using Luci and SSH using putty.

Isnin, 3 Jun 2013

#62: "Insomnia" Among Babies

Note: Tajuk berat, saja je nak bagi gempak. Artikel ni takde kaitan dengan insomnia. Kalau anak anda betul-betul ada insomnia, anak anda mungkin memerlukan nasihat dari pakar. Disini hal sebenarnya ambe nok konsikan adalah anak ambe yang memang sangat susah nak tidur waktu malam (tapi waktu siang tidur dengan nyenyak dan lama). Sejak lahir sampai sekarang memang jarang benar tidur awal malam. Tiap-tiap malam ambe memang kena bergilir dengan wife ambe untuk jaga anok ambe yang waktu tidurnya seakan tertukar yang sepatutnya tidur waktu malam dan berjaga waktu siang, sebaliknya anok ambe berjaga waktu malam dan tidur waktu siang. Jadi bagi ambe ini bukan insomnia sebenarnya.

Omar Shahnaz sejak lahir sampai sekarang susah untuk tidur
Tapi itulah masaalah sehari-hari bersama anok ambe. Alhamdulillah, walau gilir-gilir tidur, ambe masih boleh bekerja dengan baik di waktu siang (tapi badan rasa letih). Tapi ambe fikir sampai bila ambe nak terus dengan perangai anok ambe yang susah tidur malam begini. Ambe sebenarnya dah banyak berusaha untuk bantu dia tidur. Guna relaxing music, bagi makan banyak sebelum tidur, letak wangian lavender pada bantal, generate sound pink noise, letak buai manual dan eletrik, bedung, pasang aircond letak suhu rendah, mandi air suam, etc, tapi semuanya tak berkesan. Kadang-kadang naik juga temper ambe bila badan kita letih tapi tak dapat rehat waktu malam. Ada pernah sekali ambe terfikir untuk bagi ubat Phenergen (Promethazine) untuk buat anok ambe mengantuk, tapi bila ambe baca kontraindikasi ubat ni, tak boleh bagi pada bayi bawah umur 2 tahun. Tak jadi bagi. Ambe bingung memikirkan cara lain untuk bantu anok ambe tidur.

Johnson's Baby BedTime Bath.
Sehinggalah beberapa hari lepas ambe pegi shopping pasaraya dekat dengan rumah ambe, ambe terjumpa satu mandian bayi tertulis "Bedtime Bath" dari Johnson & Johnson. Ambe grab terus. Sebenarnya ambe memang ada produk line "unggu" J&J tapi ambe tok guna. Ambe ada dapat hadiah dari kawan ambe iaitu satu set barang J&J tapi ambe dok sentuh langsung sebab ambe dok suka letak cream pada kulit anok ambe. Rasa "belengas" (melekit). Ambe terlalu aggressive mencari cara alternatif untuk bantu anok ambe tidur sampai ambe lupa benda yang ada didepan ambe lansung ambe dok pernah cuba.

Balik rumah, ambe excited menunggu waktu malam untuk mandikan anok ambe dengan mandian ni. Lebih kurang pukul 10 malam ambe mandikan anok ambe dengan mandian ni. Mandian ni rasa "thick" sikit dari mandian yang biasa ambe guna untuk anok ambe. Biasanya bila ambe bilas mandian biasanya memang terus hilang rasa licin sabun pada kulit anok ambe. Bila guna mandian ni, bila ambe jirus berkali-kali pun memang masih terasa licinnya. Rasa licin dan seperti "creamy" seperti pakai krim pelembut pada kulit. Baunya juga lebih kuat dari bau mandian yang biasa ambe guna. Memang tertulis pada botol mandian ni tentang penggunaan aroma iaitu "NaturalCalm" aromas yang nampaknya di threadmark oleh J&J. Ambe bukanlah pentafsir aroma yang baik tapi bagi ambe, bila ambe tercium bau ni, ambe rasa ia adalah bau yang "berat". "Berat" bukan bermaksud kuat atau teruk, tapi bila tercium, ambe terasa seperti "malas". Itu pada pendapat ambe sajalah. Memang ia berlawanan dengan bau-bau yang segar seperti bau buah-buahan atau bunga-bunga yang menyegarkan. Johnson's Baby BedTime Bath wangi dan calming.

Sesudah mandi, ambe terus lap-lap keringkan badan anok ambe. Sesudah kering, bila ambe sentuh badan anok ambe, ambe dapat rasa satu lapisan lembut di kulit anok ambe seperti dah disapu krim. Lepas tu ambe ambil pula Johnson's Baby BedTime Oil dan ambe sapu di seluruh badan anok ambe. Bau yang sama dengan bau mandian tadi. Sebenarnya ada lotion untuk disapu, tapi ambe tak ada lotion tu jadi instead ambe sapu bedtime oil. Ambe rasa lebih baik untuk guna lotion sebab bedtime oil rasa sangat berminyak (tapi tak lama sebab bila ia dah meresap dalam badan, ia tak rasa berminyak lagi).

Terus ambe pakaikan pakaian pada anak ambe dan pada waktu ini anok ambe masih aktif jadi ambe tinggal anok ambe dalam baby cort bersama mainan-mainannya. Dok sampai 15 minit, ambe mula lihat anok ambe mula menunjukkan tanda-tanda mengantuk. Matanya jadi kuyu dan dah tak aktif macam sekejap tadi. Wife ambe pun terus baringkan dia dan suapkan susu. Sekejap saja lepas tu anok ambe terus tertidur!

Ambe bukan bekerja dengan J&J tapi ambe nok recommend kepada ibu-bapa di luar sana yang ada masaalah baby susah tidur malam, cubalah Johnson's BedTime ni. Kalau tak silap ambe, ada bedtime lotion, oil dan mandian. Semoga dapat membantu ibu-bapa di luar sana dari migraine dan high-temper akibat tak cukup tidur. TQ for reading.