Membuat video tutorial praktikum

Saya sudah pernah menggabungkan video ke dalam elearning  sekitar 2006 (era sebelum Youtube). Saya juga sudah upload video di Youtube sejak 2010. Masalahnya saya pribadi tidak terlalu suka dengan media video untuk belajar, saya lebih suka membaca. Itu sebabnya sampai sekarang saya lebih banyak membuat modul tutorial dalam bentuk tulisan.

Beberapa semester terakhir, mahasiswa sering  mengeluh tidak diajari secara detil. Mereka ingin belajar seperti dalam kursus, tahap demi tahap bersama-sama.  Membayangkannya saja  saya langsung malas hehe. Solusinya adalah dengan membuat video tutorial dan upload ke Youtube. Buat satu sekali, bisa digunakan seterusnya.

Untuk screen recorder, saya menggunakan OBS Studio. Bagus fiturnya, dan bisa digabung misalnya dengan stream dari kamera (kapan-kapan nanti beli kamera-nya).¬† Untuk mic, saya menggunakan headset punya Furqon yang biasa digunakan dia untuk main game ūüôā¬† Tidak terlalu banyak masalah, asal latihan dulu. Hati-hati dengan volume suara, umumnya terlalu kecil. Tambahkan filter gain di OBS untuk memperbesar volume.

Untuk video editor, saya mencoba OpenShot (terlalu sederhana), VSDC (previewnya tidak enak) dan akhirnya Shotcut. Saya paling cocok dengan Shotcut, walaupun perlu waktu belajar agak lama.

Setelah dua hari utak-atik (untuk video berdurasi hanya 15 menit), akhirnya bisa upload tutorial pertama saya tentang pengantar Android Studio. Nanti materi lainnya menyusul.

Playlist tutorial Android yang saya buat:  https://www.youtube.com/playlist?list=PLUh6vS-rrmzRG5FFQeaog46kjs4zxtCWX

 

POS Tagger Bahasa Indonesia dengan Python

Posting sebelumnya: POS Tagger dengan Syntaxnet

Posting terkait: POS Tagger dan Dependency Parser dengan StanfordNLP

Secara bertahap, saya dan istri akan migrasi dari Java ke Python. Salah satu yang kami perlukan adalah POS (Part of Speech)-Tagger Bahasa Indonesia.

Ini cara yang paling sederhana  karena saya sudah sediakan modelnya, untuk cara trainingnya ada di bagian bawah.

Saya menggunakan CRFTagger, jadi library yang perlu diinstall: numpy, nltk dan python-crfsuite.

Lalu download pretrained model (1.6MB) yang saya buat berdasarkan data Fam Rashel (200rb-an token) di https://drive.google.com/open?id=12yJ82GzjnqzrjX14Ob_p9qnPKtcSmqAx

Untuk menggunakannya (sesuaikan path jika diperlukan):

from nltk.tag import CRFTagger
ct = CRFTagger()
ct.set_model_file('all_indo_man_tag_corpus_model.crf.tagger')
hasil = ct.tag_sents([['Saya','bekerja','di','Bandung']])
print(hasil)

Hasilnya akan seperti ini:

[[(‘Saya’, ‘PRP’), (‘bekerja’, ‘VB’), (‘di’, ‘IN’), (‘Bandung’, ‘NNP’)]]

Selesai… gampang kan ūüôā

Jika ada yang berminat untuk training sendiri, ada beberapa dataset POS-Tag Bahasa Indonesia:

https://github.com/UniversalDependencies/UD_Indonesian
https://github.com/famrashel/idn-tagged-corpus
http://www.panl10n.net/english/OutputsIndonesia2.htm
https://lindat.mff.cuni.cz/repository/xmlui/handle/11234/1-1989

Saya menggunakan data milik Fam Rashel, code untuk training-nya adalah sbb (mungkin belum efisien, saya masih belajar Python):

from nltk.tag import CRFTagger

jumSample = 500000
namaFile = "/home/yudiwbs/dataset/pos-tag-indonesia/idn-tagged-corpus-master/Indonesian_Manually_Tagged_Corpus.tsv"
with open(namaFile, 'r', encoding='utf-8') as f:
    lines = f.read().split('\n')

pasangan = []
allPasangan = []

