Sesungguhnya shalat itu mencegah dari (perbuatan-perbuatan) keji dan mungkar
Q.S. Al-'Ankabut Ayat 45
Thursday, September 11, 2014
S3 Akuntansi
Anehnya, akhir-akhir ini entah kenapa penguasa yang dimaksud pada teks proklamasi itu telah begitu ketagihannya memperbanyak bangku-bangku “pendidikan” (baca: bangku sekolah, ingat pendidikan wajib itu hanya 9 tahun) tanpa memikirkan apa nanti yang terjadi ketika manusia-manusia yang disekolahkan itu pasca selesai dari persekolahannya. Terlalu banyak sekolah dan terlalu sedikit lapangan pekerjaan. Orang-orang masuk sekolah dengan tujuan setelah selesai dari sekolahnya mereka akan menjadi orang kantoran. Mereka meninggalkan pekerjaan-pekerjaan yang seharusnya mereka kerjakan: bertani, bercocok tanam, mengukir, menyulam, memukat, memancing ikan, dan hal hal lainnya yang menjadi penyumbang pendapatan negara di luar sektor migas, lantaran pemerintah secara tidak sadar merusak mindset mereka dengan doktrin tidak langsung bahwa dengan sekolah manusia bisa cerdas. Karena sudah cerdas maka mereka sudah tidak pantas lagi mengerjakan pekerjaan orang-orang rendahan. Seperti kata seorang mantan presiden kita, B. J. Habibie yang katanya ingin menkonversi NKRI yang berbasis agraris ini menjadi negara industri. Saya mulai paham kenapa beliau berkata seperti itu. Orang-orang yang berlatar belakang fisika cenderung menilai segala sesuatunya berdasarkan konsep fisika. Orang-orang yang berlatar belakang insinyur ingin semua kurikulum diganti dengan hal-hal yang menunjang profesi keinsinyuran (agama dihapus, pendidikan Pancasila dihapus, dll dan hanya ada tutorial autoCAD). Orang-orang yang tadinya jualan meubel, ingin semua penduduk jadi pengrajin meubel, dan untuk itu harus dibuat subsidi bagi pengrajin meubel, padahal dia lupa dalam teori ekonomi, tingginya penawaran akan mengakibatkan harga barang menurun. Banyaknya handphone di pasaran, mengakibatkan harga handphone lebih rendah dari harga celana dalam, begitu juga dengan meubel tadi. Jadi perkataan pak Habibie itu tentu saja bisa kita sanggah. Sudah ada RRC yang jadi negara industrialis, sudah ada amerika yang jualan senjata. Kalo semua ikut-ikutan jualan senjata, maka yang beli senjata siapa. Singapura itu bisa kaya lantaran ada Indonesia yang jadi daerah pemasaran terdekatnya, di samping ukuran negara nya juga tidak begitu luas.
Semua orang-orang ingin jadi pengusaha lantaran terobsesi dengan biografi para pengusaha yang sukses, padahal nyatanya dalam piramida ekonomi, pengusaha itu berada pada puncak piramida. Mereka bisa punya banyak uang, tapi tidak boleh terlalu banyak orang-orang yang sejenis dengan mereka. Kalo Anda ingin jadi seorang pemilik bank swasta, maka Anda harus membuka jaringan bank di berbagai daerah. Nasabahnya tentu saja adalah para pengusaha yang lain. Mungkin penjual kain, penjual beras, penjual emas, atau penjual-penjual lainnya, tapi gak mungkin nasabahnya pemilik bank swasta juga. Penjual kain juga demikian. Walaupun Jusuf Kalla bisa kaya lantaran merintis karirnya dari berjualan kain, tidak lantas kita semua harus berjualan kain. Karena tidak mungkin kita berjualan kain pada penjual kain juga. Harus ada yang bertani, harus ada yang jadi nelayan. Dan nyatanya 80 persen penduduk Indonesia adalah petani dan nelayan. Indonesia bisa colaps kalo semua orang ingin membuka bank swasta. Saya ketika membaca biografi orang-orang seperti itu, pelajaran yang saya dapatkan adalah bukan lantaran bagaimana bisa kaya dengan berjualan kain atau membuka bank swasta, tetapi bahwa dalam hidup ini, agar bisa tetap hidup, kita harus bekerja, mencari uang, apapun pekerjaan kita.
Kembali ke persoalan sekolah tadi. Saya tidak sepakat bahwa pendidikan sampe perguruan tinggi adalah hak semua anak bangsa. Alasannya adalah pendidikan sampe perguruan tinggi itu sudah cukup elit di samping cukup mahal. Mahal dari segi biaya dan juga waktu. Bayangkan, kita kuliah sampe 5 tahun. Andaikan waktu 5 tahun kita gunakan untuk menjadi pengusaha dengan giat, sudah berapa keuntungan yang kita peroleh. Atau kalo kita jadi petani tentu sudah sangat banyak pohon-pohon berbuah yang kita tanam. Jika pemerintah berdalil bahwa semua orang berhak untuk jadi cerdas, lantas pertanyaan saya yang harus dijawab pemerintah adalah, kenapa tidak ada S3 akuntansi, kenapa tidak ada S3 kebidanan, kenapa tidak ada S3 penerbangan, kenapa tidak ada S3 pelayaran, dll bidang yang sama sekali tidak ada S3 nya. Ya, tanpa menunggu pemerintah menjawab, kita tentu sudah tahu jawabannya. Ngapain ngeluarin bayi lewat vagina mesti di S3-kan, ngapain nerbangin pesawat pake di S3-kan, ngapain ngitung debit-kredit mesti di S3-kan. Jadi pendidikan-pendidikan tinggi itu sama sekali tidak kita butuhkan. Untuk bisa cerdas, dan mengenal konsep benar salah, pendidikan SMA saya kira sudah cukup. Kita tidak perlu meniru Singapura yang memberi syarat semua warga negara adalah S1. Karena di Singapura semua lapangan pekerjaan memang mensyaratkan keterampilan S1, beda dengan Indonesia. Jadi ini sama sekali bukan mengenai persoalan siapa menaruh standar pendidikan paling tinggi, tetapi soal kebutuhan ekonomi. Kalo Anda ingin tahu seberapa kuat motif ekonomi dalam sejarah NKRI ini, saya sodorkan sebuah fakta sejarah. Anda tahu kenapa Amerika membisiki Soekarno agar menolak konsep R.I.S yang dicanangkan Belanda, itu lantaran dalam pembagian wilayah dalam konsep R.I.S itu, semua blok-blok minyak di Sumatra dikuasai oleh Belanda. Belanda udah tahu bagaimana mengolah minyak. Indonesia belum tahu. Jadi Amerika menyingkirkan Belanda dalam pengolahan minyak di Indonesia. Bahasa keren nya, Indonesia beralih dari penjajahan kasar (Hard Imperialism) menjadi penjajahan secara halus (Soft Imperialism).
Kalo dulu zaman kolonial, VOC melakukan tebang paksa ribuah pohon cengkeh di pulau Maluku, lantaran banyaknya stok cengkeh mengakibatkan harga cengkeh di pasaran dunia menurun yang mana merugikan, lantaran ongkos pengiriman cengkeh per-kilo melaui kapal-kapal tidak bisa tertutupi dengan harga penjualan. Bisakah penguasa saat ini menutup paksa sekolah-sekolah (baca: universitas) yang sama sekali tidak dibutuhkan tersebut. Mengingat banyaknya sekolah, mengakibatkan harga jual alumni sekolah menjadi turun. Dan terjadi inefisiensi yang mengakibatkan kerugian, lantaran “biaya produksi 1 alumni” itu sangat besar dan tidak bisa ditutupi oleh resultan gaji yang mereka dapatkan setelah menempuh dunia pekerjaan.
Pemerintah bisa menempuh cara lain, yakni dengan membatasi jumlah tampungan per tahun dari sekolah-sekolah tersebut, seperti yang sudah dilakukan selama ini. Mirip lah dengan formasi PNS yang hanya menyediakan sekian orang dalam formasinya. Apa salahnya pemerintah melakukan hal yang sama pada ranah pendidikan (sesuatu yang urgensinya lebih rendah ketimbang memperoleh pekerjaan). Tapi sudah terlalu banyak sekolah dan implementasi di lapangan bisa ribet (walaupun bisa kalo dipikirkan secara serius). Atau bisa juga pemerintah melakukan second fundamental doctrine (setelah Pancasila) yakni dengan memberi penekanan kewirausahaan pada peserta persekolahan. Bahwa kita sekolah bukan semata untuk mencari pekerjaan. Kita sekolah untuk menjadi pintar. Agar maju dalam IPTEK, agar bisa merubah tanah menjadi emas, gurun menjadi perkebunan (seperti di Israel), dll idealisasi. Walaupun kenyataannya ini sama sekali sulit dimengerti oleh orang-orang Indonesia (seperti hal nya tidak semua orang bisa memahami hakikat Pancasila). Orang-orang Indonesia (pada umumnya) sepertinya sudah termakan doktrin primordial bahwa kita disekolahkan agar menjadi orang kantoran, “terangkat”, menjadi orang besar, dll. Jadi satu-satunya cara yang paling realistis yang bisa ditempuh oleh pemerintah/penguasa adalah menutup sekolah-sekolah yang tidak dibutuhkan tersebut. Bukankah sekolah pilot saja sudah dibatas-batasi oleh pemerintah. Apa salahnya sekolah-sekolah lainnya juga.
Wednesday, August 27, 2014
Perbedaan quantifier dalam Regex
Terdapat tiga modus quantifier dalam regex, yang pertama adalah greedy, kedua adalah reluctant, dan yang ketiga adalah possessive. Berikut penjelasannya:
Dalam modus greedy, matcher pertama-tama nge-match seluruh string. Jika tidak ditemukan yang match, dia akan melakukan backtracking dengan membuang satu huruf dari bagian yang match dari input string (yang sudah menjadi bagian match-nya) untuk dipake/di-match oleh character berikutnya pada matcher. Misalnya jika pattern-nya adalah .*foo ketika string input adalah xfooasdasfsdfsdafoo maka yang terjadi adalah, bagian pertama dari matcher, yakni .* (yang artinya match semua jenis character dengan jumlah berapa saja, zero or more times), akan nge-match seluruh input string (greedy = rakus/sebanyak mungkin). Karena seluruh string sudah match dengan dia, otomatis bagian berikutnya dari matcher, yakni character f tidak akan mendapat jatah lagi, dan tidak match. Jadi quantifier tadi, yakni *, akan membuang satu character dari bagian match-nya sehingga character o pada input string menjadi unmatch (di luar dari bagian match-nya), dan ini yang selanjutnya akan di-match dengan character f dari matcher. Namun belum match, dia buang lagi o berikutnya, dan belum match juga dengan f pada matcher, maka f tadi dibuang lagi dari bagian match dari matcher .* sehingga bisa dipake oleh character f dari matcher, dan ini baru match. Kemudian character berikutnya dari matcher yakni o dan o, dengan sendirinya akan match dengan dua character sebelumnya yang sudah dibuang oleh matcher .* yakni o dan o.
Dalam modus recultant, dia akan nge-match sesedikit mungkin (berkebalikan dengan modus greedy tadi). Jadi dalam input yang diberikan, yakni xfooasdasfsdfsdafoo, matcher .*? akan ngematch sesedikit mungkin, yakni pertama match dengan string dengan zero-length, atau “” (tanda kutip di sini menunjukkan ada string di situ yang tidak keliatan), sesuai dengan defenisinya (zero or more times). Selanjutnya bagian berikutnya dari matcher, yakni f, akan mencoba nge-match dengan mengambil satu-satu dari string yang tersisa, yakni xfooasdasfsdfsdafoo (di luar string zero-length tadi), di mana pertama-tama dia mencoba nge-match dengan character x. Karena tidak match, maka quantifier *? akan melahap satu lagi dari string input (melakukan backtrack) yakni x, sehingga bagian pertama dari matcher, yakni .*? akan menyisakan fooasdasfsdfsdafoo untuk di match dengan bagian berikutnya dari matcher, yakni f. Karena sudah match, maka bagian berikutnya dari input string yang tersisa yakni character o dari ooasdasfsdfsdafoo yang akan dimatch dengan bagian berikutnya dari matcher yakni o, demikian pula untuk o berikutnya.
Modus possessive sama sekali tidak melakukan backtracking. Jadi quantifier .*+ akan melahap semua string input, dan sama sekali tidak menyisakan untuk bagian berikutnya dari matcher, yakni f, o, dan o. Sehingga hasil keseluruhannya adalah string input sama sekali tidak match dengan matcher.
Saturday, August 23, 2014
Cross di dalam Lingkaran
Dalam postingan kali ini sebenarnya saya ingin berbagi permasalahan sekaligus ilmu yang mungkin bermanfaat bagi pembaca sekalian. Gambar di atas dikutip dari bukunya Edwin J.Purcell pada bab aplikasi turunan/derivatif, spesifiknya bagaimana menggunakan turunan dalam memecahkan persoalan optimisasi. Saya kemarin sudah mencoba menjawab soal ini, namun saya merasa kurang confidence dengan jawaban saya. Entah di mana kesalahan penurunannya yang menggiring saya pada kesimpulan bahwa sudut yang dimaksud adalah nol.
Akhirnya saya buat sebuah aplikasi yang mengkonfirmasi dugaan saya itu. Dan ternyata dugaan saya salah. Nilai maksimumnya bukan terletak ketika sudutnya sama dengan nol seperti yang terlihat pada gambar di bawah ini. Animasinya saya buat dengan JavaFX, sebagaimana animasi lainnya di blog ini. Dan Anda bisa melihat source-nya di Github. Dan saya sampai sekarang belum menemukan kesalahan penurunannya, atau jawaban yang benar untuk membuktikan nilai sudut ketika luas cross di dalam lingkaran tersebut bernilai maksimum.
Mudah-mudahan ada pembaca yang tertarik menyelesaikan persoalan di atas untuk mendapatkan jawaban analitisnya.
Friday, August 15, 2014
Mencari data terduplikasi dengan menggunakan Java HashMap
distinct
yang mana secara kasar bisa dikatakan bahwa perintah ini menggunakan hashmap dalam implementasinya. Saya berikan contoh, adalah bagaimana mencari dalam suatu file pada baris ke berapa saja kolom ke-x mengalami duplikasi. Sebenarnya ini perluasan dari pertanyaan fundamental yakni, apakah suatu data memiliki jumlah lebih dari satu dalam suatu kumpulan data. Kemudian saya melakukan perluasan dengan memberikan jawaban mengenai di baris mana saja data tersebut mengalami duplikasi. Potongan kodenya dapat dilihat pada script berikut:
Untuk mendemonstrasikan apakah script ini berjalan dengan baik, ada baiknya pembaca membuat sendiri test-case nya. Buat aja beberapa baris yang data pada kolom-kolomnya itu beda, kecuali pada beberapa kolom yang dibuat sama. Kemudian selanjutnya pembaca jalankan aja script ini untuk mengetesnya.
Tuesday, July 29, 2014
Bagaimana mendownload video dengan TOR browser
Tuesday, July 15, 2014
Statistik Quick Count
Sunday, May 11, 2014
Gerak Pada Bidang Miring: Kesalahan Terbesar Microsoft Excel VBA
Gambar 1. Geometri Bidang Miring |
Berikut ini adalah cuplikan video hasil implementasi dari rumus di atas di JavaFX:
Sementara source code untuk implementasi tersebut dapat anda lihat di github.
Adapun video dari keanehan Microsoft Excel yang dimaksud adalah:
di mana contoh implementasinya adalah
Sub TestAnimasi() total_iterasi = 0 Dim shape As shape namaBenda = "Kotak" Set shape = Sheet1.shapes(namaBenda) Dim segitiga As shape Set segitiga = Sheet1.shapes("Bidang Miring") lokasiSegitigaX = segitiga.Left lokasiSegitigaY = segitiga.Top panjang = segitiga.Width lebar = segitiga.Height ' Hitung kemiringan bidang Dim sudutDerajat As Double sudut = Math.Atn(lebar / panjang) sudutDerajat = sudut / WorksheetFunction.Pi * 180 shape.Rotation = sudutDerajat 'Hitung default posisi defaultX = segitiga.Left + shape.Height * Sin(sudut) defaultY = segitiga.Top - shape.Height * Cos(sudut) 'Letakkan kotak pada bagian awal dari bidang miring shape.Left = defaultX shape.Top = defaultY n = Sheet1.Cells(12, 13) Sheet1.Cells(22, 16) = sudutDerajat panjangLintasan = Math.Sqr(lebar * lebar + panjang * panjang) spasiLintasan = panjangLintasan / n lintasanAwal = 0 Do DoEvents shape.Left = shape.Left + spasiLintasan * Cos(sudut) shape.Top = shape.Top + spasiLintasan * Sin(sudut) total_iterasi = total_iterasi + 1 lintasanAwal = lintasanAwal + spasiLintasan timeout (0.2) Loop Until total_iterasi = n - 1 End Sub Sub timeout(waktu As Double) StartTime = Timer Do DoEvents Loop Until (Timer - StartTime) >= waktu End Sub
Monday, April 21, 2014
Penggunaan FXML dalam membentuk GUI dengan javaFX
:
Sehingga file fxml yang sebelumnya berbentuk:
public PlayerController(Group root) throws IOException { FXMLLoader loader = new FXMLLoader(getClass().getResource("Player.fxml")); loader.setController(this); loader.setRoot(this); loader.load(); root.getChildren().add(this); this.root = root; this.mainStage = (Stage) root.getScene().getWindow(); }Untuk melengkapi tutorial kali ini, saya memberikan sebuah proyek kecil yakni membuat sebuah media player dengan playlist dengan menggunakan javaFX. Playlist yang dimaksud dapat digunakan layaknya playlist di media player yang biasa kita kenal (semacam winamp, jet audio atau lain-lain) yakni dapat di-repeat kembali ke daftar pertama ketika lagu terakhir selesai. Bagi pembaca yang tertarik mencoba, dapat meng-clone source code-nya di github: https://github.com/gunungloli666/example-media-player-with-playlist/tree/master/src/fjr/example/mediaplayer/playlist
Thursday, April 17, 2014
Benchmarking operasi matriks pengganti loop di MATLAB
Sebenarnya tulisan ini hanya sekedar mengulangi apa yang sudah saya singgung di tulisan sebelum-nya mengenai seberapa besar pengaruh penggunaan operasi matriks dalam mereduksi waktu komputasi di MATLAB. Namun dalam tulisan ini saya lebih menekankan pada proses benchmarking-nya. Untuk membuktikan perbedaan besar antara menggunakan operasi matriks dengan menggunakan standar pemrograman biasa (loop: for, while, dll) di MATLAB maka anda bisa mengetes potongan script berikut:
clear all ; clc; % buat matriks M ukuran 5000 x 5000 yang elemennya bilangan bulat acak dari 1 sampai 10 M = randi(10,5000,5000); % buat matriks N yang ukuran dan nilai elemennya sama dengan matriks M % ingat, tanda '=' di MATLAB bukan menandakan pointer kalo merujuk % pada matriks. Jadi operasi pada elemen M tidak akan berpengaruh pada elemen N. N = M; [a,b] = size(M); tic; for i=1:a, for j=1:b, if M(i,j) > 5 M(i,j) = 20000; end end end disp(['lama pake loop = ', num2str(toc)]); tic; N(N>5) = 20000; disp(['lama pake indeks = ', num2str(toc)]); % cek apakah elemen kedua matriks sama... % tanda '==' pada MATLAB bukan menandakan cek objek, tapi cek elemen if M==N, disp('yes..'); endHasil eksekusinya untuk situasi komputer saya (core i3 dengan ram 4 giga) adalah operasi matriks mampu mereduksi waktu komputasi hingga 5 kali lipat.
clear all ; clc; lama_loop = 0; lama_indeks = 0; iter = 0; while iter < 23 M = randi(10,5000,5000); N = M; [a,b] = size(M); tic; for i=1:a, for j=1:b, if M(i,j) > 5 M(i,j) = 20000; end end end lama_loop = lama_loop + toc; tic; N(N>5) = 20000; lama_indeks = lama_indeks + toc; iter = iter + 1; end disp(['lama operasi loop untuk 100 iterasi = ', num2str(lama_loop)]); disp(['lama operasi matriks untuk 100 iterasi = ', num2str(lama_indeks)]);Hasilnya kurang lebih sama.
Sunday, April 13, 2014
Menghitung luas area yang gelap pada image di MATLAB
clc; clear all ; [a,b] = imread('polpot.jpg'); [m,n,o] = size(a); % pertama akan ditentukan apakah nilai RGB pada koordinat seragam. Misalnya % kita ambil sampel koordinat dari 10 baris pertama dan 10 kolom pertama. HJ = (a(1:10,1:10,1) == a(1:10,1:10,3) ) & ((a(1:10,1:10,1) == a(1:10,1:10,2) )) ; HJ %% % yang ternyata elemen matriks HJ semua 1 yang menandakan semua nilai RGB piksel seragam. % Untuk membuktikan, coba kita Print % nilai elemen pada baris dan kolom tersebut a(1:10,1:10,:) %% % sekarang karena outputnya seragam maka otomatis nilai sum terhadap % seluruh matriks HJ akan sama dengan penjumlahan terhadap seluruh matrix % 'ones' yang ukurannya sama dengan HJ. Jika logika ini kita perumum, akan bisa digunakan pada % kasus matrik HH yang mencakup seluruh area dari image, yang akan kita % peroleh adalah HH = (a(:,:,1) == a(:,:,2)) & (a(:,:,1) == a(:,:,3)); if sum(sum(HH)) == sum(sum(ones(m,n))) M = a(:,:,1) <10; disp(['persen area yang nilai pixel-nya di bawah 10 (nilai 0 berarti hitam): ',... num2str(sum(sum(M))/sum(sum(ones(m,n)))*100), ' persen']); else disp('nilai pixel tidak seragam') % karena nilai pixel tidak seragam, maka kita bisa gunakan asumsi bahwa % nilai pixel yang mendekati warna gelap itu yang nilai pixel-nya % kurang dari 5 untuk R, 5 untuk G, dan 5 untuk B. Memang nilai pixel % yang benar-benar hitam adalah R = 0, G = 0, dan B = 0. Akan tetapi % kita hanya mendapat sedikit porsi dari area image untuk nilai tersebut. % Jadi kita gunakan pendekatan tadi. M = (a(:,:,1) < 5) & (a(:,:,2) < 5) & (a(:,:,3) < 5); disp(['persen area yang nilai pixel untuk R < 5; G < 5, dan B < 5: ',... num2str(sum(sum(M))/sum(sum(ones(m,n)))*100), ' persen']); end %% % Kita juga bisa menentukan pada baris dan kolom mana saja yang nilai pixel % R, G, B tidak seragam logic = (a(:,:,1)== a(:,:, 2)) & (a(:,:,1)== a(:,:,3)); [x1,x2,x3] = ind2sub(size(a),find(~logic)); disp('10 baris pertama dan 10 kolom pertama yang pikselnya tidak seragam: '); x1(1:10)' x2(1:10)' disp('nilai RGB pada baris dan kolom tersebut: '); a(x1(1:10),x2(1:10),:)