Fixing: “Warning: Single line Edit Controls can not have multi-line text”

[inf.retrieval|t.komputer|lab.soft|pert.8]

This problem appears when someone tries to send the result to edit text. The warning is shown in command window and the edit text in GUI is also disappeared. First we should understand that Matlab has two kinds of text format: string and cell. The cell cannot be presented, except you transpose it. But the edit text will show the text in column based. Only the string/char format can be presented in row based (see the picture below showing the string and cell).

Some text processing methods need conversion from string to cell. Therefore, the manipulation should be done in order to show the text in edit text. The algorithm are as follow:

  • Input: cell
  • Output: string in row
  • Use function char to convert cell into character
  • Transpose the characters
  • Use function sprintf to print the characters in row based

This simple method can be solve the warning above. As an impormation, some text manipulation need conversion from cell to char and vice versa, e.g. regexp (regular expression function). I hope this information is useful. This is an output when I stemmed to remove suffix (‘ber’) except when the root-word below 4 characters (e.g. “dua” from “berdua”)

Iklan

Menyiapkan Data Citra Untuk Pelatihan JST

[peng.citra|t.komputer|lab.hardware|pert.9]

Berikut ini contoh menyiapkan data training dan target sebagai masukan proses pelatihan pada Jaringan Syaraf Tiruan (JST). Kasusnya mirip dengan postingan yang lalu, hanya saja di sini kita coba dengan gambar/citra sesungguhnya. Bagaimana membuat data training dengan GUI agar lebih mudah menyiapkan datanya? Selain itu tentu saja terhindar dari kesalahan manusiawi (human error) ketika meramu data-nya.

Membuat GUI Pemrosesan Citra

Secara sederhana dan praktis data dibuat dengan paint bawaan Windows. Misalnya sistem yang dibuat mampu menebak angka 0, 1, hingga 5 saja. Tiap angka digambar sebanyak lima kali, beri nama misalnya 1a, 1b, .. dan seterusnya.

JST memisahkan data dengan target. Jadi data latih dari 0 hingga 5 dengan masing-masing angka lima gambar harus disediakan. Totalnya adalah 6×5 atau 30 data latih, begitu juga targetnya. Misal kita buat GUI sebagai berikut.

Algoritma

Prinsip kerja sederhana dari data yang akan dilatih adalah dengan membuat hubungan satu-satu antara data latih dengan targetnya. Jadi satu record citra yang sudah diolah dikonversi menjadi vektor baris (satu baris terdiri dari beberapa kolom) dibuatkan targetnya dengan indeks baris yang sama.

Pem-Vektor-an

Input: Citra

Output: Vector Citra

  • Ambil citra
  • Jadikan hitam putih
  • Jadikan biner
  • Perkecil, misal 20%
  • Jadikan vektor

Kode di bawah ini salah satu contoh menyimpan hasil pemvektoran data citra.

  • [img,file]=uigetfile(‘*.jpg’)
  • image=imread(img)
  • % pemrosesan citra
  • % jadi hitam putih
  • image=rgb2gray(image)
  • % jadi biner
  • image=im2bw(image)
  • % perkecil 20%
  • [baris,kolom]=size(image) %cari ukuran
  • image=imresize(image,[round(baris*0.2) round(kolom*0.2)]);
  • imshow(image)
  • % cek ukuran yg baru
  • [baris,kolom]=size(image)
  • % jadi vektor
  • image=reshape(image,1,(baris*kolom),[])
  • handles.image=image;
  • guidata(hObject,handles)
  • [baris,kolom]=size(image)
  • simpan=img(1:2)
  • save(simpan,’image’)

Simpan Vektor Hasil Pemrosesan

Salah satu hal sepele tetapi merepotkan adalah menyimpan vektor hasilnya. Di sini fungsi simpan=img(1:2) akan menyimpan vektor dengan nama yang sama dengan gambar yang diambil, tetapi hanya depannya saja (satu sampai dua karakter) karena ekstensinya beda (*.mat).

Setelah citra diambil dan diolah menjadi vektor, selain ditampilkan hasil prosesnya (biner dan diperkecil 20%) pastikan di folder tersimpan file matlab dengan nama yang sama dengan nama citra awalnya (hanya ekstensinya yang berbeda). Tinggal nanti seluruh file hasil pemvektoran digabung menjadi satu data latih beserta satu buah data label/targetnya. Sekian, semoga bermanfaat.

