Jom datang beramai-ramai!
Selamat datang. Blog ini mengandungi penulisan dan bahan rujukan berkaitan pengaturcaraan dan penyelidikan yang ingin saya kongsi dengan anda. Semoga bermanfaat. (Nota: Selain teks rumi, blog ini turut mengandungi teks jawi bahasa Melayu)
Friday, April 20, 2018
Wednesday, April 18, 2018
Tutorial - Menggunakan JFreeChart untuk simulasi penjadualan proses
Pengenalan JFreeChart
JFreeChart ialah pustaka kod sumber terbuka (open source) yang dibangunkan oleh David Gilbert sejak tahun 2000. Pustaka ini boleh diperoleh dan digunakan secara percuma (tetapi perlu menyatakan hakcipta pemilik/pencipta asal).
Fungsi pustaka ini ialah untuk membolehkan pengatur cara menghasilkan carta melalui atur cara Java. Contoh-contoh carta yang boleh dihasilkan oleh pustaka ini boleh dirujuk di laman JFreeChart.org. Antaranya termasuklah seperti yang dipaparkan di bawah:
sumber: JFreeChart.org
Tutorial - membina carta Gantt untuk simulasi penjadualan proses.
Tutorial ini bertujuan menunjukkan cara-cara menggunakan JFreeChart dalam aturcara Java untuk membina aplikasi simulasi penjadualan proses.
Contoh aplikasi yang ditunjukkan dalam tutorial ini ialah aplikasi simulasi penjadualan proses untuk penggunaan CPU (Central Processing Unit, atau Unit Pemprosesan Pusat). Aplikasi simulasi ini akan membentuk 5 proses yang akan dijadualkan (untuk menggunakan 'CPU') menggunakan algoritma Round-Robin. Hasil simulasi penjadualan akan ditunjukkan seperti dalam gambarajah di bawah, yang mengandungi 1 tetingkap untuk memaparkan carta Gantt, dan maklumat terperinci dipaparkan dalam paparan konsol (console).
Tutorial ini melibatkan tiga peringkat berikut:
- Memasukkan pustaka JFreeChart dalam projek
- Memasukkan panggilan pustaka JFreeChart yang asas ke dalam atur cara Java
- Membina aplikasi simulasi penjadualan
.
Peringkat 1: Memasukkan pustaka JFreeChart dalam projek.
Untuk menggunakan pustaka JFreeChart, kita boleh mendapatkan kod sumber sepenuhnya dan kemudian mengkompilnya ke dalam bentuk fail JAR (Java ARchive). Walau bagaimanapun kita boleh terus mendapatkan fail JAR yang sudah siap dikompil, kemudian memasukkannya ke dalam projek aplikasi Java yang kita bina.
Untuk tutorial ini, kita perlukan dua fail JAR berikut :
- jCommon.jar
- jFreeChart.jar
Versi terkini fail-fail ini boleh dimuat turun dari laman web JFreeChart.org.
Berikut ialah langkah memasukkan fail JAR ke dalam projek (IDE Netbeans):
- Langkah 1: Muat turun dan letakkan fail-fail JAR tersebut ke dalam sebuah folder/direktori.
- Langkah 2: Buka tetapan (setting) projek, dengan klik butang kanan pada nama projek dan pilih Properties (merujuk 'Project Properties').
- Langkah 3: Dalam tetingkap dialog yang muncul, klik Libraries, dan pilih tab Compile. Tekan butang Add JAR/folder dan cari semula folder yang mengandungi fail-fail JAR yang sudah dimuat turun.
.
Peringkat 2: Memasukkan panggilan pustaka JFreeChart yang asas dalam atur cara Java.
Nota : JFreeChart menggunakan pustaka Java Swing, iaitu salah satu platform atau pustaka GUI bagi Java. Diandaikan anda tahu cara-cara menggunakan Java Swing. Jika tidak tahu, anda perlu belajar dahulu cara menggunakan Java Swing.
Untuk memahami konsep JFreeChart, kita akan bina satu aplikasi asas menggunakan JFreeChart. Dalam aplikasi asas ini, kita membina sebuah kelas JFrame (kelas dari Java Swing) dan memaparkan sebuah carta Gantt di dalamnya.
Umumnya, untuk membina carta Gantt menggunakan JFreeChart,
- Kita perlu sediakan satu siri data menggunakan kelas TaskSeries, dan dimasukkan ke dalam sebuah koleksi dari kelas TaskSeriesCollection (IntervalCategoryDataset ialah super-kelas kepada kelas ini).
...
private IntervalCategoryDataset buildChartDataset() {
// Bina beberapa siri data
TaskSeries series = new TaskSeries("Data Series 1");
Task t1 = new Task("T1", new SimpleTimePeriod( 0, 100 ));
series.add( t1 );
Task t2 = new Task("T2", new SimpleTimePeriod( 110, 180 ));
series.add( t2 );
Task t3 = new Task("T3", new SimpleTimePeriod( 180, 220 ));
series.add( t3 );
TaskSeriesCollection dataset = new TaskSeriesCollection();
dataset.add(series);
return dataset;
}
... - Set data ini akan kita jadikan ke dalam bentuk carta menggunakan metod dari kelas statik ChartFactory.createGanttChart(). Metod ini menghasilkan sebuah objek dari jenis kelas JFreeChart.
...
public TestChart(String title) {
super(title);
// Bina data set untuk carta
IntervalCategoryDataset dataset = buildChartDataset();
// Create chart
JFreeChart chart = ChartFactory.createGanttChart(
"Simple Gantt Chart", // Tajuk
"Task", // Label Y-Axis
"Timeline", // Label X-Axis
dataset);
// set x-axis range supaya bermula dengan 0
( chart.getCategoryPlot() ).setRangeAxis(new NumberAxis());
... - Objek carta yang terhasil dari metod statik ChartFactory.createGanttChart() perlu dimasukkan ke dalam sebuah container dari kelas JPanel. Container yang mengandungi carta akan dimasukkan ke dalam JFrame untuk dipaparkan.
...
ChartPanel panel = new ChartPanel(chart); // tambah ke dalam panel
setContentPane(panel); // paparkan panel
...
Atur cara di bawah menunjukkan keseluruhan atur cara yang menggunakan langkah-langkah yang dinyatakan ini.
Peringkat 3: Membina aplikasi simulasi penjadualan.
Setelah mengetahui bagaimana hendak membina carta menggunakan JFreeChart, kita gabungkan kemudahan ini untuk membina simulasi penjadualan proses.
Algoritma Penjadualan Proses
Penjadualan proses ialah antara tugas utama yang dijalankan oleh sistem pengoperasian (OS) dalam mengurus perlaksanaan atur cara dan program komputer. Penjadualan proses boleh dilakukan dengan menggunakan pelbagai jenis algoritma. Antara algoritma penjadualan proses yang asas ialah First-come-first-serve (FCFS), Round-Robin (RR), Shortest-Job-First (SJF) dan Priority-based. Kod atur cara berikut ialah sebahagian atur cara yang mengandungi implementasi algoritma RR (Lihat kod atur cara penuh dipaparkan di bawahnya):
...
private Process[] simulateRR(Process[] pt, int quantum)
{
// RR-queue, to manage the round-robin scheduling
class RRQItem {
public Process process;
public int remaining;
public int stopped;
}
Queue<RRQItem> rrQ = new LinkedList(); // Round-Robin queue
int clk_tick = 0; // reset clk_tick int cpu_tick = 0; // timer for running process
boolean cpu_idle = true; // if not idle, then CPU is busy
int totDone = 0;
while(totDone < pt.length) {
// is it time to execute (submit to queue) ?
for(int p=0; p < pt.length; p++ ) {
if (clk_tick == pt[p].arrivalTime) {
// put inside RR-queue
RRQItem item = new RRQItem();
item.process = pt[p];
item.remaining = pt[p].burstTime;
item.stopped = pt[p].arrivalTime;
rrQ.add(item);
}
}
if(!cpu_idle) {
cpu_tick--; // deplete cpu burst time
if(cpu_tick <= 0) { // if timeout
// remove currently running process
RRQItem running = rrQ.remove();
cpu_idle = true;
if(running.remaining > 0) { // if not yet finish
running.stopped = clk_tick; // record when this process
// is stopped
running.process.numOfTimesStopped++; // record stoppage
// count
rrQ.add(running); // put back into queue
} else {
// process finish, calculate turnaround time
running.process.turnaroundTime =
clk_tick - running.process.arrivalTime;
totDone++;
}
}
}
// if CPU idle, and no process is running
if(cpu_idle) {
// submit next remaining process in queue
if(!rrQ.isEmpty()) {
RRQItem front = rrQ.peek(); // check who is at
// the front of Q
if(front.process.startTime < 0) { // record the first
// time process start
front.process.startTime = clk_tick; // record starting
// time
}
front.process.waitingTime += clk_tick - front.stopped;
// submit and set for how long is the execution time
cpu_idle = false;
cpu_tick = (front.remaining >= quantum ? quantum :
front.remaining);
Process part = new Process( "" + front.process.id + "_" +
front.process.subtask.size(), cpu_tick, clk_tick);
part.startTime = clk_tick;
// record waiting time for this part
part.waitingTime = clk_tick - front.stopped;
// add new part (sub-process)
front.process.subtask.add( part );
// update remaining time for this process
front.remaining -= cpu_tick;
}
}
clk_tick++; // update clk_tick
}
return pt;
}
...
|
Simulasi Penjadualan Proses
Berikut ialah atur cara penuh Java yang digunakan untuk menghasilkan simulasi penjadualan proses menggunakan algoritma Round-Robin.
Output yang dipaparkan daripada aplikasi simulasi penjadualan proses:
Saturday, June 03, 2017
Zaum - bahasa emosi
Istilah zaum, merujuk kepada eksperimen linguistik dalam simbolisme bunyi dan penciptaan bahasa oleh penyajak 'futuris' empayar-Rusia seperti Velimir Khlebnikov dan Aleksei Kruchenykh. Istilah zaum ini diilhamkan oleh Kruchenykh, yang menggabungkan dua prefiks dalam bahasa Rusia iaitu za- (melampaui, di belakang) dan um- (minda, nous=kebijaksanaan), yang membawa maksud bahasa rentas-rasional dan tidak mempunyai maksud yang khusus (wikipedia-zaum)
Istilah ini belum pernah saya dengar sebelum ini. Saya cuba membayangkan sekiranya wujud bahasa sebegini (yakni dianggap sebagai suatu bentuk bahasa) bagaimana hendak menjelaskan maknanya kerana bahasa itu sendiri direka untuk tidak merujuk kepada makna yang khusus? Zaum dikatakan bukan menjelaskan simbol atau makna sebaliknya bahasa emosi. Ulasan ke atas karya penulisan Franco Berardi juga menarik kerana mengaitkan potensi zaum dengan aplikasi telepati dan alam maya (virtual reality).
Wikipedia. URL- https://en.wikipedia.org/wiki/Zaum. Dirujuk pada 3 Jun 2017.
Universiti - tempat mendidik atau menghukum?
Hukuman tembak ke atas pesalah jenayah. Jangan jadikan universiti sebagai tempat menghukum pelajar
(Sumber foto : internet)
(Sumber foto : internet)
Amnya apabila seseorang mendaftar ke universiti yang merupakan sebuah institusi pendidikan, sekurang-kurangnya seseorang itu perlu ada matlamat untuk menimba ilmu berkaitan bidang yang diminati atau ingin diceburi. Misalnya kalau seseorang mendaftar ke dalam bidang pengajian sains komputer, antara kemahiran yang ingin (perlu) dipelajari ialah kemahiran pengaturcaraan komputer. Maka apabila tamat pengajiannya selepas 3-4 tahun, pelajar tersebut sepatutnya sudah mahir atau tahu tentang cara mengaturcara komputer. Justeru apabila seseorang belajar di universiti maka dia sepatutnya ada niat dan matlamat ingin jadi orang yang mahir atau pandai dalam bidang yang diceburinya.
Apakah cara menentukan sama ada seseorang itu sudah mahir atau pandai? Untuk menilai hal ini, maka perlu dilakukan proses penilaian. Apakah matlamat proses penilaian? Penilaian bermatlamat untuk menilai sama ada pelajar tersebut sudah mencapai tahap yang sepatutnya ataupun belum. Sekiranya pelajar BERJAYA melepasi tahap minimum, pelajar ini dianggap SUDAH mahir dalam topik yang dipelajarinya. Jika GAGAL melepasi tahap minimum pelajar ini dianggap BELUM mencapai tahap mahir, justeru dia perlu mengulang semula proses pembelajaran dan ujian sehinggalah dia berjaya mencapai atau melepasi tahap minimum yang ditetapkan. Jika pelajar masih gagal dan tidak sanggup meneruskan (mengulang) pengajiannya, maka dia boleh berhenti dan mencuba di tempat lain.
Sebagai sebuah institusi pendidikan, universiti perlu melaksanakan proses pembelajaran dan penilaian untuk memastikan setiap individu yang belajar di universiti ini mahir dalam bidang yang dipelajari. Universiti seharusnya memberi ruang dan peluang kepada pelajar untuk menjadi seorang individu yang mahir dan pandai apabila bergraduat kelak. Maka dengan cara ini tercapailah matlamat individu tersebut datang dan belajar di universiti iaitu untuk menjadi mahir dan pandai. Universiti seharusnya menjadi tempat untuk belajar sesuatu, dan tidak sepatutnya menjadi institusi untuk menghukum orang. Jika tidak, ibaratnya universiti sama seperti institusi pemulihan dan penjara.
Bagaimana yang dikatakan universiti itu boleh menjadi tempat menghukum?
Pertamanya dalam konteks pembelajaran. Manusia ada pelbagai sifat dan tahap kemahiran. Ada sesetengah orang yang cepat mempelajari sesuatu. Ada sesetengahnya pula lambat atau perlu melalui proses ulangan (mungkin banyak kali) sebelum faham sesuatu. Tidak dinafikan, pasti akan ada individu yang menghadapi masalah untuk mempelajari sesuatu dan mungkin tidak mampu langsung memahami apa yang dipelajari. Justeru sebagai sebuah institusi pembelajaran, proses pembelajaran di universiti perlu mengambilkira perbezaan kemampuan penguasaan pelajar. Suasana pembelajaran yang fleksibel perlu diberikan supaya pelajar boleh memilih proses pembelajaran yang sesuai dengan tahap penguasaan masing-masing.
Malangnya dalam konteks ini, ada sesetengah universiti yang memaksa pelajar melalui satu bentuk proses pembelajaran saja. Proses pembelajaran yang rigid dan tidak fleksibel ini memaksa pelajar menerima apa saja yang diberikan. Kemudian pengajar pula tidak menawarkan bantuan perbincangan dan sebagainya. Ini bukan saja satu bentuk kongkongan kepada kebebasan pelajar untuk memilih bahkan tidak menjamin pelajar akan dapat memahami apa yang dipelajari. Ini sekaligus meningkatkan risiko stress dan tekanan kepada emosi pelajar, dan seterusnya meningkatkan lagi halangan kepada pelajar untuk belajar. Jadi kalau pelajar rasa susah, tidak seronok dan menderita untuk belajar, bukankah ini sudah jadi satu bentuk hukuman?
Keduanya ialah dalam konteks penilaian. Ujian penilaian dan peperiksaan digunakan sebagai satu cara menilai tahap penguasaan pelajar pada satu-satu masa. Misalnya di hujung semester, pelajar akan dinilai dengan peperiksaan akhir untuk menentukan pelajar sudah mahir dalam ilmu yang diajar dalam suatu kursus bagi semester tersebut. Ujian penilaian ini menggunakan kaedah penilaian tertentu, amnya menggunakan soalan yang digubal oleh pengajar dan perlu dijawab oleh pelajar dalam tempoh masa yang ditetapkan.
Di sini dapat dilihat terdapat pelbagai faktor kekangan dan had bagi ujian penilaian. Antaranya faktor bentuk soalan, iaitu bentuk soalan itu belum tentu benar-benar mencapai piawaian. Ada soalan-soalan yang digunakan sukar difahami oleh pelajar, mengandungi kesilapan yang terlepas pandang sewaktu semakan, tidak mencapai tahap sepatutnya, dsb. Ada pengajar yang tidak mempunyai pengalaman dan belum mampu untuk membentuk soalan penilaian yang tepat.
Masa menjawab soalan pula perlu sesuai dengan proses menjawab. Ada soalan yang perlu dibaca dengan teliti untuk difahami. Kemudian memerlukan masa untuk menulis jawabannya. Kalau pelajar boleh cepat faham soalan, maka banyaklah masa untuk menulis jawaban. Tetapi kalau masa yang panjang diperlukan untuk memahami soalan, maka sudah kurang masa yang ada untuk menulis jawaban. Proses menjawab soalan, jika berdasarkan model oleh Ayesha Ahmed dan Politt (1999) perlu melalui 6 peringkat - (0) pengetahuan mata pelajaran, (1) kefahaman soalan, (2) mencari pengetahuan mata pelajaran, (3) memadankan perwakilan soalan dengan pengetahuan mata pelajaran, (4) menjana jawapan, dan yang terakhir (5) menulis jawapan. Jika berdasarkan model ini, ada 6 peringkat yang perlu diselesaikan untuk menulis jawaban bagi setiap soalan dalam ujian penilaian! [*1]
Masa menjawab soalan pula perlu sesuai dengan proses menjawab. Ada soalan yang perlu dibaca dengan teliti untuk difahami. Kemudian memerlukan masa untuk menulis jawabannya. Kalau pelajar boleh cepat faham soalan, maka banyaklah masa untuk menulis jawaban. Tetapi kalau masa yang panjang diperlukan untuk memahami soalan, maka sudah kurang masa yang ada untuk menulis jawaban. Proses menjawab soalan, jika berdasarkan model oleh Ayesha Ahmed dan Politt (1999) perlu melalui 6 peringkat - (0) pengetahuan mata pelajaran, (1) kefahaman soalan, (2) mencari pengetahuan mata pelajaran, (3) memadankan perwakilan soalan dengan pengetahuan mata pelajaran, (4) menjana jawapan, dan yang terakhir (5) menulis jawapan. Jika berdasarkan model ini, ada 6 peringkat yang perlu diselesaikan untuk menulis jawaban bagi setiap soalan dalam ujian penilaian! [*1]
Bahkan lebih mendukacitakan lagi sistem penilaian kita pula menggunakan gred - A, B, C, D, F (kenapa tiada E?). Jika A, pelajar dikategorikan cemerlang, B = pencapaian baik, C = memuaskan, D = lulus. F pula gagal. Beza antara D dan F mungkin jelas. Lulus atau gagal. Namun persoalan yang perlu ditanyakan, apakah perbezaan kemahiran antara pelajar yang mencapai A dengan B? Bagaimana pula beza C dengan D? Adakah perbezaan ini relevan? Adakah soalan-soalan penilaian kita itu benar-benar dapat mengkelaskan pelajar ke dalam kategori cemerlang, pencapaian baik, memuaskan dan sekadar lulus? Tetapi budaya masyarakat kita akan melihat A itu ialah satu-satunya pencapaian yang LULUS. Jika tak dapat A, tetap dianggap gagal. Bukankah ini satu hukuman? Dan lebih malang jika hukuman itu tidak setimpal dengan kesilapan yang dibuat (cth. tidak sempat menulis jawaban kerana masa singkat).
Jika diambil kira bahawa proses penilaian itu sendiri dipengaruhi oleh pelbagai faktor luaran selain penguasaan pelajar terhadap topik, maka adalah tidak wajar sekiranya penilaian penguasaan pelajar hanya dibuat berdasarkan keputusan proses penilaian semata-mata. Namun itulah yang sedang berlaku dalam universiti pada hari ini.
Justeru kita perlu pastikan bahawa proses pembelajaran dan penilaian itu tidak menjadikan universiti sebagai tempat menghukum dengan mengelakkan menjatuhkan hukuman yang tidak adil kepada pelajar. Sebaliknya 2 proses tersebut seharusnya dijadikan saluran untuk membentuk pelajar supaya sentiasa bersemangat untuk menimba ilmu dan memanfaatkan potensi yang diri sebaik mungkin agar pelajar dapat membentuk pengetahuan dan kemahiran yang diperlukan atau diingininya.
Dalam perbincangan di atas, saya hanya fokus di universiti kerana saya juga terlibat (dan tak mustahil turut menyumbang kepada masalahnya, muhasabah...). Namun saya yakin hal ini boleh berlaku di institusi pendidikan lain termasuk di peringkat prasekolah dan sekolah. Misalnya Foo Lay Kuan, et al. (2015) turut menyenaraikan masalah berkaitan menjawab peperiksaan yang dihadapi di peringkat sekolah menengah. Justeru eloklah kalau dapat direnungkan bersama agar kita tak tersalah menghukum.
Jika diambil kira bahawa proses penilaian itu sendiri dipengaruhi oleh pelbagai faktor luaran selain penguasaan pelajar terhadap topik, maka adalah tidak wajar sekiranya penilaian penguasaan pelajar hanya dibuat berdasarkan keputusan proses penilaian semata-mata. Namun itulah yang sedang berlaku dalam universiti pada hari ini.
Dalam perbincangan di atas, saya hanya fokus di universiti kerana saya juga terlibat (dan tak mustahil turut menyumbang kepada masalahnya, muhasabah...). Namun saya yakin hal ini boleh berlaku di institusi pendidikan lain termasuk di peringkat prasekolah dan sekolah. Misalnya Foo Lay Kuan, et al. (2015) turut menyenaraikan masalah berkaitan menjawab peperiksaan yang dihadapi di peringkat sekolah menengah. Justeru eloklah kalau dapat direnungkan bersama agar kita tak tersalah menghukum.
----
Nota kaki:
[*1] Model ini juga digunakan untuk menilai tahap kesukaran murid menjawab soalan ujian literasi sains sekolah menengah. Rujuk Foo Lay Kuan, et al. (2015).
Rujukan:
Ayesha Ahmed & Politt A. (1999) Curriculum demands and question difficulty. Paper presented at the International Association for Educational Assessment, Bled, Slovania.
Foo Lay Kuan, S. Balasubramaniam, Chin Phoi Ching, Yeoh Poh Choo, Parvinder Singh Amar Singh (2015) Kesukaran murid menjawab soalan ujian literasi sains sekolah menengah. IPG Kampus P. Pinang, Penang.
Friday, August 05, 2016
Node.js - pelayan web berasaskan bahasa Javascript
Pelayan web (web server) ialah perisian yang digunakan pada komputer pelayan web. Pelayan web amnya berperanan memberi khidmat melayani permintaan berasaskan HTTP (dokumen web, servis dan aplikasi web, dsb.). Misalnya jika kita cuba mengakses sesuatu dokumen atau aplikasi di internet menggunakan pelayar web (browser), pelayar akan mengemukakan permintaan HTTP kepada pelayan web yang berada di lokasi dalam URL (misalnya permintaan URL "http://www.google.com/page" akan ditujukan kepada pelayan web di www.google.com), dan maklumbalas daripada pelayan akan dihantar semula kepada pelayar.
Antara pelayan web yang popular ialah Apache, Tomcat dan IIS. Kini satu lagi pelayan telahpun mendapat perhatian pembangun aplikasi dan servis web iaitu Node.js (atau Node). Node merupakan pelayan web yang melaksanakan aplikasi web berasaskan Javascript. Berbanding dengan pelayan web lain, Node melaksanakan aplikasi web yang ditulis dengan menggunakan bahasa Javascript. Sebelum adanya Node, Javascript hanya digunakan untuk paparan di pelayar web dan interaksi masa-nyata menggunakan AJAX (asynchronous javascript, satu lagi teknologi web berasaskan Javascript). Berbeza dengan AJAX, Node membolehkan aplikasi web dibina sepenuhnya menggunakan Javascript dan berasaskan callback. Teknologi callback ini lebih mengurangkan beban pada pelayan web, khususnya semasa melayan permintaan web yang terlalu banyak.
Sekiranya ingin menggunakan teknologi Node, pembangun disaran menggunakan gabungan beberapa teknologi berasaskan Javascript, antaranya 'stack' MEAN - Mongodb + Express.js + Angular.js + Node.js. Mongodb atau Mongoose.js ialah enjin pengendali pangkalan data berasaskan dokumen yang mengendalikan permintaan berasaskan sintaks Javascript. Express.js pula ialah framework mudah untuk membangunkan pakej aplikasi web berasaskan Node. Manakala Angular.js pula ialah framework untuk membina antaramuka pengguna menggunakan Javascript.
Semua teknologi MEAN adalah percuma dan berasaskan kod terbuka (open source). Semua teknologi tersebut boleh dimuatturun melalui laman web masing-masing:
Mongodb : https://www.mongodb.com/
Mongodb : https://www.mongodb.com/
Express.js : https://expressjs.com/
Angular.js : https://angularjs.org/
Node.js : https://nodejs.org/en/
Subscribe to:
Posts (Atom)
-
Sumber : PRPM DBP - Kamus Dewan Edisi Empat Muat turun - (Komp) tindakan memindahkan fail dr stesen komputer utama ke stesen komputer pe...
-
Saya ni bukanlah pakar sangat dalam penyelidikan. Tapi saya ada la sikit ilmu dan pengalaman yang boleh saya kongsikan berkaitan hal ini....









