460 likes | 699 Views
LinguSQL & Studi Kasus Aplikasi Transaksi Saham. Rikky Wenang P. Fakultas Ilmu Komputer UI R.3208 rwenang@ui.edu.
E N D
LinguSQL & Studi Kasus Aplikasi Transaksi Saham Rikky Wenang P. Fakultas Ilmu Komputer UI R.3208 rwenang@ui.edu
1999, Lockheed Martin engineering team used English units of measurement while the agency's team used the more conventional metric system for a key spacecraft operation.They lost a $125 million Mars orbiter. • Doesn’t mean that the engineers are stupid, just to show that the smallest mistake costs a lot.
Tujuan : • Pengenalan LinguSQL sebagai tool pengembangan aplikasi perangkat lunak • Pengenalan prosedur dasar pengembangan komponen perangkat lunak dengan LinguSQL
Daftar Isi • Overview LinguSQL • Development Process • Demo
Latar Belakang • LinguSQL merupakan tool hasil riset fakultas ilmu komputer universitas indonesia. • Konsep bahasa dikembangkan sejak tahun 2003, pengembangan sejak tahun 2005. • Masih dalam tahap pengembangan, terbuka untuk saran dan kritik.
Apa itu LinguSQL ? • Tool pengembangan komponen yang mengintegrasikan proses pengujian : • Whitebox • Pengujian alur algoritma di dalam sebuah perangkat lunak, mis. formal method, model checking. • Blackbox • Pengujian karakteristik input/output, mis. unit testing,skenario. • Spesifik untuk aplikasi database • Menggunakan bahasa abstrak Lingu untuk scripting • Tidak executable, harus diubah menjadi bahasa konkrit lain misal Java, C++
Karakteristik LinguSQL • Komplemen proses pengembangan sistem populer => (SDLC, waterfall,RUP) • Berfokus pada komponen kritis yang memerlukan pengujian secara intensif • Butuh sumber daya waktu dan manusia lebih. • Hasil akhir yang diharapkan : • Komponen terverifikasi secara formal • Komponen yang telah tervalidasi dengan berbagai macam input
Proses Pengembangan 4 proses pengembangan komponen dengan LinguSQL : • Identifikasi kebutuhan data dan fungsi • Verifikasi spesifikasi komponen secara formal • Validasi input/output komponen • Transformasi ke bahasa konkrit
Proses 1 : Identifikasi kebutuhan data dan fungsi • Identifikasi kebutuhan data dan fungsi • Analogi dengan analisa kebutuhan dan desain sistem pada metodologi konvensional • Berfokus kepada data dan fungsi yang sangat kritis untuk aplikasi tersebut. • Mis. proses transaksi pada bursa saham, proses kliring pada sistem perbankan, dll. • Hasil akhir adalah struktur data dan algoritma fungsi dengan bahasa Lingu
Proses 2 : Proses Verifikasi • Proses verifikasi membutuhkan spesifikasi formal untuk tiap prosedur yang akan diuji. • Spesifikasi disusun berdasarkan prosedur yang ada beserta prekondisi dan postkondisi yang diharapkan. • Prosedur + Spesifikasi => LinguHOL script • Spesifikasi dibuktikan kebenarannya dengan bantuan HOL theorem prover • Kasus tertentu membutuhkan bantuan manusia untuk melakukan pembuktian.
Proses 3 : Proses Validasi • Proses validasi melakukan pengujian prosedur secara blackbox. • memeriksa output yang dihasilkan jika diberi input dengan jangkauan tertentu • Spesifikasi harus didefinisikan untuk memeriksa hasil output prosedur • Validasi dilakukan terhadap database dengan data yang digenerate secara otomatis. • Salah satu fitur LinguSQL adalah data generator
Proses 4 : Proses Transformasi • Proses transformasi mengubah skrip Lingu menjadi bahasa konkrit, mis. Java. • Fitur transformasi bersifat modular • Lingu memiliki portabilitas yang luas • Dapat dikembangkan untuk bahasa-bahasa pemrograman konkrit lainnya • Transformasi menghasilkan komponen yang merupakan bagian dari sistem informasi yang lebih besar.
type RegistrationTable = Record {| ID :: String; Name :: String; Sex :: Integer; Category :: Integer; StudyProgramme :: String; |} type SETdb = Dbase {| SubmitTab :: Table AnswerFormTable; MasterTab :: Table RegistrationTable; HealthyAFormTab :: Table AnswerFormTable; SolutionsTab :: Table SolutionTable; PassTab :: Table RegistrationTable; |} class SETutility (d::SETdb) { method filterUnknown() :: () ids, okids :: Table {| ID :: String; |}; do { ids := findAll s<-d.SubmitTab where T found s.ID,s.Name; insertAll i<-ids,r<-d.MasterTab where i.ID==r.ID to okids; delete ids where ids.ID in okids.ID; insertAll s<-d.submitTab, i <-ids where s.ID==i.ID to d.UnknownAFormTab; } } validation fairness (sex::String) :: Bool { result0 :: RegistrationTable; do { call evaluate(); result0 := d.PassTab; call changeSex(sex); call evaluate(); } return result0 == Passtab; pre T; post return == T; } Contoh Kode Lingu : SET
Record = Struktur data representasi dari tabel data type RegistrationTable = Record {| ID :: String; Name :: String; Sex :: Integer; Category :: Integer; StudyProgramme :: String; |} DBase = representasi dari database yang memiliki tabel-tabel data type SETdb = Dbase {| SubmitTab :: Table AnswerFormTable; MasterTab :: Table RegistrationTable; HealthyAFormTab :: Table AnswerFormTable; SolutionsTab :: Table SolutionTable; PassTab :: Table RegistrationTable; |} Struktur Data :
class SETutility (d::SETdb) { method filterUnknown() :: () ids, okids :: Table {| ID :: String; |}; do { ids := findAll s<-d.SubmitTab where T found s.ID,s.Name; insertAll i<-ids,r<-d.MasterTab where i.ID==r.ID to okids; delete ids where ids.ID in okids.ID; insertAll s<-d.submitTab, i <-ids where s.ID==i.ID to d.UnknownAFormTab; } } Memiliki method dengan parameter dan return value Memiliki operator database native, mis. Findall, insertall, delete, dsb. Seluruh parameter dalam class merupakan pass-by-value Struktur Class
Definisi metode pengujian blackbox Menggunakan method yang telah didefinisikan sebelumnya Memiliki spesifikasi prekondisi dan postkondisi validation fairness (sex::String) :: Bool { result0 :: RegistrationTable; do { call evaluate(); result0 := d.PassTab; call changeSex(sex); call evaluate(); } return result0 == Passtab; pre T; post return == T; } Struktur Validation
Studi Kasus • Aplikasi Transaksi Saham • LinguSQL akan menggunakan sebuah studi kasus sederhana dari sistem transaksi saham yang berdasarkan prosedur nyata. • Sistem ini mensimulasikan aktifitas transaksi saham dari pembelian, penjualan, dan finalisasi transaksi yang terjadi pada pasar saham Indonesia.
Studi Kasus (2) Prosedur Transaksi : • Broker pembeli dan penjual memberikan penawaran jual/beli saham • Sistem mencocokkan permintaan dan penawaran yang cocok • Sistem mencatatkan transaksi yang terjadi • Penyelesaian (pembayaran) transaksi
Pengembangan dengan LinguSQL Proses 1: Identifikasi Kebutuhan • Identifikasi objek dari skenario penggunaan sistem. • Identifikasi prosedur kritis yang perlu dilakukan oleh komponen program.
Identifikasi Data Prosedur Transaksi : • Broker pembeli dan penjual memberikan penawaran jual/belisaham • Sistem mencocokkan permintaan dan penawaran saham yang cocok • Sistem mencatatkan transaksi yang terjadi • Penyelesaian (pembayaran) transaksi
Identifikasi Data (2) Representasi Data dalam Lingu : # Data Penawaran Transaksi type TransactionTable = Record {| Id :: Integer; Timestamp :: String; Broker_Id :: Integer; Stock_Id :: Integer; Amount :: Integer; Price :: Integer;|} # Data Transaksi Final Saham type FinalTransactionTable = Record {| Timestamp :: String; Buy_Id :: Integer ; Sell_Id :: Integer ; Buyer_Broker_Id :: String; Seller_Broker_Id :: String; Stock_Id :: Integer; Amount :: Integer; Price :: Integer;|} # Data Saham type StockListTable = Record {| Id :: Integer; Stock_Name :: String; Stock_Volume :: Integer; Current_Price :: Integer; Update_Timestamp :: String; |} # Data Broker type BrokerListTable = Record {| Id :: Integer; Broker_Name :: String; Trading_Limit :: Integer; |} |}
Identifikasi Prosedur • Fungsi Utama => Pemetaan transaksi • Mencocokan permintaan pembelian dan penjualan dengan harga yang sesuai. • Fungsi Pendukung => memastikan operasi sesuai aturan transaksi saham. • Pemeriksaan kevalidan permintaan • Pemeriksaan trading limit • Pemeriksaan kevalidan broker saham
Identifikasi Prosedur (2) method filterInvalidBrokerTransaction () :: () ok_ids,ids :: Table {| Id :: Integer; |}; do { // Ambil seluruh ID dari order pembelian saham ids := findAll d<-database.BuyTransactionTab where T found d.Id; // Ambil seluruh ID order pembelian yang memiliki ID broker yang valid ok_ids := findAll d<-database.BuyTransactionTab, b<-database.BrokerTab where d.Broker_Id == b.Id found d.Id; // Hapus ID order pembelian yang terdapat di tabel ok_ids, // sisanya adalah ID order yang tidak memiliki ID broker yang valid delete ids where ids.Id in ok_ids.Id; // Masukkan data order yang tersisa ke tabel transaksi invalid insertAll d<-database.BuyTransactionTab, i<-ids where d.Id == ids.Id to database.InvalidTransactionTab; }
Proses 2 : Verifikasi Prosedur • Verifikasi pada LinguSQL menggunakan bantuan HOL theorem prover • Membutuhkan spesifikasi tambahan untuk tiap-tiap prosedur • Prekondisi : kondisi yang harus dipenuhi sebelum prosedur • Postkondisi : kondisi yang harus dipenuhi setelah prosedur • Skrip Lingu harus diubah menjadi skrip LinguHOL untuk melakukan verifikasi.
Skrip LinguHOL val filterInvalidBrokerTransaction_def = Define `filterInvalidBrokerTransaction ( REF ( BrokerTab : BrokerListTable set), REF ( BuyTransactionTab : TransactionTable set), REF ( InvalidTransactionTab : TransactionTable set) ) = pre (empty InvalidTransactionTab /\ ~(empty BrokerTab) /\ ~(empty BuyTransactionTab) ) post ( ALLof InvalidTransactionTab (satisfy r. ALLof BrokerTab(satisfy q. ~(r.Broker_Id = q.Id)))) do /{ let badids = select BuyTransactionTab I (only r. ALLof BrokerTab(satisfy t. ~(t.Id = r.Broker_Id))) in insert badids InvalidTransactionTab I ALL /} return void`; (*----- the verification -----*) reduce defs filterInvalidBrokerTransaction_def ; L0min_vcg.autoverify MY_TAC ; L0min_vcg.VCs; L0min_vcg.conclude();
Bagaimana Verifikasi Mencegah Kesalahan ? Algoritma “filter invalid broker” yang benar : pre (empty InvalidTransactionTab /\ ~(empty BrokerTab) /\ ~(empty BuyTransactionTab) ) post ( ALLof InvalidTransactionTab (satisfy r. ALLof BrokerTab(satisfy q. ~(r.Broker_Id = q.Id)))) do /{ let badids = select BuyTransactionTab I (only r. ALLof BrokerTab(satisfy t. ~(t.Id = r.Broker_Id))) in insert badids InvalidTransactionTab I ALL /} return void`;
Bagaimana Verifikasi Mencegah Kesalahan ? Algoritma “filter invalid broker”yang salah : pre (empty InvalidTransactionTab /\ ~(empty BrokerTab) /\ ~(empty BuyTransactionTab) ) post ( ALLof InvalidTransactionTab (satisfy r. ALLof BrokerTab(satisfy q. ~(r.Broker_Id = q.Id)))) do /{ let badids = select BuyTransactionTab I (only r. ALLof BrokerTab(satisfy t. (t.Id = r.Broker_Id))) in insert badids InvalidTransactionTab I ALL /} return void`;
Bagaimana Verifikasi Mencegah Kesalahan ? • Pembuktian spesifikasi dengan menggunakan formal method : • Hoare Triple {P} C {Q} • Mengidentifikasikan kesalahan logika • Pitfall verifikasi : • Verifikasi => proses berdasarkan asumsi • Analisa kebutuhan yang benar • => Spesifikasi yang benar
Proses 3 : Validasi Prosedur • Proses validasi melakukan pengujian terhadap output sebuah prosedur sesuai dengan inputnya. • Pengujian lebih berfokus ke output state database setelah dilakukan prosedur. • Pengujian dilakukan dengan bantuan data generator untuk melakukan populasi data sesuai spesifikasi.
Skrip Validasi validation checkInvalidBrokerFilter() :: Bool { temp_trans :: TransactionTable; temp_broker :: BrokerListTable; isNotInInvalid, isInValid :: Bool; isNotInInvalid2, isInValid2 :: Bool; do { temp_trans.Id := 10; temp_trans.Broker_id := 1; temp_trans.Stock_id := 5; temp_trans.Amount := 10; temp_trans.Price := 100; temp_broker.Id := 1; temp_broker.Trading_Limit := 1000; insertAll x<-temp_trans where T to database.BuyTransactionTab; insertAll y<-temp_broker where T to database.BrokerTab; call filterInvalidBrokerTransaction(); isNotInInvalid := find a<-database.InvalidTransactionTab where a.Id == temp_trans.Id found F otherwise T; isInValid := find a<-database.BuyTransactionTab where a.Id == temp_trans.Id found T otherwise F; } return isNotInInvalid /\ IsInValid; pre T; post T; }
Proses 4 : Transformasi Kode • Jika verifikasi dan validasi sukses, kode Lingu diubah ke bahasa konkrit untuk implementasi. • Aspek portabilitas meminimalkan masalah migrasi aplikasi dari satu bahasa ke bahasa lain di masa depan. • LinguSQL saat ini mampu melakukan transformasi Lingu ke Java. • Menggunakan Atribute Grammar • Hasil java bisa di-compile namun belum bisa dijalankan secara independen
Penutup • LinguSQL sebagai tool pengembangan aplikasi database yang menekankan kepada pengujian secara formal dan blackbox. • LinguSQL adalah teknologi komplemen bukan substitusi dari bahasa konkrit. • Hasil akhir yang diharapkan adalah komponen kode yang : • Terverifikasi secara formal • Tervalidasi dengan jangkauan input tertentu
Terima Kasih Kritik & Saran : - rwenang@ui.edu - ade@cs.ui.ac.id