FirstMedia Schedule

Last update 06 May 2016.

My cable and internet provider FirstMedia offered me an upgrade for the internet connection from 10 Mbps to 18 Mbps, with bonus opening all TV channels for 6 months. I said yes.

So now I have all these channels and can’t find a convenient way to check what’s on. The program guide on the TV has to be manipulated by remote. FirstMedia has a TV guide online but the display is hard to read, difficult to search, and really not mobile device friendly.

Determined to have an easy way to check the schedule, I spent this weekend building a web page that displays the shows according to my preferences. The data is taken from the original online TV guide :)

It was also a chance for me to brush up my skills. I used bootstrap 3 to help with the CSS, angular 1 for the javascript framework, font awesome 4 for the icons, lodash 4 to help with the javascript, moment.js 2 to help taming javascript date, angular ui router 0.2 for routing, and angular ui bootstrap 1.3 to connect angular to bootstrap. For the back end I used Nancy 1.4.

The result is not too shabby if I may say so myself :)

You can create several lists, each list contains a bunch of channels you want to display. For example you create a list called ‘Movies’, containing channels like HBO and Cinemax, and another list called ‘News’, containing CNN and Al Jazeera. You can choose which date to show, and whether to show past shows. The list can be grouped by channel or ordered by time. Also, it looks quite acceptable in mobile devices.

Check it out!


Perpanjang Paspor Online 2016

Last update 27 Apr 2016.

Berikut catatan saya waktu mencoba melakukan perpanjangan paspor (passport? pasport?) secara online, supaya tidak lupa prosedurnya lima tahun yang akan datang (kalau prosedurnya belum berubah tentunya :).

Memulai Proses

Lokasi website:

Menu: Layanan Publik > Layanan Paspor Online

Akan membuka website baru: (mungkin lain kali langsung ke sini?)

Gambar paspor besar di tengah ternyata tombol yang bisa diklik :)

Alamat email yang didaftarkan akan digunakan untuk mengirim PDF hasil pendaftaran. Untuk berjaga-jaga saya menggunakan alamat email yang berbeda untuk mendaftarkan anak dan istri. Mungkin menggunakan alamat email yang sama tidak masalah?

Anak nomor identitas menggunakan NIK Kartu Keluarga.

Kartu keluarga tidak ada masa aktif. Sekarang KTP juga berlaku seumur hidup. Untuk bagian ID berlaku sampai dengan saya isi setahun ke depan.

Selesai pendaftaran website akan mengirim email berisi PDF ‘Bukti Pengantar ke Bank’.


Print bukti pengantar ke bank, bawa ke bank BNI, bayar. Dapat ‘Tanda Bukti Pembayaran Imigrasi’.

Sesudah pembayaran harus menunggu sehari sebelum bisa lanjut proses. Waktu coba klik link di email di hari yang sama dengan hari pembayaran, dibilang belum bayar, atau hang.

Lanjut Online Form

Klik link di email yang berisi PDF untuk pembayaran untuk balik ke website imigrasi. Konfirmasi pembayaran dan tentukan tanggal kedatangan untuk difoto dan ambil sidik jari. Website imigrasi mengirim PDF berisi ‘Tanda Terima Permohonan’. Ada informasi tanggal dan jam kedatangan, apa yang harus dibawa, dll. Harus diprint.

Kunjungan ke Kantor Imigrasi

Untuk perpanjang paspor butuh bawa:

Untuk anak yang belum punya KTP perlu tambahan / penggantian:

Tidak perlu fotokopi sendiri karena di Kanim Kelas I Khusus Soekarno Hatta ada tukang fotokopinya yang sudah tahu format yang benar, punya form, meterai, dll. Lokasi di kantin belakang gedung.

Pengunjung kantor imigrasi tidak boleh pakai sandal, celana pendek, rok mini. Untuk foto harus pakai kemeja atau kaos yang berkerah. Tidak boleh warna putih.

Tidak perlu mengantri bersama dengan pemohon paspor walk-in, tidak perlu ambil formulir, langsung masuk gedung, cari petugas, tunjukkan Tanda Terima Permohonan dan minta nomor antrian paspor online ke petugas. Petugas akan memberi nomor antrian dan map.

Sebaiknya sesudah dapat nomor antrian baru fotokopi. Akta, KK, KTP, paspor semua fotokopi.

Untuk anak fotokopi ada tambahan / perbedaan:

Tunggu dipanggil, foto, scan fingerprint, petugas memberi tahu kapan paspor baru bisa diambil (3 hari kerja?), pulang.

Ambil Paspor Baru

Saya ambil paspor beberapa hari sesudah tanggal yang ditentukan dan tidak dipermasalahkan.

Paspor lama tidak dikembalikan kalau kita tidak minta. Untuk minta paspor lama harus isi form. Form minta paspor lama bisa dibeli di tukang fotokopi.

Kertas pengambilan paspor taruh di keranjang di tempat pengambilan paspor, kemudian tunggu dipanggil. Waktu dipanggil tanda tangan di bukti pengambilan, menyerahkan form minta paspor lama, dan ambil paspor baru dan lama.

Pengambilan paspor anak dan pasangan bisa diwakilkan. Menurut infonya asal masih dalam satu kartu keluarga bisa diwakilkan, tapi saat ambil petugas tidak minta kartu keluarga.



Multiplication Drill

Last update 23 May 2015.

My son is about to have his first math final exam!

My wife was busy giving him drills on paper while I was playing around with angular.js :)

In the rare chance my skill has actual practical value, I made this Multiplication Drill.


Angular.js Annotation Surprise

Last update 27 Aug 2014.

Pop quiz: what do you think the page below will look like when run?

<!DOCTYPE html>
    <script src="//"></script>
    <div ng-app="MyModule" ng-controller="MyCtrl">
        <p>Hello {{who}}</p>
        "use strict";

        angular.module("MyModule", [])
        .controller("MyCtrl", ["$scope", "$q", function ($q, $scope) {
            $scope.who = "World";

Do you think the page will show “Hello World”?

It won’t. It will just print “Hello”.

Can you spot the problem?

It has something to do with the syntax that is used in angular.js to keep the script working after minification (called annotation). Without annotation angular.js injects objects into the controller based on the name of the parameters. With annotation angular.js doesn’t care about parameter names, it will inject objects based on the list of strings, in the exact order.

So if we change the script to:

.controller("MyCtrl", ["$scope", "$q", function ($q, $scope) {
    $q.who = "World";

It will print “Hello World” :)

Or we do it the right way, by always making sure the parameters are in the same order as the list of strings:

.controller("MyCtrl", ["$scope", "$q", function ($scope, $q) {
    $scope.who = "World";


Sitting in a Car, Listening to a Song

Last update 21 Aug 2014.

You are sitting in a car travelling at 120 km/hour, listening to a song that lasts for 5 minutes. At the end of the song you would have moved TEN KILOMETERS from the start!

How far is your office from your home? My office is almost 30 km from my home. So in that 5 minutes I have taken a third of the total distance between my office to my home.

The miracle of modern civilization :)

So how come on average I need 1.5 hours to get to office? <clue>rhetoric</clue>