Sunday, July 7, 2013

Vektorisasi loop molekular dinamik di MATLAB


Pada banyak kasus tidak selamanya dokumentasi resmi itu bisa dipercaya. Atau secara umum tidak semua buku yang kita baca di bangku kuliah itu bisa dipercaya. Contohnya waktu adanya sindrom HIV AIDS tahun 80-an. Semua orang menduga bahwa penyakit ini disebabkan oleh hubungan sesama jenis dan ini menjadi asumsi standar dalam prosedur  pemeriksaan dokter pada dekade tersebut. Akibatnya apa, banyak orang yang sebenarnya tertular penyakit tersebut, akan tetapi karena  semua dokter pada saat itu rujukannya pada buku yang menyatakan HIV itu hanya tertular melalui hubungan sesama jenis, tidak bisa mendapatkan penanganan yang sesuai. Nanti baru seorang Magic Johnson yang notabene orang berduit yang mengeluhkan gejala tersebut, barulah dokter-dokter berfikir di luar kotak. Padahal dengan diagnosis singkatpun seharusnya bisa disimpulakan: bagaimana mungkin seorang pebasket homo? Ajaibnya Magic Johnson mampu membayar untuk tes lebih lanjut.

Hal ini berlaku pula dalam dunia pemrograman. Dalam dokumentasi resmi MATLAB yang saya ambil di link http://www.mathworks.com/help/matlab/matlab_prog/techniques-for-improving-performance.html disebutkan bahwa agar program MATLAB bisa berjalan dengan lebih cepat maka salah satu cara yang bisa digunakan adalah menggunakan pre-alocating array dan menghindari penggunaan looping:
http://stackoverflow.com/questions/12074373/matlab-vectorization-how-to-avoid-this-for-loop
http://stackoverflow.com/questions/16214891/how-to-avoid-a-for-loop-in-matlab-when-performing-a-operation-on-each-row-in-a
Akan tetapi baru-baru ini saya mencoba mengetes dugaan tersebut dalam simulasi molekular dinamik. Dan ternyata hasilnya tidak sesuai yang ada pada buku. Rupanya pengembangan MATLAB akhir-akhir ini cenderung melakukan optimisasi pada looping ketimbang prosedur standar (yakni operasi matriks) yang merupakan brand dari MATLAB.

Simulasi molekular dinamik sendiri saya translate dari sumber di
http://www.personal.psu.edu/auk183/MolDynamics/Molecular%20Dynamics%20Simulations.html
Yang aslinya dikembangkan dengan bahasa java. Setelah melakukan debugging yang susah payah, akhirnya saya berhasil mengembangkan versi MATLAB nya: menggunakan teknik vektorisasi yang menjadi brand MATLAB ketimbang menggunakan looping yang katanya  mengurangi performa. Berikut merupakan kode hasil vektorisasi tersebut

Adapun kode hasil translate secara 'mentah' adalah sebagai berikut

Setelah dieksekusi terlihat bahwa hasil penggunaan loop bukannya memperlambat performa, malah mempercepat performa dari program MATLAB sendiri. Rata-rata waktu eksekusi looping berada di sekitar 0.03 detik, sementara hasil vektorisasi ternyata membutuhkan waktu 3 kali lebih lama yani berada di sekitar 0.1 detik.

Saturday, July 6, 2013

Belajar Monte Carlo di MATLAB

Berikut saya berikan contoh program tentang bagaimana menghitung luas poligon dengan metode monte carlo. Saya harap dengan pemahaman ini, teman-teman semua bisa memahami hakikat dari monte carlo. Sehingga bisa menggunakannya untuk keperluan-keperluan lainnya.


Plot gerak jatuh bebas di MATLAB

Buat teman-teman sekalian yang ingin belajar plot gerak jatuh bebas di MATLAB berikut saya berikan sedikit tutorial. Semoga bermanfaat:




Thursday, July 4, 2013

Belajar Latex

