Jumat, 22 Agustus 2014

Javadoc sebagai standar dokumentasi industri software

Java sebagai bahasa murni berorientasi objek mempunyai aturan yang ketat tentang penerapannya. Aturan-aturan yang ketat ini menjadikan Java sebagai bahasa yang populer karena keteraturannya. Java juga mengembangkan J2EE yang dikenal sebagai Java 2 Platform, Enterprise Edition. Dengan ini, Java mengklaim dan memang mengkhususkan untuk pengembangan aplikasi dengan skala besar.

Aplikasi dengan skala besar tentunya membutuhkan dokumentasi yang sangat baik sebagai sumber pengelolaan aplikasi. Dengan dokumentasi yang baik, setiap programmer dapat menggunakan kembali (reusable) Class yang telah dibuat bahkan untuk aplikasi yang lain.


Jadi, apa itu Javadoc?

Javadoc adalah dokumentasi generator dari Oracle Corporation untuk menghasilkan dokumentasi API dalam format HTML pada source code Java.

Dari sejarah awal pengembangan Java, Java telah menerapkan javadoc ini. Begitu terstruktur dan rapi arsitektur Java sehingga banyak bahasa lain juga mulai menerapkannya.

Pada IDE yang canggih seperti Netbeans dan Eclipse, Javadoc hadir dalam bentuk popup informasi sehingga programmer tidak perlu membaca halaman html. Untuk IDE yang tidak memiliki fitur javadoc atau text editor biasa, maka programmer buth javadoc (dalam format HTML).


Bagaimanakah bentuk Javadoc itu?

Karena Javadoc dalam bentuk HTML, dokumentasi tersebut dapat kita jumpai banyak di internet. Salah satu bentuk Javadoc seperti screenshot berikut




Bagaimana cara menulis Javadoc?

Dokumentasi lengkap pada Javadoc dapat ditemukan pada website Oracle berikut: http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html

Secara sederhana, penulisan Javadoc terlihat seperti gambar berikut;



Pada IDE yang sudah memiliki fitur Javadoc akan memiliki popup untuk menampilkannya seperti berikut;




Bagaimana cara menghasilkan Javadoc?

Untuk menghasilkan Javadoc, tentunya berbeda-beda untuk setiap IDE.

Saat ini saya sedang bekerja dengan Eclipse IDE sehingga saya akan menjelaskan langkah cara menghasilkan Javadoc dengan Eclipse.

1. Pilih project yang akan di generate Javadoc-nya

2. Pada bagian menu: Project - Generate Javadoc

3. Ikuti saja langkah demi langkah yang disajikan oleh eclipse

4. Hasil akhir akan terlihat seperti berikut;





Penutup

Aplikasi bukanlah sebuah barang yang bisa usang. Membuat aplikasi tidak dimulai langsung sempurna. Aplikasi senantiasa diperbarui dengan berbagai macam alasan. Jika dokumentasi yang dihasilkan baik, rapi dan memiliki standar penulisan yang baku, maka pengembangan aplikasi menjadi lebih besar dan komplek akan terus terjaga.


Referensi

- http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html
- http://en.wikipedia.org/wiki/Javadoc

Kamis, 21 Agustus 2014

Aplikasi sederhana pengiriman email pada server sendiri dengan JavaMail

Seiring dengan perkembangan cloud computing dan aplikasi cloud, maka email sebagai pengenal seseorang dalam dunia maya juga menjadi sesuatu hal yang penting.

Aplikasi cloud atau hanya sekedar website biasa membutuhkan email baik itu sebagai promosi produk, konfirmasi keikut sertaan, milis, atau notifikasi. Oleh karena itu, kemampuan setiap bahasa pemrograman dan developer-nya untuk mengirimkan email sangatlah penting. Alangkah lucunya sebuah aplikasi atau usaha Anda yang digadang-gadang sangat hebat mengirimkan promosinya melalui akun mail gratis seperti gmail, yahoo atau akun mail gratis lainnya.

Well... jika Anda ingin membuatkan mail pribadi, bisa hubungi saya :D

Pada tulisan kali ini saya membahas tentang mengirim email dengan library javax.mail. Library ini bisa didownload pada http://www.oracle.com/technetwork/java/javamail/index.html

Untuk membuat email dapat terkirim melalui server, Anda harus mengaktifkan port 25 atau port lainnya yang mendukung Send Mail Transfer Protocol (SMTP)


1. Mengirim email dari Virtual Private Server.
Pada code dibawah juga saya selipkan 'myserver.com', silahkan aktifkan baris tersebut dan menonaktifkan baris localhos untuk dapa mengirimkan email jika server Anda langsung pada IP publik.

