İçeriğe geç
academia.sh

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ı

  1. Ad istekten gelir. Önkoşul: uç, sunulacak kalemin adını istek alanından alıyor.
  2. Ad yola birleştirilir. Önkoşul: ad bir tanıtıcıya eşlenmiyor, doğrudan yolun bir bileşeni olarak kullanılıyor.
  3. 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.
  4. Süreç kimliği o kalemi okuyabilir. Önkoşul: sürecin çalıştığı kimliğin dosya izinleri o kalemi kapsıyor.
  5. İç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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat