Munafik yang Baik

Judul yang aneh, mungkin pembaca tidak setuju. Mana ada munafik yang baik. Terlepas dari istilah munafik yang artinya “bermuka dua”, mungkin di sini istilah yang tepat adalah menutup bagian yang memang tidak seharusnya diumbar untuk dilihat, seperti layaknya pakaian yang kita kenakan.

Goal Oriented

Ketika saya bekerja di bank, di satu cabang ada dua divisi yaitu operasional dan marketing. Jika operasional cenderung ketat absen masuknya, alias pagi pulang sore, bagian marketing cenderung santai. Hal ini karena divisi tersebut memang berorientasi pada target, berbeda dengan divisi operasional yang memang melayani transaksi. Tidak ada konflik di antara mereka.

Bagaimana dengan dosen? Tentu saja salah satu bagiannya adalah operasional juga, khususnya pada sisi pengajaran. Harus tepat waktu, karena akan ditiru oleh mahasiswa jika kita malas. Tetapi bagaimana jika memang tidak ada jam mengajarnya? Sementara ada beban meneliti dan mengabdi yang memang berorientasi tujuan (goal oriented). Jadi jika tidak ada mengajar, tidak perlu datang kah?

Tidak Ada Salahnya Menghargai

Tadinya saya memiliki prinsip goal oriented, mungkin terbawa pekerjaan saya di IT waktu di bank dulu yang terkadang kerjanya tidak mengikuti aturan jam masuk-pulang. Bahkan sempat menginap di salah satu cabang di kranji ketika instalasi sever baru. Tapi ketika saya studi lanjut di Thailand, saya melihat dosen pembimbing saya yang memiliki karakter yang menarik untuk dipraktekan, yaitu menghargai.

Dosen pembimbing saya merupakan dosen super sibuk. Tetapi uniknya dia tidak pernah menunjukan sibuknya di hadapan siapapun. Ini mungkin sifat menutup-nutupi darinya yang saya lihat pertama. Walau sulit dihubungi untuk konsultasi, tetapi ketika konsultasi dia akan fokus berhadapan dengan kita, mematikan semua alat komunikasi/koneksi dengan pihak lain. Padahal feeling saya banyak di fikirannya yang harus dikerjakan. Tetapi sikapnya yang berpura-pura hanya fokus ke saya memang dapat diacungi jempol. Di sini dia menghargai mahasiswa.

Lain lagi cerita masalah administrasi. Ketika saya mengirim email perihal prosedur, maka dia akan menjawab 100% prosedural. Mungkin karena via email yang memang bisa dijadikan bukti. Tetapi ketika berbicara via lisan/ketemu, dia bisa fleksibel banget. Kali ini dia menghargai sistem yang ada, dalam artian institusi akan melihat jika dia sangat menghargai aturan di kampus. Walau perkiraan saya dia tidak setuju, tetapi karena menghargai akhirnya dia ikuti.

Memang saya setuju dengan dosen yang fokus ke tujuan (goal oriented), tetapi dengan hanya fokus ke hal tersebut jika datang dan pergi semaunya sepertinya terlihat tidak menghargai bagian operasional (TU, SDM, dll). Apa salahnya mengenakan “baju” terlihat datang rajin ke kampus, intinya sebenarnya adalah menghormati dan menghargai orang lain, lembaga, dan pemilik/yayasan. Bahkan untuk hal tertentu, seperti menggunakan fasilitas kantor, sebaiknya ijin terlebih dahulu ke divisi yang memiliki fasilitas itu, walaupun milik kampus, toh sekali lagi tidak ada salahnya menghargai orang … malah harus lah.

Koneksi Paling Mudah PHP ke Basis Data MySQL

[basis.data|akuntansi|lab.software|pert.10]

Ternyata untuk menghubungkan sebuah web-based application ke MySQL hanya membutuhkan empat langkah kode PHP. Namun tetap saja karena berupa script agak sedikit menyulitkan rekan-rekan non IT. Postingan kali ini sedikit berbagi bagaimana menghubungkan satu database ke PHP. Oleh karena itu buka basis data sembarang yang telah dibuat.

Membuat koneksi.php

File php yang dibuat misalnya bernama “koneksi.php” yang artinya script kode php untuk menghubungkan basis data dengan aplikasi web. Pertama-tama buka notepad/text editor untuk mengetik kode php. Ketik informasi bahwa bahasa yang digunakan adalah php dengan kode <?php dan di bagian akhir dengan kode ?>.

Berikutnya adalah $user = ‘root’; yang menginformasikan ke basis data tujuan nama user basis data, di sini contohnya adalah root. Sementara passwordnya dengan mengetik kode $pass = ‘ ‘; yang artinya tanpa dipassword. Simbol $ berarti sebuah variabel, dalam hal ini user dan pass. Berikutnya ketika basis data bisa masuk dibutuhkan nama basis data yang ada pada MySQL, misalnya beasiswa yang ada di MySQL saya. Kode yang digunakan $db = ‘beasiswa’;

Jika parameter (user, password dan nama database) sudah diisi, berikutnya adalah membuat kode koneksi baru dengan fungsi new mysqli. Karena ada dua kemungkinan (berhasil login atau tidak) maka dibutuhkan kode lainnya yaitu or die (“Tidak Berhasil Terkoneksi ke Database”); Listing lengkapnya adalah sebagai berikut:

  1. <?php
  2. $user=’root’;
  3. $pass=”;
  4. $db=’beasiswa’;
  5. $db=new mysqli(‘localhost’,$user,$pass,$db) or die (“Tidak Berhasil”);
  6. echo ‘Koneksi Berhasil’;
  7. ?>

Menguji Kode PHP

Letakan koneksi.php pada folder htdocs atau di folder lain asalkan induknya di folder tersebut. Kemudian buka browser dan masuk ke alamat http://127.0.0.1/koneksi.php. Baris keenam di kode atas hanya berfungsi memberi tahu jika koneksi berhasil.

Bagaimana jika koneksi tidak berhasil. Untuk contoh isi saja kode di baris ketiga dengan password asal. Maka browser akan memberitahukan pesan bahwa akses ditolak untuk user yang dimasukan. Sekian tips singkat ini, semoga bermanfaat.

Praktek Longest Common Subsequence (LCS) dengan C++ Online

[algoritma|t.informatika|r.408|pert.11]

Longest Common Subsequence (LCS) merupakan rentetan string dari dua string yang dibandingkan. Misalnya string1: a-b-d-a-c-e dan string2: b-a-b-c-e.

Di sini b-a-c-e merupakan LCS. String a tidak boleh dengan a pada string 1 karena berbenturan dengan koneksi b-b antara string 1 dan string 2. Salah satu metode yang efisien adalah dengan pemrograman dinamis dengan cara:

  • Membuat tabel
  • Mengekstrak LCS

Tabel berisi arah panah (kiri, atas, atau diagonal) disertai nilai tertentu yang gunanya untuk mengekstrak LCS.

Dari tabel diketahui LCS yang berwarna pink yaitu b-a-c-e.

Implementasi Dalam Bentuk Program

Banyak situs-situs ok yang menyediakan kode sumber untuk algoritma mencari LCS lewat pemrograman dinamis. Untungnya juga banyak situs-situs yang menyediakan compiler beberapa bahasa pemrograman, misalnya bahasa C++. Jadi tidak perlu khawatir jika di komputer tidak terinstal kompiler C++. Bahkan bisa dijalankan lewat handphone. Situs yang jalan untuk kode program sampel berikut adalah onlinegdb. Hapus semua lembar kerjanya (berisi contoh program mengeprint: “hello word”) copy dan paste kode berikut:

Program tersebut mencontohkan mencari LCS dari dua string AGGTAB dan GXTXAYB yang menghasilkan string LCS: GTAB. Tekan tombol RUN dan lihat hasilnya di bagian bawah jendela onlinegdb. Atau ganti dengan contoh di atas Char X[]=”ABDACE” dan Char Y[]=”BABCE” yang hasilnya berikut:

Untuk mengetahui prinsip kerja dasarnya dapat dilihat di video sederhana berikut. Sekian semoga bermanfaat.

Embed PDF di WordPress Via Google Docs

Tadinya bermaksud mengembed kode program di wordpress, tetapi ternyata berbayar alias upgrade ke paket bisnis yang 20-an dollar per bulan. Akhirnya coba dengan mengembed pdf saja ke wordpress yang gratis memanfaatkan Google Drive.

Menggunakan Google Drive

Google drive untuk praktisnya dibuka lewat Gmail dengan menekan simbol aplikasi lainnya dilanjutkan dengan menekan simbol Google Drive.

Cara paling mudah adalah mengupload PDF ke Google Drive seperti pada postingan yang lalu. Di sini kita coba dengan cara lain dengan memanfaatkan fasilitas Google Docs.

Google Docs

Tekan tombol “+” di Drive lalu new dan pilih Google Docs. Akan tampil seperti MS Word biasa dengan menu-menu untuk mengetik. Copas saja kode yang akan diinsert ke wordpress di situ.

Atur folder di Drive agar rapi dan mudah mencarinya. Sayangnya tidak ada fasilitas “save as” di Google Docs untuk mengkonversi menjadi file Pdf. Atau dengan fasilitas embed via word langsung seperti di Onedrive. Tapi ternyata dengan fasilitas PRINT ada pilihan Google Cloud Print menjadi PDF yang diletakan di drive, beres dah.

Lanjutkan dengan menekan tombol print untuk menghasilkan file pdf di Google Drive. Buka file tersebut dilanjutkan dengan meng-embedded seperti postingan terdahulu. Mungkin contoh embed-nya bisa dilihat di bawah ini.

Audit Keamanan Informasi

Dulu pernah diminta mengajar mata kuliah keamanan sistem informasi, dari dasar-dasar serangan siber, enkripsi, dan sejenisnya. Tetapi ketika beralih ke jurusan sistem informasi, ternyata ada yang namanya audit keamanan sistem informasi. Nah, ini di Indonesia sedang digodok aturannya oleh Badan Siber dan Sandi Nasional (BSSN). Dulu divisi kemanan transaksi elektronik di luar BSSN dibawah Indonesia Security Incident Response Team on Internet Infrastructure/Coordination Center (ID-SIRTII/CC) dan sekarang digabung dengan lembaga sandi negara menjadi BSSN, bahkan lembaga sandi negara ditunjuk sebagai pengatur lembaga baru tersebut.

Penilaian & Audit Keamanan Transaksi Perdagangan Berbasis Elektronik

Era disrupsi memiliki konsekuensi dari sisi transaksi yang mengharuskan dalam bentuk elektronik. Bahkan dari sisi audit jika ditemukan dua jenis bukti (elektronik dan paper) maka yang elektronik memiliki kekuatan yang lebih besar. Saat ini hampir sebagian besar transaksi keuangan bersifat elektronik. Jadi audit tentang transaksi ini mutlak diperlukan.

Kekurangan Auditor

Saat ini di Indonesia jumlah auditor hanya 300-an menurut asosiasi auditor sistem informasi di Indonesia (IASII) padahal kebutuhan di tanah air cukup tinggi. Sebagai informasi negara-negara tetangga seperti Thailand, Vietnam, dan Filipina sudah kelebihan auditor dan siap-siap masuk ke Indonesia untuk mensuplai kebutuhan auditor. India? Jangan ditanya, sudah sejak lama mereka masuk bahkan IASII kerap mem-briefing auditor-auditor India yang akan bertugas di Indonesia, waduh. Apalagi perjanjian-perjanjian seperti AFTAA, WTO, MEA, dan lain-lain kebanyakan sudah ditandatangani pemerintah.

Pembentukan Aturan

Memang aturan mudah dibentuk, tetapi jika tidak memandang dunia internasional, agak sulit di era globalisasi ini. Tampak wakil dari praktisi sepertinya keberatan jika auditor harus disertifikasi ulang oleh BSSN mengingat mereka sudah memiliki sertifikasi internasional. Jika aturan dibuat sendiri sertifikasinya, tetangga apalagi internasional akan menanyakan apa itu BSSN, maklum tidak mengenalnya. Bahkan dari asosiasi mempertanyakan mengapa e-KTP yang budgetnya trilyunan tidak diaudit keamanan informasinya, sementara nanti para pengusaha dengan budget yang sedikit diharuskan untuk diaudit keamanan transaksi online-nya. Sepertinya perlu dikomunikasikan dengan para praktisi sebelum aturannya dibuat, dan segera mengingat dunia startup, terutama bidang finansial (misal fintech, paytren, dll) sudah mulai merambah. Sekian sekilas info.

