Living life and Make it Better

life, learn, contribute

Endy Muhardin

Software Developer berdomisili di Jabodetabek, berkutat di lingkungan open source, terutama Java dan Linux.

Instalasi Redmine di Tomcat

Ada berbagai cara instalasi Redmine, diantaranya:

  • Dijalankan langsung dari command prompt dengan Webrick

  • Dijalankan menggunakan Mongrel dan FastCGI

  • Dijalankan menggunakan Ruby Enterprise Edition dan Passenger

  • Dibuat menjadi war dan dideploy ke application server Java seperti Tomcat, Glassfish, dsb

Pada artikel ini, kita akan mencoba cara terakhir, yaitu menggunakan Tomcat untuk menghosting Redmine. Ini saya lakukan supaya semua tools manajemen proyek ArtiVisi bisa disatukan di satu Tomcat, sehingga memudahkan kegiatan maintenance. Sebelum Redmine, Tomcat ArtiVisi juga menghosting :

Dan nantinya, kalau sudah ada waktu dan kesempatan, juga akan menghosting Gerrit

Mari kita mulai.

Instalasi JRuby

Pertama, kita Download JRuby. Setelah itu, extract di folder yang diinginkan (contohnya /opt)

cd /opt
tar xzf ~/Downloads/jruby-bin-1.6.3.tar.gz
chown -R endy.endy /opt/jruby-1.6.3
ln -s jruby-1.6.3 jruby

Daftarkan jruby ke variabel PATH, supaya bisa diakses langsung dari command line. Tulis baris berikut ini di dalam file ~/.bashrc

export JRUBY_HOME=/opt/jruby
export PATH=$PATH:$JRUBY_HOME/bin

Terakhir, test instalasi JRuby

jruby -v
jruby 1.6.3 (ruby-1.8.7-p330) (2011-07-07 965162f) (Java HotSpot(TM) Client VM 1.6.0_26) [linux-i386-java]

Instalasi Paket Gem

Redmine membutuhkan beberapa library Ruby yang dipaket dalam format gem, yaitu :

  • rack versi 1.1.1 : ini adalah library untuk web server

  • rails versi 2.3.11 (dibutuhkan karena kita akan menginstal Redmine dari Subversion, bukan dari distribusi)

  • jruby-openssl : supaya bisa melayani https

  • activerecord-jdbcmysql-adapter : library untuk koneksi database

  • warbler : packager supaya Redmine bisa dibuat jadi war dan dideploy ke Tomcat

Mari kita install

gem install rack -v=1.1.1
gem install rails -v=2.3.11
gem install jruby-openssl activerecord-jdbcmysql-adapter warbler

Semua paket sudah lengkap, mari kita lanjutkan ke langkah berikut.

Mengambil Redmine dari Subversion Repository

Sebetulnya ada dua pilihan untuk mendapatkan Redmine, download versi rilis atau checkout langsung dari Subversion. Saya lebih suka checkout langsung supaya nanti lebih gampang upgrade manakala rilis baru sudah terbit.

cd ~/Downloads
svn co http://redmine.rubyforge.org/svn/branches/1.2-stable redmine-1.2

Tunggu sejenak sampai proses checkout selesai. Setelah selesai, kita bisa langsung ke langkah selanjutnya.

Konfigurasi Database

Masuk ke folder Redmine, lalu copy file config/database.yml.example ke database.yml, kemudian edit. Saya menggunakan konfigurasi development sebagai berikut :

development:
  adapter: jdbcmysql
  database: redmine
  host: localhost
  username: redmine
  password: redmine
  encoding: utf8

Tentunya kita harus sediakan database dengan konfigurasi tersebut di MySQL. Login ke MySQL, kemudian buatlah database dan usernya.

mysql -u root -p

create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'redmine';
grant all privileges on redmine.* to 'redmine'@'localhost';

Setelah databasenya selesai dibuat, selanjutnya kita akan melakukan inisialisasi.

Inisialisasi Redmine

Pertama, kita inisialisasi dulu session store. Ini digunakan untuk menyimpan cookie dan session variabel.

cd ~/Downloads/redmine-1.2
rake generate_session_store

Setelah itu, inisialisasi skema database.

RAILS_ENV=development rake db:migrate

Isi data awal.

RAILS_ENV=development rake redmine:load_default_data

Setelah terisi, selanjutnya kita bisa test jalankan Redmine.

jruby script/server webrick -e development

