• Tidak ada hasil yang ditemukan

BAB IV PERANCANGAN RINCI

N/A
N/A
Protected

Academic year: 2021

Membagikan "BAB IV PERANCANGAN RINCI"

Copied!
11
0
0

Teks penuh

(1)

1

PERANCANGAN RINCI

Pada Tugas Akhir ini, dijelaskan perancangan rinci detektor plagiarisme Deimos. Berdasarkan rancangan global pada Subbab 3.2.7, Deimos terbagi menjadi dua komponen perangkat lunak. Komponen yang pertama adalah aplikasi backend, sementara yang kedua merupakan aplikasi web. Perancangan setiap komponen dapat dilihat pada Subbab 4.1 dan 4.2. Sedangkan perancangan representasi persisten kelas

entity dan perancangan antarmuka dapat dilihat pada Subbab 4.3 dan Subbab 4.4. Diagram sequence untuk setiap use case dapat dilihat pada Lampiran D.

4.1 Aplikasi Backend

Pada Subbab ini, akan diberikan penjelasan mengenai perancangan aplikasi backend

Deimos. Aplikasi backend merupakan aplikasi yang melakukan proses deteksi

plagiarisme otomatis pada kumpulan source code program yang diberikan. Eksekusi aplikasi backend tersebut di-trigger oleh aplikasi web. Aplikasi backend bertanggung jawab terhadap fungsionalitas tiga buah use case, yaitu use case tokenizing, use case

mendeteksi kesamaan setiap pasangan token string, dan use case mengirimkan notifikasi bahwa deteksi selesai.

Pada tokenizing atau tokenisasi, seluruh source code pada direktori yang telah dispesifikasikan pengguna diubah menjadi token string yang merupakan representasi linier program. Untuk mengubah source code menjadi token string, dapat dilakukan analisis statik terhadap source code.

Analisis statik melakukan telaah terhadap kode program tanpa melalui proses eksekusi. Struktur dan sintaks source code diperiksa sedemikian rupa sehingga pemrogram dapat menerima informasi statistik tentang program yang dibuatnya. Untuk itu pada perancangan ini terdapat kelas Scanner dan Parser.

Scanner bertanggung jawab untuk melakukan analisis leksikal, yaitu mengubah kode program menjadi serangkaian simbol. Simbol pada konteks ini merupakan potongan teks tunggal dengan arti tertentu. Sebenarnya pada teori kompilasi, istilah yang dipakai untuk hasil analisis leksikal adalah token. Namun untuk membedakan token

(2)

hasil analisis leksikal dengan token yang dibutuhkan oleh algoritma pembandingan, pada laporan ini hasil analisis leksikal disebut dengan istilah simbol.

Rangkaian simbol yang dihasilkan dari Scanner tersebut akan menjadi input Parser. Parser bertanggung jawab untuk melakukan analisis sintaks, yang terkait dengan

grammar atau aturan kalimat pada bahasa pemrograman yang bersangkutan. Parser inilah yang akan menghasilkan token string yang dibutuhkan oleh algoritma pembandingan.

Pada detektor yang dibangun di Tugas Akhir ini, token disimpan ketika proses parsing

berlangsung. Selain itu, posisi bagian source code yang direpresentasikan token tersebut juga disimpan untuk kepentingan tampilan pada aplikasi web. Sesuai dengan analisis tokenizer pada Subbab 3.2.7.1, proses tokenisasi Deimos bisa dilakukan dengan mengimplementasikan scanner dan parser sesuai dengan bahasa pemrograman source code yang akan dideteksi. Perancangan scanner dan parser serta daftar token set detil bisa dilihat pada Lampiran C.

Fungsionalitas berikutnya dari aplikasi backend ini yaitu mendeteksi kesamaan setiap pasangan token string. Sesuai dengan analisis pada Subbab 3.2.7.2, algoritma yang diimplementasikan untuk fungsionalitas ini yaitu algoritma Running Karp-Rabin Greedy String Tiling. Selain mampu menemukan bagian-bagian yang sama pada dua buah string, algoritma ini juga dapat digunakan untuk menentukan nilai similaritas pasangan string dan juga dapat menerima parameter sensitivitas deteksi. Detil algoritma ini dapat dilihat pada studi literatur di Subbab 2.2.3. Algoritma Running Karp-Rabin Greedy String Tiling diterapkan di kelas Comparator_RKRGST.