Peer-to-Peer System vs Mediator

Generasi seusia saya pasti pernah mengalami dengar musik lewat kaset, CD, hingga DVD. Namun masih kah dengan cara yang sama saat ini? Masih, mungkin hanya hadiah album dari KFC atau siswa yang mengumpulkan laporan skripsi ke kampus. Mengapa hal ini terjadi? Jawabannya adalah ditemukannya konsep Peer-to-Peer di tahun 90-an.

Nasib Para Mediator

Mediator di sini adalah penghubung antara satu pihak dengan pihak lainnya, produsen dengan konsumen, penjual dengan pembeli, baik barang maupun jasa. Seperti contoh di atas, mediatornya adalah produsen musik waktu itu. Penyanyi kontrak dengan produser, kaset/CD dijual dan hasil dibagi antara produsen dengan penyanyi. Ketika era digital melanda, seorang pemilik bisa membagi file dengan orang lain dan ini dengan mudah dilakukan di era 2000-an ketika network kian murah dan kian cepat. Bahkan seorang penyanyi bisa langsung mengirimkan hasil karyanya ke pendengar langsung, tentu bukan dengan mediator produser melainkan sebuah teknologi peer-to-peer, sebagai contoh adalah NAPSTAR. Mungkin di musik agak kurang “smooth” karena ada unsur pembajakannya, walaupun sekedar berbagi pakai. Contoh lain adalah konsumen, misalnya ingin membeli komponen kendaraan, maka dengan mudah dapat dilakukan tanpa ke bengkel/toko sparepart melainkan langsung ke pabriknya dengan mediator yang baru yaitu sistem online.

Peer-to-Peer System

Sistem ini merupakan sistem terdistribusi dengan tiap node bisa berupa PC, laptop, HP dan lain-lain yang terhubung ke jaringan dengan menerima aturan-aturan yang ditetapkan bersama. Prinsip ini bisa menghubungkan produsen dengan konsumen langsung. Jadi banyak mediator yang tadinya sebagai penghubung mereka tidak digunakan lagi (bidang transportasi, keuangan, dan lain-lain). Juga dengan lembaga pendidikan?

Ketika putri saya kelas 6, saya memasukan ke bimbingan belajar ternama di Indonesia. Entah kenapa sebagian rekannya keluar karena orang tuanya tidak melihat adanya kemajuan. Anak teman saya juga ketika dikursuskan di bimbingan belajar yang lainnya malah keluar dengan sendirinya dan minta daftar ke situs yang menyediakan bimbingan belajar online, dan hasilnya pun oke. Jika tujuannya pemahaman atau transfer pengetahuan, hubungan langsung peserta didik dengan tutor bisa dilaksanakan tanpa mediator fisik (bimbingan belajar) yang terbatas ruang dan waktu.

Break sebentar nulisnya … abang driver online sudah tiba membawa jus pesanan. Lagi-lagi contoh aplikasi online yang menghubungkan produsen jus dengan konsumen.

Seberapa Mediator kah Anda?

Karena pertanyaan aneh, jadinya sulit dijawab. Ambil saja contoh toko-toko komputer di kawasan glodok yang menjadi perantara produsen laptop/hp sudah merasakannya (termasuk juga department store kabarnya). Beberapa bisa bertahan karena level mediatornya rendah, alias menyediakan juga servis, tukar tambah, dan lain-lain yang memang tidak terlalu melibatkan pihak produsen. Di sini toko itu sendiri yang menjadi produsen yang berjenis jasa (perbaikan). Bagaimana dengan kampus/sekolah dan Dosen/guru? Silahkan jawab sendiri dengan cara analisa seperti contoh di atas. Mahasiswa sudah jelas jadi konsumen (semoga industri jadi konsumen juga), siapakah produsennya, kampus/sekolah atau dosen/guru? Ataukah keduanya mediator dengan pihak lain (unknown) sebagai produsen? Wah. Ada baiknya lihat video Youtube siswa 12 tahun sebagai app developer tentang guru-guru di sekolahnya. (https://www.youtube.com/watch?v=Fkd9TWUtFm0). Sekian semoga menginspirasi.

Form Transaksi – Antara Teori dan Praktek di Lapangan

[s.basis.data|akuntansi|lab.soft|pert.9]

Diagram ERD di bawah ini menunjukan transaksi pembelian barang ke suplier dengan relasi many to many. Perlu diketahui bahwa ERD dalam perancangan basis data masuk dalam wilayah konsep. Banyak mahasiswa yang rancu dalam memahami perancangan dari sisi konsep dengan implementasinya berupa pentabelan (record structure).

Secara teori (lihat buku Elmasri tentang basis data) ERD di atas harus dimodifikasi untuk pentabelannya mengingat dalam satu record di tabel pembelian di atas tidak bisa memiliki lebih dari satu isian, alias multi-valued. Namun perkembangan terkini kabarnya basis data objek bisa mengakomodir hal tersebut. Namun untuk database relasional perlu tambahan tabel yang dibahas di postingan ini. Ada sedikit polemik antara teori dengan praktek.

Komposit Primary Key

Dengan database management system (DBMS) sederhana, misalnya access, ERD di atas secara teoritis dibentuk relasi berikut:

Bentuk Form transaksinya dengan Access kira-kira seperti di bawah ini:

Dalam tabel detil nanti ada dua isian yaitu 6 + b001 dan 6 + b002. Jika KdBarang diisi barang yang sama, misalnya b001 semua, maka sistem akan menolak karena dalam tabel detil pembelian ada dua record yang sama (6+b001 dua kali). Karena seharusnya 6 + b001 diisi satu kali dengan jumlah dua (jika masing-masing tadi berjumlah satu). Bentuk record detilnya sebagai berikut, perhatikan tidak ada kombinasi KdPembelian dan Kdbarang yang sama dalam tabel tersebut.

Menambah Primary Key Baru

Komposit primary key tidak mengijinkan redundansi (dobel) kombinasi primary key (kode pembelian + kode barang), alias dua kode barang diinput dua kali di sub-form (sisi detail). Jadi harus menambah jumlah barang yang sama tersebut, misalnya kode barang kecap tidak boleh diinput dua kali (masing-masing berjumlah satu), tetapi cukup sekali dan jumlahnya 2. Padahal praktek di lapangan, misalnya di supermarket-supermarket dengan scan barcode tentu saja asal scan tidak perlu mengetahui apakah barang yang sama sudah discan sebelumnya. Solusinya terkadang dengan menambahkan satu kunci baru. Kasihan kasirnya ketika kode barang yang sama sebelumnya telah terscan, yang baru mau diinput menolaknya.

Jadi dari pada kasir diminta mengumpulkan jumlah kode barang yang sama kemudian ditotal, kasir bisa langsung menscan barang yang sama tersebut berkali-kali. Tabel transaksinya kira-kira berikut ini:

Tentu saja dengan cara komposit primary key (KdPembelian+KdBarang) tanpa ID sistem akan menolak, tapi dengan cara ini barang yang sama akan diberikan ID yang berbeda. Tapi secara teori, primary key komposit dua kunci yang terlibat (KdPembelian dan KdBarang) masih tetap jadi dasar materi perkuliahan basis data. Sekian, semoga bermanfaat.

Membuat Compiler Sendiri – Persamaan Matematis

[tek.kompilasi|t.inf|s.104|pert.9]

Pertemuan yang lalu telah disinggung membuat kompiler yang melakukan operasi perhitungan layaknya menggunakan kalkulator. Di sini dengan Lex and Yacc akan dicoba membuat kompiler yang bisa melakukan perhitungan seperti ini:

Yang belum mempunyai software lex and yacc silahkan klik di sini untuk mengunduhnya dengan ukuran sekitar 20-an Mb. Kebetulan software yang dishare berbasis Windows. Jika ingin yang linux, vendor juga menyediakan aplikasi lex and yacc berbasis linux seperti Ubuntu.

Prinsip Kerja

Generasi saya (kuliah 90-an) hanya mengenal disket dan belum mengenal punch card yang berisi kartu berlubang yang fungsinya sebagai instruksi ke komputer. Bayangkan jika kita diminta menghitung iterasi ratusan kali dengan kalkulator, tentu akan bentol jempol kita. Tapi dengan menginstruksikan agar komputer menghitung iterasi ratusan kali tersebut, sekali jalan langsung selesai. Jika dulu dengan kartu berlubang, saat ini instruksi berbasis teks yang diketik. Jadi komputer harus mampu melakukan scanning agar mengetahui instruksi tersebut sesuai dengan aturan sebelumnya atau tidak, baik dari sisi kata perkata atau logika yang berupa grammar. Jadi Lex and Yacc memiliki dua mesin:

  • Scanning kata per kata dengan mesin Lex (singkatan dari lexical generator), dan
  • Grammar check dengan mesin Yacc (singkatan dari yet another compilers compiler)

Makanya software tersebut dinamakan Lex and Yacc. Jika software sudah diinstal, silahkan pelajari dari situs resminya, yang juga dilengkapi dengan kode sumber untuk praktek kali ini.

Mengkompilasi File Lex

Ada dua file yang diperlukan untuk menghasilkan satu kompiler yaitu file lex (berekstensi *.l) dan yacc (berekstensi *.y). Silahkan masuk ke bab “Practice 2”. Kopi-kan saja ke Flex Windows (software Lex and Yacc versi windows) yang baru kita instal. Masuk ke menu Tools – Lex Compile. Lanjutkan dengan masuk ke menu yang sama: Tools – Lex Build. Maka akan dihasilkan satu file baru lex.yy.c yang merupakan hasil generate ke bahasa c.

Mengkompilasi File Yacc

Jika Lex bertanggung jawab mengecek kata/word yang terdaftar di bahasa pemrograman yang dirancang, Yacc bertanggung jawab terhadap grammatical-nya. Buat kode dengan nama yang sama dengan file Lex, hanya saja untuk Yacc harus berekstensi *.y. Lakukan proses yang sama dengan Lex di menu Tools – Yacc Compile dan dilanjutkan dengan membuild beserta Lex-nya lewat menu yang sama Tools – Lex+Yacc Build. Hasil dari proses kompilasi adalah dua buah file y.tab.c dan y.tab.h yang satu untuk header (di bahasa c dengan kode #include) yaitu y.tab.h dan satu lagi y.tab.c digunakan untuk build Lex+Yacc. Di bagian indikator bawah pastikan tidak ada masalah dan cek di file lokasi penyimpanan (di folder yang sama dengan lex dan yacc) apakah file berekstensi exe dengan nama yang sama dengan lex and yacc ada, misalnya yang saya gunakan calc2.exe.

Menjalankan Bahasa Pemrograman

Ada dua cara menjalankan bahasa pemrograman yang baru dibentuk yaitu dengan mengklik file calc2.exe atau nama lain yang Anda buat, atau dengan menekan Tools – Execute Exe Directly. Hasilnya akan memunculkan jendela di bawah ini, coba dengan melakukan operasi matematis tertentu dengan variabel. Selamat mencoba, semoga bermanfaat.

NOTE: Ada kesalahan di bagian yacc, tambahkan di bagian atas:

  • %{
  • #include <stdio.h>
  • void yyerror(char *);
  • int yylex(void);
  • int sym[26];
  • %}

Mengejar Impian

Tiap orang memiliki impian sejak kecil. Impian di sini maksudnya sesuatu yang diinginkan, bukan mimpi ketika tidur, walaupun kadang keinginan itu dibawa mimpi juga sih. Berbeda dengan anak-anak yang ketika bermimpi tidak memperhitungkan mungkin atau tidaknya, orang dewasa terkadang membatasi diri dengan faktor-faktor luar yang membuat mimpi tersebut tidak mungkin tercapai.

Mimpi yang Sempurna

Jika dalam syair lagu “mimpi yang sempurna” Ariel bertanya kepada bintang-bintang tentang mempinya yang sempurna, ada baiknya mengikuti pendapat Arnold Schwarzenegger ketika dia bermimpi menjadi bintang Hollywood. Orang lain mengatakan tidak mungkin mengingat aspek-aspek di dirinya yang tidak cocok seperti logat khas Jerman yang pasti akan membuat produser tertawa-tawa. Justru ternyata logat tersebut menjadi kalimat sederhana yang terkenal: “I’ll be back” dalam film terminator dalam logat Jerman yang kental, mirip mesin. Vision atau dalam bahasa Indonesia Visi, harus dimiliki oleh siapapun karena akan mengarahkan ke tujuan. Tentu saja visi yang baik dan jelas.

Mimpi berbeda dengan keinginan, seperti ingin rujak yang tidak lama kemudian terkabul. Ada proses panjang untuk mengarah ke impian. Terkadang memang seharusnya kita yang mengikuti impian, bukan sebaliknya impian yang fleksibel mengikuti keadaan.

No Pain No Gain

Terkadang memang banyak penderitaan yang menyertai perjalanan menggapai impian. Selama ada hasrat dan keinginan tentu saja penderitaan sebesar apapun tidak berarti. Banyak rekan-rekan saya yang sakit, masalah rumah tangga bahkan meninggal dunia dalam menggapai jenjang pendidikan tertentu. Di tempat saya bekerja pun hanya separuh yang menyelesaikan studi doktoralnya, tapi tetap saja tidak dianggap penderitaan karena memang itu harus dijalani. Kemarin ada rekan yang sedang berusaha memperoleh beasiswa menceritakan perjalanannya yang berliku. Ketika memperoleh beasiswa ternyata lokasi kampusnya di Jogja bukan yang diinginkan (Jakarta). Padahal perjalanan mencapainya cukup panjang, pemberkasan, wawancara di daereah Jawa Timur, ketika sudah beres ternyata hamil dan nunggu melahirkan. Namun toh tetap saja dia mencoba lagi.

Santai dan Tetap Pertahankan Minat

Seperti biasa ketika ada rekan yang berhasil mendapatkan beasiswa dan mulai studi lanjut atau ada rekan yang telah menyelesaikan kuliahnya banyak yang bersemangat untuk mengikuti jejaknya. Tapi yah … seperti itu, semangat di awal dan kemudian redup lagi dan kemudian muncul lagi ketika ada yang lolos atau lulus dan begitu berulang kali. Makanya doctoral bootcamp yang diadakan Kemenristek DIKTI kurang begitu berhasil.

Impian itu mirip dengan lari jarak jauh atau lari marathon, bukan sprint 100 meter. Ketika berlari, memperoleh momentum dan energi baru. Kalau impian cepat sekali memperolehnya, jangan-jangan itu bukan impiannya, tapi “ada kesempatan dalam kesempitan”. Ada konsep dalam traditisi Tibet yaitu keinginan merupakan “loba” alias keserakahan, kesedihan/menderita adalah “dosa”, dan ketidaktahuan adalah “moha”, kalau dalam Islam diistilahkan nafsu. Jika impian kita jalankan seperti itu, sudah dipastikan akan sulit mencapainya. Anggap saja impian misalnya doktor, guru besar, atau apapun itu sekadar objek yang dituju tanpa ada keinginan ataupun nafsu yang mengebu-gebu, seperti dalam konsep meditasi yaitu santai dan tetap pertahankan minat. Dalam Islam diistilahkan nafsu mutma’inah. Mungkin film yang dibintangi Will Smith di bawah bisa menginspirasi. Yuk, tetap melangkah tanpa gejolak di hati.

Pemrograman Dinamis – Konsep Memoization

[algoritma|tek.inf|r408|pert.8]

Salah satu materi algoritma standar adalah pemrograman dinamis (Dynamic Programming). Walaupun ada kata “programming”-nya ternyata tidak ada hubungannya dengan kode/script. Ternyata istilah pemrogramannya karena teknik yang biasanya digunakan untuk optimalisasi ini memanggil suatu fungsi diri sendiri (rekursif) sebelum menentukan hasil-hasil yang optimal. Optimal di sini bisa maksimal atau minimal.

Pemotongan Batang (Rod Cutting)

Kasus ini contoh proses pemotongan bilah batang panjang agar dihasilkan margin keuntungan yang optimal. Misalnya batang baja sepanjang 10 inchi yang akan dipotong dengan potongan kelipatan 1 inchi.

Kombinasi dari ukuran potongan ternyata sangat menentukan keuntungan berdasarkan harga per potongnya. Misal, untuk baja sepanjang 4 inchi memiliki keuntungan dengan komposisi dua buah batang berukuran 2 inchi.

Selain dua buah potongan berukuran 2 inchi, panjang potongan menghasilkan harga 4, 7, dan 9. Sementara dua buah potongan 2 inchi menghasilkan harga 10 (tentu saja ini kasus bagi penjual, kalau pembeli tentu lebih menguntungkan beli potongan-potongan kecil satu inchi).

Memoization

Istilah ini saya fikir salah tulis, harusnya memorization, ternyata tidak. Istilah ini berasal dari kata “memo”, yaitu secarik surat/infor singkat. Misal untuk tiap-tiap panjang bilah akan dihasilkan nilai optimal sebagai berikut:

Perhatingan untuk baja sepanjang 1 sampai 3 inchi, optimalnya adalah tanpa dipotong, masing-masing berharga $1, $5, dan $8. Baja 2 in ada dua kemungkinan yaitu 1+1 atau 2 in tanpa dipotong. Karena 1in+1in menghasilkan hanya $2 maka yang dipilih 2 in tanpa dipotong, yaitu $5. Untuk baja berukuran 4 in ada beberapa kemungkinan seperti gambar batangan di atas dan dihitung semua kemungkinannya hingga diperoleh maksimal adalah dua potongan @2in. Pseucode-nya sebagai berikut:

Keterangan: baris ke-4 sampai 6 menghitung komposisi potongan baja. Misal untuk i=1, maka akan dicari maksimal dari 1 dan (n-1)-nya. Jika batang 4 in, maka 1 dan 3, berikutnya 2 dan 2 (dari n-2) dan seterusnya. Untuk kasus contoh di atas diperoleh nilai maks 10 (ketika i=2 dan satu potongan lainnya 2 in juga).

Karena potongan 2in sudah dihitung dari sebelumnya (batang ukuran 2in) maka ketika menghitung 4in tidak perlu menghitung kembali yang 2in hanya menggunakan riwayat yang lalu, alias dari “memo” sebelumnya. Di sinilah muncul istilah memoization, atau dalam bahasa Indonesianya mungkin memoisasi.

Top Down Memoization

Dengan rekursif, beberapa perhitungan dihitung berulang kali sehingga tidak efisien (naif). Oleh karena itulah pemrograman dinamis diterapkan untuk menggantikan proses rekursif berulang tersebut. Jadi sekali telah dihitung, maka jika akan menghitung proses yang sama hanya me-ngintip (lookup) hasil perhitungan yang lampau.

Untuk dengan memoization, ditambahkan arrah yang berisi nilai yang sudah dihitung dengan suatu routine yang disebut helper “Memouzed-Cut-Rod-Aux” (simbol minus tak hingga artinya unknown dan perlu dihitung):

Baris 1-3 mengecek apakah nilai sudah ada di array hasil perhitungan atau tidak. Jika tidak ada (else) masuk ke q yang unkhown (minus tak hingga) dengan baris 7 yang berisi maksimal komposisi-komposisi yang maksimal. Hanya saja di sini rekursif yang bekerja dengan mengecek hasil hitungan sebelumnya jika sudah ada di array hasil, langsung mengkopi saja tidak perlu menghitung lagi nilai r-nya (lihat r1 sampai r10 di contoh paling atas postingan ini untuk batang sepanjang 10 in).

Buttom Up Memoization

Teknik buttom up lebih sederhana karena tidak membutuhkan mekanisme rekursif, hanya dengan menghitung maksimal potongan-potongan dari terkecil hingga terbesarnya.

Keterangan: Seperti biasa array hasil dipersiapkan. Variabel j merupakan hasil optimal komposisi potongan yang bergerak dari kombinasi i dengan pasangannya. Misal ketika j=4 maka i bergerak dari i=1 dan r(3) mana yang lebih maksimal dibanding komposisi lainnya misal i=2 dan r(2), dan seterusnya. Baik buttom up ataupun top down memiliki running time yang kuadratik. Sekian, semoga bermanfaat.

Referensi:

Cormen, dkk. “intro to algorithms”, MIT Press: 2009.