whitelines

Post kali ini saya mau promosi buku tulis whitelines. Perbedaan mendasar buku tulis buatan Swedia ini dengan buku tulis lain pada umumnya adalah warna garisnya. Kalau buku tulis lain garisnya biasanya berwarna hitam, maka whitelines, surprise surprise, garisnya berwarna putih.

WL72_web_produkt20150515_15305220150515_153130

Hal ini ternyata mempunyai keunggulan tidak mengganggu tulisan. Begitu di-fotokopi atau di-scan, garisnya tidak akan terlihat sehingga tulisan kita lebih bersih dan tetap lurus. Ini juga memudahkan ketika misalkan kita mau menjalankan OCR (Optical Character Recognition) ke tulisan kita nanti. Kombinasi garis putih dan warna kertas yang agak abu-abu ini ternyata lebih tidak melelahkan mata berdasarkan hasil penelitian.

Selain itu, kelebihan lainnya adalah kertasnya cukup tebal sehingga tidak tembus dengan pulpen gel, ada garis putus-putus di pinggir kertas agar gampang dirobek (tapi ini hampir ada di semua buku tulis di Swedia). Selain itu buku ini eco-friendly karena proses produksinya menghasilkan 0 emisi karbon. Cuma kekurangannya adalah harganya yang relatif mahal (60 kr untuk buku ukuran A5, isi 70 lembar).

Ada juga variannya yang punya kemampuan untuk bisa di-scan otomatis menggunakan apps di smartphone, whitelines link.

Bisa jadi oleh-oleh kalau ada yang teman atau saudara yang berkunjung ke Swedia.

Sekian iklan tidak dibayar.

matlab

Dulu saya enggak suka pakai matlab. Menurut saya matlab lambat, editornya tampilannya jelek, sintaksnya aneh, dan harus bayar. Saya juga baca blog https://abandonmatlab.wordpress.com/ untuk cari alasan-alasan tambahan untuk tidak pakai matlab. Malah pernah untuk kuliah S1 kelas analisis numerik, saya nekat pakai Java, tambah package JAMA untuk operasi matriks, untuk mengerjakan tugas lab-nya, walaupun disuruh pakai matlab sama asisten. Sebegitu tidak sukanya saya dengan matlab.

Tapi kini semua berubah.

Di KTH, matlab tersedia gratis untuk semua mahasiswa dan banyak tugas lab yang didesain untuk diselesaikan menggunakan matlab. Selain itu untuk thesis saya karena library pendukung banyak di matlab, mau tak mau saya juga harus pakai matlab. Setelah berkutat dengan cukup intens selama beberapa waktu, akhirnya saya menoleransi pemakaiannya dan kini cukup fasih menggunakannya.

Yah, kalau mau adil, di luar kekurangannya yang saya sebut di atas, Matlab memiliki bagian-bagian yang bersinar. Seperti kata peribahasa, “kalau alat yang kita punya cuma palu, maka semua permasalahan akan terlihat seperti paku“. Selain itu, Alan Perlis pernah bilang, “A language that doesn’t affect the way you think about programming is not worth knowing“. Matlab, secara paradigma memang cukup berbeda dibanding bahasa lain, untuk beberapa hal bisa terlihat deklaratif, walau tidak semurni bahasa seperti Haskell. Berikut kelebihan dari matlab dan contoh kasus dimana penggunaannya bisa dijustifikasi.

  • Natural dan cepat untuk masalah operasi matriks.

Misalkan matrix A dengan ukuran mxn akan dikalikan dengan matrix B dengan ukuran nxk, dengan hasilnya matriks C dengan ukuran mxk.

C = A * B;

jauh lebih ringkas dan sederhana dibanding memakai 2 for-loop. Selain itu, jauh lebih cepat juga. Yah, namanya juga matlab (matrix laboratory). Karena itu, untuk tugas yang banyak menggunakan operasi matriks, seperti pengolahan citra, matlab bisa diandalkan.

  • Debugging support

Namanya manusia pasti berbuat salah. dan kesalahan dalam menulis kode ini keluar dalam bentuk bug. Cukup klik sebelah kiri nomor baris di text editor untuk mengeset breakpoint, sehingga ketika di-run, program akan berhenti tepat sebelum baris itu dieksekusi. Dalam debugging, kita bisa menjalankan kode baris per baris sekaligus mengecek nilai variabel pada saat itu.

breakpoint
Breakpoint itu bulatan yang warna merah.
  • Built-in profiler

IDE matlab juga punya built-in profiling yang bisa digunakan untuk mengetahui bottleneck di dalam kode kita sehingga bagian yang lambat bisa dioptimisasi agar bisa berjalan lebih kencang. Cukup klik Run & Time atau ketik profile on, jalankan kodenya yang ingin di-profile, lalu ketik profile viewer.

profile
Contoh hasil profiling. Ternyata paling lama adalah fungsi ApplyDetector2.

 

Jangan gunakan matlab untuk misalkan string processing, atau interfacing dengan hardware. Bisa sih, tapi akan agak menyakitkan dan ada alat lain yang lebih cocok dan tepat untuk tugas tersebut.

Tutorial dan tips triks mempercepat matlab lebih lengkap bisa dilihat di http://www.matlabtips.com/

Bajakan

Saya baru dikasih tahu kalau ternyata KTH sudah berlangganan Office 365, sehingga mahasiswanya seperti saya bisa menggunakan produk Microsoft Office seperti Word, Excel, dan PowerPoint secara gratis dan legal, selama saya masih menjadi mahasiswa di sana.

Wah ini tentunya asyik sekali. Walau saya pendukung gerakan open source, saya rasa Microsoft Office adalah program office paling bagus untuk dipakai dibandingkan alternatif lainnya seperti Open Office, Libre Office, atau Google Docs.

Dengan ini berkuranglah produk bajakan yang saya pakai. Setelah OS Microsoft Windows dapat dari MSDN AA, video game beli di Steam, musik dengar di Spotify, dan nonton film di Netflix. Sekarang yang saya bajak tinggal produk hiburan dari Jepang.

Mengapa harus pakai produk asli? Pertama, kita mendapatkan ketenangan secaral moral dan legal. Secara moral karena pembajakan itu sama seperti mencuri, dan secara legal karena tidak perlu takut pintu rumah digedor oleh polisi. Selain itu memakai software asli tentunya lebih aman dibandingkan software bajakan yang didapat entah dari mana yang mungkin sudah disusupi virus atau malware lainnya.

