Pages

Showing posts with label coding. Show all posts
Showing posts with label coding. Show all posts

Friday, November 01, 2019

Implimentasi pustaka Taburan Custom Nombor Rawak menggunakan Java

Menjana nombor rawak dengan Math.random()

Pustaka bahasa pengaturcaraan Java menyediakan fungsi/metod Math.random() untuk menjana nombor rawak dalam atur cara. Metod ini akan menjana nilai dalam julat 0 hingga 1, dan nilai ini boleh digunakan untuk menjana nombor tertentu dalam julat tertentu.

Misalnya kod atur cara berikut menjana 5 nombor rawak dalam julat 0 hingga 9 :

for(int i = 0; i < 5; i++) {
    System.out.println((int)(Math.random() * 10));
}



Manakala dengan menambah 1, seperti berikut, boleh mendapatkan 5 nombor dalam julat 1 hingga 10 :

for(int i = 0; i < 5; i++) {
     System.out.println((int)(Math.random() * 10 + 1)); 
}

Kita juga boleh menjana nombor rawak dalam julat 'min' dan 'max' yang kita sendiri tetapkan. Misalnya contoh berikut menjana nombor rawak dalam lingkungan 5 hingga 9:

int min = 5;
int max = 9;
for(int i = 0; i < 5; i++) {
    System.out.println((int)(Math.random() * (max-min+1)) + min)); 
}

Menjana nombor rawak dengan taburan custom

Kebarangkalian bagi nombor dalam julat di atas untuk muncul/dipilih, secara amnya ialah sama rata, iaitu 1/N bagi setiap nombor (Misalnya julat 1 hingga 10, N=10, maka 1/10 = 0.1 bagi 1, 1/10 = 0.1 bagi 2, dan seterusnya sehingga 10).

Tapi bagaimana kita boleh menjana nombor rawak dalam julat 1 hingga 10 dengan pemberat tertentu, misalnya 50% percubaan (kebarangkalian 0.5, atau 1/2) mendapat nombor 4? Atau menetapkan 20% balingan dadu akan kena pada nombor 6? Bagaimana kita hendak menggunakan Math.random() untuk menjana nombor rawak berdasarkan pemberat/kebarangkalian yang ditetapkan? Pustaka Java yang asas ini tidak menyediakannya.

Saya cuba mencari implimentasi sedia ada, dan terjumpa perbincangan mengenainya di sini -> https://stackoverflow.com/questions/16435639/generating-random-integers-within-range-with-a-probability-distribution

Daripada perbincangan tersebut, saya mendapat idea untuk mengimplimentasi suatu kelas pustaka sendiri (dinamakan CustomProbabilityRandom), yang membolehkan seseorang pengatur cara menjana nombor rawak mengikut kebarangkalian tertentu. (Lihat senarai kod atur cara dalam fail CustomProbabilityRandom.java di bawah. Turut disertakan contoh aplikasi untuk cara menggunakan pustaka, iaitu fail ExampleCustomDistribution.java).

Dengan menggunakan kelas ini, agak mudah untuk menetapkan taburan kebarangkalian bagi suatu senarai item-item (nombor rawak yang dijana mewakili index bagi item dalam senarai).

Sebenarnya implimentasi ini tidaklah benar-benar menghasilkan nombor rawak mengikut taburan yang ditetapkan, tetapi hanya boleh menghampiri taburan tersebut. Namun diharap dengan implimentasi ini akan memudahkan anda membina aplikasi yang melibatkan nombor rawak dengan lebih fleksibel. Untuk mengkompil kod atur cara aplikasi dalam ExampleCustomDistribution.java, anda perlu kompil bersama-sama dengan fail pustaka CustomProbabilityRandom.java.

Selamat mencuba.




Fail 'CustomProbabilityRandom.java' (pustaka)





Fail 'ExampleCustomDistribution.java' (aplikasi)





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, 

  1. 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;
        }
    ...
  2. 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());  
    ...
  3. 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.


Output daripada atur cara ini ialah seperti berikut:





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:



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/


Thursday, August 01, 2013

Pengaturcaraan C/C++ dengan IDE Eclipse (Kepler)


Secara default, Eclipse digunakan untuk bina aplikasi Java. Tapi sebenarnya IDE ni boleh digunakan untuk beberapa bahasa pengaturcaraan lain. Antaranya C/C++.

Berikut ialah panduan ringkas bagaimana nak mulakan aktiviti pengaturcaraan C++ dengan IDE Eclipse (Kepler).

Mula-mula kena muat turun IDE Eclipse dan pasang. (Untuk laksanakan aplikasi Eclipse perlu ada JRE - Java Run-time Environment. Kalau belum ada, kena muat turun dulu daripada laman web Oracle. Sekarang dah versi 7.*)

Juga pastikan ada pakej pengkompil C++ sebab Eclipse cuma sediakan persekitaran penyuntingan. (Kalau belum ada boleh muat pakej yang percuma, antaranya gcc. Untuk Windows boleh guna pakej MinGW)

Laksanakan Eclipse.

Sekarang muat turun Add-on C/C++ Development Tools SDK. Caranya,

  1. Dalam aplikasi Eclipse, cari menu Help > Install new software ... .
  2. Di ruangan Work with, pilih -All available sites-. Daripada senarai pakej yang muncul, cari Programming languages
  3. Tandakan pada checkbox C/C++ Development Tools SDK
  4. Klik butang Next.
Bila proses pemasangan dah selesai restart Eclipse (aplikasi akan tanya).

Tengok di bahagian atas sebelah kanan. Ada ikon 'C/C++'. Klik untuk guna 'perspektif' C/C++ (default ialah Java).

Bina projek C/C++ baharu.

Apabila projek baharu dah siap, jangan Build/Run dulu sebab tak keluar dalam tetingkap konsol.

Kena pasang run-time library dulu.

  1. Klik kanan pada nama projek (dalam Project Explorer). Pilih Properties (terbawah dalam menu).
  2. Klik pada C/C++ Build > Settings.
  3. Lihat pada senarai Settings sebelah kanan. Klik pada MinGW C++ linker > Miscellaneous.
  4. Taip flag options berikut pada ruangan Linker flags:   -static-libgcc -static-libstdc++
  5. Klik OK.

Bila dah selesai, boleh cuba Build/Run program C++ yang disediakan. Tengok sama ada output daripada arahan cout muncul pada tetingkap console pada bahagian bawah IDE.

Kadang-kadang bahagian console tu paparkan maklumat Build. Klik kanan pada ikon skrin monitor, dan pilih aplikasi C++ yang dilaksanakan tadi untuk tengok paparan outputnya.

Macamana? OK?

Susah? Ini kira dah senanglah berbanding kena cari sendiri semua maklumat ni.

Selamat mencuba!


Wednesday, October 31, 2012

Masalah menggunakan Perl sebaris dlm Windows

Penggunaan Perl sebaris (one-liner) dalam Windows amnya tidaklah rumit atau bermasalah. Tetapi ada masanya masalah tertentu akan timbul disebabkan peraturan-peraturan tertentu dalam prom arahan (command-prompt) Windows.

Contohnya, baru-baru ini saya terjumpa satu kaedah yang mencadangkan penggunaan pemboleh ubah persekitaran (environment variable) dalam Perl sebaris. Bagusnya kaedah ini ialah jika Perl sebaris kita terlalu panjang (untuk kod satu baris) tetapi kerap digunakan, kita boleh mengurangkan kerja menaip (andaikan kita tidak mahu guna fail batch). Contohnya bagi Perl sebaris berikut,
perl -ne  "print if /^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$/" file.txt
bukan saja hendak menulis, bahkan hendak menghafalnya pun sudah rumit. Maka kita boleh gunakan pemboleh ubah persekitaran. Arahan berikut membentuk satu pemboleh ubah baru bernama format_nombor :
set format_nombor="^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$"
(dwi-quot diperlukan kerana jika tidak ada, arahan SET tidak berjaya. Tapi masalah lain pula timbul, dan dibincangkan di bawah) Jadi sepatutnya saya boleh gunakan interpolasi nilai pemboleh ubah ke dalam arahan Perl sebaris seperti berikut, sekaligus memudahkan penulisan arahan Perl sebaris,
perl -ne  "print if /%format_nombor%/" file.txt
Malangnya ini tidak berjaya kerana Windows merungut dengan mesej berikut,
'[.][0-9]+)' is not recognized as an internal or external command, operable program or batch file.
Apa masalahnya? Masalahnya ialah hasil interpolasi tidak seperti yang dijangka! Lihat hasil di bawah ini:
perl -ne  "print if /"^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$"/" file.txt
Perhatikan sepasang dwi-quot yang terhasil dalam dwi-quot. Jadi Perl sebaris yang terhasil tidak sah! 

Masalah ini sebenarnya berpunca daripada nilai dalam %format_nombor% yang sudahpun mempunyai dwi-quot (boleh dilihat dengan arahan SET %format_nombor%). Maka bila diinterpolasi, dwi-quot itu akan turut serta sebagai sebahagian nilai pemboleh ubah. 

Untuk menyelesaikan masalah ini, dwi-quot itu perlu dibuang daripada nilai %format_nombor%. Hal ini mulanya memeningkan kerana dalam arahan SET dwi-quot itu diperlukan. Setelah puas mencari, rupa-rupanya arahan SET dengan dwi-quot itu boleh ditulis dengan cara lain. Caranya ialah seperti di bawah ini (kedudukan dwi-quot bermula sebelum nama pemboleh ubah, dan bukan setakat merangkumi nilai),
set "format_nombor=^[+-]?([0-9]+[.]?[0-9]*|[.][0-9]+)([eE][+-]?[0-9]+)?$"
Selepas menggunakan cara ini, dwi-quot sudah tidak ada dalam nilai %format_nombor% (boleh dipaparkan menggunakan arahan SET %format_nombor%). Maka apabila diinterpolasi sudah tidak ada masalah.
perl -ne  "print if /%format_nombor%/" file.txt
Maka setelah berjaya menemui kaedah ini, penggunaan Perl sebaris yang agak panjang dapat dipermudahkan.

Habis cerita.


Notakaki
  1. Kod Perl sebaris itu sebenarnya berfungsi mencari nombor-nombor yang sah (mengikut standard IEEE) dalam setiap baris fail input (fail.txt). Setiap nombor yang sah akan dipaparkan. Nombor hanya dikesan jika terdapat satu nombor dalam setiap baris.
  2. Untuk membuang pemboleh ubah yang kita isytiharkan, gunakan arahan SET tanpa nilai, seperti berikut,
  3. set format_nombor=
  4. Selain kaedah di atas, pemboleh ubah persekitaran bagi Windows sebenarnya boleh dibentuk/disunting melalui antaramuka GUI (klik kanan pada ikon My Computer->Properties. Cari tab Environment variables dan tambah pemboleh ubah dengan nilai yang diperlukan)

Menggunakan ekspresi regular dengan Perl

Kali ini saya ingin memperkatakan tentang satu lagi kelebihan bahasa pengaturcaraan Perl iaitu penggunaan ekspresi regularnya.

Ekspresi regular (regular expression) ialah notasi yang digunakan bagi menyatakan suatu corak atau susunan am aksara atau simbol. Misalnya 'yunus' untuk perkataan 'yunus', '\d+' menyatakan corak am suatu nombor ('\d' mewakili 1 digit, '\d+' mewakili 1 atau lebih digit). Asasnya ekspresi regular sangat berguna untuk proses mencari segolongan teks tertentu dalam suatu teks spt. mengesan kehadiran perkataan 'perl' dalam teks 'bahasa pengaturcaraan perl' (secara teknikalnya disebut mencari sub-rentetan dalam suatu rentetan), atau menentusahkan format tertentu bagi suatu teks (seperti format matawang, tarikh dll).

Perl menggunakan notasi yang dikenali sebagai PCRE (Perl-compatible regular expression), iaitu notasi ekspresi regular dengan simbol-simbol khas yang diperkenalkan dalam bahasa Perl. Sesetengahnya diterapkan oleh bahasa-bahasa pengaturcaraan lain. Amnya notasi ini memadankan aksara dengan aksara. Maknanya notasi 'Yunus' akan sepadan dengan teks 'Yunus'. Selain itu terdapat juga meta-aksara seperti '.', '*', '+', '[...]' dsb. Misalnya jika kita ingin mencari suatu teks yang hanya mengandungi digit-digit, kita boleh menggunakan ekspresi regular '\d+'; atau memadankan teks berformat tarikh dengan corak am '\d\d\/\d\d\/\d{4}'.

Berikut adalah sebahagian notasi PCRE dan maksudnya (untuk maklumat lanjut boleh rujuk tutorial PerlRE),
  • a-z = mewakili set huruf/simbol 'a' hingga 'z'
  • \d =  mewakili digit antara 0 hingga 9
  • \d+ = mewakili 1 atau lebih digit
  • . = 'dot', mewakili semua aksara
  • .+ = mewakili 1 atau lebih jujukan aksara selain daripada aksara penamat baris (newline)
dll.

Perl menyediakan kemudahan (dalam bentuk operator) yang membolehkan pengatur cara menggunakan ekspresi regular dalam atur cara. Operator-operator yang boleh digunakan ialah seperti berikut:
  • m/corak/ - m(atch) ialah operator yang digunakan bagi memadankan (mencari) corak dalam suatu rentetan. Misalnya,
if ($teks =~ m/foo/) {
    # buat sesuatu jika corak 'foo' dijumpai dalam $teks
}
  • s/corak/ganti/ - s(ubstitute) ialah operator yang digunakan bagi mencari padanan corak dan menggantikannya dengan teks gantian. Misalnya aturcara berikut akan mengubah $teks yang mengandungi rentetan 'fooyo' kepada 'ayoyo':
$teks = 'fooyo';
$teks =~ s/foo/ayo/;  # 'ayoyo'
  • tr/setA/setB/ - tr(ansliterate) ialah operator yang digunakan bagi memadankan susunan 'setA' dan menggantikannya dengan 'setB'. SetA dan setB mestilah jujukan huruf atau simbol. Misalnya aturcara berikut akan mengubah $teks yang mengandungi rentetan 'contoh' kepada 'CONTOH':
$teks =~ tr/a-z/A-Z/;

Aturcara berikut akan mengubah $teks yang mengubah rentetan 'contoh' kepada suatu 'teks sulit' (encrypted text) dan 'menyahkod'nya semula kepada bentuk asal:
$teks = 'contoh';
$teks =~ tr/a-z/zyxwvutsrqponmlkjihgfedcba/;  # 'xlmgls'
$teks =~ tr/zyxwvutsrqponmlkjihgfedcba/a-z/;  # 'contoh'
Selain operator ekspresi regular, ekspresi regular juga turut/boleh digunakan pada fungsi atau operator tertentu dalam Perl, misalnya operator grep { } dan split ().

Penggunaan dan kepentingan ekspresi regular sangat luas kerana ianya masih lagi dimaju dan dipertingkatkan. Begitu juga dengan aplikasinya dalam pengaturcaraan Perl mahupun bahasa pengaturcaraan yang lain. Sebagai pengatur cara, menguasai ekspresi regular dan keupayaan menggunakannya dalam Perl mungkin dapat memberi kita kelebihan atau sekurang-kurangnya memudahkan tugas pengaturcaraan.


Tuesday, October 30, 2012

Bahasa Pengaturcaraan Perl

Perl (Practical Extraction and Reporting Language) ialah bahasa pengaturcaraan terjemahan. Bahasa pengaturcaraan amnya ada dua jenis - yang terkompil (misalnya C, Java dll) dan yang diterjemah (Perl, Python dll). Bahasa terkompil dan bahasa terjemahan kedua-duanya melalui proses penterjemahan (bahasa pengaturcaraan kepada bahasa mesin) sebelum boleh dilaksanakan. Bezanya ialah dari segi proses pelaksanaan program.

Semua atur cara bahasa terkompil akan dikompil kepada fail berbentuk program. Maka proses mengkompil hanya perlu berlaku sekali sahaja kerana pengkompil tidak diperlukan untuk melaksanakan program. Manakala bahasa diterjemah akan sentiasa berada dalam bentuk skrip (kod sumber atau bahasa pengaturcaraan). Setiap kali hendak dilaksakanan, ia perlu diterjemah dan dilaksanakan oleh pengkompil (penterjemah). Maka atur cara bahasa terjemahan hanya boleh dilaksanakan dengan kehadiran pengkompil. (Atur cara bahasa terjemahan biasanya dipanggil skrip.)

Perl boleh digunakan bagi tujuan memformat dan memproses data berbentuk teks. Misalnya fail HTML (muka sesawang) boleh diformat semula ke dalam bentuk teks biasa dengan cara mengekstrak kandungan data teksnya dan mencetak semula data tersebut ke dalam fail teks tanpa HTML. Perl juga boleh digunakan bagi memuat turun kandungan pangkalan data dan mencetak laporan, membina laman sesawang (Common Gateway Interface atau CGI), mengurus tadbir pelayan, dan membina antaramuka grafik (GUI) sesebuah aplikasi.

Berikut adalah contoh skrip Perl yang mudah, iaitu untuk mencari dan menyenaraikan kedudukan nama 'Mohd Yunus' yang terkandung dalam sebuah fail teks 'dokumen.txt' ('Mohd' dan 'Yunus' mesti berada dalam baris yang sama):

use strict;

my $kata = 'Mohd Yunus';        # perkataan yang dicari
my $infile = "dokumen.txt";     # nama fail input.

open(INFILE, "<$infile") or
   die("Fail input '$infile' tidak dapat dibaca. $!");
while($_ = <INFILE>) {
    if(/$kata/) {
        print "'$kata' dikesan pada baris $.\n";
    }
}
close INFILE;
Contoh 1

Pengaturcaraan Perl agak sukar bagi pengatur cara yang baru mempelajarinya. Namun jika sudah biasa, Perl sebenarnya mudah digunakan dan ada masanya sangat berguna. Ia juga (i) bahasa yang sangat fleksibel, (ii) cukup mantap untuk melakukan tugas pemprosesan yang kompleks (walaupun Perl bukan pilihan untuk program masa-nyata.), (iii) menjadi pilihan kepada pentadbir sistem dan pembangun aplikasi sesawang, (iv) mendapat sokongan peminat atur cara sumber terbuka (open-source) dan (v) mempunyai sumber pustaka yang besar dan komprehensif (CPAN.org). Namun Perl lebih dikenali kerana mula-mula memperkenalkan operator ekspresi regular (regular expression) dalam bahasa atur cara, sehinggakan notasi standard Perl-compatible regular expression sering dijadikan rujukan oleh pengkompil dan enjin-enjin ekspresi regular yang terkemudian daripadanya.

Bagi yang ingin menggunakan Perl, boleh muat turun penterjemah Perl daripada Perl.org. Penterjemah diperlukan untuk melaksana skrip Perl. Pastikan penterjemah yang dimuat turun sesuai dengan sistem pengoperasian yang anda gunakan. Bagi pengguna sistem pengoperasian Linux dan Unix, tidak perlu pasang lagi kerana Perl sudah disediakan.

Ada dua kaedah melaksanakan skrip Perl (selain digunakan sebagai aplikasi CGI). Kaedah pertama ialah dengan membina skrip Perl dalam bentuk fail (yang diberi sambungan *.pl atau *.plx). Kemudian melaksanakan program penterjemah Perl dengan fail skrip sebagai parameter. Misalnya skrip berikut ditulis dalam fail skrip 'hello.pl',

print ("Hello dari Perl\n");

Skrip ini boleh dilaksanakan dengan menggunakan arahan berikut pada prom arahan (contoh berikut untuk prom sistem Windows),

c:\perl hello.pl

yang akan menghasilkan output berikut:

Hello dari Perl

Kaedah kedua ialah dengan menggunakan Perl sebaris (one-liner). Pelaksanaan Perl sebaris tidak memerlukan kita membina fail skrip kerana boleh dilaksanakan terus pada prom arahan. Skrip di atas boleh dilaksanakan terus pada prom arahan seperti berikut (dengan penanda pilihan -e),

perl -e "print (\"Hello dari Perl\n\")"

yang memberikan output yang sama. Perl sebaris hanya digunakan bagi atur cara yang ringkas. Namun ada juga atur cara Perl yang nampak seolah kompleks tetapi boleh dipadatkan menjadi Perl sebaris. Misalnya Contoh 1 di atas sebenarnya boleh dipadatkan menjadi Perl sebaris berikut:
perl -e "print grep { /Mohd Yunus/ } <>"  dokumen.txt
Atau
perl -lne "print if /Mohd Yunus/"  dokumen.txt

(Lihat contoh-contoh lain 'Perl sebaris')

Maklumat yang dipaparkan ini hanyalah pengenalan ringkas mengenai Perl. Maklumat lanjut berkenaan Perl boleh dirujuk di Perl.org.



Thursday, October 18, 2012

Perl one-liner ( untuk Perl-geek sahaja :) )

Semalam ada seorang kawan sefakulti mengemukakan satu masalah -
Bagaimanakah caranya menukar data yang terdiri daripada berbilang baris, kepada satu rentetan mengandungi data-data tersebut yang hanya diselangi dengan koma (tanpa penyuntingan)?

Seperti berikut: 

aaaaa
bbbbb
ccccc

kepada 

aaaaa,bbbbb,ccccc

Satu cara yang boleh digunakan ialah dengan menggunakan fungsi dlm MS-Excell (diperoleh daripada sumber di Youtube, terima kasih Dr. Alfian FSKTM).

Tetapi yang terlintas di fikiran saya ialah dengan menggunakan Perl one-liner. Perl one-liner ialah pembentukan skrip bahasa Perl yang ringkas dan mampu dilaksanakan secara terus menerusi prom arahan atau baris arahan sahaja (berbanding menulis di dalam fail skrip Perl, *.pl)

Skrip yang boleh digunakan adalah seperti berikut: ('multilines.txt' mengandungi data input, dan output akan disimpan dalam fail 'output.txt' tanpa mengubah kandungan 'multilines.txt')

perl -e "print(join(',', map{chomp; $_;} <>))" multilines.txt > output.txt

Skrip setara (tanpa kurungan '()'):

perl -e "print join ',', map{chomp; $_;} <>" multilines.txt > output.txt

Skrip di bawah memperoleh hasil yang sama, justeru boleh digunakan sebagai skrip alternatif (sebahagiannya telah diperbaiki oleh Dr. KA, FSKTM):

perl -e "$_ = join (',', <>); s/\n\r?//g; print" multilines.txt > output.txt

Berikut adalah contoh perlaksanaannya dalam prom arahan Windows (arahan 'more' sekadar memperlihatkan kandungan fail input, dan output yang terhasil):

C:\>more multilines.txt
xxxx
yyyy
zzzz

C:\>perl -e "print(join(',', map{chomp; $_;} <>))" multilines.txt > output.txt

C:\>more output.txt
xxxx,yyyy,zzzz

P/s: Bagi yang tidak biasa atau baru menggunakan Perl, pengguna Windows OS kena install penterjemah Perl dahulu (Unix dan Linux sudah ada versi Perl yang dipasang).


[ Kemaskini: 19 Okt 2012 ]

Semua perkataan 'Perl-liner' diubah. Istilah yang sebenar ialah 'Perl one-liner'.


[ Kemaskini: 9 Sept 2024 ]

Sebenarnya 'Perl-liner' atau 'Perl one-liner' sama saja. Saya gelar 'Perl-baris'.

Alternatif lain (penyelesaian masalah):

perl -e "print join ',', map{s/\s+$//; $_;} <>" multilines.txt > output.txt


.

Friday, March 09, 2012

UFO (Unidentified Fishy Objects) found in malware?


Researchers can't identify programming language used in Duqu, ask for help
The programming language used to write parts of the Duqu malware remains a mystery despite countless hours of analysis

http://www.computerworld.com/s/article/9225024/Researchers_can_39_t_identify_programming_language_used_in_Duqu_ask_for_help


.

Thursday, December 25, 2008

Make it work or Make it fast/optimized?

Most of time this issue struck my brain during my coding. Should i make it work first? Or should i optimized along the way?

It is easy to think that everything should be made to worked first, then optimized. It's normal (and thinkable, of course). We have to, since anything that we do is because we want to see it work. Otherwise it'll not be useful at all.

But do not forget that programming/coding involved a lot of works. Normally we are not writing 2-10 lines of codes but hundreds. Or maybe thousands (millions? are you writing another Vista?). So to review all these codes for optimization might take us several hours or days. And this if our working code can go along the optimization process.

But what if they not? What if we are writing the code using algorithm A, and suddenly we found that the optimization require algorithm B?! Isn't that would be burdening, redundant work, since we have to make it using B, make it work, and then optimize?

So these thing make my head spin fast, trying to solve these work-or-optimize issue ...

hmmmm.... but for now i just simply make it worked first (since i'm an ordinary programmer)...