2017

Sunday, July 2, 2017

Holiday Project - Airline Livery Design


Airline Livery Design - June 2017

These are the liveries that I made in June for a web-based airline management game called Airline Empires. Those are fantasy airlines that were made for the ingame airline. Those airline were not mine, though, they're requests that were asked to me. So I put a forum thread there about me accepting livery design creations, and requests start flooding in! I was so happy at the start, but as the amount of requests start piling up, it really seems like a though challenge for me.

So before I posts that thread, I hunted in their forum threads for people who posted a public thread about a livery request. I actually designed some livery, but unfortunately, only a few responded. The other maybe made their thread as a 'hit-and-miss', post it and totally forget about it. But the responses that I received really shows a positive result, so I'm gonna post it here as well.

FlyNL Fokker F-100
This is my first airline livery request that I made. So a person made a thread about an idea about his next livery for his virtual airline, and I decided to jump at it and give it a go. I was actually trying to make a gradient for the red part, but fail so spectacularly that the red part fades too much. Finally, I got rid of it, and here is the final design.

Skyway Airlines - Airbus A320
Here is the second livery that I take. It's fully inspired by JetBlue. Actually it was not this simple. I went mad with putting white tribal painting all over the tail to the rear fuselage. But the client wants to make it simple and modern, so I made it almost similar to those JetBlue liveries, and putting some modern-styled pattern to the tail, made a way to somehow show the logo at the tail, and finish it with a lot of details, like slogan, website on engine, alliance logo and plane reg number.

Appalachian Airlines - Boeing 737-800
Actually I made 3 or 4 liveries, maybe 5, before I decided that it was the time to open my own thread, but only 2 responded, so that's that. Here is the picture of Appalachian Airlines, the first airline that requested directly to me via my own thread. He wanted to make it like Frontier, but instead of animals, the client wanted me to replace it with mountain or such things. So I went to google (oops), did lots of research about Appalachia and searching pictures of mountains in Appalachia. Honestly, it was truly difficult to fit a mountain picture to a tail of an airplane, you see. As you can see, the space that is available is in portrait orientation, while most (or maybe, all) mountain picture are landscape, even panoramic! You might first think that it's actually easier than that, just crop the summit and voila, but it was not that easy. If I supposedly do that, the tail will have the sky, the summit, and random mass of rocks below the summit. It will show 80% rocks 10% summit and 10% sky. Not good at all. I need to find a good portrait image in a good landscape image. Fortunately I found one, and there you go, Appalachian Airlines livery.

Americana - Boeing 747-400
Here is my final individual livery that I made this month. It was supposed to be Americana's special 747 livery. Here is the story: Americana want to make a livery, exclusive to their 747. Americana really holds high regards to 747, therefore wants a unique livery designed for them. Well, at the first second I accepted this request I can only think one thing: Black. Exclusive livery for exclusive aircraft series must be painted in luxurious black. With that thing in mind, I made this livery. I also put a giant '747' logo on the fuselage, just like how ANA did with their 787 design, to really emphasize that this 747 is a no joke.

So that's it. These are my liveries that I made individually. Next time I'm going to publish my other work that was done in June, but it was in bulk, means it's a long range project between me and the requesting airline.

Saturday, June 10, 2017

Monday, April 3, 2017

Proyek UTS - Mesin Antri menggunakan Java


Nama - Benito Danneswara
NRP   - 5115100097
Kelas  - PBO A

Dalam proyek ini saya akan membuat sebuah aplikasi mesin antri. Aplikasi ini masih berupa aplikasi sederhana yang hanya berjalan pada satu komputer saja. Aplikasi ini berfungsi untuk mencetak nomor antrian untuk setiap pelanggan yang memberi input kepada mesin. Aplikasi akan menghitung nomor antrian dan menampilkan nomor antrian yang belum diambil pada monitor, dan mencetak nomor antrian yang diambil oleh user sesaat setelah ia memberi input.

Program ini terdiri atas dua class. Yang pertama adalah class Number, dan yang kedua adalah NumberTest. Didalam class Number ada tiga method utama, yang pertama adalah setNumber(), in

