Upload files to "Tugas Composing Concepts"

This commit is contained in:
5803025018 2026-09-14 06:47:43 -04:00
commit d8015d59ac

View File

@ -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.