Hasilnya bisa kita browse di http://localhost:3000 Kemudian kita bisa login dengan username admin dan password admin.

Konfigurasi Email

Issue tracker yang baik harus bisa mengirim email, supaya dia bisa memberikan notifikasi pada saat ada issue baru ataupun perubahan terhadap issue yang ada. Redmine versi 1.2 membutuhkan file konfigurasi yang bernama configuration.yml, berada di folder config. Berikut isi file configuration.yml untuk mengirim email ke Gmail.

# = Outgoing email settings
development:
    email_delivery:
        delivery_method: :smtp
        smtp_settings:
            tls: true
            address: "smtp.gmail.com"
            port: 587
            authentication: :plain
            user_name: "nama.kita@gmail.com"
            password: "passwordgmailkita"

Selain itu, kita juga harus menginstal plugin action_mailer_optional_tls, seperti dijelaskan di sini.

jruby script/plugin install
git://github.com/collectiveidea/action_mailer_optional_tls.git

Coba restart Redmine, sesuaikan alamat email kita dengan cara klik link My Account di pojok kanan atas. Di dalamnya ada informasi tentang email. Ganti dengan alamat email kita. Kemudian pergi ke menu Administration > Settings > Email Notifications, kemudian klik link Send a test email di pojok kanan bawah. Tidak lama kemudian, seharusnya test email dari Redmine sudah masuk di mailbox kita.

Dengan demikian, Redmine sudah berhasil kita instal dan konfigurasi dengan baik. Selanjutnya, kita akan paketkan supaya bisa dideploy di Tomcat.

Generate WAR

Pertama, kita harus inisialisasi dulu konfigurasi warble.

warble config

Dia akan menghasilkan file config/warble.rb. Mari kita edit sehingga menjadi seperti ini.

Warbler::Config.new do |config|
  config.dirs = %w(app config lib log vendor tmp extra files lang)
  config.gems += ["activerecord-jdbcmysql-adapter", "jruby-openssl", "i18n", "rack"]
  config.webxml.rails.env = ENV['RAILS_ENV'] || 'development'
end

Selanjutnya, kita tinggal menjalankan perintah warble untuk menghasilkan file war.

warble
warning: application directory `lang' does not exist or is not a directory; skipping
rm -f redmine-1.2.war
Creating redmine-1.2.war

File war yang dihasilkan tinggal kita deploy ke Tomcat

cp redmine-1.2.war /opt/apache-tomcat-7.0.12/webapps/redmine.war

Jalankan Tomcat, dan Redmine bisa diakses di http://localhost:8080/redmine


Instalasi Spket IDE

Beberapa minggu terakhir ini, saya mencari-cari cara terbaik untuk melakukan development dengan ExtJS. Tentunya fitur utama yang kita inginkan adalah autocomplete, sehingga tidak perlu bolak-balik membaca dokumentasi di websitenya.

Setelah berhari-hari mencari, akhirnya saya menemukan Spket IDE. Di websitenya dinyatakan bahwa Spket sudah mendukung ExtJS versi 4, membuat saya tertarik untuk mencobanya. Sayangnya, petunjuk instalasi sulit didapat, sehingga harus trial-and-error.

Di artikel ini, kita akan membahas petunjuk instalasi Spket IDE di Eclipse Indigo.

Klik menu Install New Software

Masukkan Update Site Spket IDE

Tambahkan Update Site yang baru

Update sitenya adalah http://www.spket.com/update/

Opsi Instalasi Spket

Klik Next

Ada warning, klik saja Yes.

Download Support ExtJS 4

Agar bisa mengenali ExtJS 4, kita harus mengunduh update terbaru dari forumnya. Entah apa alasannya, tiap ada update baru, versi jarnya tidak dinaikkan dan update sitenya tidak diperbarui. Ini menyebabkan kita harus mengunduh file dari forum.

Ada dua file yang harus diunduh, yaitu jar

dan jsb  Hasilnya, kita akan memiliki dua file.

Patch Eclipse

File jar akan kita pasang di folder plugins di tempat Eclipse terinstal.

Ini akan menimpa file dengan nama sama.

Patch ExtJS

Sedangkan file jsb akan kita pasang di folder ExtJS 4.

Edit jsb

Sayangnya, file jsb ini juga masih ada bugnya. Dia salah menyebutkan nama file dalam folder pkgs. Kita harus edit, ganti all.js menjadi classes.js.

Konfigurasi Spket

Selanjutnya, kita masuk ke menu preferences untuk melakukan konfigurasi.  Masuk ke menu Spket - Javascript Profile  Tambah Profile baru, beri nama ExtJS  Di profile yang baru saja ditambahkan, Add Library dan pilih ExtJS  Setelah itu, Add File jsb yang sudah kita edit tadi.  Lalu, set profile ExtJS menjadi default  Kemudian, pergi ke menu General - Editors - File Associations. Pilih file js, dan jadikan Spket sebagai editornya.  Klik Ok, restart Eclipse.

Code Completion

Sekarang kita bisa melakukan code completion pada saat memberi titik di depan object.  Atau juga pada saat mengetik di dalam tanda kurung.

Demikianlah cara instalasi Spket IDE di Eclipse.


Membuat Screencast

Jaman sekarang sudah semakin maju. Fakir bandwidth semakin sedikit. Oleh karena itu, media komunikasi juga berubah, yang tadinya berbasis teks (hemat bandwidth) menjadi multimedia (rakus bandwidth).

Demi mengikuti perkembangan jaman, saya mengeksplorasi pembuatan tutorial dalam bentuk screencast. Ternyata hasilnya memuaskan. Dengan beberapa menit merekam screencast, informasi yang disampaikan sama dengan beberapa jam mengetik blog entry.

Artikel ini saya tulis untuk mendokumentasikan langkah-langkah membuat screencast, mulai dari merekam screencast, sampai mempublikasikannya di blog.

Merekam video

Di Ubuntu ada dua aplikasi yang saya coba, yaitu Xvidcap dan Record My Desktop. Dua-duanya sama fungsinya dan tidak ada perbedaan yang signifikan. Setelah mencoba keduanya, pendapat saya adalah Record My Desktop lebih mudah digunakan. Jadi, inilah aplikasi yang saya pilih.

Perlu diperhatikan kemampuan prosesor komputer Anda. Ini kaitannya dengan setting frame per second (fps). Bila fps melebihi kemampuan prosesor, video yang kita rekam akan terlihat lebih cepat dari sebenarnya. Di laptop saya, setting 15 fps akan menghasilkan video yang kira-kira 2x lebih cepat. Setelah trial and error, saya temukan bahwa 9 fps adalah setting yang tepat.

Perbedaan yang utama di antara kedua aplikasi ini adalah format outputnya. Record My Desktop mengeluarkan format ogv sedangkan Xvidcap mengeluarkan format mpeg. Perbedaan format ini nantinya akan mempengaruhi langkah pemrosesan selanjutnya.

Merekam suara

Biasanya, saya merekam suara dalam proses yang terpisah, supaya tidak banyak ehm dan eee. Rekaman dibuat sambil menonton screencast yang sudah kita rekam. Setelah rekaman suara dibuat, bisa diedit dengan menggunakan aplikasi Audacity untuk menghilangkan noise, memotong bagian yang tidak penting, dan sebagainya.

Menggabungkan video dan audio

Selanjutnya, kita menggunakan aplikasi Avidemux untuk menggabungkan file audio dan file video menjadi satu file. Dengan aplikasi ini kita juga bisa mengedit video untuk menghilangkan bagian-bagian yang tidak perlu ataupun menyambung beberapa video menjadi satu.

Mempersiapkan format video untuk web

Ada berbagai format video yang tersedia. Masing-masing format memiliki dukungan browser yang berbeda-beda. Daftar lengkapnya bisa dilihat di sini

Pada intinya, supaya bisa dilihat di berbagai browser, kita harus menyediakan file dengan format ogv, mp4, dan webm. Kita juga harus menyertakan poster dalam format jpg atau png supaya bisa ditampilkan dengan benar di browser.

Ada beberapa script yang bisa digunakan, misalnya ini atau ini

Atau, kita juga bisa menjalankan commandnya satu persatu di command line. Berikut adalah command yang saya jalankan :

Konversi dari ogv menjadi mp4

ffmpeg -vcodec libx264 -vpre lossless_medium -i file-input.ogv file-output.mp4

Konversi dari ogv menjadi webm

ffmpeg -pass 1 -passlogfile file-input.ogv -threads 16  -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i file-input.ogv -vcodec libvpx -b 614400 -s 640x480 -aspect 4:3 -an -y tmp.webm

rm tmp.webm

ffmpeg -pass 2 -passlogfile file-input.ogv -threads 16  -keyint_min 0 -g 250 -skip_threshold 0 -qmin 1 -qmax 51 -i file-input.ogv -vcodec libvpx -b 614400 -s 640x480 -aspect 4:3 -an -y file-output.webm

Command di atas mungkin berbeda bila file asli kita formatnya adalah mpeg seperti yang dihasilkan oleh XVidcap.

Membuat poster

ffmpeg -r 1 -t 1 -vframes 1 -i input-file.mp4  output-file.png

Upload

Setelah semua file(ogv,mp4,png) terkumpul di satu folder, kita upload menggunakan rsync

rsync -avz /path/to/video/folder user@example.com:/home/user/public_html/videos

Tampilkan di blog

Terakhir, kita ingin menayangkan video tersebut di blog kita. Karena saya menggunakan wordpress, saya pasang plugin External Video for Everybody. Plugin ini menampilkan video player di browser kita, supaya orang lain bisa langsung klik tombol play. Di belakang layar, plugin ini mendeteksi apakah browser kita mendukung HTML 5 atau tidak. Kalau iya, maka video akan ditampilkan dengan tag khusus <video>. Bila tidak, maka flash player akan digunakan. Flash player ini tidak disediakan oleh plugin ini. Kita perlu memilih dan mendownload sendiri dari sekian banyak flash player yang tersedia, contohnya JW Player

Sebagai penutup, bisa melihat tutorial ini yang saya gunakan sebagai titik awal eksplorasi saya.


Tutorial ExtJS

Hari Senin kemarin, ArtiVisi mengadakan internal training mengenai ExtJS yang diikuti oleh programmer ArtiVisi dan sister company. Berikut adalah materi trainingnya.

Cara setup project ExtJS

TODO : fix video

Memahami Layout

TODO : fix video

Membuat Menubar

TODO : fix video

Membuat User Management Screen

TODO : fix video

Membuat Toolbar CRUD

TODO : fix video

Masih ada beberapa materi lanjutan yang belum sempat disampaikan, yaitu:

  • Enable/Disable Form

  • Save isi form ke server

  • Query data dari server, tampilkan ke grid

Kode program yang digunakan pada training ini dapat diikuti di Github page saya


Estimasi Proyek Software

Saya ingin membuat aplikasi akunting, berapa lama dan berapa biayanya?

Demikian pertanyaan yang amat sering kita temui di profesi software developer.

Topik estimasi proyek merupakan topik yang sulit. Steve McConnell menyebutnya Black Art, sehingga dia mengarang buku yang sangat bagus tentang topik ini, judulnya Software Estimation, Demystifying the Black Art.

Menurut Steve, dalam membuat estimasi, ada 3 metode yang dilakukan, yaitu

  • count

  • compute

  • judge

Kita harus selalu berusaha count, karena ini yang paling akurat. Kalo ditanya berapa tinggi pohon, paling baik adalah ambil meteran dan ukur pohonnya. Dimana kita tidak bisa count, maka kita compute. Contohnya, di sebelah pohon ada pagar dan di atas pagar ada tiang lampu. Kita compute jumlah tinggi pagar dan tinggi tiang lampu, sehingga dapat tinggi pohon. Hanya kalau tidak ada cara lain, baru kita judge. Dikira2 tingginya berapa.

Dalam kaitannya dalam estimasi, idealnya yang kita estimasi hanyalah project size. Metric lainnya akan kita compute dari project size ini.

Apa itu project size?

Project size merupakan ukuran suatu project. Dengan project size, kita bisa membandingkan dua aplikasi yang berbeda, misalnya aplikasi akunting dan aplikasi toko online.

Ada banyak metric untuk mengukur ukuran project. Metric yang paling lazim digunakan adalah jumlah baris kode program, dalam bahasa Inggris disebut Source Lines of Code (SLOC) atau Non Commenting Source Code (NCSS).

Walaupun SLOC sangat akurat dalam menentukan ukuran project, tapi jumlah baris kode sulit diperkirakan di awal project. Oleh karena itu, beberapa orang kreatif lalu mengarang metode baru yang disebut Function Point Calculation. Metode ini pada intinya adalah menghitung berapa screen input, screen output, jumlah tabel database, dan interaksinya dengan aplikasi lain.

Setelah kita mendapatkan estimasi ukuran project, kita akan menggunakannya untuk mengestimasi effort, durasi, dan cost.

Sebelum lebih jauh, mari kita jelaskan istilah-istilahnya.

Effort, adalah kerja real yang kita lakukan dalam menyelesaikan project. Satuannya adalah mandays atau manhour. Misalnya suatu aplikasi diestimasi membutuhkan effort 10 mandays. Artinya aplikasi ini akan selesai bila dikerjakan 1 orang selama 10 hari terus menerus. Atau 5 hari bila ada 2 pekerja. Effort tidak mempertimbangkan libur ataupun cuti.

Durasi (bahasa Inggrisnya schedule), adalah jangka waktu penyelesaian project. Ini biasanya dinyatakan dalam satuan hari kerja atau hari kalender. Bila durasi project dinyatakan 10 hari kalender, maka bila dimulai tanggal 1, akan selesai tanggal 10.

Jadi, untuk mendapatkan durasi, kita harus punya asumsi berikut :

  • berapa orang yang dipekerjakan

  • berapa hari libur

  • berapa alokasi waktu non-pekerjaan seperti meeting, presentasi, dsb

Asumsi tersebut, digabungkan dengan estimasi effort, akan menghasilkan estimasi durasi.

Setelah durasi didapatkan, menghitung estimasi cost mudah saja. Kita membutuhkan matriks gaji per role. Berapa gaji project manager, gaji programmer, dan role lain dalam setahun, termasuk THR, tunjangan kesehatan, benefit lain dan bonus. Bagilah dengan hari kerja setahun sehingga didapatkan nilai gaji sehari. Kemudian petakan penggunaan masing-masing role dalam schedule yang sudah kita estimasi, dan kita akan mendapat biaya personel. Tambahkan dengan biaya lain-lain seperti transport, komunikasi, dsb untuk mendapatkan biaya total. Masukkan juga faktor resiko project, misalnya kalau clientnya terkenal sulit ditagih, tentu perlu ada koefisien pengali. Karena tagihan macet sama dengan kita memberi hutang ke client.

Nah, akhirnya biaya total sudah didapatkan, silahkan tambahkan profit yang diinginkan, buffer negosiasi, dan voila, dapatlah harga penawaran.

Selesai? Belum dong :D

Pembaca yang teliti tentu akan menemukan satu celah di penjelasan di atas. Bagaimana mengkonversi estimasi project size menjadi estimasi effort? Nah disinilah bedanya perusahaan besar kaya pengalaman dengan startup mahasiswa baru lulus. Perusahaan dengan jam terbang tinggi biasanya punya data historis. Dia punya data misalnya berapa mandays yang dibutuhkan programmer untuk membuat aplikasi dengan 3 tabel database. Tentunya data ini harus dikumpulkan, diolah, dan diupdate agar bisa dijadikan pedoman. Ini sebabnya tidak semua perusahaan besar punya data ini. Dengan bermodalkan data ini, perusahaan tinggal mengkonversi project size menjadi effort. Setidaknya ada dua jenis data yang kita butuhkan, yaitu berapa effort yang dibutuhkan untuk menyelesaikan satu baris kode, dan bagaimana distribusi effort selama fase project. Maksudnya, bila project kita diestimasi 100 mandays, berapa mandays habis di analisa, coding, testing, implementasi, dan maintenance. Selain itu, juga perlu ada matriks distribusi effort per role. Dengan adanya matriks ini, kita akan lebih mudah menkonversi effort menjadi durasi dan cost.

Startup mahasiswa, karena tidak punya data, maka cuma bisa tebak-tebak buah manggis. Atau kalo mau sedikit ilmiah, bisa mengikuti cara kami di ArtiVisi waktu baru mulai dulu. Kita membuat aplikasi kecil, kemudian datanya dikumpulkan dan dijadikan pedoman.

Jadi, kesimpulannya, begini metode estimasinya.

Kebutuhan Data

  1. Tabel konversi size ke mandays

  2. Tabel gaji pegawai per role per hari

  3. Tabel distribusi effort per fase

  4. Tabel distribusi effort per role

Flow Estimasi

  1. Estimasi Size

  2. Dari size, gunakan tabel #1 untuk mendapatkan effort

  3. Dari effort, gunakan tabel #3 untuk mendapatkan durasi

  4. Dari effort, gunakan tabel #4 untuk mendapatkan effort per personel

  5. Dari effort per personel, gunakan tabel #2 untuk menghitung biaya personel

  6. Gunakan durasi untuk menghitung biaya lain-lain

Demikian metodologi untuk melakukan estimasi project software. Membuat estimasi saja tidak cukup, kita juga harus bisa mempresentasikan dan mempertahankannya dari negosiasi pihak lain. Ini akan dibahas di lain kesempatan.