i untuk mengatur nomor antrian terlebih dahulu sebelum dipakai user secara biasa. Kemudian getNumber(), ini untuk mengirim nomor antrian terakhir yang bisa diambil oleh user. Kemudian angka antrian ini akan bertambah. Yang terakhir adalah printNumber(), yang fungsinya adalah untuk mencetak nomor antrian yang diambil. Hasil output untuk sekarang akan dicetak kedalam console.

NumberTest adalah class main yang berfungsi sebagai interaksi input dan output untuk pengguna dan operator. Setelah program dijalankan pertama-tama akan diberi prompt berapakah nomor antrian diawali. Kemudian akan ada dialog box yang menampilkan nomor antrian yang bisa diambil. Yang ada hanyalah perintah ‘Enter/OK’ yang jika ditekan, akan menambah nomor antrian senilai satu dan mencetak nomor antrian yang sebelumnya muncul. Input pada program akan menggunakan dialog box, sedangkan output pada program akan ditampilkan melalui dialog box atau di console (‘dicetak’).





Berikut adalah codingan dari kedua class:

Class Number:

Class NumberTest:

Dan berikut adalah hasil outputnya:




Pada akhirnya, karena saya belum mampu membuat dialog box dengan baik, saya menggunakan dialog box input biasa dengan while agar program dapat tetap berjalan dengan loop dan dapat dihentikan dengan input tertentu.

REVISI

Berikut revisi yang telah saya lakukan kedalam project saya.
Saya menggunakan 5 class, setelah sebelumnya hanya menggunakan 2 class.
Berikut codingan hasil revisi saya:
Class Print:

Class Main:

Class Button:

Class CS:

Class Teller:


Sunday, March 26, 2017

Penggunaan Library dan Dialog Box


Pada blog post saya berikut ini saya akan menunjukkan cara membuat program membaca input yang dimasukkan dari user program menggunakan Scanner dan cara membuat Dialog Box menggunakan Java. Saya akan menunjukkan program yang menggunakan perintah Scanner pada Java sebagai cara mengetahui input dari user, program yang menampilkan dialog box, dan program pertama yang dimodifikasi sehingga menggunakan dialog box sebagai GUI user untuk memasukkan data.

Program pertama adalah sebuah program yang menyimpan nilai saldo user. Program ini didesain untuk memiliki dua slot saldo, yaitu account1 dan account2. Program ini akan menerima input dari user berupa saldo yang akan ditambahkan oleh user. Kemudian data yang diinput akan ditambahkan ke saldo yang sudah direkam kedalam data.

Program ini menggunakan dua class, yaitu class Account dan AccountTest. Berikut ilustrasi class diagram dari class Account:


Pada class Account digunakan variabel balance untuk menyimpan nilai saldo. Method credit digunakan untuk menambah nilai yang diinputkan oleh user kedalam saldo awal. Kemudian hasil penjumlahan itu disimpan menjadi nilai saldo saat itu. Method getBalance berfungsi untuk mengembalikan nilai saldo yang tersimpan.

Class AccountTest berfungsi untuk menampung input dari user dan mengembalikan output nya. Metode input menggunakan Scanner. Dapat dilihat dari baris ke-8, kita harus memasukan java.util.Scanner terlebih dahulu untuk dapat menggunakan Scanner. Kemudian, Scanner harus dibuat. Caranya adalah dengan mengimpor library ‘Scanner input = new [nama_Scanner] (System.in);’. Kemudian, untuk mendeklarasikan input setelah membuat Prompt, buat perintah ‘[variable] = input.nextLine();’, ini untuk menginput apa yang diinputkan dalam satu baris pertama yang diinputkan user. nextLine bisa diganti dengan nextInt untuk variabel yang beratribut int, atau nextDouble untuk variable yang beratribut double. Setelah melakukan input, program akan mengeluarkan saldo yang sudah diubah. Proses input dan output ini berulang dua kali, pertama untuk modifikasi saldo account1, yang kedua untuk account2.

Berikut kode dari kedua class tersebut:

Dan berikut gambar input dan output dari program:
 
Program kedua mengajarkan cara membuat dialog box pada java. Pembuatan dialog box menggunakan Swing. Program ini hanya menggunakan satu class tunggal. Fungsi dari program ini cukup simpel, hanyalah membuat output berupa dialog box dengan satu kalimat.