for line in lines[: min(jumSample, len(lines))]:
    if line == '':
        allPasangan.append(pasangan)
        pasangan = []
    else:
        kata, tag = line.split('\t')
        p = (kata,tag)
        pasangan.append(p)

ct = CRFTagger()
ct.train(allPasangan,'all_indo_man_tag_corpus_model.crf.tagger')
#test
hasil = ct.tag_sents([['Saya','bekerja','di','Bandung'],['Nama','saya','Yudi']])
print(hasil)

Dokumentasi lengkap tentang lib POS-Tag NLTK dapat dilihat di: http://www.nltk.org/api/nltk.tag.html 

Untuk sekarang saya belum buat pengukuran kinerja model yang dihasilkan.

NER (Named Entity Recognition) Bahasa Indonesia dengan Stanford NER

 

Update, posting lanjutan: NER Bahasa Indonesia dengan anaGo (Ptyhon+Keras)

Posting sebelumnya tentang NER


Untuk mengekstrak named entity Bahasa Indonesia, kita dapat memanfaatkan library Stanford NER untuk membuat model yang di-train dengan dataset Bahasa Indonesia. Pertama download Stanford NER di: https://nlp.stanford.edu/software/CRF-NER.html#Download

Sedangkan dataset NER Bahasa Indonesia untuk training dapat diperoleh di:

 https://github.com/yohanesgultom/nlp-experiments/blob/master/data/ner/training_data.txt

dan

https://github.com/yusufsyaifudin/indonesia-ner/tree/master/resources/ner

Catatan: format dataset di atas tidak sesuai dengan Stanford NER, jadi perlu dikonversi ke format dua kolom seperti ini:

Sementara	O
itu	O
Pengamat	O
Pasar	O
Modal	O
Dandossi	PERSON
Matram	PERSON
mengatakan	O
,	O
sulit	O
bagi	O
sebuah	O
kantor	ORGANIZATION
akuntan	ORGANIZATION
publik	ORGANIZATION
(	O
KAP	ORGANIZATION
)	O

Selanjutnya untuk training, dokumentasinya ada di:

https://nlp.stanford.edu/software/crf-faq.html#a:   

Setelah training selesai dan model didapat, maka cara menggunakannya adalah sebagai berikut.

Ambil stanford-ner-resources.jar, letakkan di direktori lib. Jika menggunakan Gradle maka setting gradle-nya sbb:


repositories {
  flatDir {
    dirs 'libs'
  }
}

dependencies {
 testCompile group: 'junit', name: 'junit', version: '4.12'
 compile group: 'edu.stanford.nlp', name: 'stanford-parser', version: '3.8.0'
 compile name: 'stanford-ner-3.8.0'
}

Selanjutnya gunakan code yang ada di NERDemo.java.¬† Sesuaikan variabel serializedClassifier dengan lokasi model bahasa Indonesia. Outputnya akan seperti ini untuk input “Budi Martami kuliah di UPI yang berlokasi di Bandung”:


---
Budi/PERSON Martami/PERSON kuliah/O di/O UPI/ORGANIZATION yang/O berlokasi/O di/O Bandung/LOCATION ./O
---
Budi	PERSON
Martami	PERSON
kuliah	O
di	O
UPI	ORGANIZATION
yang	O
berlokasi	O
di	O
Bandung	LOCATION
.	O
---

Ekstraksi Pasangan Pertanyaan-Jawaban dari Forum Online

Forum online masih memiliki potensi yang besar walaupun popularitasnya turun sejalan dengan populernya group FB dan app group chat.¬† Di forum online, thread sudah dikelompokkan dalam topik dan umumnya ada moderator yang mencegah spam dan bot sehingga¬† data lebih “bersih” dibandingkan Twitter.¬† Saya jadi tertarik untuk mencoba me-mining data di forum online ini.

Salah satu fungsi utama forum adalah untuk media tanya jawab.  Ini yang rencananya saya akan ekstrak, pasangan pertanyaan dan jawabannya (PPJ). Pasangan ini  nantinya akan digunakan sebagai basis pengetahuan  QA (question-answering) system, termasuk chatbot.

Saya memilih forum online kaskus, dengan sub topik roda-empat, dan dengan thread mengenai mobil ayla agnia (karena paling banyak).  Bentuknya megathread, yaitu satu thread besar dengan ratusan halaman. Saya crawl dengan sangat pelan (30 menit per halaman) jadi mudah-mudahan tidak menggangu.  Untuk mengambil pasangan pertanyaan-jawaban (PPJ),  saya ambil posting yang menggunakan quote  dan reply (gambar bawah).