Saya setuju dengan kata Gabe Newell, salah satu pendiri Valve, yang punya Steam. Katanya, “Piracy is a service problem”. Kalau kita bisa mendapatkan produk asli dengan lebih mudah dibandingkan produk bajakan (apalagi murah atau gratis), pasti orang akan lebih memilih yang asli.

Bagaimana dengan Indonesia, yang katanya tingkat pembajakan software nomor 2 tertinggi di dunia, apakah bisa mengurai konsumsi bajakan? Menurut saya bisa. Contoh nyatanya orang beberapa tahun lalu mau membayar beberapa puluh ribu untuk memasang ringtone atau ring back tone (ketik reg spasi blablabla) dengan cara memotong pulsa. Hal yang sama bisa diterapkan untuk pembelian produk atau software asli.

Demikian celotehan malam2…

Screen

Bayangkan skenario berikut. Anda butuh menjalankan program untuk eksperimen. Akan tetapi, karena ukuran data yang besar atau kompleksitas algoritma yang besar, Anda butuh menjalankannya di komputer dengan spek tinggi, dalam jangka waktu yang cukup lama, bisa hingga berhari-hari. Anda sudah dibuatkan akun untuk mengakses komputer spek tinggi tersebut (sebut saja namanya Monster) dan Anda bisa mengaksesnya menggunakan SSH kemudian menjalankan program dari sana. Namun eksekusi program lewat SSH ini akan berhenti apabila koneksi putus, baik sengaja maupun tidak sengaja. Bayangkan setelah menunggu seminggu lebih, namun program berhenti jalan karena PLN mati lampu, pastinya sangat mengesalkan.

Untuk menghindari hal tersebut, kita bisa menggunakan program bernama screen. Screen memungkinkan kita untuk menjalankan  semacam menjalankan terminal di dalam terminal. Kita cukup me-attach atau detach terminal screen yang ingin kita jalankan.  Untuk instalasi pada sistem ubuntu, cukup ketik

sudo apt-get install screen

tentunya jika Anda punya akses. Jika tidak bisa ditanyakan ke admin terdekat.

Setelah instalasi cukup ketik screen. Anda akan disambut teks berisi lisensi. Cukup tekan <Enter>. Setelah itu Anda dapat menjalankan program eksperimen yang diinginkan. Tekan <Ctrl>+<a> lalu <d> untuk me-detach screen dari terminal. Sekarang walaupun koneksi SSH putus, program terus berjalan tanpa interupsi.

screen welcome
Setelah screen dipanggil dari terminal.
running program
Jalankan eksperimen yang diinginkan.
detach
CTRL+a, d untuk detach screen dari terminal.

Untuk melihat progress, bisa dengan mengetik screen -r, jika hanya ada satu screen yang aktif, Multipel screen juga bisa dijalankan. Ketik screen -ls untuk melihat ada berapa screen yang aktif. Kemudian gunakan perintah screen -r <pid> untuk memilih/attach screen ke terminal.

multiple screens

continue

Petunjuk penggunaan lengkap bisa dilihat di: https://www.gnu.org/software/screen/manual/screen.html

Semoga berguna. Salam.

 

The Almost Nearly Perfect People

Pada post kali ini, saya akan coba mengulas buku dengan judul The Almost Perfect People: The Truth about Nordic Miracle karya Michael Booth. Ini buku pertama yang saya tamatkan di tahun 2015. Di goodreads saya pasang target untuk baca setidaknya 6 buku tahun ini, berkurang setengah dari target tahun lalu yang gagal tercapai.

Buku ini menceritakan kisah 5 negara di penjuru Eropa Utara yang belakangan mendapat sorotan internasional. Michael Booth menyebutnya sebagai Nordic Miracle. Contohnya, Denmark adalah negara paling bahagia di muka bumi, walaupun memiliki pajak salah satu paling tinggi di dunia. Finlandia memiliki salah satu pendidikan terbaik di dunia. Norwegia tidak kalap mata dan membangun gedung2 tinggi walaupun memiliki kekayaan dari minyak. Tak lupa Swedia, negara dengan persamaan gender paling baik. dan Islandia, yang pulih dari krisis ekonomi di tahun 2008.

Michael Booth menceritakannya menjadi 5 bab untuk masing-masing negara. Mari kita tilik satu persatu.

cover
Cover bukunya

Denmark

Berhubung penulisnya pernah tinggal lama, lebih dari sepuluh tahun, di Copenhagen, ibukota Denmark, maka bab mengenai negara ini adalah bab terpanjang dari buku ini. Bab ini banyak bercerita tentang bagaimana Denmark bisa menjadi salah satu negara paling bahagia di dunia.

Alasan pertama adalah dari mentalitas dari orang Denmark yang mencari kebahagiaan di dalam setelah mengalami banyak kehilangan. Sejarahnya Denmark pada era viking pernah memiliki daerah kekuasaan yang luas, meliputi seluruh Skandinavia hingga Inggris. Epik Viking ini bisa dinikmati di komik Vinland Saga. Akan tetapi, Denmark mulai satu per satu kehilangan daerahnya pada masa perang hingga hanya memiliki daerah seperti sekarang. Hal inilah yang menyebabkan mentalitas yang diringkas ke dalam kalimat

Hvad udad tabes, skal indad vindes

yang kurang lebih artinya, “What was lost without will be found within”.

Vinland_Saga_volume_01_cover

Selain itu, alasan berikutnya adalah kesetaraan sosial. Berdasarkan data Bank Dunia, Denmark adalah salah satu negara dengan Gini index terendah, yang berarti distribusi pendapatan yang diterima antara yang paling kaya dan yang paling miskin merata (tidak seperti kasus dimana 1% populasi menguasai 99% pendapatan). Hal ini mungkin ditambah tingkat kepercayaan orang Denmark yang tinggi kepada pemerintahannya untuk mengelola pajak untuk dana pendidikan, kesehatan dan lain-lain.

Denmark juga salah satu peminum berat. Mungkin itu juga bisa jadi alasan.

Islandia

Islandia diceritakan baru pulih setelah dihantam krisis ekonomi tahun 2008. Selain itu, orang Islandia ternyata banyak yang percaya klenik, seperti elves.

Tapi mungkin salah satu yang paling menonjol dari Islandia adalah pariwisata dari keindahan alamnya. Berdasarkan pengakuan yang pernah ke sana, alam Islandia itu bagus sekali. Karena saya belum pernah menyaksikan sendiri, berikut potongan foto-foto yang diambil tanpa izin dari Google.

