Selasa, 03 Oktober 2017

Apa itu Bitcoin, Blockchain dan Aplikasi Desentralisasi?

Sekitar 2 tahun yang lalu, saya berkenalan dengan teknologi Blockchain. Teknologi ini belum begitu populer sehingga mungkin agak susah mencari referensi tentang tentang teknologi ini. Terbukti dengan adanya meetup Ethereum* pada waktu itu di Singapore, hanya saya yang datang sebagai wakil dari Indonesia**. Tetapi sebenarnya, banyak Bank Central, dan beberapa perusahaan besar sedang melakukan R&D pada teknologi ini. Teknologi ini menurut saya sangat revolusioner dalam dunia perbankan dan digital assets. Mungkin lebih jelas saya tulis pada sub bagian pemanfaatan blockchain.

Seiring dengan banyaknya posting saya dengan hastag #blockchain, akhir-akhir ini pun banyak orang yang bertanya tentang pekerjaan saya. Agak susah menjawab pertanyaan tersebut karena tidak banyak orang yang mengerti tentang dunia yang sedang saya geluti. Dari pertanyaan tersebut saya selalu menjawab, saya bekerja pada sebuah perusahaan yang mengelola Bitcoin. Padahal, jawaban tersebut sebenarnya tidak tepat. Karena pada perusahaan tempat saya bekerja, mereka mengelola beberapa cryptocurrency. Nah... Apa lagi itu namanya crypto currency? Ini akan menjadi lebih membingungkan lagi. Bahkan diantara penanya, mereka tidak tau apa itu Bitcoin.

OK, untuk menjelaskan ini, mungkin saya akan mulai dari Bitcoin saja.

Apa itu Bitcoin?

Bitcoin adalah sebuah cryptocurrency dan juga merupakan sebuah digital payment. Bitcoin adalah cryptocurrency pertama yang ada di dunia. Tidak seperti Fiat money yang ada pada Bank, Bitcoin berjalan tanpa kontrol oleh satu pihak manapun. Transaksi berjalan autonomous per-to-peer dan sangat mustahil untuk dipalsukan. Transaksi-transaksi dalam Bitcoin ditambahkan dan diverifikasi oleh network nodes/miner dalam distributed ledger yang dinamakan blockchain. Sehingga dapat dikatakan bahwa Bitcoin berjalan dengan teknologi Blockchain dan Bitcoin adalah pencipta teknologi Blockchain tersebut.

Lalu, apakah sebenarnya blockchain itu?

Blockchain pada dasarnya adalah database yang terdistribusi.
Transaksi dalam blockchain dikirimkan dalam bentuk kriptografi dan ditandatangani secara digital.
Transaksi tersebut disusun dalam sebuah block yang saling terhubung dengan hash code.
Transaksi dan blocks dalam blockchain akan ditambahkan oleh sebuah node/miner dan diverifikasi oleh banyak node sehingga transaksi dan blocks mustahil untuk dipalsukan.
Block yang sudah ditambahkan kedalam ledger tidak dapat diganti atau diubah dikemudian hari.

Pemanfaatan blockchain?


*) Simple-nya; salah satu saingan Bitcoin
**) Lebih tepatnya, utusan perusahaan. :D


[Hehe... timeout, saatnya kerja... tulisannya bersambung... Stay tune pada link ini karena sambungannya pada link ini juga]

Sabtu, 24 Januari 2015

Bekerja Kolaborasi dengan GIT

Ada 2 tipe bekerja kolaborasi dengan GIT;
1. Fork & pull
Fork dan pull ini biasanya lazim digunakan pada website github. Pada tipe fork dan pull ini, kolaborator bebas fork dan menjadikan repository sendiri. Untuk mengirimkan hasil kerja/perubahan, maka kolaborator mengirimkan request pull kepada project koordinator.

Untuk bekerja dengan metode fork dan pull, Anda bisa lihat langsung pada website github.


2. Shared repository
Shared repository kebanyakan digunakan oleh pekerjaan kolaborasi pada tim kecil. Kolaborator bebas/langsung membuat push ke repository.

Untuk dapat menggunakan shared repository pada project kecil, kita terlebih dahulu harus mempunyai bare repository dan selanjutnya mengetikkan command berikut;

git config core.sharedRepository group


Tujuan dari perintah diatas adalah setiap anggota yang membuat perintah push dapat dianggap sebagai group dari repository.

Sebelum menjalankan perintah tersebut, file config akan terlihat seperti ini;
[core]

        repositoryformatversion = 0

        filemode = true

        bare = true


Setelah menjalankan perintah git config diatas, file config pada bare repository akan terlihat seperti berikut;

[core]

        repositoryformatversion = 0

        filemode = true

        bare = true

        sharedRepository = group

Sabtu, 13 September 2014

“Bash script untuk meng-automatisasi hidup Anda”

Pada dasarnya, hampir semua perintah/aplikasi Linux/Ubuntu* dapat dijalankan melalui terminal. Perintah-perintah tersebut dapat di automatisasi dengan membuat aplikasi script yang dalam hal ini sedang dibahas adalah bash script.


Untuk memulai bash script, pada section pertama ini saya akan bahas mengenai perintah dasar pada Linux;
1. Asumsi Anda telah mengerti syntax dasar Linux sehingga saya tidak menuliskannya, seperti;
buat file,
buat direktori,
menghapus file,
menghapus direktori
mengganti owner file
mengganti mode file
dan perintah dasar lainnya

Jika Anda menguasai perintah diatas, lanjut pada perintah dibawah.


2. Membersihkan terminal
$ clear


3. Mendefinisikan variabel dan memanggil variabel dari terminal
$ bolang=”ini variabel bolang”
$ echo $bolang
ini variabel bolang


4. Membuat funcion langsung pada terminal
$ function kambiang { echo “ini memanggil kambiang”; }
$ kambiang
ini memanggil kambiang
$

$ function kambiangGadang() { echo “ini kambiang gadang”; }
$ kambiangGadang
ini kambiang gadang
$


5. List file berdasarkan ekstensi
Asumsi didalam folder ada 3 file, yaitu: file01.jpg, file02.txt, file03.zip

Untuk melihat file, pasti menggunakan
$ ls
file01.jpg
file02.txt
file03.zip

Melihat file berdasarkan ekstensi;
$ ls *.jpg
file01.jpg

Melihat file lengkap dengan atribut dan ditambahkan array esktensi;
$ ls -l *.{jpg,txt,zip}
file01.jpg
file02.txt
file03.zip


6. Menjalankan beberapa perintah dengan 'satu kali enter'
Disini saya menggunakan sebuah contoh kasus git yang perintahnya berulangkali dilakukan sampai koding selesai. Saya pikir ini sangat menjengkelkan.
Perintah tersebut dapat diserderhanakan cukup dengan operator &&
$ git add . && git commit . && git push origin master

Jika perintah diatas dijalankan, maka pertama kali akan membuka 'editor CLI' default Anda untuk membuat keterangan commit. Setelah Anda menyimpannya, perintah akan dilanjutkan kepada git push.


Setelah mengenal beberapa perintah dasar seperti diatas, berikut saya akan membuat beberpa bash script sebagai contoh aplikatif;

1. Cek path interpreter bash script
$ which bash
/bin/bash


2. Membuat bash script pertama
Langkah pada CLI berikut adalah; membuat folder, berpindah ke folder yang dibuat, membuat file
$ mkdir bash_tut
$ cd bash_tut
$ nano hello_kambing.sh

Ketikkan dalam nano script berikut dan simpan;
#!/bin/bash
echo "hello kambing"

Selanjutnya ganti menjadi executable dan jalankan
$ chmod +x hello_kambing.sh
$ ./hello_kambing.sh
hello kambing
$

Atau dengan perintah lain, Anda bisa memanggil seperti berikut;
$ sh hello_kambing.sh
hello kambing
$


3. Operator && untuk membuat beberapa command dijalankan dalam satu kali eksekusi
Disini kembali saya menggunakan contoh git.
Jika pada point diatas Anda tetap mengetik beberapa kata untuk menjalankannya, sekarang Anda dapat membuat lebih sederhana dengan membuat sebuah aplikasi script.
Ketik kode berikut, berikan nama, jadikan executable dan jalankan;

#!/bin/bash
git add . && git commit . && git push origin master


4. Membaca input dari user
#!/bin/bash
clear
echo "Nama"
read nama
echo "Password"
read password
echo "Nama Anda adalah $nama, password $password"


5. Logical dan comparison
#!/bin/bash
clear
echo "Nama"
read nama
echo "Password"
read password
if [ $nama = "Nitza" ] && [ $password = "ganteng" ]
then echo "Anda memang ganteng"
else
echo "Anda tidak ganteng"
fi


6. Checking file/folder
#!/bin/bash
if test -f /home/nitza/kambiang
then
echo "kambiang ada"
else
echo "kambiang tidak ada"
fi