Cara untuk dapat membuat dialog box adalah dengan mengimpor library JOptionPane, caranya dengan memasukkan perintah ‘import javax.swing.JOptionPane;’. Dengan begitu swing dapat digunakan. Kemudian, untuk memunculkan dialog box, masukkan perintah ‘JOptionPane.showMessageDialog’. Dalam kasus program ini, saya hanya memunculkan satu kalimat biasa yang berkata ‘Welcome to Java’.

Berikut kode dari class:

Berikut output dari program:

Dalam program kedua diajarkan cara membuat input dengan dialog box. Bukan hanya menampilkan kalimat saja, dialog box juga dapat digunakan sebagai sarana input dan output dari suatu program. Untuk melakukan input, pertama digunakan baris ‘[Atribut] [variable] = JOptionPane.showInputDialog (“[kalimat prompt]”);’. Ini akan menampilkan dialog box berupa pertanyaan/kalimat prompt dan sebuah kotak yang bisa diisi dibawahnya. Kemudian ada tombol ‘OK’ di bawahnya. Input dapat dilaksanakan. Data yang dimasukkan user akan menjadi nilai dari variable yang dideklarasikan dalam baris itu.

Berikut kode dari class tersebut:

Kemudian gambar input dan output dari dialog box:


Kemudian program terakhir, adalah menggabungkan apa yang didapatkan dari ketiga program diatas. Tujuannya adalah memodifikasi class AccountTest agar input dan output dapat menggunakan dialog box sepenuhnya, tanpa harus membuka konsol. Akibatnya, bukannya modifikasi, lebih seperti membuat baru, karena cara Scanner tidak digunakan jika input digunakan menggunakan dialog box, jika caranya seperti yang diajarkan pada project sebelumnya. Maka dari itu, dibuatlah sebuah class baru, bernama AccountGUI, yang berfungsi menjalankan project seperti AccountTest, namun dengan interface dialog box.

Cara input yang dilakukan juga agak sulit, karena data yang dimasukkan harus berupa double, bukan String biasa. Maka dari itu, setelah input dilakukan, hasil input langsung diubah menjadi double, dan dapat dimasukkan ke dalam method credit. Kemudian, hasil perhitungan dikeluarkan melalui dialog box juga.

Berikut kode dari class AccountGUI:

Berikut input dan output dari dialog box:



Monday, March 20, 2017

Menghitung Luas dan Keliling


Berikut adalah program yang berfungsi untuk menghitung luas dan keliling dari bangun lingkaran dan bangun persegi/persegi panjang. Ada dua program yang saya buat, pertama untuk lingkaran (Circle), yang kedua untuk persegi panjang (Rectangle).

Didalam kedua program format input dan outputnya nyaris sama. Pada program lingkaran, yang perlu dimasukkan adalah panjang jari-jari lingkaran dan warna dari lingkaran, sedangkan pada program persegi panjang yang perlu dimasukkan adalah panjang, lebar, dan warna dari persegi panjang. Output dari kedua program adalah data dan warna dari lingkaran atau persegi panjang, dan luas dan keliling dari bangun tersebut.

Pada waktu memasukkan data, jika warna dari bentuk dimasukkan, data lain yang diisi haruslah lengkap. Namun, jika tidak ingin memasukkan warna, itu bisa dilakukan selama data yang lain diisi dengan lengkap. Program juga dapat berjalan jika program dijalankan tanpa melakukan input apapun.

Berikut adalah visualisasi class dari program Circle.


Class Circle menggunakan dua variabel, radius untuk jari-jari dan color untuk warna. Method getArea berfungsi untuk menghitung luas lingkaran. Method getCircumference berfungsi untuk menghitung keliling dari lingkaran. Method setColor dan setRadius masing-masing berfungsi untuk mengatur warna dan jari-jari dari lingkaran, kemudian method getColor dan getRadius digunakan untuk memberikan data warna dan jari-jari dari lingkaran. Method toString digunakan untuk memberi output mengenai data lingkaran, dengan menampilkan warna dan jari-jari dari lingkaran.

Berikut coding dari class Circle dan class Main untuk program Circle.

Class Circle:


Class Main:

