Ders 06 / 12
Kod Olarak Altyapı Taraması
420 şablon kaleminde kuralın dağıtımdan önce verebildiği karar sayılıyor: 100 gerçek ihlalin 55'i kesin olarak yakalanır, 26'sı değeri dağıtım anında hesaplandığı için belirlenemez kalır, 19'u hiç kural yazılmamış alan sınıfındadır. Belirlenemezi geçirmek 26 ihlali görmeden bırakır, durdurmak 65 uygun kalemi boşuna bloklar. Aynı kural seti 60 yapı boyunca dört yerleşimde koşar: kesin kapı 34 yapı durdurup 1 339 yapı-kalem maruziyet bırakır, yalnız dağıtımdan sonra tarayan denetim hiçbir yapıyı durdurmadan 979'a iner, ikisi birlikte 697'ye; her yerleşimde aynı 19 ihlal hiç kapanmaz.
İçindekiler
Önceki beş denetim çalıştırılabilir metne bakıyordu: kaynak kodu, çalışan uç, bağımlılık envanteri, depo geçmişi, imaj katmanı. Depoda bir metin daha durur ve hiçbiri onu okumadı — imajın nerede, kaç kopya, hangi ağ kuralıyla ve hangi yetkiyle koşacağını tanımlayan şablonlar. Buradaki tek bir alan, imajın içindeki bütün bulgulardan daha geniş bir yol açabilir.
Kod olarak altyapı taraması, bu şablonları dağıtımdan önce bir kural setinden geçiren denetimdir. Ayırt edici yanı zamanlamasıdır: kural, kaynak henüz oluşmadan koşar ve durdurduğu kalemde ortada düzeltilecek bir kaynak bile olmaz. Ama bu zamanlamanın kendi sınırı vardır ve bu ders onu sayar — şablon metni her zaman ne olacağını söylemez.
- OD30. Kaynak tanımlarının metin olarak yazılması bu kursta girdidir; şablon yazımı ve kural yazımı tekrarlanmaz. Aşağıdaki 420 kalem, beş şablondaki alanların kurgu bir modelidir. Bir kalem bir kaynak tanımındaki bir alandır.
- OD31. Her alan sınıfı için yazılmış bir kural yoktur. Kuralsız kalem hiçbir yerleşimde değerlendirilmez ve bu sayı ayarla değişmez.
- OD32. Bir alanın değeri her zaman şablon metninden okunamaz: bir bölümü dağıtım anında hesaplanır. Okunamayan alanda kural kesin karar veremez; sonuç belirlenemezdir.
- OD33. Değeri okunabilen alanda kural kesin karar verir. Bu denetimin okunabilir kalemde yanlış pozitifi yoktur; belirsizliğin tek kaynağı okunamayan değerdir.
- OD34. Dağıtımdan önce durdurulan kalemde kaynak hiç oluşmaz. Dağıtımdan sonra bulunan kalemde kaynak vardır ve düzeltmesi bir dağıtım daha ister.
- OD35. Şablon taraması yapı başına 2, çalışan kaynak denetimi koşum başına 9, bloke yapı başına 20 model dakikası. Maruziyet yapı-kalem birimindedir. Süreler veridir.
Kesin, Belirlenemez ve Kuralsız
// sablon.mjs — kaynak tanimi sablonlari kural setinden geciriliyor; olculen sey // dagitimdan once kesin karar verilebilen kalem ile belirlenemeyen kalemdir. MODELDIR. export const TOHUM = 20260411, KALEM = 420; const uretec = (t) => { let s = t >>> 0; return () => (s = (s * 1664525 + 1013904223) >>> 0) / 4294967296; }; const r = uretec(TOHUM); // Her kalem bir kaynak tanimindaki bir alandir. kuralVar: o alan sinifi icin yazilmis // bir kural olup olmadigi. okunur: alanin degerinin sablon metninden okunabilme // olasiligi — sabit yazilmis deger okunur, dagitimda uretilen deger okunmaz. export const SINIF = [ ["ag erisim kurali", 0.18, 0.26, 0.95, 0.86], ["depo gorunurlugu", 0.12, 0.31, 0.95, 0.62], ["kimlik yetkisi", 0.16, 0.34, 0.95, 0.41], ["sifreleme ayari", 0.14, 0.19, 0.95, 0.78], ["kayit toplama", 0.11, 0.22, 0.95, 0.70], ["kaynak siniri", 0.15, 0.15, 0.00, 0.88], ["etiket ve sahiplik", 0.14, 0.11, 0.00, 0.93], ].map(([ad, pay, ihlal, kural, okunur]) => ({ ad, pay, ihlal, kural, okunur })); const sec = (u) => { let t = 0; for (const s of SINIF) { t += s.pay; if (u < t) return s; } return SINIF.at(-1); }; export const KALEMLER = Array.from({ length: KALEM }, (_, i) => { const s = sec(r()); return { i, sinif: s, ihlal: r() < s.ihlal, okunur: r() < s.okunur, kuralVar: r() < s.kural, dogus: Math.floor(r() * 60) }; }); // Dagitimdan once verilen karar: kural yoksa sessiz, deger okunamiyorsa belirlenemez. export const karar = (k) => !k.kuralVar ? "kuralsiz" : !k.okunur ? "belirlenemez" : k.ihlal ? "ihlal" : "uygun"; const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); if (import.meta.url === `file://${process.argv[1]}`) { const ihlaller = KALEMLER.filter((k) => k.ihlal); console.log(`model (tohum ${TOHUM}): ${KALEM} sablon kalemi, ${ihlaller.length} tanesi ` + `gercek ihlal; ${KALEMLER.filter((k) => !k.kuralVar).length} kalem icin yazilmis kural yok`); const y1 = gen([20, 8, 8, 11, 9, 15, 13]); console.log("\n" + y1(["alan sinifi", "kalem", "ihlal", "kuralsiz", "ihlal+", "belirlenemez", "bel. ihlal"])); for (const s of SINIF) { const l = KALEMLER.filter((k) => k.sinif === s); const b = l.filter((k) => karar(k) === "belirlenemez"); console.log(y1([s.ad, l.length, l.filter((k) => k.ihlal).length, l.filter((k) => karar(k) === "kuralsiz").length, l.filter((k) => karar(k) === "ihlal").length, b.length, b.filter((k) => k.ihlal).length])); } const bel = KALEMLER.filter((k) => karar(k) === "belirlenemez"); const kuralsiz = KALEMLER.filter((k) => karar(k) === "kuralsiz"); const kesinIhlal = KALEMLER.filter((k) => karar(k) === "ihlal"); const y2 = gen([26, 10, 9, 12, 14]); console.log("\nbelirlenemez kalem iki ayri sekilde ele alinabilir"); console.log(y2(["ele alis", "bulgu", "gercek", "yanlis+", "kacan ihlal"])); for (const [ad, kume] of [["belirlenemez gecer", kesinIhlal], ["belirlenemez durdurur", [...kesinIhlal, ...bel]]]) { const g = kume.filter((k) => k.ihlal).length; console.log(y2([ad, kume.length, g, kume.length - g, ihlaller.length - g])); } console.log(`\ngecirme secildiginde ${bel.filter((k) => k.ihlal).length} gercek ihlal ` + `dagitimdan once gorulmuyor; durdurma secildiginde ${bel.filter((k) => !k.ihlal).length} ` + `uygun kalem bosuna durduruluyor. Iki secenegin arasinda ucuncu bir deger yok`); console.log(`her iki secenekte de ${kuralsiz.filter((k) => k.ihlal).length} ihlal kural ` + `yazilmadigi icin hic degerlendirilmiyor; bu sayi ele alisla degismez`); }
model (tohum 20260411): 420 sablon kalemi, 100 tanesi gercek ihlal; 132 kalem icin yazilmis kural yok alan sinifi kalem ihlal kuralsiz ihlal+ belirlenemez bel. ihlal ag erisim kurali 85 22 3 18 8 3 depo gorunurlugu 48 16 1 8 22 8 kimlik yetkisi 66 21 3 10 39 11 sifreleme ayari 57 18 2 15 15 3 kayit toplama 44 5 3 4 7 1 kaynak siniri 59 10 59 0 0 0 etiket ve sahiplik 61 8 61 0 0 0 belirlenemez kalem iki ayri sekilde ele alinabilir ele alis bulgu gercek yanlis+ kacan ihlal belirlenemez gecer 55 55 0 45 belirlenemez durdurur 146 81 65 19 gecirme secildiginde 26 gercek ihlal dagitimdan once gorulmuyor; durdurma secildiginde 65 uygun kalem bosuna durduruluyor. Iki secenegin arasinda ucuncu bir deger yok her iki secenekte de 19 ihlal kural yazilmadigi icin hic degerlendirilmiyor; bu sayi ele alisla degismez
İkinci tablonun ilk satırı bu denetimi öncekilerden ayıran şeyi yazıyor: 55 bulgunun 55’i gerçektir, yanlış pozitif sıfırdır. Statik çözümleme bir kod konumunun tehlikeli olup olmadığını tahmin ediyordu; burada kural bir alanın yazılı değerini okur ve karşılaştırır. Değeri okunabilen kalemde tahmin yoktur. Bu denetimin belirsizliği bulgu üretme biçiminden değil, okuyamadığı alandan gelir.
O alan ilk tablonun altıncı sütununda duruyor. 420 kalemin 91’i belirlenemez: değeri dağıtım anında hesaplandığı için kural karar veremiyor. Dağılım sınıflara göre keskin biçimde ayrışıyor. Kimlik yetkisi sınıfının 66 kaleminin 39’u belirlenemez — yetkinin kime verildiği çoğunlukla dağıtımda çözülen bir başvurudur. Ağ erişim kuralı sınıfında aynı sayı 85 kalemde yalnız 8’dir, çünkü adres aralıkları şablona yazılıdır. Şablon taramasının kapsaması alan sınıfına göre değişir ve bu değişkenliğin kaynağı kural setinin olgunluğu değil, değerin ne zaman belirlendiğidir.
İkinci tablo bu belirsizliğin iki ucunu ölçüyor ve arada bir seçenek yok. Belirlenemez kalemi geçirmek 55 kesin bulguyla kapanır ve 26 gerçek ihlali dağıtımdan önce hiç göstermez. Durdurmak bulguyu 146’ya çıkarır, 81 gerçek ihlali yakalar, ama 65 uygun kalemi boşuna bloklar — raporun yüzde 44,5’i yanlış pozitife dönüşür. Bu kursun ilk dersindeki eşik takasının aynısıdır, ama düğme burada bir sayı değil bir varsayımdır: okunamayan değer iyi mi kabul edilecek, kötü mü.
Son sayı ikisinin de dışında. 132 kalem için yazılmış bir kural yoktur ve bunların 19’u gerçek ihlaldir. Kaynak sınırı ile etiket ve sahiplik sınıflarında kural seti hiç bakmaz. Bu 19 kalem belirlenemez de değildir — değerleri okunabilir durumdadır, yalnız soran yoktur. Bir şablon taramasının raporunda “ihlal yok” yazan alan sınıfı, ya uygun olan ya da hiç sorulmamış olandır.
Kapı mı, Sonraki Koşum mu
// yerlesim.mjs — ayni kural seti dagitimdan once ve sonra kosuyor; olculen sey bloke // edilen yapi ile kaynak olustuktan sonra gecen maruziyettir. Sureler MODELDIR. import { KALEMLER, karar } from "./sablon.mjs"; const YAPI = 60, DENETIM = 5, DUZELTME = 3; const SABLON_DK = 2, CALISAN_DK = 9, BLOKE_DK = 20; // kapi: dagitimdan once neyi durdurur. Durdurulan kalemde kaynak hic olusmaz. // sonra: calisan kaynagi okuyan denetim; orada belirsiz deger yoktur, ama kalem // zaten uretimdedir ve duzeltmesi bir dagitim daha ister. function olc(ad, kapi, sonra, sablonTarar) { const durdurulan = new Map(), uretimde = new Map(); for (const k of KALEMLER) { if (kapi(k)) durdurulan.set(k.dogus, [...(durdurulan.get(k.dogus) || []), k]); else if (k.ihlal) uretimde.set(k, null); } const bloke = durdurulan.size; const yanlisBloke = [...durdurulan.values()].filter((l) => !l.some((k) => k.ihlal)).length; let maruziyet = 0, kosum = 0; for (let y = 0; y < YAPI; y++) { if (sonra && y % DENETIM === DENETIM - 1) { kosum++; for (const [k, kapanis] of uretimde) if (kapanis === null && k.kuralVar && k.dogus <= y) uretimde.set(k, y + DUZELTME); } for (const [k, kapanis] of uretimde) if (k.dogus <= y && (kapanis === null || y < kapanis)) maruziyet++; } return { ad, bloke, yanlisBloke, ulasan: uretimde.size, kapanmayan: [...uretimde.values()].filter((v) => v === null).length, maruziyet, dk: Math.round((sablonTarar ? YAPI * SABLON_DK : 0) + kosum * CALISAN_DK + bloke * BLOKE_DK) }; } const YERLESIM = [ olc("once: kesin ihlal durur", (k) => karar(k) === "ihlal", false, true), olc("once: belirlenemez de durur", (k) => karar(k) === "ihlal" || karar(k) === "belirlenemez", false, true), olc("yalniz dagitimdan sonra", () => false, true, false), olc("once kesin + sonra denetim", (k) => karar(k) === "ihlal", true, true), ]; const gen = (B) => (h) => h.map((v, j) => (j ? String(v).padStart(B[j]) : String(v).padEnd(B[0]))).join(""); const y = gen([28, 8, 14, 9, 13, 12, 11]); console.log(`${YAPI} yapi; kaynak olustuktan sonra her yapida acik kalan ihlal maruziyet ` + `sayilir. Dagitim sonrasi denetim ${DENETIM} yapida bir kosar, duzeltme ${DUZELTME} yapi surer`); console.log(y(["yerlesim", "bloke", "yanlis bloke", "ulasan", "kapanmayan", "maruziyet", "toplam dk"])); for (const o of YERLESIM) { console.log(y([o.ad, o.bloke, o.yanlisBloke, o.ulasan, o.kapanmayan, o.maruziyet, o.dk])); } const [kesin, genis, sadeceSonra, ikisi] = YERLESIM; console.log(`\ndagitimdan once duran kapi ${kesin.ulasan} ihlali uretime birakiyor ve ` + `${kesin.bloke} yapi durduruyor; kapiyi belirlenemez kalemlere genisletmek ulasani ` + `${genis.ulasan}'a indiriyor ama ${genis.yanlisBloke} yapiyi bosuna durduruyor`); console.log(`yalniz dagitimdan sonra tarayan denetim hicbir yapiyi durdurmuyor ve ` + `${sadeceSonra.ulasan} ihlalin ${sadeceSonra.ulasan - sadeceSonra.kapanmayan} tanesini ` + `kapatiyor; maruziyeti ${sadeceSonra.maruziyet}, yani kesin kapinin ` + `${(sadeceSonra.maruziyet / kesin.maruziyet).toFixed(2)} kati`); console.log(`ikisini birlikte kosturmak maruziyeti ${ikisi.maruziyet} yapi-kaleme indiriyor; ` + `geriye kalan ${ikisi.kapanmayan} ihlal her yerlesimde ayni, cunku o alan sinifi icin ` + `yazilmis kural yok`);
60 yapi; kaynak olustuktan sonra her yapida acik kalan ihlal maruziyet sayilir. Dagitim sonrasi denetim 5 yapida bir kosar, duzeltme 3 yapi surer yerlesim bloke yanlis bloke ulasan kapanmayan maruziyet toplam dk once: kesin ihlal durur 34 0 45 45 1339 800 once: belirlenemez de durur 52 9 19 19 572 1160 yalniz dagitimdan sonra 0 0 100 19 979 108 once kesin + sonra denetim 34 0 45 19 697 908 dagitimdan once duran kapi 45 ihlali uretime birakiyor ve 34 yapi durduruyor; kapiyi belirlenemez kalemlere genisletmek ulasani 19'a indiriyor ama 9 yapiyi bosuna durduruyor yalniz dagitimdan sonra tarayan denetim hicbir yapiyi durdurmuyor ve 100 ihlalin 81 tanesini kapatiyor; maruziyeti 979, yani kesin kapinin 0.73 kati ikisini birlikte kosturmak maruziyeti 697 yapi-kaleme indiriyor; geriye kalan 19 ihlal her yerlesimde ayni, cunku o alan sinifi icin yazilmis kural yok
Birinci satır dağıtımdan önce koşmanın kazancını yazıyor: 34 yapı duruyor, hiçbiri boşuna durmuyor ve durdurulan 55 kalemde kaynak hiç oluşmuyor. Ama aynı satırın maruziyet sütunu 1 339 yapı-kalem. Kapının geçirdiği 45 ihlal üretime ulaşıyor ve hiçbiri kapanmıyor, çünkü bu yerleşimde onları arayan başka bir denetim yok.
Üçüncü satır sıralamayı bozuyor. Yalnız dağıtımdan sonra çalışan kaynağı okuyan denetim hiçbir yapıyı durdurmuyor, 108 model dakikası harcıyor — kesin kapılı yerleşimin yedide birinden az — ve maruziyeti 979 yapı-kaleme indiriyor: kesin kapının 0,73 katı. Nedeni birinci bölümde yazılıydı. Çalışan kaynakta belirlenemez alan yoktur; değer artık hesaplanmıştır ve okunur. Dağıtımdan önce koşan kural 26 ihlali hiç görmüyordu, dağıtımdan sonra koşan denetim hepsini görüyor. Erken koşmak her zaman daha çok yakalamak demek değildir; şablon metninin söyleyemediği şeyi hiçbir erken kural söyleyemez.
İkinci satır bu boşluğu kapının kendisiyle kapatmayı deniyor ve en düşük maruziyeti veriyor: 572. Bedeli iki sütunda yazılı — 52 bloke yapı, 9’u boşuna, toplam 1 160 dakika. Bu, birinci bölümdeki takasın hattaki karşılığıdır: belirsizliği ihlal saymak maruziyeti yarıya indirir ve her altıncı durdurmayı gereksiz kılar.
Dördüncü satır ikisini birleştiriyor. Kesin ihlaller dağıtımdan önce durur — 34 yapı, sıfır boşuna — ve kalanı beş yapıda bir koşan çalışan kaynak denetimi kapatır. Maruziyet 697, toplam 908 dakika. Her iki denetim de aynı 19 ihlali görmez ve bu sayı dört yerleşimde de aynıdır. İki denetimi de koşturmak, kural seti sessiz kalan alan sınıfını sesli kılmaz.
Özet
- Şablon taraması okunabilir alanda yanlış pozitif üretmez: 55 kesin bulgunun 55’i gerçektir. Belirsizliğin tek kaynağı değeri dağıtımda hesaplanan alandır.
- 420 kalemin 91’i belirlenemezdir ve dağılım sınıfa göre keskin ayrışır: kimlik yetkisinde 66 kalemin 39’u, ağ erişim kuralında 85 kalemin 8’i.
- Belirlenemez kalemin iki ele alışı arasında orta yol yoktur: geçirmek 26 gerçek ihlali görünmez kılar, durdurmak 65 uygun kalemi boşuna bloklar ve raporun yüzde 44,5’ini yanlış pozitife çevirir.
- Kural yazılmamış 132 kalemdeki 19 ihlal hiçbir ele alışta ve hiçbir yerleşimde görünmez; bu sayı ayarla da yerleşimle de değişmez.
- Erken koşmak her zaman daha çok yakalamak değildir: kesin kapı 34 yapı durdurup 1 339 yapı-kalem maruziyet bırakır, yalnız dağıtımdan sonra tarayan denetim hiçbir yapıyı durdurmadan 979’a iner, çünkü çalışan kaynakta belirlenemez alan yoktur.
- İkisini birlikte koşturmak maruziyeti 697 yapı-kaleme, toplam bedeli 908 dakikaya getirir ve sıfır boşuna blokajla çalışır.
Sonraki Adım
Altı denetim, her değişiklikte neyin tarandığını ve neyin kaçtığını saydı: kod konumu, çalışan uç, bağımlılık kaydı, depo geçmişi, imaj katmanı, şablon alanı. Hepsinin ortak bir varsayımı vardı — taranan şey elde duran metindi. Oysa bu ölçümlerin kendisi tersini söylüyor. İmajın 144 bulgusunun 75’i kimsenin yazmadığı temel katmandan geliyordu, bağımlılık envanterinin 210 bileşeninin 186’sı bildirim dosyasında adı bile geçmeyen geçişli bileşenlerdi. Üretime giden yapının büyük bölümü başka yerde üretilmiştir ve o parçalar için sorulacak soru “içinde ne var” değildir; onu kimin, neyden, hangi ortamda ürettiğidir. Sonraki konu bu soruyu ölçülebilir hale getirir: bir yapı çıktısının taşıdığı bileşen listesi hangi soruları cevaplayabiliyor, bir imza neyi kanıtlıyor ve neyi kanıtlamıyor, köken belgesindeki hangi iddia gerçekten doğrulanabiliyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.