Bagi teman-teman sekalian yang pengen belajar Latex, saya akan memberikan buku ala kadarnya yang jauh dari kesempurnaan. Semoga bisa dinikmati
Untuk downloadnya di:

Tuesday, July 2, 2013

Berkenalan dengan bahasa python

Pada kesempatan kali ini saya akan mencoba sedikit membahas tentang salah satu bahasa pemrograman yang cukup populer di dunia, yakni bahasa pemrograman python. Mengapa python, karena bahasa python merupakan salah satu bahasa yang bisa menghadirkan banyak fleksibilitas dengan kehandalan yang sudah diakui. Bagi saya python itu bahasa yang sangat fleksibel. Mungkin anda pernah punya pengalaman dengan bahasa semisal MATLAB atau sejenisnya. Tapi menurut saya bahasa tersebut terlalu kaku. Memang untuk para enggineer, MATLAB sudah menyediakan beberapa fitur built-in yang sangat membantu. Tapi jika dipikir-pikir dari sekian banyak fitur-fitur tersebut hanya sedikit saja yang benar-benar kita butuhkan. Yang lainnya merupakan fitur hasil abstraksi tingkat tinggi yang sebenarnya kurang begitu kita perlukan, atau bahkan sama sekali tidak sesuai dengan kebutuhan kita sehingga harus dimodifikasi lebih lanjut atau dicarikan alternatifnya.

Misalnya saja financial toolbox atau medical toolbox. Saya yakin kalo orang berkecimpung di dunia medis atau ekonomi, tentu sudah ada alat default yang biasa mereka gunakan yang spesifik untuk kebutuhan mereka ketimbang harus menggunakan MATLAB yang kurang populer di kalangan mereka. Bayangkan harga MATLAB berapa kemudian ukuran file instalasinya berapa, sementara yang kita butuhkan hanya operasi-operasi dasar matriks yang dalam bahasa lain pun sudah tersedia dengan gratis.

Python sendiri sebagai bahasa pemrograman punya domain penggunaan yang sangat luas di samping komunitasnya sangat aktif. Komunitas inilah yang menjadi penentu dalam pengembangan bahasa pemrograman. Kalo komunitasnya mandek otomatis bahasanya juga ikutan stagnan. Sementara kalo kita sudah sangat mahir di MATLAB atau beberapa bahasa pemrograman lainnya---kecuali kita seorang developer yang dihire untuk mempekerjakan proyek-proyek berbasis MATLAB---tentu lebih tertarik menggunakan bahasa-bahasa lain yang lebih interaktif dan free. Jika menguasai python, kecakapan tersebut bisa digunakan untuk kebutuhan lain misalnya untuk membangun aplikasi database atau aplikasi berbasis web. Sementara jika cuma tahu MATLAB, g ada yang bisa dilakukan (setidaknya di Indonesia ini). Bahkan di laboratorium fisika di seluruh dunia bahasa yang dipakai pun bukan MATLAB melainkan fortran atau C. Sementara untuk tahu bahasa fortran dan C, sebagai langkah awal kita harus belajar dulu bahasa yang konsepnya mudah dipahami semacam python.

Tapi ini perspektif pribadi. Anda boleh saja punya pendapat lain yang mungkin saja lebih shahih. Yang jelas untuk perkenalan saya akan memberikan sebuah potongan operasi dasar pada python. Kebetulan python sendiri merupakan bahasa yang sedikit banyak terinspirasi dengan bahasa Lisp---yakn penyerapan konsep List ke dalam struktur bahasanya----maka saya akan menggunakan konsep list tersebut yang kebetulan juga baru-baru ini saya pelajari:D.

Untuk mulai menggunakan python, terlebih dahulu kita mesti mendownload file instalasinya di https://code.google.com/p/winpython/. Sebagai perkenalan, berikut saya berikan sebuah listing tentang operasi perkalian matrix di python. Kebetulan saya sedang membuat buku (dalam bahasa Indonesia) untuk pemrograman di python---Masalahanya kalo dalam bahasa Inggris sangat melimpah di internet. Jadi penjelasannya menyusul di belakang.

Friday, June 28, 2013

Re-syncs subtitle dengan windows power shell

Pada kesempatan kali ini saya akan memberikan sedikit tips yang ada hubungannya dengan pengalaman saya semalam dalam menonton film. Kebetulan film tersebut saya download di youtube. Dan masalahnya adalah subtitle yang tersedia pada film tersebut adalah subtitle untuk 2 CD sementara filmnya 1 CD. Jadinya kacau.
Yang pertama saya pikirkan adalah bagaimana agar kedua substitlenya di merge aja. Maksudnya disamping dialognya digeser nomornya juga dirubah. Tapi masalahnya adalah kita g tau benar, berapa jeda antara habisnya substitle yang pertama dengan masuknya subtitle kedua. Jadi biar amannya mendingan file dipisah aja. Sisanya (kalo masih g sinkron) tinggal di shift-shift aja dengan tool bawaan dari media player. Sebenarnya yang saya maksud pada tutorial ini sedikit berbagi aja fungsi dari windows power shell (tentunya bagi yang belum tahu).



Berikut adalah listing dari program yang saya buat!

$ref_file = get-content ./1.srt
$cari = [regex] "^[1-9][0-9]{0,3}\b\s*$"; 
$cari1 = [regex] "-->"; 
$temp = ""; 
$i= 0;

foreach($item in $ref_file){
 if($item -match $cari){$i = [int]$item; }
 if($item -match $cari1){$temp = $item ; }
}
$temp = $temp.split("-->")[3].replace("\s+", "").split("[:,\,]");

$i++;

# geser sedikit dalam microsecond
$temp[3] = 200; 

( get-content ./2.srt) | 
foreach-object{
 $sambung = "";
 if($_ -match $cari1){
  $hasil = $_ -split $cari1 ; 
  $first = $hasil[0].split("[:,\,]"); 
  $second = $hasil[1].split("[:,\,]"); 
  
  $first[3] = [int]$first[3] + $temp[3]; 
  if([int] $first[3] -gt 1000){
   $first[2] = [int]$first[2] + 1; 
   $first[3] = [int]$first[3] - 1000; 
  }
  $first[2] = [int] $first[2] + $temp[2]; 
  if([int] $first[2] -gt 60){
   $first[1] = [int]$first[1] + 1; 
   $first[2] = [int]$first[2] - 60; 
  }
  $first[1] = [int] $first[1] + $temp[1]; 
  if([int] $first[1] -gt 60){
   $first[0] = [int]$first[0] + 1; 
   $first[1] = [int]$first[1] - 60; 
  }
  $first[0] = [int] $first[0] + $temp[0]; 
   
  $second[3] = [int] $second[3] + $temp[3]; 
  if([int] $second[3] -gt 1000){
   $second[2] = [int]$second[2] + 1; 
   $second[3] = [int]$second[3] - 1000; 
  }
  $second[2] = [int] $second[2] + $temp[2]; 
  if([int] $second[2] -gt 60){
   $second[1] = [int]$second[1] + 1; 
   $second[2] = [int]$second[2] - 60; 
  }
  $second[1] = [int] $second[1] + $temp[1]; 
  if([int] $second[1] -gt 60){
   $second[0] = [int]$second[0] + 1; 
   $second[1] = [int]$second[1] - 60; 
  }
  $second[0] = [int] $second[0] + $temp[0]; 
  
  $sambung = $first[0]+":"+$first[1]+":"+$first[2]+","+$first[3]+" --> "+$second[0]+":"+$second[1]+":"+$second[2]+","+$second[3];
 }
 # sebenarnya nomornya mau dirubah juga tapi g jadi
 # $_ -replace "^.*-->.*$" , $sambung -replace $cari , $i  ;
 $_ -replace "^.*-->.*$" , $sambung ;  
 # if($_ -match $cari){
  # $i++; 
 # }
} |
set-content  ./2_baru.srt; 

untuk file lengkapnya bisa anda liat di link berikut: https://github.com/gunungloli666/substitle

Wednesday, June 26, 2013

Tentang Enumi

Memang hidup sebagai programmer itu tidak mudah. Harus selalu tabah dalam mendebug program. Bayangkan membuat dokumen saja mesti pusing tujuh keliling buat nyari petunjuk sana-sini. Tadi malam saya bingung bagaimana membuat sebuah penomoran dalam beamer yang nomornya panjang dan lebih dari sebuah frame. Anda bisa menggunakan perintah \allowframebreak tapi itu ada masalah. Masalahnya adalah perintah itu akan mematikan overlay. Jadi tidak akan ada lagi efek warna-warni dalam presentasi anda. Cara yang paling bagus adalah menggunakan perintah \setcounter. Perhatikan cuplikan berikut

% enumi penomoran asli Latex, sementara saveenumi adalah buatan kita
\newcounter{saveenumi}
\newcommand{\simpan}{\setcounter{saveenumi}{\value{enumi}}} 
\newcommand{\ambil}{\setcounter{enumi}{\value{saveenumi}}}

\begin{frame} 
\begin{enumerate}
\item Item satu 
\item Item dua 
% dst 
\item Item yang masih muat 
\simpan % simpan hitungan default
\end{enumerate}
\end{frame}

\begin{frame}
\begin{enumerate}
\ambil % ambil hitungan yang disimpan
\item Item seterusnya
\end{enumerate}
\end{frame}

Semoga bermanfaat!

Wednesday, June 19, 2013

Elegi Pengguna Latex part II

Mengapa banyak orang indonesia yang salah paham dengan Latex?
Beberapa orang beranggapan bahwa Latex itu tidak bisa digunakan untuk membuat dokument yang fleksibel. Padahal latex itu sangat-sangat fleksibel lebih dari yang kita bayangkan sama-sama. Latex itu bisa membuat banyak hal, dan parahnya Latex itu open source. Artinya kita semua bisa membuat template presentasi kita sendiri semudah membalikkan telapak tangan. Latex bisa membuat grafis yang sangat indah.

Intinya butuh waktu. G ada kesuksesan yang instan. Kalo kita pikir-pikir hidup di dunia ini g ada artinya sih sebenarnya. Kita semua bakal mati. Kalo Ada hadits (saya g tau benar salahnya atau palsu tidaknya): bekerja untuk dunia seolah hidup selama-lamanya, bekerja untuk akhirat seolah mati besok, itu tidak menjamin apa-apa mengenai hakikat kebendaan. Benda tetaplah benda, kecuali kita menemukan suatu formula untuk merubah manusia jadi drakula yang tidak terbakar matahari, mungkin. Tapi tetap saja, hidup pasti berakhir.

Maksudnya Latex itu bisa digunakan untuk plot-plot yang keren seperti di sini:
Ada banyak tutorial tentang Latex:
Bagaimana membuat Latex template untuk presentasi yang keren:
dan masih banyak hal lainnya yang saya g perlu jelaskan.

Yang anda perlukan adalah berpegang pada mazhab tertentu. Soal dalil bisa dicari. Bagusan mana coba suatu produk yang didesain orang banyak, dengan produk yang dipikirkan sendiri-sendiri. Jangan baca biografi bill-gates, itu g sepenuhnya benar

Thursday, June 6, 2013

Kriptografi satu arah

package fjr.lain;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.Random;

