Pengamanan App Android

Ini dimulai dari rasa penasaran saya melihat tweet pengemudi Gojek yang mengatakan bahwa ada crack untuk app Gojek bagi pengemudi. Crack ini digunakan untuk melakukan mockup location tanpa terdeteksi dan memilih order yang disukai untuk memaksimalkan bonus (Gojek menggunakan sistem performa dan point untuk mentukan bonus).  Tentu ini ilegal dan sebenarnya merugikan pengemudi lain, perusahaan dan pengguna app. Sebagai developer, apa yang dapat saya lakukan untuk mencegah ini jika misalnya saya membuat app yang mirip?

Dari penelusuran saya (kesannya gimana, padahal cuma googling hehe). Ternyata memang ada tools untuk meng-crack app Gojek yang dibuat dengan XPosed framework. XPosed ini hanya bisa dijalankan pada Android yang sudah di-root dan memungkinkan injeksi code ke proses yang sedang berjalan. Artinya app kita bisa dimodifikasi saat sedang dijalankan (bukan APK-nya diedit). Sangat powerfull (sekaligus berbahaya juga).

Salah satu solusi dari developer untuk mencegah hal ini dengan mendeteksi apakah Android sudah di-root. Jika sudah di-root maka app dapat menolak untuk berjalan. Google ternyata menyediakan API untuk ini yang disebut Safetynet (https://developer.android.com/training/safetynet/)  Cara kerja Safetynet adalah memeriksa apakah system sudah dimodifikasi dengan cara dibandingkan dengan database yang disimpan Google.

Salah satu pengguna SafetyNet ini adalah dev PokemonGO. PokemonGO melarang device yang di-root karena sering digunakan untuk curang. Tapi disisi lain ini membuat banyak orang marah karena ada juga yang menggunakan Android yang sudah di-root tapi bermain Pokemon dengan jujur. Efeknya terjadi “perang” antara Google SafetyNet dengan dev yang ingin bermain Pokemon tapi tetap dengan device yang di-root.  Setelah bermain kucing-kucingan,  terakhir SafetyNet ini bisa dilewati dengan tools yang disebut Magisk dengan cara yang cukup kompleks (tapi entah sampai kapan sebelum Google membalas dengan mengupdate SafetyNet)

Kesimpulannya, sangat sulit untuk memastikan bahwa app kita 100% aman dan tidak dimodifikasi. Untuk kasus Gojek, sebaiknya mereka juga menggunakan teknik datamining untuk fraud detection yang jauh lebih sulit untuk diakali oleh pengemudi.

Struktur Perkuliahan

Berdasarkan kuliah-kuliah semester sebelumnya,  untuk matakuliah  yang besifat teknis (ada praktikum dan tugas besar), struktur rancangan perkuliahan yang ideal bagi saya adalah sebagai berikut:

Untuk setiap bab (sub materi):

  1. Materi disampaikan dalam bentuk slide, berisi teori dan pengantar praktikum (sekilas tentang implementasi). Idealnya ada diktat untuk teori, mahasiswa sering malas membaca textbook dan hanya mengandalkan slide.
  2. Modul praktikum: Berisi contoh implementasi, mahasiswa mengikuti langkah demi langkah dalam modul untuk mengimplementasikan contoh. Mahasiswa diperbolehkan copy-paste code dari modul.
  3. Latihan praktikum. Mahasiswa menyelesaikan masalah yang mirip contoh pada langkah dua tapi harus dengan modifikasi (untuk memastikan mahasiswa paham dan tidak hanya copy-paste secara buta). Bisa dikerjakan berkelompok untuk melatih kerjasama dan tutor sebaya.
  4. Quiz sub materi: soal berbentuk multiple choice untuk melihat pemahaman mahasiswa dari sisi teori dan praktek. Multiple choice digunakan supaya bisa mencakup semua materi dan mudah dan cepat untuk dievaluasi sehingga dosen bisa tahu dengan cepat bagian mana yang masih kurang dipahami.
  5. Tugas besar. Mahasiswa meng-impelentasi sub materi di  tugas besar. Tugas ini berupa proyek dengan skala yang cukup kompleks  yang perlu diselesaikan per tahap.  Mahasiswa jadi mengetahui implementasi sub materi ini di “dunia nyata”.

Integrasi sub materi sekaligus evaluasi:

  1. Tugas besar.  Mahasiswa melakukan analisis, perancangan dan implementasi menggunakan semua sub materi yang sudah dipelajari.  Dosen perlu mempersiapkan tahapan tugas besar supaya sinkron dengan pemberian materi. Mahasiswa belajar melakukan presentasi, kerjasama dan pembagian tugas, belajar revision control system (seperti github).
  2. UJian praktikum: berbentuk proyek setengah jadi yang perlu dilengkapi.  Versi mini dari tugas besar yang beberapa komponennya dihilangkan untuk dilengkapi.  Model evaluasi ini bagus karena menghindari “toy problem” tapi tetap cukup dikerjakan dalam waktu 2-3 jam.
  3. Ujian teori:  fokus pada analisis dan perancangan. Diberikan problem, mahasiswa harus menganalisis dan merancang solusinya.

Install Ubuntu+TensorfLow+Keras

Posting terkait sebelum posting ini: pengantar deep learning bagian satu  dan dua.

Banyak alternatif tools untuk deep learning, dan tiap orang punya selera berbeda-beda.  Kalau punya banyak waktu, sebenarnya lebih bagus untuk mencoba berbagai tools. Tetapi karena waktu eksplorasi saya terbatas, saya pilih Tensorflow karena populer dan sepertinya di-maintenance dengan baik. Semakin populer sebuah tools maka semakin banyak resources di internet jadi tidak repot kalau ada masalah. Sedangkan saya pilih Keras supaya nanti dapat bisa lebih fokus pada model neural netnya. Keras menggunakan Tensorflow sebagai backend, jadi nanti bagian Tensorflownya dapat diganti dengan backend yang lain (seperti Theano) kalau mau. Berikut adalah langkah-langkah instalasi mulai dari Ubuntu, Tensorflow, PyCharm dan Keras.

1. Ubuntu
Bagi yang belum punya mesin Linux , cara yang paling gampang adalah melalui virtual machine (VM). Kelebihan VM? gampang sekali disetup. Kelemahannya lebih lambat dan tidak dapat menggunakan GPU.  Ada dua software VM yang populer: VMware dan Virtualbox. VMware lebih cepat tapi hanya gratis untuk penggunaan nonkomersial. Virtualbox opensource, gratis dan bebas digunakan tapi sayangnya lebih lambat. Saya lebih memlilih VMware karena kecepatan penting. Untuk VMware, donwload produk yang bernama VMWorkstation Player. Setelah VM diinstall, install Ubuntu diatasnya. Kenapa pilih Ubuntu? juga karena paling populer.   Jika masih buta samasekali linux, sebaiknya belajar sekilas dulu cara buka terminal, cd, ls, sudo, nano.

Ubuntu secara default sudah memiliki Python 2 dan Python 3.  Bagi yang baru mengenal Python, versi 2 dan 3 ini bisa memusingkan. Python 3 tidak sepenuhnya compatible dengan Python 2, tapi masalahnya ada beberapa tools yang hanya tersedia dalam Python 2. Menurut saya, selama memungkinan usahakan gunakan Python 3.

2. Tensorflow
Penjelasan rinci ada di: tensorflow.org/install/install_linux . Karena dalam posting ini kita hanya menggunakan linux VM, berarti tensorflow yang digunakan adalah versi CPU saja. Saya lebih suka menginstall lewat pip3 karena lebih  lebih mudah (pip untuk Python2, pip3 untuk Python 3). Pertama install pip3, baru install tensorflow:

sudo apt-get install python3-pip
pip3 install tensorflow

Untuk mengetest apakah sudah berjalan, jalankan python3 (jangan python):

python3

setelah keluar command prompt >>>, ketik

import tensorflow as tf
hello = tf.constant('Hello, TensorFlow!')
sess = tf.Session()  #akan keluar banyak warning, biarkan.
print(sess.run(hello))

Harusnya akan muncul “hello tensorflow”.  Warning keluar karena Tensorflow belum memanfaatkan maksimal setting CPU dan GPU. Jika ingin warning ini hilang, lakukan instalasi dengan cara mengcompile source code (tapi lebih kompleks). Gunakan exit() untuk keluar.

Catatan: bagi yang tertarik menginstall tensorflow yang support GPU, ini pengalaman saya: yudiwbs.wordpress.com/2017/02/26/mencoba-tensorflow/  jauh lebih kompleks, tapi layak untuk mendapatkan kecepatan maksimal.

3. Opsional: PyCharm
IDE (Integrated Development Environtment) yang bagus akan memudahkan membuat program dan mengurangi bug. Saya memilih editor Pycharm karena sudah terbiasa menggunakan IntelliJ untuk Java dan Android Studio. Cara install yang paling gampang adalah melalui Ubuntu Make. Install dulu umake, baru Pycharm. Prosesnya akan agak lama tergantung koneksi internet:

sudo add-apt-repository ppa:ubuntu-desktop/ubuntu-make
sudo apt-get update
sudo apt-get install ubuntu-make
umake ide pycharm

Setelah itu icon pycharm akan muncul di toolbar Ubuntu. Klik, dan buat project baru. Penting: pilih interpreter python 3! Soalnya tadi Tensorflow diinstall di Python 3 (via pip3) bukan Python 2 (pip). Tunggu sebentar saat Pycharm mengindeks library Tensorflow (akan ada tulisan “2 processes running” tunggu sampai hilang). Tekan alt-insert (atau klik kanan di project explorer), pilih python file. Ketik code tensorflow seperti langkah dua, klik kanan lalu pilih run.  Hasilnya seperti gambar di bawah:

 

4. Keras
Instalasi Keras dapat dilakukan dengan pip3

pip3 install keras

Kembali ke Pycharm, terlihat Pycharm mengindeks library Keras ini. Tunggu sebentar. Lalu buat file python baru seperti pada langkah 3 dan masukan code berikut untuk mengetest apakah Keras sudah terinstall dengan baik:

from keras.models import Sequential
from keras.layers import Dense
#model dengan dua layer berurutan
model = Sequential()
#layer input, dense artinya semua terhubung
model.add(Dense(32, activation='relu', input_dim=100))
#layer output, binary classification, jadi cukup satu neuron
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
              loss='binary_crossentropy',
              metrics=['accuracy'])

