commit d8015d59ac7516d942d38b28e627af3f22a3b9dd Author: 5803025018 Date: Mon Sep 14 06:47:43 2026 -0400 Upload files to "Tugas Composing Concepts" diff --git a/Tugas Composing Concepts/Composing Concepts.md b/Tugas Composing Concepts/Composing Concepts.md new file mode 100644 index 0000000..06d6676 --- /dev/null +++ b/Tugas Composing Concepts/Composing Concepts.md @@ -0,0 +1,145 @@ +Bagian 1: Concept Questions + +1. Contexts +Fungsi Context: Context berfungsi sebagai ruang lingkup (namespace) pembatas untuk keunikan nonce. Dengan adanya context, sistem hanya perlu menjamin bahwa nonce unik di dalam konteks yang sama, bukan secara global di seluruh database. + +Wujud pada Aplikasi URL Shortener: Dalam aplikasi nyata, context mewakili nama domain dasar (base URL), seperti bit.ly, tinyurl.com, atau domain kustom milik pengguna. Hal ini memungkinkan nonce yang sama digunakan di domain berbeda tanpa mengalami konflik data (contoh: bit.ly/abc dan [domainku.com/abc](https://domainku.com/abc) dapat berdiri sendiri). + +2. Storing Used Strings (Abstraction Function) +Alasan Menyimpan Himpunan Strings pada Spesifikasi: Spesifikasi abstrak bertugas mendefinisikan logika kebenaran perilaku (behavioral correctness) tanpa terikat detail teknik pemrograman. Himpunan used set of Strings dibutuhkan untuk menyatakan prinsip keunikan secara eksplisit: aksi generate tidak boleh mengembalikan string yang sudah ada di dalam himpunan used. + +Hubungan dengan Counter (Abstraction Function): +Jika implementasi konkret menggunakan variabel angka counter c (dimulai dari 0) dan fungsi enkoding f(i) untuk mengubah angka menjadi string (misalnya fungsi pemetaan Base62), maka Abstraction Function (AF) yang menghubungkan state konkret dengan state abstrak adalah: + +AF(c)={f(i)∣1≤i≤c} +Artinya, himpunan used pada tingkat spesifikasi abstrak setara dengan kumpulan seluruh string hasil enkoding angka 1 sampai dengan nilai counter saat ini (c). + +3. Words as Nonces +Kelebihan (Perspektif Pengguna): URL mudah diingat dan diucapkan (human-friendly / memorable). Pengguna lebih gampang membagikan tautan secara lisan (contoh: [domain.com/kopi](https://domain.com/kopi)). + +Kekurangan (Perspektif Pengguna): Kapasitas kata terbatas (space exhaustion) dan sangat mudah ditebak (predictable). Begitu kata tunggal habis, URL akan menjadi panjang (misal: [domain.com/kopi-pagi-dingin](https://domain.com/kopi-pagi-dingin)) sehingga kehilangan keunggulannya sebagai URL singkat. Selain itu, tautan rentan di-scan oleh pihak yang tidak bertanggung jawab (brute-force). + +Modifikasi Konsep NonceGeneration: + +Plaintext +concept NonceGeneration [Context] +purpose generate unique dictionary word strings within a context +principle each generate returns an unallocated dictionary word for that context +state + a set of Contexts with + a dictionary set of Strings + a used set of Strings +actions + generate (context: Context) : (nonce: String) + requires (dictionary \ used) is not empty + effect returns a nonce belonging to (dictionary \ used) and adds it to used + +Bagian 2: Synchronization Questions + +1. Partial Matching +Aksi NonceGeneration.generate pada sync generate hanya membutuhkan shortUrlBase karena pembuat nonce hanya perlu mengetahui konteks domain tempat string tersebut diproduksi. Aksi tersebut tidak peduli URL tujuan (targetUrl)-nya apa. Sebaliknya, sync register membutuhkan targetUrl dan shortUrlBase karena aksi UrlShortening.register bertugas menyimpan pemetaan akhir secara utuh antara short URL dan target URL. + +2. Omitting Names +Aturan penulisan ringkas (omisi) hanya berlaku apabila nama parameter aksi sama persis dengan nama variabel lokal pada sync (seperti targetUrl: targetUrl yang disingkat menjadi targetUrl). Konvensi ini tidak bisa dipakai jika nama parameter pada konsep berbeda dengan nama variabel yang dioper—seperti argumen shortUrlSuffix yang nilainya diambil dari variabel nonce, atau context yang nilainya dari shortUrlBase. Penulisan eksplisit wajib dilakukan untuk menjaga kejelasan pemetaan variabel. + +3. Inclusion of Request +Sync pertama dan kedua mengikutsertakan konsep Request karena kedua aksi tersebut dipicu langsung oleh permintaan pengguna dari luar (user-driven event). Sedangkan sync ketiga (setExpiry) tidak membutuhkan Request karena merupakan reaksi internal sistem (system-driven event) yang berjalan otomatis tepat setelah aksi UrlShortening.register selesai dieksekusi. + +4. Fixed Domain +Jika aplikasi hanya mendukung satu domain tetap (misalnya "bit.ly"), variabel shortUrlBase dihilangkan dari input Request, lalu dimasukkan sebagai nilai konstanta string secara langsung pada sync: + +Plaintext +sync generate +when Request.shortenUrl () +then NonceGeneration.generate (context: "bit.ly") + +sync register +when + Request.shortenUrl (targetUrl) + NonceGeneration.generate (): (nonce) +then UrlShortening.register (shortUrlSuffix: nonce, shortUrlBase: "bit.ly", targetUrl) + +5. Adding a Sync (Resource Expiration) +Sinkronisasi untuk menghapus short URL secara otomatis ketika masa berlakunya pada ExpiringResource habis: + +Plaintext +sync expire +when ExpiringResource.expireResource () : (resource) +then UrlShortening.delete (shortUrl: resource) + +Bagian 3: Extending the Design + +1. Rancangan Konsep Baru (Analitik & Hak Akses) +Plaintext +concept Analytics [Resource] +purpose track lookup access counts for resources +principle lookup count increases each time increment is called +state + a set of Resources with + a count Number +actions + initialize (resource: Resource) + effect sets count for resource to 0 + increment (resource: Resource) + effect increases count for resource by 1 + getCount (resource: Resource) : (count: Number) + effect returns the count for resource + +concept UserOwnership [User, Resource] +purpose manage private ownership of resources +principle only the assigned owner of a resource can access its metrics +state + a set of Ownerships with + a user User + a resource Resource +actions + assignOwner (user: User, resource: Resource) + effect sets user as the owner of resource + isOwner (user: User, resource: Resource) : (allowed: Boolean) + effect returns true if user is the owner of resource + +2. Tiga Sinkronisasi Utama +Plaintext +// 1. Inisialisasi Analitik & Kepemilikan saat URL dibuat +sync onCreateShortening +when + Request.shortenUrl (user) + UrlShortening.register (): (shortUrl) +then + Analytics.initialize (resource: shortUrl) + UserOwnership.assignOwner (user, resource: shortUrl) + +// 2. Menambah hit hitungan setiap kali URL diakses/diklik +sync onUrlLookup +when UrlShortening.lookup (shortUrl) +then Analytics.increment (resource: shortUrl) + +// 3. Menampilkan analitik khusus untuk pemilik URL (privat) +sync onViewAnalytics +when + Request.getAnalytics (user, shortUrl) + UserOwnership.isOwner (user, resource: shortUrl) : (allowed: true) + Analytics.getCount (resource: shortUrl) : (count) +then Response.showAnalytics (count) + +3. Evaluasi Modul (5 Skenario Fitur) + +1. Memungkinkan pengguna memilih URL singkat sendiri: + +Realisasi: Tambahkan sync baru registerCustom yang langsung memanggil UrlShortening.register dengan suffix pilihan pengguna tanpa melewati NonceGeneration. Prekondisi di UrlShortening akan otomatis menolak jika suffix tersebut sudah terpakai. Tidak perlu mengubah konsep yang ada. + +2. Menggunakan strategi "word as nonce": + +Realisasi: Cukup ubah logika internal konsep NonceGeneration (mengambil kata dari dictionary). Konsep UrlShortening maupun aturan sync tidak perlu diubah sama sekali. + +3. Menyertakan Target URL dalam analitik (mengelompokkan short URL dengan target sama): + +Realisasi: Dapat direalisasikan dengan membuat query/sync layer baru. Sistem mencari seluruh shortUrl di UrlShortening yang memiliki targetUrl sama, lalu menjumlahkan nilai count-nya dari Analytics. Desain modular tetap terjaga. + +4. Menghasilkan short URL yang tidak mudah ditebak: + +Realisasi: Cukup ubah algoritma pembangkitan pada aksi generate di konsep NonceGeneration menggunakan pengacak kriptografis (misal UUID atau hash acak) alih-alih angka berurutan (counter). + +5. Mendukung laporan analitik untuk pembuat URL yang belum mendaftar sebagai user: + +Evaluasi: Ditolak / Tidak Disarankan. Tanpa entitas User yang terverifikasi, konsep UserOwnership tidak bisa memastikan siapa pemilik sah dari tautan tersebut. Akibatnya, data analitik akan terbuka untuk publik dan merusak spesifikasi privasi yang diwajibkan. \ No newline at end of file