package tutmailb;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) {
      
      System.out.println("mulai mengirim");
    
      // Dikirimkan kepada...
      String to = "itsme@nitzaalfinas.com";

      // Data pengirim
      String from = "nitza@myserver.com";
      final String username = "nitza"; //username server
      final String password = "password"; //password server

      // mengirimkan email melalui vps
      String host = "localhost";
      
      //mengirimkan email melalui server pribadi
      //String host = "myserver.com";

      
      Properties props = new Properties();
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");
      

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
      });
      
      
      try {
    // Default MimeMessage object.
    Message message = new MimeMessage(session);
    
    // setFrom
    message.setFrom(new InternetAddress(from));
 
    // header
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
 
    // pesan
    message.setText("Halo... Ini pengirimain email melalui JavaMail ... ");

    //jika ingin mengirimkan email html, aktifkan baris berikut dan matikan baris diatas
    //message.setContent("

Ini adalah email html

", "text/html"); // kirim email Transport.send(message); System.out.println("Saya keren dan telah sukses mengirimkan email... :D"); } catch (MessagingException e) { throw new RuntimeException(e); } } }


Compile kedalam bentuk jar. Misalnya; tutmailb.jar
Untuk menjalankan email diatas, buka terminal Anda dan ketik perintah Java seperti berikut;

$ java -jar tutmailb.jar



2. Mengirimkan email melalui Gmail
Mengirimkan email langsung dari akun gmail Anda juga memungkinkan dilakukan melalui server Anda. Tentunya user yang akan menerima akan melihat email yang dikirim melaui gmail. Tetapi gmail juga memberikan opsi anda untuk mengganti gmail anda dengan format namaanda@perusahaananda.com.



package tutmailb;

import java.util.Properties;

import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class SendEmail {
   public static void main(String[] args) {
      
      System.out.println("mulai mengirim");
    
      // Dikirimkan kepada...
      String to = "kepada@gmail.com";

      // Data pengirim
      String from = "dari@gmail.com";
      final String username = "dari";//username gmail
      final String password = "password";//password gmail

      // mengirimkan email melalui vps
      String host = "myserver.com";
      

      Properties props = new Properties();
      props.put("mail.smtp.auth", "true");
      props.put("mail.smtp.starttls.enable", "true");
      props.put("mail.smtp.host", host);
      props.put("mail.smtp.port", "25");
      

      // Get the Session object.
      Session session = Session.getInstance(props,
         new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
               return new PasswordAuthentication(username, password);
            }
      });
      
      
      try {
    // Default MimeMessage object.
    Message message = new MimeMessage(session);
 
    
    // setFrom
    message.setFrom(new InternetAddress(from));
 
    // header
    message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
 
    // pesan
    message.setText("Halo... Ini pengirimain email melalui JavaMail ... ");
    
    // kirim email
    Transport.send(message);

    System.out.println("Saya keren dan telah sukses mengirimkan email... :D");

      } 
      catch (MessagingException e) {
         throw new RuntimeException(e);
      }
   }
}

Untuk menjalankannya, sama dengan cara diatas menggunakan terminal.


3. Selesai.

Berikut screenshot aplikasi diatas dari server aplikasi diatas.



Aplikasi sederhana diatas masih berjalan dengan command line. Mungkin pada tulisan selanjugnya saya akan bahas mengirimkan email dengan User Interface (UI).


Ubuntu Firewall - Uncomplicated Firewall

Firewall atau dalam bahasa Indonesia diartikan sebagai tembok api. Dalam pengertiannya pada Teknologi Informasi tidak jauh berbeda.

Firewall adalah sistem perangkat lunak yang membentengi dan meng-kontrol lalu lintas jaringan, menjaga keamanan jaringan tersebut terhadap lalulintas yang tidak aman. Firewall biasanya diterapkan pada sebuah gateway mesin antara jaringan lokal dan internet.

Tulisan kali ini tidak membahas lebih dalam tentang firewall. Tulisan kali ini hanya membahas tentang firewall yang secara default untuk Ubuntu yaitu Uncomplicated Firewall (UFW).

Firewall biasanya sangat berhubungan erat dengan port-port pada mesin. Untuk mengetahui port mana yang terbuka pada sebuah mesin/sistem, kita bisa melihat dengan perintah nmap seperti berikut;



Dari contoh diatas, kita dapat melihat detik.com membuka port 22 untuk ssh, port 80 untuk http dan port 443 untuk https. Dan dapat kita lihat lebih jauh, ada tcp dibelakang port untuk kasus lain, kita juga bisa temukan udp. Untuk tcp/udp tidak akan diulas pada tulisan ini. Jika Anda ingin tau lebih jauh, berikut ada penjelasan ringant tentang tcp/udp. Lebih jauh lagi, untuk para hacker, mengetahui port yang terbuka dapat menjadikan pintu masuk bagi mereka. Maka dari itu, diperlukanlah sebuah firewall yang secara default sudah ada pada Ubuntu yaitu UFW.

Berikut command dasar untuk UFW;

1. Melihat status UFW

# ufw status
atau
# ufw status verbose

Untuk melihat raw status
# ufw show raw


2. Mengaktifkan UFW
Paket UFW telah ada pada Ubuntu tetapi secara default tidak berjalan pada sistem. Untuk mengaktifkannya, ketik perintah berikut;

# ufw enable

3. Mematikan UFW

# ufw disable



4. Allow

# ufw allow <port>/<optional: protocol>

Contoh
# ufw allow 22/tcp


5. Deny

# ufw deny <port>/<optional: protocol>


Contoh:

# ufw deny 22/tcp


6. Menghapus rule

# ufw delete deny <port>/<optional: protocol>


Contoh:

# ufw delete deny 22/tcp
# ufw delete deny 22
# ufw delete allow 22


7. Men-allow berdasarkan service
Contoh:

# ufw allow http
# ufw allow https
# ufw allow smtp
# ufw allow submision
# ufw allow imaps


Sumber lainnya yang bisa dibaca tentang UFW;
- https://help.ubuntu.com/10.04/serverguide/firewall.html
- https://wiki.ubuntu.com/UncomplicatedFirewall
- https://help.ubuntu.com/community/UFW
- https://github.com/miniwark/miniwark-howtos/wiki/Firewall-setup-on-Ubuntu-12.04


Selasa, 19 Agustus 2014

ApplicationContext pada Spring Web MVC

Aplikasi Java berbasis web memerlukan environment yang berbeda-beda sehingga dibutuhkanlah sebuah 'script' yang dapat diatur tanpa melalui compiling. Script ini biasanya dalam format xml yang ditempatkan pada folder resources. Karena tidak di-compile menjadi bytecode, maka kita dengan mudah dapat mengganti script tersebut ketika sudah berada pada server produksi.

Misalnya; untuk bekerja pada lingkungan development lokal kita memerlukan setting database dengan user root dan password 1234. Sedangkan pada server produksi, kita memerlukan setting user kambing dengan password ganteng. Maka dari itu karena kita menerapkan ApplicationContext maka dengan mudah kita dapat mengganti sesuai dengan lingkungan kerja kita.

Berikut adalah langkah-langkah bagaimana membuat ApplicationContext pada Spring Web MVC;

1. Buat sebuah project Spring Web MVC.
Pada pembuatan project ini saya sarankan menggunakan Spring Tool Suite (STS).

2. Buat class dengan nama TutAppContext.java
package com.nitza.trycontexta;

public class TutAppContext {
 
 private String name;
 private String pekerjaan;
 
 public void setName(String name) {
  this.name = name;
 }
 
 public void setPekerjaan(String pekerjaan) {
  this.pekerjaan = pekerjaan;
 }
 
 public String printJsonString() {
  return "{ \"Nama\": \""+name +"\", \"Pekerjaan\":\""+pekerjaan+"\" }";
 }
}


3. Buat file MyBeans.xml

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<bean id="tutBean" class="com.nitza.trycontexta.TutAppContext">
<property name="name" value="Nitza" />
<property name="pekerjaan" value="Consultant" />
</bean>
</beans>


4. Ganti HomeController yang dibuat secara default seperti berikut

package com.nitza.trycontexta;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
public class HomeController {
 
 @RequestMapping("/")
 @ResponseBody
 public String tutContext() {
  ApplicationContext context = new ClassPathXmlApplicationContext("MyBeans.xml");
  
  TutAppContext tutBean = (TutAppContext) context.getBean("tutBean");
  return tutBean.printJsonString();
 }
}


5. Struktur file/folder terlihat seperti berikut




6. Ketika aplikasi dijalankan akan terlihat seperti berikut


Finish!

Jika ingin download contoh, berikut link github-nya.

Minggu, 17 Agustus 2014

Bekerja dengan file dan folder pada Java

Hampir semua aplikasi bekerja dengan file/folder dan Java sebagai bahasa Bytecode mempunyai keunggulan dibandingkan dengan bahasa script. Aplikasi Java yang berbasis web dapat dikombinasikan dengan 'Java yang berjalan pada desktop'. Ini menjadikan Java dapat bekerja dengan file jauh lebih dalam.

Sebagai contoh sederhana, website keepvid.com dapat mengkonversi video-video yang ada pada url kedalam bentuk yang bisa kita download. Tentu saja ini tidak dapat dilakukan oleh bahasa script. Oleh karena itu, keepvid.com membutuhkan Java diaktifkan untuk bisa bekerja dengan baik. Ya, begitulah salahsatu keunggulan Java diantara keunggulannya yang lain.

Pada tulisan kali ini, saya akan membahas tentang modifikasi file/folder pada Java menggunakan Spring MVC, class yang kita butuhkan adalah java.io.File dan perlu dicatat bahwa tutorial ini menggunakan Linux file/folder system.

Berikut adalah cara bekerja dengan file/folder;


1. Membuat folder

@RequestMapping("/buat_direktori")
@ResponseBody
public String getBuatDirektory() {
  
    //definisikan path
    File path = new File("/home/nitza/direktori");
  
    //jika path belum ada, buat path baru
    if(!path.exists()) {
 path.mkdirs();
    } 
  
    return "ok";
}


2. Me-rename file

@RequestMapping("/rename_file")
@ResponseBody
public String getTestRenameFile() {
  
    //file yang ada di server
    File fileYgAda = new File("/home/nitza/resources/folder_temp/sesuatu.png");
  
    //buat file kosong terlebih dahulu
    File fileBaru = new File("/home/nitza/resources/folder_temp/berubah.png");
  
    if(fileYgAda.renameTo(fileBaru)){
        return "berhasil";
    }
    else {
        return "gagal";
    }
}


3. Memindahkan file pada folder yang lain

@RequestMapping("/pindah_file")
@ResponseBody
public String getPindahFile() {
    //file yang ada di server
    File fileYgAda = new File("/home/nitza/resources/folder_temp/bolang.png");
  
    //buat file baru
    File fileBaru = new File("/home/nitza/resources/bolang.png");
  
    if(fileYgAda.renameTo(fileBaru)){
        return "berhasil";
    }
    else {
        return "gagal";
    }
}


4. Copy file dengan linux command
Metode ini sedikit tricky tetapi sangat berguna. Dan metode ini memberika kita akses untuk menjalankan berbagai macam command pada Linux. Tetapi yang dibahas dibawah hanyalah perintah untuk copy file dengan syntax cp

@RequestMapping("/copy_file")
@ResponseBody
public String getCopyFile() throws IOException {

    Runtime.getRuntime().exec("cp /home/nitza/resources/folder_temp/kucing.png /home/nitza/resources/folder_temp/kucingx.png");
  
    return "ter-copy";
}



5. Copy file dengan Apache Commons library

@RequestMapping("/copy_file_b")
@ResponseBody
public String getCopyFileB() throws IOException {
 //file yang ada di server
 File fileYgAda = new File("/home/nitza/resources/folder_temp/kambing.png");
  
 //buat file kosong terlebih dahulu
 File fileBaru = new File("/home/nitza/resources/folder_temp/kambingb.png");
  
 FileUtils.copyFile(fileYgAda, fileBaru);
  
 return "ter-copy";
}


Masih banyak method-method pada java.io.File yang harus di-explore seperti isDirectory(), isFile(), exists() dan lain sebagainya. Dan untuk bahan bacaan lebih lengkap tentang java.io.File dapat ditemukan pada berikut; http://docs.oracle.com/javase/7/docs/api/java/io/File.html