# Buat dummy data sebanyak 1000 instances dengan dimensi 100
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))

# Train model, dengan batch 32 samples sebanyak 10 epoch
model.fit(data, labels, epochs=10, batch_size=32)

Code di atas adalah neural net sederhana dengan satu layer input dan satu layer output. Dapat dilihat dengan Keras mendefinisikan topologi model jadi sangat mudah. Keras nanti akan dibahas lebih detil di posting selanjutnya.

 

 

Belajar Deep Learning (2)

Lanjutan dari posting bagian pertama 

Walaupun memiliki banyak keunggulan, deep learning juga masih punya beberapa masalah:

  • Perlu sumber komputasi yang besar.  Dari dulu neural net termasuk teknik yang memerlukan waktu training yang relatif lama dibandingkan teknik lain, apalagi sekarang untuk deep learning yang memiliki topologi kompleks dengan jutaan parameter. Tanpa GPU atau multi cpu atau cloud, proses training akan bisa menghabiskan waktu yang lama. Masalahnya GPU itu mahal, biaya sewa cloud yang didukung GPU juga mahal.  Tapi untuk tahap belajar untungnya masih bisa menggunakan CPU biasa.
  • Dasar teori deep learning belum stabil (formal matematisnya). Kalau lihat paper-paper deep learning umumnya berbasis eksperimen. Mungkin mirip seperti teknologi mesin uap saat teori termodinamika belum lengkap. Bukan berarti tidak bermanfaat ya.
  • Parameter learning (hyperparameter) masih perlu di-tuneup manual. Misalnya jumlah hidden layer, jumlah neuron per layer, fungsi aktivasi dan jumlah batch tetap masih perlu coba-coba dan saat ini belum ada patokan standard. Itu sebabnya sekarang penelitian DL mulai bergeser ke meta-learning.
  • Saat ada teknik yang lebih bagus, deep learning bisa ditinggalkan dengan cepat. Sama saat neural net ditinggalkan di akhir tahun 90an saat teknik berbasis kernel unggul.

Ada tiga kelompok pengguna deep learning (atau lebih umumnya machine learning) :

  1. Peneliti.  Berkutat dengan paper-paper, menghasilkan paper-paper.  Tapi mereka juga banyak melakukan eksperimen terutama untuk teknik-teknik baru.
  2. Data scientist (walaupun menurut saya sebagian besar lebih cocok disebut data engineer). Kelompok ini lebih fokus untuk memanfaatkan teknik deep learning untuk berbagai domain.  Mereka banyak melakukan eksperimen untuk mengutak-atik model dan praproses data.
  3. Programmer pengguna. Jenis ini tinggal menggunakan model yang sudah jadi (pretrained) atau lewat API. Tidak perlu eksperimen lagi, model sudah jadi dan tinggal digunakan.

Saya sendiri masuk ke kategori dua, khususnya untuk aplikasi di domain computational linguistic. Itu sebabnya nanti isi blog ini lebih ke arah aplikatif daripada ilmiah. Inginnya sih nanti bisa masuk juga ke kategori satu dan menghasilkan paper  🙂

Sebelum belajar DL, ada beberapa hal yang perlu disiapkan dan dipelajari kalau belum bisa:

  1. Machine learning. Penting karena tidak semua masalah cocok diselesaikan dengan deep learning.
  2. Neural network. Dasar DL  adalah neural network, jadi penting untuk dipelajari. Bagaimana reprenstasi input dan output, hidden layer, fungsi aktivasi, bobot, forward & back propagation.
  3. Topologi neural network, terutama  CNN (convolution neural net) dan RNN (recurrent neural net).

Untuk dasar teori di atas pada saat awal tidak perlu terlalu mendalami detil, tapi setidaknya tahu gambaran  umumnya.

Untuk tools, alternatifnya banyak, tapi yang saya gunakan:

  1. Linux. Bisa diinstall dengan virtual machine atau dual boot.  Pernah saya coba Windows, baru install Python dengan beberapa lib saja langsung kena masalah.
  2. Python. Python digunakan dalam Tensorflow, Keras dan Pytorch. Python  sebelumnya juga sudah menjadi tools favorit untuk data engineer. Saya jadi “terpaksa” belajar bahasa ini. Tapi tidak terlalu sulit kok, menurut saya lebih enak daripada PHP dan lebih gampang daripada Java. Tidak heran Python jadi bahasa pemrograman awal untuk beberapa jurusan computer science.
  3. Tensorflow. Memang ini punya Google, jeleknya mungkin kita jadi bergantung dengan Google, tapi enaknya dukungan dan perkembangannya toolsnya mantap. Enak untuk belajar karena saat bertemu masalah, dengan search banyak solusinya ( Posting saya tentang instalasi tensorflow). Ada yang lain seperti Theano dan PyTorch, tapi sayangnya saya tidak sempat untuk mempelajari semua.
  4. Keras. Ini semacam interface ke Tensorflow, Theano, CNTK.  Dengan Keras, kita bisa bermain di level abstraksi yang lebih tinggi, jadi bisa lebih fokus pada pembentukan modelnya. Cocok bagi pemula yang baru belajar deep learning seperti saya.

Setelah ini dapat langsung menginstall tools deep learning dan pendukungnya (posting saya tentang setup Keras dan Tensorflow) .  Rencananya saya akan lanjutkan dengan materi tentang CNN dan RNN dan implementasinya dengan Keras.  Setelah itu dibahas aplikasi deep learning ini bidang teks. Untuk teori machine learning dan neural net saya pikir sudah banyak sekali materi dan tutorial yang ada di internet termasuk yang berbahasa Indonesia, jadi tidak perlu ditulis lagi.

 

Sumber belajar:

 

Belajar Deep Learning (1)

Apa itu deep learning?

Saya dengar istilah ini beberapa tahun yang lalu dan tiba-tiba saja topik ini mendominasi bahasan di machine learning. Istilah deep learning memang mirip seperti istilah big data, jadi  buzz word yang bercampur aduk antara marketing, science, produk dsb yang  mempersulit orang yang mau belajar dan memanfaatkannya.

Deep learning atau deep nueral network merupakan bagian dari machine learning. Machine learning sendiri mencakup berbagai teknik  yang memungkinkan komputer “belajar” berdasarkan data. Seperti permainan catur, daripada menginputkan aturan yang sangat banyak dan kompleks, berikan saja pada komputer jutaan contoh permainan dan biarkan komputer “belajar” dari contoh-contoh tersebut.  Itu sebabnya machine learning adalah  bagian dari kecerdasan buatan (AI), karena polanya mirip seperti pola belajar manusia. Tentu saja otak manusia masih jauh lebih unggul dan kompleks.

Deep learning  adalah neural network (jaringan syaraf tiruan) dengan topologi dan arsitektur yang relatif rumit. Istilah “deep” muncul  karena  topologi neural network yang digunakan umumnya mengandung banyak lapisan (hidden layer) .

Teknik neural net memang sudah ada sangat lama (puluhan tahun bahkan) dan sempat timbul tenggelam.  Lalu kenapa sekarang muncul lagi?

Ada beberapa alasan:

  1. Perkembangan hardware, terutama dengan adanya GPU yang dapat dimanfaatkan untuk komputasi paralel (NVIDIA dengan CUdanya).
  2. Sistem terdistribusi. Proses training yang berat dapat didistribusikan ke multi mesin dan cloud computing.
  3.  Algoritma dan teknik baru di bidang neural net (fungis aktivasi, optimasi).
  4.  Ketersediaan data.

Hal-hal  tersebut di atas memungkinankan neural network yang rumit  dengan jutaan parameter dapat ditraining untuk menyelesaikan masalah. Dampaknya, teknik deep learning mulai menggungguli teknik-teknik lain, terutama di bidang visual computing (misalnya mengenali objek).  Jadi kenapa deep learning kemudian menjadi trend?

  1. DL dapat mengungguli teknik-teknik yang ada. Bidang machine learning sangat terukur, dan berbasis eksperimen. Selalu ada task standard  yang menjadi patokan.  Jadi begitu ada teknik baru yang unggul, apalagi cukup jauh, maka langsung menarik perhatian para peneliti dan praktisi machine learning.
  2. Teknik machine learning yang ada sebelumnya seringkali memerlukan feature engineering untuk mendapatkan hasil yang baik. Feature engineering artinya perlu dilakukan utak-atik atribut atau fitur. Ini memerlukan waktu yang lama, sistem yang kompleks dan pemahaman tentang data yang mendalam. Di sisi lain, deep learning memungkinan end-to-end framework, cukup berikan input dan outputnya saja.
  3. Dapat diterapkan di multi bidang. Topologi neural network untuk pemrosesan image dapat diterapkan di teks dan pengenalan suara dengan relatif mudah.

Saat ini perkembangan deep learning masih belum terlihat surut. Berbagai cloud provider seperti Amazon, Google dan MS menyediakan fasilitas dengan dukungan GPU untuk melakukan training neural net di cloud  (walaupun mahal).  Perusahaan besar seperti Google, MS, FB membuka tools software deep learning yang mereka gunakan menjadi opensource (Tensorflow, CNTK, FBlearner). Google membuat hardware khusus untuk neural net (TPU), IBM membuat chip True North, Apple berencana akan menambahkan chip neural net dalam Iphone.  Teknik deep learning juga masih mendominasi lomba-lomba (khususnya yang terkait visual), paper-paper dan conference tentang deep learning bermunculan untuk berbagai bidang. Jadi saya pikir akan sangat bermanfaat untuk belajar tentang deep learning ini.

Lanjutan bagian dua

Tulisan pertama

Sebenarnya ini adalah blog kedua saya di UPI. Blog pertama dibuat tahun 2007 (yudi.wfu.upi.edu) tapi entah kenapa blog tersebut ditutup tanpa pemberitahuan, untung ada wayback machine yang sempat mengarsipkan.  Tapi sekarang harusnya berbeda, sepertinya sudah banyak dosen yang sudah membuat blog 🙂

Blog ini akan saya gunakan untuk menuliskan eksplorasi saya terkait berbagai aspek teknologi informasi (khususnya mobile computing, deep learning dan NLP) sampai perkuliahan. Untuk hal-hal pribadi seperti politik, keluarga sampai agama ada di blog pribadi saya di yudiwbs.wordpress.com.  Sebagai PNS, saya dibayar negara salah satunya untuk mengeksplorasi berbagai hal sesuai bidang ilmu saya,  walaupun waktu dan tempatnya bisa saja diluar jam kerja dan di luar UPI.  Supaya  ekplorasi tersebut bermanfaat semaksimal mungkin,  maka perlu dicatat dan disebarluaskan. Saya rasa  blog resmi UPI ini  menjadi tempat yang tepat untuk hal-hal yang tidak terlalu ilmiah  (kalau ilmiah tentu cocoknya dibuat di scientific paper).