Berfikir Secara Komputasi (Computational Thinking)

Istilah berfikir secara komputasi (Computational Thinking) muncul sejak tahun 80-an, diperkenalkan oleh Saymor Papert, namun saat ini menjadi tren dengan pesatnya perkembangan IT. Singkat kata di sini cara berfikir fokus ke algoritma pemrograman. Tidak fokus khusus ke bahasa tertentu tetapi prinsip dasar pemrograman. Ketika berbagai negara di belahan dunia mulai memasukan kurikulum tentang Computational Thinking (CT), negara kita belum berani memasukan ke sekolah level dasar. Padahal misalnya di Singapura bahkan sudah mengklaim bahwa CT merupakan “national capability” alias kemampuan utama negara tersebut.

TIga-A dan Empat-C

Untuk menyelesaikan problem dengan CT diperlukan kemampuan dalam tiga hal yaitu Abstraction, Otomation, dan Analysis. Abstraksi adalah mengkonversi kondisi problem real menjadi bentuk padanannya secara sains. Otomatisasi berfokus ke penyelesaiannya sementara analisa gabungan dari eksekusi dan evaluasi. Sementara itu Empat C (four Cs) adalah hubungan Tiga-A itu dengan proses pembelajaran dengan empat komponen utama communication, critical thinking, collaboration, dan creativity. Google menawarkan konsep pendidikan dengan Exploring Computational Thinking (ECT) yang merupakan konsep penyelesaikan masalah secara kreatif dengan langkah-langkah yang teratur (dengan konsep algoritma) serta dengan melakukan breakdown
terhadap masalah yang kompleks. Biasanya problemnya melibatkan multi-disiplin dengan open-ended problem.

Kritik

Para ahli di bidang ilmu komputer sendiri masih ragu dengan gaya berfikir yang menurut mereka sempit. Dikhawatirkan melupakan aspek-aspek lainnya seperti sosial, etika, lingkungan dan dampak negatif dari teknologi yang dikembangkannya. Namun di era revolusi industri 4.0 ini cara berfikir ini bisa menjadi pelengkap cara berfikir yang dibutuhkan pada era ini (tahun 2020-an) antara lain:

  • Complex Problem Solving
  • Critical Thinking
  • Creativity
  • People Management
  • Coordinating with Others
  • Emotional Intelligent
  • Judgment and Decision Making
  • Service Orientation
  • Negotiation
  • Cognitive Fleksibility

Sebagai perbandingan dengan tahun 2015 adalah dapat dilihat pada link berikut.

Postingan ini sebenarnya persiapan menghadiri acara BBS (brown-beg session) yang rutin dilaksanakan di Universitas Indonesia (lab distance learning), jika dapat seat, yang temanya seperti judul di atas.

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 preffix (‘ber’) except when the root-word below 4 characters (e.g. “dua” from “berdua”)

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.

UPDATE: 28.12.2018

Ternyata metode dengan ID tambahan yang biasanya diimplementasikan di lapangan dikenal dengan istilah Surrogate Key.

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.

Shift and Reduce Parsing

[tek.kompilasi|t.informatika|s-103|pert.8]

Untuk orang yang non ilmu komputer atau teknik informatika, istilah parsing merupakan istilah asing yang membuat dahi keriput. Bagaimana tidak, hanya menggunakan bahasa pemrograman saja sudah pusing, ini malah diminta membuat suatu bahasa pemrograman. Tapi perlu diingat, salah satu kewajiban pembelajaran adalah “apakah yang kita ajarkan sudah seharusnya yang kita ajarkan?”. Pertanyaan itu merupakan pertanyaan yang harus dijawab. Pertanyaan yang dikeluarkan oleh Mahatma Gandhi ketika India baru merdeka dan ingin segera bersaing dengan negara maju.

Grammar

Kembali ke proses pembuatan bahasa pemrograman. Sebelum bisa membuat suatu bahasa, perlu mengetahui cara kerja suatu bahasa. Bahasa bekerja mengikut grammar yang ada. Chomsky mengusulkan suatu context free grammar yang bebas dari linguistik lokal yang tidak beraturan. Sebagai contoh kita memiliki aturan grammar sebagai berikut:

Apa maksudnya? Di sini ada tiga aturan yang membolehkan pengguna mengoperasikan: 1) variabel ditambah variabel. Variabel di sini diistilahkan dengan non-terminal (bukan titik destinasi akhir), sementara terminal berupa konstanta atau operasi seperti tambah, kurang, kali dan bagi. 2) variabel dikalikan dengan variabel, serta 3) variabel diisi oleh konstanta. Secara singkat, notasi grammar di atas dapat ditulis dalam satu baris: E->E+E|E*E|id. Ekspresi di atas mengikut kaidah Backus Naur Form (BNF) yang terkenal untuk context free language.

Tugas bagian parsing adalah mengecek validitas operasi yang diberikan oleh pengguna apakah sudah sesuai dengan grammar yang ada atau tidak. Sebagai contoh user mengetikan persamaan matematis: E->x+y*z. Parsing akan mengecek apakah sudah sesuai atau tidak dengan grammar.

Shift and Reduce Parsing

Sesuai dengan namanya metode ini mengkombinasikan antara penggeseran dan pengurangan parsing. Contoh sebelumnya jika kita kerjakan maka otak kita lebih mudah mengerjakan lewat mekanisme ‘top down’ sambil melihat grammarnya. Dalam contoh di atas, ada penjumlahan (x+y) dan perkalian (dengan z). Dengan menggunakan left hand first diperoleh urutan berikut ini:

Perhatikan aturan grammar yang diterapkan di dalam kurung di samping kanan proses top-down. Pertama-tama digunakan aturan perkalian yang menghasilkan dua non-terminal E. E yang kanan dengan menerapkan rule no.3 diperoleh konversi dari E ke id (dalam hal ini z). Langkah berikutnya dengan menggunakan aturan no.1 dimana E menurunkan E+E (simbol -> diistilahkan turunan (derrive). Teruskan dengan menggunakan rule no. 3 akan merubah non-terminal menjadi terminal berturut-turut x dan y. Karena hasil akhir sama dengan soal, maka dapat dikatakan instruksi x+y*z dapat diterima parser.

Kita mungkin mudah mengerjakan dengan top-down method ini. Bagaimana dengan komputer? Tentu saja berbeda dengan otak kita. Untuk itulah metode shift and reduce layak diperhitungkan. Cara kerja shift and reduce adalah sebagai berikut:

  • Tulis operasi yang akan dicek grammar-nya
  • Lakukan operasi shift untuk memisahkan non-terminal/variabel yang akan diisikan id.
  • Lakukan operasi reduce untuk mengganti variabel menjadi terminal.

Perhatikan 11 langkah di atas, yang merupakan tipikal operasi shift and reduce. Pada langkah pertama, instuksi akan siap-siap melakukan proses “shift” dimana x bergeser ke kiri. Selanjutnya, x yang telah berada di kiri dikonversi menjadi terminal/variabel E. Berikutnya langkah ke3 dan 4 dua buah proses shift yaitu untuk plus dan y dilanjutkan dengan reduce y menjadi terminal E. Langkah 8, 9, dan 10 bermaksud mereduksi instruksi mengikut grammar sehingga dihasilkan E yang artinya instruksi x+y*z dapat diterima (accepted). Berikutnya akan dicoba lewat perangkat lunak Lex and Yacc, khususnya bagian Yacc yang bertanggung jawab mengurusi Grammar.

Perhatikan saat kompilasi Yacc di bagian komentar. Tampak Yacc menunjukan 4 shift/reduce [1] yang konflik. Ini tipikal dari bagian pengecekan instruksi (dengan shift and reduce). Perhatikan di sini saya iseng mengganti “+” dengan “p” dan “-” dengan “m”. Kira-kira hasil bahasa pemrograman primitif sebagai berikut di bawah ini. Perhatikan, “p” bermakna plus dan “m” bermakna minus. Sekian, semoga bermanfaat.

 

Kisah Unik Matematikawan Dodgson – Dodgson Condensation

Membaca tulisan yang membahas seorang ahli matematika abad 19, Reverend Charles Lutwidge Dodgson (1832-1898) cukup menarik juga. Ahli matematika ini ternyata menulis cerita terkenal “Alice in Wonderland” dan “Through the Looking Glass” dengan nama samaran Lewis Carroll. Dikisahkan bahwa Ratu Victoria ternyata kagum dengan cerita “Alice in Wonderland” sehingga ketika selesai membaca dia meminta bawahannya untuk membawakan buku karangan Lewis Carroll (yang nama aslinya Dodgson) yang lain. Tidak berapa lama kemudian tibalah bawahannya tersebut dengan membawa buku Dodgson yang berjudul “Elementary Theorems Relating to Determinants” yang ternyata buku matematika .. haha.

Metode Kondensasi Dodgson

Metode terkenal ini sangat ampuh untuk menghitung determinan matriks dengan jumlah baris dan kolom yang banyak. Tentu saja penting di jaman dulu ketika komputer (atau minimal kalkulator) belum ditemukan. Postingan ini sedikit banyak membahas metode ini, sebagai kelanjutan post terdahulu tentang invers matriks 4×4.

Misal sebuah matriks A dengan ukuran lebih besar atau sama dengan 3×3 dengan matriks dalam (interior matrix) menyatakan matriks (n-2)x(n-2) hasil penghilangan baris awal, akhir dan kolom awal serta akhir (kalau pusing, langsung loncat ke contoh kasus di bawah ya). Metode kondensasi Dodgson terdiri dari empat langkah/tahap antara lain:

  • Gunakan metode operasi baris dan kolom untuk menghilangkan nol dari matriks dalam (interior).
  • Cari determinan matriks 2×2 untuk tiap-tiap empat elemen untuk membentuk matriks baru berukuran lebih kecil (n-1)x(n-1), misalnya diberi nama matriks B.
  • Ulangi langkah sebelumnya untuk matriks (n-2)x(n-2) lalu bagi tiap elemen menurut interior original matriks A, untuk memperoleh matriks C.
  • Lanjutkan terus “kondensasi” di atas sampai hasil satuan ditemukan. Nilai ini merupakan determinan dari matriks A.

Sebagai ilustrasi ada baiknya menggunakan contoh kasus. Lebih mudah khususnya orang teknik yang suka praktis-praktis seperti saya, hehe. Diketahui matriks A.

Karena tidak ada nol di interior, langsung ke langkah 2 untuk mencari matriks B hasil penentuan determinan. Misalnya untuk sisi kiri atas serta sampingnya.

Lanjutkan hingga seluruh matriks A sehingga matriks B dari tahap kedua adalah sebagai berikut:

Tampak matriks A berukuran 5×5 menjadi (5-1)x(5-1) di atas. Tahap ketiga selanjutnya meneruskan kondensasi menghasilkan matriks 3×3, misalnya untuk bagian kiri atas.

Teruskan untuk sisi-sisi lainnya sehingga diperoleh matriks C

Lanjutkan dengan cara yang sama hingga menjadi matriks D. Di sini istilah kondensasi sepertinya ada benarnya. Ibarat embun yang timbul dari uap air yang terkumpul di udara.

Nah berikutnya adalah membagi matriks terakhir D ini (terkecil) dengan interior dari Matriks B yakni:

Tiap elemen matriks D dibagi mengikuti posisi int B, misalnya -84 dibagi -6, -580 dibagi 2, dan seterusnya hingga diperoleh matriks E:

Dengan mudah kita menghitung determinan matriks E ini dengan cara biasa det=14*(-109)-421*(-290) yang menghasilkan 120564. Apakah sudah selesai? Belum, dikit lagi yaitu membagi nilai tersebut dengan interion matriks C yang bernilai 36. Dan hasil akhirnya adalah 3349. Sekian semoga bermanfaat.