Diagram kelas aplikasi backendDeimos dapat dilihat pada Gambar IV-1. Semua kelas

entity sebenarnya mempunyai hubungan dependency terhadap kelas DatabaseConnector. Namun kelas DatabaseConnector tidak digambarkan pada diagram kelas di bawah ini untuk alasan keterbacaan. Penjelasan detil untuk setiap kelas dapat dilihat pada Tabel IV-1.

Aturan penamaan untuk kelas turunan yaitu XXX_YYY dengan XXX merupakan nama kelas dasar. Pada kelas turunan Scanner dan Parser, YYY merupakan nama bahasa

(3)

pemrograman, sedangkan pada kelas turunan Comparator dan Token, YYY merupakan pengenal algoritma pembandingan yang dipakai.

Parser_LISP startParse() acceptSExpressi on() acceptAtom() acceptUnreservedString() Scanner_LISP startScan() scanSource() acceptNumber() checkScaleNumber() Parser_Pascal startParse() acceptT erminal() program() block() label_declaration_part() constant() constant_definiti on() type() type_defi ni tion_part() variable() variable_declarati on_part() expressi on() statement() Scanner_Pascal startScan() scanSource() isUnreservedChar() checkNumber() checkScaleNumber() checkString() checkComment1() checkComment2() checkIdent() checkOtherSymbols() addEl ement() T oken tokenContent : int fi lenam e : i nt startRow : int startCol : int endRow : int endCol : i nt getT okenContent() getFilename() getStartRow() getStartCol () getEndRow() getEndCol() setT okenContent() setEverything() Match p : int t : int s : int get_p() get_s() get_t() setEverything() T il e col or : String fi lenam e : String startT oken : T oken endT oken : endT oken getColor() getFilename() getStartT oken() getEndT oken() setEverything() insertT il eRecord() Mail fromAddress : String toAddress : Stri ng subject : String content : Stri ng ccAddress : String getFromAddress() getT oAddress() getCcAddress() getSubj ect() getContent() setEverything() Comparator_RKRGST

mi ni mum_m atch_length : int maxmatch_li st : list of Match length_of_tokens_ti led : int com pare() countSi milarity() scanpattern() markstrings() rkrgst() fi rstUnmarkedPosition() positionFi rstUnmarkedAfterNextT i le() distanceT oNextT il e()

countHashValue() countNextHashVal ue() addMatchtoMaxmatchList() getHighestMatchLength() all Unmarked() all Same() unmarkAl l() Comparator pair : ProgramPair com pare() countSi milarity() Mail Sender props : Properties sessi on : Session sendMail() val idateMail() ProgramPair simil arity : i nt program1 : Program program2 : Program ti les1 : l ist of T iles ti les2 : l ist of T iles getProgram1() getProgram2() setSimil arity() insertProgramPairRecord() updateSim ilari ty() insertT il es() T oken_RKRGST

mark : bool ean nextUnmarked : int previousUnmarked : int isT okenMarked() getPreviousUnmarkedT oken() getNextUnmarkedT oken() markT oken() unmarkT oken() setPrevi ousUnmarkedToken() setNextUnmarkedT oken() PairM aker directoryName : Stri ng makePairs() Main main() Parser parsedProgram fi lenam e currentSymbol startParse() Program tokenString : li st of T oken numOfFil es : int passParsing : bool ean subdirectoryName : Stri ng getT okenStri ng() getNumOfFil es() addT oken() insertProgramRecord() updateParseStatus() DirectoryBrowser directoryName : Stri ng browseDirectory() browseProgramDirectory() chooseLanguage() checkExtention() Scanner fi lereader : FileCReader dbconn : DatabaseConnector symbolList : l ist of Symbols startScan() throwWhitespace() isDigit() Fil eCReader CC : char C : int myfi le : FileInputStream fi lenam e : String rowNum : int col Num : int ST ART() ADVANCE() EOP() getCC() closeFil e() setFi lenam e() getColNum() getRowNum() resetCol Row()

Gambar IV-1. Diagram Kelas Aplikasi Backend Deimos

Untuk menangani bahasa pemrograman yang berbeda, perlu diimplementasikan

scanner dan parser yang berbeda. Pada Tugas Akhir ini, hanya scanner dan parser

untuk bahasa pemrograman LISP dan Pascal yang akan diimplementasikan. Untuk membuat scanner yang spesifik untuk suatu bahasa dapat diimplementasikan dengan

(4)

menurunkan kelas Scanner. Begitu pula untuk membuat parser yang spesifik untuk bahasa pemrograman tertentu, dapat dibuat kelas yang menurunkan kelas Parser. Pada diagram kelas di Gambar IV-1, bisa dilihat bahwa terdapat kelas Scanner_LISP dan Scanner_Pascal yang diturunkan dari kelas Scanner, dan juga kelas Parser_LISP dan Parser_Pascal yang diturunkan dari kelas Parser. Perancangan dibuat sedemikian rupa agar spesifikasi non-fungsional nomor SRS-NF-03 pada Subbab 3.2.3 dapat dipenuhi, sehingga keseluruhan detektor tidak perlu dibangun ulang untuk menangani bahasa pemrograman lain, melainkan hanya perlu membuat kelas scanner dan parser baru sesuai bahasa pemrograman target yang diturunkan dari kelas Scanner dan Parser.

Selain penanganan perbedaan bahasa pemrograman, tokenizer juga dirancang agar mampu menangani program yang terdiri dari banyak file. Caranya adalah dengan melakukan scanning dan parsing pada setiap file source code, namun token-token yang dihasilkan dikonkatenasi menjadi satu buah token string walaupun program tersebut terdiri dari banyak file. Kasus ini perlu ditangani karena dianjurkan pada praktek pemrograman yang baik. Contohnya pada praktek pemrograman dalam bahasa C, bagian header, body, dan driver program dibuat terpisah pada file yang berbeda.

Tabel IV-1. Rancangan Kelas Aplikasi Backend Deimos

No Nama kelas Definisi

1. Main Kelas berisi algoritma utama pada aplikasi backend.

2. DatabaseConnector Kelas ini merupakan kelas boundary yang bertanggung jawab atas koneksi ke basis data, operasi-operasi modifikasi basis data dan pengambilan record dari basis data.

3. FileCReader Kelas yang bertanggung jawab untuk membaca file per karakter termasuk menyimpan posisi baris dan kolom karakter yang sedang dibaca.

4. MailSender Kelas yang bertanggung jawab untuk mengirimkan email dengan menggunakan protokol SMTP.

5. Mail Kelas entity yang merepresentasikan email.

5. DirectoryBrowser Kelas yang bertanggung jawab untuk membaca isi direktori masukan dan memanggil scanner / parser yang sesuai untuk setiap file source code di dalam direktori.

6. Scanner Kelas dasar bagi seluruh scanner. Setiap kelas yang diturunkan dari kelas ini mengimplementasikan scanner untuk bahasa pemrograman tertentu. Agar Deimos dapat menangani bahasa baru, tambahkan kelas

scanner baru sebagai turunan kelas ini. Semua kelas turunan Scanner harus mengikuti aturan penamaan Scanner_XXX dengan XXX merupakan nama bahasa pemrograman yang akan diimplementasi

scanner-nya.

7. Scanner_LISP Kelas turunan dari kelas Scanner. Kelas ini bertanggung jawab untuk

scanningsource code dalam bahasa pemrograman LISP sambil mengubah elemen leksikal source code tersebut menjadi serangkaian

(5)

No Nama kelas Definisi

simbol yang dibutuhkan Parser_LISP untuk proses parsing. 8. Scanner_Pascal Kelas turunan dari kelas Scanner. Kelas ini bertanggung jawab untuk

scanningsource code dalam bahasa pemrograman Pascal sambil mengubah elemen leksikal source code tersebut menjadi serangkaian simbol yang dibutuhkan Parser_Pascal untuk proses parsing. 7. Parser Kelas dasar bagi seluruh parser. Setiap kelas yang diturunkan dari kelas

ini mengimplementasikan parser untuk bahasa pemrograman tertentu. Setiap turunan parser harus berpasangan dengan satu kelas turunan

scanner yang menangani bahasa pemrograman yang sama. Agar Deimos dapat menangani bahasa baru, tambahkan kelas parser baru sebagai turunan kelas ini. Semua kelas turunan Parser harus mengikuti aturan penamaan Parser_XXX dengan XXX merupakan nama bahasa

pemrograman yang akan diimplementasi parser-nya.

10. Parser_LISP Kelas turunan dari kelas Parser. Kelas ini bertanggung jawab untuk

parsing rangkaian simbol yang dihasilkan Scanner_LISP sambil menyimpan token yang sesuai dengan definisi sintaks bahasa pemrograman LISP.

11. Parser_Pascal Kelas turunan dari kelas Parser. Kelas ini bertanggung jawab untuk

parsing rangkaian simbol yang dihasilkan Scanner_Pascal sambil menyimpan token yang sesuai dengan definisi sintaks bahasa pemrograman Pascal.

12. Program Kelas entity yang merepresentasikan program yang akan dideteksi plagiarisme. Program merupakan sekumpulan source code yang dapat dieksekusi.

13. PairMaker Kelas ini bertanggung jawab untuk mengiterasi daftar program dan memasangkan setiap program satu sama lain. Kelas inilah yang menentukan pasangan-pasangan source code yang akan dibandingkan oleh Comparator_RKRGST.

18. ProgramPair Kelas entity yang merepresentasikan pasangan program yang akan dibandingkan dan ditentukan nilai similaritasnya.

16. Token Kelas entity yang merepresentasikan token. Token adalah elemen tunggal dari bahasa pemrograman. Pada aplikasi ini token dihasilkan oleh Parser dan akan digunakan oleh Comparator. Kelas ini dapat diturunkan menjadi Token_YYY dengan YYY adalah pengenal algoritma pembandingan yang dipakai, dan akan merepresentasikan token yang akan dibutuhkan oleh algoritma pembandingan YYY.

17. Token_RKRGST Kelas entity yang diturunkan dari kelas Token. Kelas ini

merepresentasikan token pada algoritma Running Karp-Rabin Greedy String Tiling.

14. Comparator Kelas dasar bagi seluruh kelas yang membungkus algoritma pembandingan. Kelas ini bertanggung jawab untuk membandingkan pasangan token string dan menentukan nilai similaritas serta menyimpan hasilnya ke basis data. Ada bermacam-macam algoritma yang dapat digunakan untuk pembandingan. Untuk menerapkan algoritma tertentu, dapat dibuat kelas yang menurunkan kelas Comparator ini. Setiap kelas turunan dari Comparator harus mengikuti aturan penamaan

Comparator_YYY dengan YYY merupakan pengenal algoritma pembandingan yang berpasangan dengan kelas Token_YYY.

15. Comparator_RKRGST Kelas yang bertanggung jawab untuk membandingkan pasangan token string dan menentukan nilai similaritas serta menyimpan hasilnya ke basis data. Kelas ini merupakan turunan dari kelas Comparator. Algoritma Running Karp-Rabin Greedy String Tiling diterapkan di kelas ini.

19. Match Kelas ADT yang merepresentasikan maximal-match pada algoritma

Running Karp-Rabin Greedy String Tiling. Sebuah maximal-match

menyimpan posisi dan panjang sebuah substring yang sama pada kedua

token string yang dibandingkan. ADT ini hanya dibutuhkan oleh kelas Comparator_RKRGST saja.

(6)

No Nama kelas Definisi

20. Tile Kelas entity yang merepresentasikan tile pada algoritma Running Karp-Rabin Greedy String Tiling. Sebuah tile menyimpan posisi dan panjang sebuah substring yang sama pada kedua token string yang dibandingkan. Kelas ini hanya dibutuhkan oleh kelas Comparator_RKRGST saja.

4.2 Aplikasi Web

Pada subbab ini, akan diberikan penjelasan mengenai perancangan aplikasi web

Deimos. Aplikasi web Deimos akan diimplementasikan dalam platform PHP.

Berdasarkan analisis pada Subbab 3.2.7.3, aplikasi web detektor plagiarisme Deimos

mempunyai dua fungsi utama, yaitu men-trigger aplikasi backend untuk mendeteksi plagiarisme pada kumpulan source code dan menampilkan hasil deteksi dalam format HTML. Model perancangan pada Gambar IV-2, hanya merepresentasi kelas-kelas yang bukan user interface karena user interface tidak dirancang sebagai kelas melainkan sebagai script. Penjelasan detil untuk setiap kelas dijelaskan pada Tabel IV-2. DetectionTrigger executeDetector() Detection directoryName : String date : date startTime : time endTime : time sensitivity : int prgLanguage : String notificationEmail : String getDirectoryName() getDate() getStartTime() getEndTime() getSensitivity() getPrgLanguage() setEverything() setDirectoryName() selectDetectionRecord() insertDetectionRecord() deleteDetectionRecord() DetectionResultFetcher detection : Detection getDetectionInfo() getColorTable() countSimilarityDistribution() getNumberOfPrograms() getSimilarityList() getRepositoryList() getTilesPositions() setDetection()

Gambar IV-2. Diagram kelas yang mewakili modeler dan controller pada aplikasi web Deimos

Tabel IV-2. Rancangan Kelas Aplikasi Web Deimos

No Nama kelas Definisi

1. DetectionResultFetcher Kelas yang menyediakan fungsi-fungsi untuk mengolah hasil deteksi yang diambil dari basis data dan mengembalikan data-data yang siap ditampilkan pada halaman HTML.

2. Detection Kelas entity yang merepresentasikan proses deteksi.

3. DetectionTrigger Kelas yang bertanggung jawab untuk men-trigger aplikasi backend

(7)

4.3 Perancangan Representasi Persisten Kelas Entity

Dari perancangan yang sudah didefinisikan pada Subbab 4.1 dan Subbab 4.2, dibutuhkan suatu penyimpanan data persisten untuk menyimpan objek beberapa kelas yang termasuk instance kelas entity. Penyimpanan data persisten pada Deimos

diwujudkan dalam bentuk tabel dalam basis data relasional. Deskripsi tabel dan pemetaan kelas entity dalam tabel dapat dilihat pada Tabel IV-3.

Tabel IV-3. Perancangan Penyimpanan Data Persisten dan Pemetaannya dengan Kelas Entity

Kelas Entity Rancangan Tabel

No

Nama Atribut Nama Atribut

Keterangan directoryName directory_name date detection_date startTime start_time endTime end_time sensitivity minimum_match_length prgLanguage language 1. Detection notificationEmail detection email_address Menyimpan informasi mengenai proses deteksi.

- program_id (primary key)

subdirectoryName subdirectory_name passParsing pass_parsing numOfFiles num_files 2. Program - program directoryName (foreign key) Menyimpan informasi mengenai program. Program dapat terdiri dari banyak file source code.

- token_id (primary key)

tokenContent content filename filename startRow startrow startCol startcol endRow endrow endCol endcol 3. Token - token

program_id (foreign key)

Menyimpan informasi mengenai token. Token adalah elemen tunggal dari bahasa

pemrograman.

- pair_id (primary key)

similarity similarity program1 program1_id program2 program2_id 4. Pair - pair directoryName (foreign key) Menyimpan informasi pasangan program yang telah dibandingkan dan mempunyai nilai similaritas. - tile_id (primary key)

startToken start_token_id endToken end_token_id filename filename color color - pair_id (foreign key)

5. Tile

-

tile

program_id (foreign key)

Menyimpan informasi mengenai tile. Pada algoritma Running Karp-Rabin Greedy String Tiling, sebuah tile menyimpan posisi dan panjang sebuah substring yang sama pada kedua token string yang dibandingkan.

4.4 Perancangan Antarmuka Aplikasi Web

Pada aplikasi web, setiap halaman web diimplementasikan secara fisik sebagai satu buah filePHP. Tampilan setiap halaman mengikuti rancangan antarmuka generik yang

(8)

dapat dilihat pada Gambar IV-3. Detil antarmuka setiap halaman akan dijelaskan pada Subbab 4.4.1 sampai Subbab 4.4.5.

Gambar IV-3. Rancangan Antarmuka Generik Detektor Plagiarisme Deimos

4.4.1 Halaman Utama

Halaman utama berisi menu untuk memilih fungsionalitas Deimos. Tampilan halaman utama dapat dilihat pada Gambar IV-4.

Gambar IV-4. Halaman Utama Aplikasi Web Deimos 4.4.2 Form Memulai Deteksi

Form memulai deteksi ditampilkan jika pengguna ingin memulai deteksi plagiarisme pada kumpulan source code yang sudah disiapkan. Pengguna harus memilih nama direktori tempat menyimpan kumpulan source code yang akan dideteksi serta bahasa pemrograman source code tersebut. Pengguna juga harus memasukkan nilai sensitivitas pada tempat yang disediakan. Antarmuka form ini dapat dilihat pada Gambar IV-5.

(9)

Gambar IV-5. Antarmuka Form Memulai Deteksi pada Aplikasi Web Deimos

4.4.3 Form Menghapus Hasil Deteksi

Pada form menghapus hasil deteksi terdapat daftar hasil deteksi sehingga pengguna dapat memilih hasil deteksi yang ingin dihapusnya. Antarmuka form ini dapat dilihat pada Gambar IV-6.

Gambar IV-6. Antarmuka Form Menghapus Hasil Deteksi

4.4.4 Halaman Utama Tampilan Hasil Deteksi

Antarmuka halaman utama tampilan hasil deteksi bisa dilihat pada Gambar IV-7. Halaman tersebut dibagi menjadi tiga bagian besar, yaitu ikhtisar hasil deteksi, tabel distribusi similaritas dan matriks similaritas.

(10)

Gambar IV-7. Halaman Tampilan Hasil Deteksi Utama pada Aplikasi Web Deimos

Ikhtisar hasil deteksi berisi data tanggal deteksi, waktu dimulainya deteksi dan berakhirnya deteksi, nama direktori tempat menyimpan source code, jumlah program yang dibandingkan, dan sensitivitas deteksi. Tabel distribusi similaritas menunjukkan jumlah pasangan source code yang memiliki nilai similaritas pada range tertentu. Dari tabel tersebut diharapkan pengguna bisa mendapatkan gambaran mengenai tingkat plagiarisme yang terjadi. Tampilan yang terletak paling bawah disebut dengan matriks similaritas. Setiap titik pada matriks mewakili satu pasangan program. Setiap titik ditandai dengan warna yang berbeda, yang menunjukkan range persentase similaritas

(11)

pasangan tersebut berdasarkan warna pada tabel distribusi similaritas. Untuk melihat nama program pasangan tertentu, pengguna hanya perlu menunjuk salah satu titik dan informasi akan ditampilkan. Jika titik tersebut di-klik, maka browser akan menampilkan halaman perbandingan pasangan source code yang akan dijelaskan pada Subbab 4.4.5.

4.4.5 Halaman Perbandingan Pasangan Source Code

Pada halaman ini, dua buah source code ditampilkan secara bersebelahan sehingga pengguna dapat membandingkan kedua source code tersebut dengan mudah. Bagian yang sama ditandai dengan warna tertentu. Diharapkan dengan adanya penanda warna tersebut, pengguna dapat memutuskan apakah pasangan tersebut merupakan kasus plagiarisme atau bukan. Antarmuka halaman perbandingan pasangan source code ini dapat dilihat pada Gambar IV-8.

Gambar IV-8. Antarmuka Halaman Perbandingan Pasangan Source Code pada Aplikasi Web Deimos

Gambar

Gambar IV-1. Diagram Kelas Aplikasi Backend  Deimos
Tabel IV-1. Rancangan Kelas Aplikasi Backend  Deimos
Tabel IV-2. Rancangan Kelas Aplikasi Web  Deimos
Tabel IV-3. Perancangan Penyimpanan Data Persisten dan Pemetaannya dengan Kelas Entity
+5

Referensi

Dokumen terkait

Dari tabel 4.1 dapat dilihat bahwa dari 36 responden yang diambil sebagai sampel, sebanyak 91,67% menyatakan bahwa mereka mengetahui iklan Djarum 76 seri

Studi Kondisi Lingkungan Rumah dan Perilaku Masyarakat sebagai Faktor Risiko Kejadian Malaria di Wilayah Kerja Puskesmas Benteng Kabupaten Bangka Selatan Propinsi

Supervisor memberikan evaluasi kepada mahasiswa selama kegiatan supervisi, presentasi, dan laporan sesuai form nilai yang telah disediakan.. Kegiatan Pembimbingan

Alhamdulillah, Puji syukur kehadirat Allah SWT, yang telah melimpahkan rahmat, hidayah serta inayahnya sehingga penulis dapat menyelesaikan skripsi ini dengan

2) Guru memaparkan materi yang berkaitan dengan mutasi, serta macam macam mutasi. 3) Siswa memahami pengertian mutasi, serta macam - macam mutasi gen. 4) Guru memberikan

Kinerja adalah kemampuan atau potensi angkutan umum untuk melayani kebutuhan pergerakan pada suatu daerah, dengan kata lain kinerja merupakan tingkat pencapaian atau

Maka dari itu penulis melakukan penelitian pada jaringan SMK Negeri 1 Inderalaya Utara yang menjadikan jaringan sebagai pendukung salah satu penunjang pembelajaran,