Ders 04 / 15
Başlatma Şablonları
Elle başlatılan örneklerle şablondan başlatılanlar bir dönem sonunda alan alan karşılaştırılır ve ayrışan örnek ile ayrı yapılandırma varyantı sayılır; şablon güncellendiğinde geride kalan örnek, aynı anda koşan sürüm sayısı ve bir güvenlik düzeltmesinin ulaşmadığı örnek çıkarılır; şablonun kendi girdi yüzeyi ile geri alınamayan alanları adıyla yazılır.
İçindekiler
Önceki ders kesintili kapasitede ayda 1450 örnek açıldığını saydı. O 1450 açılışın her birinde aynı aile, aynı boyut, aynı imaj, aynı alt ağ ve aynı başlangıç betiği seçilir. Seçim elle yapılıyorsa her açılış ayrı bir yazma işlemidir; ayrı her yazma, tanımdan ayrılma fırsatıdır.
Başlatma şablonu bu kalemleri tek bir tanıma toplar: örnek başlatılırken tek tek alan verilmez, şablonun adı verilir. Bu ders şablonun ne kadarını kapattığını ölçer. Ölçüm üç yerde yapılır — başlatma anındaki sapmada, şablon güncellendiğinde geride kalan örnekte ve şablonun kendi girdi yüzeyinde. M22/K01 sapmayı aynı biçimde, tanımdan ayrışan makine sayısı olarak ölçmüştü; buradaki büyüklük aynıdır ama kaynağı çalışırken oluşan sürüklenme değil, başlatma anında yapılan yazmadır.
BH19. Şablon 12 alanlıdır; alanlar ve sapma olasılıkları kurgudur. BH20. Dönem boyunca bölgesel ölçüm ağının — su sayaçlarından okuma toplayan kurgu yazılımın — 140 örneği başlatılır; tohum 20260915 görünürdür ve üreteç kendi yazılmıştır. BH21. Filo 60 örnektir, 90 gün koşar, her örneğin günlük değiştirilme olasılığı 0,02’dir ve şablon 21 günde bir güncellenir; tohum 20260921. BH22. Bir güvenlik düzeltmesi şablonun ikinci sürümüyle gelir. BH23. Yerinde düzeltme 4, yeniden yaratma 35 dakikadır ve aynı anda 2 örnek ele alınır. BH24. Geçersiz kılma bilerek yapılan bir iştir ve kaza sapmasından ayrı modellenir.
Aynı Tanımı Kaç Kez Yazmak
Elle başlatmada her alan her seferinde ayrı verilir; şablonda alan bir kez verilir ve başlatma anında yalnız geçersiz kılınabilir. İki yol aynı dönemde koşturulup alan alan sayıldığında farkın nerede olduğu görünür.
// olcum-agi/sablon-alanlari.mjs — elle baslatma ile sablondan baslatmanin sapmasi (model) export const uretec = (tohum) => () => (tohum = (tohum * 1103515245 + 12345) % 2147483648) / 2147483648; export const BASLATMA = 140; // donem boyunca baslatilan ornek (kurgu) // [ad, zorunlu mu, gecersiz kilinabilir mi, yaratildiktan sonra degisir mi, elle sapma, gecersiz kilma] export const ALAN = [ ["ornek ailesi ve boyutu", true, true, true, 0.09, 0.020], ["makine imaji", true, true, false, 0.11, 0.010], ["alt ag", true, true, false, 0.06, 0.005], ["guvenlik grubu", true, true, true, 0.08, 0.010], ["anahtar kimligi", true, true, true, 0.05, 0.005], ["kok disk boyutu", false, true, true, 0.12, 0.020], ["kok disk sifrelemesi", false, true, false, 0.07, 0.005], ["baslangic betigi", false, true, false, 0.10, 0.015], ["kiralama bicimi", false, true, false, 0.04, 0.030], ["yerlestirme tercihi", false, false, false, 0.05, 0.000], ["etiketler", false, true, true, 0.18, 0.040], ["izleme aracisi", false, true, true, 0.09, 0.005], ]; // Yaratildiktan sonra degismeyen alanlar: sapmasi yerinde duzeltilemez, ornek yeniden yaratilir. export const GERI_YOK = ALAN.map(([, , , deg], j) => (deg ? -1 : j)).filter((j) => j >= 0); export const donem = (tohum) => { const r = uretec(tohum), sapan = ALAN.map(() => [0, 0]), imza = [new Set(), new Set()]; const duzeltme = [[0, 0], [0, 0]]; // [yeniden yaratma, yerinde duzeltme] for (let i = 0; i < BASLATMA; i++) { const iz = [[], []]; ALAN.forEach(([, , gecersiz, , elle, sab], j) => { if (r() < elle) { sapan[j][0]++; iz[0].push(j); } if (gecersiz && r() < sab) { sapan[j][1]++; iz[1].push(j); } }); imza[0].add(iz[0].join(",")); imza[1].add(iz[1].join(",")); [0, 1].forEach((k) => { if (iz[k].some((j) => GERI_YOK.includes(j))) duzeltme[k][0]++; else if (iz[k].length) duzeltme[k][1]++; }); } return { sapan, duzeltme, varyant: imza.map((s) => s.size) }; }; if (import.meta.url === `file://${process.argv[1]}`) { const d = donem(20260915); console.log(`${BASLATMA} ornek baslatildi; tohum 20260915\n`); console.log("alan".padEnd(24) + "zorunlu".padEnd(9) + "gecersiz kilinir".padEnd(18) + "sonradan degisir".padEnd(18) + "elle sapan".padEnd(12) + "sablonla sapan"); ALAN.forEach(([ad, zor, gec, deg], j) => console.log(ad.padEnd(24) + (zor ? "evet" : "hayir").padEnd(9) + (gec ? "evet" : "hayir").padEnd(18) + (deg ? "evet" : "hayir").padEnd(18) + `${d.sapan[j][0]}/${BASLATMA}`.padEnd(12) + `${d.sapan[j][1]}/${BASLATMA}`)); const t = [0, 1].map((k) => d.sapan.reduce((s, x) => s + x[k], 0)); console.log(`\ntoplam alan sapmasi: elle ${t[0]}, sablonla ${t[1]} (${(t[0] / t[1]).toFixed(1)} kat)`); console.log(`ayri yapilandirma varyanti: elle ${d.varyant[0]}, sablonla ${d.varyant[1]}`); }
140 ornek baslatildi; tohum 20260915 alan zorunlu gecersiz kilinir sonradan degisir elle sapan sablonla sapan ornek ailesi ve boyutu evet evet evet 8/140 5/140 makine imaji evet evet hayir 12/140 4/140 alt ag evet evet hayir 10/140 0/140 guvenlik grubu evet evet evet 9/140 1/140 anahtar kimligi evet evet evet 8/140 2/140 kok disk boyutu hayir evet evet 18/140 2/140 kok disk sifrelemesi hayir evet hayir 6/140 1/140 baslangic betigi hayir evet hayir 12/140 2/140 kiralama bicimi hayir evet hayir 5/140 7/140 yerlestirme tercihi hayir hayir hayir 4/140 0/140 etiketler hayir evet evet 30/140 9/140 izleme aracisi hayir evet evet 12/140 1/140 toplam alan sapmasi: elle 134, sablonla 34 (3.9 kat) ayri yapilandirma varyanti: elle 38, sablonla 13
Toplam sapma 134’ten 34’e iner — dört kata yakın. Ama asıl sayı son satırdadır: elle başlatılan 140 örnek 38 ayrı yapılandırma varyantı üretir, şablondan başlatılanlar 13. Varyant sayısı filonun kaç farklı şeyden oluştuğunu söyler; bir sorun araştırılırken karşılaşılan soru “bu makine diğerlerinden nasıl farklı” olduğunda cevabın kaç yerde aranacağını belirleyen budur.
alt ag ve yerlestirme tercihi satırları şablonun ne kadar kapatabildiğinin sınırını çizer.
Yerleştirme tercihi geçersiz kılınamayan tek alandır ve şablon yolunda sapması sıfırdır — tam
korunan tek alan odur. Alt ağ geçersiz kılınabilir olduğu halde yine sıfır çıkar, çünkü kimse onu
bilerek değiştirmez; koruma buradaki gibi çoğu zaman yeterlidir ama garanti değildir.
kiralama bicimi satırı tersini gösterir ve dikkatle okunmalıdır: şablon yolunda sapma elleden
yüksektir — 7’ye karşı 5. Bu bir hata değil, bir kullanımdır. Önceki dersin sonucu iş türüne göre
kalıcı ile kesintili arasında seçim yapmayı gerektirir ve o seçim örnek başına verilir. Şablon
kaza sapmasını kaldırır; bilerek yapılan geçersiz kılmayı kaldırmaz ve kaldırmamalıdır. Ölçünün
işi ikisini ayırmaktır, ikisini birden bastırmak değil.
Şablon Güncellenince Ne Oluyor
Şablon bir tanımdır; tanımın değişmesi çalışan örnekleri değiştirmez. Bir örnek hangi sürümle başlatıldıysa ömrü boyunca o sürümü taşır. Bu yüzden şablonun sürümü ile filonun sürümü aynı şey değildir.
// olcum-agi/sablon-surumu.mjs — sablon guncellenince kac ornek geride kaliyor (model) import { uretec } from "./sablon-alanlari.mjs"; const FILO = 60, GUN = 90, DEGISIM = 0.02, ARALIK = 21; // gunluk ornek degistirme olasiligi const DUZELTME = 2; // guvenlik duzeltmesinin girdigi surum export const kosum = (tohum = 20260921) => { const r = uretec(tohum); const ornek = Array.from({ length: FILO }, () => ({ surum: 0, dogum: 0 })); const surumler = [{ no: 0, gun: 0, baslatilan: FILO }]; for (let g = 1; g <= GUN; g++) { if (g % ARALIK === 0) surumler.push({ no: surumler.length, gun: g, baslatilan: 0 }); const su = surumler[surumler.length - 1]; for (const o of ornek) if (r() < DEGISIM) { o.surum = su.no; o.dogum = g; su.baslatilan++; } } return { ornek, surumler }; }; if (import.meta.url === `file://${process.argv[1]}`) { const { ornek, surumler } = kosum(); console.log(`${FILO} ornek, ${GUN} gun, gunluk degistirme olasiligi ${DEGISIM}, ` + `sablon ${ARALIK} gunde bir guncelleniyor; tohum 20260921\n`); console.log("surum".padEnd(9) + "cikis gunu".padEnd(13) + "bu surumle baslatilan".padEnd(23) + "donem sonunda kosan".padEnd(21) + "en eski ornegin yasi"); for (const s of surumler) { const k = ornek.filter((o) => o.surum === s.no); console.log(`v${s.no}`.padEnd(9) + `gun ${s.gun}`.padEnd(13) + String(s.baslatilan).padEnd(23) + `${k.length}/${FILO}`.padEnd(21) + (k.length ? `${GUN - Math.min(...k.map((o) => o.dogum))} gun` : "—")); } const eski = ornek.filter((o) => o.surum < DUZELTME).length; const son = surumler[surumler.length - 1]; console.log(`\nson surum v${son.no} gun ${son.gun}'de cikti; ${GUN - son.gun} gun sonra ` + `${FILO - ornek.filter((o) => o.surum === son.no).length}/${FILO} ornek hala geride`); console.log(`guvenlik duzeltmesi v${DUZELTME} ile geldi (gun ${surumler[DUZELTME].gun}); ` + `${GUN - surumler[DUZELTME].gun} gun sonra ${eski}/${FILO} ornek hala eski degerde`); console.log(`ayni anda kosan surum sayisi: ` + `${new Set(ornek.map((o) => o.surum)).size}/${surumler.length}`); }
60 ornek, 90 gun, gunluk degistirme olasiligi 0.02, sablon 21 gunde bir guncelleniyor; tohum 20260921 surum cikis gunu bu surumle baslatilan donem sonunda kosan en eski ornegin yasi v0 gun 0 78 14/60 90 gun v1 gun 21 30 8/60 69 gun v2 gun 42 29 15/60 46 gun v3 gun 63 21 14/60 26 gun v4 gun 84 9 9/60 5 gun son surum v4 gun 84'de cikti; 6 gun sonra 51/60 ornek hala geride guvenlik duzeltmesi v2 ile geldi (gun 42); 48 gun sonra 22/60 ornek hala eski degerde ayni anda kosan surum sayisi: 5/5
Şablon beş kez sürümlendi ve dönem sonunda beş sürüm de koşuyor. Filonun tamamı tek bir tanımdan başlatıldığı halde, o tanımın beş farklı anı aynı anda ayakta durmaktadır. Bu, önceki bölümün varyant sayısıyla aynı büyüklüğün zaman boyutudur: orada sapma başlatma anında doğuyordu, burada şablon değişmediği halde filo ayrışıyor.
En eski örnek 90 günlüktür ve ilk sürümü taşımaktadır. Günlük değiştirme olasılığı 0,02 olan bir filoda bir örneğin 90 gün yaşama olasılığı düşüktür ama sıfır değildir; 60 örneğin 14’ü hiç değişmeden dönemi tamamlar. Ortalamaya bakan bir plan bu örnekleri görmez, çünkü ortalama örnek yaşı 50 günün altındadır.
Güvenlik satırı bunun bedelidir. Düzeltme 42. günde ikinci sürümle geldi; 48 gün sonra 60 örneğin 22’si hâlâ eski değerdedir. Şablonu güncellemek bir düzeltmeyi yayımlamak değildir, yalnız bundan sonra başlatılacak örnekler için geçerli kılmaktır. Düzeltmenin filoya ulaşması ancak örneklerin değiştirilmesiyle olur ve o hızı şablon değil, filonun yenilenme politikası belirler.
Şablonun Kendi Yüzeyi
Şablon sapmayı azaltır ama kendisi de bir girdi yüzeyidir: on iki alan bir yerde durur ve o yerdeki her alan yanlış olabilir. Yüzeyin büyüklüğü alan sayısıyla değil, kaç alanın geçersiz kılınabildiğiyle ve sapmanın düzeltilebilirliğiyle ölçülür.
// olcum-agi/sablon-yuzeyi.mjs — sablonun kendi girdi yuzeyi ve duzeltme bedeli (model) import { ALAN, BASLATMA, GERI_YOK, donem } from "./sablon-alanlari.mjs"; const YENIDEN = 35, YERINDE = 4, PENCERE = 2; // dakika, dakika, ayni anda ele alinan ornek const say = (f) => ALAN.filter(f).length; if (import.meta.url === `file://${process.argv[1]}`) { console.log(`sablonun girdi yuzeyi: ${ALAN.length} alan — ${say((a) => a[1])} zorunlu, ` + `${say((a) => !a[1])} varsayilanli, ${say((a) => a[2])} gecersiz kilinabilir, ` + `${GERI_YOK.length} yaratildiktan sonra degismez`); console.log(`gecersiz kilinamayan alan: ` + ALAN.filter((a) => !a[2]).map((a) => a[0]).join(", ") + "\n"); const d = donem(20260915); console.log("yol".padEnd(11) + "ayrisan ornek".padEnd(16) + "yerinde duzelir".padEnd(17) + "yeniden yaratilir".padEnd(19) + "duzeltme duvar saati"); ["elle", "sablonla"].forEach((ad, k) => { const [yen, yer] = d.duzeltme[k]; const dk = Math.ceil(yen / PENCERE) * YENIDEN + Math.ceil(yer / PENCERE) * YERINDE; console.log(ad.padEnd(11) + `${yen + yer}/${BASLATMA}`.padEnd(16) + String(yer).padEnd(17) + String(yen).padEnd(19) + `${(dk / 60).toFixed(1)} sa`); }); const ELDE = ["sablonun alanlari", "hangi alan gecersiz kilinabilir", "varsayilan degerler", "surum politikasi", "sablonu kimin guncelleyebildigi"]; const DEVIR = ["sablonun saklanmasi", "surum gecmisinin tutulma suresi", "baslatma cagrisinin dogrulama kurallari"]; console.log(`\nkarar defteri: ${ELDE.length} kalem elde, ${DEVIR.length} kalem saglayicida`); console.log(` saglayicida: ${DEVIR.join(", ")}`); console.log(` geri alinamayan ${GERI_YOK.length} alan: ` + GERI_YOK.map((j) => ALAN[j][0]).join(", ")); }
sablonun girdi yuzeyi: 12 alan — 5 zorunlu, 7 varsayilanli, 11 gecersiz kilinabilir, 6 yaratildiktan sonra degismez gecersiz kilinamayan alan: yerlestirme tercihi yol ayrisan ornek yerinde duzelir yeniden yaratilir duzeltme duvar saati elle 92/140 47 45 15.0 sa sablonla 32/140 18 14 4.7 sa karar defteri: 5 kalem elde, 3 kalem saglayicida saglayicida: sablonun saklanmasi, surum gecmisinin tutulma suresi, baslatma cagrisinin dogrulama kurallari geri alinamayan 6 alan: makine imaji, alt ag, kok disk sifrelemesi, baslangic betigi, kiralama bicimi, yerlestirme tercihi
İlk satır şablonun sınırını tek sayıda verir: 12 alanın 11’i başlatma anında geçersiz kılınabilir. Şablon bir kapı değil, bir varsayılan kümesidir; sapmanın geri kapısı kapalı değildir, dardır. Tam kapalı tek alan yerleştirme tercihidir ve o alanın şablon yolunda sıfır sapma vermesi tesadüf değildir.
İkinci tablo düzeltmenin fiyatını iki kaleme ayırır. Elle başlatmada 140 örneğin 92’si ayrışır; bunların 47’si yerinde düzelir, 45’i yeniden yaratılmalıdır, çünkü sapma yaratıldıktan sonra değişmeyen bir alandadır. Toplam duvar saati 15,0’tir. Şablon yolunda ayrışan örnek 32’ye, yeniden yaratılacak örnek 14’e ve duvar saati 4,7’ye iner. Şablonun kazandırdığı asıl şey sapma sayısındaki düşüş değil, düzeltilemez sapmadaki düşüştür: 45’ten 14’e.
Geri alınamayan altı alan bu ayrımın kaynağıdır ve üçü bu kursun önceki derslerinden gelir: makine imajı, alt ağ ve kök disk şifrelemesi örnek yaratılırken verilir, başlangıç betiği o örnek için donar, kiralama biçimi kalıcı başlatılan örneği kesintiliye çeviremez, yerleştirme tercihi ise örneğin nereye konduğunu belirler ve sonradan taşınmaz. Bu altı alandan birinde yanlış değer, düzeltme değil değiştirme ister.
Yüzeyin bir de yazılmayan tarafı vardır. Şablonda kaç örnek başlatılacağı yoktur; şablon bir örneğin nasıl olacağını söyler, kaç tane olacağını söylemez. Sayı hâlâ her başlatmada dışarıdan verilir ve dönem boyunca 140 kez verilmiştir. Aynı biçimde şablon, başlatılan örneğin ne zaman sonlandırılacağını da yazmaz; 90 günlük koşumda 14 örneğin hiç değişmemesinin nedeni budur.
Karar defterinde sekiz kalemin beşi elde, üçü sağlayıcıdadır. Sağlayıcıda kalan üçü — şablonun saklanması, sürüm geçmişinin ne kadar tutulacağı ve başlatma çağrısının hangi alanı doğruladığı — şablonun kendisini bir bağımlılık haline getirir: elde kalan beş kalem ancak o üçü çalışırken anlamlıdır.
Özet
- Şablon toplam alan sapmasını 134’ten 34’e indirir, ama daha anlamlı sayı varyanttır: 140 örnek elle başlatıldığında 38, şablondan başlatıldığında 13 ayrı yapılandırma çıkar.
- Şablon kaza sapmasını kaldırır, bilerek yapılan geçersiz kılmayı kaldırmaz:
kiralama bicimialanında şablon yolunda 7, elle yolda 5 sapma vardır ve bu bir hata değil, iş türüne göre verilen bir karardır. - Şablon güncellenince hiçbir çalışan örnek değişmez: beş sürüm aynı anda koşar, son sürüm çıktıktan 6 gün sonra 60 örneğin 51’i hâlâ geridedir.
- Güvenlik düzeltmesi ikinci sürümle geldiği halde 48 gün sonra 22 örnek eski değerdedir; düzeltmenin hızını şablon değil, filonun yenilenme politikası belirler.
- Şablonun girdi yüzeyi 12 alandır ve 11’i başlatma anında geçersiz kılınabilir; tam korunan tek alan yerleştirme tercihidir.
- Şablonun asıl kazancı düzeltilemez sapmadadır: yeniden yaratılması gereken örnek 45’ten 14’e, düzeltme duvar saati 15,0’ten 4,7’ye iner; geri alınamayan alan sayısı 6’dır.
Sonraki Adım
Bu ders örnek başlatmayı tek bir tanıma indirdi, ama başlatma kararını hâlâ bir kişi veriyor: şablon var, düğmeye basan var. Önceki derslerin sayıları bu düğmeye ayda binlerce kez basıldığını gösterdi — kesintili kapasitede 1450 kesinti, 90 günde 180 örnek değişimi.
Bir grup örneği tek bir şablondan üretmek, o gruba iki iş daha devretmeyi mümkün kılar: sayıyı talebe göre değiştirmek ve sağlıksız örneği kendiliğinden yenilemek. M22/K03 yatay ölçeklemeyi ve ölçütün gecikmesinden doğan salınımı ölçmüştü; o tarama tekrarlanmaz. Sonraki ders bu iki işin birlikte davranışını ölçer ve sorar: sağlıksız örnek değiştirilirken ölçekleme de tetiklenirse grup boyutu ne yapıyor, aynı anda kaç örnek değişiyor ve kapasitenin altına kaç turda düşülüyor?
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.