Sunday, September 22, 2013

Elegi penggunaan Latex part III

Kali ini saya ingin melanjutkan tulisan saya sebelumnya yang mencoba mengajak pada pembaca tentang betapa pentingnya menulis pake Latex.
Sebenarnya di internet sudah ada alat lain yang bisa digunakan untuk menulis latex selain menggunakan koding manual. Nama alat ini adalah Lyx. Sebelum saya mengenal Latex sudah terlebih dahulu saya mengenal Lyx, sayangnya saya g tau cara pakenya karena saya g familiar dengan sintax Latex. Sekarang pun walau saya udah tahu syntax Latex, tapi tetap aja saya bingung pake Lyx. Mungkin pembaca yang lebih berpengalaman sudah sangat familiar sehingga tidak kesulitan.
Masalahnya kemarin sampe kenapa saya tidak jadi beralih ke Lyx adalah karena saya pengen membuat cheatsheet untuk ujian. Saya bingung gimana ngaturnya biar bisa sekecil mungkin di Lyx. Akhirnya terpaksa saya koding manual pake Latex editor (tex studio) dan jadi deh yang bisa anda baca di sini:
https://docs.google.com/file/d/0B1irLqfPwjq0UWdwZ0hYR21DMk0/edit
Adapun source latex-nya anda bisa liat di sini:
https://gist.github.com/fjr66/6654227
Saya tidak katakan hal ini g bisa dilakukan di Lyx, cuman untuk pengalaman saya kemarin, saya g bisa. Makanya saya langsung koding aja di latex editor.
Di  samping itu --- untuk coder tahap lanjut --- Lyx itu sudah terintegrasi antara editor dan compilernya. Jadi bagi yang biasa di Linux g akan bisa merasakan penggunaan editor-editor yang tersedia di Linux, semisal gnu Emacs atau vi editor yang punya fasilitas yang sangat keren untuk dilewatkan. Dan tentunya bisa juga digunakan untuk menulis Latex.

Tuesday, September 17, 2013

Java Parallel fork/join

Dalam Tulisan kali ini saya ingin sedikit berbagi pengalaman tentang hal-hal terbaru yang nanti akan keluar di java 8. Seperti kita ketahui, nanti rencananya akan ada sedikit pembaruan terhadap rilis selanjutnya dari java, antara lain adanya lambda expression, bulk operation, method-reference, dan yang paling keren nanti adalah adanya optimasi parallel-computing dengan bantuan teknik fork/join.

Optimisasi dengan metode fork/join ini mengambil keuntungan dari kemampuan multicore processor. Sehingga multithread tidak dicoding secara manual, akan tetapi tinggal menerapkan implementasinya.  Agar bisa menggunakan konsep fork/join ini, terlebih dahulu anda harus menyediakan jdk8 beserta IDE yang sesuai. Bagi pengguna eclipse petunjuknya bisa dilihat di link berikut:
 http://www.oracle.com/technetwork/articles/java/lambda-1984522.html

Setelah saya mencoba mengimplementasikan teknik ini pada sebuah  percobaan sederhana, yakni simulasi SPH, ternyata terdapat perbedaan yang cukup signifikan antara menggunakan teknik ini dengan tidak menggunakan teknik ini. Dalam simulasi SPH tersebut, partikel yang digunakan sejumlah 2500. Ketika tidak menggunakan teknik fork/join simulasi yang dilakukan agak tersendat-sendat. Hal ini dapat dilihat pada video berikut:



Sementara ketika teknik fork/join digunakan hasil simulasinya menjadi mulus, yang dapat dilihat pada video berikut:



Adapun sedikit potongan kode bagaimana mengimplementasikan konsep ini ke dalam project yang dibuat---disamping sudah dijelaskan pada tutorial di atas---dapat dilihat pada snippet berikut:

Tuesday, September 3, 2013

Barnes-hut tree in JavaFX

Pada kesempatan kali ini saya akan membagikan sedikit pengalaman saya dalam javaFX kepada pembaca semua yang mungkin bisa mengambil manfaat. Sekaligus mempopulerkan blog saya ini.
Yang saya akan ungkapkan kali ini adalah algoritma barnes-hut yang merupakan algoritma yang biasa digunakan dalam software-software simulasi fisika (semisal molekular dinamik dan semisalnya) [1].

Kali ini saya belum membahas tentang bagaimana algoritma tersebut digunakan untuk menghitung interaksi dalam simulasi. Akan tetapi yang saya lakukan adalah memberi gambaran dasar bagaimana algoritma tersebut bekerja. Tepatnya saya akan melakukan penggambaran animasi barnes-hut tree yang merupakan elemen inti dari algoritma ini.

Mengapa algoritma ini digunakan, adalah karena efisiensinya yang lebih bagus ketimbang skema brute-force yang biasa kita gunakan. Di mana kalo pake brute-force itu kompleksitasnya sampe O(N^2) maka dalam barnes-hut ini, kompleksitasnya adalah O(N log N).



Untuk source-nya dapat anda download di link berikut:
https://docs.google.com/file/d/0B1irLqfPwjq0YXA0emt2WWMtNkU/edit?usp=sharing


Referensi:
1. http://arborjs.org/docs/barnes-hut

Friday, August 23, 2013

Cara sortir di Java

Tanpa perlu basa-basi saya akan memberikan sedikit tutorial yakni bagaimana cara menyortir list di java. Seperti kita ketahui list itu sendiri merupakan suatu kumpulan objek. Untuk keperluan sortir sendiri, java sudah menyediakan fasilitas built-in ke kita. Yakni dengan menggunakan utilitas pada java Collections. Berdasarkan informasi yang saya peroleh, algoritma yang digunakan dalam java sorting ini adalah merge sort [1]. Tanpa perlu berbasa basi saudara tinggal menyalin contoh berikut dan langsung di running di komputer anda.

Jika sudah maka hasil yang akan ditampilkan adalah sebagai berikut:

1. http://www.coderanch.com/t/520171/java/java/Collections-sort-merge-sort-insteadof

Tuesday, August 20, 2013

Animasi Bola Biliard dengan JavaFX

Kali ini saya akan memberikan sebuah tutorial mengenai bagaimana membuat animasi bola billiard dengan javaFX yang preview-nya dapat dilihat pada gambar berikut:

 

Adapun source codenya adalah sebagai berikut:

package fjr.collision;

import java.util.ArrayList;
import java.util.Random;

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.shape.Circle;
import javafx.scene.shape.CircleBuilder;
import javafx.stage.Stage;
import javafx.util.Duration;

public class BilliardBallDetection extends Application {

  ArrayList listParticle;
 ArrayList listCircle; 

 double xwidth = 400;
 double ywidth = 400;

 double timeStep = 2.5;
 double numberParticle = 9;
 Random rand = new Random();

 double dmin = 30.0;

 double xmax = xwidth;
 double xmin = 0.0;
 double ymax = ywidth;
 double ymin = 0.0;
 double size = 0.0;

 double dmax = 0.0;
 
 double vmax = 3.0; 


 Timeline animation; 
 Button buttonPause, buttonPlay; 
 
 @Override
 public void start(Stage primarySrage) throws Exception {
  // TODO Auto-generated method stub
  generateParticle();
  removeOverlap(listParticle);
  generateCircle();
  
  Group root = new Group(); 
  for(int i =0; i< listCircle.size(); i++){
   Circle c = listCircle.get(i); 
   root.getChildren().add(c); 
  }
  
  animation = new Timeline(); 
  animation.setCycleCount(Timeline.INDEFINITE);
  animation.setAutoReverse(false);
  
  KeyFrame kf = new KeyFrame(Duration.millis(20), new EventHandler(){

   @Override
   public void handle(ActionEvent event) {
    // TODO Auto-generated method stub
    checkBoundary();
    calculateCollision();
    moveParticle(); 
    redrawCircle();
   }
   
  }); 

  animation.getKeyFrames().add(kf); 
  
  root.getChildren().addAll(buttonPlay = ButtonBuilder.create()
    .text("PLAY").onAction(new EventHandler() {

     @Override
     public void handle(ActionEvent arg0) {
      // TODO Auto-generated method stub
      animation.play();
     }
    }).translateX(10).translateY(10)
    .build(), 
    buttonPause = ButtonBuilder.create()
    
    .text("PAUSE").translateX(80).translateY(10)
    .onAction(new EventHandler() {

     @Override
     public void handle(ActionEvent arg0) {
      // TODO Auto-generated method stub
      animation.pause();
     }
    })
    .build() 

    ); 
  primarySrage.setScene(new Scene(root, xwidth, ywidth));
  primarySrage.show();
 }
 
