Partial Class, Fitur Aneh di C#


Saya bilang aneh, karena memang saya adalah orang Java πŸ˜€

Di Java, gak mungkin kita bisa membuat sebuah kelas dalam berkas yang berbeda, bahkan untuk membuat kelas public, dalam Java harus sama dengan nama berkasnya. Namun berbeda dengan di C#, ternyata nama berkas tidak harus sama dengan nama kelas public, bahkan ada yang namanya Partial Class, yaitu kelas yang dapat dibuat di beberapa berkas, aneh kan? πŸ˜€

Lantas untuk apa? Bukan kah ini malah membingungkan pengembang? Enggak juga πŸ˜€ Tergantung kebiasaan, jika terbiasa dengan Java seperti saya, mungkin bisa dibilang iya, fitur ini membingungkan πŸ˜€ Tapi ternyata ada juga saat-saat kita membutuhkan Partial Class

  1. Saat kelas yang kita buat itu sudah terlalu panjang, misal lebih dari 1000 baris
  2. Saat kita mau membuat kode sengaja dibuat untuk membingungkan orang yang baca kode kita πŸ˜€ (heheh, ini ide saya lho)

Misal dalam berkas Panjang.cs kita buat kode seperti ini :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Learning.Partial
{
public partial class Panjang
{
public void MetodeSatu()
{
}
}
}

Setelah itu kita buat kode dalam berkas PanjangLanjutan.cs seperti ini :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Learning.Partial
{
public partial class Panjang
{
public void MetodeDua()
{
}
}
}

Hahah, pendek? Ya anggap aja itu kode yang sangat panjang πŸ˜€ . Dengan seperti itu, kita dapat menjalankan kelas tersebut secara bersamaan, seperti dibawah ini :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Learning.Partial;
namespace Learning
{
class Program
{
static void Main(string[] args)
{
Panjang panjang = new Panjang();
panjang.MetodeSatu();
panjang.MetodeDua();
}
}
}

Hmm, ternyata cukup mudah juga y πŸ˜€
Haha!!!!!