Tutorial aplikasi upload file dengan Spring MVC

Untuk mengikuti tutorial ini, saya sarankan menggunakan Spring Tool Suite (STS).

Berikut langkah-langkah membuat aplikasi upload dengan Spring MVC;

1. Buat project


2. Buat project setting


3. Struktur file/folder terlihat seperti berikut


4. Atur dependencies (penambahan dependency)

5. Karena kita memulai dengan Spring Tool Suite (STS) mengikuti langkah-langkah diatas, maka secara default maka Controller-nya dibuat oleh STS. Ganti Controller seperti code berikut

package com.nitza.tutupload;

import java.util.Locale;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
 
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home() { 
  return "home";
 }
}


6. Buat form dan ganti home.jsp seperti berikut


7. Tambahkan method postFileUpload seperti berikut

package com.nitza.tutupload;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;

import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class HomeController {
 
 @Autowired
 ServletContext context;
 
 @RequestMapping(value = "/", method = RequestMethod.GET)
 public String home() { 
  return "home";
 }
 
 
 @RequestMapping(value="/fileupload/upload",method=RequestMethod.POST)
 public String postFileUpload(HttpServletRequest request, 
   HttpServletResponse response,
   Model model) 
 {
  
  boolean isMultipart = ServletFileUpload.isMultipartContent(request);
  
  List fileNames = new ArrayList(); //upload beberapa file
  
  if (isMultipart) {
   
   FileItemFactory factory = new DiskFileItemFactory(); //membuat FileFactory
   
   ServletFileUpload upload = new ServletFileUpload(factory);
   
   try {
    
    List items = upload.parseRequest(request);
    Iterator iterator = items.iterator();
    
    while (iterator.hasNext()) {
     FileItem item = (FileItem) iterator.next();
     if (!item.isFormField() && !item.getName().equals("")) {
      String fileName = item.getName();
      
      /* jika file upload ditempatkan relatif terhadap folder aplikasi (/resources) 
      String root = context.getRealPath("/");
      File path = new File(root + "/resources");
       */
      
      //berikut ditempatkan relatif terhadap server
      File path = new File("/home/nitza/tututut"); 
      
      if (!path.exists()) {
       boolean status = path.mkdirs(); //jika path tidak ada, maka dibuat oleh aplikasi
      }

      File uploadedFile = new File(path + "/" + fileName);
      fileNames.add(fileName);
      System.out.println("File Path:-"
        + uploadedFile.getAbsolutePath());

      item.write(uploadedFile);
     }
    }
   } catch (FileUploadException e) {
    System.out.println("FileUploadException:- " + e.getMessage());
   } catch (Exception e) {
    System.out.println("Exception:- " + e.getMessage());
   }
      
  }
  
  model.addAttribute("files",fileNames);
  return "view_success";
  
 }
 
}



8. Buat file view_success.jsp seperti berikut


Finish!

Jumat, 15 Agustus 2014

Manipulasi DOM dengan JavaScript

Begitu banyak sumber tentang sejarah JavaScript. Ada yang mengatakan tidak berhubungan dengan Java dan ada yang mengatakan berhubungan dengan Java. Untuk menggali lebih jauh, mungkin kita harus melakukan research lebih lanjut dan tulisan ini tidak difokuskan untuk itu. :D Saya ambil saja salah satu sumber yang saya yakini yang saya dapatkan pada halaman http://oreilly.com/pub/a/javascript/2001/04/06/js_history.html yang menyatakan bahwa Javascript dan Java saling berhubungan pada awal pengembangannya.

Berikut kutipan yang diterjemahkan pada halaman tesebut;
"Balik pada awal 1995. Netscape mempekerjakan Brendan Eich pada MicroUnitSystems Engineering untuk mengimplementasikan satu bahasa baru. Membuat Navigator baru yang menambahkan dukungan Java yang dapat diakses oleh programmer non-Java. Eich memutuskan untuk membuat script terpisah yang menyesuaikan dengan environtment dan audience (programmer) agar web designer dan "
web developer dapat terhubung pada elemen-elemen yang ada pada halaman (html)."

Bahasa script seperti; JavaScript, PHP, Ruby, AutoLISP dll sejatinya diperuntukkan untuk aplikasi yang kecil. Tetapi seiring perkembangan waktu, bahasa script berkembang kearah enterprise tentunya dengan arsitektur yang disesuaikan.

Dulu, JavaScript digunakan hanya terbatas pada akses halaman html. Pada masa ini, JavaScript telah dikembangkan secara luas seperti game engine, animasi, manipulasi halaman html, framework UI, dll.

Pada tulisan kali ini, saya akan menunjukkan bagaimana memanipulasi Document Object Model (DOM) menggunakan JavaScript dengan format latihan;


1. Menambahkan tulisan pada node[1]

Buatlah page seperti berikut


Jalankan page maka akan terlihat seperti berikut;



2. Menambahkan attribut style pada elemen.
Melanjutkan contoh diatas, sekarang bukalah developer tools dan ikuti gambar berikut;
































3. Menambahkan text pada elemen DOM
Berikut ini Anda kita akan mempelajari bagaimana menangani array pada elemen dan memberinya nama.

Buatlan halaman seperti berikut


Buka halaman tersebut, buka developer tools dan tuliskan langkah-langkah berikut;




4. Menambahkan class pada elemen DOM
Game kali ini cukup menarik karena kita bisa membuat dan memodifikasi elemen, menempatkan class atau id sehingga berwarna-warni.

Game berikut bisa dimulai dengan merefresh halaman yang sudah dibuat pada game diatas sebelumnya.
Buka developer tools, dan ikuti berikut;


Game yang menarik bukan? :)

