Arsip Kategori: komputer

Cappucinno Framework, Aplikasi Web dengan rasa Desktop

Selamat datang hari senin 🙂

Beberapa pekan lalu ada tugas untuk matakuliah DataMining, dan pemrogramannya tidak boleh menggunakan PHP. Hmm, padahal saya sudah cukup terbiasa dengan itu. Solusinya mungkin Java, Web Java, atau apapun lah… Kemudian saya riset, menemukan SproutCore dan Cappucinno, lalu penelitian dimulai.

Cappucinno Web Framework, itu sebutannya. Mengusung bahasa yang baru dan aneh buat saya, turunan dari Javascript, Objective-J. Sintaksnya mirip-mirip dengan Objective-C, dengan maksud bukan untuk meniru Objective-C, tapi untuk menambah Abstraction Layer pada Javascript dan programmernya. Karena turunan dari Javascript, jadi Objective-J bisa menjalankan script Javascript apapun, tapi agar lebih fleksibel (tidak bertabrakan dengan reserved words milik Javascript), maka sintaksnya dirombak total jadi mirip Objective-C. Sayangnya saya bukan programmer asal MacOS, saya bermula dengan Windows, dan sekarang saya di Linux~rasa Ubuntu. Jadi perlu extra efforts untuk mempelajari bahasa asing ini…

Hasil Riset

Naah, dari beberapa pekan itu, kurang lebih 2 pekan saya sudah mulai menyesuaikan diri dengan Objective-J. Ini beberapa hal yang saya dapat.

Dibandingkan dengan sproutcore, yang harus menggunakan Ruby gem untuk menginstallnya, Cappucinno terhitung lebih praktis, tinggal download di halaman utama, 5.3mb versi 0.8.1.

Disitu disertakan API Documentation, NewApplication, yang aplikasi Hello World yang siap diotak-atik, juga bootstrap.sh yang dapat dijalankan di shell untuk menginstall cappucinno tools (perlengkapan bagi para programmer yang serius :D)

Struktur Cappucinno Starter

Tapi jangan khawatir, tanpa cappucinno tools-pun ini sudah dapat dijalankan, langsung lewat web-browser. Silahkan gunakan Firefox untuk ke direktori file (Tempat Cappucinno Starter)/NewApplication/index.php, atau dengan praktis drag file tersebut, dan drop di Firefox.

Aplikasi HelloWorld bawaan, NewApplication

tanpa disentuh-pun aplikasi ini sudah jalan.

Catatan: Untuk Google Chrome, aplikasi tidak akan berjalan dengan baik tanpa disimpan di web server, hal ini dikarenakan Chrome hanya mau menerima XmlHttpRequest dari web saja, tidak dari file.

Editor

Untuk kemudian mengubah alur program, di direktori yang sama terdapat file AppController.j, file ini yang dapat kita edit, menggunakan TextMate di Mac, Notepad++ di Windows, atau dengan rasa Linux, saya gunakan Gedit. Memang Gedit tidak begitu bagus untuk Objective-J, tapi tak apa lah (baca:bahasa baru).

Untuk langsung melihat apa yang bisa kita ubah, kita cek isi AppController.j


 

/*
 * AppController.j
 * NewApplication
 *
 * Created by You on April 9, 2010.
 * Copyright 2010, Your Company All rights reserved.
 */

@import

@implementation AppController : CPObject
 {
 }

- (void)applicationDidFinishLaunching:(CPNotification)aNotification
 {
 var theWindow = [[CPWindow alloc] initWithContentRect:CGRectMakeZero() styleMask:CPBorderlessBridgeWindowMask],
 contentView = [theWindow contentView];

var label = [[CPTextField alloc] initWithFrame:CGRectMakeZero()];

[label setStringValue:@"Hello World!"];
 [label setFont:[CPFont boldSystemFontOfSize:24.0]];

[label sizeToFit];

[label setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin];
 [label setCenter:[contentView center]];

[contentView addSubview:label];

[theWindow orderFront:self];

// Uncomment the following line to turn on the standard menu bar.
 //[CPMenu setMenuBarVisible:YES];
 }

@end
 

dan ubah bagian

 ...
 [label setStringValue:@"Hello World!"];
 ...
 

menjadi

 ...
 [label setStringValue:@"Hai Om!"];
 ...
 

Apa yang kemudian tampil?, Ya!, teks berubah menjadi Hai Om!, ini perubahan paling sederhana yang bisa dilakukan, dan lihat hasilnya 😀

Setelah Hello World diubah :)

Kesimpulan

Untuk pengenalan mungkin sekian dulu, pembuatan aplikasinya akan saya kenalkan nanti, setelah beberapa riset kedepan 🙂

Lanjutkan sendiri

untuk melanjutkan sendiri, saya sarankan untuk melihat daftar tutorialnya di

http://cappuccino.org/learn/tutorials/

http://cappuccinocasts.com/

http://www.nice-panorama.com/Programmation/cappuccino/

 

 

Animasi di Dojo Toolkit

Sebenarnya saya sedikit ragu tentang apa dulu yang saya perlihatkan setelah posting pembuka beberapa waktu lalu, tapi akhirnya saya tentukan saja kalau yang akan kita bahas sekarang adalah Animasi menggunakan Dojo Toolkit. Dari animasi paling dasar, hingga ke animasi tingkat menengah.

Langsung Beraksi

Tanpa basa-basi, dengan hanya memanggil dojo.js saja, sebenarnya kita sudah bisa melakukan animasi dasar. Mari kita buktikan

<html>
<head>
    <title>Animasi Dasar menggunakan Dojo Toolkit</title>
    <script type="text/javascript" src="../js/dojo-toolkit/dojo/dojo.js"></script>
</head>
<body>
    <a href="#" id="hilang">hilangkan</a> | <a href="#" id="tampil">tampilkan</a>
    <div id="teks-1">teks yang akan dihilangkan</div>
    <script type="text/javascript">
        // memastikan jika dojo sudah terpanggil
        dojo.addOnLoad(function(){

            // memasang event handler saat link hilangkan diklik
            dojo.connect(dojo.byId('hilang'), 'onclick', function(){
                // hilangkan teks
                dojo.fadeOut({
                    node: 'teks-1',
                    duration: 500
                    }).play();
            });

            // memasang event handler saat link tampilkan diklik
            dojo.connect(dojo.byId('tampil'), 'onclick', function(){
                // tampilkan teks
                dojo.fadeIn({
                    node: 'teks-1',
                    duration: 500
                }).play();
            });

        });
    </script>
</body>
</html>

Dan inilah hasilnya, jika kita meng-klik link hilangkan maka teks dibawah akan fade out, dan sebaliknya jika kita meng-klik link tampilkan, teks dibawah itu akan tampil kembali dengan efek fade in.

Ini gambarnya:

Efek yang Lain

Efek yang lain bisa menggunakan animateProperty, yaitu animasi manipulasi property css. Tidak jauh berbeda dengan contoh pertama, tapi sekarang kita coba dengan ukuran font

<html>
<head>
    <title>Animasi Dasar 2 (animateProperty) menggunakan Dojo Toolkit</title>
    <script type="text/javascript" src="../js/dojo-toolkit/dojo/dojo.js"></script>
</head>
<body>
    <a href="#" id="besar">besarkan</a> | <a href="#" id="kecil">kecilkan</a>
    <div id="teks-1">teks yang akan dimainkan</div>
    <script type="text/javascript">
        // memastikan jika dojo sudah terpanggil
        dojo.addOnLoad(function(){

            // memasang event handler saat link besarkan diklik
            dojo.connect(dojo.byId('besar'), 'onclick', function(){
                // besarkan teks
                dojo.animateProperty({
                    node: 'teks-1',
                    properties:{
                        fontSize: 34
                    }
                    }).play();
            });

            // memasang event handler saat link kecilkan diklik
            dojo.connect(dojo.byId('kecil'), 'onclick', function(){
                // kecilkan teks
                dojo.animateProperty({
                    node: 'teks-1',
                    properties:{
                        fontSize: 16
                    }
                    }).play();
            });

        });
    </script>