Untuk lebih jelas, silahkan liat tautan dibawah ini :

  1. Partial Classes and Methods (C# Programming Guide)

Perbedaan Gaya C# dan Gaya Java, yang Membuat Saya Selalu Salah


wKarena sudah kental di Java, jadi agak susah ngikutin gaya orang-orang C# πŸ˜€ terutama di pembuatan metode. Orang Java biasanya membuat metode dengan diawali huruf kecil, setelah itu baru diikuti huruf besar pada awal kata. Misal orang Java biasa membuat metode seperti ini :

public void helloSelamatPagi(){
}

Tapi orang C# membuatnya seperti ini :

public void HelloSelamatPagi(){
}

Beda sedikit sih πŸ˜€ Hanya karena latar belakang saya Java, jadi salah gaya terus kalo koding di C#, haha. Mungkin harus mulai menyesuaikan diri nih πŸ˜€


Eko Kurniawan Khannedy
Mahasiswa Universitas Komputer Indonesia
+6285292775999

Mencoba Posting Menggunakan EMail


Ini adalah contoh posting yang dilakukan menggunakan email πŸ˜€

MengasingkanΒ Diri…


Mengasingkan diri untuk merenungi apa yang sudah dilakukan selama 22 tahun ini…

Hiburan dengan Goyangan Sexy


Jangan serius mulu, sekali-kali hiburan nonton goyangan sexy πŸ˜€

Sexy kan? πŸ˜€

Membuat Download Manager Menggunakan Java untuk Mengunduh Seluruh Gambar yang Ada di WordPress


sebenarnya kita tidak perlu membuat download manager sendiri untuk mengunduh gambar-gambar di halaman web. banyak sekali download manager yang sudah ada. namun yang menjadi masalah adalah saat ini kebanyakan yang diunduh adalah link bukan image, jadi tag lah yang didownload, sedangkan jika gambarnya dalam biasanya tidak didownload.

kenapa tidak menggunakan mirror? wew, yang saya inginkan itu cuma gambarnya, bukan seluruh websitenya πŸ˜€ So? Saatnya membuat download manager sendiri πŸ˜€

Pengetahuan yang Diperlukan

pengetahuan yang diperlukan untuk membuat download manager sebuah website adalah :

  1. tau cara nge-crawl halaman-halaman website
  2. tau cara nge-parsing halaman html
  3. tau cara mendownload berkas dari internet
  4. tau pemetaan lokasi link-link pada website yang akan didownload πŸ˜€

karena saya mau mendownload seluruh gambar yang ada di wordpress, jadi kita harus tau bagaimana pemetaan website di wordpress πŸ˜€

  1. pertama! setiap blog di wordpress itu memiliki halaman dari halaman 1 sampai terakhir, dan penulisannya adalah seperti ini : http://namablog.wordpress.com/page/1/ dan seterusnya…
  2. kedua! pada setiap halaman terdapat artikel-artikel, dan biasanya banyaknya artikel pada setiap halaman tergantung pengaturan pemilik blog itu πŸ˜€
  3. ketiga! penamaan link artikel pada wordpress adalah sebagai berikut : http://namablog.wordpress.com/2010/04/07/judul-artikel/ dimana untuk 2010 adalah tahun pembuatan artikel, untuk 04 adalah bulan pembuatan, untuk 07 adalah tanggal pembuatan dan untuk judul-artikel adalah judul artikelnya pastinya πŸ˜€
  4. jadi untuk mengunduh seluruh gambar yang ada di wordpress, pertama kita harus dapatkan lokasi link artikel dengan cara menelusuri halaman, setelah dapat semua linknya, baru cari tag yang berisikan gambar πŸ˜€

jadi seperti ini Β kode program yang harus dibuat :

package khannedy.wordpress.image.downloader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashSet;
import java.util.Set;
import java.util.logging.Logger;
import org.cyberneko.html.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
 *
 * @author echo
 */
public class Downloader {

    private Logger log;

    private final String downloadUrl;

    private final String downloadTarget;

    private final int first;

    private final int last;

    /**
     * Membuat Downloader
     * @param downloadUrl url wordpress
     * @param downloadTarget target disimpan gambar
     * @param first
     * @param last
     */
    public Downloader(String downloadUrl, String downloadTarget, int first, int last) {
	if (!downloadUrl.endsWith("/")) {
	    downloadUrl += "/";
	}
	this.downloadUrl = downloadUrl;
	this.downloadTarget = downloadTarget;
	this.log = Logger.getLogger(Downloader.class.getName());

	this.first = first;
	this.last = last;
    }

    /**
     * untuh semua halaman
     * @return
     */
    protected Set downloadPage() {
	Set set = new HashSet();
	int index = first;
	int i = 0;
	while (true) {
	    if (index > last) {
		break;
	    }
	    try {
		String target = downloadUrl + "page/" + index + "/";
		URL url = new URL(target);
		log.info("memproses halaman " + url);
		HttpURLConnection connection = (HttpURLConnection) url.openConnection();
		connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.3");
		connection.connect();
		if (connection.getContentType().startsWith("text/html")) {
		    DOMParser parser = new DOMParser();
		    parser.parse(new InputSource(connection.getInputStream()));
		    Document document = parser.getDocument();
		    NodeList list = document.getElementsByTagName("a");
		    boolean valid = true;
		    for (i = 0; i < list.getLength(); i++) { 			valid = true; 			Node node = list.item(i); 			Node node1 = node.getAttributes().getNamedItem("href"); 			String href = node1.getNodeValue(); 			if (href.startsWith(downloadUrl)) { 			    if (!href.contains("#")) { 				String replace = href.replace(downloadUrl, "").replace("/", ""); 				if (replace.length() > 8) {
				    String number = replace.substring(0, 8);
				    char[] array = number.toCharArray();
				    for (char c : array) {
					if (!Character.isDigit(c)) {
					    valid = false;
					    break;
					}
				    }
				    array = null;
				    number = null;
				} else {
				    valid = false;
				}
				replace = null;
			    } else {
				valid = false;
			    }
			} else {
			    valid = false;
			}
			if (valid) {
			    set.add(href);
			} else {
			    href = null;
			}
		    }
		    list = null;
		}
		connection.disconnect();
		connection = null;
		url = null;
		target = null;
		System.gc();
		index++;
	    } catch (Throwable t) {
		break;
	    }
	}
	return set;
    }

    /**
     * unduh semua gambar
     * @param articleUrl
     * @return
     */
    protected Set downloadArticle(String articleUrl) {
	Set set = new HashSet();
	int i = 0;
	try {
	    URL url = new URL(articleUrl);
	    log.info("memproses artikel " + articleUrl);
	    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.3");
	    connection.connect();
	    if (connection.getContentType().startsWith("text/html")) {
		DOMParser parser = new DOMParser();
		parser.parse(new InputSource(connection.getInputStream()));
		Document document = parser.getDocument();
		NodeList list = document.getElementsByTagName("img");
		for (i = 0; i < list.getLength(); i++) {
		    Node node = list.item(i);
		    Node node1 = node.getAttributes().getNamedItem("src");
		    String href = node1.getNodeValue();

		    String replace = articleUrl.replace(downloadUrl, "").replace("/", "");

		    Gambar gambar = new Gambar();
		    gambar.setLokasi(href);
		    gambar.setFolder(replace.substring(0, 8));
		    gambar.setSubFolder(replace.substring(8));

		    set.add(gambar);

		    replace = null;
		}
		list = null;
	    }
	    connection.disconnect();
	    connection = null;
	    url = null;
	    System.gc();
	} catch (Throwable t) {
	}

	return set;
    }

    /**
     * simpan gambar ke disk
     * @param gambar
     */
    protected void downloadImag(Gambar gambar) {
	try {
	    URL url = new URL(gambar.getLokasi());
	    log.info("mengunduh gambar " + gambar.getLokasi());
	    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
	    connection.setRequestProperty("User-Agent", "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1.8) Gecko/20100214 Ubuntu/9.10 (karmic) Firefox/3.5.3");
	    connection.connect();

	    if (connection.getContentType().startsWith("image")) {
		InputStream inputStream = connection.getInputStream();

		File folder = new File(new File(downloadTarget, gambar.getFolder()), gambar.getSubFolder());
		folder.mkdirs();

		FileOutputStream outputStream = new FileOutputStream(new File(folder, gambar.getNama()));

		byte[] buffer = new byte[1042 * 8];
		int length = 0;

		while ((length = inputStream.read(buffer)) != -1) {
		    outputStream.write(buffer, 0, length);
		}

		outputStream.close();
	    }

	    connection.disconnect();
	    connection = null;
	    url = null;
	    System.gc();
	} catch (Throwable t) {
	}
    }

    /**
     * memulai download
     */
    public void start() {
	Set articles = downloadPage();
	Set images = new HashSet();

	log.info("mengunduh seluruh halaman...");
	for (String string : articles) {
	    images.addAll(downloadArticle(string));
	}

	log.info("mengunduh seluruh gambar...");
	for (Gambar gambar : images) {
	    downloadImag(gambar);
	}

	log.info("selesai...");
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package khannedy.wordpress.image.downloader;

/**
 *
 * @author echo
 */
public class Gambar {

    private String folder;

    private String subFolder;

    private String lokasi;

    private String nama;

    public String getNama() {
	return nama;
    }

    public void setNama(String nama) {
	this.nama = nama;
    }

    public String getFolder() {
	return folder;
    }

    public void setFolder(String folder) {
	this.folder = folder;
    }

    public String getLokasi() {
	return lokasi;
    }

    public void setLokasi(String lokasi) {
	this.lokasi = lokasi;
	this.nama = lokasi.substring(lokasi.lastIndexOf("/") + 1);
    }

    public String getSubFolder() {
	return subFolder;
    }

    public void setSubFolder(String subFolder) {
	this.subFolder = subFolder;
    }

    @Override
    public boolean equals(Object obj) {
	if (obj == null) {
	    return false;
	}
	if (getClass() != obj.getClass()) {
	    return false;
	}
	final Gambar other = (Gambar) obj;
	if ((this.lokasi == null) ? (other.lokasi != null) : !this.lokasi.equals(other.lokasi)) {
	    return false;
	}
	return true;
    }

    @Override
    public int hashCode() {
	int hash = 3;
	hash = 71 * hash + (this.lokasi != null ? this.lokasi.hashCode() : 0);
	return hash;
    }
}
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package khannedy.wordpress.image.downloader;

/**
 *
 * @author echo
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

	// melakukan pengecekan argumen
	if (args.length < 2) { 	    // terjadi kesalahan argumen, beri tahu cara penggunaan 	    System.out.println("Argumen salah...\n\n" 		    + "Gunakan :\n" 		    + "java -jar wordpress-image-downloader.jar [url] [target] [first] [last]\n" 		    + "  [url]      : url wordpress, misal https://eecchhoo.wordpress.com/\n" 		    + "  [target]   : lokasi target gambar disimpan, misal : /home/echo/Desktop/target/\n" 		    + "  [first]    : halaman pertama (default 1)\n" 		    + "  [last]     : halaman terakhir (default Integer.MAX_VALUE)\n\n" 		    + "Bye...\n"); 	} else { 	    int first = 1; 	    int last = Integer.MAX_VALUE; 	    if (args.length >= 3) {
		first = Integer.parseInt(args[2]);
		if (first < 1) { 		    first = 1; 		} 	    } 	    if (args.length >= 4) {
		last = Integer.parseInt(args[3]);
	    }

	    new Downloader(args[0], args[1], first, last).start();
	}

    }
}

penjelasannya? duh saya lagi males ngejelasin tahapan-tahapannya πŸ˜€

intinya untuk mengerti kode-kode diatas, anda harus tau :

  1. Java Networking, untuk koneksi ke websitenya
  2. Java IO, untuk proses streaming nya
  3. NecoHTML, untuk parsing HTML nya πŸ˜€

untuk aplikasi yang sudah jadi silahkan download sisini :

DOWNLOAD

cara penggunaannya cukup ketikkan :

java -jar wordpress-image-downloader.jar [url] [target] [first] [last]

dimana :

  1. [url] adalah halaman blog wordpress, misal https://eecchhoo.wordpress.com/
  2. [target] adalah lokasi folder tempat gambar disimpan misal : /hom/echo/Desktop/Wordpress/
  3. [first] halaman awal (default 1)
  4. [last] halaman akhir (default Integer.MAX_VALUE)

contohnya :

java -jar wordpress-image-downloader.jar https://eecchhoo.wordpress.com/ /home/echo/Desktop/Wordpress/ 1 2

artinya saya mendownload seluruh gambar yang ada di blog https://eecchhoo.wordpress.com/ pada halaman 1 sampai 2 dan disimpan di disk yang beralamatkan di /home/echo/Desktop/Wordpress/

hasilnya, seluruh gambar akan terdownload seperti terlihat pada gambar dibawah ini :

Menginstall Printer Epson TX111 di Ubuntu Linux


Saat ditulisnya artikel ini printer Epson TX111 lumayan baru keluar. Mungkin yang jadi masalah buat pengguna Linux adalah, apakah printer ini bisa jalan jika pake Linux? Karena printer ini adalah printer multifungsi, selain bisa mencetak bisa juga untuk melakukan proses scan dan potocopy, yup Epson TX111 adalah printer multifungsi:

Jadi bagaimana cara menginstall printer Epson TX111 ini?

Instalasi CUPS (Common UNIX Printing System)

Coba buka aplikasi perambah anda, lalu buka alamat :

http://localhost:631/

Jika tidak muncul halaman seperti ini :

Artinya dalam Ubuntu anda belum terinstall CUPS, install dengan perintah :

sudo apt-get install cups

selesai πŸ˜€

Download Driver Epson TX111

Untuk download driver Epson TX111, silahkan masuk ke halaman web :

http://www.avasys.jp/lx-bin2/linux_e/spc/DL1.do

Pilih tipe printernya Epson TX111 :

Setelah itu next, dan muncul halaman downloadnya. Download driver untuk Ubuntu :

Karena printer Epson TX111 itu gabung dengan Scanner, jadi kita juga harus download aplikasi iScan untuk scanner nya, scroll ke bagian bawah nanti terlihat bagian Β :

Download iScan untuk Ubuntu :

Instalasi Driver Epson TX111

Sekarang di komputer kita telah terdapat file :

pips-snx110-ubuntu8.04-3.8.0-CG.tgz
iscan_2.24.0-4.ltdl7_i386.deb

sekarang tinggal menginstall Driver Printer lalu menginstall iScan, caranya extract file pips-snx110-ubuntu8.04-3.8.0-CG.tgz dan jalankan hasil extractnya, perintah terminalnya seperti dibawah ini :

tar xvf pips-snx110-ubuntu8.04-3.8.0-CG.tgz
./pips-snx110-ubuntu8.04-3.8.0-CG.install

karena hasil Β ekstrak nya hanyalah file pips-snx110-ubuntu8.04-3.8.0-CG.install. Ikuti proses instalasi sampai selesai.

Instalasi Printer Epson TX111 pada CUPS

Buka halaman http://localhost:631/ menggunakan browser, maka akan terdapat halaman CUPS.

Buka halaman Adminstration.

Pada bagian Pinters, pilih Find New Printer, setelah itu akan terlihat printer EPSON Epson Stylus TX111, tambahkan printer tersebut :

Setelah itu ikuti tahapan2nya sampai selesai.

Setelah selesai lihatlah bagian Printers, maka sekarang printer Epson TX111 telah terregister ke CUPS :

Sekarang Printer sudah bisa digunakan, namun scannernya belum bisa πŸ˜€

Instalasi Scanner Epson TX111

Cara menginstall scanner cukup sederhana, caranya, dobel klik file iscan_2.24.0-4.ltdl7_i386.deb, lalu pilih Install Package, tunggu sampai proses instalasi selesai. Setelah selesai sekarang anda dapat melihat aplikasi Image Scan! for Linux.

Buka aplikasi Image Scan! for Linux di lewat menu Ubuntu -> Graphics -> Image Scan! for Linux :

Membangun Aplikasi CRUD Java Swing Menggunakan Konsep Model-View-Controller Ruby on Rails Bagian 2


Artikel sebelumnya “Membangun Aplikasi CRUD Java Swing Menggunakan Konsep Model-View-Controller Ruby on Rails” sudah selesai. Namun ada beberapa masalah yang seperti dituliskan pada bagian akhir artikel sebelumnya itu, yaitu :

  1. Harusnya saat di klik INSERT, setelah data sukses dimasukkan ke database dan tabel, harusnya data di form jadi clear.
  2. Harusnya saat baris tabel terseleksi, data langsung ada di form, jadi kalo mau Update gampang πŸ˜€

Jadi dari sini diperlukan sebuah aksi RESET ya itu aksi yang menghapuskan seluruh text form sehingga kosong, dan juga aksi SELECT ROW, yang menampilkan data baris tabel yang terseleksi ke form. Dari sini perlu kita tambahkan 2 buah aksi dalam Controller-nya, yaitu aksi reset() dan aksi selectRow() :

    public void reset(){
	view.getTextFirstName().setText(null);
	view.getTextLastName().setText(null);
    }

    public void selectRow() {
	// dapatkan baris yang terseleksi
	int index = view.getTablePerson().getSelectedRow();
	// jika ada yang terseleksi
	if (index != -1) {
	    // ambil data person dari tablemodel
	    Person person = view.getTableModelPerson().select(index);
	    // tampilkan di form
	    view.getTextFirstName().setText(person.getFirstName());
	    view.getTextLastName().setText(person.getLastName());
	}
    }

Dan selain itu kita perlu mengubah aksi tombol buttonInsert menjadi :

    private void buttonInsertActionPerformed(java.awt.event.ActionEvent evt) {
	// TODO add your handling code here:
	controller.insert();
	controller.reset();
    }

Dan juga perlu menambahkan aksi saat tabel terseleksi, sehingga kita harus mengubah konstruktor PersonView menjadi seperti dibawah ini :

public class PersonView extends javax.swing.JFrame {

    private TableModelPerson tableModelPerson;

    private PersonController controller;

    /** Creates new form PersonView */
    public PersonView() {
	initComponents();

	tableModelPerson = new TableModelPerson();
	tablePerson.setModel(tableModelPerson);

	controller = new PersonController(this);
	controller.select();

	tablePerson.getSelectionModel().addListSelectionListener(new ListSelectionListener() {

	    public void valueChanged(ListSelectionEvent e) {
		controller.selectRow();
	    }
	});
    }

Dan sekarang selesai, tinggal kita jalankan aplikasinya πŸ˜€

Download SourceCode

Silahkan download sourcecodenya –> disini <–