 private void redrawCircle(){
  for(int i=0; i< listCircle.size(); i++){
   Circle c = listCircle.get(i); 
   Particle  p  = listParticle.get(i); 
   c.setCenterX(p.x);
   c.setCenterY(p.y);
  }
 }
 
 
 private void generateCircle(){
  listCircle = new ArrayList<>(); 
  for(int i=0; i< listParticle.size(); i++){
   Particle p = listParticle.get(i); 
   Circle c = CircleBuilder.create()
     .centerX(p.x).centerY(p.y).radius(dmin)
     .build(); 
   listCircle.add(c);
  }
 }

 private void generateParticle() {
  listParticle = new ArrayList<>();
  for (int i = 0; i < numberParticle; i++) {
   Particle particle = new Particle(rand.nextDouble() * xwidth,
     rand.nextDouble() * ywidth, rand.nextDouble() * vmax,
     rand.nextDouble() * vmax);
   listParticle.add(particle);
  }
 }


 private void calculateCollision(){
  for(int i=0; i< listParticle.size(); i++){
   Particle p1  = listParticle.get(i); 
   for(int j= i+1; j< listParticle.size(); j++ ){
    Particle p2 = listParticle.get(j); 
    chekCollision(p1, p2);
   }
  }
 }
 
 public void chekCollision(Particle p1, Particle p2) {
  
  if (isOverlap(p1, p2)) {
   
   double deltaX = p1.x - p2.x;
   double deltaY = p1.y - p2.y;
   double distance =  Math.sqrt(deltaX * deltaX + deltaY * deltaY);
   deltaX = deltaX/ distance;
   deltaY = deltaY/distance; 
   
   double aci = p1.vx * deltaX + p1.vy * deltaY; 
   double bci = p2.vx * deltaX + p2.vy * deltaY; 
   
   double acf = bci; 
   double bcf = aci; 
   
   p1.vx = p1.vx + (acf - aci) * deltaX; 
   p1.vy = p1.vy + (acf - aci) * deltaY; 
   p2.vx = p2.vx + (bcf - bci) * deltaX; 
   p2.vy = p2.vy + (bcf - bci) * deltaY;
  }
 }

 private void moveParticle() {
  for (int i = 0; i < listParticle.size(); i++) {
   Particle p = listParticle.get(i);
   p.x += p.vx * timeStep;
   p.y += p.vy * timeStep;
  }
 }


 public void removeOverlap(ArrayList list) {
  for (int i = 0; i < list.size(); i++) {
   Particle p1 = list.get(i);
   for (int j = list.size() - 1; j > i; j--) {
    Particle p2 = list.get(j);
    if(isOverlap(p1, p2))
     list.remove(j); 
   }
  }
 }
 
 public void checkBoundary(){
  for(int i =0; i< listParticle.size() ;i++){
   Particle p = listParticle.get(i); 
   if(p.x > xmax - dmin)
    p.vx = -Math.abs(p.vx) ;
   if(p.x < xmin + dmin)
    p.vx = Math.abs(p.vx); 
   if(p.y > ymax - dmin)
    p.vy = - Math.abs(p.vy);
   if(p.y < ymin + dmin)
    p.vy = Math.abs(p.vy); 
  }
 }
 
 private boolean isOverlap(Particle p1, Particle p2){
  double deltax = p1.x - p2.x; 
  double deltay = p1.y - p2.y; 
  if(deltax * deltax + deltay * deltay < 4 * dmin * dmin)
   return true; 
  return false; 
 }
 
 public static void main(String[] args) {
  launch(args);
 }

 private class Particle {
  double x = 0.0;
  double y = 0.0;
  double vx = 0.0;
  double vy = 0.0;
  public Particle(double x, double y , double vx , double vy ) {
   this.x = x;
   this.y = y;
   this.vx  = vx ;
   this.vy = vy; 
  }
 }
}

Monday, August 19, 2013

Deteksi tumbukan dengan javaFX

Pada tutorial ini saya akan memberikan  bagaimana cara mendeteksti tumbukan dengan javaFX yang previewnya dapat dilihat pada gambar berikut:


Adapaun source codenya adalah:
package fjr.collision;

import java.util.Random;

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonBuilder;
import javafx.scene.shape.Circle;
import javafx.scene.shape.CircleBuilder;
import javafx.stage.Stage;

public class TestCollision extends Application {

 double r = 14.0;
 Random rand = new Random();

 double xwidth = 400;
 double ywidth = 400;

 int numberParticle = 100;

 // uji tumbukan
 public boolean testCol(Circle p1, Circle p2) {
  double dx = p1.getCenterX() - p2.getCenterX();
  double dy = p1.getCenterY() - p2.getCenterY();
  if (dx * dx + dy * dy < 4 * r * r) {
   return true;
  }
  return false;
 }

 public void removeOverlap(ObservableList list) {
  for (int i = 0 ; i< list.size() ; i++ ) {
   if (list.get(i) instanceof Circle) {
    Circle p1 = (Circle) list.get(i);
    for (int j = list.size()- 1 ; j   > i ; j-- ) {
     if (list.get(j) instanceof Circle) {
      Circle p2 = (Circle) list.get(j);
      if (testCol(p1, p2)) {
       list.remove(j);
      }
     }
    }
   }
  }
 }

 public static void main(String[] args) {
  launch(args);
 }

 Button button, button1;
 boolean state = true;

 @Override
 public void start(Stage primaryStage) throws Exception {

  final Group root = new Group();
  primaryStage.setScene(new Scene(root, xwidth, ywidth));

  for (int i = 0; i < numberParticle; i++) {
   root.getChildren().add(
     CircleBuilder.create().centerX(rand.nextDouble() * xwidth)
       .centerY(rand.nextDouble() * ywidth).radius(r)
       .build());
  }

  button = ButtonBuilder.create().text("ORGANIZE").translateX(10)
    .translateY(10).build();
  button1 = ButtonBuilder.create().text("RESET").translateX(100)
    .translateY(10).build();

  root.getChildren().addAll(button, button1);

  button.setOnAction(new EventHandler() {

   @Override
   public void handle(ActionEvent arg0) {
    if (state) {
     removeOverlap(root.getChildren());
    }
    state = false;
   }
  });

  button1.setOnAction(new EventHandler() {

   @Override
   public void handle(ActionEvent arg0) {
    for (int i = root.getChildren().size() - 1; i >= 0; i--) {
     root.getChildren().remove(i);
    }

    for (int i = 0; i < numberParticle; i++) {
     root.getChildren().add(
       CircleBuilder.create()
         .centerX(rand.nextDouble() * xwidth)
         .centerY(rand.nextDouble() * ywidth)
         .radius(r).build());
    }
    root.getChildren().addAll(button, button1);
    state = true;
   }
  });

  primaryStage.show();

 }
}

Sunday, August 18, 2013

Export gambar ke kode Latex

Seperti kita ketahui bahwa  menggambar di  Latex itu biasanya menggunakan  beberapa library, di mana dua di antaranya yang paling populer adalah tikZ dan pstrick. Dalam menggunakan kedua librari ini otomatis kita harus menuliskan kode-kodenya. Masalahnya adalah kode-kode ini tidak mudah dihapal, sehingga sangat menyulitkan bagi kita yang tidak punya banyak waktu untuk keperluan ini. 

Oleh karena itu beberapa developer  sudah  menyediakan fasilitas untuk mengeksport gambar yang dibuat tool-tool gui yang ada ke kode Latex. Beberapa  software yang punya kapasitas ini antara lain, adalah:

1. Dia http://dia-installer.de/ : mempunyai banyak fasilitas dan built-in library untuk menggambar diagram atau sirkuit elektronik. Dan hasilnya bisa dieksport ke kode Latex:





2. Inkscape, http://inkscape.org/ : 

Akan tetapi untuk inkscape ini, yang versi 0.48 hanya tersedia untuk pstrick. Masalahnya adalah pstrick sendiri kurang portable jika dibandingkan  dengan tikZ. 

3. MatplotLib (http://matplotlib.org/users/whats_new.html#pgf-tikz-backend). Yang terakhir ini merupakan library dari python untuk keperluan plot. 

Wednesday, July 17, 2013

Jawaban soal nomor dua pelatihan MATLAB

Bagi teman-teman sekalian yang mungkin belum mengetahui bagaimana jawaban soal nomor dua, berikut saya berikan listingnya. Silakan dicoba sendiri di rumah. Semoga bermanfaat
% jawaban nomor dua
function plot_bolak_balik
clc;
f = figure('menubar', 'none');
x = linspace(45 ,405,100);
y1 = cosd(x);
y2 = sind(x);
plot(x, y1, 'b.- ', x, y2, 'g.-'); % untuk menjaga sumbunya konstan
hold on ;
i = 1;
state = true;
while ishandle(f),
    if state
        p = plot(x(i), y1(i), 'r.' , 'Markersize' ,30);
        if(i == numel(x) ), state = false; i = i - 1;  end
        i = i+ 1;
        pause(0.02);
        if ishandle(p),delete(p); end
    else
        p = plot(x(i), y2(i), 'r.' , 'Markersize' ,30);
        if(i ==  1 ), state = true ; i = i+ 1;  end
        i = i- 1;
        pause(0.02);
        if ishandle(p),delete(p); end
    end
end
Adapun hasil cuplikan animasinya adalah sebagai berikut

Hubungan ukuran array dengan performa indeks di MATLAB

Posting kali ini masih berhubungan dengan posting saya sebelumnya. Cuma pada bagian ini saya akan memperlihatkan bagaimana hubungan antara ukuran array dengan lama eksekusi dengan metode indeks. Ternyata hasil yang diperoleh meunjukkan bahwa dengan menggunakan looping di MATLAB, waktu eksekusi yang diberikan bertambah secara signifikan dan cenderung eksponensial. Sementara dengan bantuan indeks, waktu eksekusi datar-datar saja. Adapun codenya bisa dilihat pada listing berikut
function indeks1
clear all ; 
clc; 
step = 100:50:700; 
cara1 = zeros(length(step),1); 
cara2 = zeros(length(step),1); 
for ii=1:numel(step)
    % first way, iterate trough looping
    dim = step(ii);
    Y  = zeros(dim,dim) ; 
    tic ; 
    for i=1:length(Y), 
        for j=1:length(Y(1,:)),
            if mod(i+j, 2) == 0
                Y(i,j) = 2; 
            else
                Y(i,j) = 1;
            end
        end
    end
    cara1(ii) = toc; 

    % second way, using MATLAB index
    X  = zeros(dim,dim) ;
    tic; 
    [a,b] = ind2sub(size(X), 1:numel(X)) ;
    X((mod(a+b, 2) ==0))  = 2; 
    X((mod(a+b, 2) > 0)) = 1; 
    cara2(ii) = toc;
end

plot(step, cara1, 'r.-', step, cara2, 'g.-' )

disp('Is the first  get the same output with the second?')
indeks = find(Y(:,:) ~= X(:,:));
xlabel('ukuran array'); 
ylabel('lama eksekusi dalam detik'); 
if(numel(indeks) ==  0),
   disp('oh... yes..  '); 
end
Di mana saya sudah melakukan perubahan time step dalam rentang yang berbeda-beda. Pada hasilnya juga diperlihatkan bahwa penggunaan indeks ini sangat terasa ketika ukuran array semakin besar.
Anda bisa mengetes sendiri untuk selang waktu yang lain. Tentunya MATLAB membatasi kita dalam mengalokasikan array, mengingat kapasitas memori yang terbatas. Untuk mengetahui kapasitas memori di komputer anda, matlab menyediakan perintah memory yang bisa digunakan untuk memperkirakan kapasitas array yang bisa anda alokasikan. 







Performa indeks di MATLAB bagian 2

Pada kesempatan kali ini sekali lagi saya menekankan pentingnya menghindari looping dalam pemrograman MATLAB. Kebetulan ini merupakan soal yang saya berikan dalam pelatihan MATLAB kemarin kepada teman-teman. Saya g tau apa ini bisa dikerjakan atau tidak, yang jelas saya kasikan aja jawabannya, sekalian berbagi pengetahuan. Semoga bisa diambil manfaatnya.

Soalnya adalah diberikan sebuah matriks yang ukurannya 1000 x 1000. Kenapa 1000 x 1000, karena biar kita terbiasa dengan perhitungan sesungguhnya di lapangan. Pada matriks ini,  sederhana saja yang dilakukan yakni, jika penjumlahan baris dan kolom genap, isi matriks tersebut dengan angka dua, sementara jika ganjil, isi dengan 1. Adapaun hasil codingnya adalah sebagai berikut.

Jadi terlihat jelas bahwa performa indeks 10 kali lipat lebih cepat ketimbang pake looping.