• Tidak ada hasil yang ditemukan

DAFTAR PUSTAKA. Ariyus, Dony Keamanan Multimedia. Yogyakarta : Penerbit Andi

N/A
N/A
Protected

Academic year: 2021

Membagikan "DAFTAR PUSTAKA. Ariyus, Dony Keamanan Multimedia. Yogyakarta : Penerbit Andi"

Copied!
16
0
0

Teks penuh

(1)

DAFTAR PUSTAKA

Ariyus, Dony. 2009. Keamanan Multimedia. Yogyakarta : Penerbit Andi

Bahri, Saipul, Dian, dan PS, Susan Dian. April 2012. Studi Dan Implementasi

Pengamanan Basis Data Menggunakan Metode Enkripsi MD5. Bina Darma. Vol.

X,

No.

X.

http://eprints.binadarma.ac.id/258/1/JURNAL%20STUDI%20DAN%20IMPLEMEN

TASI%20PENGAMANAN%20BASIS%20DATA%20MENGGUNAKAN%20MET

ODE%20ENKRIPSI%20MD5.pdf. 04 Desember 2016.

Komputer, Wahana Semarang . 2004. Memahami Model Enkripsi dan Security Data.

Yogyakarta: Penerbit Andi.

Komputer, Wahana Semarang . 2006. Membuat Aplikasi Database Dengan Java 2 .

Yogyakarta: Penerbit Andi.

Komputer, Wahana Semarang. 2009. Menguasai Java Programming. Jakarta: Penerbit

Salemba Infotek.

Komputer, Wahana. 2010. The Best Encryption Tools. Jakarta: PT Elex Media

Komputindo.

Kromodimoeljo, Sentot. 2009. Teori dan Aplikasi Kriptografi. penerbit SPK IT Consulting

Ladjamuddin B, Al-Bahra. 2006. Rekayasa Perangkat Lunak. Yogyakarta: Graha Ilmu.

Munir, Rinaldi. 2006. Kriptografi. Bandung: Informatika.

Nugroho, Adi. 2005. Analisis Dan Perancangan Sistem Informasi Dengan Metodologi

Berorientasi Objek. Bandung: Informatika.

Pressman, Roger S. 2002. Rekayasa Perangkat Lunak Buku 1. Yogyakarta: Penerbit Andi.

Utami, Ema. 2008. RDBMS Menggunakan MS SQL SERVER 2000. Yogyakarta: Graha

(2)

Sumber lain :

https://en.wikipedia.org/wiki/IntelliJ_IDEA

https://id.wikipedia.org/wiki/Kata_sandi

https://id.wikipedia.org/wiki/Sandi_Caesar

(3)

LAMPIRAN

1. Class Cesarchiper

public class Caesarchiper {

private static String Huruf = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static String Angka = "0123456789";

public static String enkripsi(String Plaintext, int Kunci) { String hasil = "";

int kunciHuruf = Kunci % Huruf.length(); if (kunciHuruf == 0) kunciHuruf = 1; int kunciAngka = Kunci % Angka.length(); if (kunciAngka == 0) kunciAngka = 1; for(int i=0; i<Plaintext.length(); i++){ char teksTerinput = Plaintext.charAt(i); if(Character.isLetter(teksTerinput)){

char hurufKapital = Character.toUpperCase(teksTerinput); for (int a=0; a<Huruf.length(); a++){

if(hurufKapital == Huruf.charAt(a)){

int ab = (a + kunciHuruf) % Huruf.length(); char hasilEnkripsiHuruf = Huruf.charAt(ab); if(Character.isLowerCase(teksTerinput)){ hasil = hasil

+Character.toLowerCase(hasilEnkripsiHuruf); }else{

hasil = hasil + hasilEnkripsiHuruf; }

} }

}else if(Character.isDigit(teksTerinput)){ for (int b=0; b<Angka.length(); b++){ if(teksTerinput == Angka.charAt(b)){

int bc = (b + kunciAngka) % Angka.length(); hasil = hasil + Angka.charAt(bc);

} } }else {

hasil = hasil + teksTerinput; }

}

return hasil; }

public static String dekripsi(String Ciphertext, int Kunci){ String hasil = "";

int kunciHuruf = Kunci % Huruf.length(); if(kunciHuruf == 0) kunciHuruf = 1; int kunciAngka = Kunci % Angka.length(); if(kunciAngka == 0) kunciAngka = 1;

for (int i=0; i<Ciphertext.length(); i++){ char teksTerinput = Ciphertext.charAt(i);

if(Character.isLetter(teksTerinput)){

char hurufKapital = Character.toUpperCase(teksTerinput); for (int a=0; a<Huruf.length(); a++){

if(hurufKapital == Huruf.charAt(a)){

int ab = (Huruf.length()+ a - kunciHuruf) % Huruf.length(); char hasilDekripsiHuruf = Huruf.charAt(ab);

if(Character.isLowerCase(teksTerinput)){ hasil = hasil +

(4)

}else{

hasil = hasil + hasilDekripsiHuruf; }

} }

}else if(Character.isDigit(teksTerinput)){ for (int b=0; b<Angka.length(); b++){ if(teksTerinput == Angka.charAt(b)){

int bc = (Angka.length() + b - kunciAngka) % Angka.length();

hasil = hasil + Angka.charAt(bc); }

} }else{

hasil = hasil + teksTerinput; } } return hasil; } }

2. Class BasisData

import java.sql.*; public class BasisData {

public static Connection database; public static Statement statementHelper; public static Connection getDatabase() { return database;

}

public static Statement getStatementHelper() { return statementHelper;

}

public static void connect() throws ClassNotFoundException, SQLException{ if (database == null){ Class.forName("com.mysql.jdbc.Driver"); database = DriverManager.getConnection("jdbc:mysql://localhost:3306/db_aplikasi", "root", ""); statementHelper = database.createStatement(); } }

public static int user(String username, String password, String email, String nama_lengkap, String tanggal_lahir, String asal_kota, char jenis_kelamin, String alamat, String kode_pos,

String handphone) throws SQLException{ Statement hitungUser = getStatementHelper();

ResultSet hasil = hitungUser.executeQuery("SELECT COUNT(*) AS TOTAL FROM

table_user");

int no_registrasi = 0; while (hasil.next()){

no_registrasi = hasil.getInt("TOTAL") + 1; }

(5)

String.valueOf(no_registrasi) + "," + "'" + Caesarchiper.enkripsi(username, no_registrasi) + "'," + "'" + username + "'," + "'" + Caesarchiper.enkripsi(password, no_registrasi) + "'," + "'" + password + "'," + "'" + Caesarchiper.enkripsi(email, no_registrasi) + "'," + "'" + email + "'," + "'" + nama_lengkap + "'," + "'" + Caesarchiper.enkripsi(tanggal_lahir, no_registrasi) + "'," + "'" + tanggal_lahir + "'," + "'" + asal_kota + "'," + "'" + jenis_kelamin + "'," + "'" + alamat + "'," + "'" + kode_pos + "'," + "'" + Caesarchiper.enkripsi(handphone, no_registrasi) + "'," + "'" + handphone + "')"; return getStatementHelper().executeUpdate(sql_query); }

public static HasilLogin login(String username, String password) throws SQLException{

int no_registrasi = 0;

String dekripsi_username = ""; String dekripsi_password = ""; HasilLogin hasil = new HasilLogin(); Statement pilih = getStatementHelper();

ResultSet hasil_pilih = pilih.executeQuery("SELECT no_registrasi, " + "username_cipher, " + "password_cipher, " + "email_cipher, " + "nama_lengkap, " + "tanggal_lahir_cipher, " + "asal_kota, " + "jenis_kelamin, " + "alamat, " + "kode_pos, " + "handphone_cipher " + "FROM table_user"); while (hasil_pilih.next()) { no_registrasi = hasil_pilih.getInt("no_registrasi"); dekripsi_username = Caesarchiper.dekripsi(hasil_pilih.getString("username_cipher"), no_registrasi); dekripsi_password = Caesarchiper.dekripsi(hasil_pilih.getString("password_cipher"), no_registrasi); if ((username.equals(dekripsi_username)) && (password.equals(dekripsi_password))){ hasil.isSucces = true; return hasil; } } return hasil; }

(6)

SQLException {

Statement cariUsername = getStatementHelper();

ResultSet cari = cariUsername.executeQuery("SELECT no_registrasi,

username_cipher FROM table_user");

while (cari.next()) {

int no_registrasi = cari.getInt("no_registrasi");

String username_cipher = cari.getString("username_cipher"); String username_real = Caesarchiper.dekripsi(username_cipher, no_registrasi); if (username_real.equals(username)) { return false; } } return true; } }

3. Class HasilLogin

public class HasilLogin {

public boolean isSucces = false; }

4. Halaman Utama

import com.alee.laf.WebLookAndFeel; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException; /** * Created by ari on 10/3/2016. */

public class HalamanUtama {

private static JFrame frame; private JPanel panelUtama; public JPanel getPanelUtama() { return panelUtama;

}

public static void main (String[] args) { try {

BasisData.connect();

} catch (ClassNotFoundException e) {

JOptionPane.showMessageDialog(frame, e.getLocalizedMessage(), "class tidak ditemukan", JOptionPane.ERROR_MESSAGE); } catch (SQLException e) {

JOptionPane.showMessageDialog(frame, e.getSQLState() + "Gagal

dijalankan",

"SQL Gagal dijalankan?", JOptionPane.ERROR_MESSAGE ); }

WebLookAndFeel.install(); JMenu menu = new JMenu("Menu");

JMenuItem menuUtama = new JMenuItem("Home"); menu.add(menuUtama);

(7)

JMenuItem menuRegistrasi = new JMenuItem("Registration"); menu.add(menuRegistrasi);

JMenuItem menuLogin = new JMenuItem("Login"); menu.add(menuLogin);

menu.addSeparator();

JMenuItem menuKeluar = new JMenuItem("Close"); menu.add(menuKeluar);

JMenu bantuan = new JMenu("Help");

JMenuItem menuBantuan = new JMenuItem("About"); bantuan.add(menuBantuan);

JMenuBar menuBar = new JMenuBar(); menuBar.add(menu);

menuBar.add(bantuan);

frame = new JFrame("Kriptografi");

frame.setContentPane(new HalamanUtama().panelUtama);

frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setJMenuBar(menuBar);

frame.setSize(410, 530); frame.setResizable(false);

Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); frame.setLocation(dimension.width / 2 - frame.getSize().width / 2, dimension.height / 2 - frame.getSize().height / 2);

frame.setVisible(true);

menuKeluar.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { frame.dispose();

} });

menuUtama.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { setContentpane(new HalamanUtama().getPanelUtama()); }

});

menuRegistrasi.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { setContentpane(new FormRegistration().getPanelRegist()); }

});

menuLogin.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { setContentpane(new FormLogin(frame).getPanelLogin()); }

});

menuBantuan.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent actionEvent) { setContentpane(new FormAbout().getPanelAbout()); }

}); }

public static void setContentpane(JPanel pane){ frame.setContentPane(pane);

(8)

frame.repaint(); } }

5. Halaman Registrasi

import com.alee.extended.date.WebDateField; import javax.swing.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.sql.SQLException; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List;

public class FormRegistration {

public JPanel panelRegist; private JTextField txtPassword; private JButton btnReset; private JTextField txtEmail; private JTextField txtUsername; private JButton btnRegister; private JTextField txtNamaLengkap; private JComboBox cmbAsalKota; private JComboBox cmbJenisKelamin; private JTextArea txtAlamat; private JTextField txtKodePos; private JTextField txtHp;

private WebDateField DTTanggalLahir;

public FormRegistration(){

DTTanggalLahir.setDateFormat(new SimpleDateFormat("EEEE, dd MMMM

yyyy"));

btnReset.addMouseListener(new MouseAdapter() { @Override

public void mouseClicked(MouseEvent e) { super.mouseClicked(e);

switch (JOptionPane.showConfirmDialog(panelRegist, "Anda

yakin ingin mereset?", "Reset Formulir", JOptionPane.OK_CANCEL_OPTION)){

case JOptionPane.OK_OPTION: reset(); break; } } }); btnRegister.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent e) { try {

if (BasisData.validasiDatabase(txtUsername.getText())) { if (validasi()) {

String username = txtUsername.getText(); String password = txtPassword.getText();

(9)

String email = txtEmail.getText();

String nama_lengkap = txtNamaLengkap.getText(); DateFormat df = new SimpleDateFormat("dd MMMM

yyyy"); Date date_tanggal_lahir = DTTanggalLahir.getDate(); String tanggal_lahir = df.format(date_tanggal_lahir); String asal_kota = cmbAsalKota.getSelectedItem().toString(); char jenis_kelamin = ' '; switch (cmbJenisKelamin.getSelectedIndex()) { case 1: jenis_kelamin = 'P'; break; case 2: jenis_kelamin = 'W'; break; }

String alamat = txtAlamat.getText(); String kode_pos = txtKodePos.getText(); String handphone = txtHp.getText(); try { switch (BasisData.user( username, password, email, nama_lengkap, tanggal_lahir, asal_kota, jenis_kelamin, alamat, kode_pos, handphone )) { case 1:

JOptionPane.showMessageDialog(panelRegist, "Anda berhasil melakukan

registrasi.\nSilakan Login.", "Informasi", JOptionPane.INFORMATION_MESSAGE);

reset(); break; default:

JOptionPane.showMessageDialog(panelRegist, "Anda gagal melakukan

registrasi.", "Gagal Registrasi",JOptionPane.ERROR_MESSAGE);

}

} catch (SQLException e1) {

JOptionPane.showMessageDialog(panelRegist, e1.getLocalizedMessage(), "Kesalahan SQL",JOptionPane.ERROR_MESSAGE); }

} } else {

JOptionPane.showMessageDialog(panelRegist, "Username

sudah ada. Pilih username lain.", "Kesalahan", JOptionPane.ERROR_MESSAGE);

}

} catch (SQLException e1) {

JOptionPane.showMessageDialog(panelRegist,

e1.getLocalizedMessage(), "Kesalahan SQL", JOptionPane.ERROR_MESSAGE); }

} }); }

private void reset() { txtUsername.setText(""); txtPassword.setText("");

(10)

txtEmail.setText(""); txtNamaLengkap.setText(""); DTTanggalLahir.setText(""); cmbAsalKota.setSelectedIndex(0); cmbJenisKelamin.setSelectedIndex(0); txtAlamat.setText(""); txtKodePos.setText(""); txtHp.setText("+62"); }

private boolean validasi() {

List<String> errMessage = new ArrayList<String>(); if (txtUsername.getText().isEmpty())

errMessage.add("Username belum terisi."); else if (txtUsername.getText().contains(" "))

errMessage.add("Username tidak boleh ada spasi."); else if (txtUsername.getText().length() < 6)

errMessage.add("Username harus 6 karakter atau lebih."); else if (txtUsername.getText().length() > 15)

errMessage.add("Username tidak boleh melebihi 15 karakter."); if (txtPassword.getText().isEmpty())

errMessage.add("Password belum terisi."); else if (txtPassword.getText().length() < 6)

errMessage.add("Password harus 6 karakter atau lebih."); else if (txtPassword.getText().length() > 12)

errMessage.add("Password tidak boleh melebihi 12 karakter."); if (txtEmail.getText().isEmpty())

errMessage.add("Email belum terisi."); else if (!txtEmail.getText().contains("@")) errMessage.add("Email tidak valid."); else if (txtEmail.getText().length() > 35)

errMessage.add("Email tidak boleh melebihi 35 karakter."); if (txtNamaLengkap.getText().isEmpty())

errMessage.add("Nama lengkap belum terisi."); else if (txtNamaLengkap.getText().length() < 6)

errMessage.add("Nama lengkap harus 6 karakter atau lebih"); else if (txtNamaLengkap.getText().length() > 50)

errMessage.add("Nama lengkap tidak boleh melebihi 50

karakter.");

Date hariIni = new Date();

Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.YEAR, -7);

Date TenYearBefore = calendar.getTime(); if (DTTanggalLahir.getText().isEmpty())

errMessage.add("Tanggal lahir belum terisi."); else if (DTTanggalLahir.getDate().after(hariIni))

errMessage.add("Tanggal lahir tidak boleh di masa depan."); else if (DTTanggalLahir.getDate().after(TenYearBefore))

errMessage.add("Anda harus berusia 7 tahun atau lebih untuk

mendaftar.");

if (cmbAsalKota.getSelectedIndex() == 0)

errMessage.add("Asal kota belum terpilih."); if (cmbJenisKelamin.getSelectedIndex() == 0)

errMessage.add("Jenis kelamin belum terpilih."); if (txtAlamat.getText().isEmpty())

errMessage.add("Alamat masih belum terisi."); else if (txtAlamat.getText().length() < 10)

errMessage.add("Alamat harus 10 karakter atau lebih."); else if (txtAlamat.getText().length() > 100)

(11)

lebih.");

if (txtKodePos.getText().isEmpty())

errMessage.add("Kode pos masih belum terisi."); else if (txtKodePos.getText().length() < 5)

errMessage.add("Alamat harus 5 karakter atau lebih."); else if (txtKodePos.getText().length() > 10)

errMessage.add("Alamat tidak boleh melebihi 10 karakter atau

lebih.");

if (txtHp.getText().isEmpty())

errMessage.add("Nomor ponsel masih belum terisi."); else if (txtHp.getText().length() < 9)

errMessage.add("Nomor ponsel tidak lengkap (harus 8 karakter

lebih).");

else if (txtHp.getText().length() > 15)

errMessage.add("Nomor ponsel tidak boleh melebihi 15 karakter

lebih).");

if (errMessage.size() == 0) return true;

else {

String pesanKesalahan = "Kesalahan berikut perlu Anda tindak

lanjuti :";

int jumlahKesalahan = 1; for (String e: errMessage) {

pesanKesalahan = pesanKesalahan + "\n" + String.valueOf(jumlahKesalahan) + ". " + e;

jumlahKesalahan = jumlahKesalahan + 1; }

JOptionPane.showMessageDialog(panelRegist, pesanKesalahan, "Form

Belum Lengkap", JOptionPane.ERROR_MESSAGE);

return false; }

}

public JPanel getPanelRegist() { return panelRegist; } }

6. Halaman Login

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.SQLException;

public class FormLogin {

private JPanel panelLogin; private JTextField txtUsername; private JButton btnLogin; private JButton btnRegister;

private JPasswordField txtPassword; private JFrame formBerhasilLogin; public JPanel getPanelLogin() { return panelLogin;

}

public FormLogin(final JFrame formLogin){

btnRegister.addActionListener(new ActionListener() { @Override

(12)

public void actionPerformed(ActionEvent e) { HalamanUtama.setContentpane(new FormRegistration().getPanelRegist()); } }); btnLogin.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent e) { String username = txtUsername.getText(); String password = txtPassword.getText(); try {

HasilLogin hasil = BasisData.login(username, password); if (hasil.isSucces){

JOptionPane.showMessageDialog(panelLogin, "Berhasil

Login", "Confirmation", JOptionPane.INFORMATION_MESSAGE);

formBerhasilLogin = new JFrame("Display Sistem"); formBerhasilLogin.setContentPane(new FormBerhasilLogin(formBerhasilLogin, formLogin).getPanelBerhasilLogin()); formBerhasilLogin.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); formBerhasilLogin.setSize(500,520); formBerhasilLogin.setResizable(false); Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize(); formBerhasilLogin.setLocation(dimension.width / 2 - formBerhasilLogin.getSize().width / 2, dimension.height / 2 - formBerhasilLogin.getSize().height / 2); formBerhasilLogin.setVisible(true); txtUsername.setText(""); txtPassword.setText(""); formLogin.setVisible(false); }else{ JOptionPane.showMessageDialog(panelLogin,"Username

Dan Password Tidak Cocok", "Confirmation", JOptionPane.INFORMATION_MESSAGE);

}

} catch (SQLException e1) {

JOptionPane.showMessageDialog(panelLogin,

e1.getLocalizedMessage(), "SQL Exeption", JOptionPane.ERROR_MESSAGE); } } }); } }

7. Halaman About

import javax.swing.*; public class FormAbout {

private JPanel panelAbout; public JPanel getPanelAbout() { return panelAbout; } }

8. Halaman BerhasiLogin

import javax.swing.*; import java.awt.*;

(13)

import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class FormBerhasilLogin {

public JPanel panelBerhasilLogin; private JButton btnLogout;

public FormBerhasilLogin(final JFrame formBerhasilLogin, final JFrame formLogin){

btnLogout.addActionListener(new ActionListener() { @Override

public void actionPerformed(ActionEvent e) { formBerhasilLogin.setVisible(false); formLogin.setVisible(true);

} }); }

public JPanel getPanelBerhasilLogin(){ return panelBerhasilLogin;

} }

(14)

CURICULUM VITAE

Nama

: Ari Sandy Maulana

Place and date of birth

:Tangerang, 29 Maret 1995

Sex

: Laki - laki

Nationality

: Indonesia

Marital Status

: Mahasiswa

ID Number

: None

Pasport Number

: None

Email

: arisandymaulana@gmail.com

Religion

: Islam

Address

: Jl. Parung jaya RT 01/02 Kel. Parung

Jaya Kec. Karang Tengah Tangerang

Phone Number/Mobile

: 087887860953

EDUCATION

Elementary School

: SDN Pondok Bahar 1

Secondary School

: SMPN 24 Tangerang

Senior High School : SMAN 13 Tangerang

University

: Mercu Buana

Degree Award

: Bachelor Degree

Faculty

: Ilmu Komputer

Title Of Thesis

: Studi Kriptanalisis Sistem Kriptografi Monoalphabetik: Studi Kasus

Username Dan Password

GPA

: 3.79

SKILL

Languages

: B. Inggris

Score TOEIC : 800

ORGANIZATION EXPERIENCE

No Of Years

Title

Name Of Organization

WORK EXPERIENCE

No Of Years

Position

Employeer

ACTIVIES NATIONAL/INTERNATIONAL

No Of Years

Position

Employeer

ACHIEVMENT

No Of Years

Title

Honor

HOBBIES

Sports

: Badminton, Football

Various

: None

(15)
(16)

Referensi

Dokumen terkait

“Analisis Pengaruh Tingkat Suku Bunga Pada Bank Umum Terhadap Tabungan, Deposito, Serta Piutang dan Pembiayaan Pada Bank Syariah : Studi Kasus Pada PT.. Bank Muamalat

Tujuan umum asuhan keluarga adalah ditingkatkannya kemampuan keluarga dalam mengatasi masalah kesehatannya secara mandiri dalam mengenal masalah kesehatan keluarga,

Bebas Visa bagi negara-negara anggota Organisasi Konferensi Islam (OKI) dan. keanggotaan Indonesia

The product of the pozzolanic reaction (secondary C-S-H) can incorporate alkali metal ions into their structure and reduce the alkalinity of the pore solution. At the same time, the

Satuan ini memiliki penyebaran di sekitar gunung Seroja – Telaga Menjer dengan litologi berupa lava andesit dan memiliki komposisi utama berupa plagioklas dan piroksen. 

post test pada kelas eksperimen dan kelas kontrol terlebih dahulu peneliti melakukan validitas agar instrument penelitian berupa post.. test yang digunakan dalam mengetahui

Pada makalah ini, akan disimulasikan penggunaan algoritma Dijkstra, salah satu algoritma untuk mencari path terpendek dalam satu graf, dalam menghitung waktu yang

(1) Dalam hal Pemerintah Daerah belum dapat menyediakan rumah negara dan kendaraan dinas jabatan bagi Pimpinan DPRD sebagaimana dimaksud dalam pasal 21, kepada