Irmante Astalavista

Simsalabim!!!
Blog ini bercerita tentang dunia IT, ilmu kebumian, dan lain-lain.

Saturday, June 26, 2010

Mapserver, Extent PostGIS, dan jQuery

Seringkali kita dihadapkan pada keinginan untuk menampilkan peta lokasi berdasarkan pilihan user. Contoh sederhananya, ketika user melakukan klik pada sebuah tabel atau grafik yang memiliki informasi lokasi, maka panel lain akan menampilkan peta lokasi pada baris tabel atau grafiknya.
Well... biasanya sih, bilamana kita menggunakan mapserver berbasis framework, seperti pMapper, ka-map!, fist, dst, maka kita dapat melakukan pencarian lokasi dengan menggunakan tombol Find, Search, dan sebagainya.
Nah framework Mapserver dengan segala tombolnya itu, malah bukan tampilan yang diinginkan user awam a.k.a management :D. User maunya dari sembarang tabel atau grafik, klik… muncul peta lokasinya tanpa embel-embel perlu klik sana-sini. Sesederhana itu dan ga banyak cingcong....
'Klik dan tampilkan lokasi' yang bisa dilakukan pada Mapserver adalah dengan memanfaatkan bahasa PHPMapscript dengan perintah dasar
$oMap->setExtent(xMin, yMin, xMax, yMax)
Artinya tampilkan peta lokasi dengan batas pojok kiri bawah (xMin, yMin) dan batas pojok kanan atas (xMax, yMax). Pada mapserver, nilai extent itu secara default tersimpan pada file *.Map, dimana ukuran nilai extent biasanya meliputi wilayah seluruh peta, bukan lokasi spesifik dari peta.

Itu malah jadi problem buat klik dan tampilkan lokasi....
Perhatikan gambar di atas. Area bergaris biru (----), merupakan nilai kotak extent dari peta kecamatan A, B, C, D, E, F. Area bergaris hijau (----), merupakan nilai kotak extent dari peta kecamatan D, E.
Untuk areal seluruh kecamatan memiliki nilai extent:
xMin-yMin: 581663.9375 - 9621369
xMax-yMax: 1050545 - 9855190
Untuk areal kecamatan D dan E, propinsi DEF memiliki nilai extent:
xMin-yMin: 790040.8125 - 9663481
xMax-yMax: 981676.375 - 9846642

Taunya darimana nilai koordinat pojok kiri dan pojok kanan atas wilayah yang kita ingin tampilkan?
Ada beberapa cara sebenernya, yang paling sederhana adalah buat kotak pada piranti lunak GIS terhadap kedua areal tersebut. Kemudian catat nilai kursor koordinat pojok kiri bawah dan koordinat pojok kanan bawah dari kotak tsb.
Perhatikan! bahwa sistem proyeksi yang mudah diinterpretasi Mapserver dalam menentukan nilai skala adalah sistem proyeksi UTM yah, bukan derajat desimal.
Well…, yang bisa saya pikirkan adalah menggunakan fasilitas ST_EXTENT pada PostGIS. ST_EXTENT merupakan perintah untuk mengambil extent batas terluar dari sekumpulan lokasi peta hasil query, dengan output hanya satu baris!. Misal tabel peta dengan menggunakan query WHERE diperoleh hasil 2 kecamatan, maka fitur ST_EXTENT ini akan menampilkan nilai batas terluar dari kedua kecamatan tersebut, hanya satu baris.Dengan menambahkan beberapa bumbu query, maka kita akan dapat memperoleh nilai xMin, yMin, xMax, yMax dari wilayah terpilih.


Kalo lebih mudah utk mapserver dpt dipecah jadi 2 kolom extent yaitu kolom xymin dan xymax, melalui query berikut:
SELECT REPLACE(SPLIT_PART(ASTEXT(ST_EXTENT(ST_TRANSFORM(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin, SPLIT_PART(ASTEXT(ST_EXTENT(ST_TRANSFORM(geometry,32749))), ',', 3) as xymax FROM wilayahku WHERE propinsi='DEF' AND kabupaten='3';

Artinya: Tentukan area extent dari wilayah propinsi='DEF' AND kabupaten='3'; (perintah WHERE), dengan cara mengambil nilai geometri (kolom GEOMETRY), dalam proyeksi UTM 49S (perintah ST_TRANSFORM(geometry,32749)), lalu terjemahkan sebagai text (perintah ASTEXT), lalu pisahkan nilai tersebut menggunakan parameter split (perintah SPLIT_PART).
Dengan mengubah-ubah parameter WHERE, maka kita bisa mendapatkan nilai extent secara dinamis ya tho… Nilai extent inilah yang menjadi dasar inisiasi Mapserver sehingga user bisa melakukan 'klik dan menampilkan lokasi'.

Masuk ke koding yah...
Langkah pertama adalah membuat query function pada PostGIS untuk mendapatkan area extent berdasarkan inputan propinsi, kabupaten, dan kecamatan. Nama query function itu: _a_mapex(propinsi, kabupaten, kecamatan).
-- Function: _a_mapex(text, text, text)

-- DROP FUNCTION _a_mapex(text, text, text;
CREATE TYPE ms_extent AS
(xmin text,
xmax text);
ALTER TYPE ms_extent OWNER TO postgres;

CREATE OR REPLACE FUNCTION _a_mapex(text, text, text)
RETURNS SETOF ms_extent AS
$BODY$
--returns setof party as $$
DECLARE

BEGIN
IF $1!='0' AND $2!='0' AND $3!='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku where propinsi = $1 and kabupaten=$2 and kecamatan=$3;

ELSE IF $1!='0' AND $2!='0' AND $3='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku where propinsi = $1 and kabupaten=$2;

ELSE IF $1!='0' AND $2='0' AND $3='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku where propinsi = $1;

ELSE IF $1='0' AND $2='0' AND $3='0' THEN
RETURN QUERY
select replace(split_part(astext(st_extent(st_transform(geometry,32749))), ',', 1), 'POLYGON((', '') as xymin,
split_part(astext(st_extent(st_transform(geometry,32749))), ',', 3) as xymax from wilayahku;
END IF;
END IF;
END IF;
END IF;
RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE
COST 100
ROWS 1000;
ALTER FUNCTION _a_mapex(text, text, text) OWNER TO postgres;
Contoh pemanfaatan query function itu dengan mencoba query berikut:
Untuk menampilkan semua wilayah menggunakan perintah:
select * from _a_mapex('0','0','0');
Untuk menampilkan propinsi ‘DEF’ menggunakan perintah:
select * from _a_mapex('DEF','0','0');
Untuk menampilkan propinsi ‘DEF’ dan kabupaten ‘3’ dan kecamatan=’F’ menggunakan perintah:
select * from _a_mapex('DEF','3','F');

PostGIS function udah... ,
Sekarang tinggal urusan MapServer dan jQuery neh…
Langkah keduanya adalah kita buat dulu file wilayahku.map yg menampilkan peta.
Filenya berjudul: wilayahku.map, dengan layer berjudul data_postgis.
MAP
NAME "wilayahku"
STATUS ON
SIZE 550 400
#EXTENT 558219.89536477 9609678.45877826 1073988.99548252 9866880.21769665
EXTENT 581663.9375 9621369 1050545 9855190
UNITS meters
RESOLUTION 72
IMAGETYPE PNG
IMAGECOLOR 255 255 255

SCALEBAR
STYLE 1
UNITS kilometers
END

WEB
IMAGEPATH "/ms4w/tmp/ms_tmp/"
IMAGEURL "/ms_tmp/"
END

PROJECTION
"init=epsg:32749"
#"init=epsg:4326"
#"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
END

#--------------------------------------------------------------------
LAYER
NAME "data_postgis"
STATUS DEFAULT
TYPE POLYGON
CONNECTIONTYPE POSTGIS
CONNECTION "host=localhost port=5432 dbname=msdemo user=postgres password=00000"
DATA "geometry from wilayahku using unique gid using srid=32749"

PROJECTION
"init=epsg:32749"
#"+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs"
END #PROJECTION

CLASS
COLOR 225 255 100
OUTLINECOLOR 0 0 0
END

END #LAYER
END


Langkah ketiga, kita perlu membuat file PHPMapscript mapex.php, yang dapat menghasilkan gambar peta lokasi, berdasarkan serangkaian input parameter.

Dilanjut dengan script berikut:
<?php
//Generate the chart element
$paramd = $_GET['param'];
$eval = explode("_", $paramd);
//Connect to the DB
$conn = pg_connect("host=localhost user=postgres password=00000 dbname=msdemo");
//Fetch all factory records
$strQuery = "select * from _a_mapex('" . $eval[0] . "','" . $eval[1] . "','" . $eval[2] . "');";
// echo $strQuery;
// exit;
$result = pg_query($strQuery) or die('Query failed: ' . pg_last_error());
// printing table rows
if ($result) {
while($ors = pg_fetch_array($result)) {
$mapex = $ors[0] . " " . $ors[1];
}
}
//echo $mapex;

pg_free_result($result);
pg_close($conn);

$map = ms_newMapObj($_GET['map']);
// We create the map object based on the mapfile received as parameter

$size = explode(" ",$_GET['mapsize']);
$map->setSize($size[0], $size[1]);
// and set the image size (resolution) based on mapsize parameter
// Update: The map size must be setted before the extent, otherwise the extent
// will be adjusted to the aspect ratio of the map defined on SIZE parameter
// of MAP object in your mapfile

$extent = explode(" ",$mapex);
$map->setExtent($extent[0], $extent[1], $extent[2], $extent[3]);
// We get the mapext parameter... split it on its 4 parts using
// the space character as splitter

$layerslist=$_GET['layers'];
for ($layer = 0; $layer < $map->numlayers; $layer++) {
$lay = $map->getLayer($layer);
if ((strpos($layerslist,($map->getLayer($layer)->name)) !== false)
or (($map->getLayer($layer)->group != "") and
(strpos($layerslist,($map->getLayer($layer)->group)) !== false))){
// if the name property of actual $lay object is in $layerslist
// or the group property is in $layerslist then the layer was requested
//so we set the status ON... otherwise we set the stat to OFF
$lay->set(status,MS_ON);
} else {
$lay->set(status,MS_OFF);
}
}

// The next lines are the same as previous mapscript
$oImg = $map->draw();
$url = $oImg->saveWebImage(MS_PNG, 0, 0, -1);
echo "<img id=\"mymap\" src=" . $url . " style=\"border:1.5px solid grey;\"></img>";
//echo $map->scaledenom //check skala output yang keluar, soalnya kalo dalam satuan DD ga keluar jeh.

//BILAMANA ADA PERHITUNGAN MAX-MINLABEL, JANGAN GUNAKAN UNIT DD, TAPI GUNAKAN UNIT METERS, SRID LAYER PETA TETAP PROYEKSI DESIMAL DEGREE GAK MASALAH,
//CUMAN OUTPUT PROJECTION *.MAP TETAP HARUS UTM, CONTOH SRID 32739 utk UTM 49S atau 32649 utk UTM 49N
?>
Berikutnya adalah pengetesan nilai parsing dengan cara mencopy paste url ke dalam browser (perhatikan bagian input param):
Contoh untuk menampilkan peta kabupaten 1 propinsi ABC
http://localhost/msdemo/mapex.php?param=ABC_1_0&map=wilayahku.map&mapsize=450%20300&layers=data_postgis

Contoh untuk menampilkan data propinsi DEF
http://localhost/msdemo/mapex.php?param=DEF_0_0&map=wilayahku.map&mapsize=450%20300&layers=data_postgis

Welldone…!!!
Langkah keempat, sekarang kita bermain dengan file HTML-nya yang akan melakukan proses klik dan tampilkan lokasi.
Copy paste script berikut, dan simpan dalam file berjudul mapex_jquery.html:
Perhatikan kalo file ini membutuhkan jQuery file jquery-1.4.2.min.js yg tersimpan dalam direktori jQuery. jQuery ini bertujuan untuk:
  • mengolah dan menampung peta hasil query pada mapex.php kedalam div dengan id=map_tag,

  • proses render halaman bersifat parsial Ajax, karena yang diubah hanya gambarnya saja bukan keseluruhan dari halaman web,

  • Menambahkan efek animasi sederhana, biar keliatan lebih cooool…


<HTML>
<HEAD>
<style type="text/css">
<
body {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
}
</style>

<SCRIPT LANGUAGE="JavaScript" src="FusionCharts/jquery-1.4.2.min.js"></SCRIPT>
<SCRIPT LANGUAGE="JavaScript">
function mymap(mylocation1){
//window.alert(mylocation1);
//perhatikan, kalo yg diubah sekali lagi hanya pada input param yah!
$.ajax({ type: "GET", url: "mapex.php", dataType: 'html', data: "map=wilayahku.map&param=" + mylocation1 + "&mapsize=450%20300&layers=data_postgis", error: function(xhr, textStatus, errorThrown) { alert('An error occurred! ' + errorThrown); }, success: function(html){ $('#map_tag').hide().slideDown().html(html); } }); };
</SCRIPT>
</HEAD>
<BODY>
<p><h1>Klik dan tampilkan lokasi</h1></p>
<table>
<tr>
<td>
<a href="JavaScript:mymap('0_0_0');">Seluruh Area</span></a>
<li><a href="JavaScript:mymap('ABC_0_0');">Propinsi ABC</a></li> <ul> <li><a href="JavaScript:mymap('ABC_1_0');">Kabupaten 1</a></li> <ul> <li><a href="JavaScript:mymap('ABC_1_A');">Kecamatan A</a></li> <li><a href="JavaScript:mymap('ABC_1_C');">Kecamatan C</a></li> </ul> <li><a href="JavaScript:mymap('ABC_2_0');">Kabupaten 2</a></li> <ul> <li><a href="JavaScript:mymap('ABC_2_B');">Kecamatan B</a></li> </ul> </ul> <li><a href="JavaScript:mymap('DEF_0_0');">Propinsi DEF</a></li> <ul> <li><a href="JavaScript:mymap('DEF_3_0');">Kabupaten 3</a></li> <ul> <li><a href="JavaScript:mymap('DEF_3_D');">Kecamatan D</a></li> <li><a href="JavaScript:mymap('DEF_3_E');">Kecamatan E</a></li> </ul> <li><a href="JavaScript:mymap('DEF_4_0');">Kabupaten 4</a></li> <ul> <li><a href="JavaScript:mymap('DEF_4_F');">Kecamatan F</a></li> </ul> </ul>
</td>
<td>
<div id="map_tag"></div>
</td>
</tr>
</table>
</BODY>
</HTML>
</BODY>
</HTML>

Sekarang tinggal testing outputnya:


Downloadnya di sini.

Labels: ,


Thursday, August 06, 2009

Malware Pada Blog

Seorang sahabat pagi-pagi mengirim SMS:
"Man, blogku keno virus malware, carane ngilangi piye yoh?"
Berhub saya juga gak tau kalo dia punya blog, maka saya sms balik:
"alamat blognya opo?"

Setelah dibales yang berisi alamat situsnya, saya copy paste alamatnya ke browser, dan baru saya tau kalo blognya berisi tentang lapak dagangan baju ibu menyusui yg lumayan keren :D.
Berhubung saya gak pake antivirus baik laptop maupun PC, maka browser saya tidak memberikan pesan peringatan apapun, so saya sama sekali tidak tau malwarenya yang mana. Njuk saya sms tho, "lha wong blogmu tampil sempurna ngono kok, ndi viruse?"

Kali ini dia telepon, cerita kalo di kantor dan di rumah sama-sama gak bisa akses blog lapak dagangannya, karena muncul pesan error bla-bla yang dia bacakan dari laptopnya. Daripada saya tebak-tebak, lalu saya memintanya mengirimkan pesan error via SMS: "situs ******** berisi elemen dari situs wewewecrazyprofiledotcom yang tampaknya meng-host malware."
Artinya ada alamat URL yang mengandung virus malware tersebut yang tentunya tertulis dalam blognya. So, input dari luar yang memungkinkan untuk dimasuki oleh malware tersebut adalah, user comment. Bisa jadi user comment ini menyelipkan alamat URL yang dengan sadar/tanpa ia sadari, server alamat URL tersebut terdeteksi sebagai adware/malware/spyware, dst... ya tho.

Selanjutnya adalah perburuan 'sumber masalah', ya tinggal buka sourcecode dari blognya ya tho:
Untuk browser Opera, klik kanan mouse pilih Source
untuk browser IE, klik kanan mouse pilih View Source
untuk browser Google Chrome, klik kanan mouse pilih Liat sumber laman
Terus ya tinggal Find (tekan key Crtl-F) isikan si alamat URL malware yang terdeteksi oleh antivirus tsb.
Kalo ketemu, selanjutnya telusuri nama pengirim comment, sesuatu yang wajib diisi saat mengisi comment pada blog, dan menjadi kata kunci kita untuk menghapus comment bervirus tersebut. Katakanlah namanya Mr. X.
Masuk sebagai administrator blog, lalu hapus comment dari user Mr.X yang mengandung malware.
DONE, and that's it!

Labels:


Wednesday, August 05, 2009

Alur Kerja Proyek


Ini gambaran bagaimana alur sebuah proyek dari ide menjadi sebuah purchase order, yang menghubungkan antara user dan vendor serta keterkaitan antara sales dan teknikal.

Startnya adalah dari munculnya kebutuhan bisa muncul dari eksekutif, manajemen, maupun dari staf dari pihak user.
Sifatnya adalah awareness, interest, maupun investigasi yang memakan hingga 24% dari tahapan project menjadi purchase order (PO).

Misal gini:
dari Eksekutif/Management berkeinginan mengimplementasi citra satelit dalam perkebunan. Staf melakukan investigasi atas perintah atasan tersebut dengan mencari vendor citra satelit di Indonesia. Sales vendor citra satelit menginformasikan suatu teknologi satelit, dimana sesudah presentasi oleh vendor, staf pihak user kemudian menyampaikan paparan tadi ke pihak manajemen.
Atau
Bisa saja sales/marketing melakukan presentasi kepada manajemen dan staf diikutkan untuk membantu proses investigasi terhadap produk yang ditawarkan.
Atau
Sales/marketing hanya presentasi pada level staf saja... :D

Peran teknikal disini bersifat menyampaikan inovasi produk, atau menciptakan suatu kreasi produk. Jadi ketika kita sebagai perusahaan services, dimana sales tidak cukup 'mumpuni' atau manajemen masih berkutat tentang perkembangan teknologi, maka kita hanya bisa mencapai 24% tahapan menuju PO.

Berikutnya adalah tahapan 25%-60%, yang bersifat edukasi, strategi, dan inisiatif.
Ketika investigasi atau presentasi selesai, bukan berarti sales vendor berdiam diri. Karena bisa jadi ketika manajemen/staf sudah selesai di presentasi, tetapi belum tentu mampu menyampaikan pentingnya produk yang kita tawarkan ke pihak eksekutif, sehingga proyek pun tidak turun-turun.

Disini peran sales untuk dapat menarik kebutuhan tersebut ke pihak eksekutif yang tentunya dibantu teknikal untuk melakukan peran Edukasi ke pihak eksekutif juga.
Atau bisa jadi,
Dalam satu perusahaan eksekutif merupakan suatu pihak yang untouchable, sehingga sales hanya perlu melakukan pendekatan ke pihak manajemen untuk menarik informasi hasil presentasi tadi dari bawah ke atas (tidak perlu sampai eksekutif).

Edukasi para eksekutif bisa jadi bersumber dari product awareness pihak manajemen atau oleh product awareness hasil presentasi sales dan teknikal vendor. Tentunya bila eksekutif telah setuju maka selanjutnya adalah melangkah pada strategi, misal budgetnya tersedia atau tidak, perlu tidaknya produk ini, jangka panjang pemakaian produk, dan seterusnya.
Ketika budget tidak dianggarkan oleh eksekutif, maka tahapan proyek menuju PO berhenti pada tahap 50%, tetapi kalo anggaran ada, maka kunci berikutnya ada di pihak manajemen yang tentunya menyusun rencana kebutuhan project yang artinya mencapai tahap 60% dari PO.

Selanjutnya adalah tahapan 61%-100%, yang bersifat evaluasi, rekomendasi, dan keputusan., dimana tahapan ini merupakan momen berikutnya untuk menuju PO.
Proyek yang sudah disusun dalam bentuk rencana proyek atau Kerangka Acuan Kerja, biasanya akan dievaluasi oleh staf teknis melalui tahapan tender. Disinilah kemungkinan vendor produk sejenis akan masuk. Bisa jadi informasi teknis dari vendor A, tetapi pemenang berasal dari vendor B.
Peran staf untuk mengevaluasi beragam produk sejenis oleh berbagai vendor, perlu dikawal oleh sales dan marketing ditambah teknikal agar 'tidak lari'. Caranya adalah mengawal proses evaluasi oleh staf dan tahap rekomendasi pada pihak manajemen. Hingga akhirnya eksekutif memutuskan Andalah yang menjadi pemenang dalam proyek tersebut!.
Cukup panjang dan melelahkan...

Best regards,
Irman

Labels:


Monday, April 13, 2009

Map Materialized View untuk Postgis


Materialized view adalah tabel yang berisi baris dan kolom, TETAPI memiliki sifat seperti table view. Artinya setiap perubahan dari table view akan dialami juga oleh table materialized view.

Enaknya apa sih?
Pernah tidak Anda membuat 1 peta view administrasi dengan 30 kolom hasil query rumit crosstab, hasil join table dari 8 table view dengan 1000 sub-administratif, ternyata untuk menampilkannya membutuhkan waktu 5 menit?
User Anda pasti akan mencak2 kayak cicak gara-gara wasting time menunggu minimal 5 menit untuk melihat peta yang Anda buat. Belum lagi ditambah keterbatasan bandwidth jaringan misalnya.

Anda sebagai database engineer sangat kelelahan atas upaya Anda mempercepat query peta view tersebut, dan akhirnya Anda menyadari bahwa untuk mempercepat query adalah memindahkan peta view tersebut keformat peta permanen (table view to table).
So trik yang dilakukan adalah menayangkan peta view dari basisdata tadi, kemudian mengeksportnya ke basisdata peta permanen melalui software GIS, Cadcorp misalnya.

OK, sekarang query sudah cepat, dengan peta permanen user bisa tersenyum melihat peta Anda tampil dalam <5 detik, 1/60 kali lebih cepat dari metode sebelumnya.

Masalah timbul lagi ketika ternyata, peta view yang diubah ke peta permanen secara reguler perlu diupdate karena data yang ditampilkan adalah data peta harian misalnya. Mungkin tidak masalah bila peta tersebut hanya < 10 layer. Manual juga gak papa yang sehingga ada tugas rutin harian ala PNS...:D
Kalo peta view yang diubah ke peta permanen puluhan layer gimana coba? Berapa banyak orang yg perlu Anda libatkan untuk mengubah peta tersebut satu per satu :D

Inilah pentingnya materialized view!
So, materialized view peta merupakan cara untuk menjadikan peta permanen memiliki sifat seperti peta view. Apapun perubahan yang ada pada peta view akan diikuti oleh peta permanennya. Anda tidak perlu lagi mengubahnya satu per satu, cukup memanggil query satu baris untuk menjalankan proses tersebut secara otomatis.

Dari grafik di atas, materialized view akan bersifat sama dengan view table. Saat ini magic spell-nya perlu dibuat secara manual di postgres 8.*. Tentunya kedepan postgres akan menambahkan fitur ini secara built-in mengingat pentingnya fasilitas ini.

OK, langsung hajar saja yah:

Bahan ajar:
1. PostgreSQL 8.* atau lebih tinggi
2. PostGIS yang sesuai dengan seri PostgreSQL 8.* atau lebih tinggi.
3. Contreng PLPGSQL pada saat Anda install PostgreSQL.
4. Peta basisdata hasil export dari shp2pgsql.exe atau menggunakan software GIS.
5. Peta view hasil query beberapa table.

Berikut adalah tabel yang digunakan untuk menampung informasi materialized view peta:

Tujuan:
Mencatat judul-judul peta sekaligus mencatat data timestamp terhadap perubahan dari table materialized view peta.

Kolom:
mv_name untuk judul peta permanen
v_name untuk judul peta view
last_refresh untuk Timestamp update terakhir terhadap peta permanen.

CREATE TABLE matviews (
mv_name NAME NOT NULL PRIMARY KEY
, v_name NAME NOT NULL
, last_refresh TIMESTAMP WITH TIME ZONE);

Berikutnya adalah fungsi untuk membuat materialized view peta

Tujuan:
- untuk mengubah peta view menjadi peta permanen dalam satuan koordinat yang sesuai.
- Menyamakan struktur kolom tabel peta view terhadap peta permanen, karena materialized view tidak dapat berjalan bilamana struktur kolom tidak sama antara peta permanen dengan peta view.

Input:
- $1 untuk judul peta permanen yang akan dibuat
- $2 untuk judul peta view yang menjadi dasar peta permanen
- $3 untuk kode SRID dari peta tersebut, misal 4326 untuk Derajat Desimal atau 32749 untuk UTM.

-- Function: create_matview_map(name, name, integer)

-- DROP FUNCTION create_matview_map(name, name, integer);

CREATE OR REPLACE FUNCTION create_matview_map(name, name, integer)
RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
view_name ALIAS FOR $2;
srid_code ALIAS FOR $3;
entry matviews%ROWTYPE;
BEGIN
SELECT * INTO entry FROM matviews WHERE mv_name = matview;

IF FOUND THEN
--RAISE EXCEPTION 'Materialized view ''%'' already exists.',
DELETE FROM matviews WHERE mv_name = matview;
END IF;

EXECUTE 'REVOKE ALL ON ' || view_name || ' FROM PUBLIC';

EXECUTE 'GRANT SELECT ON ' || view_name || ' TO PUBLIC';

EXECUTE 'CREATE TABLE ' || matview || ' AS SELECT * FROM ' || view_name;
EXECUTE 'CREATE INDEX ' || matview || '_geometry_sidx ON ' || matview || ' USING gist (geometry)';
EXECUTE 'ALTER TABLE ' || matview || ' ADD CONSTRAINT ' || matview || '_pkey PRIMARY KEY (gid)';
EXECUTE 'ALTER TABLE ' || matview || ' ADD CONSTRAINT enforce_dims_geometry CHECK (ndims(geometry) = 2)';
EXECUTE 'ALTER TABLE ' || matview || ' ADD CONSTRAINT enforce_srid_geometry CHECK (srid(geometry) = ' || srid_code || ')';

EXECUTE 'REVOKE ALL ON ' || matview || ' FROM PUBLIC';

EXECUTE 'GRANT SELECT ON ' || matview || ' TO PUBLIC';

INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name,
f_geometry_column, coord_dimension, srid, type) VALUES ('', 'public', matview, 'geometry', 2, srid_code, 'GEOMETRY');

INSERT INTO matviews (mv_name, v_name, last_refresh)
VALUES (matview, view_name, CURRENT_TIMESTAMP);

RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION create_matview_map(name, name, integer) OWNER TO postgres;


Selanjutnya adalah fungsi untuk melakukan drop off terhadap peta permanen.

Tujuan:
Menghapus peta permanen yang sudah dibuat sebelumnya, dapat diikuti dengan membuat materialized view peta baru sesuai struktur kolom peta view terbaru, atau sekedar membuang materialized view peta.

Input:
$1 untuk judul peta permanen yang akan dihapus

-- Function: drop_matview_map(name)

-- DROP FUNCTION drop_matview_map(name);

CREATE OR REPLACE FUNCTION drop_matview_map(name)
RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
entry matviews%ROWTYPE;
BEGIN

SELECT * INTO entry FROM matviews WHERE mv_name = matview;

IF NOT FOUND THEN
RAISE EXCEPTION 'Materialized view % does not exist.', matview;
END IF;

EXECUTE 'DROP TABLE ' || matview;
DELETE FROM geometry_columns WHERE f_table_name=matview;
DELETE FROM matviews WHERE mv_name=matview;

RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION drop_matview_map(name) OWNER TO postgres;

Selanjutnya adalah fungsi untuk melakukan refresh terhadap peta permanen:

Tujuan:
- melakukan refresh terhadap peta permanen yang memiliki struktur tabel sama dengan peta view.

Input:
- $1 untuk judul peta permanen yang akan direfresh

-- Function: refresh_matview(name)

-- DROP FUNCTION refresh_matview(name);

CREATE OR REPLACE FUNCTION refresh_matview(name)
RETURNS void AS
$BODY$
DECLARE
matview ALIAS FOR $1;
entry matviews%ROWTYPE;
BEGIN

SELECT * INTO entry FROM matviews WHERE mv_name = matview;

IF NOT FOUND THEN
RAISE EXCEPTION 'Materialized view % does not exist.', matview;
END IF;

EXECUTE 'DELETE FROM ' || matview;
EXECUTE 'INSERT INTO ' || matview
|| ' SELECT * FROM ' || entry.v_name;

UPDATE matviews
SET last_refresh=CURRENT_TIMESTAMP
WHERE mv_name=matview;

RETURN;
END
$BODY$
LANGUAGE 'plpgsql' VOLATILE SECURITY DEFINER
COST 100;
ALTER FUNCTION refresh_matview(name) OWNER TO postgres;


Udah lengkap nih fungsi-fungsi materialized view peta untuk Postgisnya.

So sekarang implementasinya:
Saya gunakan:
viewmap1, untuk judul peta view dan
map1, untuk judul peta permanen.
4326, sebagai kode SRID untuk peta basisdata yang memiliki proyeksi Derajat Desimal.

Bila materialized view peta baru pertama kali dibuat, maka peta membutuhkan struktur tabel yang sama dengan peta view, maka gunakan perintah:

SELECT create_matview_map('map1','viewmap1',4326);

Bilamana hanya ingin merefresh peta terhadap perubahan nilai data pada peta view, dapat digunakan perintah:
SELECT refresh_matview('map1');

Bilamana terjadi perubahan struktur peta view, misalnya ada perubahan syntax query dari peta view, dapat digunakan perintah:
-- hapus peta permanen
SELECT drop_matview_map('map1');

-- buat peta permanen dengan struktur peta view terbaru
SELECT create_matview_map('map1','viewmap1',4326);


Untuk menghapus materialized view peta secara permanen dapat digunakan perintah:
SELECT drop_matview_map('map1');


That's all folks. Silahkan modifikasi sesukanya, so far ini yang Saya gunakan untuk menangani 30-an layer peta. 15 diantaranya adalah peta dinamis yang perlu diupdate secara harian/bulanan/tahunan.

Untuk Materialized View yang khusus format table alphanumerik (bukan peta) dapat menuju artikel ttg materialized view or snapshot.
Dimana artikel tersebut menjadi dasar tulisan map materialized view ini.

Sebagai komparasi dengan oracle dapat dibaca lewat artikel materialized view pada Oracle, yang ternyata fungsi tersebut built-in.

Best regards
[irmant]

Labels: ,


Sunday, January 25, 2009

Nilai Median pada Postgres

Nilai median sering kali digunakan dalam perhitungan statistik. Kalo dalam database PostgreSQL 8.3, fungsi penghitung nilai median ini perlu ditambahkan secara manual. Caranya adalah menambahkan SQL function syntax sebagai berikut:

CREATE OR REPLACE FUNCTION array_median(anyarray)
RETURNS anyelement AS
$$
SELECT CASE
WHEN array_upper($1,1) = 0 THEN null
WHEN mod(array_upper($1,1),2) = 1 THEN asorted[ceiling(array_upper(asorted,1)/2.0)]
ELSE ((asorted[ceiling(array_upper(asorted,1)/2.0)] + asorted[ceiling(array_upper(asorted,1)/2.0)+1])/2.0) END
FROM (SELECT ARRAY(SELECT ($1)[n] FROM
generate_series(1, array_upper($1, 1)) AS n
WHERE ($1)[n] IS NOT NULL
ORDER BY ($1)[n]
) As asorted) As foo ;
$$
LANGUAGE 'sql' IMMUTABLE;

CREATE AGGREGATE median(anyelement) (
SFUNC=array_append,
STYPE=anyarray,
FINALFUNC=array_median
);

Cara panggilnya adalah sebagai berikut:

SELECT median(columnname) FROM tablename;

Kalo mo dibandingin sama nilai lain gunakan perintah:

SELECT median(columnname), avg(columnname), sum(columnname), max(columnname), min(columnname) FROM tablename;

Simple and very usefull ;;)
Source: dari sini

Labels:


Monday, January 12, 2009

Could not load file or assembly dan ILMerge

Salah Satu kendala yang mungkin muncul bilamana kita membuat turunan Dynamic Link Library (DLL) dari DLL lain adalah munculnya penyakit 'klasik' ASP.NET yaitu could not load file or assembly (CNLFOA). Artinya, DLL yang terkait dengan error tersebut tidak ditemukan, padahal kita telah menempatkannya dalam direktori BIN atau root. Dikatakan bahwa metode ini tidak berjalan pada beberapa system environment, tetapi yang mengherankan masalah ini terkadang muncul dadakan, kadang hilang sendiri, dst pada environment yang sama bahkan dari sebuah website yang sudah live 2 tahun. Kenapa saya katakan klasik, hal ini disebabkan karena penyakit ini belum sembuh total meski sudah berlangsung sejak VS 2005 hingga VS 2008SP1 yang paling baru.

Ini sudah menghabiskan hampir sebulan sebelum akhirnya saya tanya sama yg buat DLL tersebut. Saya telah mencoba banyak saran dari internet dan gagal maning gagal maning. Mungkin terlalu telat bertanya ke prinsipal, tapi saya akui saya emang newbie di ASP.NET 2008 dan biasa bermain sebagai seorang copy paste programming :D. Masalah CNLFOA ini membuat saya belajar banyak tentang windows form yang dimainkan pada web, Global Assembly Cache, struktur Web.Config, Il-Merge, strong name, console Visual Studio, dst. Saya baru tau juga, ternyata belum tentu masalah CNLFOA ini dialami oleh orang2 yang bermain dengan .NET > 2th.

Balik lagi ke solusinya. Salah satu solusi yang saya dapatkan dan ingin saya sharing adalah menggabungkan beberapa DLL, termasuk DLL yang tidak ditemukan tersebut kedalam satu DLL baru. Dengan demikian maka DLL baru tersebut telah berisi DLL class yang 'hilang' ketika menjalankan web tersebut.
Tools termudah untuk menggabungkannya adalah menggunakan ILMerge-GUI.

Tools ini jauh lebih mudah penggunaannya daripada IL-Merge.exe yang musti diketik di console Visual Studio. Selain itu, tools ini memudahkan kita untuk menempelkan stongname key, dari sebuah DLL tanpa strongname, sehingga DLL bisa kita taruh di GAC sehingga dapat digunakan oleh bebarapa aplikasi web pada server yang sama.

Selamat mencoba.
[irmant]

Labels:


Friday, January 09, 2009

TableView Peta pada Postgis

Peta dalam postgresql bisa dimungkinkan karena skema database postgresql telah mendukung data geometri yang berupa titik, garis, poligon, multi-garis, multi-poligon, dan multi-titik.
Sehingga, ketika kita membuat table view yang merupakan hasil join sembarang tabel, ditambah sebuah tabel yang memiliki kolom bertipe geometry, kemudian terhubung melalui kolom refensi yang sama, maka tabel tersebut memungkinkan untuk ditayangkan dalam bentuk peta.
Contohnya adalah script berikut, yang akan membuat view "tabelpeta_join", terdiri dari tabel bergeometri berjudul "tabel_peta", dijoin dengan
tabel biasa berjudul "tabel_data", berdasarkan ID_2008, maka kalimat querynya adalah:

CREATE OR REPLACE VIEW tabelpeta_join AS SELECT p.*, b.uid
FROM tabel_peta p
LEFT JOIN tabel_data d
ON (p.id_2008=d.id_2008);

Nah meskipun query berjalan sukses tanpa error, ditandai kalimat
Query result in 50ms,
bukan berarti table view "tabelpeta_join" dapat langsung diakses dari aplikasi GIS.

Hal ini disebabkan karena file geometri tersebut belum terdaftar pada tabel daftar data spasial-nya postgis.
Tabel daftar data spatial postgis bernama "geometry_columns". Tabel ini mengatur berbagai referensi proyeksi, kolom geometri, SRID, dari sebuah tabel.

So, table view "tabelpeta_join" tadi musti didaftarkan dulu ke tabel tersebut dengan perintah umum:

INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name,
f_geometry_column, coord_dimension, srid, type) VALUES ('', 'public', 'tabelpeta_join', 'geometry', 2, 4326, 'GEOMETRY');


Bagi yang penasaran kode 2 merupakan kode referensi dimensi koordinat, dan kode 4326
merupakan kode SRID untuk proyeksi Latitude/Longitude atau derajat desimal.

Berikut adalah tahapan untuk membuat tabel peta permanen bukan view.
CREATE TABLE namatabel
AS select sum(td_2008,td_2008) as TD_2008 from prod;

--1. PRIMARY KEY:
ALTER TABLE namatabel
ADD CONSTRAINT namatabel_pkey PRIMARY KEY(gid);

--2. Tambahkan NDIMS:
ALTER TABLE namatabel
ADD CONSTRAINT enforce_dims_geometry CHECK (ndims(geometry) = 2);

--3. Tambahkan SRID:

ALTER TABLE namatabel
ADD CONSTRAINT enforce_srid_geometry CHECK (srid(geometry) = 4326);

--4. Buat index:
CREATE INDEX namatabel_geometry_sidx
ON namatabel USING gist (geometry);

--5. Daftarkan pada geometry columns:
INSERT INTO geometry_columns (f_table_catalog, f_table_schema, f_table_name,
f_geometry_column, coord_dimension, srid, type) VALUES ('', 'public', 'namatabel',
'geometry', 2, 4326, 'GEOMETRY');


Selamat mencoba,
Irmant

Labels: ,


Thursday, December 11, 2008

Pengukuran Dimensi Peta dalam Postgis

Geodatabase sudah semakin keren dan canggih dewasa ini. Peta-peta sekarang udah banyak tersimpan di geodatabase, dibandingkan penyimpanan secara terpisah per file yang membuat redundan data. Padahal banyak peta-peta yang sifatnya confidential. Berikut adalah komparasi antar beberapa geodatabase, postgis, SQLServer 2008, dan MySQL di sini.

Sesudah peta masuk ke dalam postgis misal lewat tools shp2pgsql. Pertanyaan selanjutnya biasanya berkutat pada di pengukuran dimensi, selain perhitungan2 spasial lain. Function yang disiapkan postgis buanyak. Diawali dengan code ST_*, misal untuk menghitung luas area
menggunakan function ST_area, menghitung panjang menggunakan ST_length, dst.

Nah yang jadi pertanyaan klasik adalah, kok nilai perhitungan areanya keliru?
Misal perintah SQL-nya:
SELECT blok, st_area(geometry)/10000 as hectares
FROM areal order by blok asc
Menghasilkan luas per blok:
R1: 2.513432432
R2: 1.3432566549
dst...
Nilai luas ini keliru, setelah dibandingkan dengan hasil perhitungan software mapping.

Nah ini yang menjadi pertanyaan klasik, dan jawabannya terletak pada proyeksi peta yang kita masukkan dalam geodatabase.

Peta di Indonesia ada 4 macam proyeksi:
1. proyeksi lokal (asal gambar dari peta kertas tanpa koordinat),
2. proyeksi Derajat Desimal
3. Proyeksi Universal Transverse Mercantor (UTM)
4. Proyeksi TM3

Untuk peta proyeksi lokal yang biasanya satuan meter, ya ukuran luasnya dijamin pas, karena dimensinya tanpa melibatkan proyeksi muka bumi proj4. Sementara kalo kita inputnya peta derajat desimal, outputnya keliru, kenapa? Karena output proyeksi derajat desimal adalah derajat, bukan meter.

Padahal yang pengen dikeluarkan adalah satuan meter/km/hektar... ya tho ya tho...

Untuk melakukan pengubahan satuan ini kita perlu tau aturan main geodatabase postgis. Yaitu perlunya dilibatkan yang namanya SRID (Spatial Reference Identification).
Kongkretnya gini untuk peta shapefile berproyeksi derajat desimal memiliki kode SRID = 4236.
Sementara untuk UTM, dibagi kedalam 2 bagian satuan 6 derajat:
- zone x north.
- zone x south.
Zone x indonesia umumnya dari zone 46- hingga zone 54.

Kode SRID untuk UTM bisa dilihat begini:
north: 326
south: 327
Zonanya mengikuti bro:

So misalnya peta tersebut yang ada pada UTM zona 49S, brati kode SRID-nya:
327 (kode south) + 49 (zona 49) = 32749.
Misal UTM zona 47N brati kode SRID-nya
326 (kode north) + 49 (zona 49) = 32647.

Sesudah Anda memahami fakta ini, maka selanjutnya adalah mengganti perintah SQL perhitungan luas ini dari koordinat derajat desimal dengan output derajat:
SELECT blok, st_area(geometry)/10000 as hectares
FROM areal order by blok asc
menjadi proyeksi UTM zona 49s dengan satuan dimensi meter:
SELECT blok, st_area(st_transform(geometry, 32749))/10000 as hectares
FROM areal order by blok asc

Outputnya:
R1: 31.5991234 hektar
R2: 45.1234322 hektar
dst... nahhhh ini baru beneerrr!

Selamat mencoba teman-teman... :D

Labels: ,


Monday, November 10, 2008

AJAX Tableless Div Pengganti Frame

AJAX udah diimplementasi pada banyak web, seperti: Yahoo, Gmail, adsense, dst.
Dengan menggunakan AJAX, ketika kita klik sesuatu link, image, atau apapun, halaman website tidak di-refresh seluruhnya melainkan hanya sebagian kecil panel saja. Misalnya hanya bagian iklan, hanya bagian panel kategori tema hiburan, bisnis, dst.
Dengan tidak ter-refreshnya seluruh halaman web itu membuat situs terasa lebih kenceng dan menarik. Termasuk juga mengurangi beban kanal jaringan.
Framing pada halaman web juga sudah mulai ditinggalkan, digantikan oleh borderless table atau tableless CSS. Nah pengisian isi materi dari website ini bisa dilakukan dengan memanggil halaman web lain menggunakan teknologi AJAX juga. Caranya:

Buat Javascript AJAX berikut dengan nama file pageframe.js:

/***********************************************
* Dynamic Ajax Content- © Dynamic Drive DHTML code library (www.dynamicdrive.com)
* This notice MUST stay intact for legal use
* Visit Dynamic Drive at http://www.dynamicdrive.com/ for full source code
***********************************************/
var loadedobjects=""
var rootdomain="http://"+window.location.hostname

function ajaxpage(url, containerid){
var page_request = false
if (window.XMLHttpRequest) // if Mozilla, Safari etc
page_request = new XMLHttpRequest()
else if (window.ActiveXObject){ // if IE
try {
page_request = new ActiveXObject("Msxml2.XMLHTTP")
}
catch (e){
try{
page_request = new ActiveXObject("Microsoft.XMLHTTP")
}
catch (e){}
}
}
else
return false
page_request.onreadystatechange=function(){
loadpage(page_request, containerid)
}
page_request.open('GET', url, true)
page_request.send(null)
}

function loadpage(page_request, containerid){
if (page_request.readyState == 4 && (page_request.status==200 ||
window.location.href.indexOf("http")==-1))
document.getElementById(containerid).innerHTML=page_request.responseText
}

Selanjutkan... eh selanjutnya...
Buat file index.html untuk memanggil halaman utamanya.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
<HEAD>
<TITLE> AJAX HTML TO DIV </TITLE>
<SCRIPT LANGUAGE="JavaScript" src="pageframe.js"></SCRIPT>
</HEAD>
<BODY>
<div id="leftcolumn">
<li>
<a href="javascript:ajaxpage('anotherpage.html', 'rcol');">Test html to div</a>
</li>
</div>
<div id="rcol"></div>
</BODY>
</HTML>

Perhatian pada bagian:
  • <SCRIPT LANGUAGE="JavaScript" src="pageframe.js"></SCRIPT> digunakan untuk memanggil javascript pageframe.js.

  • <a href="javascript:ajaxpage('anotherpage.html', 'rcol');">Test html to div</a>, disitu keliatan tho kalo halaman web anotherpage.html, diisikan ke wadah bernama rcol.

  • <div id="rcol"></div> merupakan tempat penampung halaman web anotherpage.html yang diolah pageframe.js.


  • Buat file HTML anotherpage.html yang berisi halaman web yang akan dipanggil didalam halaman utama index.html:

    <html>
    <head>
    </head>
    <body>
    <!--Ini kode PHP lho-->
    <?php
    phpinfo();
    ?>

    <b>This content came from other page!</b>
    </body>
    </html>


    Perhatikan bagian daleman kodenya anotherpage.html, yaitu adanya kode PHP yang dipanggil ya tho...

    Selamat mencoba yah...

    Labels:


    Friday, September 12, 2008

    Lubang Joomla 1.55

    Gara-gara website temen ada yang kena sedikit deface, gw jadi meningkatkan kesadaran akan kemungkinan bolongnya website yang menggunakan CMS. Serangan yang disebabkan kelemahan salah satu file php CMS Joomla 1.55, ini serentak dilakukan pd banyak website pemerintah dan swasta Agustus 2008 lalu.

    Hanya berlaku pada joomla 1.55 yg blm di patch:
    cara ngetiknya pun simpel, cukup dari URL browser.

    http://www.alamattarget.com/index.php?option=com_user&view=***********=confirm


    Kalo kita isikan:
    Tanda kutip 1 (‘) dan tekan Enter

    Outputnya adalah:

    Tada!!!
    Brati passwordnya di reset dong…

    Solusinya...

    Buat admin yang websitenya pake joomla…
    Plis deh..., demi keselamatan bersama upgrade ke Joomla 1.5.6

    Antisipasi awal yang bisa dilakukan sebelum upgrade ke Joomla 1.5.6
    * Status user tertinggi di Joomla ada di Super Administrator, pilih status user lewat perintah, ngetiknya via linux terminal, ato pake phpmyadmin:
    select * from jos_users, pilih nama yang berstatus super administrator, misal admin
    * Update password admin ke nama user yang sampeyan tau.

    UPDATE jos_users SET password = MD5( 'Your Password' ) WHERE username = 'admin';

    * Antisipasi script kiddies yang bisa jadi udah melakukan deface website selagi admin belum upgrade ke joomla 1.56. Caranya adalah mengganti username level super administrator, sehingga meskipun reset dilakukan oleh script kiddies, yang akan mempersulit proses login.

    UPDATE jos_users SET username = ‘whatever’ WHERE username = 'admin';

    * Tracking si script kiddies dengan cara ngecek file access.log, cari aja tanggal percobaan login dengan kata kunci ‘login’, disebelahnya biasanya ada IP addressnya.

    Labels:


    Konversi C# ke VB di ASP.NET

    Seringkali programmer ASP.NET berbasis VB menemui tutorial yang menggunakan sourcecode berbasis C#. Dengan menggunakan tools ini, kendala beda bahasa program ini teratasi.
    So far soo goood...

    Download disini
    Tp kalo yang coding scr online bisa pake codechanger dari telerik

    Labels:


    Monday, June 30, 2008

    Sidejob belas kasihan

    Sidejob merupakan salah satu cara untuk menambah penghasilan. Semakin besarnya kebutuhan hidup dan tingginya harga memancing orang2 untuk mendapatkan dana segar.

    Sidejob yg menarik adalah ketika itu berhubungan dengan penyaluran hobi, misalnya orang yg hobi nyanyi kemudian nyanyi pesta perkawinan, acara seremonial, ngajar nyanyi buat anak2, dst. Selain hobinya tersalurkan, dapet duit lagi.

    Sidejob semakin menarik bilamana income yang diperoleh lebih gede daripada gaji. Penghasilan yang lebih dari 2 atau 3 kali lipat penghasilan rutin dalam sebulan tentunya sangat menggiurkan buat siapapun. Apalagi kalo sampe 20-30x lipat dari gaji. Misalnya kayak Tora Sudiro, awalnya niat ngelawak di extravaganza merupakan kerjaan sampingan. Berhubung penghasilan sidejob lebih gede akhirnya ya kerjaan sbg karyawan itu ditinggalkan.

    Sidejob menjadi tidak menarik kalo:
    - angka yg diperoleh mengecil dan terus mengecil. Ketika satpam sekolah merangkap jualan mie goreng didepan sekolah, tidak nemu-nemu pembeli yg cukup untuk menutup pembelian bahan makanan, ya mending pindah lokasi lain yang lebih strategis.
    - gaji/sidejob lain lebih menghasilkan, misal satpam mall karena senioritas kemudian naek pangkat jadi kepala satpam gaji naek 2 x lipat. Sementara income sidejob hanya 1/5 atau kurang dari gaji sebelumnya.
    - resiko sidejob itu tinggi. Misalnya manajer artis yg jd suplier ekstasi buat para artis binaannya, sementara dia sendiri udah tobat.

    Nah dari hal-hal yang tidak menarik itu, kok ya Saya mengalami ketidakmenarikan sidejob yang saya sebutkan itu secara bersamaan... dan akhirnya memunculkan sebuah spesimen baru sidejob bernama sidejob belas kasihan.


    Ada seorang teman yg menjanjikan sejumlah nilai bila Saya ikut dalam project X pembangunan aplikasi dalam sebuah departemen korup. Nilainya cukup fantastis buat sebuah model aplikasi, 2.8 miliar. Kerjaan ini dikerjakan di luar kantor, maka ini merupakan kerja sidejob ya kan. Fokus utama orang bekerja sidejob adalah sejumlah nilai yang disepakati dan dijanjikan, ditukar dengan tenaga dan hasil pemikiran. Sebagai programmer, tentunya saya perlu mengumpulkan orang dan memberikan rekomendasi-rekomendasi teknis terhadap kondisi dan situasi pembuatan aplikasi yang serba mepet waktunya sementara konten aplikasinya semakin membesar. Sayangnya, saran-saran yang saya berikan tidak digubris dan setiap rekomendasi diganti dengan yang lebih murah. Akhirnya kerjaan itu babak bundas dan masuk dalam kategori kerjaan tidak selesai. Temen saya terlalu takjub melihat angka miliaran itu masuk ke rekeningnya, padahal itu nilai untuk mengerjakan project bukan nilai untuk masuk kantong pribadi. Akhirnya dia menjadi monster korup serakah yang gelap mata. Sejumlah nilai project yang menjadi hak orang-orang yang terlibat dalam project X dia tilep: kantornya sendiri (yang berujung pemecatan), donatur project, departemen korup, teman-teman teknisnya termasuk saya tentunya. Hebatnya dia dengan cuek melakoni itu semua seperti tanpa dosa dan tanpa malu. Nah teman-teman yang ditilep duitnya dan dapet nilai yang tidak seberapa itu akhirnya maju didepan jadi bemper. Soalnya kalo mereka ikutan melarikan diri dari project X ini, maka semua akan terkena dampaknya.

    Sidejob ini jelas tidak menarik lagi, karena faktor2 yang saya tulis sebelumnya yaitu, angka yang mengecil, gaji/sidejob lain yang lebih menarik, dan resiko yang semakin tinggi.
    - Angka yg dijanjikan tidak mengecil sih, tetapi kalo janji surga pelunasan nilai teknis yang muncul itu yang berat ya tho apalagi dapat informasi dia udah kehabisan cash untuk membayar yang seharusnya diterima tim saya.
    - Dari kantor saya dapet kenaikan gaji, ini tidak ada hubungannya dengan project sidejob yang saya jalani, tetapi sedikit banyak membuat saya berpikir sejenak untuk tidak bermain sidejob. Sementara teman saya yang juga ikut sidejob project X, dengan mudah menemukan sidejob lain meski gaji dia tidak naik.
    - Resiko sidejob tersebut semakin tinggi, karena dalam sidejob project X ini terjadi tindak pidana korupsi dan penipuan, sementara monster korup ini melarikan diri dari tanggung jawab, otomatis saya sama sekali tidak tertarik untuk memperbaiki situasi.

    Sidejob ini berubah menjadi sidejob belas kasihan. Sidejob spesimen baru yang rada-rada aneh untuk dilakoni. Gak dapet nilai yang dijanjikan tapi di'paksa' untuk tetap mengerjakan bagian yang menjadi tanggung jawabnya. hahahaha.
    Kasian kalo sampe ngeliat pimpro yang ketakutan diperiksa KPK, kasian sama nasib orang-orang yang belum dibayar, kasian sama aplikasi yang terbengkalai, kasian sama orang yang terus berusaha bertahan ditengah gelombang caci-maki yang terus menerus padahal bukan kita yang melakukan, kasian sama departemen korup yang akan jadi bahan pemeriksaan, dst.

    Lha gimana lagi, maju kena, mundur kasian.
    Kalo dari saran-saran yang saya dapat ketika saya bercerita ke teman-teman yang menghadapi masalah sidejob ini, ada dua kategori, yaitu:
    gak usah ikut sidejob belas kasihan, dengan alasan:
    - rugi waktu, tenaga, dan finansial
    - fokuslah kedalam kerjaan yang sudah pasti
    - goblok amat lu
    - saat yang tepat membela bangsa dan negara Indonesia dengan melaporkan tindakan korupsi... wekekekeke

    terus ikut dalam sidejob belas kasihan, dengan alasan:
    - ini merupakan ajang pendewasaan diri
    - iming-iming sidejob lain
    - kasihan dong sama kita-kita (selain teknikal yah).
    - ancaman yang disampaikan secara halus bahwa kesalahan kerjaan tidak selesai gara-gara teknikal.

    Hmmmmmm
    , ancaman halus itu sempat menarik perhatian saya, gile aje, gw kerja pontang panting baru dibayar dengan nilai jauh dibawah zakat maal nilai project masih diancem-ancem lagi. ckckckckck. Tapi disinilah pembelajaran buat saya pribadi, supaya gak terpancing provokasi ancaman-ancaman. Maka itu sebagai orang IT ya saya memanfaatkan situasi, kondisi, toleransi, pandangan, dan jangkauan (singkatan jaman SD) yang saya miliki. Ya kalo bola pingpong masih diarea lawan ya jangan lakukan gerakan smash, ntar yang kena smash cuman angin. Kalo wajah petinju belum cukup dekat untuk dihajar, ya jangan maen pukul, ntar cuman mukul angin. Tunggu tanggal mainnya, yang jelas gestur, arah dan sudut gerak lawan udah terekam... :D

    Labels: ,


    Wednesday, June 25, 2008

    Cegah Virus Lokal

    Satu hal yang paling menjengkelkan kalo lagi pelatihan yang melibatkan banyak orang adalah ketika kita menghadapi VIRUS LOKAL. Materi pelatihan yang butuh pertukaran data antar peserta, dan paling cepat yaitu menggunakan flashdisk, akhirnya saling menulari. Kalo laptop yang dibawa peserta cuman 3-5 sih gak masalah ya meski cukup menjengkelkan, nah kalo yang bawa 20 orang lebih? bisa seharian ngurusin scanning virus tok.

    Virus lokal yang menyebar lewat flashdisk, itu biasanya bekerja dengan cara memanfaatkan fasilitas autorun MS Windows. Normalnya ketika colok ke USB, autorun MS Windows akan mendeteksi dan menayangkan setup aplikasi. Proses penayangan ini setup aplikasi ini kalo digantikan oleh virus maka virus akan bekerja menginfeksi PC/laptop. Antivirus bajakan seperti AVG, Norton, Mcafee terkadang kesulitan menghadapi virus lokal yang udah kadung masuk di dalem. Virus hilang, tapi menyisakan masalah thd komputer, misal lambat, hang heng, dst. Pake antivirus lokal PCMAV scanningnya lama dan biasane wong-wong males melakukannya kecuali udah kena dan punya waktu senggang.

    Saya kasih solusi pencegahan yg simpel dan menurut saya lumayan efektif, terutama yg menggunakan windows XP Proffesional Edition.
    1. jangan gunakan PC/laptop yang merupakan jaman bit, tulis tangan nang kertas balik ke jaman atom.... wakakakkakaka
    2. matikan fasilitas autorun DVD/CD/flashdisk.

    Cara mematikan fasilitas autorun:

    1. klik Start > run > lalu ketik: gpedit.msc dan enter.

    2. masuk ke menu Local computer policy > Computer Configuration > Administrative Templates > System > Turnoff autoplay, set ke Enabled to All Drives.
    3. masuk ke menu Local computer policy > User Configuration > Administrative Templates > System > Turnoff autoplay, set ke Enabled to All Drives.

    4. restart komputer

    Autorun CD/DVD/flashdisk mati sudah.

    [irmant]

    Labels:


    Thursday, April 24, 2008

    SRID dan MySQL problem

    Perintah berikut ditujukan untuk menghitung distance obyek garis (Linestring) yang disimpan dalam kolom geometry 'G' pada tabel GEOM.
    Acuan kodenya adalah perintah LineFromText(wkt[,srid])
    dimana wkt merupakan obyek geometri dalam format WKT/WKB.
    dan kode SRID merupakan kode Spatial Reference ID.

    Gw coba perintah ini:

    SELECT GLength(LineFromText(asText(g), 4236)) FROM geom LIMIT 0, 30
    outputnya: 
    0.012685477748776
    0.0087030137100028


    SELECT GLength(LineFromText(asText(g), 1)) FROM geom LIMIT 0, 30
    outputnya:
    0.012685477748776
    0.0087030137100028

    Liat dua hasil output di atas, nilai outputnya sama kan...

    Pdhl saya sudah memberikan kode SRID yang berbeda, dimana kode '1' itu kode SRID sesuai tabel spatial_ref_sys. Yang '4236' merupakan kode EPSG WGS 1984. Meski menggunakan MySQL seri 5.xx tyt perhitungan jarak/luas/dimensi/perimeter
    mengacu pada planar coordinate system TIDAK mengacu pada kode EPSG/SRID.

    Sesuai kalimat yang ditulis dlm manualnya:
    Its SRID, or Spatial Reference Identifier. This value identifies the geometry's associated Spatial Reference System that describes the coordinate space in which the geometry object is defined.
    In MySQL, the
    SRID value is just an integer associated with the geometry value. All calculations are done assuming Euclidean (planar) geometry. Its coordinates in its Spatial Reference System, represented as double-precision (eight-byte) numbers. All non-empty geometries include at least one pair of (X,Y) coordinates. Empty geometries contain no coordinates.
    Coordinates are related to the SRID. For example, in different coordinate systems, the distance between two objects may differ even when objects have the same coordinates, because the distance on the planar coordinate system and the distance on the geocentric system (coordinates on the Earth's surface) are different things.


    Pantesan Mapserver supportnya ke Postgis, SRID itu menjadi kata kunci akurasi proyeksi. Yah... kita tunggu saja kelanjutan perkembangan mysql spatial :D

    Labels: ,


    Wednesday, March 12, 2008

    Parsing username in joomla/mambo wrapper

    Wrapper merupakan suatu cara buat CMS, bisa menghubungkan diri dengan halaman web yang dibuat diluar aplikasi CMS. Link wrapper bersifat diluar CMS sehingga parsing antar keduanya membutuhkan sedikit modifikasi terhadap setting wrapper dari aplikasi tersebut.

    Dah bbrp hari ngutak utik mambo 4.5.2 yang saya pake, akhirnya ketemu juga :D:D:D


    Langkah yg saya buat sebagai berikut:
    1. Buat file PHP sederhana yang akan menampung informasi username dari login CMS. Disini saya membuat file tersebut dengan nama mytest.php didalemnya berisi kode PHP sebagai berikut:

    $myparam=$_GET['param'];
    echo $myparam;

    2. Kemudian buat menu yang menghubungkan file mytest.php tersebut menggunakan wrapper option, dan tambahkan alamat URL seperti di bawah:
    http://localhost/mysite/mytest.php?param=$namex
    dari alamat URL tersebut $namex digunakan untuk menampung parameter username mambo/joomla hasil login.

    3. Berikutnya adalah modifikasi file wrapper.php yang ada di dalam direktori components\com_wrapper\wrapper.php,

    Pertama, tambahkan global $my yang menampung parameter login mambo/joomla, seperti kode berikut.
    bla bla
    function showWrap( $option ) {
    global $database, $Itemid, $mainframe, $my;
    bla bla

    Berikutnya cek kode file wrapper.php tersebut, sampe ketemu kode berikut:
    $url = $params->def( 'url', '' );
    Dibawahnya persis tambahkan kode:
    $url = str_replace('$namex',$my->username, $url);
    kode tersebut akan mengganti alamat URL $namex dengan username dari login mambo/joomla.

    4. save file wrapper.php dan test link wrapper tersebut via web!

    [irmant]

    Insipirasi:
    http://www.mambers.com/mambo-4-5-1-general-talk/18979-need-pass-user-details-wrapper.html

    Labels:


    Monday, November 26, 2007

    Aplikasi Maksa

    Seorang operator bertugas mengisi data kepegawaian kantornya dalam format ms excel.
    Gara-gara si bos minta akhir bulan ini laporan itu musti selesai, sangikin dulu gara-gara si operator jadi sering masuk angin akut. Akhir bulan selesailah data tersebut terisi semua, rapi dalam format excel. Bosnya hanya manggut-manggut, setelah dapet laporan tersebut. Baghusss... baghuussss....

    Seminggu kemudian seorang sales masuk keruangan bosnya menawarkan software data kepegawaian. Ini software cuanggih pak bisa buat report otomatis, bapak mo bulanan/triwulanan/semester/taunan lgs jadi pak.
    Terus ada fitur foto-fotonya, bisa langsung nongol pegawe bapak dilayar monitor
    print juga serba otomatis
    bla-bla-bla-bla
    dan si bos pun setujuh.


    Setelah software terbeli, operator diajarin mengentri data oleh teknikal software tersebut.
    Betapa kecewanya si operator, puluhan hari yang dia jalanin mengentri data lewat excel tiba-tiba
    diminta entri ulang data yang sama persisssss....
    dengan alasan:
    - tugas lu kan emang ngisi data itu.
    - kan ini software canggih nggak kayak laporan excel yg lu buat
    - gw kan lebih pinter daripada elu
    bla-bla-bla

    Kebayang kan? kalo ita disuruh mengerjakan sesuatu yang sama sampe 2 kali dengan alasan yg absurd dan naif. Gimana kalo tyt ada kebutuhan dari bagian kepegawaian utk membangun aplikasi untuk tema cuti misalnya, sementara data usernya sama. Satu sama lain tidak bisa saling bermigrasi. Harapan supaya data tidak redundan ala spreadsheet, malah jadi redundan gara2 programmer yang memaksakan 'kecuanggihan'.

    Bbrp kali saya ngeliat ekspresi manyun, diem marah, nyengir kuda, mencibir, ketawa operator yang saya pancing dengan pertanyaan
    Bapak-bapak yang terkhormat... sapa yang mau entri ulaaaannnggg ?!!!

    Programmer yang buat aplikasi 'maksa' gitu buaannyyyak....
    Saya terus terang pernah juga buat yg seperti itu, pasalnya tim saya nggak diberi akses utk ketemu user langsung, bahkan pelatihan aplikasi yg saya buat pun saya gak dikabarin, alias ngerti2 rampung dan terima bayaran.

    Jangan salah, programmer juga ngalemin hal yang sama. Sebagai contoh adalah migrasi bahasa program sebuah aplikasi dari ms visual studio 2003 ke ms visual studio 2005.
    Tyt converter visual studio dari microsoft yang diklaim bisa konversi 90% yg diberikan bicara laen, yg berhasil dikonvert hanya 20%,
    sisanya ya... koding ulang. Sementara microsoft sebentar lagi mengeluarkan release ms visual studio 2007 yang katanya kodingnya musti diubah lagi dengan alasan lebih canggih dan powerfull.

    Ini mah bukan powerfull tp ngasih masalah spy orang tidak beranjak lebih maju.

    Mengganti software itu berbicara mengubah kebiasaan lama ke kebiasaan baru.
    Kemudian juga diberi kemudahan untuk migrasi ke sistem kita dong. Minimal dibantuin lah convert database to database.
    Canggih-canggih tapi buat apa kalo usernya bete terus memilih ke format aplikasi lama, dan akhirnya aplikasi kita terpuruk masih dalam kotak boksnya.

    Labels:


    Wednesday, July 04, 2007

    download videonya Youtube

    Mo download videonya Youtube?
    Gampang...

    Misalnya yah, kita interest sama videoklip 'kucing garong'

    [geleng-geleng mode ON]
    Kelakuan si kucing garong
    Ora kena ndeleng sing mlesnong
    Main sikat main embat Apa sing liwat
    ** Kelakuan si kucing garong
    Selalu ngulati sasaran
    Asal ndeleng pepesan
    Wajah brangasan...


    [geleng-geleng mode OFF]

    So yang perlu dilakukan adalah mengisikan kata kunci
    dengan kata kunci 'kucing garong' pada bagian search bar www.youtube.com (paling atas).

    Diantara sekian video klip hasil pencarian, kita pilih salah satu video, terus klik.

    Anda akan mendapatkan bagian alamat situs: http://www.youtube.com/watch?v=sZ-RsUI8Z6U

    Paste alamat dalam bagian search bar di http://www.keepvid.com
    Tinggal klik tombol donwload.


    [irmant]

    Labels:


    Thursday, June 14, 2007

    Gimana Memilih laptop?

    Banyak yang minta rekomendasi tentang laptop yang akan dibeli pada saya.
    Misalnya tentang kisaran budget, berbagai jenis merk, jenis prosesor, sistem operasi, dst.

    Saya sih biasanya akan memandunya lewat 2 pertanyaan.
    1. budget berapa?
    2. butuhnya buat apa?

    Pertanyaan pertama menuntun pengguna untuk mendapatkan laptop sesuai spesifikasi yang diajukan dari pertanyaan sebelumnya.
    Ingat! pada laptop, budget besar Tidak selalu spesifikasinya juga hi-end. Nah budget kecil bukan berarti sampeyan akan mendapatkan laptop spek rendah.

    Bicara budget:
    Paling gampang dibagi dalam 3 kelas:
    kurang dr 5jt, budget minimal utk bicara demand,
    5 - 15 jt, budget ideal utk bicara demand dan prestise,
    lebih dr 15 jt, bicara prestise dan selera gitu loh.

    Pertanyaan kedua biasanya menggambarkan aktifitas yang paling sering dihadapi ketika berhadapan dengan komputer. Jawaban pertanyaan ke pengguna itu tentu beragam, maka jawaban saya pun beragam.

    Panduan sederhana untuk memilih laptop adalah:
    - Tatap layar laptop itu dari berbagai sudut kemiringan. Bila anda merasa nyaman, brati laptop itulah yang dipilih.

    Kenapa layarnya? karena aktifitas berlaptop-ria ini terjadi pada layarnya, dan anda akan mengamati layar itu berjam-jam. Piranti keras yang lain, performancenya beda-beda tipis, apalagi produk processornya berasal dari vendor yang dominan, yaitu Intel dan AMD. Contoh kasus fungsi ukuran layar misalnya, anda seorang programmer, tentunya kalo berukuran layar kecil akan meletihkan mata ketika mengamati baris-baris koding. Begitu juga graphic designer, banyak gambar yang musti ditampilkan dalam satu waktu, sehingga butuh layar yang besar.

    - selanjutnya adalah Anda rasakan panas disekitar keyboard. Panas yang dihasilkan oleh bodi laptop itu pengaruh terhadap kenyamanan anda mengetik. Bodi laptop yang kecil dan kompak biasanya memiliki pengaturan aliran panas prosesor ke berbagai celah bodi. Bila Anda baru menyalakan sebentar terasa panas dan kurang nyaman, ya jangan di beli. Paling enak sih perbandingan ini dilakukan pada pajangan laptop di pameran komputer.

    - berat dan dimensi laptop. Berat laptop ini dipengaruhi oleh aktifitas selama menggunakan laptop. Kalo Anda sering mobile, ya mending pilih yang ringan. Biasanya vendor laptop hanya memberikan gambaran berat laptop, misal 1.5kg, nah yang tidak dijelaskan bahwa beratnya itu musti ditambahkan chargernya yang bisa nambah beban antara 1/2 - 1kg lagi. Belum lagi bobot tas, entah berupa tas jinjing maupun ransel. Jadi total-total tas plus laptopnya minimum 2.5 kilogram.

    - kecepatan waktu proses laptop dan performa laptop. Kemajuan teknologi yang ditawarkan oleh para vendor laptop itu hanya beda-beda tipis, karena paket seri laptop yang ditawarkan oleh vendor itu, tergantung dari beberapa komponen yang similar. Itulah yang perlu Anda pelajari disini.

    Ditilik dari processornya
    Vendor prosessor laptop yang dominan di dunia yaitu Intel, AMD, dan VIA. Intel menjadi vendor yang memberikan harga paling menarik dibandingkan vendor lain. Apalagi mereka juga menelorkan ide whitenotebook yang menguntungkan bagi pabrikan laptop di dunia, sehingga penetrasi otak laptop ini sangat dominan di Tanah Air.
    Berhubung otak laptop pabrikannya seragam, maka anda tidak perlu kawatir apakah itu celeron, dothan, core duo, core2 duo dst.
    Meski itu menawarkan harga yang cukup jauh antara otak processor celeron dengan core2 duo, tapi menilik kecepatan waktu proses sebenernya beda-beda tipis. Kongkretnya, ketika anda ditawarkan laptop dengan spesifikasi processor core2duo, tapi dengan cache 2MB, yang sama dengan processor core duo, buat apa? Misalnya anda ditawarkan core duo tapi tanpa anda cek lebih lanjut ternyata L2 cachenya cuman 1 megabyte, ini mah 'celeron-nya' core duo.

    Belum lagi vendor-vendor software yang memanfaatkan teknologi inti ganda masih sedikit. Inti ganda prosesor yang tidak dimanfaatkan oleh sebuah aplikasi, otomatis juga hanya menggunakan satu inti prosesor, so berasanya beda tipis banget antar prosesor.

    Selain performa prosesor, perlu Anda perhatikan pula bahwa voltase yang digunakan oleh prosesor berpengaruh terhadap suhu laptop. Ada seri prosesor intel ULV-Ultra Low Voltage yang diklaim memiliki suhu rendah dibandingkan seri prosesor intel lain. Konsumsi daya prosesor yang rendah, maka mengurangi suhu laptop.

    Ditilik dari harddisk
    Ukuran harddisk
    Harddisk sebagai media penyimpan data, rata-rata berukuran puluhan gigabyte. So jangan kuatir untuk kehabisan, kecuali Anda sering kopi film atau MP3 atau sering bermain data-data besar dalam laptop. Seorang teman yang jarang dengerin lagu, punya laptop yang berisi aplikasi, koding, tulisan, dan foto-foto jepretan kamera digital, dengan harddisk kapasitas 80GB masih menyisakan space kosong 30GB, padahal laptopnya udah dipakai 2 tahunan lebih.

    pengaruh kecepatan putar cakram harddisk
    Nah pada laptop, harddisk laptop itu punya putaran cakram rata-rata 5400rpm, jadi hanya 2/3 kecepatan harddisk PC yang rata-rata 7200rpm. Bahkan untuk laptop tahun lawas masih menggunakan harddisk dengan 4200rpm.

    Saya ibaratkan antara prosesor dengan rpm harddisk itu seperti siswa dengan petugas perpustakaan. Semakin cepat buku yang diminta siswa ditemukan oleh petugas perpustakaan, ya brati semakin cepat juga siswa tersebut membuat resume terhadap buku. Sejenius apapun siswa kalo petugas perpustakaannya lambat menemukan buku tersebut, ya lambat juga mengolah buku menjadi resume.

    So jangan heran kalo ketika Anda mengeksekusi sebuah program pada komputer PC (pada kecepatan processor yang sama dengan laptop) akan terasa lebih cepat dibandingkan waktu eksekusi pada laptop. Karena harddisk tidak memberikan informasi secepat prosesor menterjemahkan informasi tersebut.

    Ditilik dari RAM
    Pengalaman saya sih, program Windows XP professional butuh ram efektif sekitar 300MB, supaya aplikasi terasa lancar dan nyaman, selain dari kapasitas harddisk kosong minimal 1 giga yah. Mungkin buat windows Vista ram efektifnya meningkat jadi 1 GB.

    Jangan minder buat yang mo beli laptop second, tambahkan ramnya saja akan terasa peningkatan speednya. RAM sangat dibutuhkan bagi aplikasi yang membutuhkan kalkulasi matematis. Contohnya pada aplikasi yang mengolah data grafis (Adobe Photoshop, Coreldraw, dst), ram sangat pengaruh. Besarnya ram dapat dikatakan selaras dengan kecepatan proses data grafis. Contohnya ram 1GB bisa memproses 2 x lebih cepat dibandingkan ram 512MB.

    Ditilik dari bodi.
    Jaman dulu itu bodi laptop masih pake campuran besi dan plastik. Sehingga bodi itu sebagai media yang menghantarkan elektrik statis juga. Nah sekarang itu laptop didominasi dari bahan plastik keras atau polyetilen. So, sangat jarang anda kena strum gara-gara bodi laptop. Ada pula bodi yang ngetrend pada kelas2 laptop high end yaitu menggunakan bahan titanium. Bedanya ya kalo kebanting mungkin lebih keras yah :D

    Ditilik dari VGAcard
    Menilik dari VGAcard, biasanya laptop itu menggunakan shared memori. Artinya, memori RAM digunakan oleh VGAcard untuk membantu proses pengolahan data grafis. Ini akan mengurangi jumlah memori yang ada pada memori RAM. Saat ini produk2 VGA pengaruh sekali ke harga yang ditawarkan vendor.

    - spesifikasi lain
    Card reader. Biasanya alat ini digunakan untuk mentransfer data-data dari memori card ke komputer dan sebaliknya. Dengan demikian, Anda bisa langsung mentransfer data dari dan ke alat-alat elektronik seperti kamera digital, handphone, MP3 player, dst.

    Slot USB
    Hampir semua alat elektronik membutuhkan tipe slot ini. Entah printer, scanner, kamera digital, handycam, MP3 player, dst.

    Wifi
    Intel centrino sejak generasi dothan telah mengintegrasikan Wifi dalam paket processornya, jadi rata-rata laptop baru bisa wifi. Nah kalo laptop 2nd, bisa membeli Wifi terpisah yang biasanya berbentuk USB, seharga 200-300rb. Jangan lupa pilih wifi yang mendukung tipe data G yang mencapai transfer rate 54MBps. Misal pada brosur spesifikasi laptop tertulis: Wifi 8211 a/b/g.

    Infrared
    Infrared ini dulu menjadi 'menu' wajib laptop lawas, tapi belakangan ini sudah mulai menghilang pada laptop generasi baru. Jaman sudah berganti menjadi wifi dan bluetooth.

    Bluetooth
    Bluetooth biasanya digunakan untuk menghubungkan laptop dengan media yang biasanya pake bluetooth, biasanya adanya pada handphone. Nah selanjutnya terserah mau diarahkan menjadi modem, LAN, fax, dst tergantung kebutuhan.

    Finger print
    Finger print ini digunakan sebagai sandi kunci pengguna laptop. Hanya orang-orang yang sandi jarinya sesuai yang dapat menjalankan laptop tersebut.

    Paralel port
    Bilamana Anda masih memiliki printer lawas yang menggunakan slot paralel, sebaiknya anda pikir-pikir untuk menjual PC anda dan menggantikannya dengan laptop baru. Biasanya slot paralel ini sudah hilang pada laptop baru, sedangkan pada PC tidak masalah.

    Anti water-spill
    Anti water-spill ini merupakan fitur yang memungkinkan laptop menangani air yang jatuh pada permukaan keyboardnya tanpa merusak komponen didalamnya. Bahkan ada yang bisa mengalirkan air tumpahan tersebut keluar dari bawah laptop.

    Shock-absorber
    Ini teknologi yang menjaga eksistensi data dalam harddisk ketika laptop terjatuh. Dulu pameran Komtek di Jakarta tahun 2006 pernah didemonstrasikan laptop Lenovo yang secara sengaja dijatuhkan dari meja, hanya blank sebentar layarnya kemudian laptop bisa jalan normal kembali. Sebenernya shock ini menjaga head harddisk supaya dalam posisi nol ketika ada goncangan. Pergeseran head ini biasanya akan menyebabkan harddisk rusak dan tak bisa lagi dibaca.

    Firewire
    Tipe slot ini biasanya dibutuhkan pada alat elektronik handycam dan video transfer lain. Transfer rate firewire lebih cepat dari USB, biasanya data video yang ditransfer melalui firewire lebih bagus kualitasnya dibanding USB.

    Nah sekarang bicara pabrik pembuatan laptop.
    Anda mungkin lebih familiar dengan merk laptop Toshiba, Acer, IBM, dst. Perlu Anda sadari kalo pabrikan pembuat laptop itu ada tiga yang besar yaitu Compal, Asus, dan Quanta. Nama pabrik yang mungkin anda jarang denger, tapi sesungguhnya mereka yang merakit laptop Anda. Vendor2 brand itu menyerahkan cetak birunya ke pabrik tersebut, untuk dijadikan laptop yang mungkin anda hadapi saat ini.

    Labels: