Ders 18 / 22
Dizin Geçişi
Dizin geçişinin beş adımlık zincir ve erişilebilir kalem sayımı olarak ölçülmesi: otuz kalemlik kurgu envanterde kök denetiminin kalemi on ikiye ve duyarlılığı yediye indirmesi, dar süreç kimliğinin bölme içinde hiçbir kalemi çıkarmaması, tanıtıcı eşlemesinin zinciri ikinci adımda kırıp on kalem bırakması ve hiçbir adımı kırmayan bölmenin duyarlılığı kırk birden yirmiye düşürmesi.
İçindekiler
Önceki dersin sunucu yönünde istek dışarıdan gelen bir adrese gidiyordu. Aynı yapı, adres yerine bir dosya yolu olduğunda başka bir sınıfa dönüşür: uç bir kalem adı alır, onu sunmak istediği kök dizine ekler ve sonucu okur. Dizin geçişi bu zincirdir.
Bu dersin ölçüsü öncekilerden bir noktada ayrılır. Geç kırmanın bedeli burada bir işlem ya da oturum sayısı değil, okunabilir kalem sayısıdır — ve o sayı zincirin nerede kırıldığına değil, kırılmadığında sürecin gördüğü envanterin büyüklüğüne bağlıdır. Bu yüzden ölçümün merkezinde bir kurgu dosya envanteri durur. Hiçbir yol dizgesi üretilmez; kalemler yalnız konum ve izin özellikleriyle tanımlanır.
Zincirin Beş Adımı
- Ad istekten gelir. Önkoşul: uç, sunulacak kalemin adını istek alanından alıyor.
- Ad yola birleştirilir. Önkoşul: ad bir tanıtıcıya eşlenmiyor, doğrudan yolun bir bileşeni olarak kullanılıyor.
- Birleştirilen yol kökün dışına düşer. Önkoşul: yol normalleştirildikten sonra kökün altında kalıp kalmadığına bakan bir denetim yok.
- Süreç kimliği o kalemi okuyabilir. Önkoşul: sürecin çalıştığı kimliğin dosya izinleri o kalemi kapsıyor.
- İçerik yanıta yazılır. Önkoşul: yanıt gövdesi kalemin içeriğini olduğu gibi taşıyor.
Üçüncü adım bu sınıfın adını taşıyan adımdır, ama tek başına bir şey vermez. Kökün dışına düşen bir yol, dördüncü adım tutmadıkça bir okuma üretmez. Sınıfın bedelini belirleyen şey üçüncü adım değil, dördüncü adımın kapsadığı envanterdir.
İkinci adım da kendi başına bir karardır ve çoğu tartışmada atlanır. Bir uç, sunacağı kalemi istekten gelen adla değil, önceden belirlenmiş bir tanıtıcı kümesinden seçerek de belirleyebilir. O zaman istekten gelen değer bir yol bileşeni olmaz; bir anahtar olur ve anahtar kümenin dışındaysa istek karşılıksız kalır. Bu karar zincirin en erken kırılabilen noktasıdır ve envanteri kökten değil, listeden tanımlar.
TS18: adım dizisi bir modeldir. TS19: her katman tek bir adımı kırar; bölme hiçbir adımı kırmaz, yalnız envanteri daraltır. TS20: envanter 30 kurgu kalemdir ve her kalem konum, izin ve duyarlılık ağırlığıyla tanımlanır. TS21: erişilebilir küme, dağıtılan katmanların envanteri daralttığı sonuçtur.
// dg/envanter.mjs — kurgu bir dosya envanteri ve dizin gecisi zinciri (model). // Gercek bir dosya sistemi, gercek bir yol ve hicbir gecis dizgesi yok; kalemler yalnizca // konum ve izin ozellikleriyle tanimlanir. export const ADIM = ["ad-istekten", "yola-birlestirme", "kok-disina-cikma", "surecin-okumasi", "yanita-yazma"]; export const KATMAN = [ { ad: "tanitici-eslemesi", kirar: 2, mesru: 6 }, { ad: "kok-denetimi", kirar: 3, mesru: 1 }, { ad: "dar-surec-kimligi", kirar: 4, mesru: 4 }, { ad: "cikti-siniri", kirar: 5, mesru: 3 }, { ad: "bolme", kirar: 0, mesru: 9 }, ]; // kok = uygulamanin sunmak istedigi kok altinda mi, bolme = surecin bolmesi icinde mi, // sahip = kalemin sahibi, ortak = herkese okunur mu, duyar = kurgu duyarlilik agirligi. const K = (ad, kok, bolme, sahip, ortak, duyar) => ({ ad, kok, bolme, sahip, ortak, duyar }); export const KALEM = [ K("fatura/2026-01.belge", 1, 1, "uygulama", 0, 1), K("fatura/2026-02.belge", 1, 1, "uygulama", 0, 1), K("fatura/2026-03.belge", 1, 1, "uygulama", 0, 1), K("rapor/donem-ozeti.belge", 1, 1, "uygulama", 0, 1), K("rapor/sayac-dokum.belge", 1, 1, "uygulama", 0, 1), K("sablon/bildirim.metin", 1, 1, "uygulama", 0, 0), K("sablon/fatura.metin", 1, 1, "uygulama", 0, 0), K("saha/foto-1.imge", 1, 1, "uygulama", 0, 0), K("saha/foto-2.imge", 1, 1, "uygulama", 0, 0), K("saha/foto-3.imge", 1, 1, "uygulama", 0, 0), K("indirme/dokum.arsiv", 1, 1, "uygulama", 0, 1), K("indirme/gecmis.arsiv", 1, 1, "uygulama", 0, 1), K("uygulama/ayar.yapilandirma", 0, 1, "uygulama", 0, 3), K("uygulama/veritabani.baglanti", 0, 1, "uygulama", 0, 3), K("uygulama/imza.anahtar", 0, 1, "uygulama", 0, 3), K("uygulama/gunluk/erisim.kayit", 0, 1, "uygulama", 0, 2), K("uygulama/gunluk/hata.kayit", 0, 1, "uygulama", 0, 2), K("uygulama/surum.metin", 0, 1, "uygulama", 1, 0), K("ortak/zaman-dilimi.tablo", 0, 1, "sistem", 1, 0), K("ortak/kod-sayfasi.tablo", 0, 1, "sistem", 1, 0), K("sistem/kullanici-listesi.kayit", 0, 0, "sistem", 1, 2), K("sistem/agirlik-tablosu.kayit", 0, 0, "sistem", 1, 1), K("sistem/ag-ayari.yapilandirma", 0, 0, "sistem", 1, 2), K("sistem/servis-tanimi.birim", 0, 0, "sistem", 1, 1), K("sistem/gizli/kimlik.deposu", 0, 0, "sistem", 0, 3), K("sistem/gizli/anahtar.deposu", 0, 0, "sistem", 0, 3), K("komsu/toplayici-ayar.yapilandirma", 0, 0, "komsu", 0, 3), K("komsu/dogrulayici-ayar.yapilandirma", 0, 0, "komsu", 0, 3), K("komsu/fatura-sablonu.metin", 0, 0, "komsu", 0, 1), K("komsu/gunluk-arsiv.kayit", 0, 0, "komsu", 0, 2), ]; // Tanitici eslemesi: uc, ad yerine sabit bir tanitici kumesinden secim yapar. export const ESLEME = KALEM.filter((k) => k.kok && !k.ad.startsWith("indirme/")); export const UC = [ ["abone-portali.fatura-indir", ["tanitici-eslemesi", "kok-denetimi", "dar-surec-kimligi"]], ["abone-portali.rapor-goster", ["kok-denetimi", "dar-surec-kimligi", "cikti-siniri"]], ["saha-uygulamasi.foto-getir", ["kok-denetimi", "bolme"]], ["fatura-uretimi.sablon-oku", ["tanitici-eslemesi"]], ["rapor.dokum-indir", ["dar-surec-kimligi"]], ["yonetim.kayit-goruntule", []], ]; export const yaz = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
// dg/olcum.mjs — erisilebilir kalem sayimi: her katman kumesi icin envanterin ne kadari // okunabilir kaliyor. Rastgelelik yok; hicbir yol dizgesi uretilmez. import { ADIM, KATMAN, KALEM, ESLEME, UC, yaz } from "./envanter.mjs"; function erisilebilir(d) { if (d.includes("tanitici-eslemesi")) return ESLEME; // 2. adim kirildi let k = d.includes("bolme") ? KALEM.filter((x) => x.bolme) : KALEM; if (d.includes("kok-denetimi")) k = k.filter((x) => x.kok); // 3. adim kirildi if (d.includes("dar-surec-kimligi")) // 4. adim kirildi k = k.filter((x) => x.sahip === "uygulama" || x.ortak); return k; } const duyar = (k) => k.reduce((t, x) => t + x.duyar, 0); const ilkKirilan = (d) => Math.min(...KATMAN .filter((x) => d.includes(x.ad) && x.kirar > 0).map((x) => x.kirar), Infinity); console.log(`${ADIM.length} adimlik zincir, ${KATMAN.length} katman, ` + `${KALEM.length} kalemlik kurgu envanter (kok alti ${KALEM.filter((k) => k.kok).length}, ` + `bolme ici ${KALEM.filter((k) => k.bolme).length}, toplam duyarlilik ${duyar(KALEM)})\n`); const A = [-20, 9, 10, 12]; console.log("1. katman-adim eslemesi"); yaz(A, "katman", "kirdigi", "mesru", "dagitim"); for (const k of KATMAN) yaz(A, k.ad, k.kirar ? `${k.kirar}. adim` : "yok", k.mesru, UC.filter(([, d]) => d.includes(k.ad)).length); const B = [-42, 8, 12, 13]; console.log("\n2. sekiz kurulus (tanitici eslemesi disinda)"); yaz(B, "kurulus", "kalem", "duyarlilik", "ilk kirilan"); const UCLU = ["kok-denetimi", "dar-surec-kimligi", "bolme"]; for (let m = 0; m < 8; m++) { const d = UCLU.filter((_, i) => m & (1 << i)); const k = erisilebilir(d); const h = ilkKirilan(d); yaz(B, d.length ? d.join(" + ") : "hicbiri", k.length, duyar(k), h === Infinity ? "kirilmiyor" : `${h}. adim`); } const es = erisilebilir(["tanitici-eslemesi"]); console.log(`tanitici eslemesi tek basina: ${es.length} kalem, duyarlilik ${duyar(es)}, ` + `2. adimda kirar; mesru bedeli her yeni kalemin eslemeye eklenmesidir`); const C = [-30, 8, 13, 9, 12, 10]; console.log("\n3. uc basina zincir"); yaz(C, "uc", "katman", "ilk kirilan", "kalem", "duyarlilik", "kok disi"); for (const [ad, d] of UC) { const k = erisilebilir(d), h = ilkKirilan(d); yaz(C, ad, d.length, h === Infinity ? "kirilmiyor" : `${h}. adim`, k.length, duyar(k), k.filter((x) => !x.kok).length); } const acik = UC.filter(([, d]) => ilkKirilan(d) === Infinity); console.log(`hicbir halkasi kirilmayan uc: ${acik.length}; bu uclarda okunabilir kalem ` + `${erisilebilir([]).length}, duyarlilik ${duyar(erisilebilir([]))}`); const D = [-20, 12, 14, 14]; console.log("\n4. bolmenin ayri yeri"); yaz(D, "kurulus", "kirdigi adim", "kalem", "duyarlilik"); for (const [ad, d] of [["hicbiri", []], ["yalniz bolme", ["bolme"]], ["yalniz kok-denetimi", ["kok-denetimi"]], ["bolme + kok-denetimi", ["bolme", "kok-denetimi"]]]) { const k = erisilebilir(d), h = ilkKirilan(d); yaz(D, ad, h === Infinity ? "yok" : `${h}. adim`, k.length, duyar(k)); } console.log(`bolme hicbir adimi kirmaz ama envanteri ${KALEM.length} kalemden ` + `${KALEM.filter((k) => k.bolme).length} kaleme, duyarliligi ${duyar(KALEM)}'den ` + `${duyar(KALEM.filter((k) => k.bolme))}'e indirir`);
5 adimlik zincir, 5 katman, 30 kalemlik kurgu envanter (kok alti 12, bolme ici 20, toplam duyarlilik 41) 1. katman-adim eslemesi katman kirdigi mesru dagitim tanitici-eslemesi 2. adim 6 2 kok-denetimi 3. adim 1 3 dar-surec-kimligi 4. adim 4 3 cikti-siniri 5. adim 3 1 bolme yok 9 1 2. sekiz kurulus (tanitici eslemesi disinda) kurulus kalem duyarlilik ilk kirilan hicbiri 30 41 kirilmiyor kok-denetimi 12 7 3. adim dar-surec-kimligi 24 26 4. adim kok-denetimi + dar-surec-kimligi 12 7 3. adim bolme 20 20 kirilmiyor kok-denetimi + bolme 12 7 3. adim dar-surec-kimligi + bolme 20 20 4. adim kok-denetimi + dar-surec-kimligi + bolme 12 7 3. adim tanitici eslemesi tek basina: 10 kalem, duyarlilik 5, 2. adimda kirar; mesru bedeli her yeni kalemin eslemeye eklenmesidir 3. uc basina zincir uc katman ilk kirilan kalem duyarlilik kok disi abone-portali.fatura-indir 3 2. adim 10 5 0 abone-portali.rapor-goster 3 3. adim 12 7 0 saha-uygulamasi.foto-getir 2 3. adim 12 7 0 fatura-uretimi.sablon-oku 1 2. adim 10 5 0 rapor.dokum-indir 1 4. adim 24 26 12 yonetim.kayit-goruntule 0 kirilmiyor 30 41 18 hicbir halkasi kirilmayan uc: 1; bu uclarda okunabilir kalem 30, duyarlilik 41 4. bolmenin ayri yeri kurulus kirdigi adim kalem duyarlilik hicbiri yok 30 41 yalniz bolme yok 20 20 yalniz kok-denetimi 3. adim 12 7 bolme + kok-denetimi 3. adim 12 7 bolme hicbir adimi kirmaz ama envanteri 30 kalemden 20 kaleme, duyarliligi 41'den 20'e indirir
Envanterin Daralması
İkinci çıktı üç katmanın bütün bileşimlerini dener. Hiçbir katman yokken 30 kalemin tamamı okunabilir ve toplam duyarlılık 41’dir; kök denetimi tek başına bunu 12 kaleme ve 7 duyarlılığa indirir. Kalem sayısı %60 azalırken duyarlılık %83 azalır: kökün dışındaki 18 kalem, envanterin duyarlılığının orantısızca büyük bölümünü taşır.
Dar süreç kimliği tek başına 24 kalem ve 26 duyarlılık bırakır. Kök denetiminden belirgin biçimde zayıftır, çünkü yalnız sahipliğe bakar: uygulamanın kendi kalemleri ve herkese okunur sistem kalemleri elenmez. Uygulamanın kendi yapılandırma, bağlantı ve anahtar kalemleri kök dışındadır ve süreç kimliği daralsa bile okunur kalır.
Duyarlılık sütununun kalem sütunundan hızlı düşmesi bu ölçümün en kullanışlı yanıdır. Kalem saymak envanterin büyüklüğünü verir, duyarlılık toplamı ise ne kaybedildiğini. Bir savunma kararı yalnız kalem sayısıyla değerlendirilirse, otuz kalemden yirmisini kapatan bir katman iyi görünür; duyarlılık sütunu o yirmi kalemin toplam ağırlığın ne kadarını taşıdığını söyler ve iki sütun aynı yönde hareket etmeyebilir.
Bileşimler ikinci bir şey söyler: kök denetimi bulunduğu her satırda sonucu 12/7’ye sabitler. Ona eklenen hiçbir katman sayıyı değiştirmez. Kırılabilen en erken halka sonucu belirlediğinde, sonraki katmanların envanter üzerindeki katkısı sıfırdır — bu, dördüncü ve beşinci katmanların gereksiz olduğu anlamına gelmez, kök denetiminin bir uçtan kalkması hâlinde devreye gireceklerini gösterir.
Tanıtıcı eşlemesi zinciri daha erken kırar: ikinci adımda, ad hiç yola çevrilmeden. Geriye 10 kalem ve 5 duyarlılık kalır — kök denetiminden de dar bir küme, çünkü kök altındaki iki arşiv kalemi eşlemede yer almaz. Bedeli ise başka türdendir: her yeni kalem eşlemeye elle eklenmelidir; meşru işe bedeli 6 ile kök denetiminin altı katıdır.
Bölmenin Ayrı Yeri
Dördüncü çıktı bu dersin ayrımını yapar. Bölme hiçbir adımı kırmaz: ad yine istekten gelir, yine yola birleştirilir, yine kökün dışına düşer, yine okunur ve yine yanıta yazılır. Zincirin beş adımı da tamamlanır.
Yaptığı şey ölçünün öteki tarafındadır: envanteri 30 kalemden 20’ye, duyarlılığı 41’den 20’ye indirir. Bir savunma sütununda “kırılan halka” satırı boş kalır, “geç kırmanın bedeli” satırı yarıya iner. Zinciri kırmayan bir katman ölçüm dışı değildir; bedeli azaltan katmandır.
Bu ayrım bu kursun üç sütununun neden ayrı tutulduğunu gösterir. Kırılabilen halka sütunu ile geç kırmanın bedeli sütunu bağımsız değişebilir: bir katman birincisini iyileştirmeden ikincisini yarıya indirebilir, bir başkası birincisini iyileştirip ikincisine hiç dokunmayabilir. Tek sütunla yapılan bir değerlendirme bu iki katmandan birini her zaman görmez.
Bölme ile dar süreç kimliğinin birlikte kullanıldığı satır ikinci bir bulgu verir: ikisi birlikte, bölme tek başınayla aynı sonucu üretir. Bölmenin içindeki 20 kalemin tamamı zaten uygulamanın kendi kalemleri ya da herkese okunur kalemlerdir; dar kimlik orada hiçbir kalemi çıkarmaz. İki katman aynı kümeyi daralttığında ikincisinin katkısı sayıya yansımaz.
Uç Başına Kırılma
Üçüncü çıktı altı ucu ölçer. Dört uçta zincir ikinci ya da üçüncü adımda kırılıyor ve okunabilir kümede kök dışı kalem sayısı sıfırdır. Bir uçta zincir dördüncü adımda kırılıyor ve geriye 24 kalem kalıyor; bunların 12’si kök dışıdır. Bir uçta hiçbir halka kırılmıyor: 30 kalem, 41 duyarlılık, 18 kök dışı kalem.
İki uç arasındaki fark tek bir katmandır. rapor.dokum-indir yalnız dar süreç kimliğini
taşıyor; kök denetimi eklenseydi okunabilir kalem 24’ten 12’ye, duyarlılık 26’dan 7’ye inerdi
ve bunun meşru işe bedeli 1 olurdu. Aynı ölçümde meşru bedeli 9 olan bölme, duyarlılığı
26’dan yalnız 20’ye indirirdi.
Bu karşılaştırma bu dersin pratik sonucudur: en ucuz katman en erken kıran katmandır ve bu sınıfta o katman kök denetimidir. Bölme ve dar kimlik onun yerine geçmez; onun bir uçta unutulduğu durumda kalan bedeli sınırlar.
Çıktı sınırının yeri de aynı tabloda okunur. Beşinci adımı kıran bu katman altı uçtan yalnız birinde dağıtılmış ve bulunduğu uçta zincir zaten üçüncü adımda kırılıyor; yani bu koşumda hiçbir sayıyı değiştirmiyor. Değeri, kendisinden önceki üç katmanın hepsinin aynı anda eksik olduğu bir uçta ortaya çıkar — ve tabloda öyle bir uç vardır, ama orada çıktı sınırı da yoktur. Katmanların dağıtımı birbirini tamamlayacak biçimde değil, birbirini tekrarlayacak biçimde yapılmış; ölçüm bunu tek bakışta göstermez, ancak katman kümeleri uç uç karşılaştırıldığında görünür.
Özet
- Dizin geçişi beş adımlık bir zincirdir ve sınıfın adını taşıyan üçüncü adım tek başına bir okuma üretmez; bedeli belirleyen şey dördüncü adımın kapsadığı envanterdir.
- 30 kalemlik kurgu envanterde kök denetimi tek başına okunabilir kalemi 12’ye, duyarlılığı 7’ye indirir; kalem sayısı %60, duyarlılık %83 azalır.
- Dar süreç kimliği 24 kalem ve 26 duyarlılık bırakır; uygulamanın kök dışındaki kendi yapılandırma ve anahtar kalemleri sahiplik ölçütüyle elenmez.
- Tanıtıcı eşlemesi zinciri en erken noktada — ikinci adımda — kırar ve 10 kalem bırakır, ama meşru işe bedeli 6 ile kök denetiminin altı katıdır.
- Bölme hiçbir adımı kırmaz; envanteri 30’dan 20 kaleme, duyarlılığı 41’den 20’ye indirir. Dar süreç kimliğiyle birlikte kullanıldığında ikinci katman hiçbir kalem çıkarmaz.
- Altı uçtan 1’inde hiçbir halka kırılmıyor (30 kalem, 41 duyarlılık); bir uçta tek bir katmanın eklenmesi duyarlılığı 26’dan 7’ye indirirdi ve meşru işe bedeli 1 olurdu.
Sonraki Adım
Buraya kadarki dört sınıfın ortak noktası, değerin bir yorumlayıcıya verilmesiydi: bir sorgu ayrıştırıcısına, bir sayfa çözümleyicisine, bir adres çözücüye, bir yol birleştiricisine. Beşincisinde yorumlayıcı yoktur. Bir değer bellekte, kendisi için ayrılmış alandan büyük olduğu için komşu alana taşar ve komşu alandaki kalem başka bir şey olur. Sonraki ders bu sınıfı mantık düzeyinde ölçer: sınırlı bir dizi modelinde taşmanın hangi komşu alanı bozduğu, sınır denetiminin kaç durumu yakaladığı, hangi dil sınıfının bu adımı ortadan kaldırdığı ve hangi derleyici ile işletim sistemi denetiminin hangi adımı kırdığı sayılır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.