Membuat Long Table menggunakan Tabularx

Bagi yang pernah menggunakan Latex, pasti kebanyakan akan setuju bahwa bermain tabel di Latex adalah hal yang lumayan menantang. Karenanya saya sendiri ketika membuat tabel di Latex saya paling sering menggunakan package Tabularx. Kenapa? karena menurut saya Tabularx itu punya kelebihan dalam mudahnya mengontrol ukuran kolom dibanding Tabular biasa (fitur yang paling sering saya gunakan). Sayangnya, di balik kelebihan selalu ada kekurangan. Salah satunya adalah belum support untuk membuat long table.

Apa itu Long Table?

Long table adalah istilah untuk membuat tabel yang panjangnya lebih dari satu halaman. Beberapa karakteristik dari long table adalah:

  1. panjangnya lebih dari satu halaman,
  2. nomor tabelnya masih sama,
  3. kontennya masih berlanjut,
  4. bisa punya caption sendiri (biasanya berupa “lanjutan”),
  5. tidak terindeks di daftar isi.

Sebenarnya Long Table sendiri ada Package tersendiri, tapi karena saya tidak mau rumit-rumit mempelajari package baru, saya coba untuk meng-“hack” Tabularx sehingga bisa menjadi long table. Saya sebut ini “hack” karena kita akan tetap menggunakan Tabularx hanya saja kita akan buat agar hasilnya seakan-akan menggunakan long table. Idenya sederhana, kita buat dua tabel dengan bentuk yang mirip, lalu kita atur agar memenuhi kriteria long tabel.

Langkah-langkahnya:

  • Buat terlebih dahulu dua tabel dengan bentuk yang sama. Pastikan tabel kedua pada halaman selanjutnya. Hal ini bisa dengan menggunakan perintah `\newpage`.
\begin{table}[H]
\caption{Table 1}
\begin{tabularx}{6.25in}{}
...
\end{tabularx}
\end{table}

\newpage

\begin{table}[H]
\caption{Table 2}
\begin{tabularx}{6.25in}{}
...
\end{tabularx}
\end{table}
  • Selanjutnya, atur penomoran tabel kedua agar memiliki nomor yang sama dengan tabel pertama. Caranya dengan menambahkan `\addtocounter`  sebelum mendefinsikan tabel kedua, dan beri nilai -1 sehingga penomoran seharusnya dikurang satu.
...
\addtocounter{table}{-1}
\begin{table}[H]
\caption{Table 2}
...
  • Terakhir, pastikan tabel kedua tidak muncul di daftar isi dengan cara memberi kurung siku pada bagian `\caption`
...
\caption[]{Table 2}
...

Dan selesai… Jika dicompile maka akan tampak tabel akan tampil lebih dari satu halaman dengan kriteria long table yang telah disebutkan sebelumnya.

Tentu saja ini tidak sempurna, salah satu kekurangannya adalah kita masih belum bisa memenuhi poin ketiga dari kriteria Long Table, yakni konten tidak dapat berlanjut secara otomatis. Kita harus secara manual memisahkan mana bagian yang masuk tabel pertama, mana yang masuk tabel kedua. Ya setidaknya hasilnya sudah lumayan mirip dengan Long Table kan? ๐Ÿ˜‰

image from: https://www.potterybarn.com/

asynchronous flask

Membuat Asynchronous Flask App dengan Gunicorn-Gevent

Salah satu masalah yang pernah saya hadapi ketika mencoba mengaplikasikan model machine learning ke produksi adalah model biasanya memerlukan beberapa waktu untuk melakukan perhitungan dan memberikan hasil.

Misalnya kita punya machine learning API untuk mengklasifikasi citra, dan butuh waktu kira-kira 2 detik untuk menghasilkan kelas yang sesuai (memprediksi), bisa dibayangkan apa yang terjadi jika kita letakkan itu di level produksi dengan 1000 permintaan prediksi perdetiknya! Yang ada server akan lambat sekali, user harus mengantri sangat lama untuk mendapatkan hasil prediksinya.

Asynchronous API

Solusi sederhana yang muncul di saya adalah membuat Asynchronous API. Apa itu? Penjelasan sederhananya bisa merujuk keย halaman stackoverflow ini: Bayangkan kamu sedang memasak di restoran, dan ada dua pesanan datang, yang satu memesan telur yang satu memesan roti.

  • Synchronous: kamu memasak telur, setelah itu kamu memasak roti
  • Asynchronous, single threaded: kamu mulai memasak telur, lalu sambil menunggu matang kamu mulai memasak roti. Ketika keduanya sedang menunggu matang kamu bisa mulai membersihkan dapur, dan keduanya akan matang dalam waktu yang hampir bersamaan.
  • Asynchronous, multithreaded: kamu mempekerjakan satu lagi orang untuk membantu memasak. Sekarang, satu orang bisa fokus memasak telur dan satu yang lain fokus memasak roti. Masalahnya sekarang kamu harus bisa mengkoordinirnya dengan baik agar tidak berebut alat dapur.

Nah, karenanya kita akan mencoba membuat Flask API yang Asynchronous, sehingga proses pengerjaan bisa dilakukan dalam waktu hampir bersamaan. (Penjelasan lain : dari codewala)

Membuat Flask API

Ada banyak cara untuk mengimplementasikan Asynchronous API. Tapi karena saya membuat API menggunakan Python Flask. Salah satu cara yang paling simpel adalah menggunakanย  Gunicorn dan Gevent. Pertama-tama instal terlebih dahulu Gunicorn dan Gevent, cara yang sederhana adalah menggunakan pip:

pip install gunicorn
pip install gevent

Normalnya jika kita akan menjalankan aplikasi Flask, kita melakukannya cukup dengan menjalankan perintah Python pada umumnya:

python myapp.py

Tetapi untuk menjalankannya menggunakan Gunicorn kita akan menjalankan program tersebut dengan perintah yang berbeda, yakni:

gunicorn myapp:app

`myapp` adalah nama file program kita, and `app` adalah flask app variable. Setelah perintah tersebut dijalankan, program akan berjalan di http://localhost:8000 (perhatikan pada perbedaan port program berjalan, jika menggunakan Flask, program akan berjalan pada port 5000, sedangkan jika menggunakan Gunicorn program berjalan pada port 8000).

Tapi ini belum selesai, jika hanya menjalankan dengan perintah di atas, maka program hanya akan berjalan synchronous. Untuk menjalankan secara asynchronous dengan Gunicorn kita tidak perlu mengubah isi dari program, cukup dengan menjalankan perintah berikut ini:

gunicorn -k gevent -w 5 myapp:app

-k adalah opsi untuk menjalankan Gunicorn secara asynchronous, di sana kita akan menggunakan gevent service (ada beberapa services yang bisa digunakan untuk menjalankan secara asynchronous, contoh lainnya adalah eventlet). -w adalah opsi untuk menentukan berapa banyak worker yang akan digunakan untuk menjalankan program tersebut. Pada contoh ini kita menggunakan 5 worker (Penentuan jumlah worker, silakan baca: Workers).

Dan selamat! kita baru saja menjalankan program Flask kita secara asynchronous!

Apache Benchmark Testing

Untuk menguji API yang telah kita jalankan, yang paling sederhana kita bisa menggunakan apache benchmark. Dengan apache benchmark kita bisa melakukan simulasi pengaksesan ke API kita dengan banyak request secara simultan, perintahnya adalah berikut:

ab -n 200 -c 100 http://localhost:8000/myapp

-n menunjukkan banyak request yang akan dikirimkan, dan -c adalah banyaknya concurency, atau request dalam satu waktu. Jika diperhatikan hasilnya akan tampak perbedaan ketika program dijalankan dengan Async dan tanpa Async.

Tapi perintah di atas, hanya untuk menjalankan GET request, artinya untku API machine learning, perinta di atas hanya menguji dalam mengaksesnya tidak untuk memprediksi. Untuk program machine learning, kita bisa melampirkan data “test” untuk mengujinya.

Misalnya API machine learning untuk proses sentimen movie review, kita bisa melampirkan data teks contoh untuk diprediksi. Pertama-tama Kita buat dulu datanya dengan format sesuai API yang telah dibuat (tidak ditunjukkan pada tutorial ini):

{"text":"film yg menarik, walau kesannya terlalu lamban dan cerita 
         yang panjang, tetapi dengan alur cerita yang menarik, membuat
         kita terus penasaran, dan membuat saya tidak ngantuk"}

Setelah itu, simpan data tersebut pada sebuah file misalnya “tester.txt”. Nah untuk melampirkannya cukup kita tambahka tipe body dan nama file di perintah sebelumnya:

ab -n 200 -c 100 http://localhost:8000/myapp -p tester.txt -T application/json

Maka API akan diuji untuk memprediksi data tersebut, dan kita dapat memperhitungkan waktu prosesnya.

Terima kasih ๐Ÿ™‚ semoga bermanfaat

A* algorithm for puzzle

A* Algorithm in Python to solve 8 puzzle problem

My team got this as A* algorithm assignment in Artificial Intelligence class few years ago taught by Mrs. Afiahayati, Ph.D. We should create an implementation of A* algorithm (read: “A” Star) to solve 8 puzzle problem. This puzzle problem is the small version of 15 sliding puzzle game.

A* Algorithm

In my opinion A* Algorithm (read more about it here) is looks like combination of Breadth First Search (BFS) and Depth First Search (DFS) algorithm (or maybe Dijkstra’s too(?)). It’s using Heuristic scoring to estimate the step from vertex to goal so make the system may running faster, and like Dijkstra’s, it’s a complete search which always finding a best solution. Read this to get better explanation.

My team agreed to use Manhattan distance to estimate distance between the current state and the goal state (h) and count the number of step as exact cost (g).

Implementation

I wrote the code using Python. And after several hours coding I found python have a “magical” function that make easy to write ๐Ÿ™‚ My first implementation was not using any class at all and it made the code hard to read. After I saw this implementation, I realize that code is much prettier than mine, so I rewrite my code using Node class with similar class concept from that code.

See the complete source code on Github

cuda di ubuntu

Instalasi Cuda di Ubuntu 16.04: Part 2

Artikel ini adalah kelanjutan dari pengalaman instalasi Cuda di Ubuntu saya sebelumnya.

Setelah sadar NVIDIA drivernya belum terinstall akhirnya saya memulai proses instalasi driver NVIDIA.

7. Cara paling mudah yang saya temui, pertama-tama kita harus tahu terlebih dahulu versi VGA kita. Ini bisa diakses dengan mengetikkan lspci -vnn | grep '\[03' di terminal, sehingga terlihat code VGA kita, misal:

04:00.0 3D controller [0302]: NVIDIA Corporation GK208M [GeForce 920M] [10de:1299] (rev a1)

8. Setelah itu akses NVIDIA Driver Search, dan masukkan kode yang sesuai.

instalasi cuda di ubuntu : download driver

9. Klik Search, tapi Jangan klik download. Kenapa? karena data yang kita butuhkana adalah versi drivernya (dalam hal ini 367.44)

instalasi cuda di ubuntu : download driver 2

10. Itu artinya kita perlu mendownload nvidia versi 367, ini bisa dilakukan dengan ketikkan perintah pada terminal sudo apt-get install nvidia-367

11. Lalu reboot dan Alhamdulillah ๐Ÿ™‚ terinstallah NVIDIA Driver

12. Dan kalau kita lakukan pengecekan yang sama dengan post sebelumnya, untuk mengecek apakah proses instalasi Cuda di Ubuntu sudah kita lalui dengan baik. Maka erornya akan sudah tidak tampak, dan muncul pesan berikut:

...
deviceQuery, CUDA Driver = CUDART, CUDA Driver Version = 8.0, CUDA Runtime Version = 7.5, NumDevs = 1, Device0 = GeForce 920M
Result = PASS

Catatan Tambahan:
Jika saat melakukan perintah 4 versi tidak ditemukan *seperti pengalaman saya sebelumnya* maka kalian perlu update apt dengan menjalankan perintah-perintah berikut:

sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update

Referensi:

Instalasi Cuda di Ubuntu 16.04: Part 1

Kalau kalian sedang ingin belajar Deep Learning dan ingin mencoba utak-atik tensorflow, maka kalian pasti sadar kalau tensorflow tidak mau berjalan di Windows. Karenanya kali ini, mau sedikit lagi berbagi pengalaman langkah yang saya pakai untuk instalasi NVIDIA Cuda di Ubuntu.

Kalau mau langsung cepat, silakan baca bagian Referensi

Proses dan pengalaman

1. Awalnya saya ngiranya driver NVIDIA akan otomatis terinstall di Ubuntu 16.04 *kayaknya dikabarin sama siapa gitu, dan percaya-percaya saja* Karena kepercayaan itu langkah pertama yang saya lakukan adalah langsung download Cuda.

2. Setelah terdownload (cuda_7.5.18_linux.run) langsung run dengan perintah:

sudo sh cuda_7.5.18_linux.run --override

3. Nah, karena pas lagi install saya masih PeDe sudah ada nvidia drivernya akhirnya ketika ditawarin di menu installnya untuk instal nvidia driver saya ya jawab NO dan setelah itu proses instalasi tetap berjalan lancar dan berhasil.

4. Setelah berhasil terinstal, saya pingin coba cek apakah Cuda sudah berjalan dengan memainkan file sampel Cuda nya. Caranya tinggal tuju folder `home/user/NVIDIA_CUDA-7.5_Samples/1_Utilities/deviceQuery` Setelah itu, open terminal di lokasi tersebut dan run perintah `make` di terminal. Lalu jalankan program device query dengan perintah `./deviceQuery`.

5. Dan munculah tulisan seperti ini ๐Ÿ™

-> CUDA driver version is insufficient for CUDA runtime version
Result = FAIL

6. Error tersebut menyadarkan ada yang salah dengan NVIDIA drivernya. Setelah coba cek dengan beberapa cara untuk mengecek apakah NVIDIA driver sudah terinstall, dengan perintah dpkg -l | grep nvidia, ternyata driver NVIDIA nya memang belum terinstall dengan baik ๐Ÿ˜ karenanya saya langsung memulai proses instalasi NVIDIA Drivernya

–Bersambung di sini–

Referensi: