How to Install and Configure web2py in Fedora 25/CentOS

Web2Py is a simple yet powerful Python framework for developing web applications. In this tutorial we will show how to install the Web2Py framework on a Fedora 25/CentOS 7.

First things first. Once you have the VPS make sure that you update it so that you can have the latest software.

# yum update


Create your application directory. In this example, we will be working in the /opt directory but you can use a directory of your choice.

# mkdir /opt/web2pyapp
# git clone --recursive /opt/web2pyapp

We will need an SSL key and a certificate so that we can later access the administrative interface. For safety reasons, it is best if we put them in a different directory.

# mkdir /opt/web2pyapp_keys
# cd /opt/web2pyapp_keys
# openssl req -x509 -new -newkey rsa:4096 -days 3652 -nodes -keyout web2pyapp.key -out web2pyapp.crt

Generating a 4096 bit RSA private key
writing new private key to 'web2pyapp.key'
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Missouri
Locality Name (eg, city) [Default City]:St. Louis
Organization Name (eg, company) [Default Company Ltd]:Web2Py
Organizational Unit Name (eg, section) []:Web2Py
Common Name (eg, your name or your server's hostname) []
Email Address []:
### Set proper privileges for the ssl certificate
cd /opt
# chmod 700 web2pyapp_keys
# chmod -R 600 web2pyapp_keys/*

If everything is done correctly by this step, this is how should our layout in /opt should look like.

# ls -l /opt
total 8
drwxr-xr-x 13 root root 4096 Nov 12 11:21 web2pyapp
drwx------ 2 root root 4096 Nov 12 11:04 web2pyapp_keys

# ls -l /opt/web2pyapp
total 1268
-rw-r--r-- 1 root root 214 Nov 12 09:46 ABOUT
-rw-r--r-- 1 root root 12965 Nov 12 09:46
drwxr-xr-x 5 root root 4096 Nov 12 10:37 applications
-rw-r--r-- 1 root root 747 Nov 12 09:46 appveyor.yml
-rw-r--r-- 1 root root 65085 Nov 12 09:46 CHANGELOG
drwxr-xr-x 2 root root 4096 Nov 12 10:01 deposit
drwxr-xr-x 2 root root 4096 Nov 12 09:46 docs
drwxr-xr-x 2 root root 4096 Nov 12 09:46 examples
drwxr-xr-x 4 root root 4096 Nov 12 09:46 extras
-rw-r--r-- 1 root root 6067 Nov 12 09:46
drwxr-xr-x 5 root root 4096 Nov 12 10:37 gluon
drwxr-xr-x 2 root root 4096 Nov 12 09:46 handlers
-rw-r--r-- 1 root root 18338 Nov 12 11:21 httpserver.log
-rw-r--r-- 1 root root 5727 Nov 12 09:46 LICENSE
drwxr-xr-x 2 root root 4096 Nov 12 10:01 logs
-rw-r--r-- 1 root root 5684 Nov 12 09:46 Makefile
-rw-r--r-- 1 root root 24 Nov 12 09:46
-rw------- 1 root root 756 Nov 12 11:10 nohup.out
-rw-r--r-- 1 root root 92 Nov 12 11:20
-rw-r--r-- 1 root root 3896 Nov 12 09:46 README.markdown
drwxr-xr-x 2 root root 4096 Nov 12 09:46 scripts
-rw-r--r-- 1 root root 3320 Nov 12 09:46
drwxr-xr-x 2 root root 4096 Nov 12 09:46 site-packages
-rw-r--r-- 1 root root 337 Nov 12 09:46 tox.ini
-rw-r--r-- 1 root root 52 Nov 12 09:46 VERSION
-rwxr-xr-x 1 root root 900 Nov 12 09:46
-rw-r--r-- 1 root root 1089202 Nov 12 10:01 welcome.w2p

# ls -l /opt/web2pyapp_keys
total 8
-rw------- 1 root root 2057 Nov 12 09:52 web2pyapp.crt
-rw------- 1 root root 3272 Nov 12 09:52 web2pyapp.key

We are ready to start our python application server now.

# python /opt/web2pyapp/ -a 'STRONG-PASSWORD-HERE' -k /opt/web2pyapp_keys/web2pyapp.key -c /opt/web2pyapp_keys/web2pyapp.crt -i -p 8000

web2py Web Framework
Created by Massimo Di Pierro, Copyright 2007-2016
Version 2.14.6-stable+timestamp.2016.
Database drivers available: sqlite3, imaplib, pymysql, pg8000

Open up a web browser and put https://your-ip-address:8000/ in the navbar.

Accept the certificate warning and the Web2Py welcoming page should appear. To login to the administration back-end, click on mysites and enter your password, the one that you used while starting the webserver.

To stop the webserver use the CTRL+C key combination.


Ignore PHP Curl SSL Verification

Maybe one of your SSL Certificate is somehow not verify well by Curl. One of my API domain get strange error this morning.

--2016-11-30 06:34:52--  https://xxxx.api/
Resolving xxxx.api (xxxx.api)...
Connecting to xxxx.api (xxxx.api)||:443... connected.
ERROR: The certificate of `xxxx.api' is not trusted.
ERROR: The certificate of `xxxx.api' hasn't got a known issuer.

And I don’t know exactly, maybe lib-curl is broken, php-curl is broken or something else broken. But passing some parameter to CURL to ignore those buggy invalid verification is good enough to solve this silly problem.

According to documentation: to verify host or peer certificate you need to specify alternate certificates with the CURLOPT_CAINFO option or a certificate directory can be specified with the CURLOPT_CAPATH option.

Also look at CURLOPT_SSL_VERIFYHOST: 1 to check the existence of a common name in the SSL peer certificate. 2 to check the existence of a common name and also verify that it matches the hostname provided.

$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);

How to Solve Vagrant box could not be found or could not be accessed Error in Mac OS

Vagrant have a litte issue this week in MacOS. Many vagrant user reporting they can’t found and access vagrant box from their Atlas Repository. A serious issue when you can’t download and run any new box.

To solve this issue: Continue reading How to Solve Vagrant box could not be found or could not be accessed Error in Mac OS

How to Install Froxlor on CentOS 7

Froxlor is my new apps on the block for managing servers. This is true alternative for –big-n-old– CPanel/WHCMS. Froxlor Server Management released as free and opensource software by Froxlor Team.

Froxlor as a server management panel is a total Good of Snack. Its lightweight, tight and full of features. Developed by experienced server administrator, and actually simplifies the effort of managing our hosting platform. Currently Froxlor is at 0.9.xx version.


For basic requirement, you must already have LAMP or LEMP packages, with PHP 5.4 or above packages. In this tutorial, we will prepare LAMP environment in CentOS and then install Froxlor. Continue reading How to Install Froxlor on CentOS 7

Instalasi dan Penggunaan Bower, Package Manager utk Javascript

Website modern, kini mau tidak mau disusun dengan banyak komponen javascript, ada framework, ada library, ada asset dll. Memantau perkembangan masing-masing komponen dan memastikan kesemuanya berjalan uptodate kayanya bukan pekerjaan yang gampang, apalagi jika sudah bersinggungan dengan banyak framework dan library javascript.

Untuk itulah kita butuh solusi untuk manage semua kebutuhan diatas. Di PHP kita mengenal composer, di javascript ada bower. Bower sebenarnya tidak hanya mampu mengelola kebutuhan Javascript saja, tapi juga file HTML, CSS, Font dan Image.


Instalasi Bower

Sebelum menginstall bower, setidaknya sudah harus ada nodenpm dan git ya. Untuk instalasi bower, cukup jalankan perintah ini di terminal/console:

npm install -g bower

pada direktori public tempat asset biasanya di load ya.

Penggunaan Bower

Untuk menggunakan bower, semuanya bisa dilakukan lewat terminal/console. Seluruh packages yang diinstall oleh bower, akan masuk ke folder bower_components/.

Untuk melakukan instalasi packages, tulis nama paket setelah perintah bower install. Misal:

bower install jquery

Jika packages itu kebetulan tersedia di Github, kita juga cukup menginstallnya dengan tag shorthand dari Githubnya. Contoh

bower install desandro/masonry

atau jika hanya ada repo git saja, contohnya:

bower install git://

dan jika hanya tersedia pada website saja, bisa pakai contoh berikut:

bower install

Bower sendiri menyediakan juga fitur searching packages di

Untuk penggunaan javascript itu sendiri bisa digunakan secara manual ataupun menggunakan Grunt atau RequireJS. Cara manualnya, mudah. Contohnya:

<script src="bower_components/jquery/dist/jquery.min.js"></script>

How to Install and Use WSL Distribution Switcher

As you already know, Windows 10 Developer mode bring one feature called Windows Subsystem for Linux, or popular as ‘Bash on Ubuntu on Windows’. This great feature bring linux-based terminal apps and experience to Windows desktop.

Todays, Microsoft only in partnership with Canonical to bring Bash on Ubuntu environment in Windows 10, none other distro can be installed on thoose technology. Until now, a developer and hacker, Roland Bogosi, create a open-source project called WSL Distribution Switcher on Github. Continue reading How to Install and Use WSL Distribution Switcher

Resmi, Canonical Pastikan MSSQL Server Terbaru Jalan di Ubuntu (+ Tutorial Instalasinya)

Microsoft meluncurkan public preview dari SQL Server terbaru yang tidak hanya bisa dijalankan di platform Windows, tapi juga di Linux. Sebagai bagian dari gerakan #MicrosoftLoveLinux yang didengungkan mereka.

Canonical sendiri sebagai pembuat Ubuntu bahkan merilis siaran pers khusus yang mengungkapkan bahwa Ubuntu akan menjadi salah satu distro Linux yang sudah bisa mencicipi SQL Server versi terbaru itu.

Continue reading Resmi, Canonical Pastikan MSSQL Server Terbaru Jalan di Ubuntu (+ Tutorial Instalasinya)

Simple Automated WordPress Deployment Tool with Wordmove

Deploying WordPress site from local server to upstream can be stressful. Especially when you’re battling with local article, specific permalink etc etc. Of course you can use Jenskins, Beanstalk, Deploy and any automation tool you like.

On this article we will focusing on simple yet powerful deployment tool, Wordmove. Wordmove is basically just a simple Ruby package that can help you fast and easy enough to deploy WordPress website. As declared in their Github Repo, Wordmove is just like a ‘Capistrano for WordPress‘.

Continue reading Simple Automated WordPress Deployment Tool with Wordmove

Tutorial Adsense: Melihat Pendapatan Blog/Website Kompetitor

Bermain di dunia online marketing memang butuh inovasi yang terus menerus. Termasuk didalamnya adalah tidak memandang sebelah mata pada website/blog kompetitor dengan niche serupa.

Jika kita mempunyai website dengan niche politik, maka lihatlah website/blog dengan niche politik yang lain. Demikian pula untuk niche lain. Dengan menganalisa potensi strategi dan inovasi yang dilakukan kompetitor, kita akan memperoleh pelajaran berharga yang bisa diaplikasikan di situs kita. Continue reading Tutorial Adsense: Melihat Pendapatan Blog/Website Kompetitor

Tutorial PHP: Cara Menggabungkan Dua Object

Pernah mendapati situasi dimana harus ada dua query SQL yang harus digabung/merge namun tidak bisa secara native di MySQL/PostgreSQL karena tidak dapat menggunakan IF dalam Join?

Cara paling mudah untuk menggabungkan hasil dari query SQL dalam bentuk Object (misal di CodeIgniter) adalah dengan snippet berikut:

$obj_merged = (object) array_merge((array) $object1, (array) $object2);

Selamat mencoba!

Sumber: StackOverflow

Tutorial MySQL: How to Group By Two or More Column in MySQL!

So you trying to group data by multiple column here and you’re using MySQL? There is no native way to do that, you have to combine ‘Group By’ syntax with other else.

Regular Group by would be like this:

select client_id, name, max(cash + stocks)
from client join portfolio using (client_id)
group by client_id

| client_id | name     | max(cash + stocks) |
|         1 | John Doe |              33.33 | 
|         2 | Jane Doe |              90.90 | 

Continue reading Tutorial MySQL: How to Group By Two or More Column in MySQL!

Tutorial PHP: Membuat Push Notification Realtime dengan OneSignal API

Pada tutorial tingkat menengah kali ini kita akan membuat notifikasi realtime ke user dengan API dari Apa itu Sesuai tagline-nya: “High volume, cross platform
push notification delivery”. Dia adalah penyedia jasa push notification untuk berbagai platform, dari mulai webbrowser, android app, iOS, dan banyak lagi.

Kelebihan utama dari adalah harganya yang GRATIS dan UNLIMITED. Ini screenshot dari websitenya soal pricingnya yang Gila:

Onesignal Pricing


Untuk mengikuti tutorial ini, pastikan kamu sudah punya satu website/sistem informasi yang sudah online. Kali ini kita akan batasi saja Push Notification paling simple dengan Webbrowser. Entah itu Browser Desktop (Firefox, Chrome, Safari, Opera dll) ataupun versi mobile (android, iOS) akan berlaku seragam dan sama-sama realtime.

Ada beberapa langkah singkat sebagai gambaran:
1. Signup akun di
2. Signup akun dan buat satu App di Google Services
3. Enable fasilitas Google Cloud Messaging
4. Instalasi SDK
5. Tes notifikasi

Untuk signup akun di, silakan gunakan saja fasilitas oAuth dengan Facebook/Gmail atau Github.

Google Services dan Google Cloud Messaging

Pertama, silakan buka link Google Service Wizard:

Kemudian tulis nama sistem informasi/web sebagai identifikasi nama layanan.

Meskipun sistem informasi/web itu bukan nama aplikasi android, silakan gunakan penamaan unik seperti di android seperti:, misal com.luthfiemka.test dll.

Klik tombol Choose and Configure Services

Kemudian klik Enable Google Cloud Messaging

Dan terakhir, copy dan simpan Sender ID dan API Key dari Google Cloud Messaging tersebut

Instalasi SDK Onesignal

Silakan login terlebih dulu di (signup akun baru jika belum punya).

Buat app baru dengan klik tombol Add New App

Add New App Onesignal

Klik tombol Create.

Pilih Website Push


Klik tombol Next dan pada halaman wizard selanjutnya pilih Google Chrome & Mozilla Firefox atau pilih Apple Safari jika sistem informasi/web mu banyak diakses dari Safari.

Kemudian pada wizard lanjutnya, tuliskan URL sistem informasi/web dan URL icon notifikasi defaultnya (dalam format PNG, transparent).

Pada bagian Choose Subdomain, silakan sesuaikan dengan kebutuhan. Ingat, URL ini adalah subdomain dari onesignal, jadi jangan main-main… akan tampil di notifikasi push yang dikirim.

Klik Next.

Kemudian sekali lagi pilih Google Chrome & Mozilla Firefox. Klik tombol Done. Pastikan kemudian kamu dapat App ID dari Onesignal.

Onesignal App ID

Instalasi SDK di Sistem Informasi/Website

Untuk langkah ini, tergantung dari kebutuhan dan target push notification yang kamu bikin. Apakah ditujukan untuk semua orang (yang baca web), atau hanya user saja (yang bisa login di web/sistem).

Silakan taruh di tempat yang semestinya, misal di bagian header atau footer template website/dashboardmu.

<script src="" async='async'></script>
    var OneSignal = window.OneSignal || [];
    OneSignal.push(["init", {
      appId: "YOUR_APP_ID",
      autoRegister: false, /* Set to true to automatically prompt visitors */
      subdomainName: 'SUBDOMAIN_NAME',   
      notifyButton: {
          enable: true /* Set to false to hide */

Jangan lupa ganti YOUR_APP_ID dengan ID App yang didapat dari Onesignal serta SUBDOMAIN_NAME dengan nama subdomain onesignal kita (ingat di langkah kedua).

Simpan script tersebut dan lihat di browser, seharusnya dibagian kanan bawah ada icon seperti ini:

tombol onesignal

Kemudian uji coba dengan klik icon tersebut, harusnya muncul dialog dari Onesignal seperti berikut:

Screen Shot 2016-08-26 at 8.17.27 PM

dan seketika itupun seharusnya ada notifikasi push yang kita dapat berisi ucapan terimakasih karena telah subscribe push notification.

Screen Shot 2016-08-26 at 8.19.01 PM

Test Notifikasi Baru

Oke, jika langkah sebelumnya sudah berhasil. Saatnya kita mencoba mengirim push notification dari dashboard Onesignal. Silakan login ke Onesignal. PIlih nama App yang kita akan gunakan.

Kemudian klik Link New push notification.

Pada halaman new push tersebut, tuliskan judul notifikasi, dan konten notifikasinya.

Screen Shot 2016-08-26 at 8.23.12 PM

Klik tombol Preview.

Kemudian klik Send untuk mengirim push notification tersebut. INGAT, dilihat dulu konten yang anda kirim. Notifikasi setidaknya bisa diterima subscriber 1-5 detik, sekali salah konten, sudah tidak bisa di perbaiki!

Screen Shot 2016-08-26 at 8.24.50 PM

Selamat mencoba!

Gampang! Inilah Cara Membuat Format Uang pada MySQL

Pernah melakukan query SQL untuk mendapatkan jumlah nilai uang yang ada pada suatu tabel SQL? Mungkin ini solusi yang bisa kamu pakai.

Misalkan kita punya tabel data dengan kolom: nomor pembayaran, jumlah uang yang dibayarkan, bank tujuan. Tabel yang dikehendaki, jumlah pembayar tiap bank dan jumlah uang yang terbayar pada tiap bank.

Untuk query pertama, jumlah pembayar tiap bank contohnya:

select nama_bank, count(nomor_pembayaran) as jumlah_pembayar from datatagihan where status_bayar = 'lunas'

untuk query kedua, jumlah uang yang terbayar pada tiap bank, contohnya:

select nama_bank, count(nomor_pembayaran) as jumlah_pembayar, sum(nilai_tagihan) as jumlah_uang from datatagihan where status_bayar = 'lunas'

untuk format uang dalam sql bisa pakai syntaks: format( nama_kolom, jumlah_0_dibelakangkoma) contohnya: format( jumlah_uang, 2).

select nama_bank, count(nomor_pembayaran) as jumlah_pembayar, format( sum(nilai_tagihan), 0) as jumlah_uang from datatagihan where status_bayar = 'lunas'

Hasilnya, 1,200,000. Jika dibutuhkan tanda ‘Rp’ didepan angka tersebut, silakan tambah ‘Rp’ dengan concat:

select nama_bank, count(nomor_pembayaran) as jumlah_pembayar, concat('Rp ', format( sum(nilai_tagihan), 0)) as jumlah_uang from datatagihan where status_bayar = 'lunas'

Selamat mencoba!

SIMPLE! This is How to Create Sudo Users in Ubuntu!

The sudo command provides a mechanism for granting administrator privileges, ordinarily only available to the root user, to normal users. This guide will show you the easiest way to create a new user with sudo access on Ubuntu, without having to modify your server’s sudoers file. If you want to configure sudo for an existing user, simply skip to step 3.

Steps to Create a New Sudo User
Log in to your server as the root user. Continue reading SIMPLE! This is How to Create Sudo Users in Ubuntu!

Belajar PHP: Membuat File JPG dari Data BLOB MySQL

Pada belajar PHP kali ini, kita akan membuat file gambar JPG dari data BLOB yang tersimpan di tabel MySQL. Yang dibutuhkan adalah tabel yang berisi konten BLOB. Apa itu BLOB? Silakan lihat disini.

Sintaks yang bisa kita gunakan: Continue reading Belajar PHP: Membuat File JPG dari Data BLOB MySQL

Belajar PHP: Mengenal Propel, ORM PHP 5.5 Yang Cepat dan Mudah Dicustom

Pengertian Propel/Apa itu Propel

Propel adalah Object-Relational Mapping (ORM) opensource untuk database SQL di PHP 5.5 ke atas yang membuat akses ke database menggunakan bentuk objects, yang dikemas secara sederhana dengan menggunakan API, baik untuk menyimpan atau mengambil data.

Salah satu hal lain yang dimahfumi dari ORM adalah kemampuan query-builder yang unik, pembuatan dan migrasi schema database, kemampuan reverse engineering tabel/database yang ada dan lain-lain.

Propel ORM
Propel ORM

Kenapa Propel?

Continue reading Belajar PHP: Mengenal Propel, ORM PHP 5.5 Yang Cepat dan Mudah Dicustom

thefu*k, aplikasi anti typo command di Ubuntu

Typo, satu hal yang sering kita alami kalau sedang bermain di console/terminal. Saya sendiri termasuk yang sering lupa mengetik sudo sebelum apt-get, atau bahkan malah mengetik aptget daripada apt-get. Konyol memang.

Nah, bagi yang kerap kena penyakit typo, kalian bisa coba aplikasi kecil yang berjalan di Ubuntu (dan tentunya distro Linux lain), namanya thefuck. Ya, jorok memang. Kita akan ganti nanti setelah terinstall


untuk instalasi thefuck di Ubuntu (atau turunannya) silakan ikuti perintah berikut:

sudo apt update
sudo apt install python3-dev python3-pip
sudo -H pip3 install thefuck

untuk instalasi thefuck di Linux lain, bisa memanfaatkan Python Installer (pip):

sudo -H pip install thefuck

OK, jika dirasa nulis “fuck” terlalu jorok di kantor, kalian bisa bikin alias di console/terminal dengan contoh misalnya, tulis di file .bash_profile, .bashrc, .zshrc:

eval "$(thefuck --alias dhus)"

Simak video tutorialnya berikut: