Ders 06 / 21
En Az Yetki Uygulaması
Verilen izin ile kullanılan izin yan yana konur: kullanılmayan izin oranı, daraltılmış politikanın satır sayısı ve daraltmanın durdurduğu meşru iş sayılır. Gözlem penceresi taranır ve güvenli daraltma eşiği sayıyla verilir.
İçindekiler
Önceki ders kimliğin nereden geldiğini değiştirdi; ne yapabildiği açık kaldı. Politika belgeleri yazılırken izinler çoğunlukla tek tek değil aile düzeyinde verilir: bir satır ölçüm ailesinin bütün izinlerini açar, çünkü satır yazmak pahalı, izin saymak ucuzdur. Bu dersin sorusu o satırların ne kadarının gerçekten kullanıldığıdır. Verilen izin kümesi ile kullanım geçmişi yan yana konuyor ve üç şey sayılıyor: kullanılmayan izin oranı, daraltılmış politikanın kaç satır ettiği ve daraltmanın kaç meşru işi durdurduğu. Üçüncüsü ilk ikisi kadar önemlidir: geçmişte hiç görünmemiş bir yol, gerekli olmadığı anlamına gelmez.
- BI31. Sekiz iş yükü, sekiz kaynak ailesi ve on sekiz izin kurgusal bölgesel ölçüm ağına
aittir; ölçülen şey
nodeile yazılan modeldir. - BI32. Gerçek ihtiyaç listesi ölçülmedi, seçildi; her yolun ortalama kullanım aralığı bir model kararıdır. Gerçekte bu liste bilinmez — dersin noktası zaten onun bilinmemesidir.
- BI33. Kullanım geçmişi kendi yazılan doğrusal eşlemeli üreteçle üretildi. Tohum görünür ve sabittir; çıktı koşumdan koşuma aynı kalır.
- BI34. Bir izin ya kullanıldı ya kullanılmadı. Koşul ifadesi ve kaynak düzeyinde daraltma modellenmiyor; bunlar daraltmayı derinleştirir, yönünü değiştirmez.
- BI35. Verilen politika aile düzeyinde yazıldı, daraltılmış politika izin düzeyinde yazılıyor. Satır sayısı bu yüzden ayrı bir ölçüdür.
- BI36. Sınama dönemi ikinci doksan gündür ve aynı üreteç akışından gelir. Daraltılmış politikanın kaç meşru işi durdurduğu orada sayılıyor.
Verilen İzin ile Gerçek İhtiyaç
Model üç şeyi ayrı tutuyor: aile düzeyinde yazılmış politika, onun açtığı izin kümesi ve her iş yükünün gerçekten ihtiyaç duyduğu yollar. Üçüncüsü gerçek bir sistemde bilinmez; burada bilinir kılınıyor ki daraltmanın isabeti ölçülebilsin.
// yetki.mjs — verilen izin, gercek ihtiyac ve kullanim gecmisi modeli // Kurgusal bolgesel olcum agi; sekiz is yuku, sekiz kaynak ailesi. Olculen sey bu modeldir. export const AILE = { olcum: ['oku', 'yaz', 'sil'], kuyruk: ['oku', 'yaz', 'yonet'], arsiv: ['oku', 'yaz', 'sil'], fatura: ['oku', 'yaz'], 'is-emri': ['oku', 'yaz'], gunluk: ['oku', 'yaz'], yapilandirma: ['oku', 'yaz'], posta: ['gonder'], }; export const IZIN = Object.entries(AILE).flatMap(([a, e]) => e.map((x) => `${a}-${x}`)); // Verilen politika aile duzeyinde yazildi: bir satir bir ailenin butun izinlerini veriyor. export const VERILEN = { 'okuma-toplayici': ['olcum', 'kuyruk'], 'dogrulayici': ['olcum', 'kuyruk'], 'gunluk-tasiyici': ['gunluk', 'yapilandirma'], 'faturalama': ['fatura', 'posta', 'arsiv'], 'is-emri': ['is-emri', 'kuyruk', 'posta'], 'gecelik-toplu-is': ['olcum', 'arsiv', 'fatura'], 'arsivleyici': ['arsiv'], 'rapor-uretici': ['fatura', 'arsiv', 'gunluk'], }; export const OZNE = Object.keys(VERILEN); // Gercek ihtiyac: izin -> ortalama kullanim araligi (gun). Model karari; olculmedi, secildi. export const GERCEK = { 'okuma-toplayici': { 'olcum-yaz': 1, 'kuyruk-yaz': 1, 'olcum-oku': 3 }, 'dogrulayici': { 'olcum-oku': 1, 'kuyruk-oku': 1, 'olcum-yaz': 2, 'olcum-sil': 30 }, 'gunluk-tasiyici': { 'gunluk-yaz': 1, 'yapilandirma-oku': 7 }, 'faturalama': { 'fatura-oku': 1, 'fatura-yaz': 1, 'posta-gonder': 2, 'arsiv-oku': 45 }, 'is-emri': { 'is-emri-yaz': 1, 'is-emri-oku': 1, 'kuyruk-oku': 1, 'posta-gonder': 5 }, 'gecelik-toplu-is': { 'olcum-oku': 1, 'arsiv-yaz': 1, 'fatura-oku': 7, 'olcum-sil': 20 }, 'arsivleyici': { 'arsiv-oku': 1, 'arsiv-yaz': 1, 'arsiv-sil': 60 }, 'rapor-uretici': { 'fatura-oku': 1, 'arsiv-oku': 7, 'gunluk-oku': 30 }, }; export const DONEM = 90; // gozlenen gun sayisi export const TOHUM = 20260802; // uretecin tohumu; gorunur ve sabit export const PENCERE = [1, 7, 14, 30, 60, 90]; export const verilenIzin = (o) => VERILEN[o].flatMap((a) => AILE[a].map((x) => `${a}-${x}`)); export const verilenCift = OZNE.flatMap((o) => verilenIzin(o).map((i) => `${o}|${i}`)); export const gercekCift = OZNE.flatMap((o) => Object.keys(GERCEK[o]).map((i) => `${o}|${i}`)); export const araligi = (c) => GERCEK[c.split('|')[0]][c.split('|')[1]]; // Kendi uretecimiz: dogrusal eslesmeli uretec; tohumdan baslar, kosumdan kosuma ayni diziyi verir. export function uretec(tohum) { let s = tohum >>> 0; return () => { s = (Math.imul(s, 1664525) + 1013904223) >>> 0; return s / 4294967296; }; } // Gecmis: her gun her gercek cift 1/aralik olasilikla kullanilir. export function gecmisUret(gun, tohum) { const r = uretec(tohum), g = []; for (let d = 0; d < gun; d++) for (const c of gercekCift) if (r() < 1 / araligi(c)) g.push([d, c]); return g; }
// kosum1.mjs — verilen izin ile gercek ihtiyac yan yana: kullanilmayan izin orani import { OZNE, VERILEN, GERCEK, IZIN, verilenIzin, verilenCift, gercekCift } from './yetki.mjs'; console.log('ozne satir verilen gercek kullanilmayan'); let satir = 0; for (const o of OZNE) { const v = verilenIzin(o), g = Object.keys(GERCEK[o]); satir += VERILEN[o].length; console.log(`${o.padEnd(18)}${String(VERILEN[o].length).padStart(5)}${String(v.length).padStart(9)}` + `${String(g.length).padStart(8)}${String(v.length - g.length).padStart(15)}`); } const kullanilmayan = verilenCift.length - gercekCift.length; console.log(''); for (const [ad, v] of [ ['izin katalogu', IZIN.length], ['verilen politika satiri (ozne, aile)', satir], ['verilen (ozne, izin) kalemi', verilenCift.length], ['gercekten gereken kalem', gercekCift.length], ['kullanilmayan izin kalemi', `${kullanilmayan} (%${Math.round((kullanilmayan / verilenCift.length) * 100)})`], ]) console.log(`${ad.padEnd(38)}${v}`);
ozne satir verilen gercek kullanilmayan okuma-toplayici 2 6 3 3 dogrulayici 2 6 4 2 gunluk-tasiyici 2 4 2 2 faturalama 3 6 4 2 is-emri 3 6 4 2 gecelik-toplu-is 3 8 4 4 arsivleyici 1 3 3 0 rapor-uretici 3 7 3 4 izin katalogu 18 verilen politika satiri (ozne, aile) 19 verilen (ozne, izin) kalemi 46 gercekten gereken kalem 27 kullanilmayan izin kalemi 19 (%41)
On dokuz satırlık politika kırk altı (özne, izin) kalemi açıyor; gerçekten gereken yirmi yedi.
On dokuz kalem, yani verilen iznin yüzde kırk biri hiç kullanılmıyor. Bu kalemler yanlışlıkla
eklenmedi — hiçbiri tek tek yazılmadı. Aile düzeyinde yazılan bir satır, ailenin bütün izinlerini
birlikte getirdi.
Satır sütunu farkın nereden geldiğini gösteriyor. Arşivleyici tek satırla üç izin alıyor ve üçünü de kullanıyor; kullanılmayan izni sıfır. Rapor üretici üç satırla yedi izin alıyor ve üçünü kullanıyor; dördü boşta. Gecelik toplu iş üç satırla sekiz izin alıyor, dördü boşta. Bir satır ne kadar geniş bir aileye dokunuyorsa fazlalık o kadar büyüyor; ölçüm ve arşiv aileleri üçer izin taşıyor ve fazlalığın çoğu bu iki ailenin silme izninde birikiyor.
Kullanım Geçmişi
Kullanılmayan izni gerçek bir sistemde bulmanın tek yolu geçmişe bakmaktır. Model doksan günlük bir kullanım geçmişi üretiyor; ardından gelen doksan gün sınama dönemi olarak ayrılıyor.
// kosum2.mjs — 90 gunluk kullanim gecmisi uretilir; nadir yollar ayri sayilir import { DONEM, TOHUM, gercekCift, araligi, gecmisUret } from './yetki.mjs'; const tam = gecmisUret(2 * DONEM, TOHUM); // ilk donem gozlem, ikincisi sinama const gecmis = tam.filter(([d]) => d < DONEM); const sayim = new Map(gercekCift.map((c) => [c, 0])); for (const [, c] of gecmis) sayim.set(c, sayim.get(c) + 1); console.log(`tohum ${TOHUM}, donem ${DONEM} gun, olay ${gecmis.length}, sinama donemi ${tam.length - gecmis.length} olay\n`); console.log('araligi 7 gun ve uzeri olan gercek yollar:'); console.log('cift aralik 90 gunde ilk gorulme'); for (const c of gercekCift.filter((x) => araligi(x) >= 7)) { const ilk = gecmis.find(([, x]) => x === c); console.log(`${c.padEnd(34)}${String(araligi(c)).padStart(6)}${String(sayim.get(c)).padStart(10)}` + `${(ilk ? `${ilk[0] + 1}. gun` : 'gorulmedi').padStart(13)}`); } const gorulen = new Set(gecmis.map(([, c]) => c)); console.log(''); for (const [ad, v] of [ ['gercek yol', gercekCift.length], ['90 gunde en az bir kez gorulen', gorulen.size], ['90 gunde hic gorulmeyen gercek yol', gercekCift.filter((c) => !gorulen.has(c)).join(', ') || 'yok'], ]) console.log(`${ad.padEnd(36)}${v}`);
tohum 20260802, donem 90 gun, olay 1545, sinama donemi 1521 olay araligi 7 gun ve uzeri olan gercek yollar: cift aralik 90 gunde ilk gorulme dogrulayici|olcum-sil 30 1 8. gun gunluk-tasiyici|yapilandirma-oku 7 12 1. gun faturalama|arsiv-oku 45 2 25. gun gecelik-toplu-is|fatura-oku 7 15 3. gun gecelik-toplu-is|olcum-sil 20 7 5. gun arsivleyici|arsiv-sil 60 0 gorulmedi rapor-uretici|arsiv-oku 7 9 6. gun rapor-uretici|gunluk-oku 30 3 25. gun gercek yol 27 90 gunde en az bir kez gorulen 26 90 gunde hic gorulmeyen gercek yol arsivleyici|arsiv-sil
Doksan günde bin beş yüz kırk beş olay birikiyor ama bu sayı yanıltıcıdır: olayların ezici çoğunluğu günlük koşan on beş yoldan geliyor. Tablo yalnız aralığı bir haftadan uzun olanları listeliyor. Doğrulayıcının silme izni doksan günde bir kez kullanıldı, sekizinci gün; faturalama arşivi iki kez okudu, ilki yirmi beşinci gün.
Son satır bu dersin sert bulgusudur. Arşivleyicinin silme izni doksan günün hiçbir gününde kullanılmadı. Yirmi yedi gerçek yoldan yirmi altısı görüldü, biri görülmedi — ve görülmeyen o yol gerçek bir yoldur. Geçmişe bakan bir daraltma onu kullanılmayan izin sayar ve keser. Kesildikten sonra ne olacağı, o yolun ne zaman koşacağına bağlıdır; altmış günde bir koşan bir yol için bu, kesmeden sonraki herhangi bir gün olabilir.
Gözlem Penceresi Taraması
Gözlem penceresi bir seçimdir: kısa pencere daha çok keser, uzun pencere daha az yanılır. İkisi arasındaki değiş tokuş sayıyla çıkarılabilir.
// kosum3.mjs — gozlem penceresi taranir: ne kadar kesiyor, ne kadar yanlis kesiyor import { DONEM, TOHUM, PENCERE, verilenCift, gercekCift, gecmisUret } from './yetki.mjs'; const tam = gecmisUret(2 * DONEM, TOHUM); const gecmis = tam.filter(([d]) => d < DONEM), sinama = tam.filter(([d]) => d >= DONEM); console.log('pencere daraltilmis kullanilmayan yanlis sinamada engellenen'); console.log('(gun) satir izin orani kesme engellenen is yuku'); for (const p of PENCERE) { const gor = new Set(gecmis.filter(([d]) => d >= DONEM - p).map(([, c]) => c)); const yanlis = gercekCift.filter((c) => !gor.has(c)); const engel = sinama.filter(([, c]) => !gor.has(c)); const oran = Math.round(((verilenCift.length - gor.size) / verilenCift.length) * 100); console.log(`${String(p).padEnd(9)}${String(gor.size).padEnd(13)}${`%${oran}`.padEnd(15)}` + `${String(yanlis.length).padEnd(9)}${String(engel.length).padEnd(12)}` + `${new Set(engel.map(([, c]) => c.split('|')[0])).size}`); } console.log('\npencere daraldikca hangi gercek yollar kesiliyor:'); for (const p of PENCERE) { const gor = new Set(gecmis.filter(([d]) => d >= DONEM - p).map(([, c]) => c)); const y = gercekCift.filter((c) => !gor.has(c)); console.log(` ${String(p).padStart(2)} gun ${y.length ? y.slice(0, 4).join(', ') + (y.length > 4 ? ` (+${y.length - 4})` : '') : 'yok'}`); }
pencere daraltilmis kullanilmayan yanlis sinamada engellenen (gun) satir izin orani kesme engellenen is yuku 1 19 %59 8 69 7 7 22 %52 5 12 4 14 23 %50 4 10 3 30 24 %48 3 5 2 60 25 %46 2 4 1 90 26 %43 1 0 0 pencere daraldikca hangi gercek yollar kesiliyor: 1 gun okuma-toplayici|olcum-oku, dogrulayici|olcum-sil, gunluk-tasiyici|yapilandirma-oku, faturalama|arsiv-oku (+4) 7 gun dogrulayici|olcum-sil, faturalama|arsiv-oku, gecelik-toplu-is|olcum-sil, arsivleyici|arsiv-sil (+1) 14 gun dogrulayici|olcum-sil, faturalama|arsiv-oku, gecelik-toplu-is|olcum-sil, arsivleyici|arsiv-sil 30 gun dogrulayici|olcum-sil, faturalama|arsiv-oku, arsivleyici|arsiv-sil 60 gun dogrulayici|olcum-sil, arsivleyici|arsiv-sil 90 gun arsivleyici|arsiv-sil
Tablo tek bir seçimin iki sonucunu yan yana koyuyor. Tek günlük pencere kırk altı kalemin yüzde elli dokuzunu kesiyor ve daraltılmış politika on dokuz satıra iniyor — verilen politikayla aynı sayı, ama bu kez izin düzeyinde ve çok daha dar. Bedeli sağdaki iki sütunda: sekiz meşru yol kesiliyor ve sınama döneminde altmış dokuz iş yedi ayrı iş yükünde duruyor.
Pencere büyüdükçe her iki taraf da yumuşuyor. Otuz günlük pencerede kesme oranı yüzde kırk sekize düşüyor, yanlış kesme üçe, engellenen iş beşe iniyor. Doksan günlük pencerede yanlış kesme bire, engellenen iş sıfıra iniyor. Kesilen izin oranı yüzde elli dokuzdan yüzde kırk üçe geriledi; yani uzun pencerenin bedeli, kesilebilecek on altı puanlık izni kesmemektir.
Son iki satır arasındaki fark dikkat ister. Doksan günlük pencerede yanlış kesme bir, engellenen iş sıfır. Kesilen yol arşivleyicinin silme iznidir ve sınama döneminde de hiç koşmamıştır. Yanlış kesmenin faturası kesildiği gün gelmiyor — yol koştuğu gün geliyor. Alt blok sırayı veriyor: pencere daraldıkça önce nadir yollar, sonra haftalık yollar, en sonunda günlük olmayan her şey kesiliyor.
Güvenli Daraltma Eşiği
Gözlenen doksan gün bir yolu kaçırmaya yetiyorsa, kaç gün yetmez? Bu soru geçmişe değil aralığa
bakarak yanıtlanır: aralığı d gün olan bir yolun p günlük pencerede hiç görünmeme olasılığı
(1 − 1/d)^p değeridir.
// kosum4.mjs — guvenli daraltma esigi: bir yolun kacirilma olasiligi pencereyle nasil dusuyor import { DONEM, gercekCift, araligi } from './yetki.mjs'; const RISK = 0.01; // kabul edilen kacirma olasiligi const kacirma = (d, p) => Math.pow(1 - 1 / d, p); const gereken = (d) => (d === 1 ? 1 : Math.ceil(Math.log(RISK) / Math.log(1 - 1 / d))); const araliklar = [...new Set(gercekCift.map(araligi))].sort((a, b) => a - b); console.log('aralik yol 90 gunde kacirma %1 risk icin pencere'); for (const d of araliklar) { const n = gercekCift.filter((c) => araligi(c) === d).length; console.log(`${String(d).padStart(6)}${String(n).padStart(5)}` + `${`%${(kacirma(d, DONEM) * 100).toFixed(1)}`.padStart(18)}${String(gereken(d)).padStart(18)} gun`); } console.log(''); for (const [ad, v] of [ ['en nadir gercek yolun araligi', `${Math.max(...araliklar)} gun`], ['guvenli daraltma esigi (%1 risk)', `${Math.max(...araliklar.map(gereken))} gun`], ['gozlenen pencere', `${DONEM} gun`], ['90 gunde beklenen yanlis kesme', gercekCift.reduce((a, c) => a + kacirma(araligi(c), DONEM), 0).toFixed(2)], ]) console.log(`${ad.padEnd(34)}${v}`);
aralik yol 90 gunde kacirma %1 risk icin pencere
1 15 %0.0 1 gun
2 2 %0.0 7 gun
3 1 %0.0 12 gun
5 1 %0.0 21 gun
7 3 %0.0 30 gun
20 1 %1.0 90 gun
30 2 %4.7 136 gun
45 1 %13.2 205 gun
60 1 %22.0 275 gun
en nadir gercek yolun araligi 60 gun
guvenli daraltma esigi (%1 risk) 275 gun
gozlenen pencere 90 gun
90 gunde beklenen yanlis kesme 0.46
Tablo eşiği aralık aralık veriyor. Günlük koşan on beş yol için bir gün yetiyor; haftalık koşan üç yol için otuz gün. Yirmi günlük aralıkta gereken pencere doksan güne çıkıyor — gözlenen dönemin tamamı, tek bir yol için. Altmış günlük aralıkta gereken pencere iki yüz yetmiş beş gün, yani gözlenenin üç katı.
Sağdan ikinci sütun doksan günlük pencerede kalan riski veriyor. Altmış günlük yolun kaçırılma olasılığı yüzde yirmi iki, kırk beş günlük yolun yüzde on üç, otuz günlük iki yolun her biri için yüzde beş. Toplandığında doksan günde beklenen yanlış kesme sayısı sıfır virgül kırk altı yol; koşumda gerçekleşen bir yol. Model ile koşum aynı büyüklük mertebesindedir.
Güvenli daraltma eşiği bu tablonun tek satırlık cevabıdır: iki yüz yetmiş beş gün. Bu sayı bir sistem özelliği değil, en nadir meşru yolun aralığının bir fonksiyonudur; aralığı bilinmeyen bir sistemde eşik de bilinmez. Doksan günlük pencereyle daraltmak yüzde kırk üç kesme ve yarım yanlış kesme demektir — kabul edilebilir olup olmadığı, o yarımın hangi iş yükünde çıkacağına bağlıdır.
Özet
- Aile düzeyinde yazılmış 19 satırlık politika 46
(özne, izin)kalemi açıyor; gerçekten gereken 27. Kullanılmayan izin 19 kalem, verilen iznin %41’i — ve hiçbiri tek tek yazılmadı, hepsi satırın genişliğinden geldi. - 90 günlük geçmişte 1.545 olay birikiyor ama 27 gerçek yoldan yalnız 26’sı görünüyor. Görünmeyen yol arşivleyicinin silme iznidir; aralığı 60 gün ve geçmişe bakan bir daraltma onu keser.
- Pencere taraması değiş tokuşu veriyor: 1 günlük pencere %59 kesiyor ama 8 meşru yolu durduruyor ve sınama döneminde 7 iş yükünde 69 iş engelleniyor; 90 günlük pencere %43 kesiyor, 1 yanlış kesme yapıyor, 0 iş engelliyor.
- Yanlış kesmenin faturası kesildiği gün gelmiyor: 90 günlük pencerede kesilen tek yol sınama döneminde de koşmadı, engellenen iş 0 göründü.
- Daraltma satır sayısını düşürmüyor: 19 satırlık aile düzeyi politika, 90 günlük pencerede 26 satırlık izin düzeyi politikaya dönüşüyor. Dar politika daha uzun politikadır.
- Güvenli daraltma eşiği %1 kaçırma riski için 275 gündür — en nadir yolun 60 günlük aralığının yaklaşık 4,6 katı. Gözlenen 90 günde o yolun kaçırılma olasılığı %22 ve beklenen yanlış kesme 0,46 yoldur.
Sonraki Adım
Bu ders bir politika kümesini daraltmayı ölçtü ve daraltmanın nerede durduğunu gösterdi. Ama tabloların hepsi tek bir varsayım üzerinde duruyor: bütün bu iş yükleri aynı yerde, aynı sınırın içinde. Kırk altı kalemin hepsi tek bir hesapta yazılıysa bir kimliğin ele geçirilmesi o hesabın tamamına açılan bir kapıdır ve daraltma yalnız anahtarın şeklini değiştirir, kapının genişliğini değil. Sonraki dersin sorusu bu yüzden sınırın kendisidir: aynı iş yükü kümesi tek hesapta, ortama göre ayrılmış hesaplarda ve iş yüküne göre ayrılmış hesaplarda kurulduğunda patlama yarıçapı kaç kaynak ediyor, kota nasıl paylaşılıyor, fatura ayrışıyor mu ve kaç hesap ile kaç politika kopyası yönetmek gerekiyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.