Apakah Anda terpikir mau bikin framework UI seperti Twitter Bootstrap, jQuery Easy UI, atau framework JavaScript seperti ExtJS, atau game engine tree.js?

Hehehe.... Don't starring at me. Saya tak berminat bikin tandingan framework yang sudah canggih tersebut. Yang saya lakukan hanya mengembangkan framework tersebut untuk kepentingan pribadi dan game diatas memberikan Anda ide untuk hacking framework tersebut untuk Anda bunakan bukan? Tapi jangna lupa berbagi loh... karena powernya software open itu adalah sharing. :)




[1] node = DOM element, nodes = DOM elements

Selasa, 12 Agustus 2014

Bermain-main dengan objek pada JavaScript

Pada 'dunia programming', banyak sekali saya temukan programmer instan. Saya mengatakan instan karena mereka tidak tau tentang filosofi dan prinsip scripting itu sendiri sehingga pemahaman mereka dangkal. Kebanyakan dari programmer instan memakai framework yang sudah jadi tanpa ingin tau apa yang terjadi didalamnya.

Memakai framework bukan merupakan hal yang salah tetapi tidak mengenal dasar script itu adalah sebuah hal yang salah. Dalam penulisan code juga ada satu konsep penulisan yaitu abstraction yang artinya menyembunyikan kerumitan. Mari kita ambil contoh tentang abstraction; seorang cewek pengendara mobil sangat tau bagaimana cara mengendarai mobil tanpa harus mengerti mobil. Tetapi jika terjadi kerusakan pada mobil (bug), maka dia tidak tau cara memperbaikinya dan lebih jauh karena tak mengerti, mobilnya ditinggal di jalan dan dia tidak sampai tujuan.

Ya... semua programmer memulai memang dari yang instan termasuk saya sendiri. Saya mempunyai latar belakan Teknik Sipil yang tak berhubungan sama sekali tentang programming. Tetapi kecintaan saya tentang komputer membawa saya banyak belajar programming sejak kuliah. Bahkan saya sudah mengenal dan menggunakan Linux dari tahun 2000 yang pada waktu itu RedHat 6. Dan bagi saya, programmer senior yang tidak update ilmunya hanyala senior dalam hal umur tetapi tidak dapat diandalkan. :D

Tulisan berikut tidak membahas tentang sejarah JavaScript maupun perintah-perintah dasar lainnya. Tulisan ini difokuskan pada objek pada Javascript melalui konsep 'permainan'. Dengan adanya 'permainan' ini saya harapkan me-refresh/meningkatkan pemahaman programmer tentang JavaScript sehingga mungkin saja bisa membuat framework JavaScript sendiri. :D

Silahkan persiapkan browser dan developerttools Anda untuk mengikuti permainanya.


Permainan 1. Membuat objek pada javascript dengan mendefinisikan objek kosong

//mendefinisikan objek kosong
var mobil = {};

Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;


Permainan2. Mendefinisikan objek langsung dengan isinya

//mendefinisikan objek langsung dengan isinya
var mobil = {
    warna: "merah",
    roda: 3
};

Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;



Permainan 3. Membuat objek turunan


//mendefinisikan objek langsung dengan isinya
var kendaraan = {
    warna: "kuning",
    roda: 2
};
var mobil = Object.create(kendaraan);

Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;


Permaian 4. Menganal 'this'



Permaian 5. Pewarisan


//struktur nya kurang lebih begini
var kendaraan = function(data) {
    //private value
    var nama = data.nama || "tak ada nama",
            warna = data.warna || "tak ada warna",
            roda = data.roda || 0,
            getNama = function() {
                return nama;
            },
            setNama = function(namaBaru) {
                nama = namaBaru;
            },
            getWarna = function() {
                return warna;
            },
            setWarna = function(warnaBaru) {
                warna = warnaBaru;
            },
            getRoda = function() {
                return roda;
            },
            setRoda = function(jumlahBaru) {
                roda = jumlahBaru;
            },
            allData = function() {
                return nama + " - " + warna + " - " + roda;
            };
            
    //objek baru
    var that = {};
    that.getNama = getNama;
    that.getWarna = getWarna;
    that.getRoda = getRoda;
    that.setWarna = setWarna;
    that.setRoda = setRoda;
    
    return that;
};

//mendefinisikan data
var dataBajai = {
    nama: "Belalang Tempur",
    warna: "Kalabu cik kuciang",
    roda: 3
};

//mendefinisikan bajai
var bajai = kendaraan(dataBajai);


Silahkan buka browser dan developer tools kamu dan tuliskan kode berikut;


Demikian permaiannya dan mungkin tulisan berikutnya akan saya bahas tentang memanipulasi DOM dengan JavaScript agar bisa membuat halaman HTML lebih interaktif.

Minggu, 10 Agustus 2014

Trik mempercepat compiling dan running Maven project pada Tomcat 8

Membuat aplikasi java untuk website membutuhkan ketelitian dan kesabaran. Aplikasi yang dibuat tidak langsung berjalan setelah code diganti. Aplikasi harus di compile terlebih dahulu, upload ke server dan diletakkan pada path yang semestinya atau path yang dikenali oleh aplikasi server, misalnya; Tomcat.

Pada post terdahulu saya memberikan contoh bagaimana membuat server Git, pada post kali ini saya akan membuat bagaimana cara memanfaatkan server Git tersebut untuk mempercepat pekerjaan kita khususnya berkaitan dengan Maven project dan Tomcat 8.

Berikut langkah-langkahnya;

1. Buat repository project.
Ingat, repository project yang kita buat bukanlah bare repository.
Berikut saya akan mencontohkan dengan perintah clone;

~/project$ git clone /home/your_name/Documents/repository/project01.git

Jika repository tersebut sudah ada pada server, mungkin perlu perintah pull
~/project/project01$ git pull origin master



2. Update Maven dependencies

~/project/project01$ mvn dependency:resolve


3. Compile Maven.
Karena project Maven kita adalah project web, maka perlu meng-compile dengan hasil war

~/project/project01$ mvn compile war:war


4. Letakkan pada folder aplikasi Tomcat agar di deploy secara otomatis oleh Tomcat
Dan perlu diingat, user pemilik Tomcat harus sama dengan yang memiliki war. Dan biasanya project .war dapat ditemukan pada folder target

~/project/project01$ cd target
~/project/project01/target$ chown root:root project01.war
~/project/project01/target$ sudo cp project01.war /ke/folder/tomcat/webapps


5. Restart Tomcat

~/folder/tomcat8/bin$ sudo sh shutdown.sh
~/folder/tomcat8/bin$ sudo sh startup.sh

6. Finish!

Catatan: untuk mempelajari lebih lanjut tentang compiling pada Maven, klik link berikut

Jumat, 08 Agustus 2014

Service Oriented Architecture

Apakah itu Service Oriented Architecture (SOA)?
Pengertian Service secara bahasa adalah layanan. Tetapi pada penerapan TI di Indonesia juga digunakan istilah servis atau service. Untuk selanjutnya dalam tulisan ini akan digunakan istilah service.
Oriented dalam bahasa Indonesia dapat diartikan sebagai arah.
Sedangkan Architecture dalam bahasa Indonesia dapat diartikan sebagai rancangan.
Jadi pengertian Service Oriented Architecture menurut bahasa adalah arah perancangan/perencanaan dari sebuah layanan/service.
Sedangkan menurut OASIS[1], SOA adalah sebuah cara untuk mengatur, memanfaatkan dan mendistribusikan informasi/service dibawah domain/platform yang berbeda. Memberikan sebuah sarana standar untuk ditawarkan, ditemukan dan memberikan interaksi dengan service lain sehingga memberikan hasil baru sesuai dengan apa yang diharapkan.
unsur SOA oleh Krafzig Dirk, Karl Banke, dan Dirk Slamapng.png
Gambar 1. Unsur SOA oleh Krafzig Dirk, Karl Banke, dan Dirk Slama
Dengan kata lain SOA atau Service Oriented Arcitecture adalah sebuah teknik perancangan aplikasi dengan menggunakan kembali komponen-komponen (service) yang sudah ada sebelumnya untuk memberikan hasil baru sesuai dengan tujuannya seperti terlihat pada gambar 1diatas yang digambarkan oleh Krafzig Dirk, Karl Banke, dan Dirk Slama.
Dalam perancangan aplikasi, menggunakan SOA, aplikasi akan memanggil modul-modul yang sudah dibangun sebelumnya. Pendekatan modular ini bukanlah suatu hal baru. Teknik-teknik pemrograman terkini telah mengedepankan pendekatan modular dalam membangun aplikasi. Akan tetapi SOA berbeda dengan modular pembangunan aplikasi tersebut karena komponen (service) pada SOA dibangun dan berinteraksi dengan service lain secara bebas dan lepas (loose coupled).
Dengan bersifat loose coupled, sebuah service dapat di-panggil oleh program/service lainnya tanpa program pemanggil tersebut perlu memperhatikan di mana lokasi service yang dipanggil berada dan platform/teknologi apa yang digunakan oleh service tersebut. Loose coupling sangat penting bagi SOA karena dengan demikian pemanggilan sebuah service oleh service lainnya dapat dilakukan pada saat run-time seperti contoh penerapan SOA pada sebuah Bank.
http://3.bp.blogspot.com/_XCIBKNhFB9M/R9BJ8trKafI/AAAAAAAAApo/29CkGK9QxPE/s400/SOA-04.gif
Gambar 2. Implementasi SOA pada sebuah Bank


Pada SOA, service terbagi atas beberapa layer seperti terlihat pada gambar 3, yaitu;
1.    Enterprice Service Layer,
2.    Domain Service Layer,
3.    Aplication Service Layer.
Setiap service dalam satu layer akan saling ber-interaksi dan setiap layer saling ber-interaksi dengan layer yang lainnya dan layer-layer ini dapat digabungkan kembali menjadi satu service baru.
soa-service.png
Gambar 3. Interaksi Antar Layer dalam Service Oriented Architecture[2]

Syarat dalam Penerapan SOA
Untuk memudahkan penerapan SOA, sistem yang dibutuhkan adalah;
§  Interoperabilitas, yaitu di antara sistem yang berbeda dan bahasa pemrograman yang menyediakan dasar untuk integrasi antara aplikasi pada platform yang berbeda melalui sebuah protocol komunikasi. Salah satu contoh komunikasi tersebut tergantung pada konsep yang diterapkan. Menggunakan sebuah konsep untuk menurunkan kompleknya sebuah aplikasi, sehingga memungkinkan pengembang aplikasi untuk fokus pada fungsionalitas aplikasi, dan tidak terfokus pada rumitnya requirement dari sebuah protokol komunikasi.
§  Membuat sebuah gabungan resource. Membangun dan mempertahankan aliran data ke system database gabungan. Hal ini memungkinkan fungsi baru dikembangkan sebagai referensi format bisnis untuk setiap elemen data.

Prinsip SOA
Berikut prinsip-prinsip dalam menetapkan aturan dasar bagi pengembangan, pemeliharaan, dan penggunaan SOA:
§  Penggunaan kembali (re-use), granularity, modularity, composability, komponenisasi dan interoperability.
§  Standar aturan secara umum dan standar aturan kebutuhan spesifik.
§  Identifikasi dan kategorisasi, pengadaan dan pengiriman, serta pemantauan dan pelacakan.
Berikut prinsip-prinsip arsitektur spesifik untuk desain dan service definisi fokus pada tema tertentu yang mempengaruhi perilaku intrinsik sistem dan gaya desain SOA:
§  Service enkapsulasi - jasa konsolidasi untuk penggunaan SOA. Seringkali service tersebut tidak direncanakan berada di bawah SOA.
§  Service loose coupling - Service menjaga hubungan yang meminimalkan keterkaitan antar resource dan berdiri sendiri untuk bisa dimanfaatkan oleh service lain.
§  Service rule – Aturan service yang harus dipatuhi berupa perjanjian/kontrak antara service, seperti yang didefinisikan bersama oleh  service-service dan dipadukan akan digabungkan kesalam satu dokumen kontrak/aturan service.
§  Service abstrak – Diluar aturan service, service menyembunyikan logika pemrogramannya dari dunia luar.
§  Service usability - Logika dibagi menjadi service-service dengan tujuan dapat digunakan kembali oleh service yang lain.
§  Service composability - Koleksi service dapat dikoordinasikan dan dirakit untuk membentuk service komposit (service gabungan).
§  Service autonomy - Service memiliki kendali atas proses didalam service tersebut (encapsulate).
§  Service optimation - Semua service berada pada posisi yang sama dengan service lain tetapi pemilihan service berkualitas tinggi lebih diutamakan oleh serive lain.
§  Service discoverability - Service harus dirancang agar mencirikan service itu sendiri sehingga dapat ditemukan oleh service lain yang membutuhkan service tersebut melalui aturan-aturan service yang telah ditetapkan.
§  Service relevansi - Fungsi service yang dihadirkan dapat dikenali oleh service lain sehingga dapat dipakai kemali.

Selain itu, ada faktor yang mempengaruhi user ketika menimplementasikan  SOA:
§  Efisiensi dalam penggunaan system resource.
§  Service mature atau service yang telah teruji dan kecepatan kinerja service.
§  EAI (Enterprise Application Integration)

Karakteristik Service dalam SOA
Pada SOA ada 2 karakteristik service seperti terlihat pada gambar 4.
http://3.bp.blogspot.com/_XCIBKNhFB9M/R9BQwtrKajI/AAAAAAAAAqI/2987jorH4gc/s400/SOA-08.gif
Gambar 4. Karakteristik dalam SOA
1.    Service Interface.
http://1.bp.blogspot.com/_XCIBKNhFB9M/R9BLUNrKagI/AAAAAAAAApw/v1JUiy-4U34/s400/SOA-05.gif
Gambar 5. Service Interface
Service interface menyatakan bagaimana service tersebut dapat dipanggil seperti parameter input/output (I/O) dan dimana lokasi parameter itu berada.
Misalkan, service interface untuk Customer Lookup menyatakan berbagai cara untuk mendapatkan informasi tentang seorang customer (dari id customer atau nama dan sebagainya) dan struktur data customer yang didapatkan seperti pada gambar 5. Service Implementation adalah bagaimana logic dari service customer lookup tersebut dijalankan.
2.    Service implementation.
Service Implementation  sangat terkait dengan teknologi pemrograman yang digunakan.
SOA tidak memperdulikan bagaimana sebuah service diimplementasikan.
Entah ditulis dengan bahasa PHP atau Java, yang penting adalah bagaimana service tersebut dapat dipanggil dan memberikan informasi sesuai dengan Service Interface-nya. Karakteristik SOA yang tercakup dalamservice implementation adalah service tersebut harus business oriented. Dalam arti, setiap service yang di inisiasikan harus melakukan suatu aktivitas bisnis tertentu, misalkan Customer Lookup, Fund Transfer, Check Inventory, dan sebagainya. Tidak dapat dipungkiri pula bahwa keberhasilan SOA belakangan ini ikut dimotori oleh tingginya penerimaan teknologi web services di kalangan pengembang aplikasi. Walaupun ide tentang SOA telah ada sebelum web services dilahirkan, web services dan SOA saat ini telah menjadi suatu sinergi dan bahkan beberapa kalangan menganggap dengan menggunakan web services maka ia telah menerapkan SOA. Tetapi ini adalah sebuah hal yang berbeda.


Penerapan Web Service dalam SOA
Web service merupakan salah satu penerapan SOA. Web service membangunan-blok fungsional yang dapat diakses melalui Internet Protokol standar independen dari platform dan bahasa pemrograman yang berbeda. Service ini dapat dinamakan sebuah aplikasi baru atau hanya mengemas sistem lama yang telah ada agar menjadi network-enable.
Setiap bagian SOA bisa menjalankan salah satu peran atau kedua peran dibawah:
1.   Service Provider - Operator selular menciptakan web service interface dan akses informasi ke registri web service tersebut. Setiap penyedia service yang harus memutuskan untuk mempublish informasi, bagaimana membuat trade-off antara keamanan dan kemudahan service, bagaimana harga service, atau (tidak dikenakan biaya) bagaimana / apakah untuk mengeksploitasi service untuk memberikan nilai informasi pada service lain. Penyedia juga harus memutuskan apa kategori service harus terdaftar dalam service yang diberikan penghubung dan perjanjian apa yang diperlukan untuk menggunakan service ini. Register service apa saja yang tersedia di dalamnya, dan daftar semua penerima potensial dari service. Penghubung (operator/link/communicator/broker) kemudian memutuskan lingkup hubungan. Penghubung publik tersedia melalui Internet, sementara private broker hanya dapat diakses oleh tingkatan tertentu, misalnya, pengguna intranet perusahaan. Selain itu, harus diputuskan jumlah informasi yang akan diberikan. Beberapa broker mengkhususkan diri pada banyak listing. Lainnya menawarkan informasi yang banyak pada service terdaftar dalam service tersebut. Beberapa lanskap yang luas mencakup jasa dan lain-lain fokus dalam industri. Beberapa broker katalog broker lain. Tergantung pada model bisnis, broker dapat mencoba untuk memaksimalkan melihat, permintaan, jumlah listing atau keakuratan dari daftar. The Universal Deskripsi Discovery dan Integrasi (UDDI) mendefinisikan spesifikasi cara untuk mempublikasikan dan menemukan informasi tentang Web Service. Broker service teknologi lainnya (misalnya) ebXML(Elektronik Bisnis menggunakan Extensible Markup Language) dan mereka berdasarkan ISO / IEC 11179 Metadata Registry (MDR) standar.
2.   Service konsumen - konsumen service atau web service klien menempatkan entri dalam registri menggunakan berbagai broker menemukan operasi dan kemudian mengikat ke penyedia service untuk meminta salah satu web service. Apapun service-service konsumen perlu, mereka harus bawa ke broker, lalu mengikatnya dengan service masing-masing dan kemudian menggunakannya. Mereka dapat mengakses beberapa service jika service ini menyediakan berbagai service.
Penerapan SOA melalui web service seperti pada gambar 6.
SOA.gif
Gambar 6. Penerapan SOA melaui Web Service sebagai sentralisasi service[3]


Manfaat Penerapan SOA
Beberapa arsitek perancang IT perusahaan percaya bahwa SOA dapat membantu perusahaan merespon lebih cepat dan biaya-efektif terhadap perubahan kondisi pasar. Ini gaya arsitektur mempromosikan penggunaan kembali di makro (layanan) daripada tingkat mikro (kelas) tingkat. Hal ini juga dapat mempermudah interkoneksi - dan penggunaan - TI yang ada.
Dalam beberapa hal, seseorang bisa menganggap SOA sebagai evolusi arsitektur daripada sebagai revolusi. Ia menangkap banyak praktik terbaik dari arsitektur perangkat lunak sebelumnya. Dalam sistem komunikasi, misalnya, pembangunan sedikit telah terjadi solusi yang menggunakan binding statis benar-benar bicara dengan peralatan lainnya dalam jaringan. Dengan resmi merangkul pendekatan SOA, sistem seperti ini dapat memposisikan diri untuk menekankan pentingnya yang terdefinisi dengan baik, antar-beroperasi antarmuka yang sangat.
Banyak orang mempertanyakan apakah SOA hanya menghidupkan konsep seperti pemrograman modular (1970), desain berorientasi event (1980) atau antarmuka / desain berbasis komponen (1990)? SOA mempromosikan tujuan memisahkan pengguna (konsumen) dari implementasi layanan. Layanan sehingga dapat berjalan pada berbagai platform didistribusikan dan diakses melalui jaringan. Ini juga bisa memaksimalkan penggunaan kembali layanan.
SOA adalah sebuah disiplin dan desain arsitektur disusun untuk mencapai tujuan interoperabilitas meningkat (pertukaran informasi, usabilitas, dan composability), meningkat federasi (sumber daya pemersatu dan aplikasi sambil mempertahankan otonomi masing-masing dan self-governance), dan meningkatkan bisnis dan domain penyelarasan teknologi.
Service-Oriented Architecture (SOA) merupakan suatu pendekatan arsitektur (atau gaya) untuk membangun sistem perangkat lunak-intensif kompleks dari seperangkat universal yang saling berhubungan dan saling tergantung pada setiap blok.
SOA menyadari bisnis dan TI manfaat melalui memanfaatkan metodologi analisis dan desain pada saat jasa membuat. metodologi ini memastikan bahwa layanan tetap konsisten dengan visi dan roadmap arsitektur, dan bahwa mereka mematuhi prinsip-prinsip pelayanan-orientasi. Argumen yang mendukung aspek bisnis dan manajemen dari SOA diuraikan dalam berbagai publikasi.
Sebuah layanan terdiri dari unit yang berdiri sendiri dari fungsi yang tersedia hanya melalui antarmuka yang ditetapkan secara formal. Layanan dapat menjadi semacam "perusahaan-nano" yang mudah untuk memproduksi dan memperbaiki. Juga layanan dapat "mega-korporasi" dibangun sebagai karya terkoordinasi layanan sub-ordinat.
Sebuah peluncuran matang SOA efektif mendefinisikan API sebuah organisasi.
Alasan untuk memperbaiki pelaksanaan service sebagai proyek terpisah dari proyek yang lebih besar meliputi:
1.   Pemisahan mempromosikan konsep ke layanan bisnis yang dapat disampaikan dengan cepat dan bergerak secara independen dari proyek-proyek yang lebih besar dan lebih lambat-umum dalam organisasi. bisnis mulai memahami sistem dan user interface yang disederhanakan meminta layanan. Ini memberikan peningkatan perfomance. Artinya, itu mendorong inovasi bisnis dan mempercepat waktu ke pasar.
2.   Pemisahan mempromosikan decoupling layanan dari proyek. Hal ini mendorong desain yang baik sepanjang layanan dirancang tanpa mengetahui siapa konsumen perusahaan.
3.   Dokumentasi dan artefak uji layanan tidak tertanam dalam detail dari proyek yang lebih besar. Hal ini penting pada saat jasa harus digunakan kembali nanti.

  


Referensi
1.    Barry & Associates, Inc., Januari 2010, http://www.service-architecture.com/
3.    OASIS Organization on Wikipedia, Juli 2010, http://en.wikipedia.org/wiki/OASIS_(organization).


[1] Sebuah Organisasi Ahli untuk Standar Struktur Information atau Organization for the Advancement of Structured Information Standards (OASIS)