quote

Masalahnya, tidak semua quote dan reply adalah PPJ. Ada  quote yang bukan pertanyaan, ada reply yang berbentuk pertanyaan balik (bukan jawaban) dan ada  pasangan quote-reply yang tidak relevan (misal sapaaan selamat pagi dan jawabannya).

Saya menggunakan klasifikasi teks untuk mencari pasangan quote-reply yang merupakan PPJ. Pelabelan dilakukan oleh saya sendiri, dari  1030 pasangan quote-reply, 189 masuk ke kelas PPJ dan 841 non-PPJ.   Di luar dugaan, ternyata hanya sedikit pasangan quote-reply yang dapat digunakan (10%-an).  Penyebabnya mungkin mega-thread juga digunakan untuk tempat kumpul-kumpul sehingga banyak percakapan yang keluar dari topik.

Selanjutnya saya coba beberapa teknik klasifikasi dan untuk pertama kalinya saya menggunakan scikit-learn¬† (pelan-pelan migrasi dari Java ke Python ūüôā ) .¬† ¬†Karena ini eksplorasi pertama, supaya cepat saya tidak menggunakan praproses dan fitur-fitur lain, hanya bag-of-words teks quote dan reply-nya. Masalah imbalance juga tidak ditangani.

Data displit menjadi 70% data training, 30% data validasi. Hasil terbaik adalah dengan teknik SGD sbb  (precision, recall, F1):

Non PPJ:  0.89, 0.97, 0.93
PPJ: 0.76, 0.43, 0.55

Hasilnya menurut saya lumayan, mengingat kelas PPJ hanya 10% (kelas minoritas) dan belum dilakukan optimasi apapun.

Untuk eksplorasi berikutnya (selain tentunya meningkatkan akurasi):

  • Lintas domain, misalnya model yang ditraining untuk data otomotif sebagus apa jika diaplikasikan ke data thread tentang smartphone.
  • Pertanyaan-jawaban yang berbentuk thread diskusi. Jadi PPJ yang saling berkait.¬† ini mungkin¬† cocok untuk chatbot, agar bot dapat memberikan respon yang lebih natural.
  • Membangun QA System atau chatbot yang menggunakan data ini.

 

Link ke paper: https://osf.io/preprints/inarxiv/5rxak/

Web App dengan Python Flask, Nginx dan uwsgi.

Update April 2018:

Dengan Docker, proses persiapan dan deploy jauh lebih gampang. Tutorial/repo yang dapat digunakan: https://hub.docker.com/r/tiangolo/uwsgi-nginx-flask/

Walapun sempat mengerjakan beberapa proyek dengan PHP, pengalaman saya membuat web app dengan PHP ternyata tidak menyenangkan. Pernah coba menggunakan Java, tapi menurut saya terlalu rumit untuk web app. Sejalan dengan eksplorasi saya belajar Python untuk keperluan datamining, maka sekalian saja menggunakan Python untuk membuat applikasi web, baik frontend maupun untuk RestFul-API.