public class Criptografi1 
{
 // ini adalah program kriptografi sederhana yang tidak mungkin bisa di decode kembali
 // kecuali jika anda bisa memahami benar pseudo random generator di java
 // istilahnya (pseudo) one-way cryptic
 static StringBuilder result ; 
 public static String getResult(String input){
  result = new StringBuilder(); 
  String[] split = input.split("\\s");
  Random rand = new Random(); 
  for(int i=0; i< split.length; i++){
   char[] temp = split[i].toCharArray();
   if(!(rand.nextInt(2) == 0)){ //biar masih kebaca
    for(int j = 0; j< temp.length; j++){
     int c = rand.nextInt(temp.length);
     char cc = temp[j]; 
     temp[j] = temp[c];
     temp[c] = cc; 
    }
   
   }
   result .append(String.copyValueOf(temp)).append(" ");
  }
  return result.toString().toLowerCase();
 }

 public static void main(String[]args){
  BufferedReader br = null; 
  try{
   br = new BufferedReader(new FileReader(new File("D:/source.txt")));
   String res = "";
   while((res = br.readLine())!= null){
    System.out.println(Criptografi1.getResult(res));
   }
  }catch(Exception e){
  }
 }
}
paad tulisan ini saya kana memberikan esbuha siiup untukmu eanosgr ho wahai skikaeh punaja aith aku kat uath apakah iin ubgsa abig tanesehka nautnjkgu yang jelas tiap lmmaa kua sangat rnidkmumneua aku ahner mengapa uka ibtuge taeg membiarkanku epabrhar aaudmp kau selalu mbripemi gabminaaa asnyaar ibas uesbebruht denganmu uka selalu berharap suatu tsaa aku jadi janda kau kana kuangkat jadi seorang ibu negara jkai aku nanti jadi presiden

tapi memang perasaan hati tak bisa aaiwdln aegmnpa nrtaauougm begitu tega memisahkan kita berdua apahka kau benar-benar autis taau gimana agyn lasej kau traeilht astgan nmasi saat kita ernbdhpaaa apakah semua nroga hanya mencoba iymanenkuaetmg aku ujag atk tauh yang sjeal aku sudah ealltru nciat aku akt bisa dilawan lagi untuk laules berbunga-bunga akietk mengenangmu hwaia uaapjn htia kua akan lsuela menunggu dan terus menunggu sampai suatu saat tiann auk anka idajmne adnja

Belajar Windows power shell

Pada kesempatan kali ini saya akan memberikan sedikit pencerahan kepada pembaca yang kebetulan mungkin punya pengalaman yang sama dengan saya. Apalagi jika pembaca adalah seorang pengguna windows yang setia, maka tutorial ini akan sangat berguna bagi anda. Mungkin kalo anda seorang maniak linux, maka tutorial ini adalah hal yang basi, jadi ini bukan ditujukan untuk anda. Bisa jadi dari tutorial inilah anda bisa menjadi seorang windows administrator yang disegani, yang mengelola super-komputer super komputer terkemuka di dunia. Intinya semua langkah besar di mulai dari langkah pertama.

Pasti ada yang bingung apa itu power shell? Sebenarnya power shell itu turunannya CMD. Kalo di linux kan ada bash, shed, awk, python dan lain-lain, jadi budayanya memang budaya shell scripting, tapi kan di windows budayanya budaya GUI alias main mouse-mouse-an, jadi sebagian pembaca, kecuali yang berlatar belakang IT pasti g tau apa itu shell-scripting. Yang jelas shell itu gunanya dahsyat luar biasa. Saya bingung mau ceritain gimana, yang jelas anda cobalah, pasti anda akan ketagihan. Kalo anda pernah menggunakan CMD, itu adalah shell. Kebetulan saya juga agak bingung membedakan antara shell, command-line, dan terminal[1]. Defenisi presisinya itu gimana, abstraksi fungsinya gimana. Yang jelas saya bukan ahli IT, saya hanya bisa meng-impress anda sekedarnya aja. Kalo anda tertarik lebih jauh, silakan googling di internet.

Sebenarnya saya ini lagi ada masalah merunning program, kebetulan programnya udah satu jam running-running dan g selesai-selesai running, makanya saya jadi bingung, what's going on. Apa yang terjadi sebenarnya. Padahal seharusnya, berdasarkan user manual itu mestinya selesai dalam 5 menit. Anda bisa lihat gambar berikut:



Jadinya saya bingung. Akhirnya saya memutuskan kenapa ada perintah tersebut. Di file manakah perintah tersebut berada.Kebetulan file-nya ada puluhan dan saya malas periksa satu-satu. Jadi sebagai amal jariah, saya akan perkenalkan kepada pembaca apa itu power shell. Nah untuk memulai power shell, anda harus klik start pada kiri bawah windows seven (saya g tau windows 8, yang jelas ini berlaku untuk windows 7---feeling saya power shell juga ada di windows 8):



Setelah anda buka akan muncul jendela berikut:



Kemudian ganti directory tempat script anda ditempakan. Ingat ya, windows power shell itu berekstensi .ps1, jadi scriptnya anda kasi nama makan.ps1, minum.ps1 pada saat menyimpannya (kan kalo microsoft word penamaannya adalah makan.docx, minum.docx, kemudian tulis aja scriptnya pake notepad atau editor lain persis seperti anda nulis MATLAB (kalo saya pake notepad++)). Liat gambar berikut bagaimana pindah directory/folder. Saya yakin kalo anda biasa pake CMD untuk menghapus virus atau merubah atribut file, pasti anda akan sudah terbiasa dengan hal-hal seperti ini.



Kemudian untuk merunning file ketik pada terminal power shell: .\nama_script_anda.ps1 :



Adapun isi script tersebut bisa anda lihat di listing berikut:
# untuk mencari perintah tertentu pada isi suatu file program
# dan mencari tahu pada baris mana perintah tersebut berada
$a = dir ;# directory saat ini

# string yang akan dicari, dalam hal ini perintah tertentu pada fortran
$my_regex = [regex] "In+\spoute_2D" 

# iterasi untuk seluruh isi directory saat ini
foreach($item in $a ){
 # baca isi dari file masing-masing file
 $content = get-content $item; 
 # iterasi terhadap baris dalam file
 $i = 0 ; # untuk menentukan pada baris mana perintah tersebut berada
 foreach($line in $content){
  $hasilcari = $my_regex.matches($line) ; 
  $hasilcari = $hasilcari[0];
  # jika ditemukan setidaknya satu kali saja perintah tersebut
  if($hasilcari.success){
   $i++ 
   write-host "dapat di file $item,  pada baris $i,  pada perintah: $line"
  }
 }
}
Dan hasil eksekusinya bisa dilihat pada gambar berikut:



Bayangkan bro, kalo ada 100 file, gimana anda mau periksa satu-satu, boring dan lama bangat bro. Sementara dengan script ini sekali running langsung ketahuan di mana tulangnya. Sebenarnya bisa juga anda membuat analogi perintah di atas pada bahasa lain, misalnya java atau MATLAB atau VB.net, tapi masalahnya repot ngimport-ngimport library dan lain segala macam. Anda mesti menginstall java atau .net framework atau bahkan MATLAB---ditambah lagi running nya berat. Sementara ini sudah tersedia built in di windows 7. Apalagi power shell itu bisanya bukan cuma memanipulasi string aja, dia juga bisa banyak hal, misalnya mengakses Active-X atau COM objek (silakan browsing di google apa maksud istilah ini). Anda benar-benas bisa jadi seorang admisnitrator komputer yang layak pakai kalo sudah benar-benar jago

Saya yakin semua isi listing di atas bisa anda ketahui dengan mudah, kecuali mungkin sedikit regular expression yang anda bisa liat di [2]. Kemudian soal power shell, ada buku bagus yang bisa anda download [3].

Referensi:
1. http://en.wikipedia.org/wiki/Windows_shell
2. http://www.regular-expressions.info/characters.html
3. http://en.bookfi.org/book/609394