Berikut adalah visualisasi class Rectangle milik program Rectangle.











Variabel yang digunakan dalam class ini adalah color, length, dan width. Method getArea dan getCircumference masing-masing digunakan untuk mencari luas dan keliling dari persegi panjang. Method getColor, getLength, dan getWidth digunakan untuk menampilkan data warna, panjang, dan lebar dari persegi panjang. Method yang terakhir, toString, berfungsi untuk menampilkan data dari persegi panjang, berisikan panjang, lebar, dan warna dari persegi panjang tersebut.

Berikut adalah kode dari kedua class dalam program Rectangle, class Rectangle dan class Main.

Class Rectangle:


Class Main:

Sunday, March 12, 2017

PBO - Membuat Tampilan Jam Digital 24-jam


Untuk membuat aplikasi yang menarik, kita tidak bisa membuat aplikasi dengan membuat satu objek yang bekerja sendiri. Melainkan, kita sebaiknya membuat aplikasi dengan beberapa objek dan mengatur method-method yang ada untuk memanggil method yang lain untuk bekerja bersama dan mencapai tujuan sebuah program.

Dalam proyek ini kita akan menggunakan aplikasi jam digital sebagai contoh interaksi antar objek. Output yang dikeluarkan akan menunjukkan jam dan menit, terpisahkan oleh tanda titik dua (:). Jam akan ditunjukkan dengan format 24-jam, yang berarti menunjukkan waktu dari 00:00 (tengah malam) hingga 23:59 (1 menit sebelum tengah malam).

Aplikasi jam ini mungkin bisa ditulis dengan satu class saja. Namun, program-program makin lama akan semakin kompleks. Aplikasi jam ini masih dibilang sederhana, namun untuk aplikasi yang benar-benar dibutuhkan khalayak luas, pastilah jauh lebih rumit dari ini. Semakin besar permasalahan yang ingin dipecahkan suatu program, akan menjadi lebih komplekslah sebuah program.

Untuk mengatasi masalah kompleksitas ini digunakanlah abstraksi. Kita memecah masalah menjadi sub-masalah, lagi menjadi sub-sub-masalah, dan seterusnya, hingga permasalahan itu menjadi masalah individual yang mudah untuk diatasi. Setelah menyelesaikan satu sub-masalah itu, kita tidak memikirkan apa-apa lagi mengenai detail bagian itu, melainkan tinggal menganggapnya sebagai satu bagian fungsional untuk masalah selanjutnya, atau program keseluruhan yang sudah bisa langsung digunakan. Teknik seperti ini biasanya disebut divide and conquer.

Program ini akan menggunakan tiga class, class pertama adalah class NumberDisplay, kemudian ClockDisplay, dan Clock. Class NumberDisplay akan menunjukkan angka digital yang dapat menampung nilai dari nol ke batas yang ditentukan. Batasnya dapat dibuat saat membuat tampilannya. Jika digunakan, misal, untuk detik dalam jam digital, limitnya akan menjadi 60, menampilkan angka dengan angka 0 sampai 59. Saat angka dinaikkan, tampilan angka menjadi kembali ke 0 jika batas dicapai.

Class NumberDisplay:


Didalam method setValue, sebelum angka diterima, angka harus dicek apakah bernilai legal atau tidak. Jarak legalitas angka adalah 0 menuju 1 dibawah limit. Digunakan pernyataan if untuk memeriksa legalitas angka. Didalam pernyataan if digunakan simbol “&&” yang berarti operator logika “dan”. Ini membuat sebuah kondisi didalam if bernilai benar jika kondisi di kedua sisi simbol “&&” bernilai benar.

Method getDisplayValue mengembalikan nilai display, namun dalam format yang berbeda. Ini karena kita ingin output berupa string dua digit. Jadi, jika waktu sekarang 2:05, kita menginginkan tampilan output program 02:05, bukan 2:5. Agar output dapat menjadi dua digit meskipun nilai angka hanya satu digit, digunakan pernyataan if. Jika nilai angka dibawah 10, maka akan ditambahkan nol sebelum angka. Untuk menambah angka 0 digunakan cara concatenation, yaitu dengan menulis [“karakter” + value].

Method terakhir dalam NumberDisplay yang akan kita bahas adalah increment. Method ini berfungsi menambah nilai dalam angka sebanyak satu, dan mengembalikan nilai angka menjadi 0 jika limit dicapai. Untuk mengembalikan angka menjadi 0 saat nilai angka mencapai limit, digunakan operator modulo (%). Operator modulo menghitung sisa dari sebuah pembagian. Jadi jika nilai angka detik 3, 3 dibagi 60 akan bersisa 3, namun jika nilai angka sudah mencapai 60, 60 dibagi 60 akan menjadi tidak bersisa, yang berarti nilai hasil modulo adalah 0. Dengan ini nilai angka berhasil dikembalikan menjadi nol.

Class  ClockDisplay:

Kelas kedua yang digunakan dalam program ini adalah ClockDisplay. Kelas ini berfungsi membuat dua tampilan angka untuk membuat tampilan waktu sepenuhnya. Kelas ini akan menampilkan tampilan jam Eropa berformat 24 jam. Jarak waktu yang ditampilkan adalah antara 00:00 (tengah malam) dan 23:59 (satu menit sebelum tengah malam). Tampilan pada jam menerima “detik” (melalui method timeTick) setiap menitnya dan bereaksi dengan menambah nilai angka pada tampilan. Jika nilai angka menit mencapai limit dan kembali ke nol, nilai angka jam akan bertambah.

Field displayString digunakan untuk mensimulasikan tampilan jam. String ini akan dibuat sebagai simulasi software untuk tampilan jam. GUI untuk menampilkan jam akan menggunakan string ini, namun cara pembuatannya tidak akan saya bahas (karena masih belum bisa).

Saat kita ingin merubah tampilan dari jam, kita harus memanggil method internal updateDisplay. Didalam program ini, method ini akan mengganti display string. Didalam jam asli, method ini juga ada, method ini akan merubah tampilan pada jam.

Selain display string, class ClockDisplay mempunyai dua field lainnya: hours dan minutes. Setiap field dapat menampung sebuah objek dengan tipe NumberDisplay. Cara penggunaan field hours dan minutes menggunakan classes define types.

Untuk menampilkan kedua objek angka dalam jam, tentu saja kedua objek itu harus dibuat terlebih dahulu. Caranya adalah dengan menulis kode didalam konstruktor ClockDisplay yang membuat dan menyimpan dua objek NumberDisplay. Karena konstruktor dieksekusi secara otomatis saat objek ClockDisplay dibuat, objek NumberDisplay akan dibuat secara otomatis juga dalam waktu yang bersamaan.

Didalam kode class ClockDisplay pasti kita sadari bahwa ada dua konstruktor yang melakukan hal yang nyaris sama. Yang membedakan mereka adalah cara yang berbeda untuk menginisialisasi objek ClockDisplay. Jika objek tanpa parameter yang digunakan, maka waktu awal jam adalah 00:00. Namun, jika kita ingin memulai jam dari waktu yang berbeda, kita bisa atur menggunakan konstruktor kedua. Cara seperti ini bernama overloading, dan dapat dilakukan baik pada konstruktor maupun method.

Didalam class ClockDisplay digunakan dua cara method calls. Yang pertama adalah internal method calls, kemudian external method calls. Internal method calls adalah sebuah cara pemanggilan method dimana letak method berada di class yang sama. Sedangkan untuk eksternal letak method yang ingin dipanggil berada di class yang berbeda.

Method timeTick berfungsi untuuk menambah value dalam jam, dengan memanggil method increment dari class NumberDisplay. Ini adalah salah satu contoh dari external method calls. Method timeTick juga memiliki pernyataan if untuk memeriksa apakah nilai jam juga harus ditambah atau tidak. Didalam fungsi if, juga dipanggil method lain dari class lain : getValue. Method ini mengembalikan nilai minutes. Jika nilainya nol, berarti itu waktunya untuk nilai hour ditambah.

Untuk output jam, saya menggunakan kode yang saya temukan di internet. Kode ini menampilkan jam dalam bentuk GUI yang sudah jadi. Didalam GUI ini waktu tick akan dipercepat menjadi 3 menit per detik, untuk mempercepat jalannya waktu, dan mempermudah testing program.

Class Clock:

Berikut adalah contoh output program:

Monday, March 6, 2017

PBO - Komposisi, Enumerasi, dan Static Field


Sebuah kelas dapat memiliki beberapa reference ke class lain sebagai anggota class nya. Ini dapat disebut sebagai komposisi dan dapat disebut memiliki hubungan has-a relationship. Contohnya adalah, misal ada sebuah objek jam alarm. Jam alarm harus mengetahui waktu saat itu dan waktu dimana ia harus membunyikan alarmnya. Jadi didalam object JamAlarm akan ada dua reference ke objek Waktu, dimana yang satu adalah waktu saat itu, dan yang satu lagi waktu dimana alarm akan berbunyi.

Contoh komposisi dibawah ini memiliki 3 class, Date, Employee, dan EmployeeTest.

Class Date mendeklarasikan variabel month, day, dan year untuk merepresentasikan sebuah tanggal. Konstruktor mendapatkan 3 parameter int. Method checkMonth digunakan untuk memvalidasi bulan. Jika bulan lebih dari 12, yang berarti out of range, method akan mengeluarkan exception. checkDay berfungsi hampir sama dengan checkMonth, namun ia memeriksa validasi dari tanggal, berdasarkan bulan dan tahun didalam tanggal tersebut. Namun, jika semisal tanggal tidak valid, akan diperiksa terlebih dahulu apakah bulan yang dimasukkan adalah Februari atau tahun itu adalah kabisat, namun jika masih salah akan dikeluarkan exception.

Class Employee memiliki instance variable firstName, lastName, birthDate dan hireDate. birthDate dan hireDate adalah referensi ke object Date. Dengan menggunakan Date sebagai parameter birthDate dan hireDate dapat menjadi instance variable yang mereferensi objek dari class lain. Constructor Employee mengambil 4 parameter - first, last, dateOfBirth dan dateOfHire. Saat method toString dipanggil, ia akan return sebuah String yang berisi nama pegawai dan representasi String dari kedua objek Date. Setiap String ini didapatkan dengan panggilan implisit dari method toString menuju class Date.

Class EmployeeTest membuat dua objek Date untuk mewakili tanggal ulang tahun dan tanggal diterimanya pegawai itu. Kemudian instance variable Employee dibuat dengan passing constructor dua objek String dan dua objek Date. Seteah itu method toString milik class Employee dipanggil secara implisit untuk output.

Berikut adalah kode ketiga class:

Class Date:


Class Employee:


Class EmployeeTest:


Berikut adalah hasil output:



Enumerations

Didalam program ini, akan dibahas tentang hubungan antara enum dan class. Enum dideklarasikan dengan enum declaration, yang berisi konstanta enum yang diurutkan dengan koma. Deklarasi ini bisa berisi komponen lain dari class, seperti constructor, field atau method. Didalam program ini akan ada dua class, yaitu Book dan EnumTest.

Didalam class book ditunjukkan bagaimana cara mendeklarasika instance variable, constructor, dan method didalam enum. Deklarasi enum berisi dua bagian, bagian konstanta enum dan bagian enum lainnya. Masing-masing bagian dapat diikuti argumen yang berlanjut ke enum constructor.
Berikut adalah contoh kedua class:

Class Book:


Class EnumTest:


Berikut adalah output dari program:
 


Static Class Members

Setiap objek pasti memiliki instance variable yang sama di tiap class. Namun dalam beberapa kasus, hanya ada satu variable tertentu yang harus dibagikan oleh semua objek didalam class. Dalam kasus seperti demikian, static field digunakan. Variabel static menunjukkan classwide information - semua objek didalam class menggunakan data yang sama. Deklarasi variabel static dimulai dengan keyword static.

Didalam program dibawah ini akan dideklarasikan dua buah class - Employee dan EmployeeTest. Class Employee mendeklarasikan variabel count static dan method static getCount. Variabel count static dinisialisasi dari 0. Jika variabel static tidak diinisialisasi, compiler akan menggunakan nilai default - dalam kasus ini 0, sebagai nilai default untuk tipe int. Variabel count menghitung jumlah objek yang class Employee telah buat.

Berikut adalah contoh kedua class:

Class  Employee:


Class EmployeeTest:

Contoh output: