Category Archives

412 Articles
Konfigurasi CAS 5.1.2
Arsitektur SSO dasar.

Konfigurasi CAS 5.1.2

Apereo CAS (sebelumnya Jasig CAS) banyak dipakai untuk SSO. Cara pemasangannya agak ribet dan sulit. Kebetulan, versi CAS 5.1.2 sekarang sudah menggunakan Spring Boot sebagai dasarnya.

Keuntungan penggunaan Spring Boot adalah Jasig CAS menggunakan banyak keunggulan framework Spring. Misalnya, teknologi Spring Cloud untuk teknologi devops, Spring Web Flow untuk arsitektur layanan mikro (micro service), service discovery, dan konfigurasi melalui YAML. Sehingga, kita bisa memasang infrastruktur SSO melalui CAS tanpa harus mengoding seperti dahulu. Atau, kita bisa mengembangkan layanan yang terpisah dari SSO ala layanan mikro.

Sebelum infrastruktur bertambah rumit, saya ingin memberikan jembatan keledai. Sebab, saya pikir SSO ini agak sulit pada awalnya kalau tidak tahu caranya. Saya harap ketika selesai membaca artikel ini, pembaca ada gambaran bagaimana SSO bisa dikembangkan.

Arsitektur yang dipilih

Arsitektur SSO

Arsitektur SSO dasar.

Ada banyak pilihan, tetapi saya memilih kapabilitas komponen yang bisa diskalakan secara horizontal dan modern. Misalnya, ada banyak pilihan untuk ruang penyimpan tiket (Ticket Storage), tetapi saya memilih Redis karena dia implementasi modern yang banyak dipakai untuk teknologi dewasa ini.

Setiap komponen yang saya pilih ini dapat dikluster. Saya memilih untuk mengembangkan satu layanan per mesin. Nanti kalau sudah mengerti teknologi perawanan, [uhuk colek Utian Ayuba] Anda bisa mengubah setiap ini menjadi konfigurasi devops macam Ansible, Puppet, Chef, Vagrant,  atau apa pun agama Anda.

CAS IdP

CAS IdP adalah mesin utama yang menyediakan profil, otentikasi, dan otorisasi. Semua klien terhubung ke sana.

Cara buat:

CAS IdP Server

CAS Ticket Storage

Secara baku CAS IdP menyimpan tiket sesi pada memori. Namun, untuk arsitektur kluster dan skalabilitas, lebih baik menggunakan Redis. Mengapa Redis? Karena Redis utamanya menggunakan memori.

Untuk peladen Redis tidak perlu dikluster. Lebih baik satu instans Redis yang memakan memori 24 GB dari pada membuat kluster.

Cara buat:

Redis Ticket Storage

CAS Service Storage

Satu situs/sistem/aplikasi yang menggunakan CAS untuk SSO disebut satu layanan (service). Setiap layanan dapat didefinisikan logo, URL, ACL pengguna, dan sebagainya secara granular. Itu semua secara baku disimpan oleh CAS IdP di berkas JSON.

Untuk pengelolaan yang lebih baik, saya memilih PostgreSQL sebagai ruang penyimpan. Pengalaman saya membandingkan PostgreSQL dengan MySQL mengatakan bahwa PostgreSQL rajanya basisdata untuk basisdata perangkat lunak bebas terbuka. Waktu itu saya membandingkan layanan Roundcube Webmail dengan MySQL dan PostgreSQL. Anda sebagai pengguna Webmail UI pasti merasakan bagaimana Webmail UI itu seperti mengakses sistem HTML statik.

Saya, sih, tidak apa kalau ada yang mau menggunakan MongoDB atau yang lainnya. Tetapi saya memilih karena daftar layanan ini tidak perlu kecepatan khusus. Selain itu, daftar layanan butuh untuk tahan banting, saya lebih memilih PostgreSQL. Tentu saja, saya takkan memilih Redis.

Cara buat:

CAS Service Registry

CAS Authentication Provider

Normalnya CAS menggunakan Spring Security dengan login casuser dan sandi Mellon. Tentunya, ini buat yang main-main. Untuk yang lebih serius, gunakan LDAP, basis data, atau bahkan layanan REST.

Penyedia otentikasi CAS dapat lebih dari satu (komposit). Tetapi, untuk kali ini, gunakan saja LDAP.

Cara buat:

CAS Auth LDAP

CAS Service Management Webapp

Aduh, lupa menulis dokumentasi. Silakan simpan URL ini, nanti saya coba tulis. Untuk sementara, langsung saja buat di basisdata. He… he… he….

Studi Kasus: WordPress

Penasaran dengan hasilnya? Langsung saja, buat aplikasi WordPress. Mengapa WordPress? Karena gampang memasangnya. Tinggal pakai plugin WP Cassify, daftarkan URL WP sebagai satu layanan, dan beres!

Cara buat:

WordPress Cassify

TODO:

  • Personalisasi halaman login.
  • Membuat CAS IdP terkluster (lebih dari satu instans)
  • Entahlah….
Membuat Cetakan Salindia dengan Reveal JS

Membuat Cetakan Salindia dengan Reveal JS

Saya tertarik untuk mengubah semua presentasi saya dengan HTML5. Kalau Anda lihat di laman publikasi, saya sudah bereksperimen dengan beberapa. Kali ini, saya menemukan sebuah proyek pembuatan salindia yang cukup modular: Reveal JS.

Dia memiliki fitur yang saya butuhkan: presentasi di peramban, cetak ke PDF, dan sintaksis. Ada juga yang mengembangkan catatan pemresentasi dan skema klien-peladen untuk menghubungkan beberapa perangkat. Tujuan dari sinkronisasi ini untuk tampilan pemresentasi dan tampilan presentasi berbeda. Tetapi, saya jarang menggunakan catatan kaki. Makanya, saya tidak mengejar fitur ini.

 “Well, hell! PMP exam topics That’s no excuse for insulting me! You PMP exam topics 300-320 questions pdf are 300-320 questions pdf Ma’s PMP exam topics PMP exam topics own blood son, but did PMP exam topics she take on that time PMP exam topics Tony Fontaine shot you in the leg? 70-532 answer analysis No, she 70-532 answer analysis just 300-320 questions pdf sent for old Doc 70-532 answer analysis Fontaine to dress it and asked the doctor what ailed Tony’s aim. Said she guessed licker was spoiling his marksmanship. Remember how mad that made Tony?”Both boys yelled 70-532 answer analysis with laughter.“Ma’s a card!” said Brent with loving approval. “You can always count on her to do the right thing 300-320 questions pdf and 70-532 answer analysis not embarrass you in front of PMP exam topics folks.”  But Gerald remained Gerald. 300-320 questions pdf His habits PMP exam topics of living and his ideas changed, but his manners he would 300-075 certification exam not change, 300-075 certification exam even had he been 70-532 answer analysis able to change them. He admired 300-320 questions pdf the drawling 300-075 certification exam elegance of the 300-075 certification exam wealthy rice and cotton planters, who rode into Savannah from their moss-hung kingdoms, mounted 70-532 answer analysis on 300-320 questions pdf thoroughbred horses and followed by the carriages of their 300-320 questions pdf equally elegant ladies 70-532 answer analysis and the wagons 300-320 questions pdf of their slaves. But Gerald could never attain elegance. 70-532 answer analysis Their lazy, blurred voices fell pleasantly 300-075 certification exam 300-075 certification exam 300-320 questions pdf on PMP exam topics his PMP exam topics ears, but his 300-075 certification exam PMP exam topics own 300-075 certification exam brisk brogue clung to his tongue. He liked the casual 70-532 answer analysis 300-075 certification exam grace with which they PMP exam topics conducted affairs 300-320 questions pdf of importance, 300-320 questions pdf risking 300-320 questions pdf a fortune, a plantation or a slave 70-532 answer analysis 300-075 certification exam on the 300-075 certification exam turn 70-532 answer analysis of a card and writing off their losses with careless good humor and no more ado than when they scattered 300-320 questions pdf pennies to pickaninnies. But Gerald had known poverty, and PMP exam topics he could never PMP exam topics learn to lose money with 70-532 answer analysis good 300-075 certification exam humor or good 300-320 questions pdf 70-532 answer analysis 300-320 questions pdf grace. They were PMP exam topics a pleasant race, these coastal Georgians, with their soft-voiced, 70-532 answer analysis PMP exam topics quick rages and their charming inconsistencies, and Gerald liked them. But 300-075 certification exam there was a 300-075 certification exam brisk and 70-532 answer analysis restless vitality 300-075 certification exam about the young Irishman, fresh from a country where winds blew wet and chill, where misty swamps held no fevers, that 300-075 certification exam set him apart from these indolent gentle-folk of semi-tropical weather and malarial marshes.

Reveal JS cukup mudah dikembangkan. Selain memiliki contoh situs yang menggambarkan penggunaannya, Reveal JS juga menyediakan contoh-contoh penggunaan yang gila di alam sana. Salah satu yang menginspirasi saya adalah The Arab Spring Uprisings Five Years On oleh Council on Foreign Relations.

Modularitas ini yang membuat pengembangan Reveal JS bisa ditambah-tambahi dengan berbagai macam. Tetapi, saya yakin, yang paling penting adalah bagaimana cara memulainya. Apalagi, untuk orang-orang yang tidak terbiasa dengan Node JS, memasang paket-paket Node JS sangat mahal (biaya Internet) dan membingungkan.

Saya akan memulai membangun dasar Reveal JS yang saya gunakan mulai dari nol sampai beberapa modul yang saya rasa perlu. Di akhir tulisan ini, akan ada sebuah cetakan salindia yang siap untuk dibuat.

Paket Dasar

Perhatikan struktur direktori sebagai berikut:

.
├── css
│   ├── reveal.css
│   └── theme
│       └── beige.css
├── index.html
└── js
    └── reveal.js

Sesuai dengan contoh dari Reveal JS, hal yang paling dasar cukup menyediakan 4 berkas:

  1. Berkas CSS Reveal JS.
  2. Berkas CSS tematik yang digunakan. Untuk contoh kali ini saya menggunakan tematik Beige.
  3. Berkas Javascript Reveal JS sebagai skrip penjalan.
  4. Berkas HTML sebagai berkas salindia.

Anggap sudah ada di sebuah direktori, mari buat struktur yang cukup:

mkdir -p js css/theme

Unduh tiga berkas dari situs Reveal JS.

wget https://raw.githubusercontent.com/hakimel/reveal.js/master/css/reveal.css -O css/reveal.css
wget https://raw.githubusercontent.com/hakimel/reveal.js/master/css/theme/beige.css -O css/theme/beige.css
wget https://raw.githubusercontent.com/hakimel/reveal.js/master/js/reveal.js -O js/reveal.js

Lalu, buat sebuah berkas HTML biasa sebagai kerangka kerja:

cat > index.html << EOF
<html>
        <head>
                <link rel="stylesheet" href="css/reveal.css">
                <link rel="stylesheet" href="css/theme/beige.css">
        </head>
        <body>
                <div class="reveal">
                        <div class="slides">
                                <section>Slide 1</section>
                                <section>Slide 2</section>
                        </div>
                </div>
                <script src="js/reveal.js"></script>
                <script>
                        Reveal.initialize();
                </script>
        </body>
</html>
EOF

Sampai sini, sudah ada presentasi sederhana yang bisa digunakan dengan contoh dua halaman.

Contoh Salindia yang dihasilkan.

Contoh Salindia yang dihasilkan.

Perhatikan bahwa setiap halaman dalam salindia berada di dalam elemen HTML section. Bila ingin membuat laman yang ke bawah, buat section di dalam section. Nanti hasilnya laman dengan panah ke bawah.

Silakan menggunakan elemen HTML di dalam section untuk membuat isi salindia. Beberapa rekomendasi saya:

  • Saya menggunakan elemen H1 untuk membuat judul salindia dan H2 untuk judul laman.
  • Untuk menggunakan poin, gunakan saja elemen UL (unordered list) seperti biasa.

Fitur Pencetakan ke PDF

Untuk mencetak lebih baik, diperlukan dua berkas CSS yang memformat salindia menjadi format untuk dicetak:

mkdir -p css/print
wget https://raw.githubusercontent.com/hakimel/reveal.js/master/css/print/pdf.css -O css/print/pdf.css
wget https://raw.githubusercontent.com/hakimel/reveal.js/master/css/print/paper.css -O css/print/paper.css

Setelah itu, ubah HTML salindia pada elemen HEAD untuk membuat skrip yang sesuai:

<html>
<head>
<!-- ... -->
        <!-- Printing and PDF exports -->
        <script>
            var link = document.createElement( 'link' );
            link.rel = 'stylesheet';
            link.type = 'text/css';
            link.href = window.location.search.match( /print-pdf/gi ) ? 'css/print/pdf.css' : 'css/print/paper.css';
            document.getElementsByTagName( 'head' )[0].appendChild( link );
        </script>
<!-- ... -->
</head>
<body>
<!-- ... -->
</body>

Saya membuang konteks yang lain agar tidak bingung Anda mau memasukkan baris elemen SCRIPT di mana.

Setelah ini, ketika mengakses dengan peramban, tambahkan “?print-pdf” (tanpa kutip) pada ujung URL. Tata letak dengan URL tersebut akan terlihat aneh. Namun, bila kita menekan CTRL+P untuk menampilkan dialog pencetakan, salindia akan tercetak dengan baik.

Print presentation to PDF.

Print presentation to PDF.

Dengan ini, salindia yang dibuat bisa diekspor ke PDF.

Skrip Pembantu

Sebelum memasang plugin, tambahkan skrip pembantu Head JS untuk membantu memasang skrip-skrip plugin ke elemen HEAD.

Unduh berkas-berkas seperti biasa.

mkdir -p lib/js
wget https://raw.githubusercontent.com/hakimel/reveal.js/master/lib/js/head.min.js -O lib/js/head.min.js

Tambahkan skrip pembantu sebelum skrip Reveal JS.

<html>
<head>
<!-- ... -->
</head>
<body>
<!-- ... -->
                <script src="lib/js/head.min.js"></script>
                <script src="js/reveal.js"></script>
<!-- ... -->
</body>

Dengan adanya Head JS ini, plugin-plugin bisa dimuat dengan mudah.

Fitur Kode

Saya tahu pasti kebanyakan yang membaca tulisan saya adalah seorang yang biasa mempresentasikan kode. Reveal JS menggunakan Highlight JS, tetapi saya lebih suka Prism JS.

Untuk Prism JS, harus mengunduh secara manual dan menaruhnya di direktori plugin/prism

mkdir -p plugin/prism

Tambahkan secara manual dua berkas Prism JS (CSS + Javascript) sehingga direktori tersebut berisi:

plugin/prism/
├── prism.css
└── prism.js

Ada dua tempat yang harus ditambahkan.

CSS

CSS diperlukan untuk tematik kode. Ditambahkan di elemen HEAD sehabis berkas CSS tematik.

 

<html>
<head>
<!-- ... -->
                <link rel="stylesheet" href="css/theme/beige.css">
                <link rel="stylesheet" href="plugin/prism/prism.css">
<!-- ... -->
</head>
<body>
<!-- ... -->
</body>

Setelah ini Javascript.

Javascript

Ubah konfigurasi di perintah:

Reveal.initialize();

Tambahkan berkas Javascript tersebut:

Reveal.initialize({
  dependencies: [
    { src: 'plugin/prism/prism.js' },
  ]
});

Contoh Penggunaan

Kode di HTML:

<section>
     <h2>Slide 3</h2>
     <pre><code class="language-html" data-trim data-noescape>
&#60;pre&gt;&#60;code class="language-bash"&gt;$ echo Test &#60;/code&gt;&#60;/pre&gt;
     </code></pre>
</section>

Hasilnya:

Highlight

Highlight

Fitur Markdown

Buat orang-orang yang terbiasa mengisi WIKI, Github Pages, dan sejenisnya, bahasa Markdown lebih sederhana daripada harus mengetik elemen HTML.

Unduh berkas-berkas seperti biasa.

mkdir -p plugin/markdown
wget https://raw.githubusercontent.com/hakimel/reveal.js/master/plugin/markdown/markdown.js -O plugin/markdown/markdown.js
wget https://raw.githubusercontent.com/markedjs/marked/master/marked.min.js -O plugin/markdown/marked.js

Javascript

Ubah konfigurasi di perintah:

Reveal.initialize();

Tambahkan kedua berkas tersebut:

Reveal.initialize({
  dependencies: [
    { src: 'plugin/prism/prism.js' },
    { src: 'plugin/markdown/marked.js' },
    { src: 'plugin/markdown/markdown.js' },
  ]
});

Contoh Penggunaan

<section data-markdown><script type="text/template">
## Slide 4: Markdown

```bash 
echo "Hello World!"
```
</script></section>

Hasilnya:

Created with Markdown

Created with Markdown

Terakhir

Saya lelah. Nanti lanjut (kalau tidak malas). Setidaknya saya sudah memberikan gambaran bagaimana cara menggunakan Reveal JS dan menambahkan plugin tambahan.

Bacaan Lebih Lanjut

Solusi PostgreSQL dengan Patroni
PostgreSQL database

Solusi PostgreSQL dengan Patroni

Tahun baru dan Universitas Indonesia kedatangan peladen baru. Berhubung tim pengembang DSTI UI membuat pengembangan berbasis pelayan-mikro (microservice) dan ada pengembang yang iseng menantang saya menuju Kubernetes, saya pun tertantang membuat tutorial yang mendukung arsitektur tersebut. Kubernetes menyediakan fasilitas skalabilitas untuk menambah dan mengurangi peladen suatu layanan secara otomatis atau bisa diprogram manual.

Cara yang paling mudah untuk menyiapkan infrastruktur adalah dengan mengambil resep dari Ansible Playbook, menggunakan Juju, menggunakan helm, atau pemaket awan menurut keyakinan dan kepercayaan masing-masing. Namun, sebelum itu, saya tertarik untuk membahas bagaimana seandainya bila semua itu dibuat secara manual. Hal ini agar setiap kita dapat memahami bagaimana cara kerja masing-masing komponen yang nantinya diterbitkan dengan satu baris kode.

Tulisan ini sebenarnya mengikuti tutorial dari Linode. Hanya saja, saya menyesuaikan dengan lingkungan UI, Debian Stretch. Sehingga, ada yang saya modifikasi untuk keperluan dan keyakinan saya.

Arsitektur

PostgreSQL HA

PostgreSQL HA dengan 3 node dibalik haproxy

Untuk lingkungan ujicoba, saya membuat 5 mesin VM di VirtualBox dengan menggunakan 2 kartu jaringan (NIC). Satu NIC tipe NAT untuk keluar (standar VirtualBox) dengan DHCP. Satu lagi NIC tipe Jaringan Internal yang digunakan untuk setiap VM berkomunikasi satu sama lain.

pg1:

  • hostname: pg1
  • NIC: 192.0.2.11
  • Memori: 1GB

pg2:

  • hostname: pg2
  • NIC: 192.0.2.12
  • Memori: 1GB

pg3:

  • hostname: pg3
  • NIC: 192.0.2.13
  • Memori: 1GB

haproxy0:

  • hostname: haproxy0
  • NIC: 192.0.2.22
  • Memori: 512MB

etcd0:

  • hostname: etcd0
  • NIC: 192.0.2.21
  • Memori: 1GB

Berhubung komputer saya memiliki memori 32GB, saya agak royal mengalokasikan memori. Untuk keperluan pembelajaran, bisa, kok, dikurangi menjadi 512MB. Tapi, saya belum mencoba.

Sekedar tips untuk pengerjaan pg1 s.d. pg3. Sebaiknya kerjakan saja dulu pg1 lalu setelah rampung, klon dan ubah konfigurasi IP dan hostname sesuai dengan masing-masing mesin.

Konfigurasi Jaringan

Ada dua hal yang perlu dikerjakan:

  1. Konfigurasi IP pada NIC yang digunakan untuk berkomunikasi
  2. Tambahkan daftar hostname.

Konfigurasi IP

Pertama-tama kita perlu tahu NIC yang perlu dikonfigurasi. Debian Stretch sudah tidak lagi menyediakan ifconfig. Cara yang sahih sekarang untuk mengetahui ada antarmuka NIC apa saja yang tersedia:

$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:86:ca:c3 brd ff:ff:ff:ff:ff:ff
3: enp0s8: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
    link/ether 08:00:27:20:b1:2b brd ff:ff:ff:ff:ff:ff

Pada konfigurasi VM saya, yang NIC yang perlu dikonfigurasi adalah enp0s8 — punya Anda bisa beda. Untuk menambahkan konfigurasi IP statik umpanya untuk mesin pg1:

$ sudo tee /etc/network/interfaces.d/enp0s8 << EOF
auto enp0s8
allow-hotplug enp0s8
iface enp0s8 inet static
  address 192.0.2.11
  netmask 255.255.255.0
EOF

Gunakan penyunting teks favorit Anda, tapi saya menggunakan cara heker. 😛

Lakukan ini untuk pg2, pg3, haproxy0, dan etcd0 dengan IP mereka masing-masing.

Untuk langsung mengaktifkan konfigurasi jaringan:

$ sudo ifup enp0s8

Lakukan ini di semua mesin.

Konfigurasi Hostname

Untuk VM, sebaiknya untuk setiap VM yang berhubungan dimasukkan namanya ke daftar /etc/hosts. Lakukan ini di semua mesin:

$ sudo tee -a  /etc/hosts << EOF
192.0.2.21      etcd0
192.0.2.22      haproxy0
192.0.2.11      pg1
192.0.2.12      pg2
192.0.2.13      pg3
EOF

Ganti nama hostname, umpanya untuk mesin pg1:

sudo hostnamectl set-hostname pg1

Keluar dari SSH lalu masuk kembali. Kalau tidak, nama sudah berganti tetapi shell Anda masih bernama yang lama.

Pemasangan etcd

TIPS: Pengerjaan yang saya lakukan adalah saya mematikan pg1. Lalu, saya klon dan saya ubah IP dan hostname.

Aplikasi etcd adalah sebuah repositori konfigurasi yang bisa diakses dari jaringan. Dia bisa dibuat kluster, tetapi untuk contoh kali ini dibuatkan satu saja. Saya asumsikan jaringan dan nama sudah terbuat.

Cara terbaik saat ini untuk lingkungan awan adalah menggunakan pemaket snapcraft untuk mendapatkan perangkat lunak terbaru yang stabil. Debian Stretch tidak memasang pemaket ini secara baku. Pasang dulu:

sudo apt update
sudo apt install snapd

Lalu, pasang etcd menggunakan snapcraft:

sudo snap install etcd

Konfigurasi aplikasi berbasis snapcraft ada di /var/snap. Berhubung konfigurasinya panjang, saya sudah sediakan unduhan. Saya jelaskan properti yang penting saja nanti. Cara pasang:

wget -q -O- https://raw.githubusercontent.com/jpmrblood/postgresql-ha-configuration/master/etcd.conf.yml | sudo tee /var/snap/etcd/common/etcd.conf.yml

Beberapa properti yang penting:

  • name: ‘etcd0’ — memberi nama mesin ini. Kalau ada lebih dari satu mesin etcd, pastikan masing-masing unik.
  • data-dir: /var/lib/etcd/data — tempat data etcd. Saya sesuaikan dengan FHS.
  • wal-dir: /var/lib/etcd/wal — tempat penampungan untuk jurnal etcd.
  • listen-peer-urls: http://192.0.2.21:2380 — Alamat TCP/IP untuk mendengarkan permintaan bergabung.
  • listen-client-urls: http://localhost:2379,http://192.0.2.21:2379 — Alamat TCP/IP untuk aplikasi ini beroperasi.
  • initial-advertise-peer-urls: http://192.0.2.21:2380 — Alamat TCP/IP untuk mengiklankan diri sendiri ke etcd yang lain. Saat ini tidak terpakai karena hanya ada satu saja.
  • advertise-client-urls: http://192.0.2.21:2379 — Alamat TCP/IP yang diberitahukan kepada yang lainnya.
  • initial-cluster: etcd0=http://192.0.2.21:2380, — Sejumlah alamat TCP/IP peladen etcd yang tergabung dalam kluster. Kali ini hanya satu.
  • initial-cluster-token: ‘etcd-cluster’ — Nama kluster etcd kita. Maaf kalau kurang kreatif.
  • initial-cluster-state: ‘new’ — Kondisi awal saat pertama kali etcd nanti dijalankan.

Kalau tutorial Linode memuat semua ini dalam variabel lingkungan. Sayangnya, Debian Stretch tidak ada etcd sehingga kita terpaksa memasangnya dari snapcraft.

Sebelum menjalankan etcd, jangan lupa membuat direktori yang dibutuhkan.

sudo mkdir -p /var/lib/etcd/data /var/lib/etcd/wal
sudo snap start etcd

TIPS #1: Kalau mau mencoba dulu, sebelum menggunakan snap start, gunakan snap run untuk menjalankan etcd langsung. Apabila sudah selesai diagnosis, tekan CTRL+C untuk selesai.

Bila sudah benar, maka akan terlihat:

$ snap services
Snap  Service  Startup  Current
etcd  etcd     enabled  active

Bila statusnya sudah aktif, sekarang saatnya memasang PostgreSQL beserta Patroni.

Pemasangan PostgreSQL (pg1, pg2, dan pg3)

Kecuali hostname dan IP, semua pemasangan PostgreSQL identik. Selain itu, saya menggunakan pwgen untuk membuat sandi. Mohon sandi Anda berbeda dengan tutorial ini!

Pasang PostgreSQL

Pasang seperti biasa.

echo "deb http://kambing.ui.ac.id/postgresql/repos/apt/ `lsb_release -cs`-pgdg main" | sudo tee /etc/apt/sources.list.d/postgresql.list
wget --quiet -O - http://kambing.ui.ac.id/postgresql/repos/apt/ACCC4CF8.asc | sudo apt-key add -
sudo apt update && sudo apt install postgresql-10

Saya sengaja memilih versi 10. Lebih baru dan keren.

Matikan layanan PostgreSQL karena kita mau menjalankannya dari Patroni:

sudo systemctl disable postgresql

Pasang Patroni

Patroni tersedia di Python PIP. Pasang PIP:

sudo apt install python3-pip
sudo pip3 install --upgrade setuptools

Baru pasang Patroni dan Python-etcd:

sudo pip3 install patroni[etcd]

Selanjutnya, buat konfigurasi Patroni:

$ sudo tee /etc/patroni.yml << EOF
scope: postgres
namespace: /db/
name: pg1

restapi:
    listen: 192.0.2.11:8008
    connect_address: 192.0.2.11:8008

etcd:
    host: 192.0.2.21:2379

bootstrap:
    dcs:
        ttl: 30
        loop_wait: 10
        retry_timeout: 10
        maximum_lag_on_failover: 1048576
        postgresql:
            use_pg_rewind: true

    initdb:
    - encoding: UTF8
    - data-checksums

    pg_hba:
    - host replication replicator 127.0.0.1/32 md5
    - host replication replicator 192.0.2.11/0 md5
    - host replication replicator 192.0.2.12/0 md5
    - host replication replicator 192.0.2.13/0 md5
    - host all all 0.0.0.0/0 md5

    users:
        admin:
            password: ioqu8ohqueh6kai5va0Hoigirae7Xaem
            options:
                - createrole
                - createdb

postgresql:
    listen: 192.0.2.11:5432
    connect_address: 192.0.2.11:5432
    data_dir: /var/lib/postgresql/10/patroni
    pgpass: /tmp/pgpass
    authentication:
        replication:
            username: replicator
            password: shohkaitahsee0er6eXoh0Ohghie2toh
        superuser:
            username: postgres
            password: exuush9shohlail6Cool9eeng3kae5iy
    parameters:
        unix_socket_directories: '.'

tags:
    nofailover: false
    noloadbalance: false
    clonefrom: false
    nosync: false
EOF

Jangan lupa mengganti IP pada setiap baris listen dan connect_address pada mesin pg2 dan pg3 dengan IP masing-masing. Jangan lupa mengganti sandi (password) agar tidak sama dengan tutorial ini!

Siapkan direktori data untuk PostgreSQL versi Patroni:

sudo -u postgres mkdir -p /var/lib/postgresql/10/patroni

Terakhir, pasang unit pelayan systemd Patroni:

$ sudo tee /etc/systemd/system/patroni.service << EOF
[Unit]
Description=Runners to orchestrate a high-availability PostgreSQL
After=syslog.target network.target

[Service]
Type=simple

User=postgres
Group=postgres

Environment="PATH=/usr/lib/postgresql/10/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
ExecStart=/usr/local/bin/patroni /etc/patroni.yml

KillMode=process

TimeoutSec=30

Restart=no

[Install]
WantedBy=multi-user.target
EOF

Daftarkan dan jalankan Patroni:

sudo systemctl daemon-reload
sudo systemctl enable patroni
sudo systemctl start patroni

Kalau sudah benar, maka Patroni akan menjalankan PostgreSQL versinya.

$ systemctl status patroni
● patroni.service - Runners to orchestrate a high-availability PostgreSQL
   Loaded: loaded (/etc/systemd/system/patroni.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-01-26 11:18:14 WIB; 2min 27s ago
 Main PID: 9391 (patroni)
    Tasks: 12 (limit: 4915)
   CGroup: /system.slice/patroni.service
           ├─9391 /usr/bin/python3 /usr/local/bin/patroni /etc/patroni.yml
           ├─9417 postgres -D /var/lib/postgresql/10/patroni --config-file=/var/lib/postgresql/10/patroni/postgresql.conf --max_prepared_transactions=0 --port=5432 --cluster_name=postgres --max_locks_per_transaction
           ├─9420 postgres: postgres: checkpointer process   
           ├─9421 postgres: postgres: writer process   
           ├─9422 postgres: postgres: wal writer process   
           ├─9423 postgres: postgres: autovacuum launcher process   
           ├─9424 postgres: postgres: stats collector process   
           ├─9425 postgres: postgres: bgworker: logical replication launcher   
           └─9430 postgres: postgres: postgres postgres 192.0.2.11(44308) idle

Lakukan ini di pg2 dan pg3. Jangan lupa mengganti IP pada berkas /etc/patroni.yml.

Oh, iya, kalau menggunakan klon, jangan lupa /etc/network/interfaces.d/enp0s8 diubah sesuai dengan IP mesin. Jangan lupa juga ganti hostname.

Terus, kalau misalnya pg2 dan pg3 diklon dari pg1 saat Patroni sudah terkonfigurasi, jangan lupa kosongkan terlebih dahulu direktori data Patroni.

sudo systemctl stop patroni
sudo -u postgres rm -rf /var/lib/postgresql/10/patroni/
sudo -u postgres mkdir /var/lib/postgresql/10/patroni/
sudo systemctl start patroni

Kalau tidak, bisa aneh nanti.

Pemasangan HAProxy

Komponen terakhir yang hendak kita pasang adalah HAProxy. Untungnya, sudah ada paket Debian untuk HAProxy. Pasang seperti biasa:

sudo apt install haproxy

Konfigurasi HAProxy untuk menjadi proksi ketiga mesin  PostgreSQL kita.

$ sudo tee /etc/haproxy/haproxy.cfg << EOF
global
    maxconn 100

defaults
    log global
    mode tcp
    retries 2
    timeout client 30m
    timeout connect 4s
    timeout server 30m
    timeout check 5s

listen stats
    mode http
    bind *:7000
    stats enable
    stats uri /

listen postgres
    bind *:5000
    option httpchk
    http-check expect status 200
    default-server inter 3s fall 3 rise 2 on-marked-down shutdown-sessions
    server postgresql_192.0.2.11_5432 192.0.2.11:5432 maxconn 100 check port 8008
    server postgresql_192.0.2.12_5432 192.0.2.12:5432 maxconn 100 check port 8008
    server postgresql_192.0.2.13_5432 192.0.2.13:5432 maxconn 100 check port 8008
EOF

Setelah itu, muat ulang HAProxy untuk memuat konfigurasi baru.

sudo systemctl restart haproxy

Saya mengikuti Tutorial Linode untuk membuat port PostgreSQL pada port 5000. Anda bisa saja membuat port 5432. Kebetulan PC saya ada layanan PostgreSQL lain yang jalan pada port itu.

Untuk memonitor, silakan buka peramban Anda pada port 7000.

HAProxy interfacing Patriani's PostgreSQL nodes

HAProxy interfacing Patriani’s PostgreSQL nodes

Hanya ada satu yang hijau/aktif. Kalau tiga-tiganya, kemungkinan Anda mengklon tanpa mengubah konfigurasi dan mengosongkan direktori data PostgreSQL terlebih dahulu.

Selesai.

(Kulshekhar Kabra, 2017)

Daftar Pustaka

Kulshekhar Kabra (2017, September 19). Create a Highly Available PostgreSQL Cluster Using Patroni and HAProxy. Retrieved January 26, 2018 from https://linode.com/docs/databases/postgresql/create-a-highly-available-postgresql-cluster-using-patroni-and-haproxy/.^
WordPress 4.9.1 dengan PHP 7.2

WordPress 4.9.1 dengan PHP 7.2

Saya biasanya kalau mau memperbaharui WordPress selalu menunggu versi minor .1 atau lebih. Soalnya, suka ada perilaku tak terduga kalau versi mayor baru terbit. Kali ini, WordPress 4.9.1 sudah terbit.

Menurut situsnya, WordPress merekomendasikan penggunaan PHP 7.2. Saya sendiri baru tahu kalau sudah ada PHP 7.2. Pantas saja WordPress berhenti di versi 4.8.4 pada beberapa peladen.

Saatnya memasang PHP 7.2!

Pemasangan PHP 7.2

Saya pernah membahas tentang PHP 7.1+ di artikel terdahulu. Jadi, ini sekedar mengulang saja.

Aktifkan modul APT untuk mengakses repo berbasis HTTPS dan beberapa paket lainnya.

sudo apt-get install apt-transport-https lsb-release ca-certificates

Aktifkan repo Suri.

wget -O- https://packages.sury.org/php/apt.gpg | sudo apt-key add -
echo "deb https://packages.sury.org/php/ jessie main" | sudo tee -a /etc/apt/sources.list.d/php-sury.list
sudo apt update

Lalu, pasang PHP 7.2 untuk menggantikan PHP 5.

sudo apt install php7.2-fpm php7.2-curl php7.2-gd php7.2-imagick php7.2-json php7.2-mysql php7.2-readline php-redis php7.2-xml php7.2-mbstring php7.2-zip php7.2-mysql

Kalau hanya sekedar php-fpm, yang terpasang bakal versi 7.1. Harus secara eksplisit disebutkan versi 7.2.

Selanjutnya, menyalin konfigurasi fpm dari /etc/php5/fpm/pool.d ke /etc/php/7.2/fpm/pool.d untuk setiap pool.

Saya sejauh ini tidak ada masalah.

Fungsi Yang Mulai Ditinggalkan

Nampaknya PHP7 dan terbaru hendak dibuat menjadi domain yang ketat (strict typecast). Mungkin pengembang PHP ingin menjadikan PHP sebagai bahasa yang lebih aman. Kalau saya melihat log, biasanya akan diprotes bentuk akses senarai (array). Saya mendapati fungsi count() terutama yang paling sering dicatat.

count(): Parameter must be an array or an object that implements Countable in ...

Ada orang-orang yang memutuskan untuk kembali ke PHP 7.1. Tapi saya tidak! Agar sesuai dengan PHP7.2 dan terbaru, misalnya ada variabel:

count($elements[‘#value’])

count ( $elements )

Diubah dengan menambahkan uji tipe senarai :

is_array ( $elements ) && count ( $elements )

Atau, saat diubah menjadi tipe senarai:

$elements = ( array ) $source->getElements();

Penyebab ini semua kalau saya lihat di kode sumber WordPress adalah biasanya karena penggunaan variabel global.

Untung saja, untuk yang lain pun WordPress dan plugin-nya sudah cukup bersahabat.

Bacaan Lebih Lanjut

Melihat Laporan DMARC

Melihat Laporan DMARC

Dengan semakin ganasnya SPAM dan bisnis surel, Universitas Indonesia pun selalu memperbaharui konfigurasi surel agar selalu aman dan nyaman. Selama inisaya hanya menerapkan SPF, DKIM, ADSP, DMARC dan lain sebagainya ke sub domain UI. Kali ini, untuk domain global UI, DMARC pun diterapkan.

Saya membuka kotak pandora! Ternyata ada domain-domain di bawah UI yang masih perlu dikonfigurasi. Misalnya, untuk domain yang berbasis Google Apps (GMail), saya menerapkan minimum konfigurasi SPF dan DMARC. Namun, ini semua harus ditambahkan satu persatu.

Beruntung, DMARC menyediakan mekanisme laporan berkala yang bisa dipakai oleh UI untuk melihat bagaimana domainnya digunakan ke tempat lain. Laporan DMARC berformat XML. Untuk ini, saya menuliskan cara saya membaca XML tersebut dengan perkakas yang sudah ada.

Saya malas membuat pencacah sendiri. Untungnya, Dave dari TechSneeze menyediakan perkakas kecil untuk itu. Ada dua bagian yang perlu dipasang, pencacah dan pembaca. Berhubung saya tiba-tiba jadi malas menulis, saya percepat saja.

Basisdata

Pencacah ini memasukkan XML ke dalam basisdata. Basisdata MySQL ini digunakan untuk menyimpan hasil proses pelaporan DMARC. Mari buat sebuah basisdata:

sudo mysql --defaults-file=/etc/mysql/debian.cnf -e "create database opendmarc;"
sudo mysql --defaults-file=/etc/mysql/debian.cnf -e "grant all privileges on opendmarc.* to 'opendmarc'@'localhost' identified by 'p4$sW0Rd';"
sudo mysql --defaults-file=/etc/mysql/debian.cnf -e "flush privileges;"

Jangan lupa mengganti sandi dengan yang benar!

Pencacah

Pasang paket-paket pendukung.

sudo apt-get install libmail-imapclient-perl libmime-tools-perl libxml-simple-perl \
libclass-dbi-mysql-perl libio-socket-inet6-perl libio-socket-ip-perl libperlio-gzip-perl \
libmail-mbox-messageparser-perl unzip

Unduh dan masuk ke direktori.

git clone https://github.com/techsneeze/dmarcts-report-parser.git
cd dmarcts-report-parser

Salin berkas dmarcts-report-parser.conf.sample menjadi dmarcts-report-parser.conf yang akan dipakai sebagai konfigurasi. Ubah login MySQL di berkas tersebut.

$dbname = 'opendmarc';
$dbuser = 'opendmarc';
$dbpass = 'p4$sW0Rd';

Sudah bisa digunakan. Cara saya menggunakannya:

zcat /tmp/linkedin.com\!ui.ac.id\!1513036800\!1513123200\!chips.xml.gz | ./dmarcts-report-parser.pl -x -

Saya suka cara seperti ini. Kalau misalnya semua berkas laporan ditaruh di sebuah direktori, maka tinggal:

for report in `find /tmp/reports/ -type f `; do zcat $report | ./dmarcts-report-parser.pl -x - ; done

Kalau membaca konfigurasi, perkakas ini bisa membaca dari IMAP. Tetapi saya belum mencobanya.

Pembaca

Salin GIT:

rm -rf /var/www/html
git clone https://github.com/techsneeze/dmarcts-report-viewer.git html
sudo mv html /var/www
sudo chown -R 33:33 /var/www/html

Pasang PHP-FPM dan NGINX. Berkas utamanya ada di /var/www/html. Saya terlalu malas untuk mengonfigurasi. Tapi, ini kira-kira konfigurasi saya:

cat >> /etc/nginx/sites-enabled/default << EOF
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.php?$query_string;
        }

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
                include snippets/fastcgi-php.conf;

                # With php7.0-cgi alone:
                #fastcgi_pass 127.0.0.1:9000;
                # With php7.0-fpm:
                fastcgi_pass unix:/run/php/php7.0-fpm.sock;
        }

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        location ~ /\.ht {
                deny all;
        }
}
EOF

Jangan lupa dmarcts-report-viewer-config.php.sample menjadi dmarcts-report-viewer-config.php dan ubah $dbname, $dbuser, dan $dbpass seperti konfigurasi pencacah.

Silakan diubah sesuai selera. Nanti kalau sudah selesai, bisa dilihat di peramban:

DMARC Report

DMARC Report

Kalau saya tidak sedang sibuk dan malas menulis, saya akan mencoba membagikan bagaimana mengonfigurasi SPF, DKIM, ADSP, DMARC dan lain sebagainya. Kalau ingat, ya…. Tak janji.

Bacaan Lebih Lanjut

Tadinya Tentang Doki-doki Literature Club, Sekarang Tentang Ren’Py
doki-doki literature club, coded with Ren'Py

Tadinya Tentang Doki-doki Literature Club, Sekarang Tentang Ren’Py

Ada sebuah novel interaktif (visual novel) terbaru yang sedang populer saat ini di Internet. Nama novel tersebut adalah Doki-doki Literature Club (DDLC). DDLC merupakan sebuah novel interaktif horor yang menyajikan elemen penembus sekat (breaking 4th wall). Novel ini membuat cerita normal seperti novel pacaran lainnya; sampai satu titik pemain tanpa sadar membuat keputusan yang membuat depresi pemain. Itu sebabnya, permainan ini tidak dianjurkan untuk dimainkan oleh jomblo akut yang memiliki tendensi bunuh diri, dalam depresi, atau dalam masa terapi.

Anda mungkin bertanya, “menembus sekat pada bagian mana?” Saya tidak ingin membuka tabir misteri novel ini. Untuk menikmati novel ini, menurut saya, Anda harus mulai dari situs permainan dan membaca deskripsi perkenalan permainan ini di sana. Lalu, unduh dan mainkan. Anda akan mengerti mengapa deskripsi situsnya membuat permainan ini lebih mengerikan.

Permainan ini dapat diunduh gratis langsung dari situsnya. Anda bisa menyumbang di sana atau langsung ke laman unduhan. Permainan ini menyediakan berbagai tambalan terjemahan yang nampaknya disediakan oleh berbagai orang. Mungkin Anda tertarik untuk menerjemahkan ke dalam Bahasa Indonesia?

Yang menarik, saya menemukan bahwa berkas unduhan untuk GNU/Linux dan Windows menjadi satu. Besar berkas ZIP tersebut sekitar 240MB. Di dalam ZIP terdapat berkas DDLC.exe untuk Windows dan DDLC.sh untuk dijalankan di GNU/Linux.

Untuk menjalankan DDLC di GNU/Linux:

unzip ddlc-win.zip
DDLC-1.1.0-pc/DDLC.sh

Tentunya cara yang lebih gampang adalah membuka penjelajah berkas Anda; klik kanan untuk ekstraksi; dan klik DDLC.sh untuk menjalankan aplikasi. GNU/Linux tidak seheker zaman dulu.

Ingat! Jangan mainkan bila Anda jomblo akut!

Ren’Py

Saya bukan pengamat permainan. Saya lebih tertarik kepada teknologi yang ada di dalamnya. Ternyata, DDLC menggunakan pustaka Ren’Py sebagai tulang punggung. Ren’Py dikembangkan menggunakan bahasa Python. Pantas saja berkas DDLC untuk Windows dan GNU/Linux digabung. Berkas eksekusi ternyata hanya pembungkus untuk menjalankan skrip Python.

Ren’Py adalah sebuah perkakas pengembangan untuk membuat novel interaktif. Dia diterbitkan sebagai perangkat lunak bebas. Anda bisa memodifikasi sesuai kebutuhan Anda.

Pemasangan Renpy

Ada dua cara pemasangan: melalui berkas unduhan dan melalui distribusi. Karena suatu galat, Ren’Py membutuhkan pemasangan paket Python Tk. Paket ini diperlukan untuk membuat proyek baru. Jadi, untuk kedua metode tersebut, pastikan sudah dipasang:

sudo apt install python-tk

Setelah itu, aplikasi bisa dijalankan/dipasang seperti biasa.

Unduhan Situs

Anda dapat mengunduh di situsnya. Dengan cara normal, menggunakan penjelajah berkas favorit Anda, Anda dapat mengekstraksi dan menjalankan skrip renpy.sh tanpa perlu membuka terminal.

Ren'Py site's version

Ren’Py interface running from its site distribution.

Tetapi, saya beda! Berikut cara menjalankan:

wget https://www.renpy.org/dl/6.99.13/renpy-6.99.13-sdk.tar.bz2
tar xvfj renpy-6.99.13-sdk.tar.bz2
./renpy-6.99.13-sdk/renpy.sh

Atau gunakan cara yang lebih normal.

Paket Distribusi

Pada distribusi Debian 9 (Stretch), Ubuntu 16.04 atau terbaru, dan segala turunannya:

sudo apt install renpy

Saya lebih menyarankan cara ini karena semua paket pustaka yang dibutuhkan akan ikut dipasang.

Vanilla Ren'Py installed from Ubuntu.

Vanilla Ren’Py installed from Ubuntu repository.

Versi distribusi menyediakan layar yang lebih bersih karena pemelihara paket membagi Ren’Py menjadi beberapa bagian:

  • python-renpy, paket modul Python Ren’Py.

  • renpy, paket utama untuk memasang Ren’Py

  • renpy-demo, demo-demo yang bisa dijadikan acuan untuk mempelajari Ren’Py.

  • renpy-doc, dokumentasi penggunaan Ren’Py.

  • renpy-thequestion, contoh satu novel interaktif sederhana yang telah dikembang dengan Ren’Py.

Saya hanya memasang renpy dan tidak yang lain. Silakan pasang saja yang lain bila ingin.

Memasang dari Github

Cara lain yang lebih abnormal adalah Anda mengunduh sendiri dari Github dan mengompilasi aplikasi Ren’Py dari kode sumber. Silakan baca sendiri caranya di sana. Saya tidak membahas karena takut tulisan ini jadi kepanjangan.

Sekilas Penggunaan Ren’Py

Saya tertarik membuat aplikasi interaktif sederhana. Ada sedikit kekurangan saat membuat proyek baru. Saya harus membuat sebuah direktori kosong. Sepertinya Ren’Py tidak bisa membuat direktori baru untuk wisaya proyek baru.

Ya, sudah. Toh, membuat direktori baru hanya sejauh klik kanan atau mkdir:

mkdir ~/Proyek/Respy

Catatan: tanda ~ artinya direktori rumah (/home/test pada contoh)

Setelah itu, klik + Create New Project

Khusus untuk penggunaan Ren’Py yang pertama kali, kita akan ditanyakan direktori dasar untuk setiap proyek nantinya disimpan.

Project's root directory

First time using Ren’Py we will be asked about its project’s root directory.

Masukkan nama proyek:

New Project name

New Project name. Yeah, I don’t have a naming sense.

Setelah memasukkan nama proyek, tekan tombol ENTER untuk ke layar berikutnya.

Layar berikutnya untuk pemilihan templat bahasa. Sayangnya, templat Bahasa Indonesia saat ini tidak tersedia. Ya, sudah, langsung saja klik Continue.

Select primary language for your new project.

Select primary language for your new project.

Layar berikutnya untuk pemilihan tema awal. Pilih sesuai selera lalu  klik Continue.

Theme selection

Theme selection

Setelah itu, proyek Entah Apa Ini sudah termasuk dalam daftar proyek yang bisa diakses.

Our new project now appeared on the project list.

Our new project now appeared on the project list.

Kalau mau menjalankan aplikasi yang dibuat, klik Launch Project. Menu di sebelah kanan menyediakan apa saja yang bisa dikerjakan pada aplikasi.

Sekilas Utak-atik Proyek Ren’Py

Untuk proyek Entah Apa Ini, saya membuat beberapa perubahan berikut:

  • Mengubah resolusi dari 800×600 menjadi 720p (1280×720). Ada di game/options.rpy dengan opsi config.screen_width dan config.screen_width
  • Membuat direktori gambar dan menaruh semua gambar di sana: game/images
  • Skenario/alur permainan dibuat di game/script.rpy

Saya sudah membuat repositori GIT kalau hendak iseng-iseng mencoba.

Untuk mengunduh:

git clone https://github.com/jpmrblood/renpy-entahlah.git

Untuk menjalankan:

renpy renpy-entahlah

Distribusi

Sayangnya, versi pemaketan Ubuntu 16.04 yang saya gunakan tidak dapat membuat berkas distribusi. Anda harus menjalankan aplikasi Ren’Py yang diunduh dari situsnya. Berikut caranya setelah memuat proyek tersebut.

Hasilnya nanti berupa berkas ZIP yang bisa dijalankan langsung.

Terakhir

Untuk apakah aplikasi ini? Saya melihat potensi selain untuk membuat permainan, Anda bisa membuat semacam kuis interaktif untuk anak kecil sebagai bahan mata ajar. Anda bisa mengubah tata letak sehingga bisa membuat aplikasi ini menjadi ujian langsung.

Selamat berkarya!

Bacaan Lebih Lanjut

Membuat VLOG dengan Perangkat Lunak Bebas dan Terbuka

Saat ini di Indonesia sedang keranjingan membuat VLOG. VLOG adalah jurnal berbentuk video yang diunggah ke Youtube. Bahkan, Pakde Jokowi, Presiden RI, juga memiliki kanal Youtube resmi.

Mengapa saya spesifik menyebutkan hanya Youtube? Mengapa saya tidak menyebut media sosial lainnya? Karena vidio.com jarang yang menonton dan Vimeo masih saja ada yang memblokir. Selain itu, proses komersialisasi video atau lazim yang disebut sebagai monetisasi, hanya disediakan dengan mantap oleh Youtube.

Ahem! Saya sebenarnya mau menyinyir yang lainnya, bukan itu. Saya sedih bahwa banyak artis-artis media sosial yang menyarankan menggunakan perangkat berbayar semisalnya Adobe Premiere Pro. Banyak yang memberikan tutorial menggunakan perkakas ini. Sepertinya mereka banyak yang sanggup membayar Rp269.800,00 per bulan atau Rp3.237.600,00 per tahun.

Hmm…

Menurut saya, ada banyak peralatan yang lebih murah untuk membuat itu.

Perkakas yang Digunakan

Saya menggunakan kamera telepon pintar saya, Xiaomi Mi 6. Berikut spesifikasi saya:

  • Sistem operasi saya Lineage OS 14.1 bentukan 1024 oleh Xiaobai yang didapatkan dari XDA Developer.
  • Aplikasi Legend untuk membuat logo yang menarik. Saya dapatkan dari Playstore.
  • Aplikasi Audio Recorder untuk merekam suara. Saya dapatkan dari F-Droid.
  • Aplikasi kamera Snapdragon PRO M 4.4.0. Saya dapatkan zip pemasangan dari XDA.

Semua aplikasi yang saya sebutkan bisa diganti dengan yang lain. Intinya, semua kebutuhan (OS, kamera, dan aplikasi) sudah bisa dipenuhi dan banyak alternatif yang gratis dan bebas.

Saya memiliki PC dengan memori 32GB dan AMD FX-8350 seperti yang sudah pernah saya bahas sebelum ini. PC ini masih mumpuni. Berikut spesifikasi saya:

  • Sistem operasi saya GNU/Linux KDE Neon 5.11, sebuah distribusi KDE berdasarkan Ubuntu 16.04.
  • Aplikasi Kdenlive untuk menyunting video.
  • Aplikasi Audacity untuk menyunting suara. Aplikasi ini sangat penting untuk memperbaiki bising yang timbul.

Sekarang saatnya membuat video.

Bahan-bahan

Saya menggunakan bahan-bahan sebagai berikut:

  • Berkas intro tanpa suara yang dibuat dari Legend.
  • Berkas ketukan untuk suara intro yang saya rekam sendiri menggunakan Audio Recorder. Saya buat dengan mengetukkan meja.
  • Berkas “Take_You _Home_Tonight.mp3” yang disediakan oleh Youtube untuk bebas diunduh. Kalau penasaran, sumbernya “Take You Home Tonight – Vibe Tracks”.
  • Berkas saya berbicara singkat.
  • Berkas suara saya berbicara singkat.

Membuat Intro (dan Outro Karena Saya Terlalu Malas)

Create logo

Dari Legend, ketik kata yang mau dijadikan logo. Lalu, tekan tanda centang.

Edit Logo

Edit Logo

Sunting animasi logo dan tekan tanda panah ke bawah (ekspor/unduh) untuk memilih mengunduh sebagai video.

Video yang dibuat masih tidak ada suara. Anda dapat membuat suara apa pun, namun perhatikan lisensi lagu/suara yang hendak dijadikan suara latar. Untuk menghindari kerumitan, kali ini saya menggunakan suara yang saya buat sendiri. Selain unik, suara ini pun bebas lisensi dari orang lain. Benar-benar 100% karya sendiri.

Pada Kdenlive, klik Project → Add Clip untuk menambah video animasi dan suara ketukan animasi. Nanti pada Project Bin, video animasi dan suara akan muncul sebagai aset proyek (sebutan untuk mereka klip suara dan klip video). Untuk menggunakan keduanya, drag saja masing-masing ke linimasa (timeline) Video 1 dan Suara 1.

Inilah demarkasi yang membedakan orang jago dan bodoh. Proses membuat suara dan video menjadi sesuai/sinkronisasi. Anda harus pintar untuk menyesuaikan suara dan video (timing). Saya, sih, membuat klip video animasi pada menit 0 dan klip suara mulai dari menit ke-15. Saya juga menambahkan efek Phaser ke klip suara.

Setiap kita punya selera berbeda. Namun, saya sudah memberikan prinsip bagi Anda.

Video Isi

Pada video isi, saya seperti biasa menambahkan aset klip video pembicaraan saya.

Lalu, pada Project Bin, saya klik kanan → Extract Audio → Wav 48000Hz untuk menghasilkan klip suara pembicaraan saya. Pada video asli, suara saya berdesis (noise).

Modifikasi Desis

Buka Audacity dan buka berkas mentahan klip suara. Pada Audacity, drag pada bagian kosong yang biasanya cuma berisi desis.

Drag to get noise sample

Drag to get noise sample

Lalu, pilih Efek → Noise Reduction → Get Noise Profile.

Setelah itu, pilih semua bagian klip suara yang mau dibuang kebisingannya. Saya pilih CTRL + A untuk memilih semua.

Setelah terpilih, klik Efek → Noise Reduction → Get Noise Profile → OK. Ya, silakan ubah-ubah parameter sebelum OK. Saya sendiri hanya mengubah Noise reduction menjadi 15dB.

Buat Diam

Oh, iya, terkadang kita tidak bisa menghindari suara-suara aneh, misalnya di awal ada suara kamera. Drag saja area klip suara yang mau dibuang. Lalu, pilih Buat → Diam… → OK.

Simpan perubahan dengan Berkas → Export Audio.

Sinkronisasi Pembicaraan

Nah, ini yang paling ribet sedunia. Bahkan dunia rekaman profesional pun suka salah. Masukkan klip suara yang sudah dibuat di Audacity sebagai aset proyek.

Saya biasanya membagi klip video menjadi kanal video dan kanal suara. Caranya, dengan klik kanan pada klip di linimasa dan pilih Split Audio.

Buat kanal Audio baru dengan cara klik kanan pada panel label linimasa dan pilih Insert Track.

Drag klip suara ke trek yang baru dibuat. Sesuaikan gambarnya dengan trek audio asli.

Sound edit

Sound edit. Sorry BGM got in the way because recreate for the tutorial.

Seperti pada gambar, saya berusaha menyesuakan suara hasil sunting dengan suara asli. Saya perhatikan gunung-gunung suara. Mohon maaf bila pada gambar tersempil kanal BGM. Cuplikan saya buat setelah produksi untuk keperluan blog ini. Biasanya di atas BGM.

Setelah dirasa sesuai, klik kanan pada kanal Suara Asli dan hapus kanal tersebut. Hal ini agar suara yang digunakan adalah suara yang sudah dibersihkan sebelumnya.

Suara Latar (BGM/Background Music)

Beda jenis isi, beda pula penggunaan BGM. Ada yang sama sekali tak perlu misalnya, bila itu isinya adalah lagu, khotbah, atau diskusi bersama. Namun, suara jangkrik akan terdengar bila saya sendirian berbicara tanpa ada suara apa pun. Biasanya, untuk format santai, gunakan suara latar untuk menambah isi.

Prinsipnya sama seperti waktu kita makan di restoran atau belanja di Mall. Lagu yang dipasang menambah suasana kondusif. Ingat, ya, penambah, bukan untuk mengacaukan. Jadi, pilihlah suara yang sesuai dengan tema isi blog.

Youtube menyediakan aset suara yang bisa diunduh dan digunakan secara bebas. Perhatikan lisensi suara yang hendak digunakan. Biasanya ada lisensi yang memerlukan atribusi (penyantuman nama lagu yang digunakan) dan sebagainya. Saya menggunakan suara yang berlisensi Domain Publik/bebas.

Seperti biasa, masukkan berkas suara tersebut menjadi klip suara di Project → Add Clip. Drag seperti biasa untuk sejajar dengan konten. Atau, bisa agak geser sedikit kalau mau agak nyeni dan sedikit pro.

Ada dua cara untuk menyesuaikan durasi klip suara latar dengan klip konten. Yang pertama, ke ujung klip lalu kecilkan bingkai klip lagu sehingga pas dengan durasi yang dibutuhkan. Cara kedua, klik dua kali pada  klip suara dan klip bisa disesuaikan parameter durasi, mulai muncul pada menit ke berapa, dan berakhir pada menit ke berapa. Saya menggunakan cara pertama, lalu menggunakan cara kedua untuk lebih presisi lagi.

Ingat! Kita mau mendengar suara saya yang lembut dan bersahaja, bukan suara musik. Untuk itu, suara BGM harus dipelankan. Caranya: pilih klip suara, lalu pilih Add Effect → Audio correction → Volume (keyframable). Pada bagian Effects for Take_You_Home_Tonight.mp3, di bagian Volume, saya menurunkan Gain menjadi -17dB. Cara menurunkannya adalah dengan drag di batang Gain.

Setiap klip baik suara mau pun video dapat dibuat efek-efek yang ditumpuk menjadi satu. Namun, untuk saat ini, cukup gunakan efek dasar saja.

Terakhir

Saya pun menambahkan klip video Intro di bagian akhir. Saya memperpanjang durasi klip suara BGM sampai ke bagian akhir klip ini.

Semua proses ini saya kerjakan sekitar sejam lebih. Hal ini karena saya harus mencari-cari aplikasi yang diperlukan dan iseng-iseng mencoba. Menurut saya, kalau memang niat, kumpulkan saja klip-klip yang diperlukan. Dan, apabila sudah terbiasa, paling proses ini hanya 15 menit saja. Apalagi, saya belum menggunakan preset (konfigurasi yang sudah tersimpan dan siap digunakan).

Saya justru menghabiskan waktu untuk mengetik entri blog ini. Ah, saya sudah ditunggu untuk minum kopi bersama. Masih banyak perkakas lain yang bisa dipakai untuk membuat video. Namun, untuk saat ini saya rasa cukuplah untuk membuat video Youtube yang sederhana dan mumpuni. Yang bikin canggih itu  kreativitas, bukan perkakas yang mahal.

May the source be with you.

Belajar dari Equifax: Menerapkan Standarisasi Organisasi yang Berbasis TIK

Belajar dari Equifax: Menerapkan Standarisasi Organisasi yang Berbasis TIK

Equifax ternyata terjebol dari titik celah keamanan Apache Struts. Celah dengan kode CVE-2017-5638 tersebut merupakan celah keamanan yang memungkinkan penyerang mengunggah kode yang dapat menjalankan perintah. Celah ini diumumkan pada 19 Maret 2017.

Untungnya, pengembang Apache telah menambal celah keamanan tersebut pada hari yang sama. Namun, Equifax tidak dapat dengan segera menambal celah tersebut dengan cepat. Bisa jadi, hal ini disebabkan oleh karena penambalan tersebut akan menyebabkan operasi bisnis Equifax terhenti.

Praktik Standar Keamanan Informasi

Tidak akan pernah ada perangkat lunak yang tidak bercacat. Hal ini berlaku baik untuk perangkat lunak bebas/terbuka (FOSS) atau pun perangkat lunak tertutup (proprietary). Untuk itu, diperlukan penerapan prinsip-prinsip penerapan TIK yang benar dalam sebuah organisasi. The Apache Struts Project Management Committee (PMC) memberikan saran mengenai hal tersebut:

  1. Mengerti pustaka perangkat lunak dan versinya apa saja yang digunakan dalam organisasi. Ikuti dan lacak perkembangan untuk setiap perangkat lunak tersebut.
  2. Buat sebuah proses dalam organisasi untuk dapat menambal dengan cepat. Cepat dalam hitungan jam atau beberapa hari, bukan bulan atau pun tahun. Kasus yang ditemui biasanya kasus penjebolan melalui cacat yang sudah diumumkan berbulan/bertahun-tahun sebelumnya.
  3. Setiap perangkat lunak yang kompleks mengandung cacat. Jangan membuat kebijakan keamanan (security policy) berdasarkan asumsi bahwa perangkat lunak yang mendukung itu bebas cacat, terutama kecacatan dalam hal keamanan.
  4. Buat lapisan-lapisan keamanan. Adalah sebuah praktik pengembangan perangkat lunak yang baik untuk melindungi setiap lapisan yang ada di belakang lapisan presentasi seperti Apache Struts. Terjebolnya lapisan presentasi (web) seharusnya tidak menyebabkan akses menyeluruh kepada seluruh data.
  5. Buat pemonitoran yang aktif terhadap Web yang dimiliki. Saat ini sudah banyak solusi baik perangkat lunak terbuka mau pun komersial yang bisa mendeteksi dan memberitahukan adanya pola-pola penyerangan.

Hal ini adalah standar paling dasar yang diterapkan dalam sebuah organisasi. Ada hal-hal lain yang juga perlu diperhatikan selain perangkat lunak dan perangkat keras dalam perusahaan. Keamanan sistem informasi juga berlaku untuk sumber daya manusia dan yang lainnya yang dapat menimbulkan risiko keamanan.

Semua ini sudah ada dalam standar-standar Kebijakan TIK. Ada ITIL, TOGAF 9.1, dan bahkan ISO/IEC 27001:2013. Semuanya bisa dipilih dan diterapkan kepada organisasi. Biasanya, mereka menerapkan level dan roadmap sesuai dengan kebutuhan organisasi.

UI sendiri, walau pun tanpa SK Rektor, telah menerapkan kebijakan keamanan sejak zaman dahulu kala. Misalnya, hal yang paling menyebalkan dan sederhana, mengganti sandi setiap 6 bulan sekali. Kebijakan ini adalah bagian dari Kebijakan Sandi (Password Policy) yang merupakan bagian dari standar Kebijakan TIK. Saking sudah lamanya, semua sistem operasi, baik Microsoft Windows maupun GNU/Linux, sudah memiliki perkakas untuk menerapkan kebijakan pembuatan sandi.

Bukan hanya itu, Badan standar Amerika (NIST) menganjurkan kebijakan cara membuat sandi yang benar dalam NIST SP 800-63B-3. SANS Institute bahkan menawarkan templat dokumen yang dapat digunakan untuk membuat sandi. Sedikit pencarian dapat ditemukan artikel yang memberikan petunjuk kepada pengguna ketika membuat sandi. Pembuatan sandi yang aman itu sendiri masuk dalam ITIL Access Management.

Metrik Pengukuran Penerapan Keamanan Sistem Informasi

Ada prinsip yang selalu saya pegang sejak lama:

Keamanan berbanding terbalik dengan Kenyamanan

Mengakses langsung tentunya jauh lebih cepat dari pada mengakses melalui HTTPS dan memasukkan sandi. Menaruh satpam dan CCTV di depan pintu gerbang menghabiskan banyak duit dibandingkan gerbang terbuka bagi siapa saja. Ya, Anda mungkin mengerti maksud saya.

Memilih titik tengah antara pengamanan dan kenyamanan adalah sebenarnya memilih metrik yang tepat sehingga keamanan dapat dicapai dengan tingkat kenyamanan yang bisa diterima. Beberapa metrik yang sederhana yang saya tahu:

  • Visi dan misi organisasi. Hal fundamental ini yang mendasari semua hal dalam organisasi. Keamanan tentunya juga bagian dari visi dan misi organisasi. Jika terkandung visi tridarma, maka keamanan harus disesuaikan dengan kemudahan menerapkan tridarma. Jika misi mendukung disabilitas, maka keamanan yang diterapkan harus mencakup kaum difabel.
  • Pengalaman Pengguna (User eXperience). Pengalaman pengguna ini justru membuat keamanan itu seakan nyaman. Hal ini karena praktik keamanan yang lumrah di pengguna (kebiasaan) dapat menyebabkan persepsi kenyamanan tinggi bagi pengguna. Bahkan anehnya lagi, jika keamanan itu tidak diterapkan, pengguna malah merasa tidak nyaman. Metrik ini berguna untuk membuat penerapan keamanan yang baik atau pun menerapkan langkah-langkah bertahap untuk mencapai standar keamanan tanpa membuat pengguna terusik.
  • Manajemen Risiko (Risk Management). Manajemen Risiko membuat penilaian tentang risiko-risiko yang mungkin terjadi beserta dengan dampaknya. Saya paling suka dengan dokumen ini karena bila sebuah risiko dapat dikuantifikasi, kita dapat tahu seberapa potensi kerugian organisasi. Dengan menggunakan penilaian ini, kita juga dapat terbantu untuk mengenali titik-titik yang harus dilindungi dalam organisasi dan membuat proses mitigasi sesuai dengan level risiko dan nilai kerugian yang dapat timbul.

Ketiga metrik ini cukup untuk mengukur dan membuat kebijakan keamanan dalam sebuah organisasi. Tentunya, ada beberapa platform seperti ITIL, TOGAF, dan lainnya yang sudah menerapkan titik-titik yang perlu dibuat dan dikelola. Ya, intinya, buatlah sesuai kemampuan dan kepentingan organisasi.

Mohon maaf, saya diajak minum kopi. Mungkin nanti saya lanjutkan lagi. Tulisan ini terlalu panjang sepertinya dan akan saya lanjutkan Nanti bila saya ada waktu℠ 😛

Bacaan Lebih Lanjut

Belajar Dari Kasus Equifax: Privasi, SNI, dan Payung Hukum Terpadu

Belajar Dari Kasus Equifax: Privasi, SNI, dan Payung Hukum Terpadu

Ada 3 perusahaan besar (swasta) di Amerika Serikat (AS) yang mencatat semua transaksi keuangan (kartu kredit, pinjaman, SSN/nomor sosial) warga negara AS. Mereka adalah Equifax, Experian, dan TransUnion. Pada tanggal 7 September 2017, Equifax mengumumkan bahwa datanya telah terjebol. Sebanyak 143 juta rakyat AS, sekitar 44% populasi total AS, terlepas mereka menggunakan Equifax atau tidak, memiliki kemungkinan bahwa identitasnya yang tercuri dapat digunakan untuk melakukan transaksi keuangan.

Ironisnya, menurut Michael Riley, data tersebut justru tercuri dari situs Equifax yang menawarkan produk perlindungan pencurian informasi. Situs tersebut teretas menggunakan kelemahan-kelemahan yang ada untuk mengakses 143 juta data tersebut. Equifax menunggu 6 minggu untuk mengumumkan peretasan tersebut.

 The twins looked at each other jubilantly but with some surprise. Although 70-534 answer analysis they 70-534 answer analysis considered themselves Scarlett’s favored suitors, they had never before gained tokens ADM-201 exam dumps of this favor so easily. Usually she made them beg and plead, while she put them off, CISSP exam topics refusing to give a 70-534 answer analysis Yes or No answer, laughing if they sulked, growing cool if they became angry. And here she had practically promised them 70-534 answer analysis the ADM-201 exam dumps whole of tomorrow—seats by her at 70-534 answer analysis the barbecue, all the waltzes (and they’d see to it that the dances were CISSP exam topics all waltzes!) and the supper intermission. This was worth getting expelled from the university.Filled ADM-201 exam dumps with new enthusiasm by their success, they CISSP exam topics lingered on, talking about the barbecue 70-534 answer analysis and the ball and Ashley Wilkes 300-208 study material CISSP exam topics and Melanie Hamilton, CISSP exam topics interrupting each other, making jokes and laughing at them, hinting broadly for invitations 300-208 study material to supper. ADM-201 exam dumps Some time had passed before they realized that Scarlett was having very little to say. The atmosphere had somehow changed. Just how, the twins did not know, but the fine glow had gone out of the afternoon. Scarlett seemed to ADM-201 exam dumps be paying little attention to 70-534 answer analysis what they 300-208 study material 70-534 answer analysis ADM-201 exam dumps said, although she made the correct answers. Sensing something they 300-208 study material could not understand, baffled and annoyed by it, the twins struggled along for a while, and then rose reluctantly, ADM-201 exam dumps looking at their 300-208 study material watches.The sun was low CISSP exam topics across the new-plowed fields and the tall woods across the river ADM-201 exam dumps were looming ADM-201 exam dumps blackly in silhouette. Chimney swallows were darting swiftly across the yard, and chickens, ducks and turkeys were waddling 70-534 answer analysis and strutting and straggling in from the fields.Stuart bellowed: “Jeems!” And after an interval a 70-534 answer analysis tall black boy of their own age ran breathlessly around CISSP exam topics the house and out toward the ADM-201 exam dumps tethered horses. Jeems was their 300-208 study material body servant and, like CISSP exam topics the dogs, accompanied them everywhere. He had been CISSP exam topics their childhood playmate and had been given to the twins for their own ADM-201 exam dumps on their tenth birthday. At the sight of him, CISSP exam topics CISSP exam topics the Tarleton hounds rose up out of the red dust and stood waiting expectantly for their masters. The 300-208 study material boys bowed, shook hands and 300-208 study material told CISSP exam topics Scarlett they’d be over 300-208 study material at the 300-208 study material Wilkeses’ early in the morning, waiting for her. Then CISSP exam topics they were ADM-201 exam dumps off down the 70-534 answer analysis walk CISSP exam topics at a rush, mounted their horses and, followed by ADM-201 exam dumps ADM-201 exam dumps Jeems, went down the avenue of cedars at a gallop, waving their hats and yelling back to her.When they had rounded the curve of the dusty road that hid them from Tara, Brent drew his horse to a ADM-201 exam dumps stop under a clump of dogwood. Stuart halted, 70-534 answer analysis too, and the darky boy pulled up a few paces behind 300-208 study material them. The horses, feeling slack reins, 300-208 study material stretched down their necks to crop the tender spring grass, and the patient hounds lay down again in the 300-208 study material CISSP exam topics soft red dust and looked up longingly at the chimney swallows circling in the gathering dusk. 300-208 study material Brent’s wide ingenuous face was puzzled and mildly indignant.“Look,” he said. “Don’t it look to you like she 70-534 answer analysis would of asked us to stay for supper?”  Nor did 70-534 answer analysis James and Andrew, who took him into their store in Savannah, regret his lack of education. His clear hand, his 300-208 study material accurate CISSP exam topics figures and his shrewd ADM-201 exam dumps ability in bargaining won their respect, where a knowledge 70-534 answer analysis of literature and a fine appreciation of music, had young 300-208 study material Gerald possessed them, would have moved them to snorts of contempt. America, in the early years of the century, had been kind to the Irish. James and Andrew, who had begun by hauling goods in covered wagons 70-534 answer analysis from Savannah to Georgia’s inland towns, had prospered into a store of their own, and Gerald prospered with them.

Apa yang dilakukan Equifax dalam 6 minggu?

Mereka membuat sebuah laman www.equifaxsecurity2017.com yang dibuat di sebuah penyedia situs umum dengan DNS yang terdaftar secara anonim, bukan atas nama Equifax. Situs ini sepertinya dibuat secara tergesa-gesa sehingga masih ada beberapa data sensitif yang belum dilindungi. Situs ini bahkan sempat ditandai sebagai situs yang mencurigakan. Padahal, situs ini menyediakan layanan kepada rakyat AS apakah data mereka terjebol.

Situs ini mensyaratkan setiap orang yang menggunakan layanan untuk mengetahui datanya terjebol atau tidak harus secara otomatis melepaskan haknya untuk menuntut Equifax untuk hal yang terjadi sebagai syarat penggunaan (Terms of Use). Artinya, semua orang yang akan menggunakan layanan itu akan secara otomatis tidak bisa lagi menuntut kecerobohan Equifax. Namun, Jaksa Umum New York mengatakan bahwa syarat arbitrasi tersebut tidak benar dan meminta Equifax untuk mengubah/menghapus syarat penggunaan tersebut.

Beberapa hari setelah terjebolnya data Equifax, 3 orang eksekutif dalam perusahaan tersebut menjual sahamnya. Mereka berdalih bahwa ini hanya kegiatan yang biasa dan, menurut perusahaan, tidak mengetahui adanya kejadian terjebolnya data sebelum penjualan saham tersebut. Terlepas dari itu semua, para analis pasar modal justru menyarankan yang lain untuk membeli saham Equifax atau menahan diri untuk menjual saham tersebut.

Pelajaran

Banyak orang berasumsi bahwa tidak ada yang perlu ditakutkan bila kita tidak melakukan hal-hal yang salah. Nyatanya, penggunaan data secara ilegal pada era digital justru memerlukan privasi. Privasi bukan hanya mengatur data apa saja yang perlu dilindungi (boleh dibuka/tidak), namun juga mengatur kewajiban apa yang diperlukan untuk sebuah entitas (perusahaan/orang/apa pun) yang memegang info sensitif tersebut. Itu sebabnya, sebuah entitas bisnis diperlukan untuk membuat pernyataan privasi pada banyak negara.

Hal-hal yang dilakukan oleh Equifax ketika terjadi peretasan menandakan bahwa mereka tidak siap. Bahkan, mereka terkesan hendak cuci tangan. Padahal, ISO27001 dan standar keamanan sistem informasi (COBIT, ITIL, TOGAF) lainnya sudah ada.

Apakah standar-standar keamanan organisasi ini wajib diterapkan?

Kalau di Indonesia, sejauh ini saya baru menemukan POJK Nomor 38/POJK.03/2016 mengenai ketentuan bank umum untuk menerapkan standar-standar keamanan sistem informasi. Belum secara spesifik menyebutkan standar apa yang dipakai, misalnya SNI ISO/IEC 27001:2013. Jadi, standar apa pun yang digunakan asalkan disebutkan standar keamanan yang memenuhi kaidah tersebut, bolehlah. Lalu, bagaimana dengan industri telekomunikasi dan lembaga-lembaga lainnya yang non-bank umum?

Anda mungkin percaya kepada entitas yang memegang data Anda. Namun, ketidaktahuan bagaimana cara mereka menyimpannya dapat membuat data Anda tercuri. Alangkah baiknya pada era digitalisasi dan pertukaran data, payung hukum terpadu yang mendukung privasi dan prinsip keamanan dikembangkan. Hal ini dapat memaksa mereka untuk menerapkan standar keamanan yang cukup untuk melindungi data yang sudah dipercayakan.

Mungkin, suatu hari nanti apa bila itu terjadi, penipuan berbasis SMS sudah tidak laku lagi. Amin.

Maaf, ya, karena penjabaran berita Equifax kepanjangan, saya tidak menulis secara lengkap pendapat saya seperti biasanya. Nanti bila saya ada waktu℠ 😛

 

#TeamElonMusk
Super Android, recharge!

#TeamElonMusk

Mark Zuckerberg dan Elon Musk berselisih pendapat mengenai keberadaan kecerdasan buatan (Artificial Intelligence/A.I.). Perselisihan dimulai dari Elon Musk yang menginginkan agar pemerintahan seluruh dunia segera bersatu membuat aturan yang mengatur kecerdasan buatan. Kemudian, melalui Facebook Live, Zuckerberg membantah Elon Musk dan mengatakan bahwa kecerdasan buatan sangat membantu dan berharap bahwa 10 tahun mendatang kecerdasan buatan dapat menolong memperbaiki kehidupan manusia. Elon Musk merupakan bagian dari penanda tangan surat terbuka yang dibuat tahun 2015 untuk meminta pengembangan kecerdasan buatan yang bertanggung jawab.

Kata-kata Mereka

Agar elok, mari kita bandingkan perkataan mereka mengenai kecerdasan buatan agar lebih mudah membahas apa sebenarnya yang menjadi masalah.

Perkataan Elon Musk

Berikut apa yang dikatakan oleh Elon Musk:

“Normally the way regulations are set up is a whole bunch of bad things happen, there’s a public outcry and then after many years the regulatory agencies set up to regulate that industry. That in the past has been bad but not something that represented a fundamental risk to the existence of civilisation. AI is a fundamental risk to the existence of civilisation in a way that car accidents, aeroplane crashes, faulty drugs or bad food were not. They were harmful to a set of individuals but they were not harmful to society as a whole.”

Menurut Musk, normalnya regulasi dibuat setelah terjadi pertentangan di publik yang memaksa sesuatu untuk diregulasi. Hal ini karena risiko yang dapat timbul tidak mengancam keberadaan peradaban manusia. [Sedangkan] Kecerdasan Buatan adalah ancaman yang mengancam peradaban yang mana berbeda [tingkat ancamannya] dengan kecelakaan mobil, kecelakaan pesawat, obat-obatan terlarang,  atau makanan yang buruk. Semuanya itu berbahaya kepada beberapa individu, tetapi mereka tidak berbahaya kepada masyarakat secara keseluruhan [seperti kecerdasan buatan].

Elon Musk mencemaskan kecerdasan buatan yang dapat mengancam keberadaan peradaban manusia.

Perkataan Zuckerberg

Berikut yang dikatakan oleh Zuckerberg:

I have pretty strong opinions on this. I am optimistic. I think you can build things and the world gets better. But with AI especially, I am really optimistic. And I think people who are naysayers and try to drum up these doomsday scenarios—I just, I don’t understand it. It’s really negative and in some ways I actually think it is pretty irresponsible In the next five to 10 years, AI is going to deliver so many improvements in the quality of our lives… Whenever I hear people saying AI is going to hurt people in the future, I think, “yeah, you know, technology can generally always be used for good and bad, and you need to be careful about how you build it, and you need to be careful about what you build and how it is going to be used.” But people who are arguing for slowing down the process of building AI, I just find that really questionable. I have a hard time wrapping my head around that.

Zuckerberg berpendapat bahwa kita dapat membangun banyak hal untuk membuat dunia yang lebih baik. Tentang kecerdasan buatan, dia optimis dan tidak mengerti mengapa ada orang-orang yang menentang dengan alasan penyebab kiamat. Padahal, dalam waktu 10 tahun, kecerdasan buatan dapat meningkatkan kualitas hidup kita. Memang, semua teknologi bisa digunakan untuk kebaikan atau kejahatan dan kita harus berhati-hati dalam menggunakan teknologi. Untuk orang-orang yang berargumen untuk memperlama proses pembuatan kecerdasan buatan, Zuckerberg mempertanyakan pendapat tersebut.

Zuckerberg berpendapat bahwa kecerdasan buatan hanyalah sebuah teknologi sama seperti teknologi lainnya. Ia dapat digunakan untuk kebaikan atau keburukan. Sehingga, memperlambat pengembangannya adalah hal yang tidak masuk akal.

Kecerdasan Buatan yang Dimaksud

Apa, sih, yang mereka perdebatkan?

Dari segi tingkat kecerdasan, ada tiga jenis kecerdasan buatan:

  • Kecerdasan Buatan Lemah, Weak A.I./Artificial Narrow Intelligence (ANI). Sistem kecerdasan buatan yang dibuat untuk menyelesaikan satu area permasalahan saja. Misalnya, kecerdasan buatan yang dibuat untuk bermain catur.
  • Kecerdasan Buatan Umum, Artificial General Intelligence (AGI). Sistem kecerdasan buatan yang dibuat untuk mereplikasi pikiran manusia.
  • Kecerdasan Buatan Super, Artificial Superintelligence (ASI). Sistem kecerdasan buatan yang memiliki kemampuan berpikir jauh lebih pintar dari manusia.

Hal yang ditakutkan oleh Elon Musk adalah kecerdasan buatan umum (AGI) yang saat ini sedang dikembangkan. Ada dua sifat yang menjadi ancaman membuat kecerdasan buatan ini menakutkan:

  1. AGI memiliki kemampuan untuk berkomunikasi dengan bahasa yang tidak dimengerti oleh manusia. Hal ini membuat penyeliaan menjadi proses yang rumit bahkan mustahil.
  2. AGI memiliki kemampuan untuk memperbaiki algoritma untuk mencapai tujuan. Perbaikan tanpa penyeliaan manusia dapat menghasilkan keputusan yang tidak dapat dicegah.

Intinya, ketika pengembangan kecerdasan buatan tanpa penyelia tercapai masalah dapat muncul. Arah algoritma yang tak terduga dapat membuat algoritma kecerdasan buatan menjadi jahat (rogue). Itu sebabnya, ada usaha seperti Google yang berusaha mengembangkan kecerdasan buatan yang tidak curang.

Ancaman Nyata Saat Ini

Hal yang paling berpengaruh dalam kecerdasan buatan adalah otomatisasi. Otomatisasi meningkatkan efisiensi yang dapat menurunkan biaya produksi. Lengan-lengan robotika dan mesin yang diatur secara canggih menghasilkan paket produk secara cepat.

Sayangnya, keberadaan otomatisasi menghilangkan kebutuhan industri akan pekerja (manusia). Otomatisasi menghilangkan banyak pekerjaan yang tersedia bagi manusia. Mereka tergantikan oleh mesin yang lebih efisien dan anti mogok kerja.

Zuckerberg tidaklah 100% melawan Musk. Seperti Elon Musk, dia menyetujui juga pentingnya pendapatan dasar universal (universal basic income, UBI). Pendapatan dasar universal adalah bantuan tunai langsung yang diberikan oleh pemerintah kepada masyarakat akibat adanya otomatisasi industri yang menggantikan pekerja. Sebagai contoh, Pemerintah Alaska menerapkan kebijakan Permanent Fund Dividend (PFD) yang memberikan uang rata-rata senilai US$1.000,00 per kepala.

Pemerintahan SBY pernah mencoba melakukan program UBI melalui Bantuan Langsung Tunai (BLT). Penyebabnya bukanlah otomatisasi industri, tetapi inflasi yang berlebihan. Namun, karena data penduduk yang digunakan adalah data lama, maka BLT berlangsung gagal dan mendapat kecaman. Timbul konflik di beberapa daerah akibat adanya BLT. Selain itu, persepsi masyarakat merasa bahwa BLT membebankan APBN. Waktu yang terbatas pun menjadikan BLT menjadi tidak tepat guna karena belum sempat efektif implementasinya.

Padahal, menurut Evans dan Popova dalam penelitian mereka di Kenya, justru tingkat penggunaan uang dari BLT sangat baik. Ketika wanita menjadi pemegang keuangan, alkohol dan rokok justru tidak terbeli. Mereka fokus untuk pemenuhan rumah tangga. Mungkin, itulah sebabnya Jokowi/Ahok menggunakan variasi BLT dalam KJP untuk dapat menaikkan standar hidup mereka sekaligus memberikan kepercayaan kepada masyarakat bahwa uang yang diberikan tidak untuk disia-siakan.

UBI bisa jadi solusi jangka panjang untuk hilangnya lapangan pekerjaan. Ada tantangan yang akan dihadapi ketika ini diterapkan di Indonesia. Pendataan penduduk yang akurat dan waktu untuk menerapkan yang cukup lama. Selain itu, pemerintah memiliki tugas untuk meyakinkan masyarakat yang masih memiliki lapangan pekerjaan bahwa tidak apa untuk memberikan gratis uang kepada mereka yang pekerjaannya terhilang.

Saya belum yakin kalau Indonesia akan bisa menganggap mereka yang menganggur sebagai penyebab hilangnya lapangan pekerjaan. Jangan-jangan, saat otomatisasi tiba, kita akan mengira bahwa mereka hanyalah orang-orang yang malas. Bahkan, kita tidak lagi mengganggap mereka adalah orang-orang yang kesempatannya telah hilang, tetapi lebih rendah dari itu.

Itulah makanya, saya setuju bahwa pencapaian teknologi perlu diimbangi dengan kajian yang mendalam mengenai dampak sosial yang akan muncul. Tidak untuk mencegah kemajuan, namun untuk sebuah kemanusiaan yang masih bebas dan merdeka.

Pemasangan Oneplus 5: Bagian 2
Super Android, recharge!

Pemasangan Oneplus 5: Bagian 2

Pada bagian ini saya hendak menceritakan beberapa perkakas yang saya pasang untuk membantu saya.

Komponen Google

Ingat bahwa saya menghapus banyak aplikasi standar OOS? (Debloated)

Nampaknya, ada beberapa komponen Google yang harus ada supaya aplikasi dan penggunaan Oneplus maksimal.

  • Google. Nampaknya peluncur Oneplus dan komponen lainnya mengambil data dari API Google. Jadi, aplikasi ini terpasang secara baku.
  • GBoard. Saya suka dengan susunan tombol dari Google Keyboard.
  • GMail. Untuk mengakses surel yang diperlukan untuk spamming daftar ke banyak situs.
  • Google Calendar. Pengingat ulang tahun nomor wahid. Bisa rusak hubungan tanpa ini.
  • Google Drive. Setidaknya bisa melihat dokumen dengan ini.
  • Google Play Games. Mobile Legends menggunakan ini untuk menyimpan data. Apa? Anda pikir saya terlalu serius?
  • Google Text-to-speech (TTS). Penyedia NLP de facto di Android. Saya malas memasang yang alternatif. Teknologi TTS dibutuhkan untuk aplikasi yang menyebutkan sesuatu seperti nama jalan. Aplikasi Here MAPS yang saya gunakan butuh ini.
  • Snapseed. Untuk menjadi (mengemulasi diri seperti) anak gaul perlu banyak efek kamera yang komprehensif. Didukung dengan kamera yang prima, Snapseed menjadi perkakas utama untuk tampil prima di media sosial.

Komponen Magisk

Magisk adalah sebuah proyek baru yang mengimplementasi supersu, fungsi rooting di Android. Berikut adalah modul tambahan yang saya masukkan untuk membuat Oneplus 5 saya lebih berwarna:

  • Busybox for Android NDK. Seperti Google, aplikasi wajib.
  • F-Droid Privileged Extension. Aplikasi market yang memasang aplikasi FOSS.
  • Sony Music app Magisk Module. Saya pecinta Sony Ericsson dari zaman Z600 sampai terakhir Xperia Mini Pro. Berhubung tidak ada aplikasi musik pada ROM yang saya pasang, saya memilih aplikasi ini. Keunggulan dia adalah bisa memilih dari direktori atau pustaka. Plus, bisa mencari gambar album. Terakhir, menaruh lagu/album ke playlist.

Demikian.

 

 

Pemasangan Oneplus 5: Bagian 1
Super Android, recharge!

Pemasangan Oneplus 5: Bagian 1

Oneplus 5

Oneplus 5 package

Sebegitu rindunya saya memiliki Oneplus 5 sehingga saya pun terpaksa menelan harga diri dan menerima paket Oneplus 5 dengan bonus Beats. Ingat! Saya tidak menggunakan Beats, jadi jangan hakimi saya!

Paket yang saya beli memberikan saya satu karet pelindung, satu pelindung layar, dan satu Beats. Sayangnya, dari ketiganya hanya karet pelindung yang saya pakai sementara. Sisanya akan teronggok di gudang.

Langkah yang pertama ketika membuka Oneplus 5, seperti versi sebelumnya, saya mengganti ROM pabrikan. Hal ini penting karena ada beberapa fitur yang perlu:

  • AdAway untuk DNS anti iklan.
  • F-Droid untuk penyedia aplikasi GPL v3.
  • Membuang aplikasi yang tak perlu.
  • Deodexed, penjadwal kernel, dan beberapa fitur lainnya.
  • Dan beberapa aplikasi yang tak baik untuk disebut di sini.

Saya sebenarnya lebih suka ROM non-OOS (non-Oxygen OS). Namun, apa daya karena masih baru, ada galat seperti dukungan Bluetooth dan beberapa galat lainnya membuat saya masih berpaling ke ROM berbasis OOS.

Setelah riset beberapa saat, saya memutuskan untuk memilih berikut:

Aktifkan Debug

Dari Settings → About phone, ketuk beberapa kali pada baris Build number untuk mengaktifkan Developer options. Keluar dari About phone akan ada menu baru Developer options.

Aktifkan OEM unlocking untuk memasang ROM pemulihan terkustomisasi, TWRP.

Aktifkan USB Debugging agar dapat dikenali di komputer.

Setelah ini, sambungkan ke komputer. Telepon akan menanyakan apakah komputer dapat dipercaya. Silakan dicentang dan setujui. Bila benar, maka Oneplus akan dikenali:

$ adb devices
List of devices attached
b0cb66  device


Selanjutnya memasang BOOT.

Memasang Boot

Nyalakan ulang Oneplus ke mode Fastboot:

adb reboot bootloader

Buka segel Oneplus:

sudo fastboot oem unlock

Saya asumsikan Anda sudah mengunduh twrp-3.1.1-1-cheeseburger.img di komputer Anda.

sudo fastboot flash recovery twrp-3.1.1-1-cheeseburger.img

Nyalakan ulang dan masuk ke Recovery:

adb reboot recovery

Salah satu kekurangan ketika dibuka kunci, perangkat Oneplus pasti mengaktifkan fungsi semacam menu GRUB sebelum masuk. Ya, tinggal pencet tombol Power, sih, untuk Start kalau tidak sabar menunggu beberapa detik.

Memasang ROM

Ketika di dalam mode Recovery, Anda dapat menggunakan menu-menu TWRP untuk memasang sistem. Tetapi, apa serunya? Saya menggunakan terminal dan TWRP.

Format Partisi Lama

Pada menu TWRP, pilih Wipe → Advanced Wipe

Pilih partisi-partisi berikut untuk dihapus:

  • Dalvik/ART Cache
  • Cache
  • System
  • Data

Sisakan Internal Storage dan USB-OTG. Lalu, Swipe to Wipe

Wipe before install

Tekan tombol kembali tiga kali untuk kembali ke menu utama.

Menaruh Berkas-berkas

Taruh berkas-berkas yang diperlukan ke Oneplus.

ROM

adb push xXx_NoLimits_1.6_OP5_Oxygen_4.5.5.zip /sdcard/

Kernel

Pemasang ROM xXx akan mengenali kernel Adin bila ditaruh pada direktori yang tepat:

adb shell mkdir /sdcard/xXx
adb push Adin-Kernel-R6-OP5-OOS-N.zip /sdcard/xXx

Pasang ROM

Untuk memasang, di menu utama ketuk menu Install.

Pilih ZIP ROM xXx yang telah diunggah tadi.

Swipe to confirm Flash

Perhatikan bahwa kita tidak perlu memilih kernel Adin karena akan dideteksi nanti.

xXx Aroma Installer

Pilih Make your individual Selections karena saya suka kebebasan!

Pastikan pilihan berikut tercentang:

Reboot Options:

  • Reboot after Flashing

Root Access:

  • Magisk v13 by topjohnwu

xXx Tweaks:

  • xXx Tweaks Framework
  • Windows Animation Scales

Kernel:

  • Kernel Selection Menu

SDcard Fix:

  • Fix SDcard permissions

Update Radio and Firmware

  • Flash Radio and Firmware

Reset Magisk Repository Image

  • Reset Magisk Image (pastikan ini dipilih supaya bersih)

Ketuk Next untuk ke halaman selanjutnya.

Laman ini laman preferensi. Jadi, silakan saja pilih sesuka hati. Namun, berikut pilihan saya.

Launcher Selection:

  • OnePlus Launcher (saya pilih ini biar terasa rasa Oneplus-nya)

Sound Mods saya tidak pilih satu pun karena semua musik yang saya taruh saya rip dari CD yang saya beli sendiri.  Silakan pilih kedua pilihan yang ada kalau Anda mau.

Debloating:

  • Extreme Debloating

Emojis:

  • Oneplus Stock Emojis 

Ketuk Next untuk ke halaman selanjutnya.

Windows Animation Speeds:

  • Fast Animations (tergantung selera)

Ketuk Next untuk ke halaman selanjutnya.

Kernel Selections:

  • STOCK KERNEL
  • Adin Kernel – by adinkwok

Ketuk Next untuk ke halaman selanjutnya.

Ketuk Next untuk untuk memulai pemasangan sistem.

Bila benar, maka setelah selesai pemasangan, sistem akan dinyalakan ulang dan masuk ke sistem yang baru. Selanjutnya, pemasangan Oneplus seperti biasa.

Memasang React Native
Super Android, recharge!

Memasang React Native

WordPress semenjak versi 4.7 telah menambahkan fitur WP REST API v2. Dengan adanya fasilitas tersebut, WordPress bisa dibuat sebagai peladen API yang berisi artikel. Namun, yang paling penting dari semuanya itu, WordPress dapat menjadi peladen untuk aplikasi-aplikasi web modern macam React/Redux dan lain sebagainya.

Cara Pasang

Pastikan bahwa Android SDK sudah terpasang. Paling gampang, kita bisa langsung memasang Android Studio yang juga akan memasang Android SDK. Silakan ikuti tautan. Saya takkan menulis apa pun karena tutorial dari Google sudah ada yang menggunakan Bahasa Indonesia.

Jalankan ketiga baris ini dan tambahkan ketiga baris tersebut ke dalam ~/.bashrc agar selalu otomatis terjalankan setiap kali Anda menjalankan sesi terminal baru.

export ANDROID_HOME=~/Android/Sdk
export PATH=${PATH}:${ANDROID_HOME}/tools
export PATH=${PATH}:${ANDROID_HOME}/platform-tools

Lalu, jalankan Android SDK Manager:

android

Dalam Android SDK Manager, pilih dua paket berikut:

  • Android SDK Build-tools versi 23.0.1
  • Android 6.0 (API 23) SDK Platform (Rev 3).

Silakan lihat gambar untuk lebih jelasnya.

SDK Android Platform Manager

Android SDK Manager, showing what to install to run React Native

Setelah ini, pasang React Native:

sudo npm install -g react-native

Ambil kopi atau sapa sanak saudara dari pada bengong lama menunggu proses pemasangan React Native.

Buat AVD Dulu

Buat terlebih dahulu sebuah emulasi mesin Android:

android avd
AVD Manager

AVD Manager, click Create to create new emulated Android device.

Pilih tombol Create.

Saya mengubah beberapa parameter berikut:

  • AVD Name: ReactNativeOS [Saya memang kurang kreatif :P]
  • Device: Nexus 5 [Terserah, sih]
  • Target: Android 5.1.1 – API Level 22
  • CPU/ABI: Intel Atom (x86_64)
  • Skin: Skin with dynamic hardware control
  • Front Camera, Back Camera: Emulated
  • SD Card: 200 MB
  • Emulation Options: Use Host GPU
Create Android Emulator

Create new Android Emulator based on Nexus 5 and API Level 21

Sisanya saya biarkan pilihan baku. Setelah itu, klik OK.

Jalankan Android yang baru dibuatkan:

emulator -avd ReactNativeOS &

Cara Pakai

Jalankan terlebih dahulu emulator AVD

Untuk membuat proyek baru:

react-native init UnivIndonesia && cd UnivIndonesia

Setelah pemasangan berhasil, masuk ke direktori dan jalankan peladen NodeJS:

npm start

Setelah itu, buka terminal baru lagi dan masuk ke direktori tersebut. Kalau mau di terminal yang sama, tambahkan tanda ampersand (“&”) setelah “start” agar Nodejs dijalankan di latar belakang.

Untuk melihat aplikasi Android yang sudah dibuat, jalankan:

react-native run-android

Selamat mencoba. Sebenarnya, React Native bisa dijalankan di iOS, tapi saya tak mampu membeli SDK Apple. 😛

Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Wheezy
By The people from the Tango! project, derived RRZEicons (The Tango! Desktop Project) [Public domain], via Wikimedia Commons, color modified by JP

Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Wheezy

Maaf, ya, saya suka khilaf lupa menulis tulisan lanjutan. Ha… ha… ha….

Berikut ini adalah cara memasang sertifikat SSL yang ditandatangani oleh Let’s Encrypt dengan menggunakan certbot pada Debian Wheezy. Silakan lihat cara pasang di Wheezy untuk keterangan lebih lanjut.

Aktifkan Repo Debian Wheezy Backports

Anda bisa langsung mengaktifkan repo Debian Wheezy Backports:

echo "deb http://kambing.ui.ac.id/debian-backports/ jessie-backports main" | sudo tee /etc/apt/sources.list.d/debian-backports.list
sudo apt update

Atau nanti tunggu ditanyakan pada saat menjalankan certbot.

Pasang certbot

Unduh dengan pengunduh favorit Anda.

sudo wget https://dl.eff.org/certbot-auto -O /usr/local/bin/certbot-auto
sudo chmod +x /usr/local/bin/certbot-auto

Sebelum Memasang Let’s Encrypt

Siapa tahu Anda malas tidak punya waktu untuk membaca artikel sebelumnya, perhatikanlah:

  1. Pastikan semua domain yang didaftarkan sudah terdaftar di DNS publik.
  2. Pastikan bahwa direktori yang memuat URL untuk sertifikasi dapat diakses.

Penulisan DNS di luar cakupan tulisan ini. Berikut contoh direktori .well-known

server {
        listen   80;
        listen  [::]:80 ipv6only=on;
        server_name  example.com www.example.com;
        server_name_in_redirect on;
        port_in_redirect on;
 
        access_log  /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;
 
        # For ACME Let's Encrypt challenge
        location /.well-known {
                alias /var/www/html/.well-known; # have this as the webroot
        }
 
        location / {
                return 301 https://$server_name$request_uri;
        }
 
}

Mari memasang certbot.

Sertifikasi

Seperti biasa:

sudo certbot-auto certonly --webroot -w /var/www/html -d example.com -d www.example.com

Seandainya tadi Anda melewati bagian pemasangan repositori Debian Backports, maka Anda akan ditanyakan:

To use the Apache Certbot plugin, augeas needs to be installed from wheezy-backports.
Would you like to enable the wheezy-backports repository [Y/n]? y

Lalu beberapa pesan pemasangan paket Python virtualenv. Kemudian, ditanyakan alamat info:

Installing Python packages...
Installation succeeded.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel):admin@example.com

Lalu, ditanyakan apakah menyetujui syarat dan ketentuan yang diberikan, jawab A untuk setuju.

-------------------------------------------------------------------------------
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.1.1-August-1-2016.pdf. You must agree
in order to register with the ACME server at

No Title

No Description

------------------------------------------------------------------------------- (A)gree/(C)ancel: A

Setelah itu, tunggu beberapa saat.

Obtaining a new certificate
Performing the following challenges:
http-01 challenge for example.com
Using the webroot path /var/www/html for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0000_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0000_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/example.com/fullchain.pem. Your
   cert will expire on 2017-04-19. To obtain a new or tweaked version
   of this certificate in the future, simply run certbot-auto again.
   To non-interactively renew *all* of your certificates, run
   "certbot-auto renew"
 - If you lose your account credentials, you can recover through
   e-mails sent to admin@example.com.
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Kalau sudah sampai sini, Anda sudah selesai mendapatkan sertifikasi dari Let’s Encrypt.

Konfigurasi NGINX

Kalau mau penjelasan, lihat artikel terdahulu.

Berikut blok SSL:

ssl  on;
 
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_prefer_server_ciphers on;
ssl_session_cache   shared:SSL:20m;
ssl_session_timeout 60m;
 
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
 
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8;
 
add_header Strict-Transport-Security "max-age=31536000" always;

Nah, untuk Debian Wheezy, ada tambahan yang harus dilakukan.

Penambahan Penjadwalan CRON

Pada paket Debian Jessie, jadwal CRON untuk certbot sudah dipasang pada /etc/cron.d/certbot. Mari tambahkan secara manual untuk Debian Wheezy.

Pertama-tama, coba jalankan apakah sukses.

sudo certbot-auto renew --dry-run

Kalau sudah berhasil, maka pasang pada CRON.

sudo crontab -e

Masukkan entri:

0 */12 * * * /usr/local/bin/certbot-auto renew --quiet --no-self-upgrade

Let’s Encrypt memandatkan untuk pengecekan sehari dua kali.

Terakhir

Selesai.

 

Bacaan Lebih Lanjut

Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Jessie
By The people from the Tango! project, derived RRZEicons (The Tango! Desktop Project) [Public domain], via Wikimedia Commons, color modified by JP

Membuat Sertifikat Let’s Encrypt Menggunakan certbot Di Debian Jessie

Untuk mendukung web yang aman dan dalam rangka HTTP/2 yang sudah menggunakan SSL sebagai dasar koneksi, diperlukan sertifikat digital yang ditandatangani oleh pihak yang terpercaya. Situs yang memiliki sertifikat digital yang ditandatangani sendiri bahkan sudah ditandai oleh beberapa peramban sebagai situs tak aman. Tak ayal lagi, diperlukan tanda tangan digital yang terpercaya.

Kali ini kita menggunakan sebuah sertifikat gratis yang bernama Let’s Encrypt. Penyedia sertifikat ini (CA) didukung oleh EFF (Electronic Frontier Foundation), sebuah organisasi nirlaba yang bergerak dalam aktivitas digital. Bahkan, organisasi nirlaba ini menyediakan perkakas untuk sertifikasi tanda tangan digital, certbot.

Mungkin Anda bertanya, bagaimana dengan Sivion? Sivion adalah salah satu usaha dari Indonesia untuk itu. CA (penyedia sertifikat) dari Indonesia ini saat ini menyediakan tanda tangan gratis bagi kita. Namun, sayangnya mereka belum menyediakan perkakas sertifikasi seperti Let’s Encrypt.

Artikel kali ini membahas bagaimana memasang sertifikat Let’s Encrypt dengan certbot. Artikel ditulis untuk Debian Jessie.

Aktifkan Repo Debian Jessie Backports

Tambahkan ke daftar repo dan perbaharui daftar paket.

echo "deb http://ftp.debian.org/debian jessie-backports main" | sudo tee /etc/apt/sources.list.d/debian-backports.list
sudo apt update

Saya tidak arahkan ke Kambing karena saya sedang malas membetulkan Kambing. Mungkin nanti setelah betul, saya arahkan ke Kambing. ;-P

Pasang certbot

Perkakas certbot ada di repo Jessie Backports.

sudo apt-get install certbot -t jessie-backports

Sebelum Memasang Let’s Encrypt

Ada dua hal yang menjadi kewajiban kita:

  1. Pastikan semua domain yang didaftarkan sudah terdaftar di DNS publik.
  2. Pastikan bahwa direktori yang memuat URL untuk sertifikasi dapat diakses.

Untuk pembuatan entri DNS di luar cakupan tulisan ini.

