Ipoh – Perak, Malaysia

Kuala Lumpur sudah, Lego Land Johor Bahru sudah 2x, Melaka sudah, Batu Pahat sudah berkali-kali. Desember 2019 ini, setelah ujian akhir semester anak-anak saya berakhir, saya ajak mereka untuk liburan tiga hari ke Ipoh Malaysia.
Jadwal acara sudah disusun oleh istri ke tempat mana saja yang akan kami kunjungi. Tentu saja prioritas untuk anak-anak adalah the lost world (dunia yang hilang), nonton Ejen Ali di bioskop, dan mengunjungi tempat-tempat bersejarah di Ipoh sekaligus mencoba makanan khas orang Ipoh.

Di malam pertama kami menginap di hotel di pusat kotanya saja sementara di malam kedua menginap di haven resort. Kami rencana akan mengeksplorasi semua fasilitas yang dimiliki resort ini. Terutama pemandangan alam yang ada di resort tersebut.

Kami meninggalkan rumah di Singapore tepat pukul 06:00 di pagi hari setelah shalat subuh menuju Queen street di daerah Bugis dengan bus 48. Harapannya untuk naik bus pertama ke terminal bus Larkin Johor Bahru Malaysia. Sesampai di Queen street sudah menunjukkan pukul 06:45. Ketika kami sampai, bus yg menuju ke Larkin baru saja berangkat, berarti harus menunggu bus berikutnya dan ternyata sudah ada antrian beberapa meter. Setelah menunggu sekitar setengah jam bus berikutnya pun datang. Kami pun kebagian bus tersebut.

Harga tiket busnya S$3.5 untuk orang dewasa sementara anak-anak S$1.5 untuk sampai ke Larkin. Tepat pukul 07:45 kami berangkat dari Queen street menuju terminal bus Larkin Johor Bahru (JB) tentunya melewati check point imigrasi Singapore dan Malaysia di daerah Woodland.

Oh iya jika pembaca bertanya-tanya kenapa kami memilih mengambil bus menuju Ipoh di Larkin JB? yups karena selisih harga jika mengambil bus dari Singapore dan di Larkin Malaysia sekitar S$40, lumayan jauh selisihnya. Selama ini jika ada keperluan ke Malaysia, kami selalu mengambil bus dari Larkin Malaysia tadi.

Setelah pemeriksaan imigrasi Singapore, antrian orang untuk menunggu bus yang tadi kami naiki sudah mengular. Karena istri sering bolak balik Malaysia, tahu harus naik apa untuk segera berangkat ke check point imigrasi berikutnya yakni Malaysia. Istri menuju antrian bus pekerja. Bus ini diperuntukkan bagi pekerja yang saya sendiri tidak paham pekerjanya dari mana dan akan kemana? kelihatannya pekerja lintas negara (Singapore – Malaysia).

Dengan menaiki bus pekerja ini kami membayar S$ 2 per orang untuk sampai ke imigrasi Malaysia yang jaraknya beberapa kilo meter saja yang dipisahkan oleh selat kecil.

Dari check point Imigrasi Malaysia sebenarnya bisa menunggu bus yang kami tumpangi dari Singapore tadi karena sifatnya bebas naik yang mana saja selama perusahaan busnya sama. Oh iya tiket busnya tetap harus kita simpan karena begitu naik bus lagi tiket akan diperiksa ulang sebagai bukti kita telah membeli tiket bus tersebut.

Tapi sekali lagi untuk menghindari antrian panjang kami memilih naik taksi saja dari Imigrasi Malaysia menuju Larkin tadi.

Tiba di terminal Larkin waktu sudah menunjukkan pukul 10 pagi. Kami langsung menuju loket tiket untuk beli tiket bus ke Ipoh dan kebagian bus untuk keberangkatan pukul 11 pagi. Harga tiketnya per orang RM 55. Dari loket, kami ke Mc Donald untuk sarapan pagi karena anak-anak sudah lapar. Di rumah anak-anak hanya makan seadanya saja sebelum berangkat dan pastinya jam 10 sudah lapar. Masih ada waktu satu jam sebelum keberangkatan untuk sarapan.

Bus City Express yang akan mengantarkan kami ke Ipoh telat 10 menit. Tidak apa-apa sambil menunggu bisa ngobrol sama anak-anak. Oh iya Ibnu sempat beli gasing Beyblade dan semacam gantungan kunci untuk Naya.

Saat tulisan ini dibuat, kami sedang di Terminal Bersepadu Selatan (TBS) untuk menunggu keberangkatan berikutnya menuju Ipoh. Kelihatannya kami salah membeli tiket bus, seharusnya di loket tiket tadi tanya apakah ini langsung atau lewat Kuala Lumpur (TBS). Ya sudah dinikmati saja perjalannya. Ini kali kedua kami di TBS. Sebelumnya bersama ibu mertua tiga tahun lalu jalan-jalan ke Lego Land Johor Bahru kemudian ke Kuala Lumpur.

Perjalanan langsung akan menghabiskan waktu 7 jam, namun karena bus ini via Kuala Lumpur (TBS) kelihatannya butuh waktu lebih lama. Dari informasi dari sang driver, jalan menuju Ipoh lagi teruk (macet) maka diperkirakan akan sampai di Ipoh insya Allah pukul 9 malam dari jadwal semula yakni pukul 6 petang.

Jam 9 malam kami akhirnya tiba di terminal Aman Jaya Ipoh, kami ke hotel untuk menaruh barang bawaan dan keluar lagi untuk makan malam. Kali ini makan di restoran Pakeeza yang terletak tidak jauh dari hotel dimana kami menginap atas rekomendasi driver taksi yang kami tumpangi tadi dari terminal ke hotel dan dari Tripadvisor.

Saya memesan nasi bryani kambing dengan saus kurma sementara istri dan anak-anak memesan bryani ayam.

Setelah makam malam kembali ke hotel untuk bersih-bersih, shalat, dan istirahat. Alhamdulillah…

-Ipoh, 7 Desember 2019-

Programming Perl

Lama tidak meng-update blog ini, banyak hal yang sebenarnya ingin saya tulis tapi belum tertuliskan. Beberapa hari ini hawa sejuk menyelimuti Singapore membuat hasrat untuk menulis muncul kembali.

Tulisan kali ini tentang kode program Perl. Setiap kode program yang ditulis oleh programmer terdapat seni di dalamnya. Baris-baris kode program terlihat indah bagi programmernya termasuk bagaimana program tersebut menyelesaikan masalah yang ada. Terdapat kepuasan tersendiri bagi sang programmer ketika melihat kode-kode program yang telah dibuatnya. Begitu juga saya.

Kemarin menyelesaikan satu kode program masih dengan bahasa Perl untuk keperluan kantor. Terkadang mau mencoba bahasa Python untuk kode-kode program saya tapi rasa-rasanya masih betah menggunakan Perl ini. Kode program tersebut kemudian saya ubah ke konteks dan redaksi yang berbeda untuk menghindari pelanggaran kode etik perusahaan tentunya.

Tujuannya adalah berbagi ilmu barangkali kode program tersebut dapat menjadi referensi orang lain untuk menyelesaikan kasus yang mirip.

Dari data excel di atas, saya hanya ingin mengambil kolom ‘Number’ saja dan akan diurutkan mengikuti pola berikut:

Kalau ketemu angka berurutan maka akan ditulis angka awal sampai angka terakhir yakni 10-11, 18-19, Sedangkan jika ada angka yang loncat dan bilangan berikutnya tidak berurut maka angka awal dan angka terakhir sama yakni 13-13, 15-15, 21-21

Keluaran program yang diinginkan sebagai berikut:

Berikut kode program Perlnya:

#!/usr/bin/perl
# Copyright (c) Askari Azikin (askari.azikin@kawananu.com)
#
# Usage: perl parse.pl input_file.xlsx output.txt  
#
# Revision:
# 22/11/2019 Askari Azikin First Draft
#
# use strict;
# use warnings;
# use Data::Dumper;

use Spreadsheet::Read;
use Spreadsheet::ParseXLSX;

usage() if ($#ARGV != 1) ;
my $workbook    = ReadData ("$ARGV[0]");
my $output_file = $ARGV[1];
my (@column_sorted) = ();
my $sheet = $workbook->[1];       # First data sheet
my @columns = $sheet->{cell}[3];  # Column 'M' 

foreach my $col (@columns) {
   for (@$col) {
     if (defined $_) {
         push (@column_sorted, $_) if ($_ ne "Number");
     }
   }
}

parse (\@column_sorted);

sub parse {
    my ($ref) = @_;
    (@$ref) = sort (@$ref);
    my $eci_start = $ref->[0];
    my $eci_cur   = $ref->[0];
    my %hash      = ();
    my $eci_end = 0; my $flag_skip = 0; 

    for my $i (1 .. $#{$ref}) {
       $flag_skip = 0;
       if ( ($ref->[$i] - $eci_cur) > 1 ) {      
           $flag_skip = 1;       
           $eci_end = $eci_cur;   
       }    
       $eci_cur = $ref->[$i];   
       if ($flag_skip) {       
          if ($eci_start eq $eci_end) {           
                push @{$hash{'event'}}, "$eci_start $eci_start";                      
                $eci_start = $eci_end = $eci_cur;       
          }       
          else {           
               push @{$hash{'event'}}, "$eci_start $eci_end";                     
               $eci_start = $eci_end = $eci_cur;       
          }  
       }   
       $eci_end = $eci_cur unless $flag_skip;   
       if ($i eq $#{$ref}) {       
           unless ($flag_skip) {           
               push @{$hash{'event'}}, "$eci_start $eci_end";       
           }       
           else {           
               push @{$hash{'event'}}, "$eci_start $eci_start";       
           }   
      }
   }
   create_script(%hash);
}

sub create_script {
   my (%hash_) = @_;
   my $start_point = 1;
   my %hash_reporting = ();
   open (FH, '>', $output_file) or die $!;
 
   print FH "## Special event list\n";
   foreach my $key (sort keys %hash_) {
     foreach (@{$hash_{$key}}) {
        if ($_ =~ /(\d+)\s+(\d+)/)
        {
             print FH "perl add_range -param param_tests${start_point} -first $1 -last $2\n";
             push @{$hash_reporting{'params'}},"param_tests${start_point}";
             $start_point++;
        }
     }  
   }
   print FH "\n\n## Configure special event\n";
   foreach (keys %hash_reporting){
       print FH "perl create_reporting -param 200000000 -param_tests ";
       print FH $_ for (join(",",@{$hash_reporting{$_}}))
   }
   print FH "\n";
 close(FH);
 }

sub usage {
print <<EOF; 
Options:
         input_file.xlsx : the excel sheet file to be parsed, use "" if there is space on the filename, or just using tab 
         output.txt      : script produced
 For Example:
        perl parse.pl "Input File list_test.xlsx" script_output.txt
 EOF
 exit;
 }

Jika ingin menyalin program Perl yang telah dibuat dalam bentuk executable (exe) file sehingga dapat dijalankan di komputer lain tanpa harus menginstal interpreter dan library yang dibutuhkan, saya biasanya menggunakan cpan “pp” link (https://metacpan.org/pod/pp)

Cara penggunaannya sebagai berikut:

pp -M Spreadsheet::Read -M Spreadsheet::ParseXLSX -o parse.exe parse.pl 

Berikut cara menjalankan program yang telah diubah ke format *.exe:

 parse.exe
 Syntax: parse.exe  
 Options:
         input_file.xlsx : the excel sheet file to be parsed, use "" if there is space on the filename or press tab 
         output.txt      : Script produced
 For Example:
        parse.exe "list test_excel.xlsx" output.txt

Koleksi Buku Robotik Untuk Anak Laki-laki Saya

Anak laki-laki saya lagi keranjingan mengutak-atik lego sehingga saya mulai memperkenalkannya dengan robot yang bisa diprogram menggunakan bahasa pemrograman python yang akan dijalankan di Raspberry Pi.

Untuk bisa belajar bagaimana merakit robot dan memrogramnya maka saya membelikan buku Learn Robotics with Raspberry Pi dari Amazon.com.

Akhir pekan ini rencana saya ingin membaca buku ini dulu dan memahami bagaimana menggunakan Raspberry Pi untuk menggerakkan motor-motor DC untuk keperluan robot anak saya. Selain itu, saya juga mengambil referensi dari website https://projects.raspberrypi.org/en/ untuk pelengkap satu dengan yang lainnya.

Hasil dari pembelajaran bersama anak saya membuahkan hasil ini.