</body>
</html>

Ini gambarnya:

Masih Belum Cukup?

Sebenarnya dengan menggunakan animateProperty kita bisa mencoba banyak variasi animasi, tapi jika kita ingin lebih praktis lagi, kita bisa menggunakan fungsi tambahan dari modul dojo.fx (modul untuk easing, wipeIn, wipeOut, slideTo, Toggler, chain, dan combine).

Tapi untuk contoh, kita akan tampilkan animasi wipeOut dan easing dengan chain

<html>
<head>
    <title>Animasi Menengah menggunakan Dojo Toolkit</title>
    <script type="text/javascript" src="../js/dojo-toolkit/dojo/dojo.js"></script>
    <style type="text/css">
        #box-1, #box-2{
            display:block;
            position:relative;
            width:100px;
            height:100px;
            max-height:200px;
            background-color:#d55;
        }
    </style>
</head>
<body>
    <a href="#" id="wipeout">wipeOut</a>
    <div id="box-1"></div>
    <br />
    <div id="box-2"></div>
    <script type="text/javascript">
        // load terlebih dahulu dojo.fx dan easing
        dojo.require('dojo.fx');
        dojo.require('dojo.fx.easing');


        // memastikan jika dojo sudah terpanggil
        dojo.addOnLoad(function(){

            // memasang event handler saat link wipeOut diklik
            dojo.connect(dojo.byId('wipeout'), 'onclick', function(){

                // animasi box-1 disimpan di variabel box1
                var box1 = dojo.fx.wipeOut({
                    node: 'box-1',
                    duration: 500,
                    easing : dojo.fx.easing.quadIn
                });

                // animasi box-1 disimpan di variabel box1
                var box2 = dojo.fx.wipeOut({
                    node: 'box-2',
                    duration: 500,
                    easing : dojo.fx.easing.quadIn
                });

                dojo.fx.chain([box2, box1]).play();

            });

        });
    </script>
</body>
</html>

Ini gambarnya:

Masih Kurang Juga?!

Tapi jika masih kurang memukau, kita bisa menampilkan animasi yang lebih kompleks lagi dengan memanggil modul dari Dojox, yaitu dojox.fx (modul untuk wipeTo, sizeTo, slideBy, crossFade, highlight, fadeTo, dll).

Sebagai contoh, kita coba tampilkan crossFade dan highlight

<html>
<head>
    <title>Animasi Menengah 2 menggunakan Dojo Toolkit</title>
    <script type="text/javascript" src="../js/dojo-toolkit/dojo/dojo.js"></script>
    <style type="text/css">
        #box-1, #box-2{
            display:block;
            position:relative;
            width:100px;
            height:100px;
            max-height:200px;
            background-color:#d55;
        }
    </style>
</head>
<body>
    <a href="#" id="crossfade">crossFade</a>
    <div id="box-1"></div>
    <div id="box-2" style="opacity:0"></div>
    <script type="text/javascript">
        // load terlebih dahulu dojox.fx
        dojo.require('dojox.fx');

        // memastikan jika dojo sudah terpanggil
        dojo.addOnLoad(function(){

            // memasang event handler saat link crossFade diklik
            dojo.connect(dojo.byId('crossfade'), 'onclick', function(){

                // highlight link crossFade
                dojox.fx.highlight({
                    node: this
                }).play();

                // animasi crossFade box-1 dan box-2
                dojox.fx.crossFade({
                    nodes: ['box-1', 'box-2'],
                    duration: 500,
                }).play();


            });

        });
    </script>
</body>
</html>

Ini gambarnya:

Tambahan Eksperimen