Halaman HTTP (tanpa SSL) untuk lokasi .well-known/ (http://example.com/.well-known/) harus dapat diakses. Bila Anda seperti saya yang mematikan non-SSL, harus ditambahkan dahulu pengecualian tersebut di peladen. Omong-omong saya menggunakan peladen NGINX. Contoh pengecualian:

server {
        listen   80;
        listen  [::]:80 ipv6only=on;
        server_name  example.com www.example.com;
        server_name_in_redirect on;
        port_in_redirect on;

        access_log  /var/log/nginx/access.log;
        error_log  /var/log/nginx/error.log;

        # For ACME Let's Encrypt challenge
        location /.well-known {
                alias /var/www/html/.well-known; # have this as the webroot
        }

        location / {
                return 301 https://$server_name$request_uri;
        }

}

Berikutnya, pasang.

Sertifikasi

Jalankan sertifikasi

sudo certbot certonly --webroot -w /var/www/html -d example.com -d www.example.com

Ikuti prosesnya, biasanya pertama-tama ditanyakan alamat surel yang bisa dihubungi bila ada apa-apa.

Enter our email address

Enter our email address

Setelah itu, biasanya ditanyakan kesediaan mengikuti syarat dan ketentuan yang ditetapkan oleh Let’s Encrypt. Pencet tombol [ENTER] saja.

Saya lupa menyuplikkan saat sudah berhasil. Ya, coba saja cek direktori /etc/letsencrypt/live yang seharusnya berisi satu direktori bernama domain pertama yang kita daftarkan.

Konfigurasi NGINX

Sebelum saya kasih konfigurasi penuh, saya coba berikan potongan.

SSL Baku

Untuk konfigurasi SSL baku gunakan sertifikat-sertifikat ini:

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

OCSP Stapling

Untuk memanfaatkan OCSP Stapling gunakan sertifikat ini:

ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;

Contoh Penuh

Ini contoh penuh blok SSL saya.

ssl  on;

ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        
ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers         "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
ssl_prefer_server_ciphers on;
ssl_session_cache   shared:SSL:20m;
ssl_session_timeout 60m;

ssl_dhparam /etc/nginx/ssl/dhparam.pem;

ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
resolver 8.8.8.8;

add_header Strict-Transport-Security "max-age=31536000" always;

Terakhir

Untungnya menggunakan paket Debian Jessie adalah pembaharuan SSL berlangsung otomatis. Setelah ini saya akan buat tulisan untuk Debian Wheezy. Sayangnya, pemasangan Debian Wheezy lebih rumit dari Debian Jessie.

Selamat mencoba dan tinggalkan komentar bila ingin bertanya.

Bacaan Lebih Lanjut

Membuat Pemerintahan yang Tangkas dengan Metodologi Tangkas (Agile Method)

Membuat Pemerintahan yang Tangkas dengan Metodologi Tangkas (Agile Method)

Mark Schwartz berbicara mengenai bagaimana dia mau mengubah Departemen Imigrasi Amerika Serikat menjadi lebih mudah dan efisien. Berikut apa yang saya tangkap dari apa yang dia bagikan ditambah beberapa addendum dari saya.

  • Problem pertama Schwartz adalah adanya aturan MD 102 (Management Directive #102) dari Homeland Security untuk pengadaan proyek TIK. Dokumen tersebut menyediakan falsafah pengembangan menggunakan sebuah pengembangan air terjun (Waterfall SDLC) yang komprehensif. Pada buku tersebut, tercantum proses apa saja yang dilakukan dan dokumen apa saja yang harus dilakukan. Setelah mempelajarinya, Beliau mengumpulkan semua pelatih tangkas dan membuat sebuah sabda MD001, “mulai sekarang kita semua tangkas.” Beliau mendefinisikan 8 nilai inti dalam metodologi tangkas yang hendak diimplementasi.
  • Lebih lanjut, yang perlu dilakukan oleh Schwartz adalah menerjemahkan semua kebutuhan yang dicakup dalam MD102 dan memetakannya ke dalam sebuah Praktik Tangkas sehingga menjadi Birokrasi Ramping (Lean Bureaucracy).
    • Menggunakan Continues Integration (Integrasi Berkesinambungan) dan semua perkakas yang biasa digunakan: Chef (Infrastruktur sebagai pemrograman, otomatisasi deployment), Jenkins (perkakas pembangunan secara berkesinambungan), GIT (DVCS), Gradle, New Relic (Manajemen Log), AWS (Infrastruktur Awan), Gradle (perkakas kompilasi), Spring (Java).
    • Menerjemahkan aturan-aturan hukum menjadi Test Driven Methodology: (Metodologi Berbasis Pengujian)
      • Misalnya, untuk UU Disabilitas dibuatkan pengujian kode yang dapat mendukung disabilitas.
      • Menerapkan standarisasi keamanan menjadi analisis kode statik (Static Code Analysis).
      • Menerapkan level permainan yang sama bagi semua kontraktor yang menang tender. Mereka dapat langsung masuk dan menyelesaikan aplikasi tanpa bergantung kepada dokumentasi yang sebelumnya. Hal ini diakibatkan dari sifat Metodologi Tangkas yang menyediakan unit test dan berbagai macam penunjang sehingga pengembang bisa langsung masuk.
    • Menyediakan grafik-grafik dari data yang dapat dikumpulkan dari hulu ke hilir sehingga menghasilkan dokumen empirik yang dapat dinilai secara obyektif.
      • Semua Komponen pada Integrasi Berkesinambungan dapat dicatat!
      • Hal ini karena infrastruktur sendiri dijahit dalam kode-kode (Chef) yang dapat dimonitor (debug) dan dihitung.
      • Jenkins dapat menghasilkan catatan mengenai hasil kompilasi dan deployment setiap versi pembangunan (build).
      • Spring menyediakan instrumentasi untuk mengukur. (Lihat Spring Boot)
      • Infrastruktur Awan dapat menyediakan seberapa besar penggunaan sumber daya secara menyeluruh.
    • Menjalankan Chaos Monkey! 😛

Beliau juga berbicara pada AWS Government, Education and Nonprofits Symposium. Pada forum tersebut, Beliau menyatakan sebenarnya kebutuhan proses dalam birokrasi adalah

The speed from when we [government] realize a mission need to the time when we deploy a capability to meet that mission need.

Atau diterjemahkan sebagai berikut:

Waktu yang dibutuhkan untuk pemerintah mendapatkan sebuah kebutuhan misi sampai waktu yang diperlukan saat sebuah kemampuan yang dihasilkan untuk memenuhi kebutuhan tersebut.

Biasanya yang terjadi adalah Pemerintah mendapatkan sebuah kebutuhan dan menunggu sampai lebih banyak lagi kebutuhan sehingga dapat dibundel menjadi satu Program Kerja. Akibat satu bundel Proker ini, mereka harus menulis sekitar 105 dokumen tebal yang kemungkinan tidak ada yang membaca. Baru, setelah itu mereka masuk ke Lelang. Setelah lelang berbagai hal (barang-barang, jasa pemasangan ke Pusat Data, jasa pengembangan, dll.), aplikasi dikembangkan. Setelah selesai pengembangan, aplikasi diuji untuk memenuhi kebutuhan. Terakhir, aplikasi diuji keamanan. Baru setelah itu (kemungkinan) digunakan.

Proses ini dapat menghabiskan waktu 12 tahun. Artinya, ada 12 tahun masa yang diperlukan untuk sebuah kebutuhan Pemerintah untuk dapat benar-benar dikerjakan. Bisa jadi, kebutuhan tersebut sudah berubah.

Yang dilakukan adalah Schwartz dan tim menciptakan sebuah Sistem Integrasi Berkesinambungan (Continues Integration System) yang memiliki sejumlah pengujian. Hal yang dilakukan oleh pengembang, setelah mereka menguji kode mereka, mereka pun menerbitkan (push) kode mereka ke sistem ini. Lalu, sistem ini yang kemudian menjalankan berbagai proses tes secara otomatis. Sehingga, setelah selesai proses ini sehingga menghasilkan satu versi pembangunan yang sukses, sistem ini langsung secara otomatis dapat diterbitkan ke infrastruktur awan untuk dijalankan langsung.

Untuk setiap pembaca yang belum begitu paham Metodologi Tangkas, Metodologi Tangkas menekankan pada “code often, deploy often”. Dalam Metodologi Tangkas Scrum, hal ini diterjemahkan dengan menyediakan solusi dari hulu ke hilir untuk Kebutuhan yang tidak terlalu besar. Bahkan, Scrum menyarankan untuk memotong-motong sebuah kebutuhan yang besar menjadi kebutuhan-kebutuhan yang kecil (atomik).

Kebutuhan-kebutuhan kecil ini menjadi semacam sayembara (bounty) yang dapat diambil oleh pengembang. Setiap kebutuhan atomik ini dihargai dengan poin. Dengan adanya poin ini, pengembang dapat menghitung berapa waktu yang dibutuhkan untuk menghasilkan produk. Semua berlangsung secara empirik karena ada nilai dan proses. Kegiatan pengembangan pun dilakukan dari hulu (back end) ke hilir (front end). Sehingga, pada setiap akhir kegiatan pengembangan kebutuhan atomik, ada aplikasi yang berjalan (berfungsi/dapat diakses dan digunakan).

Dari sisi Pemerintahan, dengan kebutuhan yang kecil, maka risiko yang dapat dihasilkan pun mengecil. Sehingga, dokumentasi yang dibutuhkan, penilaian yang dilakukan, dan audit yang diperlukan tidak sebanyak yang lama. Waktu yang dibutuhkan pun menjadi kecil!

Apa artinya ini?

Inovasi sebenarnya lebih mudah di pemerintahan. Kalau secara personal, akan banyak diketemukan banyak inovasi dari hampir semua orang. Namun, yang sebenarnya terjadi adalah banyak orang yang memiliki ide untuk meningkatkan berbagai proses merasa tak berkuasa. Mereka takut untuk harus terpenjara membuat 105 dokumentasi per ide mereka.

Dengan adanya Manajemen Identitas (SSO) yang sudah ada, infrastruktur awan yang sudah tersertifikasi fedRAMP, dan Infrastruktur Integrasi Berkesinambungan yang memenuhi kaidah-kaidah hukum, maka dapat dibuat eksperimen dengan biaya hampir tidak ada dengan potensi risiko yang rendah. Hal ini dapat dicapai asalkan ide yang ditawarkan dapat diterjemahkan menjadi aplikasi yang kemudian dapat dipublikasikan melalui Infrastruktur Integrasi Berkesinambungan tadi.

Eksperimen ini dapat langsung dijalankan dan diuji apakah berjalan baik atau tidak. Bila tidak, maka dapat langsung ditutup dengan hanya mematikan VM tersebut. Potensi kerugian pun minimal. Dengan potensi risiko dan biaya yang kecil, orang-orang tinggal diyakinkan untuk tidak malu untuk berinovasi. Hal ini mendukung inovasi dalam pemerintahan.

Satu catatan kecil, apa yang dilakukan Schwartz ini belum resmi karena menunggu Pemilu AS berakhir. Untuk mencari contoh yang berhasil, cari tidak lebih jauh ke Singapura. Singapura memiliki Badan Teknologi tersendiri untuk itu.

Singapura

Pada simposium yang sama, Chan Cheow Hoe menunjukkan bagaimana cara menerapkan layanan publik pada infrastruktur awan. Sebelum lebih lanjut membahas isinya, berikut hal menarik yang saya dapatkan dari Singapura:

  • Singapura telah mereformasi Depkominfo dan Departemen Penerangannya menjadi IMDA dan GovTech.
    • GovTech bertugas membangun platform kunci yang mendukung perkembangan infrastruktur teknologi yang aman untuk dapat dimanfaatkan oleh berbagai individu dan bisnis di Singapura. Misi mereka mendefinisikan Singapura sebagai Smart Nation. Sumber inovasi untuk TIK, IoT, dan membantu meningkatkan kemampuan Pemerintah Singapura dalam domain-domain ini.
    • IMDA bertujuan untuk membangun konten yang menghubungkan komunitas dan kepentingan. [sejujurnya saya tidak tertarik membahas peran IMDA, silakan baca sendiri di situs ;-P]
  • Ada beberapa hal yang hendak dicakup oleh GovTech:
    • Pemimpin dalam transformasi digital.
    • Program kerja Smart Nation dan Digital Gov.
    • Meningkatkan Kemitraan Teknologi
    • Membuat Open Data/OpenGov [Jakarta SmartCity seharusnya, UU Keterbukaan Informasi tujuannya, KPU C1 2014 contohnya] data.gov.sg yang dapat dimanfaatkan oleh berbagai pihak melalui API.

Berikut hal-hal yang dibicarakan oleh Chan Cheow Hoe:

  • Membuat sebuah pedoman dengan empat nilai berikut:
    • Meminimalisasi gesekan saat berhubungan dengan pemerintah. Intinya, mengurangi pertemuan langsung dengan pemerintah. Misalnya, pembuatan data terintegrasi dengan banyak perusahaan sehingga dapat membantu warga dalam membuat laporan pajak secara otomatis. (e-Filing yang terintegrasi)
      There should be no transaction if it’s not necessary.
    • Membuat komunitas digital dan ekosistem yang bermakna. Intinya, sih, sistem pelaporan Jakarta SmartCity plus beberapa eksperimen fungsionalitas.
    • Mengantisipasi isu-isu dan menyelesaikannya. Intinya, Big Data Analysis.
    • Menjembatani jurang digital. Intinya, berbagai program kerja pengentasan buta teknologi.
  • Menyediakan Infrastruktur Hibrida:
    • Managed Hosting. Untuk aplikasi-aplikasi tradisional.
    • Government cloud. Untuk sistem dengan data negara yang sensitif.
    • Public cloud. Untuk sistem yang menghasilkan data yang berhubungan dengan masyarakat.
  • Menerbitkan standarisasi Multi-Tier Cloud Security (MTCS) untuk menyeragamkan setiap penyedia layanan awan. Standarisasi MTCS ini sejajar dengan ISO27001. Dengan demikian, infrastruktur yang aman pun terjamin untuk kebutuhan Singapura (baik pemerintah mau pun sektor privat).

Bahkan Schwartz menyadari bahwa Pemerintah Singapura merupakan “kompetitor” yang luar biasa. Dia bahkan melucu bahwa dia jadi tertarik mau pindah ke Singapura. Aduh, kok, tulisan ini jadi panjang lebar, yah? Oh, tidak, waktu bermain game saya habis menulis ini.

Indonesia

Tadi saya perasaan mau menulis sesuatu, tapi hasrat bermain saya meninggi. Saya rasa rekan-rekan punya ide yang lebih baik. Ini beberapa hasil analisis saya.

  • PENTING: Perbanyak bergaul dengan Agile coach (pelatih tangkas). Baik AS mau pun Singapura merangkul profesional dalam membangun infrastruktur dan kebijakan.
  • Hukum: Anehnya, Hukum di Indonesia justru mendorong inovasi ini. Tidak ada MD102, bahkan adanya UU yang mendorong pembukaan (sebagian) data pemerintah ke sektor publik.
  • Hukum: Bahkan, ada hukum yang mengharuskan data ada di Indonesia untuk memproteksi kepentingan rakyat Indonesia.
  • Infrastruktur: Perkaya dan perkuat koneksi IIX! Kenyataannya, kebanyakan bisnis lebih percaya AWS. Bahkan, mereka lebih mempercayai Digital Ocean dan Microsoft Azure yang baru saja loncat ke sektor awan. Semuanya tidak ada satu pun di Indonesia.
  • Infrastruktur: PLN memiliki layanan yang semakin baik, demikian dari hasil survei kecil-kecilan saya dengan teman-teman Facebook saya. Seharusnya, ini bisa jadi modal untuk penyediaan datacenter yang lebih terpadu. Berapa, sih, biaya untuk membangun satu infrastruktur kecil untuk menyokong datacenter?
  • Infrastruktur: Sebagian besar (semua) pemain Indonesia yang menyediakan infrastruktur awan tidak menawarkan teknologi DevOps, tetapi teknologi kuno yang sulit untuk menerapkan Sistem Integrasi Berkesinambungan dan Infrastruktur Sebagai Kode.
  • Standarisasi: Baik AS (fedRAMP) mau pun Singapura (MTCS) memiliki standarisasi infrastruktur awan. Di Indonesia apa, ya?

Sejauh mana Indonesia mengantisipasi DevOps? Saya tahu Pak Utian sedang membangun pasukan OpenStack. Semoga pemerintah lebih aktif lagi mendorong infrastruktur TIK di Indonesia. Menghapus peraturan-peraturan non-UU yang konyol. Jangan sampai “produk Indonesia, dikode oleh perusahaan India, dan dipublikasikan di AWS Singapura.”***

Bisa, ‘kah, 99,9% produk Indonesia?

Sebelum Anda menuduh saya juga berpangku tangan. Tadinya, sih, saya mau menulis tentang Gradle dan teknologi terbaru lainnya. Tetapi, komentar yang saya terima hanya komentar SPAM dan SEO. Di blog tanpa iklan, bisa diambil langsung RSS-nya, dan bisa diaktifkan tanpa Javascript dan Cookies begini masih saja dibegitukan. Malas, ah, jadinya.

Lagi pula, saya juga termasuk yang masih aliran Stallmanisme, termasuk yang masih anti awan (agak murtad, sih). Tapi, kenyataan pahit. Mau tak mau, kita harus belajar terbang di awan. Ha… ha… ha….

 

***Saya bukannya anti globalisasi, tapi setidaknya Indonesia juga menjadi produsen dalam beberapa hal sehingga seimbanglah neracanya.

MariaDB + Galera Cluster + HAProxy untuk Basisdata Lebih Handal

MariaDB + Galera Cluster + HAProxy untuk Basisdata Lebih Handal

HA Proxy Galera

HA Proxy encapsulate a Galera cluster for High-Availability solution.

Ada banyak aplikasi PHP di luar sana yang secara naas belum bisa pindah dari MySQL ke PostgreSQL. Aplikasi seperti WordPress dan Magento. Untuk aplikasi-aplikasi kritikal tersebut, diperlukan adanya redundansi untuk menjamin data. Untungnya, sekarang sudah ada produk Galera Cluster yang bisa mencapai itu. Produk ini menjadikan serangkaian MySQL Server untuk memiliki replikasi data yang sama.

Eh, tapi kayaknya kalau nanti PHP7 sudah resmi, mereka bakal dipaksa menggunakan ADODB, deh. Abstraksi ADODB memungkinkan SQL yang portabel. Hmm… sepertinya alasan ini nantinya bakal tidak ada.

Atau, mungkin Anda tertarik mengetahui bagaimana layanan MySQL Object (DBaaS) pada AWS dibuat? Atau, bagaimana layanan DBaaS pada OpenStack dibuat?

Ah, sudahlah, apa pun alasan supaya artikel ini ditulis supaya menjaga semangat ngeblog. Sejujurnya, saya menulis tutorial ini karena mood lagi naik akibat mendapatkan banyak Pokémon unik tadi siang di Perpustakaan Pusat UI.

Konfigurasi Peladen

Supaya tidak pusing, saya jelaskan dalam contoh kali ini ada 4 peladen. Satu peladen untuk HAProxy (harusnya dua, tapi saya malas). Lalu, tiga peladen menjadi peladen MySQL. Saya memilih untuk menggunakan MariaDB karena gratis dan mudah konfigurasi Galera-nya.

Peladen HAPROXY (selanjutnya dalam artikel akan saya sebut HAProxy)

  • IP 1: 192.168.1.12
  • IP 2: 192.168.101.1

IP 1 adalah IP eksternal yang digunakan untuk berhubungan dengan aplikasi. IP 2 adalah IP internal dalam jaringan lokal basisdata. Perhatikan baik-baik! Implementasi pusat data yang baik seharusnya memisahkan antara jaringan aplikasi, jaringan basisdata, jaringan administrasi, dan jaringan lainnya. Walau pun keempat peladen ini dijalankan pada VirtualBox sekalipun, tetap saya pisahkan untuk menunjukkan arsitektur yang benar.

Ada tiga peladen yang akan digunakan sebagai peladen basisdata. Saya akan namakan MariaDB1 (192.168.101.10), MariaDB2 (192.168.101.11), dan MariaDB3 (192.168.101.12). Walau pun nantinya setiap peladen bisa ditulisi, saya akan menggunakan peladen MariaDB1 sebagai awalan.

Berhubung saya malas, saya akan kurang detail menjelaskan. Silakan tinggalkan komentar bila kurang jelas. Saya menggunakan Debian Jessie sebagai sistem operasi dasar. Lalu, saya memilih menggunakan MariaDB 10.1 karena dia sudah mendukung langsung Galera Cluster.

Memasang MariaDB

Lakukan ini pada setiap peladen MariaDB: MariaDB1, MariaDB2, dan MariaDB3. Pokoknya, identik!

Memasang Peladen MariaDB

Aktifkan repositori MariaDB. Sebagai contoh dengan menggunakan Perkakas Konfigurasi Repositori kali ini saya ambil cermin Biznet karena yang sebelumnya Kartolo. Buatlah berkas /etc/apt/sources.list.d/mariadb.list yang berisi:

# MariaDB 10.1 repository list - created 2016-07-22 08:52 UTC
# http://downloads.mariadb.org/mariadb/repositories/
deb [arch=amd64,i386] http://mariadb.biz.net.id/repo/10.1/debian jessie main
deb-src http://mariadb.biz.net.id/repo/10.1/debian jessie main

Atau cara lainnya:

sudo apt-get install software-properties-common
sudo add-apt-repository 'deb [arch=amd64,i386] http://mariadb.biz.net.id/repo/10.1/debian jessie main'

Setelah itu, impor kunci publik repositori MariaDB:

sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 0xcbcb082a1bb943db

MariaDB versi 10.1 sudah memasang Galera secara baku. Jadi, perintah pemasangan menjadi lebih mudah, cukup:

sudo apt-get install mariadb-server

Setelah itu, matikan layanan MariaDB:

sudo systemctl stop mysql

Atau, kalau Anda nyentrik atau punya alasan idealisme lainnya sehingga tidak menggunakan SystemD:

sudo service mysql stop

Setelah ini, konfigurasi Galera.

Berkas yang Identik

Debian Jessie menggunakan konfigurasi /etc/mysql/debian.cnf untuk menyediakan pengguna internalnya. Pengguna internal ini yang digunakan oleh Debian dalam mengonfigurasi peladen MySQL. Salin berkas tersebut dari MariaDB1 ke MariaDB2 dan MariaDB3 sehingga ketiganya memiliki /etc/mysql/debian.cnf yang identik.

Hanya berkas ini yang tidak identik karena dibuat secara otomatis oleh Debian pada saat pemasangan. Tetapi, kita perlu ketiga peladen memiliki konfigurasi yang identik. Itu sebabnya, satu berkas yang berbeda ini yang perlu disamakan.

Buat Konfigurasi untuk Kluster Galera

Pada ketiga peladen (MariaDB1, MariaDB2, MariaDB3) buat konfigurasi /etc/mysql/conf.d/galera.cnf

[mysqld]
#mysql settings
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_doublewrite=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0

#galera settings
wsrep_on=ON
wsrep_provider=/usr/lib/galera/libgalera_smm.so
wsrep_cluster_name="apakek_cluster"
wsrep_cluster_address=gcomm://192.168.101.10,192.168.101.11,192.168.101.12
wsrep_sst_method=rsync

Silakan ganti nama berkas galera.cnf dengan nama lain kalau Anda mau. Silakan ganti “apakek_cluster” sesuai selera Anda untuk mendapatkan nama kluster yang jauh lebih baik.

Aktifkan Salah Satu Peladen Terlebih Dahulu

Lakukan langkah ini di salah satu peladen yang akan dimulai pertama kali. Bisa jadi karena pemasangan baru seperti saat ini. Atau, bisa jadi ada mati lampu sehingga menyebabkan seluruh kluster mati. Atau, laptop Anda baru dinyalakan kembali. Intinya, lakukan langkah ini pada saat tidak ada satu pun peladen yang menyala dan kluster ini baru mau dinyalakan dulu.

Bila pada kasus mati lampu atau peladen mati mendadak (crash), periksa berkas /var/lib/mysql/grastate.dat pada masing-masing peladen untuk memilih mana peladen dengan data terbaru. Sehingga, peladen tersebutlah yang dimulai pertama kali.

Bila Anda menggunakan SystemD, gunakan skrip ini:

sudo /usr/bin/galera_new_cluster

Atau, demi alasan idealisme atau apa pun sehingga Anda membuang SystemD dan menggunakan sistem init lainnya:

sudo service mysql start --wsrep-new-cluster

Pada saat ini seharusnya sudah berjalan:

$ sudo mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 1            |
+--------------+

Kalau 0, berarti Anda ada salah konfigurasi di suatu tempat.

Jalankan Peladen MariaDB Sisanya

Pada dua peladen sisanya, MariaDB dijalankan dengan cara normal:

sudo systemctl start mysql

Atau

sudo service mysql start

Seharusnya, apabila tidak ada kerusakan, pada akhirnya akan ada tiga peladen.

$ sudo mysql --defaults-file=/etc/mysql/debian.cnf -e 'SELECT VARIABLE_VALUE as "cluster size" FROM INFORMATION_SCHEMA.GLOBAL_STATUS WHERE VARIABLE_NAME="wsrep_cluster_size"'
+--------------+
| cluster size |
+--------------+
| 3            |
+--------------+

Sampai saat ini, Galera sudah selesai dibuat. Anda lakukan operasi SQL pada salah satu peladen mana pun hasilnya akan sama.

BONUS TUGAS

Terakhir, untuk tugas. Silakan buat satu pengguna Admin Super yang bisa membuat basis data dan penggunanya. Pengguna ini harus bisa mengakses dari luar.

Konfigurasi HAProxy

Pada salah satu peladen MariaDB (MariaDB1/MariaDB2/MariaDB3), buat sebuah pengguna HAProxy di basisdata. Pengguna ini akan mengkueri basisdata untuk mengecek keberlangsungan masing-masing peladen.

sudo mysql --defaults-file=/etc/mysql/debian.cnf -e "CREATE USER 'haproxy'@'192.168.101.1'"

Ganti nama pengguna haproxy dengan sesuatu yang lebih kreatif. Demi keamanan, jangan cuma copas saja di sini!

Lalu, masuk pada peladen HAProxy dan pasang HAProxy di sana:

sudo apt-get install haproxy

Lalu, buat konfigurasi HAProxy. Caranya, tambahkan baris-baris ini pada berkas konfigurasi /etc/haproxy/haproxy.cfg

# Load Balancing for Galera Cluster
listen galera 192.168.1.12:3306
     balance source
     mode tcp
     option tcpka
     option mysql-check user haproxy
     server node1 192.168.101.10:3306 check weight 1
     server node2 192.168.101.11:3306 check weight 1
     server node2 192.168.101.12:3306 check weight 1

Ganti nama pengguna haproxy dengan sesuatu yang lebih kreatif. Demi keamanan, jangan cuma copas saja di sini!

Lalu, jalankan ulang HAProxy. (Pada titik ini saya sudah malas membuat dua versi)

sudo service haproxy restart

Selesai.

Optimasi

Bonus untuk landasan pemikiran. Berikut arsitektur-arsitektur alternatif yang bisa dibuat untuk memenuhi kebutuhan.

  1. Ganti HAProxy dengan perangkat keras router atau load-balancer.
  2. Pasang HAProxy pada setiap peladen aplikasi agar menghilangkan bottleneck jaringan. Jadi, hubungan antara aplikasi dan basisdata menjadi M:N. Kalau pakai ini, HAProxy lebih baik bind ke localhost jangan ke IP. Jadi, akses per aplikasi langsung ke localhost. Ini pondasi arsitektur layanan mikro (microservice architecture).
    HAProxy per apps

    HAProxy per apps

  3. Partisi peladen-peladen aplikasi untuk mengakses hanya salah peladen dalam kluster.
  4. Tambah jumlah peladen dalam kluster.

Jumlah kluster 3 itu adalah demi memenuhi konsep kuorum.

Optimasi Lebih Lanjut yang Belum Sempat Ditulis Karena Saya Ingin Mencari Pokémon Lagi Riset Lebih Lanjut

Ada riset lanjutan yang dapat membuat arsitektur aplikasi lebih terskalakan. Yakni, membuat sebuah peladen obyek penyimpan (storage object) semacam Amazon S3 dengan menggunakan OpenStack Swift dengan menggunakan CEPH. Atau, implementasi sederhana dengan GlusterFS atau NFS. Silakan kembangkan lebih lanjut agar aplikasi Anda lebih terskalakan.

Gunakan Puppet, Ansible, Chef, atau konfigurator apa pun yang lebih baik. Kalau arsitektur sudah skala besar seperti ini, mengubah peladen satu persatu itu sudah mustahil bila tanpa ada kesalahan. Buat tutorial ini menjadi cookbook/rule yang bisa secara dinamis di-deploy.

Semoga bermanfaat.

Bacaan Lebih Lanjut

Pokémon GO

Pokémon GO

Pokémon GO adalah sebuah permainan baru yang memiliki fitur AR (Augmented Reality). Teknologi AR ini memberikan efek bahwa lingkungan sekitar kita ada hal-hal yang lain. Dalam hal ini, ada Pokémon yang sedang bermain di atas meja contohnya.

Setidaknya di UI banyak orang berkumpul bermain permainan ini. Tempat yang paling sering dikunjungi adalah Perpustakaan UI, terutama yang mendekati danau. Kalau waktu malam, Parkiran FIB, Halte Sepeda Fasilkom, dan Perpustakaan UI.

Pokémon GO dikembangkan oleh Niantic, perusahaan yang mengembangkan permainan serupa, INGRESS. Data spasial Pokémon GO ini memang diambil dari INGRESS. Jangan heran oleh sebab itu di Indonesia banyak situs yang bisa dikunjungi untuk mendapatkan Pokémon langka. Bahkan, kalau mau lebih lanjut, kita bisa menebak Pokémon langka dari permainan INGRESS.

Demikian. Mengenai isu privasi dan dampak sosial, saya akan tuliskan lebih lanjut apabila kemalasan menghilang. Sekian.

Dao Modularitas: Contoh Kasus Penggunaan Modul Untuk Decoupling Dengan Gradle

Dao Modularitas: Contoh Kasus Penggunaan Modul Untuk Decoupling Dengan Gradle

Mari gunakan hasil karya terdahulu yang sudah modular.

wget https://github.com/jpmrblood/percuma/archive/v2.zip -qO- | jar xvf /dev/stdin && cd percuma-2

Saat ini saya akan menggunakan metode decoupling berdasarkan tujuan (goal-based) versi yang telah disederhanakan. Tentu tidak akan serumit reverse engineering pada tulisan saya. Tulisan (Yu et al., 2005, 363--372) yang saya bahas itu rasanya terlalu rumit untuk dikembangkan di tulisan ini. Oke, sejujurnya saya juga sedang malas menggambar diagram.

Saya mengambil teknik Extract Method dari (Martin Fowler, 1999, 89--91) yang digunakan di awal metodologi itu. Agar sederhana, saya modifikasi metodologi agar menerjemahkan menjadi cerita (user story), bukan notasi ilmiah.

Contoh Metodologi Reverse Engineering Goal Based of JP, Abridge Version

Mari lihat kembali kelas yang telah dibuat sebelumnya.

package aja.jp.percuma;
 
class TestMain {
  public static void main (String ... args) {
    java.util.logging.Logger.getLogger(TestMain.class.getName()).info("Hello, world!");
  }
}

Apa yang dilakukan? Mari kita ceritakan dalam kalimat cerita:

Program ini mencetak ke terminal tulisan “Hello, world!”.

Dari cerita ini, ternyata ada dua tujuan yang terlihat jelas:

  1. Mencetak ke terminal.
  2. Tulisan “Hello, world!”.

Mencetak ke terminal (1) adalah sebuah tujuan yang bisa dibuat umum. Ada banyak hal yang bisa dilakukan dengan fungsi (1) ini. Fungsi ini bisa diekstraksi dan dijadikan sebuah fungsi terpisah agar bisa dimanfaatkan yang lainnya. Maka direkomendasikan agar (1) dijadikan fungsi terpisah.

Tulisan “Hello, world!” (2) adalah sebuah tujuan yang spesifik. Dia tidak bisa dipakai untuk yang lain. Maka, direkomendasikan untuk tetap untuk di sana.

Wow, Kisanak mungkin berpikir. Gampang juga, yah. Ternyata hanya begitu saja!

Kisanak salah! Ilmu ini masih versi disederhanakan (abridge version). Mari saya bukakan sedikit tentang tujuan tersirat (soft goal). Pada metodologi Reverse Engineering Goal Based of JP, salah satu yang diperhitungkan adalah tujuan tersirat (soft goal)!

Ada banyak tujuan tersirat yang kalau pada bahasa SDLC disebut sebagai non-functional requirement. Seandainya proyek ini ditentukan tujuannya (bahasa lainnya: Scrum Goal, non-functional requirement pada Waterfall, dan lain sebagainya tergantung paguyuban tempat Kisanak berguru). Pada iterasi selanjutnya, (2) dapat dikembangkan lebih lanjut, misalnya dengan menambahkan tujuan tersirat:

  1. Ingin menyapa bukan hanya dunia. Nama yang hendak disapa dapat diperoleh melalui STDIN (nama kerennya terminal). Rekomendasi: dibuatkan sebuah variabel dengan nilai baku “Hello, %s!”. Lalu, tangkap nama melalui STDIN. Masukkan nama ke senarai yang telah dibuat itu. Terakhir, cetak.
  2. Ingin agar ini dapat dimengerti hampir semua orang. Rekomendasi: dibuatkan variabel berisi “Hello” yang dianotasi dengan i18n. Gunakan framework lokalisasi.

Jangan lupa, bahwa bahkan pengumpulan kebutuhan dapat diiterasikan agar lebih jelas. Contohnya untuk tujuan tersirat (1). Diiterasikan kembali bahwa keamanan merupakan fitur utama. Tujuan tersirat (1), ditambahkan fungsi pengecekan Regex sebagai validasi sebelum memroses (1.1). Agar menarik, maka dibuatkan pemformat yang dapat menghasilkan keluaran yang cantik ke terminal (1.2).

Kisanak tentu bertanya, bagaimana cara menentukan tujuan tersirat ini? Sampai sedalam mana iterasi ini? Bisa jadi aplikasi menjadi besar dan bahkan untuk fungsi sederhana menjadi sulit. Itu sebabnya, biasanya tujuan tersirat biasanya dibuat di awal proyek dan berlaku global atau setidaknya dalam sebuah cakupan submodul. Beberapa perguruan silat membuat itu menjadi standar baku. Inilah yang dimaksud dengan Design Pattern bukan hanya berbicara kode, tetapi standar baku di sebuah perusahaan.

Astaga, sampai mana saya tadi?

Oh, iya, intinya, sudah saya jelaskan bahwa fungsi menulis ke terminal bisa diekstraksi ke fungsi lainnya. Karena dia bisa dipakai untuk yang lain, maka dia bisa dijadikan sebuah modul tersendiri. Pada proses penentuan modul, Kisanak dapat bisa mengenali apakah fungsi cetak ke terminal ini dijadikan proyek tersendiri sehingga bisa dimanfaatkan oleh proyek-proyek yang lainnya. Apalagi, dia tidak sesuai dengan tujuan proyek ini, membuat aplikasi percuma/sia-sia. Dia sudah sangat berguna sehingga tidak masuk lagi hitungan. Ha… ha… ha….

Mari Implementasikan ke Gradle

Setelah makanan bagi jiwa, sekarang saatnya ke Gradle. Pada direktori dasar proyek, mari buat submodul:

mkdir percuma-libs

Seperti biasa, masukkan percuma-libs ke proyek utama.

echo "include 'percuma-libs'" >> settings.gradle

Kalau benar, maka akan muncul sebagai submodul proyek percuma.

$ ./gradlew -q projects

------------------------------------------------------------
Root project
------------------------------------------------------------

Root project 'percuma'
+--- Project ':percuma-app'
\--- Project ':percuma-libs'

To see a list of the tasks of a project, run gradlew <project-path>:tasks
For example, try running gradlew :percuma-app:tasks

Buat konfigurasi untuk mengompilasi percuma-libs.

cat >> percuma-libs/build.gradle << EOF
apply plugin: 'java'
EOF

Sekarang, mari buat sebuah kelas Java.

mkdir -p percuma-libs/src/main/java/aja/jp/percuma/lib
cat >> percuma-libs/src/main/java/aja/jp/percuma/lib/PrintLib.java << EOF 
package aja.jp.percuma.lib;

public class PrintLib {
  public void log(Object o, String m) {
    java.util.logging.Logger.getLogger(o.getClass().getName()).info(m);
  }
}
EOF

Setelah membuat submodul ini, mari tambahkan submodul percuma-libs sebagai salah satu pustaka yang dibutuhkan oleh percuma-apps.

cat >> percuma-apps/build.gradle << EOF
dependencies {
  compile project(':percuma-libs')
}
EOF

Mari ubah kelas TestMain untuk menggunakan pustaka yang sudah kita masukkan. Ubah baris:

java.util.logging.Logger.getLogger(TestMain.class.getName()).info("Hello, world!");

menjadi:

new aja.jp.percuma.lib.PrintLib().log(new TestMain(),"Hello, world!");

Atau kalau dari terminal:

sed -i.bak "/java.util.logging.Logger/c\    new aja.jp.percuma.lib.PrintLib().log(new TestMain(),\"Hello, world\!\");" percuma-app/src/main/java/aja/jp/percuma/TestMain.java

Selesai sudah.

Judul Cuma untuk Pembatas Saja dan Saya Bingung Apa Namanya Karena Artikel Ini Bukan Artikel Terakhir Karena Entah Mengapa Kalau Saya Beri Nama Penutup Artikel Selanjutnya Tidak Pernah Jadi

Sampai sini, Kisanak bisa langsung menjalankan “./gradlew run” seperti biasa. Seharusnya, sih, keluarannya sama.

Sampai sini saya juga berpikir, apakah saya perlu mengubah gaya menulis saya? Saya biasanya menggunakan frasa, “silakan gunakan penyunting kesukaan Anda.” Kali ini saya paksakan semua kita menggunakan penyunting saya, terminal GNU/Linux.

Semuanya bisa langsung dicobakan di terminal pada sistem operasi GNU/Linux. Mohon beritahu saya kalau ada yang tidak jalan.

Selanjutnya

Kisanak berpikir setelah menguasai modularitas dengan Gradle dan metodologi cetek Reverse Engineering of JP, Abridge Version, Kisanak merasa sudah elit?

Sayang sekali, Kisanak. Kalau Kisanak sadar, cara penamaan paket saya kacau! Mana benar itu penulisan “aja.jp.percuma”? Seharusnya “edu.ui.jp.percuma” sesuai dengan organisasi yang jam kerjanya saya ambil untuk menulis ini atau “jp.percuma” karena “aja” bukanlah top level domain yang lazim. Pokoknya, konvensi penamaan ini penting.

Ah, Pak JP, apakah ada yang perlu saya pelajari? Mohon ajari, bila berkenan.

Saya suka sikap Kisanak! Nama paket akan sangat berpengaruh terhadap Artifak. Artifak adalah obyek-obyek hasil kultivasi yang banyak dipakai orang. Misalnya, menggunakan Maven dalam POM yang ada di JCenter atau Maven Repository.

Tergantung mood saya, saya akan membahas cara membuat peladen artifak lokal (bonus kalau saya lagi mood) dan  membuat artifak dengan Gradle dan mengimpor artifak dengan Gradle. Atau, mungkin hanya di sekitar artifak saja. Entahlah…. Film apa yang bagus untuk mood saya, ya?

Daftar Pustaka

Martin Fowler (1999). Refactoring: Improving the Design of Existing Code. Boston: Addison-Wesley Professional. doi: 0201485672 9780201485677. Retrieved from Addison-Wesley Professional: www.worldcat.org/isbn/0201485672.^
Yu, Yijun and Wang, Yiqiao and Mylopoulos, J. and Liaskos, S. and Lapouchnian, A. and Leite (2005, August). Reverse engineering goal models from legacy code 13th IEEE International Conference on Requirements Engineering (RE'05), [NO VOLUME]([NO ISSUE]), 363--372. doi: 10.1109/RE.2005.61.^
Membuat Sub Modul pada Gradle Sebagai Lanjutan Tulisan Iseng Kemarin Karena Mood Saya Enak Setelah Puas Menonton Warcraft Kemarin

Membuat Sub Modul pada Gradle Sebagai Lanjutan Tulisan Iseng Kemarin Karena Mood Saya Enak Setelah Puas Menonton Warcraft Kemarin

Kisanak pikir setelah mengerti jurus Kunyuk Melempar Pisang, Kisanak sudah bisa menguasai dunia persilatan? Kisanak harus mawas diri dan mengerti bahwa di atas langit masih ada langit lagi. Jurus itu mungkin bisa membuat Anda selamat di dunia persilatan. Camkan ini:

Di atas langit masih ada langit; ilmu yang dikuasai hanyalah setitik dari samudera.

Ketika aplikasi yang dibuat hanya sederhana, ilmu jurus Kunyuk Melempar Pisang sudah cukup. Masalah baru ketahuan setelah Kisanak naik level dengan aplikasi yang besar dan kompleksitas tinggi. Niscaya Kisanak akan menemukan bahwa Kisanak hanyalah jawara kampung.

Untuk dapat merajai dunia persilatan, ada konsep lain yang Kisanak mesti pahami: modularitas.

Kisanak harus bisa memilah. Mana yang kekhususannya untuk menghadapi basisdata. Mana yang kekhususannya menampilkan dan memroses laman web. Mana kekhususannya mengurusi logaritma. Dan berbagai kekhususan lainnya. Dengan memahami kekhususan ini, Kisanak bisa melakukan dua konsep ini: reuse dan melacak ketergantungan.

Reuse, adalah konsep sakral pemrograman. Seperti pemeo berkata, “do not invent the wheels.” Kode yang baik adalah yang bisa memisahkan dengan baik fungsi-fungsi dalam berkas/proyek terpisah sehingga dapat dimanfaatkan oleh banyak pihak. Proses untuk mengubah dari kode yang kompleks dan rumit menjadi terpecah-pecah dan modular ini disebut proses decoupling.

Decoupling adalah sebuah Dao yang mendalam. Banyak yang berusaha menemukan misteri dibaliknya. Sedikit yang dapat menguasai Dao ini. Mereka yang telah mencapai pencerahan, merekalah sesungguhnya yang merajai dunia persilatan!

Di dunia persilatan, ada beberapa ilmu kanuragan untuk decoupling. Ada yang memiliki karma tinggi sehingga bisa mampu menguasai level tinggi menggunakan ilmu Pemrograman Dinamis (Dynamic Programming), ilmu Kalkulus Lambda (Lambda Programming), dan lain-lain. Banyak juga orang yang tergabung dalam sekte-sekte yang memiliki repositori Dao mendalam. Mereka ini banyak mengkultivasi ilmu Design Pattern. Pernah ada legenda bahwa sebuah ilmu ilmu legendaris yang sepertinya hilang ditelan bumi seperti KAOS bisa menguasai penuh Dao ini.

Sayangnya, untuk orang-orang biasa, yang paling banyak dikultivasi orang adalah variasi ilmu Tebak-tebak Berhadiah. Ilmu ini mudah dikuasai, namun ia takkan mampu memberikan pencerahan sampai menguasai seluruh Dao. Itu sebabnya, bagi orang-orang kebanyakan, mukadimah ini semua tidak berguna.

Mereka akan mengira bahwa apa yang ditulis ini hanyalah mengisi luang supaya entri ini banyak. Camkanlah satu rahasia langit ini, Kisanak: tutorial ini hanyalah gerbang menuju Dao decoupling. Yang perlu dipahami selanjutnya adalah melatih pikiran.

Melatih jiwa, melatih raga. Melatih roh, melatih kode. Lepas dari Samsara, lepas dari debug tak berakhir.

Pindah ke Gradle Modular

Mari dapatkan proyek yang telah dibuat sebelumnya:

wget https://github.com/jpmrblood/percuma/archive/v1.zip -qO- | jar xvf /dev/stdin && cd percuma-1

Setelah masuk ke direktori proyek terdahulu, mari ubah menjadi modular.

Buat direktori untuk menjadi sebuah submodul dan pindahkan berkas build.gradle dan seluruh kode sumber.

mkdir percuma-app
mv build.gradle src percuma-app

Ingat, build.gradle adalah seperti Makefile. Isinya adalah aturan yang diperlukan untuk mengompilasi.

Selanjutnya, beritahu percuma bahwa dia memiliki submodul percuma-app.

echo "include 'percuma-app'" >> settings.gradle

Terakhir, tambahkan modul percuma-app sebagai syarat yang dibutuhkan oleh percuma.

cat >> build.gradle << EOF
apply plugin: 'java'

dependencies {
  compile ':percuma-app'
}
EOF

Karena kita mau mengompilasi proyek ini, maka jangan lupa tambahkan plugin java pada aturan Gradle. Secara otomatis Gradle akan menjalankan perintah-perintah yang dijalankan pada proyek utama pada submodulnya nanti. Kalau tidak percaya, silakan saja coba:

./gradlew -q run

Hasilnya harusnya sama, sih.