Beberapa command line untuk 'test'
- d Mengetahui direktori
-e Mengetahui file exist
-f Check regular file
-g SGI permission
-r Check readable
-s Check if file size != 0
-u SUID permission
-w Check writable
-x Check executable


7. Mempersingkat copy log file pada server
Terkadang Anda tidak malas mengetik command, tetapi hanya lupa mengingat folder/file path tempat beberapa log yang Anda butuhkan. Sementara pekerjaan ini tiap hari harus Anda kerjakan. Yap...buatlah bash script-nya dan tentu saja ini menggunakan perintah scp. Berikut contohnya;

#!/bin/bash
scp root@server.com:/usr/share/webserver_app/logs/log_file.txt /your_local_computer/home && gedit log_file.txt


8. Menjalankan modem

Hampir semua modem dapat berjalan dengan cara ini. Beberapa modem CDMA dan GSM yang tidak disupport oleh Ubuntu, ketika saya jalankan perintah ini dapat berjalan dengan sangat baik.

Hal yang pertama Anda lakukan adalah melihat usb Anda, memberikan modprobe yang terkait
$ lsusb

Perintah diatas dapat memberikan Anda vendor dan product modem Anda. Ingat kodenya untuk diisikan pada aplikasi bash script.

Ganti beberapa konfigurasi untuk wvdial. Jika belum ada aplikasi wvdial, silahkan install terlebih dahulu.
$ nano /etc/wvdial.conf
Ganti username dan password sesuai dengan ISP Anda

Buat bash script berikut.

#!/bin/bash
#beberpa modem auto run sebagai cd, dan eject dengan perintah berikut
sudo eject /dev/sr1

sleep 3
#modprobe sesuai dengan kode yang didapat dari lsusb
sudo modprobe usbserial vendor=0x19d2 product=0xfffe
sleep 10
#konfigurasi akan dijalankan otomatis berkaitan dengan /dev/ttyUSB[n]
sudo wvdialconf

sleep 3
#menjalankan wvdial (menyambungkan dengan ISP)
sudo wvdial


Masih banyak fungsi bash script yang dapat Anda tulis. Silahkan buat bash script Anda sendiri untuk meng-automatisasi pekerjaan Anda.

Selasa, 02 September 2014

Memahami Cara Kerja Web dan HTTP

Pendahuluan

Aplikasi berbasis web telah berkembang pesat pada masa ini menjadikan orang awam paling tidak mengetahui bagaimana web itu bekerja.

Berbasis web bukan berarti hanya website, berbasis web artinya dapat terkoneksi melalui protokol web untuk mengakses data, mengendalikan sesuatu dari jarak jauh.

Telpon pintar, Internet banking, rumah pintar, GPS, komputasi awan (cloud computing) merupakan hanya beberapa aplikatif dari teknologi web. Sehingga ini mematahkan paradigma aplikasi desktop lebih hebat dari aplikasi web. Dan tulisan pendahuluan ini ingin mengedukasi sebagian besar orang yang berpandangan bahwa lulusan IT hanya dapat membuat website, benerin printer dan benerin komputer.

Jika melihat konsep penerapan web lebih jauh, teknologi informasi secara umum dan web secara lebih khusus  adalah enabler bagi sebuah organisasi baik itu pemerintahan, organisasi non profit dan organisasi profit. Dikatakan enabler karena web/teknologi informasi merupakan inti bisnis sehingga tanpa web/teknologi informasi tidak dapat berjalan. Bandingkan dengan pada masa lalu dimana web/sistem informasi yang hanya merupakan sebuah support bagi sebuah organisasi.

Kita sebagai pribadi secara tidak sadar telah tergantung kepada teknologi web. Memposting status di media sosial, meng-upload photo pada iCloud, mencari berita tentang photo leak artis Hollywood yang sedang marak diberitakan dan lain sebagainya.

Dengan teknologi web, organisasi dapat membangun business intelligence, decission support system (DSS), sistem pakar, Service Oriented Architecture (SOA) dan lain sebagainya.

Tulisan diatas cukup menggambarkan bahwa mengetahui teknologi web cukup penting pada kehidupan dewasa ini. Tetapi saya tidaka akan menulis topik yang sangat luas seperti diatas. Tulisan berikut akan lebih spesifik membahas bagaimana cara kerja web dan HTTP.


Gambaran sedernhana dari kehidupan sehari-hari