vatnajokull bluelagoon northern-lights-ronni

Norwegia

Fokus pertama Booth pada Norwegia adalah mengenai kasus Anders Breivik, pelaku pembunuhan total 77 orang  imigran. Hal ini menyebabkan, dan mempertanyakan masa depan multikulturalisme di Norwegia.

Hal menarik dari Norwegia adalah kekayaan minyaknya. Norwegia adalah salah satu negara pengekspor minyak terbesar di dunia. Akan tetapi, hanya 4% keuntungan minyak itu digunakan untuk konsumsi. Sisanya digunakan untuk membeli saham perusahaan di seluruh dunia. Hal ini dilakukan terus menerus hingga Oil Fund menjadi dana asing terbesar di dunia (890 miliar dollar), cukup untuk membuat seluruh penduduk di Norwegia menjadi miliuner. Bijak sekali dalam mengelola keuangan.

Finlandia

Finlandia diceritakan memiliki orang-orang yang introvert, pendiam, dan menyukai kesendirian. Mereka juga memiliki kegemaran untuk minum-minum dan bersauna. Selain itu, sejarah singkat ketika Finlandia berada di bawah Swedia dan ketika berperang menghadapi pasukan dari Rusia juga diceritakan di bab ini. Salah satu highlight dari Finlandia adalah pendidikan. Satu hal yang menjadi penyebab adalah kualitas dari guru yang minimal berpendidikan Master.

Swedia

Bab terakhir bercerita mengenai Swedia. Negara yang katanya dicemburui negara-negara tetangga di atas. Salah satu alasannya adalah adanya industri besar seperti Tetra Pak, H&M, Atlas Copco, Erikssson, Volvo, dan IKEA yang baru buka di Indonesia. Selain itu, isu multikulturalisme juga dibahas, apalagi jumlah imigran di Swedia paling banyak di antara negara Nordic lainnya.

Pada sisa bab ini, Booth juga menjelaskan mengenai stereotipe-stereotipe orang Swedia seperti tidak menyapa dan diam hening di jalan ataupun dalam transportasi umum.

Nah, kalau mengenai Swedia saya bisa memberi tambahan karena berkesempatan tinggal disini kurang lebih 2 tahun untuk belajar.

Kalau untuk pendidikan, universitas seperti KTH, Stockholm University, Uppsala University, dan Lund University masuk ke top universitas di dunia walaupun menurut saya ranking internasional tidak terlalu penting karena kualitas pendidikannya yang sudah merata. Berdasarkan cerita teman saya, seorang yang kuliah di universitas apa, bisa mengambil mata kuliah di universitas lain dengan mudah dengan credit yang bisa ditransfer.

Swedia juga relatif aman, walaupun selama tinggal di sini saya mengalami 3 kejadian tidak mengenakkan: lampu sepeda saya diambil, gembok sepeda saya dirusak (untung sepedanya enggak ikut hilang), dan tas saya hilang diambil ketika sedang makan di restoran cepat saji.

Yah, kurang lebih begitulah isi dari buku ini. Kalau bingung dengan tulisan saya, mungkin bisa membaca bukunya langsung. Tentunya buku ini bukanlah review sosiologi komprehensif tentang bagaimana masyarakat negara Nordic ini menjalani hidupnya. Jika ingin mengetahui bagaimana aslinya kehidupan mereka, bisa sebagai tamu sejenak dengan menjadi turis, ataupun tinggal untuk belajar dan bekerja di salah satu negara tersebut.

Salam.

Whatsapp Chat Analyzer

Jadi ceritanya mahasiswa asal Indonesia yang tinggal di Stockholm menggunakan whatsapp sebagai media komunikasi untuk saling berbagi informasi hingga keluh kesah. Karena jumlah pesertanya yang memang tidak terlalu banyak (20+++), saya rasa, dibanding grup Facebook atau mailing list, group chat whatsapp memang lebih cocok untuk komunikasi yang membutuhkan respons yang relatif cepat.

Berawal dari rasa ingin tahu akan esensi dari pembicaraan di grup whatsapp tersebut, saya pun penasaran dan ingin menganalisis kontennya. Bak gayung bersambut, ternyata whatsapp menyediakan fitur untuk mengarsip pembicaraan dan mengirimkannya lewat email. Caranya cukup tahan percakapan yang ingin diarsip. Kemudian pilih ‘Email conversation’ > ‘Without media’. Gambar di bawah menunjukkan langkah-langkah tersebut. Nama dan tulisan disamarkan untuk menjaga privasi.

archive conversationwithout media

Hasilnya adalah sebuah file text. Setiap pesan chat ditulis pada satu baris dengan format “Tanggal – User: Pesan” (tanpa tanda kutip). Kode python dibawah digunakan untuk membaca file tersebut.

def read(filename):
    """ Read text file containing whatsapp chat and return the list of list of time, author, and its text
    :param filename: the filename of the chat text file
    :return: chat 2d list
    """
    chat = []
    with open(filename, 'r') as f:
        for line in f:
            lines = line.split(' - ')  # Divide between date and the rest
            if len(lines) > 1:
                lines2 = lines[1].split(': ')  # Divide between user and text
                if len(lines2) > 1:
                    speaker = lines2[0]
                    text = lines2[1]
                else:
                    speaker = ''
                    text = lines2[0]
                timestamp = lines[0]
            else:
                timestamp = ''
                speaker = ''
                text = lines[0]
            chat += [[timestamp, speaker, text]]
    return chat

Sip, setelah kita punya datanya, kita bisa geledah dan obrak-abrik isinya untuk dianalisis lebih lanjut.

Statistika dasar

Pertama-pertama. kita ingin tahu ada berapa banyak baris dalam percakapan.

date

Hmmm, ternyata ada sekitar 137 pesan per harinya. Lumayan aktif juga.

Kemudian kita ingin tahu siapa sih yang paling sering bunyi dan siapa yang paling senyap. Kita hitung total berapa banyak pesan yang ditulis per orangnya.

user frequency
Nama dan nomor telepon disamarkan untuk menjaga privasi

Wah, ternyata ada perbedaan yang cukup jomplang antara yang paling sering mengirim pesan dengan yang paling tidak sering mengirim pesan. Bahkan yang nomor 1 jumlah pesannya sekitar 2 kali dari yang nomor 2. Distribusi ini sepertinya mengikuti Zipf’s Law.

Frekuensi kata

Fitur utama dalam analisis dokumen biasanya adalah frekuensi kata. Model ini biasanya dikenal dengan nama Bag-of-Words. Kalau misalkan fitur ini dirasa kurang cukup ekspresif, biasanya ditambah lagi menjadi n-grams model, dimana kata dihitung kemunculannya bersama kata lain.

Dalam analisis dokumen juga biasanya terdapat kata-kata yang frekuensinya tinggi namun tidak memberi makna lebih kepada tulisan, seperti kata hubung dan teman-temannya. Kumpulan kata-kata tersebut sering disebut dengan istilah stopwords. Stopwords ini biasanya dihilangkan sebelum analisis agar proses lebih ringkas dan akurat. Saya memakai daftar kata stopwords dari https://sites.google.com/site/kevinbouge/stopwords-lists yang ternyata mengambil dari thesis “A Study of Stemming Effects on Information Retrieval in Bahasa Indonesia“.

Sekarang kita coba hitung frekuensi kata dalam chat minus stopwords. Histogram hasilnya bisa dilihat di bawah.

word frequency

Hmm, menarik. Ternyata kata-kata yang paling banyak keluar adalah kata sambung yang salah ketik seperti ‘yg‘ dan ‘d‘.  Kata-kata lain yang banyak muncul adalah nama panggilan ke penghuni grup yang lain. Selain itu, ternyata grup ini cukup suka tertawa, terlihat dari 3 kemunculan ekspresi tawa yaitu ‘hahaha‘, ‘wkwk‘, dan ‘haha‘. Selain itu, ternyata grup ini rajin olah raga juga, dilihat dari kata ‘badminton‘ yang muncul lebih dari 200 kali.

Emoji

if a picture paints a thousand words then why can’t I paint you“. Kurang lebih itulah sepenggal lagu If dari Bread. Penggunaan emoji atau emoticon sangat kentara dalam chatting karena satu gambarnya bisa mengekspresikan hal yang sulit jika dicoba disampaikan dengan kata-kata. Penggunaan emoji ini sangat pesat hingga menimbulkan sentimen kalau nanti kita bisa kembali ke zaman Mesir kuno dengan tulisan hieroglyph-nya. Karena umumnya penggunaan emoji ini, saya pun mencoba menghitung frekuensi dari tiap-tiap emoji.

Yang agak menyulitkan mungkin adalah emoji ini direpresentasikan dalam unicode dan di-encode dalam UTF-8 sehingga harus dibuat fungsi konversinya dulu antar keduanya. Gambar untuk plot didapat dari https://github.com/github/gemoji/ yang saya dapat link-nya dari apps.timwhitlock.info/emoji/tables/unicode. Kesulitan lain adalah ternyata Python Image Library punya sedikit untuk png dengan transparency. Apa boleh buat, gambar emoji-nya pun harus saya konversi ke jpg dengan utilitas mogrify dari imagemagick. Histogram hasilnya bisa dilihat di gambar di bawah.

emoji frequency

Hmm, menarik. Bisa dilihat, emoji teratas adalah senyum sambil berkeringat yang saya baca sebagai ekspresi dari ‘hehe’. Sisanya adalah berbagai ekspresi untuk senyum dan tertawa. Tetapi emoji ke 3 yang agak aneh. Mata. Ada apa dengan mata? Emoji ke 8, ‘see no evil monkey’ juga aneh. Apakah ada hubungannya dengan emoji ke 3?

Topik

Target berikutnya adalah Topic modelling. Lazimnya, setahu saya ini memakai teknik Latent Dirichlet Allocation (LDA). Karena saya belum pernah implementasi teknik ini sebelumnya dan kekurangan waktu untuk mencoba, saya mencoba mencari apakah ada library lain siap pakai. Saya ketemu situs startup untuk klasifikasi teks http://www.monkeylearn.com/. Di situs tersebut terdapat servis untuk melakukan klasifikasi topik dokumen secara general. Untuk free account diberikan 1000 kali panggilan API. Yah, cukuplah untuk proyek kecil-kecilan ini.

monkeylearn1monkeylearn2

Karena model-nya dibangun dari korpus Bahasa Inggris, maka teks harus diterjemahkan dulu ke bahasa tersebut. Hal ini sebenarnya bisa mengurangi akurasi, akan tetapi akurasi bukan tujuan utama yang dicari. Pilihan pertama saya, Google Translate API, ternyata tidak gratis. Ini tentunya cukup memberatkan saya yang cuma mahasiswa. Saya pun memakai layanan alternatif dari Yandex, search engine buatan Rusia.

topic

Dan inilah hasilnya. Ternyata percakapan di grup whatsapp ini dikategorikan ke ‘Entertainment & Recreation’. Hmm, bisa jadi. Yang agak aneh adalah kategori kedua, ‘Anime’, yang merupakan subkategori dari Entertainment di atas karena seingat saya tidak ada diskusi tentang anime sama sekali di grup. Hmm, inilah sulitnya memakai model buatan orang. Sulit untuk dianalisis.

Sebenarnya masih ada lagi yang mau saya coba, seperti menggunakan t-SNE untuk melihat kemiripan antar user. Namun, apa daya TTM (thesis telah memanggil).

Kode lengkap dapat dilihat di https://github.com/mitbal/wca. Cukup ikuti petunjuk di README untuk menjalankan program.

Semoga bermanfaat. Salam.

2015

2014 sudah berlalu. Ini rapor saya dalam hal menulis di blog dan coding di github.

pos blog

 

github2

Target 2015? Dua kali lipatkan hasil sebelumnya. Semoga tidak terlalu muluk.

Sampai jumpa di 2016.

Stockholm

Stockholm is a dark and cold place.

Kurang lebih itulah yang dikatakan oleh bapak2 pengurus museum Nobel yang memberikan kata sambutan pada acara acara Welcome Reception dari KTH kepada mahasiswa internasional, 15 purnama yang lalu, di Stockholm City Hall. Saya yang baru datang beberapa hari yang lalu seakan terhenyak. Karena sejak saya datang hingga hari itu, Stockholm saya rasakan dalam cahaya yang berbeda. Hangat serta sejuk, walau matahari bersinar begitu teriknya.

Hal itu akhirnya saya rasakan ketika kegelapan menyelimuti Stockholm dari musim gugur hingga 6 bulan ke depan. Dark karena awan tampaknya selalu menggentayangi langit. Cold karena suhu dari bulan Oktober sudah bergelayut di satu digit derajat. Terkadang kabut pekat juga turut menyelimuti sekujur kota. Tidak heran kalau ada mitos yang menyatakan kalau tingkat bunuh diri di Swedia tinggi, walaupun merupakan salah satu negara yang paling bahagia di dunia. Izinkan saya tumpahkan perasaan saya ke dalam puisi.

Matahari tak pernah benar-benar terbit

Dia hanya mengintip dari sela-sela awan yang sempit

Dapatkah kurasakan paparan sinarnya lagi

Perasaan hangat yang kini telah pergi

Mohon maaf kalau puisinya kurang bagus. Maklum dulu S1 saya gelarnya S.Kom alias Sastra Komputer. Untungnya Stockholm dapat kembali dinikmati pada waktu musim panas. Tapi keluhannya sekarang adalah waktu puasa yang lama. Haha, dasar saya yang memang kurang bersyukur.

the_mist
Asap kebakaran hutan Riau baru sampai utara, atau adegan dari film The Mist…

 

Walaupun Stockholm itu sangat indah, tetapi menurut saya ini bukan kota turis yang mempunyai banyak atraksi dibandingkan kota tujuan turis populer lainnya. Meme di bawah mungkin bisa sedikit mengilustrasikan keadaan Stockholm.

Stockhom tourist

Walaupun begitu, jika Anda terlanjur datang berikut tempat yang bisa dikunjungi. Saya kompilasi agar kalau ada yang tanya bisa saya arahkan langsung ke tulisan ini kalau misalkan dia tidak percaya dengan rekomendasi dari trip advisor atau wikitravel.

1. Central, Sergels Torg dan sekitarnya.

Kalau misalkan Anda datang dengan menggunakan pesawat dan turun di bandara Arlanda, atau bis flyggbussarna dari bandara Skavsta, maka Anda akan sampai di Central Stockholm yang merupakan gabungan dari terminal bis (Terminalen), stasiun kereta (Central Station), dan stasiun kereta bawah tanah (T-Centralen). Di Sergels Torg ini yang bisa dilihat antara lain tugu Sergels (bukan nama sebenarnya) dan gedung Kulturhuset yang berisi perpus, teater, cafe, dan miniatur Stockholm.

20140315_171447

20141026_163100
Suka dipakai sebagai tempat demo. Untung berjalan tertib dan tidak rusuh.

 

Pusat pertokoan dan perbelanjaan (H & M, Intersport, Clas Ohlsson) juga dapat dinikmati di sini.

2. Drottninggatan

Dari Sergels Torg, lanjutkan perjalanan menuju kota tua melalui jalan Drottninggatan (Jalan Ratu jika diterjemahkan). Oleh-oleh standar seperti helm Viking bertanduk (walau aslinya cuma mitos) dapat dibeli di sini.

DSC00722

3. Gamla Stan

Gamla Stan memiliki arti Kota Tua. Istana Raja (Royal Palace), gedung Parlemen Swedia (Riksdag), dan museum Nobel dapat dilihat di sini selain Anda menikmati jalan gang sempit di tengah bebatuan bangunan tua.

20140315_170121

 

20140315_170455

4. Stadhuset

Stadhuset, atau Stockholm Public Hall, adalah salah satu landmark andalan kota Stockholm. Tempat ini mungkin paling terkenal sebagai tempat pesta jamuan makan malam untuk pesta Nobel setiap tahunnya.

DSC01145

DSC01135
in the Golden Hall of Mountain King

 

6. Katarina Hissen

Kunjungi Katarina Hissen untuk mendapatkan pemandangan tertinggi di tengah kota Stockholm. Katarina Hissen, yang dialihbahasakan menjadi Lift Katarina, dapat dicapai di Slussen.

DSC00877r

 

DSC01643

Jangan lupa ketika di Stockholm untuk makan di restoran dengan cita rasa lokal, Max. Konon burger-nya paling enak se-Skandinavia. Selain murah dan enak, ada Wi-Fi gratis yang mungkin jarang bisa ditemui di tempat lain di Stockholm.

Selamat jalan-jalan. Salam.

Pemilu Presiden Indonesia 2014: Pendekatan Pembelajaran Mesin

Pemilihan Umum Presiden Indonesia tahun 2014 sudah berakhir. Kalau boleh saya bilang ini pemilu presiden paling ramai yang pernah saya ikuti (walaupun saya belum ikut banyak pemilu sebenarnya, baru 2 kali sejak dapat KTP 7 tahun lalu). Orang berantem setiap hari di media sosial karena beda pilihan presiden (Facebook belum terlalu beken lima tahun lalu kayaknya). Yang bikin kurang sedap adalah banyak munculnya berita/tudingan/tuduhan yang kebenarannya tidak dapat dipertanggungjawabkan. Setelah saya pikir-pikir, mungkin hal-hal seperti ini ada baiknya juga sebagai bahan pembelajaran untuk kita semua warga Indonesia agar semakin cerdas dan dewasa, salah satunya dalam masalah politik. Nanti ke depannya, pada pemilu yang berikutnya misalnya, kita bisa memilih dan menyikap dengan lebih bijak.

Kebetulan saya kemarin bertugas menjadi salah satu petugas pelaksana pemilu luar negeri (PPLN) untuk negara Stockholm dan Latvia. Pemilu di luar negeri tentunya mempunyai nuansa yang agak berbeda dibandingkan di dalam negeri. Di luar negeri, penggunaan hak pilih dapat dilakukan melalui pos atau datang langsung ke TPS.

Jumlah pemilih di seluruh Swedia mencapai sekitar 700an. Untuk TPS, di Stockholm ada 1 TPS yang didirikan di Wisma Duta KBRI Stockholm. Alhamdulillah pemilu berjalan lancar sampai akhir. Hasil penghitungan akhir dapat dilihat di http://indonesiskaambassaden.se/hasil-pemilu/.

Persiapan dan pelaksanaannya sendiri tidak terlalu susah. Yang paling sulit mungkin adalah masalah pendataan pemilih yang datanya sudah tidak valid (sudah pindah atau ganti kewarganegaraan) atau tidak terdaftar sebagai pemilih karena tidak melapor ketika datang ke KBRI Swedia. Mungkin solusinya bisa menggunakan personnummer?

tps
TPS di Stockholm. Sepi ya, enggak kayak di Hong Kong.
20140909_120934
Perlengkapan pemilu untuk yang memilih lewat pos.

Ketatnya pemilu kali ini memunculkan wacana “kawal pemilu” untuk menjaga agar tidak terjadi kecurangan. Bak gayung bersambut, KPU ternyata juga menyediakan hasil scan formulir C1 yang berisi hasil penghitungan suara di situsnya https://pemilu2014.kpu.go.id/c1.php. Bermunculanlah karyakarya orang-orang kreatif dan inisiatif Indonesia di seantero dunia yang menyediakan sarana bagi masyarakat untuk merekapitulasi suara dari form C1. Fenomena ini dijabarkan dengan apik oleh dosen saya Pak Ruli di sini: http://theconversation.com/open-election-data-mass-interaction-indonesian-public-as-watchdog-29450.

Fenomena ini sangat positif, apalagi mungkin bagi para pakar e-government yang mendukung open data. Akan tetapi, karena bidang ilmu saya adalah Machine Learning, saya melihat upaya crowdsourcing ini dalam cahaya yang berbeda. Saya melihat ini adalah kesempatan untuk mendapatkan data dengan labelnya yang nantinya bisa dipakai untuk supervised learning.

Data adalah hal yang berlimpah ruah di era internet seperti sekarang. Akan tetapi, kebanyakan data-data yang tersedia tersebut bersifat unsupervised atau tidak ada label yang menunjukkan bahwa data tersebut termasuk ke kategori apa. Pada zaman dahulu kala, biasanya data harus diklasifikasikan manual oleh expert (Kalau contohnya pengkategorian objek pada gambar, maka manusia, asal punya akal sehat, menjadi expert-nya. Kalau misalkan data medis, maka harus dokter yang melakukan proses labelling).

Di era sekarang, biasanya dataset dibuat disusun dengan menggunakan jasa crowdsourcing berbayar seperti misalnya Amazon Mechanical Turk (walau tetap harus disupervisi). Contoh datasetnya misalkan Image-Net dan Microsoft COCO. Tapi tetap yang bisa membuat dataset adalah institusi riset yang mempunyai funding atau korporasi besar yang memiliki kapital yang besar juga (Coba bayangkan berapa biaya yang dikeluarkan Microsoft untuk mengumpulkan data hingga ratusan ribu gambar ketika mendesain algoritma deteksi skeleton untuk Kinect).

Oleh karena itu, ini adalah kesempatan emas untuk mendapatkan data tulisan tangan digit angka orang Indonesia dengan jumlah yang banyak. Dalam satu form C1 terdapat 12 angka. Jika dikalikan dengan jumlah TPS yang mencapai lebih dari 400 ribu maka total kita bisa mendapatkan data training sebanyak hampir 5 juta data. Sebagai pembanding, data handwritten digit yang sering dipakai untuk benchmarking performa algoritma machine learning baru, MNIST (walaupun ini sebenarnya hanya subset dari dataset yang lebih besar lagi ukurannya), memiliki jumlah 60.000 data untuk training dan 10.000 data untuk testing.

Berangkat dari motivasi di atas, maka saya memutuskan untuk mencoba mengekstraksi gambar tulisan angka dari gambar dan mengumpulkannya menjadi sebuah dataset kemudian melakukan eksplorasi dan eksperimen klasifikasi dengan machine learning sehingga nantinya mungkin bisa dibuat program yang otomatis akan menghitung rekap suara hanya dengan meng-upload gambar C1. Ini saya kerjakan pada liburan musim panas kemarin disambung sela-sela kuliah semester ganjil sekarang.

Akuisisi Data

Ada beberapa situs yang menyediakan jasa crowdsourcing yang bisa dipilih. Saya memilih kawalpemilu.org karena sepertinya ini yang paling lengkap (kawalpemilu.org menyelesaikan scan C1 dari 478.685 TPS yang tersebar di seluruh Indonesia dengan mengandalkan tenaga 700an relawan dalam waktu kira-kira lima hari) dan sepertinya datanya dapat dengan mudah diekstrak (halamannya cuma pakai tag table jadi saya kira cukup parsing halaman HTML saja). Saya putuskan saya harus men-download dulu semua file gambar dan rekap karena saya tidak tahu sampai kapan data tersebut akan dibuka.

Ekspektasi kedua saya ternyata salah karena situs kawalpemilu adalah satu halaman aplikasi javascript. Tetapi setelah menengok isi source code-nya, ternyata hasil rekap bisa dirikues dari webservice (yang di-host di Google Apps Engine) dalam format json. Dari source code saya juga menjadi tahu kalau scan C1 juga dapat dirikues ke server dengan cukup menyediakan nama file dengan format nomor daerah sebanyak 7 digit, nomor tps di daerah tersebut sebanyak 3 digit, dan angka yang menunjukkan halaman C1 yang diminta, dari 01 sampai 04 (yang diperlukan halaman keempat).

Kurang lebih potongan kode untuk men-download semua file adalah sebagai berikut (file scrap.py)

import requests as req

def prefix_pad(s, n):
    """ Prepend string s with 0 until it has length of n
    :param s: The string to be prepended
    :param n: The final length of prepended string
    :return: The prepended string
    """
    while len(s) < n:
        s = '0' + s
    return s

def image_filename(i, j):
    """ Prepare the KPU formatted image filename
    :param i: the area code
    :param j: the station code
    :return: The formatted filename
    """
    return prefix_pad(i, 7) + prefix_pad(j, 3) + '04'

# Loop for every area in Indonesia
start_area = 1
end_area = 80000
tps = 0
for i in xrange(start_area, end_area):
    print 'Now donwloading data from area: ', i
    r = req.get('http://kawal-pemilu.appspot.com/api/tps/' + str(i))

    if r.text == 'Error':
        continue

    json = r.json()
    for j in xrange(len(json)):
        # Check to see whether there is no error in json and also there is vote count data inside
        if json[j][6] and json[j][7] == '0':
            # Download C1 scanned image
            print 'TPS ke: ', tps
            imfname = image_filename(str(i), str(j + 1))
            imreq = req.get('http://scanc1.kpu.go.id/viewp.php?f=' + imfname + '.jpg')

            # Save to file
            f = open('scrap/' + str(i) + '_' + str(j) + '.txt', 'w')
            f.write('prabowo, jokowi, suara sah, tidak sah' + '\n')
            prabowo_count = str(json[j][2])
            jokowi_count = str(json[j][3])
            valid_count = str(json[j][4])
            invalid_count = str(json[j][5])
            f.write(prabowo_count + ',' + jokowi_count + ',' + valid_count + ',' + invalid_count)
            f.close()
            f = open('scrap/' + str(i) + '_' + str(j) + '.jpg', 'wb')
            f.write(imreq.content)
            f.close()
            tps += 1

Setelah kode tersebut dieksekusi, butuh waktu hingga 3 minggu untuk men-download semua file gambar dan rekap json. Programnya sendiri harus di-restart beberapa kali. Hasil akhirnya adalah File gambar dengan jumlah cukup banyak sekitar 417 ribu dengan ukuran total 60 gigabytes yang sementara tersimpan dengan aman di harddisk eksternal saya. Setelah melakukan bersih-bersih dengan menghapus data yang korup, sekarang kita bisa melakukan hal-hal menarik terhadap data yang kita punya.

c1
Contoh beberapa file scan form C1 yang diunduh. Hampir semua gambar memiliki ukuran, resolusi, dan kondisi yang beraneka ragam seperti terbalik atau tertukan dengan halaman lain. Hal-hal seperti ini yang mempersulit proses ekstraksi nantinya.

Ektraksi Data

Menentukan Region of Interest.

Untuk mempercepat proses komputasi dalam mengekstrak angka yang ada di dalam gambar, kita potong gambar hingga hanya menjadi region of interest-nya saja. Hal yang mempersulit adalah resolusi gambar yang berbeda-beda. Jika harus ditangani satu per satu maka kode-nya bisa meledak. Setelah melakukan investigasi singkat, kira-kira ada 3 jenis ukuran resolusi, kecil, sedang, dan tinggi. Saya buatlah aturan yang mudah-mudahan mengakomodir semua gambar.

    dim = c1.shape
    y0 = 350
    y1 = y0 + 450
    if dim[0] < 1100:
        y0 = dim[0] * 300 / 1700
        y1 = y0 + dim[0] * 400 / 1700
    elif 1700 < dim[0] < 2400:
        y0 = 350
        y1 = y0 + 450
    else:
        y0 = dim[0] * 350 / 1700
        y1 = y0 + dim[0] * 450 / 1700
    x0 = dim[1] * 19 / 24

Ekstraksi Digit

Setelah kita mendapatkan area yang mengandung rekap suara, proses ekstraksi dapat dilakukan dengan mudah dan cepat. Ada 2 pendekatan yang saya gunakan. Pertama, ekstraksi menggunakan Hough transform yang mengambil inspirasi dari sini sudokugrab.blogspot.se/2009/07/how-does-it-all-work.html. Pendekatan kedua menggunakan Harris corner detection.

Extraction based Hough transform

Pertama, gambar perlu di-threshold menggunakan Otsu threshold untuk mendapatkan edge dari gambar. Tidak perlu teknik sulit-sulit macam Canny edge detection, karena gambar relatif bebas dari noise dan tidak terlalu kompleks.

Kemudian kita panggil fungsi untuk melakukan Hough transform. Dari Hough space ini kita bisa mendapat semua garis yag ada di gambar. Dari semua garis yang didapat, kita seleksi 4 garis yang paling dekat dengan sisi terluar gambar (2 vertikal, 2 horizontal). Dari pasangan garis tadi kita hitung titik perpotongan antara garis vertikal dan horizontal untuk mendapat pojok terluar dari kotak rekap.

Setelah mendapat 4 pojok dari kotak, kita lakukan transformasi Affine. Transformasi ini bisa dalam bentuk skala, rotasi, dan translasi di mana garis paralel sebelum transformasi akan tetap paralel setelah transformasi. Kita transformasi agar orientasinya lurus dan ukurannya seragam semua 400 x 150. Setelah ditransformasi cukup dipotong kotak-kotak sebanyak 12.

ekstrak digit
Tahapan proses, dimulai dari region of interest, thresholding, hough transform, dan terakhir transformasi.

 

Extraction based Harris corner

Berbeda dengan pendekatan menggunakan Hough transform, dengan corner detection kita sudah otomatis mendapatkan titik-titik yang potensial menjadi ujung dari kotak rekap suara tanpa harus melewati pencarian garis terlebih dahulu. Selanjutnya cukup mencari titik yang terdekat dengan keempat ujung gambar. Transformasi yang sama juga dilakukan setelah itu.

Akan tetapi setelah melihat hasil empiris, maka saya lebih memilih teknik Hough transform karena file gambar hasil akhir lebih rapi dibanding dengan corner detection. Hal ini ditengarai karena corner dapat terdeteksi pada posisi-posisi yang salah dan ini mengakibatkan angka setelah ditransformasi menjadi terdistorsi.

Batch process

Setelah sukses melakukan ekstraksi pada satu gambar C1, berikutnya proses ekstraksi  akan dijalankan ke semua gambar scan C1. Niatnya  awalnya ke semua gambar, tapi saya jalankan untuk 100.000 data pertama dahulu.

Hasil akhirnya ratusan ribu gambar angka berhasil terekstrak. Tetapi ternyata banyak gambar-gambar yang rusak karena salah ekstraksi (region of interest-nya salah sehingga kotak yang berisi angka tidak berhasil ditemukan atau terpotong). Oleh karena itu masih diperlukan seleksi secara manual (walaupun sebenarnya cepat untuk dilakukan, cukup Ctrl+X Ctrl+V, tapi membosankan untuk dilakukan). Hasil sementara ada 11 kelas (0 sampai 9 tambah kelas khusus X untuk digit ratusan atau puluhan yang nilai tidak sampai situ) dengan masing-masing kelas mempunyai 2000 data. Masih ada banyak lagi data yang bisa diambil, mungkin solusinya perlu di-crowdsourcing juga.

Semua proses di atas ada dalam modul extract.py di repositori.

digit.pn
Contoh subset dataset dengan 100 data per kelas. Datanya lumayan variatif kan…

Training & Testing

Setelah kita mendapatkan data per kelas yang cukup banyak kita bisa memulai proses training. Untuk proses ini saya menggunakan framework machine learning favorit saya, Weka. Weka men-support banyak algoritma serta memiliki kemampuan untuk menyimpan dan memuat model hasil pelatihan sebelumnya. Untuk eksperimen awal ini, kita coba menggunakan data yang masih raw dan classifier nearest neighbor (di weka namanya adalah IB1). Kita coba pada dataset yang kecil terlebih dahulu, dengan ukuran 500 instance per kelas.

weka load data
500 data per kelas, masing-masing data memiliki 5000 fitur.

Dengan skema 10-fold cross validation, akurasi yang didapatkan adalah sekitar 60%. Hmm, tidak terlalu buruk. Tentunya hasil akurasi di atas bisa ditingkatkan lebih lanjut, dengan menggunakan teknik-teknik ekstraksi fitur yang lebih canggih atau menggunakan classifier yang lebih powerful dan dilakukan fine tuning hingga hanya memiliki error yang sangat kecil.

weka run
Hasil klasifikasi dalam bentuk akurasi dan confusion matrix.

Terakhir, kita buat tampilan grafik yang digunakan untuk memuat dan melakukan ekstraksi dan klasifikasi digit dengan model yang telah didapatkan. GUI dibuat dengan Tkinter.

gui
Tampilan GUI awal; setelah me-load scan lembar C1 dan model; serta setelah diproses.

Kalau dilihat-lihat hasilnya ada salah prediksi untuk angka 2 dan karakter X. Yah, lumayanlah…

Penutup

Demikian kira-kira bagaimana ilmu machine learning bisa ikut-ikutan pada hajatan pemilu 2014. Kalau kawalpemilu butuh 5 hari untuk merekap semua suara, maka dengan bantuan komputer seharusnya itu bisa selesai lebih cepat lagi. Jika ada yang mempunyai ide berbeda untuk tahap pengekstrakan agar lebih efektif, bisa langsung dengan me-fork repositori dan langsung implementasi atau langsung kirim email untuk berdiskusi.

Untuk file dataset dapat di-download di http://db.orangedox.com/ontgRUzd9EjjlxZVoD/11c_2000i.zip. Kalau perlu gunakan module prepare_input.py untuk membaca file gambar dan menjadikannya ke file CSV yang siap diproses di Weka.

Rencananya akan saya update begitu saya bisa memisahkan lebih banyak data lagi per kelasnya. Sementara kode untuk semua bisa dilihat di repository github: https://github.com/mitbal/pemilu

Post-post berikutnya kita akan membahas metode ekstraksi fitur dan klasifikasi yang lebih powerful. Mudah-mudahan bisa coba sampai metode representasi fitur yang state-of-the-art macam fitur CNN.

Semoga berguna. Salam.

ICPR

International Conference on Pattern Recognition (ICPR) 2014 diadakan di Stockholm pada tanggal 24-28 Agustus silam. ICPR merupakan salah satu konferensi di bidang Pattern Recognition dan Machine Learning yang terbesar, selain Neural Information Processing Systems (NIPS) dan International Conference on Machine Learning (ICML) atau saudaranya di bidang Computer Vision seperti Computer Vision and Pattern Recognition (CVPR), International Conference on Computer Vision (ICCV), dan European Conference on Computer Vision (ECCV). Tempat penyelenggaraannya adalah di Waterfront Congress center yang terletak di jantung kota Stockholm

Pada tahun ini penyelenggaranya adalah Uppsala University, Lund University, dan Linkoping University. Kebetulan salah satu chair pada konferensi tersebut adalah professor dari KTH. Maka dibukalah penawaran relawan untuk membantu penyelenggaran konferensi ini kepada semua mahasiswa yang mengambil kelas Image Analysis and Computer Vision tahun 2013 lalu. Karena tertarik maka saya ikut mendaftar menjadi salah satu dari relawan.

Tugas dari relawan antara lain adalah: menjaga registration desk, menjadi guide selama acara konferensi berlangsung, menjaga ruang penitipan jaket (plus tas dan barang lain-lain) atau cloak room, membantu pada sesi presentasi dengan mendistribusikan mic untuk presenter dan pada saat sesi tanya jawab, dan membantu memasang serta melepas poster. Relawan tidak mendapatkan upah, namun memiliki keuntungan bisa mengikuti seluruh kegiatan konferensi, termasuk acara banquet yang konon biaya totalnya bisa mencapai lebih dari 10000 SEK.

conference gears
Conference gears, yang antara lain isinya buku program, name tag, tas, dan flash disk berisi proceeding. Kaus keren eksklusif hanya didapat oleh relawan.

Seperti konferensi pada umumnya, terdapat plenary speech dari invited speaker yang merupakan expert pada bidangnya. Terdapat juga oral session untuk sekitar 200an paper yang diterima dan 600an paper untuk poster session. Sayang sekali saya tidak menemukan orang Indonesia yang presentasi di sini.

20140828_143611
Professor Stan Z. Li dari National Laboratory of Pattern Recognition memberikan plenary speech pada hari terakhir mengenai perkembangan terkini dari face recognition.
poster session
Sesi poster
oral session
Sesi presentasi oral. Yang di kiri belum banyak orang karena belum mulai.

Ada satu poster menarik tentang iris spoofing yang menyebutkan Indonesia di bagian latar belakangnya. Saya ingat ketika mengambil data untuk eKTP salah satu yang diambil adalah iris, tapi belum tahu kalau ternyata teknologi iris recognition sudah dipakai.

indonesia poster

Pada hari ketiga malam harinya diadakan banquet atau gala dinner. Acara diisi dengan penyerahan penghargaan untuk Best Paper dari semua track, serta pengangkatan presiden baru untuk International Association of Pattern Recognition (IAPR).

banquette
Menu santap malam. Pembuka: Marinated Char, Utama: Crispy Duck Breast, Penutup: Chocolate and Truffle Cake. Makanannya enak walaupun daging bebeknya terlalu kenyal (kata saya).

Acara ditutup dengan hiburan dari grup musik asal Swedia, Timoteij.

20140827_225558

ICPR yang berikutnya akan diadakan tahun 2016 di Cancun, Mexico. Semoga dapat kesempatan lagi untuk mengikuti.

cancunn
Stand ICPR 2016 dan foto cakep Cancun dari atas tempat lokasi penyelenggaraan yang saya ambil dari 500px.com

Foto (yang ada sayanya aja)

2014-08-28 213531
Foto relawan bersama. Karena tidak semua relawan bisa bertugas setiap hari, maka yang difoto ini adalah yang kebetulan ada hari Rabu saja.
IMG_1009-m
Briefing satu hari sebelum penyelenggaraan.
2014-08-25 185450
Mengumpulkan tiket masuk untuk welcome reception di Stockholm city hall.

Galeri foto lainnya bisa dilihat di http://www.cb.uu.se/~kristina/ICPR/demo.php