Iqra Bismirabbikalladzii Khalaq

Saturday, October 01, 2005

Mereklamasi Partisi Terlanjur :)

Harddisk saya yang lama (Seagate Barracuda 40 GB) kembali digunakan lagi secara penuh. Kenapa, ya karena temennya si harddisk 80 GB baru saja crash. Karena belum ada uang untuk menggantikannya, maka terpaksa putar otak untuk mengatasi masalah kekurangan disk space. Selidik punya selidik, dengan Computer Administrative->Disk Manager , terlihat bahwa ternyata harddisk 40GB tersebut masih memiliki unused free space, alias sebongkah space yang belum diformat ataupun dipartisi! Hehe nasib baik nih J

Segera saya klik kanan partisi kosong tersebut. Dan kecewa. Karena tidak ada pilihan untuk membuat partisi apalagi memformat free space tersebut. Kenapa gerangan? Ternyata harddisk saya sudah memiliki empat partisi primer! Ya, empat partisi primer adalah yang maksimal dimiliki sebuah harddisk biasa. Masing-masing partisi tersebut akan memiliki satu volume. Misalnya ada dua primary partition dengan volume C:, D:. Kalaupun mau membuat volume lebih dari empat, Anda bisa membuat sebuah Extended Partition. Nah, Extended Partition itu bisa diisi dengan lebih dari satu volume.

Kembali ke permasalahan tadi, setelah empat partisi primer sudah (terlanjur) dibuat, padahal masih ada sisa ruang, apa yang hendak dilakukan? Resize partisi? Saya tak memiliki Partition Magic, dan beberapa kasus teman menggunakannya berakhir dengan buruk. Satu ide yang muncul adalah menghapus partisi berseberangan (menempel dengan free space area), yang menampung volume / drive C: yang sudah ada, kemudian, membuat partisi baru dari tempat yang kosong tersebut, sebesar-besar tempat yang tersisa. Toh, drive C: saya berisi Windows ME yang sudah tak pernah dipakai.
Sayang, konfigurasi dual-boot saya mungkin membuat partisi volume drive C: yang digunakan windows ME, tetap dianggap sebagai system volume oleh Windows XP saya yang ada di drive F:. Sehingga partisi tersebut tak dapat di-delete. Mengapa? Saya pun tak tahu pasti, kemungkinan multi boot loader milik windows XP disimpan di drive C:.

Jadi apa solusinya? Ternyata mudah sekali. Setahu saya partisi NTFS bisa di extend (resize lebih besar). Nah, saya pun mengkonversi drive C: tersebut ke NTFS (dulunya FAT32) dengan utiliti command line standard convert.exe. Ini memakan waktu kurang lebih 10 menit. Kemudian, dengan utiliti command line standard XP diskpart.exe, saya pun melakukan extend partisi C:. Tak sampai semenit! Masalah pun selesai dan saya lega karena mereklamasi beberapa gigabytes J

Berkenalan dengan ORDBMS

Pengalaman pertama dengan Oracle, dan sekaligus sebuah ORDBMS, adalah ketika mengajar lab untuk advanced database system. Oracle waktu sebelum itu nampak seperti barang mewah yang tak bisa diakses bagi kebanyakan orang (misalnya yang memilih MySQL), robust, cepat dan canggih. Ternyata sebagian dari anggapan itu hilang, sebagian lagi tetap bertahan. Oracle tidak seperti Microsoft yang menekankan aspek User Interface. Berhadapan dengan SQL*Plus, seperti berhadapan dengan makhluk langka zaman purbakala hehe. Tapi jangan salah ya, gitu-gitu, Oracle 9i (yang saya pakai di lab) termasuk database tercepat lho, sedikit mengalahkan MySQL, dalam benchmark yang ada di situs MySQL. Db2 dan yang lain-lain, performansinya turun drastis ketika sampai di titik jumlah konkuren user tertentu.
Oke, balik lagi ya ke OR-DBMS. OR adalah singkatan dari Object-Relational. Yang bermakna sebuah asimilasi dari paradigma Relational Database dan Object Database. Di ORDBMS anda bisa mendefinisikan kelas, menggunakan polimorfisme, dan lain-lain. Hanya saja, satu hal yang cukup memusingkan saya adalah bagaimana mengimplementasi sebuah many-to-many relationship di dalam ORDBMS. Browsing di dokumentasi Oracle yang sangat besar itu tidak membawa hasil berarti. Pun sekilas googling. Jangan salah, Oracle 9i mampu mengimplementasi many to many relationship a-la Relational lho, sebab sifatnya yang Object-Relational. Tapi, karena kuliahnya nyerempet-nyerempet tentang object database, ya agak aneh juga kalau segala sesuatunya diselesaikan dengan cara relational.
Solusinya harus melibatkan referensi, saya pikir begitu. Sebagai informasi, dalam paradigma object database, kita tidak melink-kan antar object dengan foreign key, tapi dengan Object ID. Masing-masing object secara otomatis akan memiliki Object ID yang bisa digunakan untuk keperluan referensi dari object lain. Dalam paradigma relational, kita akan berhadapan dengan join. Semakin banyak tabel terlibat, semakin banyak join yang kita buat. Dalam aplikasi yang memiliki relasi yang kompleks antar-objek, menggunakan RDBMS menjadi kurang tepat. Mengapa? Karena relasi kompleks antar objek itu cenderung berimplikasi ke banyaknya join yang harus dilakukan dalam query. Semakin banyak join, semakin banyak cartesian multiplication yang terjadi antar tabel, semakin lambat pula RDBMS beraksi.
Sebagai kontras, di dalam paradigma Objek Database, keunggulannya adalah pada object navigation. Dari objek satu ke objek lain, kita melakukan navigasi dengan bantuan OID tersebut. Kita tidak melakukan join antar tabel, sehingga umumnya akan mempercepat proses. Sekali lagi, ini berlaku untuk kasus relasi kompleks antar-objek (contoh aplikasi engineering dan manufacturing), dan bukan pada kasus relasi sederhana antara objek yang volume datanya besar (contoh aplikasi perbankan).
Kembali ke many-to-many relationship. Menurut buku Database Systems, relasi tersebut bisa digambarkan dengan menyimpan tabel referensi ke intermediate object. Sebagai contoh, kita hendak menggambarkan hubungan many to many antara Resep dan Bahan. Kita tahu bahwa setiap Resep (makanan) terdiri atas beberapa bahan, dan sebuah bahan bisa muncul dalam beberapa resep. Nah, misalnya anda diminta untuk menyimpan beberapa resep berikut dalam ORDBMS:


Resep1: Ayam Goreng
Bahan,Kuantitas:
-Ayam,1 kg
-Minyak,0.5 L
-Garam,150 gram
-Tepung,250 gram


Resep2:Kentang Goreng
Bahan,Kuantitas
-Kentang,2 kg
-Minyak,0.2 L
-Garam,200 gram
-Tepung,400 gram

Maka, solusinya kira-kira begini gambarnya:



Dan kode implementasinya seperti ini:
create type rec_ing_t;

create type ref_t as object (
refs REF rec_ing_t
);

create or replace type rec_ing_ctr as TABLE of ref_t;

create type rec_t;
create_type ing_t;

create or replace type rec_ing_t as object (
rec REF rec_t,
ing REF ing_t,
quantity varchar2(40)

);

create or replace type ing_t as object
(
name varchar2(40) ,
recipees rec_ing_ctr

);

create or replace type rec_t as object
(
name varchar2(40),
ingredients rec_ing_ctr
);

create table rec_tab of rec_t nested table ingredients store as ing_store;
create table ing_tab of ing_t nested table recipees store as rec_store;
create table rec_ing_tab of rec_ing_t;

insert into rec_tab(name) values ('ayam goreng');
insert into rec_tab(name) values ('kentang goreng');

insert into ing_tab(name) values ('ayam');
insert into ing_tab(name) values ('oil');
insert into ing_tab(name) values ('kentang');
insert into ing_tab(name) values ('salt');

select L.* from rec_tab, table (rec_tab.ingredients) L;
# memasukkan resep berikut
# Ayam Goreng consist of 1 kg ayam, 100 ml oil, 100 gr salt

insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='ayam'),
'1 kg'
);

insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='oil'),
'100 ml'
);

insert into rec_ing_tab values (
(select ref(r) from rec_tab r where r.name='ayam goreng'),
(select ref(i) from ing_tab i where i.name ='salt'),
'100 g'
);


select deref(r.rec) from rec_ing_tab r;
select r.rec from rec_ing_tab r;
select r.rec.name from rec_ing_tab r;
select r.ing.name from rec_ing_tab r;

UPDATE rec_tab r SET r.ingredients = rec_ing_ctr();
insert into table ( select R.ingredients from rec_tab R where R.name='ayam goreng')
select ref(RI) from rec_ing_tab RI where RI.rec.name = 'ayam goreng';

UPDATE ing_tab I SET I.recipees = rec_ing_ctr();
insert into table ( select I.recipees from ing_tab I where I.name='ayam')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'ayam';

insert into table ( select I.recipees from ing_tab I where I.name='oil')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'oil';

insert into table ( select I.recipees from ing_tab I where I.name='salt')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'salt';

#apakah ingredient dari masing-masing resep?
select R.name,I.refs.ing.name,I.refs.quantity from rec_Tab R,table(R.ingredients) I;

UPDATE rec_tab r SET r.ingredients = rec_ing_ctr();
insert into table ( select R.ingredients from rec_tab R where R.name='ayam goreng')
select ref(RI) from rec_ing_tab RI where RI.rec.name = 'ayam goreng';

UPDATE ing_tab I SET I.recipees = rec_ing_ctr();
insert into table ( select I.recipees from ing_tab I where I.name='ayam')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'ayam';

insert into table ( select I.recipees from ing_tab I where I.name='oil')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'oil';

insert into table ( select I.recipees from ing_tab I where I.name='salt')
select ref(RI) from rec_ing_tab RI where RI.ing.name = 'salt';

Instalasi Borland Delphi dari Existing Installation

Hardisk crash ? menyebalkan.. kalau engga ada mekanisme backup yang canggih harus reinstalasi semuanya. Termasuk Delphi. Dan harus instalasi ulang komponen-komponennya yang banyaknya minta ampun.. ufff. Heey, bukankah informasi itu semua tersimpan dalam registry? Jadi engga usah instalasi ulang, (kalau ada sisa data dari hardisk lama) tinggal kopi aja. Jadilah browsing registry. Oya, kalau Anda punya Windows 2000, coba pakai regedt32 deh. (bukan regedit). Regedt32 lebih ok untuk beberapa hal. Dengan tool tsb, kukopi registry entri berikut di sistem lama:
HKEY_LOCAL_MACHINE\Software\BorlandHKEY_CURRENT_USER\Software\BorlandSetelah itu copy semua *.bpl yang dipakai oleh previous installation. Biasanya ada di direktori %windir%\system32.
Satu hal lagi, kita perlu meregister bordbk70.dll yang ada di %commonprogramfiles%\borland dengan regsvr32.exe.