Ders 21 / 22
Yapı ve Kayıt İncelemesi
Sistem yapılarından çıkan izin kanıt değerinin ölçülmesi: 12 yapının 7'si doğrudan, 5'i çıkarım sınıfındadır ve tabanları 268 makinelik kurgu filoda 4 ile 187 arasında değişir. Yedi iddianın 2'si ayırt edici, 4'ü zayıf, 1'i gürültüdür; tek yapıya dayanan iddia 187 temiz makinede de doğrudur. Üç dayanağı olan bir iddia, üçü de çıkarım sınıfındaysa iki dayanaklı bir iddiadan daha zayıf çıkıyor ve bağımsızlık varsayımı hesabı alt sınır yapıyor.
İçindekiler
Bir önceki ders olayları hazır kayıt olarak aldı: her birinin bir türü, bir kaynağı ve bir zamanı vardı. Bir incelemede toplanan izin önemli bir bölümü böyle hazır gelmez. Sistem kendi işleyişi için tuttuğu yapılara yazar — bir yapılandırma deposu girdisi, bir dosya sistemi meta veri kaydı, bir kısayol, bir önbellek girdisi. Bunların hiçbiri günlük olsun diye yazılmamıştır, ama sıralanabilir ve okunabilir bir iz bırakır.
Bu ders o izleri kanıt değeri cinsinden ele alır ve ölçü birimi bir orandır: aynı izi taşıyan temiz makine sayısı. Bir iz ne kadar seyrekse iddiayı o kadar ayırt eder; bir iz makinelerin çoğunda zaten varsa iddiayı hiç ayırt etmez. Rapora giren cümlelerin çoğu bu ikisi arasında bir yerde durur ve nerede durduğu yazılmadıkça okunamaz. Filo, taban sayıları ve iddia listesi kurgudur.
- AI25. Sistem yapısı, olay kaydı olarak tutulmayan ama sistemin işleyişi gereği iz bırakan bir veri yapısıdır.
- AI26. Bir yapı doğrudan sınıftadır ancak yalnız iddia edilen olay gerçekleştiği için oluşuyorsa. Başka nedenlerle de oluşabiliyorsa çıkarım sınıfındadır.
- AI27. Taban, aynı izi taşıyan temiz makine sayısıdır. Kurgu filo 268 makinedir; taban değerleri elle verilmiştir, gerçek bir filo taranmadı.
- AI28. Bir iddianın ayırt ediciliği, aynı iz birleşimini taşıması beklenen temiz makine sayısıdır. Bir’in altı ayırt edici, bir ile on arası zayıf, onun üstü gürültüdür.
- AI29. Beklenen sayı, izlerin birbirinden bağımsız olduğu varsayımıyla hesaplanır. Bu varsayım gerçekte tutmaz; hesap bu yüzden bir alt sınırdır.
- AI30. Yapıların olay makinesinde bulunduğu verilidir. Bu ders bulmayı değil, bulunanın değerini ölçer.
Yapı, Soru ve Taban
// adli/yapi.mjs — sistem yapilarindan cikan izler ve filo tabani MODELIDIR. // Taban sayilari elle verilmis kurgu degerlerdir; gercek bir filo taranmadi. export const FILO = 268; // temiz kabul edilen makine sayisi // yapi -> [sinif, temiz filoda ayni izi tasiyan makine, yanit verdigi soru] export const YAPI = { "silinmis-dosya-adi": ["dogrudan", 4, "dosya bu makinede vardi"], "cop-kutusu-ustverisi": ["dogrudan", 47, "dosya silindi"], "uygulama-onbellegi": ["dogrudan", 9, "ikili calistirildi"], "zamanlanmis-gorev-tanimi": ["dogrudan", 6, "kalem otomatik calisiyor"], "yapilandirma-deposu-girdisi": ["dogrudan", 12, "kalem acilista calisiyor"], "tasinabilir-ortam-kaydi": ["dogrudan", 22, "ortam bu makineye baglandi"], "kurulum-kaydi": ["dogrudan", 63, "yazilim kuruldu"], "kisayol-kaydi": ["cikarim", 31, "dosyaya erisildi"], "son-kullanilanlar-listesi": ["cikarim", 58, "dosya listelendi"], "dosya-zaman-damgasi": ["cikarim", 96, "dosya pencerede degisti"], "paylasim-dizin-girdisi": ["cikarim", 74, "ag paylasimina baglanildi"], "kullanici-profili-damgasi": ["cikarim", 187, "kullanici oturum acti"], }; // Iddia -> dayandigi yapilar. Iddialar rapora girmesi dusunulen cumlelerdir. export const IDDIA = { "dosya makinede vardi ve silindi": ["silinmis-dosya-adi", "cop-kutusu-ustverisi"], "kalem her acilista calisiyor": ["yapilandirma-deposu-girdisi", "zamanlanmis-gorev-tanimi"], "ikili bu makinede calistirildi": ["uygulama-onbellegi", "kisayol-kaydi"], "veri tasinabilir ortama kopyalandi": ["tasinabilir-ortam-kaydi", "dosya-zaman-damgasi", "son-kullanilanlar-listesi"], "yazilim makineye kuruldu": ["kurulum-kaydi", "uygulama-onbellegi"], "dosyayi bir kullanici acti": ["son-kullanilanlar-listesi", "kisayol-kaydi", "kullanici-profili-damgasi"], "su kullanici o anda oturumdaydi": ["kullanici-profili-damgasi"], }; // Ayni iz birlesimini tasiyan temiz makine beklentisi (izler bagimsiz varsayilir). export const beklenen = (dayanak) => FILO * dayanak.reduce((a, y) => a * YAPI[y][1] / FILO, 1); export const dogrudanSayisi = (dayanak) => dayanak.filter((y) => YAPI[y][0] === "dogrudan").length; export const sinifla = (b) => (b < 1 ? "ayirt edici" : b < 10 ? "zayif" : "gurultu");
Tablodaki üçüncü alan her yapının yanıt verdiği soruyu taşıyor ve bu alan iddia yazarken en çok karıştırılan yerdir. Silinmiş dosya adı kaydı “dosya bu makinede vardı” sorusunu yanıtlar, “dosyayı kim getirdi” sorusunu değil. Çöp kutusu üst verisi “dosya silindi” der, “dosya gizlendi” demez. Uygulama önbelleği “ikili çalıştırıldı” der, “ikili şunu yaptı” demez. Bir yapıdan onun yanıtladığı sorunun ötesine geçen her cümle, dayanağı olmayan bir genişletmedir ve tabloda hiçbir sütuna yazılamaz.
İki sınıf arasındaki fark ise yapının ne zaman oluştuğuna bakar. Bir uygulama önbelleği girdisi, ikili çalıştırılmadıysa oluşmaz; girdinin varlığı çalıştırmayı doğrudan gösterir. Bir dosya zaman damgası ise dosya değiştiğinde de, kopyalandığında da, yedekten döndüğünde de değişir; damganın olay penceresine düşmesi bir çıkarımdır. Aynı ayrım kısayol kaydı için de geçerlidir: kısayol, kullanıcı dosyayı açtığında da, bir betik ona dokunduğunda da oluşabilir.
İddianın Ayırt Ediciliği
// adli/deger.mjs — yapi basina taban, iddia basina ayirt edicilik ve tek yapiya baglilik. import { FILO, YAPI, IDDIA, beklenen, dogrudanSayisi, sinifla } from "./yapi.mjs"; const y = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd()); const yapilar = Object.keys(YAPI), iddialar = Object.keys(IDDIA); console.log(`model: ${yapilar.length} yapi, ${iddialar.length} iddia, ${FILO} makinelik temiz ` + `filo; ${yapilar.filter((k) => YAPI[k][0] === "dogrudan").length} yapi dogrudan, ` + `${yapilar.filter((k) => YAPI[k][0] === "cikarim").length} yapi cikarim`); const A = [-28, -10, 8, 7, 16]; console.log(""); y(A, "yapi", "sinif", "taban", "oran", "dayanan iddia"); for (const k of yapilar) y(A, k, YAPI[k][0], YAPI[k][1], `%${Math.round(YAPI[k][1] * 100 / FILO)}`, iddialar.filter((i) => IDDIA[i].includes(k)).length); const B = [-36, 8, 10, 15, 14]; console.log(""); y(B, "iddia", "dayanak", "dogrudan", "temiz makine", "sonuc"); for (const i of iddialar) { const b = beklenen(IDDIA[i]); y(B, i, IDDIA[i].length, dogrudanSayisi(IDDIA[i]), b.toFixed(2), sinifla(b)); } const kanitsiz = iddialar.filter((i) => dogrudanSayisi(IDDIA[i]) === 0); console.log(`\ndogrudan dayanagi olmayan iddia: ${kanitsiz.length} (${kanitsiz.join("; ")})`); console.log(`ayirt edici ${iddialar.filter((i) => beklenen(IDDIA[i]) < 1).length}, ` + `zayif ${iddialar.filter((i) => sinifla(beklenen(IDDIA[i])) === "zayif").length}, ` + `gurultu ${iddialar.filter((i) => sinifla(beklenen(IDDIA[i])) === "gurultu").length}`); // Tek yapiya baglilik: bir yapi silinirse hangi iddia sinif degistiriyor. console.log(""); const C = [-28, 12, 19, 14]; y(C, "yapi silinirse", "etkilenen", "dayanaksiz kalan", "sinif dusen"); for (const k of yapilar) { const et = iddialar.filter((i) => IDDIA[i].includes(k)); if (!et.length) continue; const bos = et.filter((i) => IDDIA[i].length === 1); const dus = et.filter((i) => IDDIA[i].length > 1 && sinifla(beklenen(IDDIA[i].filter((z) => z !== k))) !== sinifla(beklenen(IDDIA[i]))); y(C, k, et.length, bos.length, dus.length); }
model: 12 yapi, 7 iddia, 268 makinelik temiz filo; 7 yapi dogrudan, 5 yapi cikarim yapi sinif taban oran dayanan iddia silinmis-dosya-adi dogrudan 4 %1 1 cop-kutusu-ustverisi dogrudan 47 %18 1 uygulama-onbellegi dogrudan 9 %3 2 zamanlanmis-gorev-tanimi dogrudan 6 %2 1 yapilandirma-deposu-girdisi dogrudan 12 %4 1 tasinabilir-ortam-kaydi dogrudan 22 %8 1 kurulum-kaydi dogrudan 63 %24 1 kisayol-kaydi cikarim 31 %12 2 son-kullanilanlar-listesi cikarim 58 %22 2 dosya-zaman-damgasi cikarim 96 %36 1 paylasim-dizin-girdisi cikarim 74 %28 0 kullanici-profili-damgasi cikarim 187 %70 2 iddia dayanak dogrudan temiz makine sonuc dosya makinede vardi ve silindi 2 2 0.70 ayirt edici kalem her acilista calisiyor 2 2 0.27 ayirt edici ikili bu makinede calistirildi 2 1 1.04 zayif veri tasinabilir ortama kopyalandi 3 1 1.71 zayif yazilim makineye kuruldu 2 2 2.12 zayif dosyayi bir kullanici acti 3 0 4.68 zayif su kullanici o anda oturumdaydi 1 0 187.00 gurultu dogrudan dayanagi olmayan iddia: 2 (dosyayi bir kullanici acti; su kullanici o anda oturumdaydi) ayirt edici 2, zayif 4, gurultu 1 yapi silinirse etkilenen dayanaksiz kalan sinif dusen silinmis-dosya-adi 1 0 1 cop-kutusu-ustverisi 1 0 1 uygulama-onbellegi 2 0 2 zamanlanmis-gorev-tanimi 1 0 1 yapilandirma-deposu-girdisi 1 0 1 tasinabilir-ortam-kaydi 1 0 1 kurulum-kaydi 1 0 0 kisayol-kaydi 2 0 1 son-kullanilanlar-listesi 2 0 1 dosya-zaman-damgasi 1 0 0 kullanici-profili-damgasi 2 1 0
Son sütun 0,27’den 187’ye uzanıyor ve bu aralık dersin sonucudur. En altta duran cümle — “şu kullanıcı o anda oturumdaydı” — tek bir yapıya dayanıyor ve o yapının tabanı 268 makinenin 187’sidir. Cümle büyük olasılıkla doğrudur ve hiçbir şey ayırt etmez: filodaki her on makinenin yedisinde aynı iz vardır. Bir iddianın doğru olması ile bir şey göstermesi ayrı niteliklerdir ve raporda ancak ikincisi iş görür.
Dördüncü ve altıncı satırlar birlikte okunmalıdır. “Veri taşınabilir ortama kopyalandı” üç dayanağa oturuyor ve beklenen sayısı 1,71; “dosyayı bir kullanıcı açtı” da üç dayanağa oturuyor ve beklenen sayısı 4,68. Aradaki farkı yapan dayanak sayısı değil, dayanakların sınıfıdır: birincisinde taşınabilir ortam kaydı doğrudan sınıftadır ve tabanı yüzde 8’dir; ikincisinin üç dayanağı da çıkarımdır ve en zayıfının tabanı yüzde 70. Dayanak eklemek ayırt ediciliği artırmaz; seyrek dayanak eklemek artırır.
Bağımsızlık varsayımı burada ayrıca yazılmalıdır. Çarpım, izlerin birbirinden bağımsız oluştuğunu kabul eder. Gerçekte kısayol kaydı ile son kullanılanlar listesi çoğu zaman aynı eylemden doğar; biri varsa ötekinin de bulunma olasılığı çarpımın verdiğinden yüksektir. Yani gerçek sayı hesaplanandan büyüktür ve tabloda okunan 4,68 bir alt sınırdır. Bağımsızlık varsayımı her zaman iddiayı olduğundan güçlü gösterir; bunun yazılmadığı bir çözümleme kendi lehine yanlıdır.
Üçüncü tablo bir yapının kaybının bedelini sayıyor. Uygulama önbelleği iki iddiaya dayanaktır ve kaybı iki iddianın da sınıfını düşürür; en pahalı tek yapı odur. Kullanıcı profili damgası da iki iddiaya dayanaktır ama kaybı hiçbir sınıf düşürmez — biri zaten gürültüdür, ötekisi onsuz da aynı sınıfta kalır. İki yapı aynı sayıda iddiaya dayanak olabilir ve taşıdıkları ağırlık taban farkı kadar farklıdır.
Tablodaki en sessiz satır paylaşım dizin girdisidir: bulunmuştur, sınıflandırılmıştır ve hiçbir iddiaya dayanak değildir. Toplanan iz ile kullanılan iz aynı küme değildir ve aradaki fark, raporun uzunluğuyla değeri arasındaki farkın kaynağıdır.
Yapının Ömrü ve Gecikmenin Bedeli
// adli/omur.mjs — yapinin uzerine yazilma suresi ve gecikmenin iddialara etkisi. import { FILO, YAPI, IDDIA, beklenen, sinifla } from "./yapi.mjs"; const y = (g, ...s) => console.log(s.map((v, i) => (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join("").trimEnd()); // yapi -> [tuttugu girdi sayisi, olagan kullanimda gunde eklenen girdi] 0 = uzerine yazilmaz const DONGU = { "silinmis-dosya-adi": [2400, 180], "cop-kutusu-ustverisi": [500, 12], "uygulama-onbellegi": [1024, 96], "zamanlanmis-gorev-tanimi": [1, 0], "yapilandirma-deposu-girdisi": [1, 0], "tasinabilir-ortam-kaydi": [64, 3], "kurulum-kaydi": [1, 0], "kisayol-kaydi": [149, 22], "son-kullanilanlar-listesi": [20, 14], "dosya-zaman-damgasi": [1, 0.35], "paylasim-dizin-girdisi": [32, 9], "kullanici-profili-damgasi": [1, 1], }; const omur = (k) => (DONGU[k][1] ? DONGU[k][0] / DONGU[k][1] : Infinity); const okunur = (k, gun) => gun <= omur(k); const A = [-28, 10, 10, 12, 10]; y(A, "yapi", "girdi", "gunluk", "omur gun", "taban"); for (const k of Object.keys(YAPI)) y(A, k, DONGU[k][0], DONGU[k][1], DONGU[k][1] ? omur(k).toFixed(1) : "surekli", YAPI[k][1]); const B = [-10, 14, 14, 8, 10, 14]; console.log(""); y(B, "gecikme", "okunur yapi", "ayirt edici", "zayif", "gurultu", "dayanaksiz"); for (const gun of [1, 3, 7, 14, 30, 90]) { const kalan = Object.fromEntries(Object.keys(IDDIA).map((i) => [i, IDDIA[i].filter((k) => okunur(k, gun))])); const say = (s) => Object.values(kalan).filter((d) => d.length && sinifla(beklenen(d)) === s).length; y(B, `${gun} gun`, Object.keys(YAPI).filter((k) => okunur(k, gun)).length, say("ayirt edici"), say("zayif"), say("gurultu"), Object.values(kalan).filter((d) => !d.length).length); } const kalici = Object.keys(YAPI).filter((k) => omur(k) === Infinity); console.log(`\n${Object.keys(YAPI).length} yapinin ${kalici.length}'i uzerine yazilmiyor; ` + `filo ${FILO} makine, taban degerleri degismiyor`);
yapi girdi gunluk omur gun taban silinmis-dosya-adi 2400 180 13.3 4 cop-kutusu-ustverisi 500 12 41.7 47 uygulama-onbellegi 1024 96 10.7 9 zamanlanmis-gorev-tanimi 1 0 surekli 6 yapilandirma-deposu-girdisi 1 0 surekli 12 tasinabilir-ortam-kaydi 64 3 21.3 22 kurulum-kaydi 1 0 surekli 63 kisayol-kaydi 149 22 6.8 31 son-kullanilanlar-listesi 20 14 1.4 58 dosya-zaman-damgasi 1 0.35 2.9 96 paylasim-dizin-girdisi 32 9 3.6 74 kullanici-profili-damgasi 1 1 1.0 187 gecikme okunur yapi ayirt edici zayif gurultu dayanaksiz 1 gun 12 2 4 1 0 3 gun 9 2 2 2 1 7 gun 7 2 2 1 2 14 gun 5 1 0 3 3 30 gun 4 1 0 2 4 90 gun 3 1 0 1 5 12 yapinin 3'i uzerine yazilmiyor; filo 268 makine, taban degerleri degismiyor
Yapıların çoğu döngüseldir: sabit sayıda girdi tutar ve yenisi geldiğinde en eskisini atar. Ömür bu iki sayının oranıdır ve tabloda bir günden sürekliye uzanıyor. Üç yapı hiç üzerine yazılmıyor; bunlar tanım kayıtlarıdır, silinmedikçe durur.
Birinci tablonun iki sütunu birlikte okunduğunda ters bir bağ çıkıyor. En kısa ömürlü iki yapı — kullanıcı profili damgası ve son kullanılanlar listesi — aynı zamanda en yüksek tabanlı iki yapıdır. Bir yapıya ne kadar sık yazılıyorsa hem o kadar çabuk üzerine yazılır hem de temiz makinelerin o kadar çoğunda bulunur. Hızlı kaybolan iz, kaybolmasa bile en az ayırt eden izdir.
İkinci tablo kursun ölçü eksenini bu derse taşıyor. Gecikme bir günden doksan güne çıkarken okunabilir yapı sayısı 12’den 3’e, dayanaksız kalan iddia sayısı 0’dan 5’e gidiyor. İddia sayısı hiç değişmiyor; değişen tek şey, o iddiaları taşıyan yapıların hâlâ orada olup olmadığıdır.
On dördüncü günün satırı ayrıca dikkat ister: zayıf sınıftaki iddia sayısı sıfırdır. İddialar iyileşmiş değildir; aradaki dayanakları taşıyan yapılar döngüde silindiği için iddialar iki uca savrulmuştur — ya sürekli yapılara dayanıp ayırt edici kalmışlardır ya da yalnız yüksek tabanlı bir yapıya kalıp gürültüye düşmüşlerdir. Gecikme kanıtı yalnız azaltmaz, dağılımını da bozar.
Özet
- Bir yapı, yalnız iddia edilen olay gerçekleştiği için oluşuyorsa doğrudan, başka nedenlerle de oluşabiliyorsa çıkarım sınıfındadır; 12 yapının 7’si doğrudandır ve tabanları 268 makinelik filoda 4 ile 187 arasında, yani yüzde 1 ile yüzde 70 arasında değişir.
- Yedi iddianın 2’si ayırt edici, 4’ü zayıf, 1’i gürültüdür; gürültü olan iddia tek bir çıkarım yapısına dayanır ve 187 temiz makinede de doğrudur.
- Dayanak sayısı ayırt ediciliği belirlemez: üç çıkarım dayanağı olan iddia (4,68), bir doğrudan ve iki çıkarım dayanağı olan iddiadan (1,71) daha zayıftır.
- Bağımsızlık varsayımı hesabı alt sınır yapar ve her zaman iddia lehine yanlıdır; aynı eylemden doğan izler birlikte bulunur.
- Bir yapının kaybı sayı olarak ölçülür: uygulama önbelleğinin kaybı iki iddianın sınıfını düşürür, kullanıcı profili damgasının kaybı hiçbirini düşürmez.
- Yapıların dokuzu döngüseldir ve ömürleri 1 ile 41,7 gün arasındadır; gecikme bir günden doksan güne çıktığında okunabilir yapı 12’den 3’e, dayanaksız kalan iddia 0’dan 5’e gider.
Sonraki Adım
Bu konunun beş dersi beş ayrı sayı üretti: zincirin kaç kalemde koptuğu, kapsamın kaç kalem getirdiği, sıranın kaç kalem kaybettirdiği, kaymanın kaç olayı ters çevirdiği ve bir izin kaç temiz makinede de bulunduğu. Bunların hiçbiri henüz bir rapor cümlesi değil. Rapor, bu sayıların üzerine kurulan iddialardan oluşur ve iddia ile kalem arasındaki bağ tek tek yazılmadıkça sayılar raporda görünmez.
Son ders bu eşlemeyi ölçer ve kursu kapatır. Rapora girmesi düşünülen her iddia, dayandığı kanıt kalemine bağlanır; üç sütun ayrı sayılır — kaç iddia doğrudan bir kalemle destekleniyor, kaçı bir çıkarıma dayanıyor, kaçının hiçbir kanıtı yok. Teknik bulgunun hukuki bağlamda ne anlama geldiği de tam olarak bu üç sayının nasıl yazıldığına bağlıdır.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.