Seseorang sebut saja namanya Tumbuang duduk memegang sebuah telpon pintar. Si Tumbuang ingin membuat curhat pada website sobatcurhat.com. Si Tumbuang mengetikkan sebuah Uniform Resource Locator (URL) pada browser mobile-nya.

Gambaran diatas cukup sederhana, tetapi bagaimana itu bekerja dapat dituliskan dengan sebuah tulisan yang relatif panjang seperti berikut.


Bagaimana proses yang terjadi?

Dengan gambaran yang sederhana tersebut, proses yang terjadi adalah URL mencari alamat yang ada pada internet. Bisa saja alamat tersebut ada pada belahan bumi yang jauh disana, berbeda benua, berbeda negara atau dimana saja.

Seperti namanya Uniform Resource Locator; komputer/browser client akan me-request resource yang dapat saja berupa tulisan, gambar atau suara dimana saja resource tersebut berada.

Secara teknikal, client browser akan me-request data yang ada pada web server dan web server akan memberikan response terhadap request tersebut.

Secara sederhana, sebenarnya setiap komputer adalah sebuah server. Komputer yang diberikan/di-set/diinstall sebagai web server akan dapat memberikan layanan web dan bisa berfungsi sebagai web server.

Request dan response diberikan oleh sebuah protokol yang dinamanakan dengan HyperText Transfer Protocol (HTTP) dan HTTP merupakan protokol stateles.

HTTP meminta komunikasi yang dengan bahasa yang sama antara browser dan web server sehingga mereka saling mengerti.

Berikut proses yang terjadi secara teknikal ketika browser mengakses sebuah URL;

1. Parsing URL

URL mempunyai format seperti berikut: [protocol]://[domain]/[request-URI]

URL yang di-request sebenarnya bukan hanya berasal dari browser. URL yang di-request dapat saja dilakukan melalui terminal atau robot. Alat untuk me-request URL ini disebut sebagai user agent sehingga kedepannya saya akan menyebut user agent untuk jenis ini.

Jika pada format diatas, protocol saya tuliskan sebagai array []. Ini saya maksudkan karena masih ada protokol lain yang bisa bekerja dengan format tersebut seperti FTP, JDBC:MySQL atau yang lainnya yang tidak dibahas disini.


2. HTTP Request

User agent akan mengirimkan request pada web server. Metode yang paling banyak digunakan pada tahapan ini adalah GET.

Method yang lain pada HTTP Request adalah HEAD, POST, PUT, DELETE, TRACE, OPTIONS, CONNECT (HTTPS) dan PATCH.

Berikut adalah sebuah contoh request yang dilakukan.


Terlihat diatas; Accept, Accept-Encoding, Cookie dll merupakan properti yang dapat ditambahkan ketikan melakukan request oleh user agent.

Jika ingin mengirimkan request melalui terminal, dapat menggunakan perintah curl seperti berikut;

$ curl -d "nama=Nitza" \
> -d "alamat=Jakarta" \
> server.com


3. HTTP Response

Pada tahap ini, user agent akan menerima response dari web server. Response tersebut biasanya akan terlihat seperti berikut;



Diatas, terlihat jenis response yang diterima melalui Content-Type sehingga user agent yang biasanya adalah browser mem-parsing dan render sesuai dengan Content-Type tersebut.

Ragam dari Content-Type dapat dilihat pada link berikut http://en.wikipedia.org/wiki/Internet_media_type

Jika menggunakan user agent dengan jenis terminal, berikut syntax untuk melihat response HTTP yang di-request;

$ curl -I http://domain.com

Jika tidak menggunakan opsi -I, maka semua response akan ditampilkan pada terminal/user agent.

Saya rasa pembahsan tentang curl cukup menarik karena dapat mengirimkan parameter, merequest dan melihat response tanpa bantuan user interface. Tidak adanya bantuan user interface dan berjalan pada terminal menjadikannya lebih seksi karena bisa dipanggil melalui java runtime dan bash script sehingga kita bisa membuat aplikasi baru untuk keperluan spesifik; bisa saja sebagai tester aplikasi (umumnya dipakai untuk lingkungan java) dan hacking**.


Apa itu stateless protokol?

HTTP merupakan stateless protokol yang artinya HTTP tidak mengingat data yang kita kirim melalui browser. Setiap kali pengguna me-request HTTP, web server akan me-response dengan data baru setiap waktu diminta sehingga HTTP request dan response selalu dibuat per-akses. Dalam arti sederhana, tidak ada hubungan antara request & response yang lama dengan request & response yang baru.

Jadi, bagaimana cara menyajikan data terkait jika HTTP tidak mengingat data yang kita minta sebelumnya?

Untuk menjawab ini, saya berikan ilustrasi sebagai berikut; ketika Anda berkungjung ke website penjualan misalnya e-bay, maka setiap kali Anda melihat barang, data barang tersebut dijadikan barang favorit oleh aplikasi untuk ditampilkan kembali sebagai suggest untuk pilihan yang akan Anda beli.

Proses tersebut terjadi, karena pada user agent diciptakan sebuah session dan cookie sehingga web server dapat mengingat hal tersebut dan memberikan data yang berhubungan dengan request sebelumnya. Session dan cookie adalah key-value pair data pada web server. Penjelasan lebih lanjut tentang session dan cookie mungkin akan dijabarkan pada tulisan berikutnya


Jika Anda pernah melihat kode error pada sebuah halaman, maka Anda cukup beruntung mengetahuinya karena kode response jarang ditampilkan jika kode tersebut untuk iformasi, sukses dan redirection. Berikut adalah code status respon secara garis besar;
1xx ditujukan sebagai informasi
2xx sukses. Jika Anda sering bermain dengan Ajax, biasanya success response ini sering digunakan dengan kode sukses 200.
3xx redirection
4xx client error
5xx server error


Penutup

Dengan mengetahui cara kerja website bagi awam dapat mengetahui apa itu sebenarnya web sehingga menambah pengetahuan akan web dan bisa saja mendapat ide baru sebagai enabler bagi pribadi sendiri atau organisasinya. Sebuah contoh penerapan web adalah sebuah aplikasi Android yang saya buat untuk kepentingan keluarga yang juga saya share pada goole play sehingga ribuan orang bisa memakainya.

Sendangkan dengan mengetahui cara kerja website/http ini bagi para web developer, dapat mengerti tentang trouble shooting dan  membuat arsitektur yang lebih baik pada sistem yang sedang dibuat. (keamanan, ketangguhan dll).


Sumber
http://www.w3.org/Protocols/rfc1341/4_Content-Type.html
http://en.wikipedia.org/wiki/Internet_media_type
http://en.wikipedia.org/wiki/List_of_HTTP_status_codes


*) Request dan response sebaiknya tidak dijadikan Bahasa Indonesia pada tulisan ini
**) Hacking sebenarnya tidak untuk tujuan jahat. Tetapi kata ini sering disalah artikan sehinga menjadi konotasi yang negatif.

Senin, 01 September 2014

Akses database MySQL dari komputer lokal menggunakan terminal

Judul dari tulisan ini memang sedikit kuno terutama pada zaman serba visual ini. Sebagian orang tidak membutuhkan ini karena menjadi coder praktis. Tetapi banyak hal yang didapat jika mengetahui perintah yang sangat dasar ini terutama untuk membuat aplikasi yang berhubungan dengan database dengan konsep yang lebih baik tanpa interpreter aplikasi lain seperti ODBC atau JDBC dan memahami konsep bagaimana koneksi tercipta sehingga mencegah serangan terhadap database.

Berapa contoh keuntungan mengetahui penggunaan perintah dasar ini;
- Jika tidak dapat menggunakan browser untuk database bisa menggunakan perintah ini,
- Jika koneksi sangat lamban, bisa menggunakan perintah ini,
- Jika tidak dapat masuk ke server sementara port MySQL (default 3306) dapat diakses,
- Jika ingin membuat aplikasi yang dapat memanggil perintah melalui terminal,
- Jika ingin berbuat jahat untuk meyerang server lain*,
- Dan banyak jika yang lainnya sesuai dengan kasus Anda.

Perlu diperhatikan disini, untuk dapat menggunakan perintah ini dari komputer lokal, port yang berhubungan dengan MySQL pada server harus diaktifkan.

Untuk melihat port yang aktif pada server Anda, ketik perintah berikut;

$ nmap ServerAnda.com

Jika port MySQL Anda terbuka, maka Anda dapat lanjut pada syntax selanjutnya. Jika tidak, Anda dapat mengaktifkan port tersebut seperti yang ada pada tulisan ini.

Berikut adalah syntax untuk mengakses database MySQL pada langsung dari terminal pada komputer lokal;

$ mysql -h ServerAnda.com -u username -p

Setelah perintah tersebut dieksekusi, maka Anda diminta memasukkan password dan jika akses granted, Anda dapat mengelola database melalui terminal.

Cukup mudah bukan? :)


*) Contoh yang buruk, berhati-hatilah terhadap port database Anda.

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