OpenVPN Install (Ubuntu 20.04)


This script will let you set up your own VPN server in no more than a minute, even if you haven’t used OpenVPN before. It has been designed to be as unobtrusive and universal as possible.

GitHub: openvpn-install

I tested it on Ubuntu 20.04, and it works like a charm.


Adding Block Storage to an Existing Cloud at Linode

This site is hosted at Linode’s smallest package. Besides this blog, I have some other domains and small WordPress-based sites here. Most of them are not busy site. So, $5/mo is just gret. But, there is a small problem: storage.

Yesterday, I almost utilised 95% of the 25GB of storage limit. I was thinking of upgrading the to the higher specs. $10/mo is still a good deal. But, I only need the storage at this moment. Paying $10/mo will give me additional 25GB of storage.

I already knew that Linode also provides block storage, and I never looked up for this addons. So, I gave it try and tried to prove that the how-to works as written. So, from the panel, I chose to add 20GB of storage and follow the instruction in the input fields.

It took only less than a minute I think to create the disk storage.

Once the disk created, I only need to run some commands as instructed in the configuration page. It was that simple.

After that, I moved some of my files to the new partition, and changed some configurations. Also, I moved MySQL storage to this partition, because it utilises the most. the process also pretty straightforward.

And, I only need to pay extra $2/mo for 20GB additional storage.



Harga Nama Domain .ID Naik per Akhir Juli 2019

Hari ini mendapatkan informasi melalui newsletter salah satu penyedia jasa layanan registrasi nama domain dan penyewaan server hosting mengenai perubahan harga registrasi/perpanjangan masa aktif domain .ID. Awalnya dulu harga registrasi mencapai Rp250.000,- per tahun. Namun, untuk menambah daya tarik, harga dasar diturunkan sehingga domain dapat dijual dengan harga separonya, bahkan lebih.

Namun, per 29 Juli 2019, harga nama domain .ID akan naik menjadi Rp250.000,- untuk pendaftaran baru maupun perpanjangan masa aktif — dari kisaran harga saat ini sekitar Rp110.000,- per tahun.


Few Things You Need to Know About The New Yogyakarta International Airport (YIA)

According to the news, the new Yogyakarta International Airport will be operating in late April 2019. For the first phase, some airlines like Garuda Indonesia, Air Asia Indonesia, and Silk Air will have their inaugural flights.

I will not talk about the controversies, but one thing for sure: there will be a new airport to support the ‘current’ airport that is too small to handle millions of passengers per year.


New Yogyakarta International Airport is located in Kulon Progo Regency. Yes, it’s still in Yogyakarta Special Region. See map below. “So, is near the city center?”, “Is it far from Adisutjipto International airport?”, you may be asking.

I personally haven’t visited this ‘new’ airport. As a citizen who lives not far from city center, — I define Malioboro area as the city center here — New Yogyakarta International Airport is quite far.

In a very normal traffic, I can reach Malioboro area for about 25-30 minutes by car. Referring to Google Maps, the distance between Adisutjipto Airport and Malioboro area (I use Tugu Monument as the point of reference) is around 9-10km.

Leaving for your destination from Adisutjipto should not be difficult also as you can find taxies easily. Or, you can use ride sharing transportation like Go-Jek Indonesia or Grab. If your destination is also available using Trans Jogja bus, it might be a solution also. Even, if you need go to directly to Solo city for example, the train station is just outside the arrival area.

Compared to the above route, the distance from the ‘new’ airport is ‘only’ around 48km (I pick the ‘shortest’ route provided by Google Maps).

How far is the New Yogyakarta International Airport?

If you could not figure out yet how far is the new airport, let’s see some other contexts for comparisons. We will use the distance between Yogyakarta Tugu Monument as the starting point and Google Maps to measure the distance.

So, distance from Yogyakarta Tugu Monument to:

How to get there?

I think Damri as the bus operator will server the route to the new airport, and the train from PT KAI as well. But, I think it will take a little bit time. Renting a car might be little expensive. Taking Go-Car from Go-Jek or Grab is a reasonable option. Conventional metered-taxi, probably. It will cost more, I suppose. I checked the fare for Go-Car and Grab, it is around IDR 180,000-200,000.


OpenVPN Setup on Ubuntu 18.04 LTS

I could not remember exactly when I setup OpenVPN for the first time. As far as I remember, it was not an easy task. But, I need to have it installed, and I found it easier. Probably, because it’s easier to setup on Ubuntu 18.04 LTS?

I need to have it setup because I have some sites blocked by my internet provider. Using Google’s DNS ( or even ClouFlare’s did not help either. Changing the DNS made my internet connection do not work.

So, I need to set OpenVPN up somewhere. I was thinking of having it setup on my own cloud server at Linode. Lucky that there is a straight-forward tutorial on how to setup OpenVPN on Ubuntu 18.04 LTS. I will write it down also here for my personal documentation.


First, update the system by running apt-get update and then apt-get upgrade. For me this is optional.


Bayar dengan Cicilan Kartu Kredit atau Tunai?

Saya punya kartu kredit dari beberapa bank, walaupun tidak semuanya saya pakai. Intinya, saya mencoba menggunakannya sebagai mana fungsinya. Benar memang bahwa prinsipnya sih kita hutang yang tetap harus dibayar, cuma yang saya hindari adalah bahwa kartu kredit dipakai untuk membayar hutang kartu kredi yang lain. Itulah kenapa saya pakai metode pembayaran auto-debet.

Selain promo kartu kredit, saya fitur yang sering saya manfaatkan adalah cicilan dengan bunga 0%. Tidak selalu semua bisa dicicil, cuma kalau bisa dicicil dan memang lebih menguntungkan, kenapa tidak?

Untuk pengeluaran yang sifatnya rutin, saya gunakan cicilan kartu kredit. Atau, untuk barang yang butuh sekarang tapi bisa dinikmati cukup lama.

Saya selalu beli listrik prabayar dalam jumlah yang agak banyak, sekaligus untuk beberapa bulan. Misalnya saya beli sebesar Rp1.000.000,- yang harapannya bisa untuk 6 bulan. Transaksi semacam ini saya gunakan cicilan 0%, jadi saya menghitungnya dengan biaya bulanan listrik sekitar Rp150.000,-.

Karena ini mungkin bisa jadi lebih murah dibandingkan setiap bulan saya isi sedikit demi sedikit. Belum lagi kalau misalnya ketika melakukan pembayaran mendapatkan cashback. Dan juga, kebutuhan dan kemampuan masih bisa sebesar itu.

Contoh lainnya adalah ketika beli ponsel awal Agustus lalu. Saya memilih untuk menggunakan cicilan kartu kredit, karena saya memilih untuk menempatkan ponsel sebagai biaya bulanan. Bahkan, setelah saya pertimbangkan, saya akhirnya memutuskan untuk beralih ke pasca bayar. Jadi, kebutuhan untuk komunikasi (ponsel, pulsa, dan paket data) bisa lebih jelas.

Ya, semoga ponsel jangan hilang lagi saja sih…

Beberapa transaksi yang memang harus bayar tunai, saya usahakan untuk tetap dibayar tunai. Tunai disini maksudnya tunai lunas (entah pakai kartu kredit atau debi), bukan untuk dicicil. Misalnya belanja bulanan, pengeluaran rutin seperti IPL berlangganan server. Ya, apalagi kalau memang tidak tersedia opsi cicilan.

Toh secara prinsip kita juga sudah belajar matematika sejak dulu. Jadi, soal penghitungan dan logika jelas masih sangat relevan.


DigitalOcean $5 2018

Walaupun situs blog ini berada dalam layanan cloud server dari Linode, namun saya ada juga menggunakan layanan dari DigitalOcean. Dari sisi harga, keduanya hampir mirip. Hanya saja, per awal Januari 2018, DigitalOcean menawarkan harga yang sedikit lebih murah ($US5 untuk 1GB RAM dan 25GB SSD storage).


Moving to Google Apps for Work

Google Apps for Work

It’s been two for around two months since my small office moved the email service to Google Apps for Work. So far, it’s been a great experience and I think it was the right decision to make.

Why Moving?

Before moving to Google Apps for Work, we manage the email servers on our own. Meaning, we needed to do the setup, maintenance, including backup. There are less than twenty email accounts to manage under two main domains. The email was hosted on a cloud-based server — we used DigitalOcean. Everything was running almost without any issues.

We depend on emails on day-to-day operation. At the same time, we need to have (almost) zero maintenance and increase our productivity. Our small team needs to share lots of things like documents, spreadsheets, and agendas. The thing is that we need to use our personal Google account to share documents. The other things is on the storage. I have more than 6 GB of email (for work). So, moving to Google Apps for Work is an anticipation. Here are some main reasons on the migration:

  1. Zero maintenance. By outsourcing the email service to Google, we at least only need to keep the domain active.
  2. Integration with other Google services like Google Docs, Google Sheets, Google Calendar, and more. The integration also includes the seamless collaboratoin between coworkers.
  3. Flexible storage. By default, I have 30 GB of storage for my Gmail, Google Drive, and photos. If later I need to upgrade, the price is pretty reasonable. 100 GB for IDR 27,000 (per account) is a good deal.
  4. Simple setup and management. Setting up each service provided by Google Apps for Work is very easy.

Migration Process

The migration process was pretty easy. Since there were only around 12 email accounts, so moving them individually did not take too much time. My coworkers moved all the email account by themselves. The only challenge is not to have the downtime. There is a simple guide to work on this area. During the registration process, I only need to use a primary domain — and setup the secondary domain as domain alias later on.

For the cost efficiency, I worked on the settings on email routing. For example, if there is an email address that was only accessed by specific people in the organisation, I created some routing rules. By this, I can minimise the number of accounts.

After all emails (including attachments) had been migrated to Google Apps, we kept the “old” servers online for few days just to make sure that no data left behind. I was not sure how long the whole processes was completed, but it was around one week.


nginx error: client intended to send too large body

After moving this site to DigitalOcean‘s cloud environment, I found a problem when uploading a file from my blog posting interface. Looking up from the error log, it says "client intended to send too large body: 1122400 bytes". I wanted to upload a file larger than 1 MB. I’m using nginx for the web server, and the solution is pretty simple.

Edit /etc/nginx/nginx.conf configuration file, and add client_max_body_size 20M; between http { }. Save the config file and start the nginx. Problem solved. If you need higher value, just change the 20 MB to something higher.


.htaccess Snippets

.htaccess Snippets — A collection of useful .htaccess snippets.


Konfirmasi Melalui Telepon untuk Transaksi Kartu Kredit BCA

Saya sudah beberapa tahun ini menggunakan kartu kredit dari BCA (Visa) untuk kebutuhan transaksi perbankan saya. Sampai saat ini, saya tidak mendapatkan masalah untuk seluruh transaksi yang saya lakukan. Apalagi, kebanyakan transaksi adalah terkait dengan kebutuhan pekerjaan.

Transaksi yang saya lakukan kebanyakan adalah secara daring (online), untuk pembelian tiket pesawat, pemesanan hotel, pembayaran sewa server hosting, pembelian nama domain, atau pembelian barang. Selain itu, saya gunakan kartu kredit untuk melakukan pembayaran di beberapa outlet seperti tempat makan.

Kemarin, saya melakukan transaksi melalui internet. Transaksi yang saya lakukan tersebut (di salah satu situs) bukan kali pertama, mungkin lebih dari sepuluh kali, dan tidak ada masalah. Kemarin, ada yang sedikit berbeda.

Beberapa saat setelah saya melakukan transaksi, saya mendapatkan telepon dari nomor yang tidak saya kenal, yaitu: 021-29910700. Ketika saya coba angkat, saya mendapatkan pertanyaan dari penelpon (yang saat itu langsung menyapa saya dengan nama saya). Melalui pembicaran singkat, penelpon memperkenalkan diri dari BCA yang terkait dengan transaksi kartu kredit, dan menanyakan apakah benar saya baru saja melakukan transaksi melalui internet.

Penelpon tersebut tidak menanyakan informasi yang sifatnya personal ke saya seperti nomor kartu, nama ibu kandung, atau informasi untuk identifikasi. Kalaupun ditanyakan, mending saya memilih untuk tidak  memberikan. Apalagi saya memang belum yakin apakah ini benar dari BCA atau bukan. Setelah membenarkan bahwa saya memang melakukan transaksi, penelpon tersebut mengucapkan terima kasih, dan mengakhiri pembicaraan.

Karena agak penasaran apakah benar itu dari pihak BCA, akhirnya saya putuskan langsung untuk menghubungi Halo BCA melalui telepon. Saat itu, saya diterima oleh operator bernama Fajri. Saya sampaikan secara singkat kejadian yang baru saja saya alami. Pihak BCA mengkonfirmasi bahwa memang benar bahwa nomor 021-2991070 adalah dari pihak BCA. Dan, saya tanyakan/pastikan bahwa tidak ada masalah dengan kartu kredit saya.


Heartbleed Test

Heartbleed test tool — Test your server for Heartbleed (CVE-2014-0160)


Photon:'s Content Delivery Network

Dealing with side loads for heavy-traffic website sometime can be painful. But, of course there are some common practice to deal with this kind of situation. For example, you can take advantage of cache system, offload to other service to reduce server load/bandwidth, or using CDN (Content Delivery Network).
For WordPress-powered sites, you can take advantage from its Jetpack. This free plugin offered lots of handy features to help you work with your WordPress installation. One of them is a featured called Photon.

Give your site a boost by loading images in posts from the content delivery network. We cache your images and serve them from our super-fast network, reducing the burden on your Web host with the click of a button.

That’s right. You should see some big hints there: content delivery network, cache, super-fast network. To activate this feature, just hit the “Activate” button, and you’re set. All your uploaded media files will be served using infrastructure. After having this feature activated, all image URLs in your posts will be modified. For example:

  • Original URL:
  • New URL:

If you are interested, here is an example of the image header served from network.

HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: public, max-age=63115200
Content-Type: image/png
Date: Sun, 06 Oct 2013 17:06:28 GMT
Expires: Wed, 07 Oct 2015 05:06:26 GMT
Last-Modified: Sun, 06 Oct 2013 17:05:27 GMT
Server: ECS (sin/47C6)
X-Bytes-Saved: 8597
X-Cache: HIT
X-Content-Type-Options: nosniff
X-nc: HIT iad 90
Content-Length: 46456

Klarifikasi dan diskusi dengan pihak BCA seputar blokir Internet Banking

Malam ini, saya berkesempatan untuk berdiskusi dengan pihak perwakilan BCA seputar permasalahan saya seputar Internet Banking BCA yang saya alami kemarin (Baca: Permasalahan akun Internet Banking BCA diblokir karena antivirus?). Walaupun sebenarnya permasalahan saya tersebut bisa dikatakan sudah selesai (Baca: Tindak lanjut permasalahan Internet Banking BCA yang terblokir dan beberapa catatan lain).

Namun, dari obrolan saya mendapatkan beberapa informasi yang ingin saya bagikan dan semoga bermanfaat jika mengalami permasalahan serupa. Atau, mungkin sebagai informasi awal jika permasalahan seperti yang saya alami muncul dikemudian hari.

Diskusi dengan pihak BCA

Sekitar pukul 17:51 WIB (22 Desember 2012) saya mendapatkan telpon dari pihak Halo BCA yang bermaksud menanyakan beberapa hal/keluhan yang saya sampaikan melalui Twitter. Dalam pembicaraan singkat tersebut, saya sampaikan juga bahwa permasalahan yang saya alami sudah selesai, dan saya sudah dapat mengakses akun Internet Banking BCA saya tanpa masalah.


Twitter Bootstrap, LESS CSS, and Caching Problem

I’m working on some works right now with a small team at the office. We decided to use Bootstrap as the front-end development framework. We came up with this solution for some key reasons:

  • We need to do it fast.
  • It’s easy to maintain, especially for a collaborative project
  • Bootstrap is cool.

There are lots of similar frameworks to choose like Skeleton,, Blueprint, Foundation, and more. It didn’t take long discussion to take Bootstrap. Its features and flexibilities are just perfect for our need. The next thing is that we need to do some customisations, for example on the font sizes and colours. Since Bootstrap might release updates in the future, it’s better to leave the core files untouched.


Basically, it’s easy to customise them by using its own customisation tool. But, I prefer another method by using LESS. And yes, Bootstrap works great with LESS. The installation works straight forward. After downloading less.js file, add these two lines in the <head>

<link rel="stylesheet/less" href="/path/to/bootstrap.less">
<script src="/path/to/less.js"></script>

Inside bootstrap.less file, there is a little note that we can easily modify the font color and size by working on the variables.less file. I decided not to edit it. I created another .less file — for example: mycustom.less — and import it from bootstrap.less file. So, my bootstrap.less file looks like this:

@import "accordion.less";
@import "carousel.less";
@import "hero-unit.less";
// My Custom LESS
@import "mycustom.less";

And, this is what I have for mycustom.less:

@baseFontSize: 13px;
@tableBorder: #ddd;
@navbarInverseBackground: #faa141;
@navbarInverseBackgroundHighlight: #ec8b22;
@navbarInverseBorder: #d77c1b;
@navbarInverseLinkColor: #fff;

It should just work. But, does it work as expected? No.


Editing and saving mycustom.less file, and refreshing my page does not load the latest variables. It takes time to refresh/load the latest changes. It’s not good. It happens because less.js caches the .less files called using @import.
I tried to modify the web server setting by adding these lines in my httpd.conf file:

<FilesMatch ".less$">
Header set Cache-Control "no-cache"

But, it didn’t work. After searching for solutions, there is a method offered for this issue. I added this line of code:
<script>localStorage.clear(); </script>
Now, whenever I make some changes on my .less files, reloading the page will give the latest changes. It works.