Dojox sudah menyediakan modul dojox.fx yang lengkap, tapi jika anda masih ingin tahu lebih dalam lagi, silahkan anda cek di halaman test animasi dojo toolkit, bagian dojox.fx (tersedia juga scroll, Shadow, flip, split, text, dan masih berkembang).

Kemana Lagi Setelah Ini?

Masih banyak yang bisa dibongkar tentang animasi menggunakan Dojo Toolkit ini, semuanya bisa diatur sesuai dengan keperluan kita. Tapi jangan berhenti disini, untuk lebih lanjut saya sarankan untuk ke sumber-sumber berikut:

Menggabungkan Query Menggunakan Union di MySQL

ilustrasi

Prakata

Mungkin kita pernah membuat model tabel yang rumit seperti ini, tabel yang bisa memiliki atribut sama namun sengaja dipisahkan, tapi pada akhirnya kita harus menjalankan 2 query terpisah untuk memanggilnya. Sebut saja kita mempunyai tabel bukutamu dengan atribut (id, alamat_ip, nama, judul, pesan, tanggal), namun pada masa penggunaan ternyata banyak yang mengirimkan pesan spam yang tidak kita inginkan, dan solusi yang terpikir pada saat itu adalah membuat tabel spam (dengan atribut yang sama dengan tabel, tapi kita menyortir terlebih dahulu dengan filter anti-spam yang kita buat, atau mungkin menggunakan Akismet), dengan maksud agar si spam bisa ditinggalkan saat backup, dan tabel bukutamu dalam keadaan bebas spam.

Di sistem pengelolaan (backend), kita bisa melakukan query masing-masing terhadap kedua tabel untuk ditampilkan terpisah, tapi melihat dua halaman terpisah untuk maksud yang sama (dalam hal ini membedakan yang mana buku tamu dengan spam) bukanlah solusi yang bagus.

Dibuat tabel pengelolaan terpisah
kedua tabel dibuat terpisah dengan pengelolaan terpisah

Solusi

Dalam kasus seperti ini bisa dilakukan tiga solusi;

  1. Gabungkan kedua tabel secara fisik menjadi satu dan ditambah atribut (…, is_spam) sehingga nantinya query akan dibatasi dengan ‘ WHERE is_spam = 0‘ (dimana kita memilih hanya bukan spam)
  2. Gabungkan kedua tabel dalam query menggunakan UNION sehingga yang kita lakukan hanya sekali query saja
  3. Lakukan dua query untuk mengambil data dari kedua tabel dan menggabungkannya nanti di pemrograman.

Tapi sesuai judul, kita akan menggunakan pilihan nomor 2 saja.

UNION Beraksi

Jadi, setelah kita sepakat dengan memilih solusi nomor dua diatas, maka tinggal kita selesaikan dengan sihir UNION saja.
Meskipun sudah dibahas sedikit, tapi sebelum lebih jauh biar saya jelaskan tambahan mengenai UNION.
Pada dasarnya, union adalah fungsi untuk menggabungkan dua atau lebih query SELECT dalam satu hasil keluaran saja. Dengan catatan kedua query SELECT tersebut harus memiliki jumlah field yang sama.
Langsung kita coba, struktur tabel bukutamu dan spam yang saya gunakan adalah sebagai berikut

CREATE TABLE bukutamu
(
    id INT PRIMARY KEY AUTO_INCREMENT,
    alamat_ip VARCHAR(16),
    nama VARCHAR(50),
    judul VARCHAR(50),
    pesan VARCHAR(250),
    tanggal TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL
)

Begitu pula dengan tabel spam, tidak ada yang dirubah selain nama tabelnya.
Untuk itu, dengan query ini…

(SELECT id, nama, judul, pesan, tanggal, '0' as is_spam FROM bukutamu)
UNION
(SELECT id, nama, judul, pesan, tanggal, '1' as is_spam FROM spam)
ORDER BY tanggal DESC;

kedua SELECT akhirnya akan bersatu dan menambahkan satu field is_spam yang bernilai 0 jika datang dari tabel bukutamu, dan bernilai 1 jika datang dari tabel spam.
Sifat normalnya UNION adalah selalu DISTINCT, jadi jika ditemukan record yang sama tidak akan ditampilkan kedua-kalinya.

pengelolaan terpusat pada satu tabel
Pengelolaan Bukutamu dan Spam disatukan

Kesimpulan

Jadi UNION berguna untuk menggabungkan beberapa query SELECT untuk menghasilkan satu keluaran saja.
Batasan/aturan yang dapat kita simpulkan diantaranya…

  • Query yang disatukan harus menghasilkan jumlah field yang sama.
  • Nilai record yang sama dalam UNION akan disatukan, dan tidak akan tampil dua kali (sama ketika kita menggunakan DISTINCT)
  • Statement ORDER menggunakan alias pada setiap SELECT, bukan nama field sebenarnya.
  • Statement ORDER (tanpa LIMIT pada salah-satu SELECT) harus disimpan di akhir, karena jika disimpan didalam salah-satu SELECT tidak akan berpengaruh.
  • Jika menggunakan statement LIMIT (dan atau ORDER), harus ditentukan didalam salah-satu SELECT atau LIMIT total.

Untuk batasan standar penggunaan saya rasa ini cukup memenuhi, namun jika anda merasa ini masih kurang, saya pastikan informasi lebih lengkap terdapat di MySQL Manual : Union Syntax.

Kemana Lagi Setelah Ini

MySQL Manual : Union Syntax

Sekilas Mengenai Dojo Toolkit

Dojo Toolkit Logo
Dijit Theme Tester

Penggugah Selera

Siapa yang sekarang tidak tahu bahwa perkembangan web sangatlah pesat, juga bagian-bagiannya, CSS sudah sampai ke CSS3, HTML sudah HTML5, juga Javascript masing-masing dikembangan sesuai dengan kebutuhan manusia, yang ringan namun esensi, seperti membaca koran, ensiklopedi, bahkan sampai kehidupan sosial kini bisa dilakukan lewat Internet.

Semuanya dapat dilakukan dengan teknologi web 2.0, yang diantaranya Javascript untuk meningkatkan Pengalaman / Kesan Penggunaan (UX ~ User eXperience)

Javascript memang sudah lama berkembang, setelah dianggap anak tiri dalam dunia pemrograman sebelum tahun 2000, akhirnya penggunaan Javascript kembali dilirik setelah Google mempopulerkan AJAX (Asynchronous Javascript and XML) di fitur Google Suggest-nya.

Awal dari Dojo Toolkit

Beberapa tahun setelah kebangkitan Javascript, 25 April 2004, ditulislah kode yang kemudian menjadi cikal bakal Dojo Toolkit, sebuah Javascript Framework yang menyediakan penyederhanaan fungsi scripting dengan javascript sampai ke pembuatan RIA (Rich Internet Application) yang kompleks.

Lisensi dari Dojo Toolkit yang memungkinkan agar komunitas dapat berkontribusi dan dimasukkan kedalam versi resmi menyebabkan Dojo Toolkit menjadi kesatuan yang utuh, yang bisa dikatakan unggul pada bidangnya.

Paket modular sangat membantu para web developer untuk membuat web yang interaktif dengan struktur yang mudah dimengerti. Ditambah lagi sebuah kesatuan antara Javascript library, dengan Widgeting system memperkokoh posisi Dojo Toolkit sebagai Javascript Framework sebenarnya.

Penyederhanaan Javascript

Selain Dojo Toolkit, mungkin kita pernah mendengar ataupun bahkan mencoba jQuery, mootools, prototype, scriptaculous, ExtJS (sekarang Sencha), YUI, dll. Yang kesemuanya adalah mengenai javascript. Tapi masing-masing memiliki kelebihan dan kekurangan dalam satu sisi dan lainnya.

Pada penggunaan praktis dan cepat jQuery terhitung paling populer, namun yang disediakan oleh jQuery ini terbatas pada fungsi DOM, Ajax, animasi, dan fungsi dasar lainnya, untuk widget harus menggunakan jQuery UI, sedangkan fungsi lainnya terdapat banyak plugin yang tersebar di penjuru internet.

Mootools, prototype, scriptaculous, berperan kurang lebih sama dengan jQuery, menyediakan fungsi dasar DOM, Ajax, animasi dan beberapa fungsi dasar lain, dan bisa diberikan fungsi lain dengan menyisipkan plugin yang tersebar di internet.

ExtJS (Sencha) dan YUI bisa dikatakan lebih mirip dengan Dojo Toolkit, menyediakan fungsi-fungsi dasar, juga menyediakan widgeting system.

Dojo Toolkit di Dunia Nyata

Didukung penuh oleh SitePoint dalam pengembangannya, juga disisipkan dalam Zend Framework sebagai library javascript, berarti kemampuannya sudah tidak bisa dianggap remeh lagi. Digunakan juga oleh IBM, AOL untuk bagian dari infrastuktur mereka.

Dilihat dari jumlah pengguna yang banyak dari perusahaan menengah keatas, maka Dojo Toolkit cocok bila dikatakan sebagai Ajax Framework untuk enterprise.

Dojo Toolkit untuk Mobile

Dengan terus berkembangnya teknologi web ini, juga tren yang mulai mengarah ke mobile device, Dojo Toolkit semenjak versi 1.5 menyertakan dojox.mobile agar pengguna mobile device merasa betah dan nyaman dalam menggunakan aplikasi yang dibangun dengan Dojo Toolkit. Meskipun dojox.mobile baru lahir, tapi dengan kekuatan komunitas, dan konsistensi paket bundel, Dojo Toolkit tidak bisa dianggap remeh.

Mari Mulai

Memanggil Dojo Toolkit bisa dikatakan sangatlah mudah untuk komputer yang terkoneksi ke internet, cukup dengan satu baris kode saja di file HTML.

<script src="http://ajax.googleapis.com/ajax/libs/dojo/1.5/dojo/dojo.xd.js"></script>

Dengan memanggil dari sumber CDN Google, sekarang fungsi Dojo sudah bisa digunakan.

<script type="text/javascript">
dojo.ready(function(){
    // disini fungsi dojo bisa dipanggil
});
</script>

tapi jika anda tidak terkoneksi ke internet, yang bisa dilakukan adalah mendownload terlebih dahulu paket Dojo Toolkit di dojotoolkit.com, dan panggil dalam baris kode berikut

<script src="<i>path_ke_dojo</i>/dojo.js"></script>

Dengan begitu, dojo sudah bisa digunakan, tapi mengingat bahwa dojo digunakan untuk empowering the web, alangkah baiknya jika path tersebut mengarah ke http web server (Apache, Nginx, IIS).

Ke Mana Lagi Sekarang

Jika anda masih belum puas tentang awal ini, sumber-sumber dibawah ini juga bisa digunakan sebagai referensi lanjutan.

Sebenarnya anda tidak perlu mencari lagi referensi lain, karena setiap pekannya saya akan jelaskan satu dan lain hal tentang Dojo Toolkit di blog ini.

Bertanya Pertanyaan Cerdas

Internet kini semakin banyak dikunjungi oleh para pencari jawaban, dan mesin pencari seperti Google, Yahoo!, dll bisa membantu kita menemukan jawaban dengan menunjukkan halaman yang sesuai dengan jawaban yang kita cari. Tapi tidak semua pertanyaan terjawab di Internet ini, semakin berkembang, semakin banyak pertanyaan baru bermunculan. Tapi seperti sosialisasi di dunia nyata, Internet-pun memilki etika dalam bertanya.

How To Ask Questions The Smart Way oleh Eric Steven Raymond, menunjukkan cara bertanya dalam dengan cerdas dalam bahasa Inggris, tapi jangan khawatir, untuk pembaca yang lebih suka bahasa lokal, terdapat juga versi Bahasa Indonesianya, Bagaimana Bertanya dengan Cerdas di situs bulsara.

Dan pada pertengahan 2010 kemarin, saya menemukan versi How to Ask Smart Questions yang lebih bersahabat, dengan kemasan yang lebih menarik oleh Martin Owens, yang lalu kemudian saya terjemahkan dalam Bahasa Indonesia.

How to Ask Smart Questions oleh Martin Owens

Bagaimana Bertanya Pertanyaan Cerdas, versi Bahasa Indonesia

Bagaimana menurut anda?

Nautilus Script untuk konversi SVG ke PNG

Jadi ceritanya sedang iseng mencoba Nautilus script di Ubuntu kesayangan, gunanya untuk mempermudah konversi file SVG ke PNG, menggunakan beberapa program yang sudah ada, disini saya gunakan zenity untuk input dan konfirmasi dengan pengguna, dan rsvg untuk konversi file tersebut, sebelumnya pastikan dulu bahwa keduanya terinstall di PC anda. Berguna sekali bagi saya saat konversi icon Tango ke PNG (berhubung hanya disediakan resolusi kecil 16, 24, 32, dan Scalable bentuk SVG).

Jangan lupa dikopi ke file (misal disini saya pake svg to png.sh), lalu simpan di ~/.gnome2/nautilus-scripts/ dan set file menjadi executable, karena jika tidak begitu, script tidak akan dapat dijalankan.

#!/bin/bash
###############################
# 
# Nautilus svg to png script
# by khalifavi 2010
# 
# using zenity and rsvg
#  
# simply copy this to a file and place it in ~/.gnome2/nautilus-scripts/
# do not forget to SET THIS FILE TO BE EXECUTABLE
#
###############################
Size="$(zenity --entry --title "Enter Output Size" --text "Enter Output size of the PNG\'s :")"
for arg
do
    filetype=$(file -i "$arg")  

    if [ "${filetype:${#arg}+2:13}" = "image/svg+xml" ]; then
        rsvg --format png --width $Size "$arg" "${arg:0:${#arg}-4}.png"
    else
        zenity --error --text "File "$arg" is not image/svg+xml" --title "Not an SVG"
    fi
   
done
zenity --info --text "Conversion is done!" --title "Completed"

Ini saya perlihatkan saja bagaimana script ini bekerja
Ini tampilan nautilus, terdapat menu script disitu, itu setelah script disimpan di ~/.gnome2/nautilus-scripts/

Script tampil pada menu konteks Nautilus setelah file di klik-kanan
Script tampil pada menu konteks Nautilus setelah file di klik-kanan

Ini tampilan input ukuran PNG yang kita inginkan

Tentukan ukuran PNG yang diinginkan (sebenarnya yang ditentukan cukup weight saja)
Tentukan ukuran PNG yang diinginkan (sebenarnya yang ditentukan cukup weight saja)

Ini tampilan setelah script selesai dijalankan

Konversi SVG to PNG selesai
Konversi SVG to PNG selesai

Ini hasil dari script tersebut

Ini nih hasil icon yang sudah dikonversi jadi PNG
Ini nih hasil icon yang sudah dikonversi jadi PNG

oya, scriptnya sangat sederhana, nanti kita perbaiki lagi
🙂
selamat mencoba!
bagaimana menurut anda?

Database Abstraction Layer :: Kemudahan Melawan Performa

koneksi antara aplikasi database engine, abstraction layer dan developer/user/application layer
koneksi antara aplikasi database engine, abstraction layer dan developer/user/application layer

Abstraction Layer atau lapisan abstraksi adalah suatu lapisan untuk menyembunyikan kerumitan yang ada pada fungsi-fungsi yang serupa. Begitu pula dengan Database Abstraction Layer, suatu pendekatan penyederhanaan/penyeragaman fungsi dari setiap database engine yang ada, jadi kita tidak perlu mengetahui fungsi API database spesifik yang kita gunakan, yang perlu kita ketahui hanyalah fungsi API dari Database Abstraction Layer yang kita gunakan. Terkesan sederhana. Ya, memang ini menjadikan pekerjaan programmer sederhana.
Mungkin selama ini anda pernah mendengar ODBC, khususnya bagi anda pengguna Windows, karena memang pada awalnya ODBC muncul di sistem operasi ini. ODBC adalah salah satu dari berbagai jenis Database Abstraction Layer yang ada. Jenis lainnya adalah ORM, di PHP tersedia ActiveRecord, Doctrine, dll; di Java ada Hibernate, dll. Juga ada jenis yang lebih sederhana, seperti pada PHP ada PDO(PECL), atau PEAR DB(PEAR).
Dengan pendekatan ini, para programmer akan semakin mudah dalam menghubungkan aplikasi yang mereka buat dengan database, tapi harus kita ingat bahwa setiap pemecahan masalah akan selalu menimbulkan masalah baru. Memang benar bahwa dengan menggunakan Doctrine, kita tidak perlu mengkhawatirkan engine database apa yang kita gunakan, kita bisa menggunakan postgreSQL, MySQL, MSSQL, ataupun juga Oracle; dengan menggunakan Hibernate kita hanya perlu menggunakan fungsi API hibernate saja. Tapi, dengan adanya abstraction layer, artinya ada rutin fungsi lain yang dijalankan, ya, dengan itu berarti aplikasi jadi yang kita buat bisa menjadi lebih lambat dalam mengakses data :(, sayang sekali…
Contohnya mungkin pada skrip php yang menggunakan PDO berikut ini:

<?php
// tentukan $dsn, $username dan $password
$dsn = "mysql:host=localhost;dbname=telepon";
$username = "user";
$passwd = "password";

try{
    $pdo = new PDO($dsn, $username, $passwd);
    $runq = $pdo-&gt;query("SELECT * FROM akun a, telepon t WHERE a.id=t.id_akun");
    foreach ($runq as $row){
        echo $row['nama']." ".$row['telepon']."&lt;br/&gt;";
    }
}catch(PDOException $e){
    echo $e-&gt;getMessage();
}
?>

Ini dia, lihat pada $dsn, disini $dsn bisa diganti dengan driver lain yang disupport oleh PDO, kita bisa mengubahnya menjadi mssql ataupun yang lainnya. Untuk menjalankan query, kita hanya perlu menjalankan $pdo->query($sql), dan lakukan iterasi untuk memunculkan hasilnya.
Namun, lihat pada objek PDO, objek ini menerima berbagai masukan jenis database engine yang ada, tapi mengeluarkan hasil yang sama, artinya ada sesuatu yang kompleks yang terjadi di dalam fungsi objek ini, dan tentunya itu akan makan waktu, yang berharga untuk setiap permintaan query user :(.
Dengan rangkuman bahwa Database Abstraction Layer memiliki:
Kelebihan

  • Waktu pengembangan (yang perlu dilakukan developer hanya mengetahui fungsi DBAL saja)
  • Tidak perlu mengkhawatirkan database engine (selama driver terpenuhi, maka fungsi DBAL akan berjalan sesuai keinginan)

Kekurangan

  • Waktu (karena DBAL menjalankan rutin fungsi yang lebih banyak daripada fungsi native yang disediakan, tentunya waktu query jadi lebih lambat)
  • Fungsi Kompleks Spesifik Engine (mengingat DBAL ini fungsinya untuk menyeragamkan fungsi dan hasil, kita tidak akan menemukan kelebihan spesifik (fungsi kompleks) dari engine database. misal: pengoptimasian query, karena tidak semua database engine menyediakan cara untuk optimasi query (lewat index), jadi DBAL-pun tidak menyertakannya)

dan, itulah garis besar dari database abstraction layer.