Ders 07 / 21
Hesap ve Kuruluş Yapısı
Aynı iş yükü kümesi üç yapıda kurulur — tek hesap, ortama göre hesap, iş yüküne göre hesap. Patlama yarıçapı, kota paylaşımı, faturanın ayrışması ve yönetim yükü sayılır; kuruluş düzeyi koruma bandının ne kesip ne kesemediği ölçülür.
İçindekiler
Önceki iki ders kimliğin nereden geldiğini ve ne yapabildiğini ölçtü; ikisi de tek bir sınırın içinde kaldı. Politika daraltıldıktan sonra bile bir soru yanıtsız duruyor: bu iş yükleri hangi sınırın içinde? Aynı sekiz iş yükü ve üç ortam üç ayrı yapıda kurulabilir — hepsi tek hesapta, ortama göre ayrılmış hesaplarda ya da iş yüküne göre ayrılmış hesaplarda. Bu ders üçünü yan yana kuruyor ve dört şey sayıyor: patlama yarıçapı, kotanın kaç iş yükü arasında paylaşıldığı, faturanın kaç kaleme ayrıştığı ve kaç hesapla kaç politika kopyasının yönetildiği. Sonda kuruluş düzeyi koruma bandının ne kesip ne kesemediği ölçülüyor.
- BI37. Sekiz iş yükü, üç ortam, sekiz kaynak ailesi ve yirmi dört kaynak kurgusal bölgesel
ölçüm ağına aittir; ölçülen şey
nodeile yazılan modeldir. - BI38. Patlama yarıçapı iki kümenin birleşimidir: kimliğin politikayla eriştiği kaynaklar ve hesabının içindeki kaynaklar. Hesap içinde yükselme mümkün, hesap sınırı geçilmez varsayıldı.
- BI39. Kota hesap başına verildi ve tek bir sayı olarak modellendi. Kurgu birimdir; gerçek bir fiyat ya da sınır listesi değildir.
- BI40. Talep sabittir; ani yük, geri çekilme ve kuyruklanma modellenmiyor. Bunlar sınıra çarpma anını değiştirir, hangi hesabın çarptığını değiştirmez.
- BI41. Bir iş yükünün fatura payı ancak hesabında tek başınaysa doğrudan okunabilir sayıldı; etiketleme yoluyla dağıtım bu derste ölçülmüyor.
- BI42. Kuruluş düzeyi koruma bandı hesaba iliştirilir ve hesabın içini ayıramaz. Bu bir model kararıdır; bandın ortama göre kesebilmesi hesap sınırının ortamı ayırmasına bağlıdır.
Aynı Küme, Üç Yapı
Model kaynakları aile ve ortam çiftiyle adlandırıyor, her ailenin bir sahip iş yükü var ve üç yapı tek bir soruya farklı yanıt veriyor: bir iş yükü hangi hesaba düşüyor. Geri kalanı — politika, kaynak, talep — üç yapıda aynı.
// hesap.mjs — ayni is yuku kumesi uc hesap yapisinda kurulur; kurgusal olcum agi modeli export const ORTAM = ['gelistirme', 'hazirlik', 'uretim']; export const AILE = ['olcum', 'kuyruk', 'arsiv', 'fatura', 'is-emri', 'gunluk', 'yapilandirma', 'posta']; export const IZIN = { // aile -> ailenin acilan izinleri olcum: ['oku', 'yaz', 'sil'], kuyruk: ['oku', 'yaz', 'yonet'], arsiv: ['oku', 'yaz', 'sil'], fatura: ['oku', 'yaz'], 'is-emri': ['oku', 'yaz'], gunluk: ['oku', 'yaz'], yapilandirma: ['oku', 'yaz'], posta: ['gonder'], }; export const VERILEN = { // is yuku -> erisimi olan aileler 'okuma-toplayici': ['olcum', 'kuyruk'], 'dogrulayici': ['olcum', 'kuyruk'], 'gunluk-tasiyici': ['gunluk', 'yapilandirma'], 'faturalama': ['fatura', 'posta', 'arsiv'], 'is-emri': ['is-emri', 'kuyruk', 'posta'], 'gecelik-toplu-is': ['olcum', 'arsiv', 'fatura'], 'arsivleyici': ['arsiv'], 'rapor-uretici': ['fatura', 'arsiv', 'gunluk'], }; export const SAHIP = { // kaynak ailesinin sahibi is yuku olcum: 'okuma-toplayici', kuyruk: 'dogrulayici', arsiv: 'arsivleyici', fatura: 'faturalama', 'is-emri': 'is-emri', gunluk: 'gunluk-tasiyici', yapilandirma: 'gunluk-tasiyici', posta: 'faturalama', }; export const GERCEK = { // gercekten kullanilan yollar 'okuma-toplayici': ['olcum-yaz', 'kuyruk-yaz', 'olcum-oku'], 'dogrulayici': ['olcum-oku', 'kuyruk-oku', 'olcum-yaz', 'olcum-sil'], 'gunluk-tasiyici': ['gunluk-yaz', 'yapilandirma-oku'], 'faturalama': ['fatura-oku', 'fatura-yaz', 'posta-gonder', 'arsiv-oku'], 'is-emri': ['is-emri-yaz', 'is-emri-oku', 'kuyruk-oku', 'posta-gonder'], 'gecelik-toplu-is': ['olcum-oku', 'arsiv-yaz', 'fatura-oku', 'olcum-sil'], 'arsivleyici': ['arsiv-oku', 'arsiv-yaz', 'arsiv-sil'], 'rapor-uretici': ['fatura-oku', 'arsiv-oku', 'gunluk-oku'], }; export const OZNE = Object.keys(VERILEN); export const TALEP = { // kurgu birim: dakikada istek, uretim olceginde 'okuma-toplayici': 420, 'dogrulayici': 260, 'gunluk-tasiyici': 90, 'faturalama': 140, 'is-emri': 110, 'gecelik-toplu-is': 380, 'arsivleyici': 70, 'rapor-uretici': 60, }; export const ORTAM_OLCEK = { gelistirme: 0.1, hazirlik: 0.3, uretim: 1 }; export const KOTA = 1000; // hesap basina kota, kurgu birim export const KAYNAK = AILE.flatMap((a) => ORTAM.map((o) => `${a}@${o}`)); export const KIMLIK = OZNE.flatMap((s) => ORTAM.map((o) => `${s}@${o}`)); // Uc yapi: bir is yukunun hangi hesaba dustugu. export const YAPI = { 'tek-hesap': () => 'tek', 'ortama-gore': (s, o) => o, 'is-yukune-gore': (s, o) => `${s}@${o}`, }; export const kimlikHesap = (y, k) => YAPI[y](k.split('@')[0], k.split('@')[1]); export const kaynakHesap = (y, r) => YAPI[y](SAHIP[r.split('@')[0]], r.split('@')[1]); // Politikayla erisilen kaynaklar: kimligin kendi ortamindaki verilen aileler. export const politikaKaynak = (k) => VERILEN[k.split('@')[0]].map((a) => `${a}@${k.split('@')[1]}`); // Hesabindaki kaynaklar: ele gecen kimlik hesap icinde yukselirse acilan kume. export const hesapKaynak = (y, k) => KAYNAK.filter((r) => kaynakHesap(y, r) === kimlikHesap(y, k)); export const patlama = (y, k) => new Set([...hesapKaynak(y, k), ...politikaKaynak(k)]).size; // Kurulus duzeyi koruma bandi: [izin, hangi ortamda kesilir] export const UST_SINIR = [ ['olcum-sil', (o) => o !== 'uretim'], ['arsiv-sil', (o) => o !== 'uretim'], ['yapilandirma-yaz', () => true], ]; export const verilenIzin = (s) => VERILEN[s].flatMap((a) => IZIN[a].map((x) => `${a}-${x}`));
// kosum1.mjs — patlama yaricapi: bir kimlik ele gecerse kac kaynak aciliyor import { KAYNAK, KIMLIK, YAPI, kimlikHesap, hesapKaynak, patlama, politikaKaynak } from './hesap.mjs'; console.log(`kaynak ${KAYNAK.length}, kimlik ${KIMLIK.length}\n`); console.log('yapi hesap en genis ortalama (kimlik, kaynak) politika'); console.log(' patlama patlama kalemi kadari'); for (const y of Object.keys(YAPI)) { const p = KIMLIK.map((k) => patlama(y, k)); const hesap = new Set(KIMLIK.map((k) => kimlikHesap(y, k))).size; const pol = KIMLIK.reduce((a, k) => a + politikaKaynak(k).length, 0); console.log(`${y.padEnd(18)}${String(hesap).padStart(5)}${String(Math.max(...p)).padStart(10)}` + `${(p.reduce((a, x) => a + x, 0) / p.length).toFixed(1).padStart(10)}` + `${String(p.reduce((a, x) => a + x, 0)).padStart(18)}${String(pol).padStart(10)}`); } console.log('\nis yukune gore yapida uretim kimlikleri hesabinda politikayla patlama'); for (const k of KIMLIK.filter((x) => x.endsWith('uretim'))) console.log(` ${k.padEnd(38)}${String(hesapKaynak('is-yukune-gore', k).length).padStart(9)}` + `${String(politikaKaynak(k).length).padStart(13)}${String(patlama('is-yukune-gore', k)).padStart(9)}`);
kaynak 24, kimlik 24
yapi hesap en genis ortalama (kimlik, kaynak) politika
patlama patlama kalemi kadari
tek-hesap 1 24 24.0 576 57
ortama-gore 3 8 8.0 192 57
is-yukune-gore 24 3 2.4 57 57
is yukune gore yapida uretim kimlikleri hesabinda politikayla patlama
okuma-toplayici@uretim 1 2 2
dogrulayici@uretim 1 2 2
gunluk-tasiyici@uretim 2 2 2
faturalama@uretim 2 3 3
is-emri@uretim 1 3 3
gecelik-toplu-is@uretim 0 3 3
arsivleyici@uretim 1 1 1
rapor-uretici@uretim 0 3 3
Tek hesapta yirmi dört kimliğin her biri, ele geçirildiğinde yirmi dört kaynağın hepsini açıyor.
Ortama göre ayrıldığında bu sayı sekize, iş yüküne göre ayrıldığında en fazla üçe iniyor. Toplam
(kimlik, kaynak) kalemi beş yüz yetmiş altıdan elli yediye düşüyor — on kat.
Son sütun yapının nerede durduğunu söylüyor. Politikanın tek başına verdiği erişim üç yapıda da elli yedi kalemdir; hesap yapısı bu sayıyı değiştirmiyor, yalnız üstüne ne eklendiğini belirliyor. Tek hesapta beş yüz on dokuz kalem hesap sınırından geliyor; iş yüküne göre ayrılmış yapıda ekleme sıfırdır. Daraltılmış bir politika ancak hesap sınırı onu destekliyorsa gerçekten dar demektir.
Alt blok nedenini gösteriyor. Gecelik toplu iş ve rapor üretici hiçbir kaynağa sahip değil; hesaplarında sıfır kaynak var, yarıçapları tamamen politikadan geliyor. Arşivleyici tek aileye sahip ve tek aileye erişiyor, yarıçapı bir. Yapının ne kadar sıkabileceğini sahiplik dağılımı belirliyor.
Kota Paylaşımı ve Kalan
Hesap yalnız bir güvenlik sınırı değil, aynı zamanda bir kota kabıdır.
// kosum2.mjs — kota paylasimi: hangi hesap sinira carpiyor, sinira kac birim kaliyor import { KIMLIK, YAPI, KOTA, TALEP, ORTAM_OLCEK, kimlikHesap } from './hesap.mjs'; const talep = (k) => Math.round(TALEP[k.split('@')[0]] * ORTAM_OLCEK[k.split('@')[1]]); console.log(`hesap basina kota ${KOTA} kurgu birim; toplam talep ${KIMLIK.reduce((a, k) => a + talep(k), 0)}\n`); console.log('yapi hesap kotayi paylasan en dolu sinira asan'); console.log(' en cok kimlik hesap kalan hesap'); for (const y of Object.keys(YAPI)) { const h = new Map(); for (const k of KIMLIK) { const a = kimlikHesap(y, k); h.set(a, [(h.get(a)?.[0] ?? 0) + talep(k), (h.get(a)?.[1] ?? 0) + 1]); } const yuk = [...h.values()], enDolu = Math.max(...yuk.map((v) => v[0])); console.log(`${y.padEnd(18)}${String(h.size).padStart(5)}${String(Math.max(...yuk.map((v) => v[1]))).padStart(17)}` + `${String(enDolu).padStart(10)}${String(KOTA - enDolu).padStart(9)}` + `${String(yuk.filter((v) => v[0] > KOTA).length).padStart(6)}`); } console.log('\nortama gore yapida hesap yuku:'); for (const o of ['gelistirme', 'hazirlik', 'uretim']) { const t = KIMLIK.filter((k) => k.endsWith(o)).reduce((a, k) => a + talep(k), 0); console.log(` ${o.padEnd(12)}talep ${String(t).padStart(4)} kalan ${String(KOTA - t).padStart(5)}`); }
hesap basina kota 1000 kurgu birim; toplam talep 2142
yapi hesap kotayi paylasan en dolu sinira asan
en cok kimlik hesap kalan hesap
tek-hesap 1 24 2142 -1142 1
ortama-gore 3 8 1530 -530 1
is-yukune-gore 24 1 420 580 0
ortama gore yapida hesap yuku:
gelistirme talep 153 kalan 847
hazirlik talep 459 kalan 541
uretim talep 1530 kalan -530
Tek hesapta yirmi dört kimlik aynı bin birimlik kotayı paylaşıyor ve toplam talep iki bin yüz kırk iki. Sınıra kalan eksi bin yüz kırk iki birim; yani hesap kotayı iki kattan fazla aşıyor. Aşmanın sonucu bir iş yükünün değil hepsinin yavaşlamasıdır — geliştirme ortamında koşan bir sınama, üretim ortamındaki toplayıcıyla aynı kabın içindedir.
Ortama göre ayrıldığında kap üçe bölünüyor ve asıl bilgi alt blokta. Geliştirmede sekiz yüz kırk yedi, hazırlıkta beş yüz kırk bir birim boşta duruyor; üretim ise beş yüz otuz birim aşıyor. Toplam talep değişmedi, yalnız nereye düştüğü değişti — ve boşta duran bin üç yüz seksen sekiz birim üretimin eksiğini kapatmıyor, çünkü kotalar devredilemiyor.
İş yüküne göre ayrılmış yapıda hiçbir hesap sınıra çarpmıyor; en dolu hesapta beş yüz seksen birim kalıyor. Bedeli yirmi dört ayrı kotadır — her biri ayrı izlenmesi, artırılması ve unutulması gereken bir sınır. Kota paylaşımı azaldıkça çarpma riski düşüyor, sınır sayısı artıyor.
Fatura ve Yönetim Yükü
Hesap sınırı üçüncü bir şeyi daha belirliyor: faturanın kaç kaleme ayrıldığını ve kaç politika belgesinin bakımını.
// kosum3.mjs — faturanin ayrismasi ve yonetim yuku: kac hesap, kac politika kopyasi import { KIMLIK, YAPI, kimlikHesap, kaynakHesap, politikaKaynak } from './hesap.mjs'; console.log('yapi fatura dogrudan kimlik kaynak toplam'); console.log(' kalemi okunan temelli temelli politika'); for (const y of Object.keys(YAPI)) { const h = new Map(); for (const k of KIMLIK) h.set(kimlikHesap(y, k), (h.get(kimlikHesap(y, k)) ?? 0) + 1); const yalniz = KIMLIK.filter((k) => h.get(kimlikHesap(y, k)) === 1).length; const capraz = KIMLIK.reduce((a, k) => a + politikaKaynak(k).filter((r) => kaynakHesap(y, r) !== kimlikHesap(y, k)).length, 0); console.log(`${y.padEnd(18)}${String(h.size).padStart(6)}${`${yalniz}/${KIMLIK.length}`.padStart(10)}` + `${String(KIMLIK.length).padStart(10)}${String(capraz).padStart(10)}${String(KIMLIK.length + capraz).padStart(10)}`); } console.log('\nis yukune gore yapida capraz hesap erisimi:'); for (const k of KIMLIK.filter((x) => x.endsWith('uretim'))) { const c = politikaKaynak(k).filter((r) => kaynakHesap('is-yukune-gore', r) !== kimlikHesap('is-yukune-gore', k)); console.log(` ${k.padEnd(26)}${String(c.length).padStart(2)} ${c.map((r) => r.split('@')[0]).join(', ') || '-'}`); }
yapi fatura dogrudan kimlik kaynak toplam
kalemi okunan temelli temelli politika
tek-hesap 1 0/24 24 0 24
ortama-gore 3 0/24 24 0 24
is-yukune-gore 24 24/24 24 33 57
is yukune gore yapida capraz hesap erisimi:
okuma-toplayici@uretim 1 kuyruk
dogrulayici@uretim 1 olcum
gunluk-tasiyici@uretim 0 -
faturalama@uretim 1 arsiv
is-emri@uretim 2 kuyruk, posta
gecelik-toplu-is@uretim 3 olcum, arsiv, fatura
arsivleyici@uretim 0 -
rapor-uretici@uretim 3 fatura, arsiv, gunluk
Fatura kalemi hesap sayısıdır: bir, üç, yirmi dört. İlk iki yapıda hiçbir iş yükünün payı hesap düzeyinde okunamıyor; ortama göre ayrılmış yapıda ortam toplamı okunuyor ama iş yükü payı okunmuyor. Üçüncü yapıda yirmi dördün yirmi dördü okunuyor.
Sağdaki üç sütun bedeli veriyor. Kimlik temelli politika sayısı üç yapıda da yirmi dörttür. Değişen kaynak temelli politikadır: iş yüküne göre ayrılmış yapıda otuz üç çapraz hesap erişimi doğuyor ve her biri kaynağın hesabında ayrıca yazılması gereken bir belge. Toplam politika belgesi yirmi dörtten elli yediye çıkıyor.
Alt blok çapraz erişimin nerede biriktiğini gösteriyor. Hiçbir kaynağa sahip olmayan iki iş yükü üçer çapraz erişim taşıyor; günlük taşıyıcı ve arşivleyici hiç taşımıyor, çünkü eriştiği her aileye sahipler. Yapıyı bölmenin maliyeti tam olarak sahiplikle erişimin örtüşmediği kadardır.
Kuruluş Düzeyi Koruma Bandı
Hesapların üstüne bir üst sınır politikası konabilir: hesap içinde ne yazılırsa yazılsın, bandın kestiği izin geçmez. Bandın gücü hesap sınırına bağlıdır, çünkü band hesaba iliştirilir.
// kosum4.mjs — kurulus duzeyi koruma bandi: ne kesiyor, ne kesemiyor import { ORTAM, KIMLIK, YAPI, UST_SINIR, GERCEK, verilenIzin, kimlikHesap, patlama } from './hesap.mjs'; const ayirir = (y) => { // hesap sinirlari ortami ayiriyor mu const h = new Map(); for (const k of KIMLIK) { const a = kimlikHesap(y, k); h.set(a, new Set([...(h.get(a) ?? []), k.split('@')[1]])); } return [...h.values()].every((s) => s.size === 1); }; const uygula = (y) => UST_SINIR.filter(([, ko]) => ayirir(y) || ORTAM.every(ko)); const verilenToplam = KIMLIK.reduce((a, k) => a + verilenIzin(k.split('@')[0]).length, 0); console.log(`verilen (kimlik, izin) kalemi ${verilenToplam}\n`); console.log('yapi ortam kesilen verilenin durdurulan banttan sonra'); console.log(' ayriliyor kalem yuzdesi mesru yol en genis patlama'); for (const y of Object.keys(YAPI)) { let kes = 0, dur = 0; for (const [izin, ko] of uygula(y)) for (const k of KIMLIK) { const [s, o] = k.split('@'); if (!ko(o) || !verilenIzin(s).includes(izin)) continue; kes++; if (GERCEK[s].includes(izin)) dur++; } console.log(`${y.padEnd(18)}${(ayirir(y) ? 'evet' : 'hayir').padEnd(11)}${String(kes).padStart(5)}` + `${`%${Math.round((kes / verilenToplam) * 100)}`.padStart(11)}${String(dur).padStart(11)}` + `${String(Math.max(...KIMLIK.map((k) => patlama(y, k)))).padStart(18)}`); } console.log('\nbant kurallarinin tek tek kestigi kalem (ortam ayrilan yapida):'); for (const [izin, ko] of UST_SINIR) { const k = KIMLIK.filter((x) => ko(x.split('@')[1]) && verilenIzin(x.split('@')[0]).includes(izin)); console.log(` ${izin.padEnd(18)}${String(k.length).padStart(3)} kalem, mesru ` + `${k.filter((x) => GERCEK[x.split('@')[0]].includes(izin)).length}`); }
verilen (kimlik, izin) kalemi 138
yapi ortam kesilen verilenin durdurulan banttan sonra
ayriliyor kalem yuzdesi mesru yol en genis patlama
tek-hesap hayir 3 %2 0 24
ortama-gore evet 17 %12 6 8
is-yukune-gore evet 17 %12 6 3
bant kurallarinin tek tek kestigi kalem (ortam ayrilan yapida):
olcum-sil 6 kalem, mesru 4
arsiv-sil 8 kalem, mesru 2
yapilandirma-yaz 3 kalem, mesru 0
Band üç kural taşıyor: üretim dışında ölçüm silme, üretim dışında arşiv silme ve her yerde yapılandırma yazma. Ortamı ayıran iki yapıda üçü de uygulanabiliyor ve yüz otuz sekiz kalemin on yedisini, yani yüzde on ikisini kesiyor. Tek hesapta yalnız üçüncü kural uygulanabiliyor: hesap sınırı ortamı ayırmadığı için “üretim dışında” koşulu bir yere iliştirilemiyor ve kesilen kalem üçte kalıyor.
Dördüncü sütun bandın bedelini veriyor: kesilen on yedi kalemin altısı meşru bir yolu durduruyor. Alt blok bunu kural kural ayırıyor — ölçüm silme altı kalem kesiyor, dördü meşru; arşiv silme sekiz kesiyor, ikisi meşru; yapılandırma yazma üç kesiyor, hiçbiri meşru değil. Üçüncü kural bedelsiz, ilk ikisi değil.
Son sütun bandın kesemediğini gösteriyor. Band uygulandıktan sonra da en geniş patlama yarıçapı yirmi dört, sekiz ve üç kalıyor. Band izinleri keser, sınırları kurmaz: silme iznini kaldırmak ele geçen bir kimliğin kaç kaynağa dokunabildiğini değiştirmiyor. Onu değiştiren tek şey kaynakların hangi hesapta durduğudur.
Özet
- Aynı 24 kaynak ve 24 kimlik üç yapıda kurulduğunda en geniş patlama yarıçapı 24 → 8 → 3;
toplam
(kimlik, kaynak)kalemi 576’dan 57’ye düşüyor. - Politikanın tek başına verdiği erişim üç yapıda da 57 kalemdir; tek hesapta üstüne 519 kalem ekleniyor, iş yüküne göre ayrılmış yapıda ekleme 0. Daraltılmış politika ancak hesap sınırı destekliyorsa gerçekten dardır.
- Kota hesap başına 1.000 kurgu birim: tek hesapta sınır 1.142 birim aşılıyor; ortama göre üretim hesabı 530 aşarken geliştirme ve hazırlıkta 1.388 birim boşta kalıyor ve devredilemiyor; iş yüküne göre hiçbir hesap aşmıyor, en dolusunda 580 birim kalıyor.
- Fatura kalemi 1 → 3 → 24; iş yükü payı ilk iki yapıda 0/24, üçüncüde 24/24 doğrudan okunuyor. Bedeli politika sayısıdır: 24 belge 57’ye çıkıyor, çünkü 33 çapraz hesap erişimi doğuyor.
- Kuruluş düzeyi koruma bandı ortamı ayıran yapılarda 138 kalemin 17’sini (%12) kesiyor ve 6 meşru yolu durduruyor; tek hesapta ortam koşulu iliştirilemediği için yalnız 3 kalem kesiyor. Gücü kendi metninden değil hesap yapısından geliyor — ve kesemediği şey patlama yarıçapıdır: banttan sonra da en geniş yarıçap 24 / 8 / 3 kalıyor.
Sonraki Adım
Bu konu bir soruyu sonuna kadar götürdü: kim ne yapabiliyor. Kullanıcılar ve roller yazıldı, politikalar iki yönden değerlendirildi, yetki geçici hâle geldi, iş yüküne kimlik verildi, verilen izin kullanılan izinle karşılaştırıldı ve hesaplar ayrıldı. Ama bütün bu ölçümler tek bir fiile bakıyordu: yapmak. Erişim daraltıldıktan sonra bile listede kalan özneler var — patlama yarıçapı sıfır olmadı, üç oldu. Sorulmayan soru şudur: o üç kaynağa erişebilen bir özne veriyi okuduğunda ne görecek? Diskte duran kayıt açık mı, kablodan geçen istek okunabilir mi, kaydı çözen anahtar kimde duruyor? Sonraki ders erişimi değil, erişilenin kendisini ölçüyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.