Di posting sebelumnya saya mencoba membuat sendiri dari nol, tapi ternyata rawan kesalahan. Setelah lihat-lihat beberapa framework, menurut saya yang paling menarik adalah Flask (http://flask.pocoo.org/).  Seperti biasa, saya share di blog ini untuk catatan pribadi dan mudah-mudahan bermanfaat bagi pemula seperti saya.

Saya menggunakan instance Ubuntu AWS  dengan client Windows+Putty.  Pertama siapkan port forwarding agar kita bisa mencoba app dengan aman via SSH.  Di Putty, pilih settings->connection-SSH-tunnels. Saya forward port 5000, jangan lupa klik add (gambar bawah). Simpan session supaya tidak perlu mengeset berulangkali.

tunnel

Pertamakali yang perlu dilakukan adalah install pip, tools untuk menginstall lib python.

sudo apt-get update
sudo apt-get install python-pip

Kemudian install nginx sebagai webserver

sudo apt-get install nginx

Pastikan port 80 sudah dibuka (kalau digital ocean dibuka, tapi kalau AWS defaultnya ditutup),  dan buka alamat server kita di browser, harusnya pesan bahwa nginx sudah terinstall akan keluar.

Selanjutnya kita akan menginstall virtual environment (virtualenv). Ini penting dan wajib karena memungkinkan kita menginstall lib Python untuk suatu proyek  yang terisolasi dengan proyek lainnya. Tanpa virtualenv, install lib bisa membuat proyek lain jadi tidak jalan (pengalaman pahit pribadi hehe).

sudo pip install virtualenv 

Selanjutnya buat directory project dan masuk.

mkdir myproject
cd myproject

Dalam direktori ini set virtual env dengan:

 virtualenv myproject-env 

untuk mengaktivasi virtual env ini, gunakan

source myproject-env/bin/activate 

perhatikan prompt akan berubah. Sekarang kalau kita jalankan pip, maka lib tersebut akan terinstall di virt env ini saja (myproject/myproject-env).  Tapi kalau installnya lewat apt-get tetap berlaku untuk semua.

Untuk mengetest, coba jalankan

 which python 

maka yang muncul adalah lokasi Python di myproject. Untuk menonaktifkan virt env ini,  ketik  deactivate (tapi jangan lakukan dulu sekarang).

Selanjutnya install Flask dan uwsgi. Flask untuk framework, sedangkan uwsgi untuk koneksi dengan nginx.

 pip install uwsgi flask 

Selanjutnya kita akan membuat code sederhana hello world.

from flask import Flask
from werkzeug.serving import run_simple
app = Flask(__name__)

@app.route("/")
def beranda():
     return "Hello World"

if __name__ == '__main__':
     run_simple('0.0.0.0', 5000, app, use_reloader=True, use_debugger=True, use_evalex=True)

Jalankan

 python myapp.py 

dan buka browser dengan alamat¬† http://localhost:5000/¬† maka di browser akan muncul “Hello World” (jika menggunakan putty, pastikan tunneling sudah benar).¬† Jika code diupdate maka otomatis akan dilakukan reload. Gampang kan ūüôā

Inilah kelebihan Flask, sangat mudah untuk dijalankan dan didebug.  Tapi tentu jika sudah operasional cara seperti ini tidak cocok. Sekarang kita akan menghubungkan app ini dengan web server nginx melalui uwsgi.

Pertama buat konfigurasi wsgi dulu, buat file uwsgi-myproject.ini dengan isi sebagai berikut:

Catatan: Sesuaikan path lokasi project di variabel home. Pastikan nama directory virtenv sudah cocok.

[uwsgi]
home = /home/ubuntu/myproject
wsgi-file = %(home)/myapp.py
socket = 127.0.0.1:3033
callable = app
module = app
daemonize = %(home)/app.log
pidfile = %(home)/app.pid
virtualenv= %(home)/myproject-env

Sekarang kita perlu update nginx agar mendengarkan socket uwsgi.¬† Buka /etc/nginx/nginx.conf¬† ¬†(mungkin perlu sudo) lalu pada bagian¬† ” http { ” tambahkan konfigurasi server berikut:

http {
  ##
  # Basic Settings
  ##
  ...
  server {
    listen 80;
    location / { include uwsgi_params; uwsgi_pass 127.0.0.1:3033; }
  }
}

Selanjutnya hapus page default nginx dan restart nginx.

sudo rm -v /etc/nginx/sites-enabled/default
sudo service nginx restart

Sekarang jalankan uwsgi project kita dengan cara

 uwsgi uwsgi-myproject.ini 

Sekarang buka di browser alamat server anda (bukan localhost:5000), yang tadinya ucapan default dari nginx harusnya akan berubah menjadi “Hello world” . Jika tidak, coba lihat catatan error di di file app.log (tail -10 app.log)

Untuk men-stop uwsgi, lakukan dengan (hati-hati, parameternya adalah app.pid bukan file uwsgi.ini):

 uwsgi --stop app.pid 

Tips: jika di-log keluar pesan seperti ini: “probably another instance of uWSGI is running on the same address”. Reset port dengan

 sudo fuser -k 3033/tcp 

Untuk mengaktifkan autoreload gunakan:

 uwsgi --py-autoreload 1 

App mencari makan halal di Bali

Link ke app: https://play.google.com/store/apps/details?id=yuliadi.com.blhlv2

Ide pembuatan app ini sudah cukup lama. Saat saya datang ke Bali,  salah satu hal yang menyulitkan adalah mencari makan halal. Biasanya googling dulu, lalu tandai di peta. Tetapi ada beberapa tempat yang jarang dibahas orang, tidak mencantumkan halal di restorannya dan diwebsitenya padahal sebenarnya punya sertifikat halal MUI.  Ini diperparah situs MUI yang tidak menyedikan informasi yang mudah diakses masyarakat.

Sekitar sebulan yang lalu, untungnya ada pelatihan pengembangan Android dari Google untuk para dosen. Lumayan panjang 5 hari full time. Sambil ikut pelatihan saya mulai iseng mulai buat app ini.  Berlanjut saat saya ikut menemani istri ke Bali dalam rangka konferensi.

Saya tidak menduga ternyata perlu waktu banyak untuk mengumpulkan dan memverifikasi data.  Data dari MUI (pusat dan lokal Bali) berbentuk pdf dan isinya lebih fokus terhadap perusahaan yang mendaftarkan dan tidak ada informasi alamat.  Perlu dicek satu persatu dengan Google Streetview, Zomato dan Tripadvisor.

Setelah data tempat makan yang dapat sertifikat MUI, saya lanjutkan dengan data yang self-certified, artinya mengklaim halal dengan tulisan “halal” ditempel di depan tempat restoran atau diwebsitenya. Setelah googling tempat-tempat yang katanya halal, ternyata banyak yang sebenarnya tidak mengklaim dirinya halal karena menyajikan minuman alkohol. Orang mengganggap halal karena berasumsi karena tempat itu hanya menyajikan seafood, makanan timur tengah dan sunda. ¬†Mungkin ke depannya saya akan tambahkan kategori no-pork tanpa atau dengan alkohol.

Dari sisi teknis, banyak yang saya pelajari. Mungkin nanti detilnya akan diposting terpisah. Ini beberapa yang saya ingat:

  • Recyleview, walaupun lebih ribet ternyata lebih cepat daripada listview.
  • Penggunaan key untuk mengakses Google Map API. ¬†Ternyata key ini kalau ganti komputer harus dibuat lagi. Lalu saat publish jangan lupa diletakkan juga di /res/release. ¬† Jika menggunakan¬†Google Play App Signing, jangan lupa SHA1-nya ditambahkan ke key. Sempat panik saat coba app yang di playstore peta-nya blank ūüė¶
  • Splashscreen dengan style tanpa load view, sangat membantu dari sisi user interface daripada user melihat layar kosong.
  • Layout dengan constraint layout mantep, mulai dari HP kecil sampai tablet bisa tetap bagus.
  • Karena ukuran APK saya besar (kena error), maka saya set proguard agar mengecilkan app. Tapi ini punya efek samping fasilitas search tidak jalan. Bug yang luar biasa (hanya error saat jadi APK). Harus tambahkan perkecualian di proguard untuk searchview.
  • Ada masalah penggunaan appcompat, ini saya lupa, tapi kalau tidak salah saat saya mengakses icon. Di HP istri (LG) ini menyebabkan error.
  • Ada beberapa device lokal (Andromax) yang mengalami error. Tapi karena saya tidak punya devicenya, masih belum bisa didebug.
  • Alpha dan beta test bisa dilakukan di playstore, tapi belum jelas caranya seperti apa.

 

Produk Digital

Saat ini kita  dapat melihat bagaimana kemampuan anak sampai dengan remaja mengkonsumsi produk digital. Mulai dari film, game, berita  sampai sosial media.  Jika itu dihilangkan dapat dipastikan mereka akan gelisah. Mereka lebih memilih akses internet daripada membeli barang seperti baju dan berwisata. Apakah mereka merasa tertekan dan sedih?  Kalau ditanya, biasanya mereka merasa cukup puas dan bahagia. Produk digital sudah memenuhi semua kebutuhan mereka (diluar sandang-pangan-papan).  Bagi mereka produk digital sudah seperti candu.

Generasi tipe ini hanya mengkonsumsi tapi sangat sedikit memproduksi.  Tidak ada masalah keseimbangan karena  produk digital sekali dibuat dapat direplikasi ribuan bahkan jutaan kali nyaris tanpa biaya. Satu orang bisa memproduksi belasan film di Youtube yang kemudian ditonton ratusan ribu orang.

Pergeseran ini juga terjadi di dunia kerja, perusahaan dengan puluhan pekerja bisa mempunyai pelanggan sampai jutaan orang. Tahun 2014, Whatsapp hanya memiliki 55 pegawai saat dibeli Facebook seharga 19 Milyar USD  (250 Triliun rupiah) dan sudah memiliki pengguna sebanyak 420 juta. Perkembangan kecerdasan buatan (AI) juga mengancam akan  menggantikan pekerjaan yang tadinya dianggap aman dari otomatisasi.

Menurut saya, di masa depan, masyarakat akan terbagi jadi dua kelompok. Ada kelompok minoritas yang punya kemampuan sangat tinggi dan sangat produktif dala menghasilkan produk digital dan di sisi lain kelompok mayoritas yang pasif dan hanya mengkonsumsi.  Bisa dipastikan kelompok minoritas akan memiliki kekayaan dan pengaruh lebih besar.

Ada dua pendekatan  untuk mengatasi kesenjangan ini. Pertama, dengan mempersiapkan sebanyak mungkin orang untuk bisa menghasilkan produk digital. Misalnya dengan pengenalan tentang ilmu komputasi untuk siswa SD-SMA dan materi elearning gratis seperti MOOC.  Kedua, dengan transfer kekayaan. Golongan minoritas dengan kekayaan berlimpah mendapat pajak tinggi dan ditransfer ke golongan mayoritas.  Artinya,  berikan uang yang cukup walaupun mereka menganggur  untuk sandang-pangan-papan-internet (hanya cukup, tidak berlebihan) dan biarkan mereka tenggelam dengan mengkonsumsi media digital.  Selama mereka puas, tidak akan terjadi kejahatan dan struktur sosial akan stabil (tidak ada kerusuhan).

Backend API dengan Python

Update: sebaiknya gunakan libray seperti Flask-Restfull. Tutorial saya tentang pengantar Flask+uwsgi+nginx

 

Saat ini saya mulai belajar Python karena Tensorflow (dan beberapa deeplearning framework) menggunakan Python. Lalu kebetulan di kuliah mobile programming saya memberikan tugas besar yang memerlukan backend untuk komunikasi antar app jadi sekalian saja untuk latihan.

Pada tugas mobile programming tersebut mahasiswa diminta membuat app yang mirip Gojek atau Uber tetapi untuk pedagang keliling. ¬†Intinya agar pembeli bisa melihat pedagang keliling yang lewat. Jadi idenya saya akan buat REST ¬†API dengan Python yang dapat digunakan untuk menyimpan dan berbagi ¬†lokasi user (baik pedagang maupun pembeli). Niat utamanya untuk mencoba, niat sampingannya supaya tidak ada mahasiswa yang protes “kok kuliah mobile programming diminta buat backend” hehe.

Untuk server, saya buat droplet DigitalOcean. Bisa saja sih menggunakan server ilkom UPI, cuma gara-gara bulan lalu kena hack jadi males (tepatnya takut utak-atik). Install apache2, mysql, python dan setup Python sebagai CGI tidak susah. Cuma ternyata perlu hati-hati untuk versi python: versi 2.7 dan 3. Saya menggunakan python3, tapi saat install library,  lupa malah menggunakan pip, bukan pip3.  Sempat bingung kok librarynya tidak dikenal padahal sudah diinstall.

Dari sisi bahasa, Python yang¬†menggunakan indentasi, bukan “{” “}” sempat membuat saya salah meletakan code, solusinya saya tambahkan comment seperti “#end for” ūüôā Yang paling susah adalah masalah protokol ¬†HTTP-nya sendiri. ¬†Misal setelah¬†¬†Content-Type: ..” wajib ada satu baris kosong. ¬†Lalu penanganan error (error 400, 500 dst). Anehnya jarang yang membahas ini, mungkin karena mayoritas menggunakan library seperti Flask?¬†

Berikut code untuk menyimpan lokasi:

#!/usr/bin/python3

# contoh cara penggunaan:  http://xxxyyy.co.id/updatelokasi.py?tag=yw&userid=123&lat=2.343434&long=1.2423424

import cgi, cgitb
cgitb.enable()

import MySQLdb

form = cgi.FieldStorage()

tag = form.getvalue('tag')
userid = form.getvalue('userid')
lat = form.getvalue('lat')
long = form.getvalue('long')

if (tag==None) or (userid==None) or (lat==None) or (long==None) :
   print ("Status: 400 Bad Request")
   print ("Content-Type: application/json\n")
   print ('{"status":"error parameter tidak lengkap, paramter yg valid adalah userid,tag,lat dan long"}')
   print("")
else:
   tag = cgi.escape(tag)
   #print (tag+":"+userid+":"+lat+":"+long)
   db = MySQLdb.connect("localhost","mobprog","mobprogpass","mobprog" )
   cursor = db.cursor()
   sql ="insert into lokasiuser (tag, userid, latitude, longitude) values (%s,%s,%s,%s)";
   try:
      cursor.execute(sql,(tag,userid,lat,long))
      db.commit()
      print ("Status: 200 OK")
      print ("Content-Type: application/json\n")
      print ('{"status":"OK"}')
      print("")
   except:
      db.rollback()
      print ("Status: 500 Internal Error")
      print ("Content-Type: application/json\n")
      print ('{"status":"Error di server, kontak yudi@upi.edu"}')
      print("")

   db.close()

Sedangkan code untuk mengambil lokasi:

#!/usr/bin/python3

# contoh cara penggunaan: http://xxxyyy.co.id/getlokasi.py?tag=yw&userid=123

import cgi, cgitb
cgitb.enable()

import MySQLdb
import json

form = cgi.FieldStorage()

tag = form.getvalue('tag')
userid = form.getvalue('userid')

if (tag==None) or (userid==None) :
   print ("Status: 400 Bad Request")
   print ("Content-Type: application/json\n")
   print ('{"error":"parameter tidak lengkap, paramter yg valid adalah userid dan tag"}')
   print("")
else:
   tag = cgi.escape(tag)
   #print (tag+":"+userid+":"+lat+":"+long)
   db = MySQLdb.connect("localhost","mobprog","mobprogpass","mobprog" )
   cursor = db.cursor()
   sql =" select timestamp, latitude, longitude  from lokasiuser where userid = %s and tag = %s ORDER BY timestamp DESC LIMIT 1"
   try:
      cursor.execute(sql,(userid,tag))
      results = cursor.fetchall()
      #harusnya cuma satu rec
      isAda = False
      for row in results:
         timestamp  = None
         timestamp  = row[0]
         latitude   = row[1]
         longitude  = row[2]
         response={"timestamp":timestamp.isoformat(),"latitude":latitude,"longitude":longitude}
         body = json.dumps(response)
         print ("Status: 200 OK")
         print ("Content-Type: application/json\n")
         print(body)
         print("")
         isAda = True
       #endfor
      if not(isAda) :
         print ("Status: 400 Bad Request")
         print ("Content-Type: application/json\n")
         print ('{"error":"userid atau tag tidak ditemukan"}')
         print("")

   except:
      print ("Status: 500 Internal Error");
      print("Content-Type: text/html\n")
      print('{"error":"server error, kontak yudi@upi.edu"}')
      print("")
   db.close()

 

 

Tutorial Weka Berbahasa Indonesia

Update Sept 2018:  Mulai semester ini  mahasiswa mandapatkan materi pandas+matplotlib+scikit-learn.  Weka tetap diberikan di awal kuliah sebagai pengantar.

Weka digunakan pada kuliah Datamining di ilkom UPI. Alasan utama sih karena gratis, open source, dan menggunakan Java sehingga mudah digunakan sebagai library kalau saya membuat program dengan Java (walaupun perlu hati-hati dengan lisensinya yang GPL).

Saya sudah membuat tutorial singkat Weka di:

https://docs.google.com/document/d/12aX-41KJtNqOVo_78ZUzqJGjZbKweZCJAuZgvhZY808/edit?usp=sharing

Lisensinya creative commons jadi bebas digunakan bahkan dimodifkasi, asal nama saya tidak hilang ūüôā ¬†Kalau mau format lain (pdf, doc) tinggal pilih File –> Download as.

Cakupan materinya masih terbatas: klasifikasi, clustering, freq itemset mining. Rencananya akan saya tambah pelan-pelan. JIka ada yang mau menyumbang materi ¬†lebih bagus lagi ūüôā