---
title: 'Bulut Temelleri'
source: 'https://academia.sh/tr/kurslar/bulut-temelleri'
language: tr
updated: '2026-08-17T04:38:56+00:00'
license: 'CC BY-SA 4.0'
lessons: 10
outcomes:
    - 'Hizmet ve dağıtım modellerini devredilen karar cinsinden ayırır'
    - 'Paylaşılan sorumluluk sınırını kalem kalem çıkarır'
    - 'Fiyatlandırma ve göç seçeneklerini bedeliyle karşılaştırır'
---

# Bulut Temelleri

Kiralamanın ne olduğu ve sınırının nerede durduğu: isteğe bağlı kaynak ve esnekliğin sayıya bağlanması, altyapı, platform ve yazılım hizmeti modellerinin devredilen karar cinsinden karşılaştırılması, genel, özel ve karma dağıtım modelleri, şirket içi ile maliyet yapısı ve sorumluluk farkı, sağlayıcı ile müşteri arasındaki paylaşılan sorumluluk sınırı, bölge ve erişilebilirlik alanlarının arıza alanı ayrımı, kenar konumları, tasarım çerçevesinin sütunları, isteğe bağlı, ayrılmış ve kesintili kapasitenin fiyat farkı ve göç stratejileri.

## Bulut Kavramı

Kiralamanın tanımı ve sınırı: isteğe bağlı kaynak ile esnekliğin ölçülmesi, altyapı, platform ve yazılım hizmeti modellerinin hangi kararı devrettiği, genel, özel ve karma dağıtımın maliyet ve denetim farkı, şirket içi kurulumla sabit ve değişken maliyet yapısının karşılaştırılması ve sağlayıcı ile müşteri arasındaki sorumluluk sınırının kalem kalem çıkarılması.

### Bulut Bilişim Nedir

Source: https://academia.sh/tr/kurslar/bulut-temelleri/bulut-bilisim-nedir

İsteğe bağlı kaynağın ölçüsü: aynı 120 günlük talep eğrisinde kapasite isteğinden kullanıma kadar geçen sürenin 30 günden 1 güne inmesi, tepe yapan yükte karşılanamayan isteğin 84.689'dan 1.260'a ve kapasitenin açık kaldığı günün 15'ten 2'ye düşmesi, atıl kapasitenin 764'ten 254 birim-güne inmesi, buna karşılık sabit yükte kurtarılan isteğin sıfır kalması ve çıkışta elde kalan sekiz kalemin dörde inmesi.

Önceki müfredat sekiz kurs boyunca aynı şeyi yaptı: makine, ağ, depo ve kümeyi tek tek ele aldı,
her birinde bir karar verdi ve o kararın bedelini saydı. Bütün o katmanların ortak bir sessiz
varsayımı vardı — donanım **satın alınmıştı**. Bu ders o varsayımı kaldırır ve tek soru sorar:
aynı katmanlar satın alınmak yerine **kiralanırsa** hangi sayı değişir.

**Bulut bilişim**, hesaplama kaynağının satın alınmak yerine **isteğe bağlı** olarak kiralanması ve
kullanıldığı kadar ödenmesidir. Kiralamanın satmaya çalıştığı şeyin adı **esneklik**tir: kapasiteyi
talep değiştikçe artırıp azaltabilmek. Esneklik, M19'un **ölçekleme**sinin bir üst katmanıdır —
ölçekleme kaç düğüm koşacağını sorar, esneklik o düğümün **ne kadar sürede** elde edileceğini.
"Bulut hızlıdır" bir karar taşımaz; hızın ölçüsü bir süredir ve o süre iki maliyet üretir.

#### Esneklik Bir Sayıdır

Örnek, kursun kurgu **bölgesel ölçüm ağı**dır: su sayacı okumalarını toplayan bir servis,
okumaları doğrulayan bir servis, faturalama ve iş emri servisleri, gecelik bir toplu iş ve beş
ekip. Ağ da servisler de kurgudur.

**BK1:** model 120 günlük bir pencere koşar; ölçülen servis okuma toplayıcıdır. **BK2:** bir
kapasite birimi günde 1.200 istek karşılar. **BK3:** kendi donanımında kapasite isteğinden
kullanıma 30 gün geçer, en küçük alım 4 birimdir ve alınan kapasite geri verilmez. **BK4:**
kiralamada aynı süre 1 gündür, en küçük alım 1 birimdir ve kapasite aynı sürede azaltılabilir.
**BK5:** son üç günün en yüksek talebi kapasitenin %85'ini aşarsa kapasite isteği doğar; hedef,
o tepenin %20 payla üstüdür. **BK6:** karşılanamayan istek, talebin kapasiteyi aştığı kısımdır;
atıl kapasite, kapasitenin gereken birimi aştığı kısımdır ve birim-gün olarak toplanır.

Talep eğrisi ve iki edinme biçimi bir **modeldir**; gerçek bir ölçüm ağı, gerçek bir talep kaydı
ya da gerçek bir tedarik süresi yoktur. Günlük dalga için üreteç kendi yazılır ve tohumu görünür.

```js
// bulut/talep.mjs — kurgu bolgesel olcum aginin talep egrisi ve kapasite edinme modeli (model):
// gercek bir olcum agi, gercek bir talep kaydi ya da gercek bir tedarik suresi yok.

export const GUN = 120;              // model 120 gunluk bir pencere kosar
export const BIRIM = 1200;           // bir kapasite birimi gunde 1200 istek karsilar
export const ESIK = 0.85, PAY = 1.2; // esik asilinca tepe + %20 pay hedeflenir

// uretec kendi yazilir, tohum gorunur: dogrusal eslesmeli uretec, yalniz gunluk dalga icin
export function uretec(tohum) {
  let s = tohum >>> 0;
  return () => ((s = (s * 1103515245 + 12345) >>> 0) % 1000) / 1000;
}

const TABAN = {
  duz: () => 5000,
  tepe: (g) => 5000 + (g >= 55 && g < 75 ? 13000 * Math.sin(((g - 55) / 20) * Math.PI) : 0),
  buyuyen: (g) => 4000 + 90 * g,
};

export function egri(ad) {
  const r = uretec(20260401);
  return Array.from({ length: GUN }, (_, g) => Math.round(TABAN[ad](g) * (0.94 + 0.12 * r())));
}

// kip: gecikme = kapasite isteginden kullanima gun, blok = en kucuk alim, azalt = geri verilir mi
export const KIP = {
  kendi: { gecikme: 30, blok: 4, azalt: false },
  kira: { gecikme: 1, blok: 1, azalt: true },
};

export function kos(egriAd, kipAd, ust = {}) {
  const T = egri(egriAd), { gecikme, blok, azalt } = { ...KIP[kipAd], ...ust };
  const yukari = (b) => Math.ceil(b / blok) * blok;
  let kap = yukari(Math.ceil((Math.max(T[0], T[1], T[2]) * PAY) / BIRIM));
  const sira = [];                                   // bekleyen kapasite istekleri
  const s = { istek: 0, bekleme: 0, acik: 0, kayip: 0, atil: 0, kiralanan: 0, tepeKap: kap };

  for (let g = 0; g < GUN; g++) {
    for (const i of sira.filter((x) => x.gelis === g)) kap = i.hedef;
    const pencere = Math.max(...T.slice(Math.max(0, g - 2), g + 1));
    const hedef = yukari(Math.ceil((pencere * PAY) / BIRIM));
    const bekleyen = sira.filter((x) => x.gelis > g);
    const sonHedef = bekleyen.length ? bekleyen[bekleyen.length - 1].hedef : kap;
    const buyut = pencere > ESIK * kap * BIRIM && hedef > sonHedef;
    const kucult = azalt && hedef < sonHedef && bekleyen.length === 0;
    if (buyut || kucult) {
      sira.push({ gelis: g + gecikme, hedef });
      if (buyut) { s.istek++; s.bekleme += gecikme; }
    }
    const karsilanan = Math.min(T[g], kap * BIRIM);
    if (T[g] > karsilanan) { s.acik++; s.kayip += T[g] - karsilanan; }
    s.atil += Math.max(0, kap - T[g] / BIRIM);
    s.kiralanan += kap;
    s.tepeKap = Math.max(s.tepeKap, kap);
  }
  return { ...s, bekleme: s.istek ? (s.bekleme / s.istek).toFixed(1) : "-" };
}

// Cikista ne elde kalir: "+" tasinir, "-" hizmete gomulu, "yok" o bicimde kalem hic yoktur.
export const CIKIS = `
  toplanan olcum verisi      + +
  servis yapilandirmasi      + +
  kurulum yordami            + +
  isletim bilgisi            + +
  donanimin kendisi          + yok
  yerlesim sozlesmesi        + yok
  olcekleme karari           + -
  olculen basarim gecmisi    + -`
  .trim().split("\n").map((r) => {
    const p = r.trim().split(/\s{2,}/);
    const [a, b] = p[1].split(/\s+/);
    return { kalem: p[0], kendi: a, kira: b };
  });
```

```js
// bulut/olc.mjs — esneklik bir sayidir: bekleme, karsilanamayan istek, atil kapasite, cikis.
import { kos, egri, CIKIS, GUN, BIRIM } from "./talep.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const EGRI = ["duz", "tepe", "buyuyen"];

const R = {};
for (const e of EGRI) for (const k of ["kendi", "kira"]) R[`${e}-${k}`] = kos(e, k);
const t = egri("tepe");
console.log(`${GUN} gunluk pencere, birim basina ${BIRIM} istek/gun; tepe egrisinin ` +
  `en dusuk gunu ${Math.min(...t)}, en yuksek gunu ${Math.max(...t)} istek`);

const A = [-32, 14, 12];
console.log("\n1. tepe yapan egride ayni is yuku, iki edinme bicimi");
yaz(A, "olcu", "kendi donanimi", "kiralama");
for (const [ad, f] of [["kapasite istegi (adet)", (r) => r.istek],
  ["istekten kullanima (gun)", (r) => r.bekleme],
  ["kapasitenin acik kaldigi gun", (r) => r.acik],
  ["karsilanamayan istek", (r) => r.kayip],
  ["atil kapasite (birim-gun)", (r) => r.atil.toFixed(0)],
  ["en yuksek kapasite (birim)", (r) => r.tepeKap]])
  yaz(A, ad, f(R["tepe-kendi"]), f(R["tepe-kira"]));

const B = [-10, 14, 13, 13, 12];
console.log("\n2. ayni olcu uc talep egrisinde (kayip = karsilanamayan istek)");
yaz(B, "egri", "kendi kayip", "kendi atil", "kira kayip", "kira atil");
for (const e of EGRI)
  yaz(B, e, R[`${e}-kendi`].kayip, R[`${e}-kendi`].atil.toFixed(0),
    R[`${e}-kira`].kayip, R[`${e}-kira`].atil.toFixed(0));

const C = [-10, 18, 21, 19];
console.log("\n3. esneklikten ne alindi, karsiliginda ne kiralandi");
yaz(C, "egri", "kurtarilan istek", "kiralanan birim-gun", "istek / birim-gun");
for (const e of EGRI) {
  const k = R[`${e}-kendi`].kayip - R[`${e}-kira`].kayip, bg = R[`${e}-kira`].kiralanan;
  yaz(C, e, k, bg, (k / bg).toFixed(1));
}

const E = [-24, 10, 12, 16, 16];
console.log("\n4. tedarik suresi kisaldikca (tepe egrisi, 4 birimlik blok, geri verme yok)");
yaz(E, "istekten kullanima (gun)", "istek", "acik gun", "karsilanamayan", "atil birim-gun");
for (const g of [30, 14, 7, 3, 1]) {
  const r = kos("tepe", "kendi", { gecikme: g });
  yaz(E, g, r.istek, r.acik, r.kayip, r.atil.toFixed(0));
}

const D = [-27, 16, 12];
console.log("\n5. cikista ne elde kalir (8 kalem; yok = o bicimde kalem hic yoktur)");
yaz(D, "kalem", "kendi donanimi", "kiralama");
for (const c of CIKIS) yaz(D, c.kalem, c.kendi, c.kira);
const say = (a, d) => CIKIS.filter((c) => c[a] === d).length;
yaz(D, "TASINIR / GOMULU / YOK", `${say("kendi", "+")} / ${say("kendi", "-")} / ` +
  `${say("kendi", "yok")}`, `${say("kira", "+")} / ${say("kira", "-")} / ${say("kira", "yok")}`);
```

```
120 gunluk pencere, birim basina 1200 istek/gun; tepe egrisinin en dusuk gunu 4714, en yuksek gunu 18619 istek

1. tepe yapan egride ayni is yuku, iki edinme bicimi
olcu                            kendi donanimi    kiralama
kapasite istegi (adet)                       3          10
istekten kullanima (gun)                  30.0         1.0
kapasitenin acik kaldigi gun                15           2
karsilanamayan istek                     84689        1260
atil kapasite (birim-gun)                  764         254
en yuksek kapasite (birim)                  20          19

2. ayni olcu uc talep egrisinde (kayip = karsilanamayan istek)
egri         kendi kayip   kendi atil   kira kayip   kira atil
duz                    0          459            0         204
tepe               84689          764         1260         254
buyuyen            32784          123            0         239

3. esneklikten ne alindi, karsiliginda ne kiralandi
egri        kurtarilan istek  kiralanan birim-gun  istek / birim-gun
duz                        0                  705                0.0
tepe                   83429                  892               93.5
buyuyen                32784                 1175               27.9

4. tedarik suresi kisaldikca (tepe egrisi, 4 birimlik blok, geri verme yok)
istekten kullanima (gun)     istek    acik gun  karsilanamayan  atil birim-gun
30                               3          15           84689             764
14                               3          13           81223             953
7                                3           8           38341            1001
3                                3           4            7647            1024
1                                3           0               0            1037

5. cikista ne elde kalir (8 kalem; yok = o bicimde kalem hic yoktur)
kalem                        kendi donanimi    kiralama
toplanan olcum verisi                     +           +
servis yapilandirmasi                     +           +
kurulum yordami                           +           +
isletim bilgisi                           +           +
donanimin kendisi                         +         yok
yerlesim sozlesmesi                       +         yok
olcekleme karari                          +           -
olculen basarim gecmisi                   +           -
TASINIR / GOMULU / YOK            8 / 0 / 0   4 / 2 / 2
```

Sayılar **ölçüm** sınıfındadır; girdileri BK1–BK6'dır. Birinci tablo esnekliği tek satıra
indirir: **istekten kullanıma 30,0 güne karşı 1,0 gün.** Bu tek sayı geri kalan her şeyi belirler.

#### Beklemenin ve Atıl Kapasitenin Maliyeti

Otuz günlük bekleme kendini iki yerde gösterir. Tepe yapan eğride kendi donanımı üç kapasite
isteği açar, ama kapasite geldiğinde tepe çoktan geçmiştir: kapasite **15 gün açık kalır** ve
**84.689 istek karşılanamaz**. Kiralamada aynı eğri on kapasite isteği doğurur, her biri ertesi
gün kullanıma girer, açık gün 15'ten 2'ye ve karşılanamayan istek 1.260'a iner. Kalan 1.260
isteğin nedeni tedarik değil, karar kuralıdır: eşik aşıldıktan sonra bir gün beklenir.

İkinci maliyet ters yöndedir. Kendi donanımı geri verilemediği için tepe geçtikten sonra da
elde kalır ve **764 birim-gün** atıl kapasite üretir; kiralamada aynı sayı **254 birim-gün**dür,
çünkü kapasite iner. Tepe kapasiteleri neredeyse aynıdır (20'ye karşı 19); fark kapasitenin
büyüklüğünde değil, **ne kadar süre elde tutulduğundadır**.

Büyüyen eğri bu iki maliyetin nasıl yer değiştirdiğini gösterir. Orada kendi donanımının atıl
kapasitesi en düşüktür (123 birim-gün) — çünkü sürekli geride kalır. Aynı geride kalış 32.784
karşılanamayan istek yazar. **Atıl kapasitenin düşük olması iyi haber değildir; yetersiz
kapasitenin başka adıdır.** İki maliyet tek tek okunduğunda ikisi de yanıltır, ancak birlikte
okunduğunda karar taşır.

#### Kiralamanın Kaybettirdiği Durum

Üçüncü tablo esnekliğin getirisini tek orana bağlar: kurtarılan istek başına kiralanan birim-gün.
Tepe yapan eğride kiralama 83.429 istek kurtarır ve bunu 892 birim-günlük kiralamayla yapar —
birim-gün başına 93,5 istek. Büyüyen eğride oran 27,9'a iner. **Düz eğride oran 0,0'dır.**

Sabit ve öngörülebilir yükte kiralamanın esneklikten kazandığı hiçbir şey yoktur: iki biçim de
sıfır istek kaybeder. Tablodaki tek fark atıl kapasitededir (459'a karşı 204 birim-gün) ve o fark
esneklikten değil, **en küçük alım parçasından** doğar — dört birimlik blok, 4,2 birimlik ihtiyacın
üstüne sekiz birim koyar. Parça küçüldüğünde fark kapanır; talep düz kaldığı sürece kiralamanın
ölçülen getirisi sıfırdır ve elde yalnız devredilmiş kararlar kalır. Bu, bulutun "pahalı" olduğu
anlamına gelmez; **ölçülen getirisi sıfır olan bir şeyin bedelinin sıfır olmadığı** anlamına gelir.

#### Süreyi Kısaltmak Yetiyor mu

Dördüncü tablo yalnız tedarik süresini kısaltır ve geri kalan her şeyi kendi donanımının
kuralında bırakır: dört birimlik blok, geri verme yok. Karşılanamayan istek 30 günde 84.689,
14 günde 81.223, 7 günde 38.341, 3 günde 7.647 ve 1 günde sıfırdır. Süreyi yarıya indirmek
kaybı yarıya indirmez — 30'dan 14 güne inen ilk adım kaybın yalnız %4'ünü siler, çünkü tepe
yirmi gün sürer ve on dört günlük gecikme hâlâ tepenin içine düşer. **Bekleme, tepenin
genişliğiyle karşılaştırıldığında anlam kazanır.**

Aynı sütunun yanındaki atıl kapasite ters yöne gider: 764'ten 1.037 birim-güne çıkar. Kapasite
daha erken geldiği için elde daha uzun durur ve geri verilemediği için orada kalır. Tedarik
süresini bire indirmek karşılanamayan isteği sıfırlar, ama atıl kapasiteyi kiralamanın 254
birim-günü yerine 1.037 birim-güne çıkarır. **Esneklik iki ayrı karardır: ne kadar çabuk
alınabildiği ve geri verilebilip verilemediği.** İkincisi olmadan birincisi maliyeti yalnız yer
değiştirir.

#### Çıkışta Ne Elde Kalır

Beşinci tablo kiralamanın sessiz kalemini sayar. Sekiz kalemin kendi donanımında sekizi de elde
kalır. Kiralamada dördü taşınır (veri, yapılandırma, kurulum yordamı, işletim bilgisi), ikisi
hizmete gömülüdür (ölçekleme kararı ve ölçülen başarım geçmişi hizmetin içinde durur), iki kalem
ise **hiç yoktur**: donanım ve yerleşim sözleşmesi.

Son iki satır kiralamanın hem kazancı hem bedelidir. Donanımın olmaması, otuz günlük beklemenin
ortadan kalkmasının nedenidir; aynı yokluk, çıkarken taşınacak bir varlığın da olmaması demektir.
Devredilen karar sayısı burada üçtür — ne zaman kapasite alınacağı, ne kadar alınacağı ve donanımın
nerede duracağı — ve bunların karşılığında alınan şey tek sayıdır: 30 günün 1 güne inmesi. Bu
üçlü, kursun geri kalanında tekrarlanacak hesabın en küçük biçimidir: bir kalem kiralanır, birkaç
karar elden çıkar, karşılığında bir sayı düzelir ve çıkışta taşınacak kalem azalır. Sayılan şey
hiçbir yerde "bulut" değildir; sayılan şey **hangi kararın kimde durduğudur**.

#### Özet

- Esneklik bir süredir: kapasite isteğinden kullanıma 30,0 güne karşı 1,0 gün. Aynı tepe yapan
  eğride bu fark açık günü 15'ten 2'ye, karşılanamayan isteği 84.689'dan 1.260'a indirir.
- İki maliyet birlikte sayılır: kendi donanımı 764, kiralama 254 birim-gün atıl kapasite üretir;
  tepe kapasiteleri ise neredeyse aynıdır (20'ye karşı 19).
- Büyüyen eğride kendi donanımının atıl kapasitesi en düşüktür (123 birim-gün) ve tam bu yüzden
  32.784 istek karşılanamaz; düşük atıl kapasite yetersiz kapasitenin başka adıdır.
- Esnekliğin getirisi orandır: birim-gün başına 93,5 (tepe), 27,9 (büyüyen), **0,0 (düz)**. Sabit
  yükte kalan tek fark en küçük alım parçasından gelir, esneklikten değil.
- Yalnız tedarik süresi kısaltılınca kayıp 84.689'dan sıfıra iner ama atıl kapasite 764'ten 1.037
  birim-güne çıkar; geri verilebilirlik olmadan hız maliyeti yalnız yer değiştirir.
- Çıkışta sekiz kalemin kendi donanımında sekizi, kiralamada dördü elde kalır; ikisi hizmete
  gömülüdür, ikisi hiç yoktur — ve o yokluk beklemenin de kalkmasının nedenidir.

#### Sonraki Adım

Bu ders tek bir şeyi kiraladı: kapasite. Üç karar devredildi, karşılığında yirmi dokuz gün alındı.
Oysa kiralanan şeyin ne kadarının devredildiği sabit değildir; yalnız makineyi kiralamakla makineyi
de üstündeki çalışma zamanını da kiralamak arasında büyük bir fark vardır. Sonraki ders aynı
karar kümesini kalem kalem açar ve üç hizmet modelinde **kaç kararın devredildiğini, kaçının elde
kaldığını** ve devredilen kararların hangisinin **geri alınabildiğini** sayar.

### Hizmet Modelleri

Source: https://academia.sh/tr/kurslar/bulut-temelleri/hizmet-modelleri

Altyapı, platform ve yazılım hizmetinin ölçüsü: 26 kararlık bir kümede devredilen kararın 5'ten 23'e ve 25'e çıkması, elde kalan yıllık karar dokunuşunun 91'den 82, 19 ve 4'e inmesi, devredilenlerin parametreyle geri alınabilen oranının %40'tan %39 ve %12'ye düşmesi, altı gereksinim isteğinin 6, 5, 4 ve 1'inin karşılanabilmesi, çıkışta taşınan karar oranının %100'den %92, %69 ve %35'e inmesi.

Önceki ders tek bir şeyi kiraladı — kapasiteyi — ve üç karar devretti. Ama kiralamanın derinliği
sabit değildir. Yalnız makineyi kiralamakla makineyi, üstündeki çalışma zamanını ve onun ölçekleme
davranışını birlikte kiralamak aynı şey değildir; ikisi arasında **kaç kararın elden çıktığı**
farkı vardır. Bu ders o farkı kalem kalem sayar.

Kiralamanın derinliği üç **hizmet modeli** olarak adlandırılır. **Altyapı hizmeti** makineyi,
depoyu ve ağı kiralar; üstündeki her şey müşteride kalır. **Platform hizmeti** çalışma zamanını da
kiralar; müşteri kodunu ve yapılandırmasını verir. **Yazılım hizmeti** işin kendisini kiralar;
müşteri yalnız veri ve erişim kararlarını verir. Bu üç tanım karar taşımaz — taşıyan şey, aynı
karar kümesinin üç modelde nasıl bölündüğüdür.

#### Karar Kümesi

Örnek, kursun kurgu **bölgesel ölçüm ağı**dır: su sayacı okuma toplayıcı, doğrulayıcı, faturalama
ve iş emri servisleri, gecelik toplu iş ve beş ekip. Ağ da servisler de kurgudur; aşağıdaki karar
kümesi ve hizmet modelleri bir **modeldir**, gerçek bir hizmet kataloğu ya da ayar listesi yoktur.

**BK7:** okuma toplayıcı servisini ayakta tutmak için verilmesi gereken kararlar on alanda 26
kaleme ayrılır. **BK8:** bir karar bir modelde ya elde kalır (`E`) ya devredilir; devredilen
kararın geri alınabilirliği üç sınıftır — parametreyle geri alınır (`P`), sözleşme penceresi
bekler (`S`), hizmete gömülüdür (`G`). **BK9:** her kararın yılda kaç kez dokunulduğu sabittir.
**BK10:** bir gereksinim isteği `E` ise aynı gün, `P` ise 1 günde, `S` ise 30 günde karşılanır;
`G` ise hiç karşılanamaz. Bu süreler kurgudur. **BK11:** elde kalan her karar dokunuşu bir işletim
kalemi üretir. **BK12:** çıkışta devredilmiş her karar yeniden verilir; `G` sınıfı olanlar ayrıca
yerine yeni bir çözüm ister.

```js
// bulut/karar.mjs — kurgu olcum agi icin karar kumesi ve uc hizmet modeli (model): gercek bir
// hizmet katalogu, gercek bir ayar listesi ya da gercek bir sozlesme yok. Rastgelelik yok.

export const MODEL = ["kendi", "altyapi", "platform", "yazilim"];
// hucre: E elde kalir, P parametreyle geri alinir, S sozlesme penceresi bekler, G hizmete gomulu
export const PENCERE = { E: 0, P: 1, S: 30 };   // istegin karsilanma suresi (kurgu gun)

export const KARAR = `
  donanim         makine-modeli        E P G G  2
  donanim         disk-turu            E P G G  2
  donanim         ariza-degistirme     E G G G  3
  yerlesim        fiziksel-yerlesim    E S S G  1
  yerlesim        guc-ve-sogutma       E G G G  1
  isletim-sistemi dagitim-secimi       E E G G  1
  isletim-sistemi surum                E E G G  2
  yama            guvenlik-yamasi      E E G G 12
  yama            yeniden-baslatma     E E S G  6
  calisma-zamani  dil-surumu           E E P G  3
  calisma-zamani  kutuphane-surumu     E E E G  9
  calisma-zamani  derleme-secenegi     E E S G  2
  olcekleme       esik                 E E P G  4
  olcekleme       en-az-en-cok         E E P S  4
  olcekleme       bicim                E E G G  1
  yedekleme       siklik               E E P S  2
  yedekleme       saklama-suresi       E E P S  2
  yedekleme       geri-yukleme-provasi E E S G  2
  izleme          olcut-kumesi         E E P S  6
  izleme          uyari-esigi          E E E P  6
  ag              adres-plani          E E S G  1
  ag              guvenlik-kurali      E E P S  9
  ag              disari-cikis-yolu    E E S G  2
  kimlik          kullanici-dizini     E E P P  1
  kimlik          yetki-modeli         E E E E  4
  kimlik          oturum-suresi        E E P P  3`
  .trim().split("\n").map((r) => {
    const [alan, karar, ...k] = r.trim().split(/\s+/);
    return { alan, karar, dokunma: +k[4],
      d: Object.fromEntries(MODEL.map((m, i) => [m, k[i]])) };
  });

export const ALAN = [...new Set(KARAR.map((k) => k.alan))];
export const say = (m, ...h) => KARAR.filter((k) => h.includes(k.d[m])).length;
export const dokunus = (m) => KARAR.filter((k) => k.d[m] === "E")
  .reduce((a, k) => a + k.dokunma, 0);

// Alti gereksinim istegi: her biri tek bir karara dokunur.
export const ISTEK = [
  ["calisma zamani surumu yukseltilsin", "dil-surumu"],
  ["olcekleme esigi dusurulsun", "esik"],
  ["yedek saklama suresi uzatilsin", "saklama-suresi"],
  ["disari cikis yolu degistirilsin", "disari-cikis-yolu"],
  ["isletim sistemi surumu sabitlensin", "surum"],
  ["ariza degistirme suresi kisaltilsin", "ariza-degistirme"],
].map(([ad, karar]) => ({ ad, karar, hucre: KARAR.find((k) => k.karar === karar).d }));
```

```js
// bulut/olc.mjs — uc hizmet modelinde kac karar devrediliyor, kaci geri alinabiliyor.
import { KARAR, MODEL, ALAN, ISTEK, PENCERE, say, dokunus } from "./karar.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const AD = { kendi: "kendi don.", altyapi: "altyapi", platform: "platform", yazilim: "yazilim" };

console.log(`karar kumesi: ${KARAR.length} karar, ${ALAN.length} alan; ` +
  `yilda toplam ${KARAR.reduce((a, k) => a + k.dokunma, 0)} karar dokunusu`);

const A = [-18, 12, 10, 11, 10];
console.log("\n1. alan basina elde kalan karar (alandaki karar sayisi / elde kalan)");
yaz(A, "alan", ...MODEL.map((m) => AD[m]));
for (const a of ALAN) {
  const g = KARAR.filter((k) => k.alan === a);
  yaz(A, a, ...MODEL.map((m) => `${g.length} / ${g.filter((k) => k.d[m] === "E").length}`));
}

const B = [-30, 12, 10, 11, 10];
console.log("\n2. devredilen karar ve geri alinabilirligi");
yaz(B, "olcu", ...MODEL.map((m) => AD[m]));
for (const [ad, f] of [
  ["elde kalan karar", (m) => say(m, "E")],
  ["devredilen karar", (m) => say(m, "P", "S", "G")],
  ["  parametreyle geri alinir", (m) => say(m, "P")],
  ["  sozlesme penceresi bekler", (m) => say(m, "S")],
  ["  hizmete gomulu", (m) => say(m, "G")],
  ["geri alinabilen / devredilen", (m) => `${say(m, "P")}/${say(m, "P", "S", "G")}`],
  ["elde kalan yillik dokunus", (m) => dokunus(m)],
  ["devir basina kalkan dokunus", (m) =>
    (say(m, "P", "S", "G") ? (dokunus("kendi") - dokunus(m)) / say(m, "P", "S", "G") : 0)
      .toFixed(1)]])
  yaz(B, ad, ...MODEL.map(f));

const C = [-36, 12, 10, 11, 10];
console.log("\n3. alti gereksinim istegi karsilanabiliyor mu (kurgu gun; - = karsilanamaz)");
yaz(C, "istek", ...MODEL.map((m) => AD[m]));
const sure = (h) => (h === "G" ? "-" : PENCERE[h]);
for (const i of ISTEK) yaz(C, i.ad, ...MODEL.map((m) => sure(i.hucre[m])));
yaz(C, "karsilanan istek (6 uzerinden)",
  ...MODEL.map((m) => ISTEK.filter((i) => i.hucre[m] !== "G").length));
yaz(C, "karsilananlarin toplam beklemesi",
  ...MODEL.map((m) => ISTEK.filter((i) => i.hucre[m] !== "G")
    .reduce((a, i) => a + PENCERE[i.hucre[m]], 0)));

const D = [-34, 12, 10, 11, 10];
console.log("\n4. cikista ne yeniden verilir");
yaz(D, "olcu", ...MODEL.map((m) => AD[m]));
for (const [ad, f] of [
  ["yeniden verilecek karar", (m) => say(m, "P", "S", "G")],
  ["  yerine yeni cozum ister (gomulu)", (m) => say(m, "G")],
  ["  ayni ayarla tasinir", (m) => say(m, "P", "S")],
  ["tasinan karar orani (%)", (m) => Math.round((say(m, "E", "P", "S") / KARAR.length) * 100)]])
  yaz(D, ad, ...MODEL.map(f));
```

```
karar kumesi: 26 karar, 10 alan; yilda toplam 91 karar dokunusu

1. alan basina elde kalan karar (alandaki karar sayisi / elde kalan)
alan                kendi don.   altyapi   platform   yazilim
donanim                  3 / 3     3 / 0      3 / 0     3 / 0
yerlesim                 2 / 2     2 / 0      2 / 0     2 / 0
isletim-sistemi          2 / 2     2 / 2      2 / 0     2 / 0
yama                     2 / 2     2 / 2      2 / 0     2 / 0
calisma-zamani           3 / 3     3 / 3      3 / 1     3 / 0
olcekleme                3 / 3     3 / 3      3 / 0     3 / 0
yedekleme                3 / 3     3 / 3      3 / 0     3 / 0
izleme                   2 / 2     2 / 2      2 / 1     2 / 0
ag                       3 / 3     3 / 3      3 / 0     3 / 0
kimlik                   3 / 3     3 / 3      3 / 1     3 / 1

2. devredilen karar ve geri alinabilirligi
olcu                            kendi don.   altyapi   platform   yazilim
elde kalan karar                        26        21          3         1
devredilen karar                         0         5         23        25
  parametreyle geri alinir               0         2          9         3
  sozlesme penceresi bekler              0         1          6         5
  hizmete gomulu                         0         2          8        17
geri alinabilen / devredilen           0/0       2/5       9/23      3/25
elde kalan yillik dokunus               91        82         19         4
devir basina kalkan dokunus            0.0       1.8        3.1       3.5

3. alti gereksinim istegi karsilanabiliyor mu (kurgu gun; - = karsilanamaz)
istek                                 kendi don.   altyapi   platform   yazilim
calisma zamani surumu yukseltilsin             0         0          1         -
olcekleme esigi dusurulsun                     0         0          1         -
yedek saklama suresi uzatilsin                 0         0          1        30
disari cikis yolu degistirilsin                0         0         30         -
isletim sistemi surumu sabitlensin             0         0          -         -
ariza degistirme suresi kisaltilsin            0         -          -         -
karsilanan istek (6 uzerinden)                 6         5          4         1
karsilananlarin toplam beklemesi               0         0         33        30

4. cikista ne yeniden verilir
olcu                                kendi don.   altyapi   platform   yazilim
yeniden verilecek karar                      0         5         23        25
  yerine yeni cozum ister (gomulu)           0         2          8        17
  ayni ayarla tasinir                        0         3         15         8
tasinan karar orani (%)                    100        92         69        35
```

Sayılar **ölçüm** sınıfındadır; girdileri BK7–BK12'dir.

#### Devir Doğrusal Değildir

Birinci tablo devri alan alan gösterir. Altyapı hizmeti yalnız iki alanı — donanım ve yerleşim —
tümüyle alır; kalan sekiz alanın 21 kararı elde kalır. Platform hizmeti sekiz alanı daha alır ve
geriye üç kalem bırakır: kütüphane sürümü, uyarı eşiği, yetki modeli. Yazılım hizmetinde tek bir
karar kalır — yetki modeli.

İkinci tablonun ilk iki satırı bunu tek sayıya indirir: devredilen karar **0 → 5 → 23 → 25**.
Sıçrama altyapı ile platform arasındadır; oradaki tek adım on sekiz karar devreder. Buna karşılık
platformdan yazılıma geçiş yalnız iki karar daha devreder. **Hizmet modelleri eşit aralıklı bir
merdiven değildir**; en büyük devir ortadaki adımdadır ve o adım genellikle en kolay atılan adım
gibi anlatılır.

#### Devredilen Karar Geri Alınabiliyor mu

Devredilen kararın sayısı tek başına bir şey söylemez; devredilenin **geri alınabilirliği** ayrı
bir kalemdir. Altyapıda beş devirden ikisi parametreyle geri alınır, biri sözleşme penceresi
bekler, ikisi gömülüdür. Platformda 23 devirden dokuzu parametre, altısı pencere, sekizi gömülü.
Yazılımda 25 devirden yalnız üçü parametreyle geri alınır ve **on yedisi gömülüdür**.

Parametre oranı sırasıyla 2/5, 9/23 ve 3/25'tir — yaklaşık %40, %39 ve %12. İlk iki adımda oran
neredeyse sabittir: platform çok karar devreder ama devrettiğinin benzer bir kesrini ayar olarak
geri verir. Üçüncü adımda oran üçte bire düşer. **Yazılım hizmetinde devredilen kararların çoğu
geri alınmak üzere tasarlanmamıştır**; hizmetin sunduğu şey zaten o kararın verilmiş olmasıdır.

Karşılığında alınan şey son iki satırdadır. Elde kalan yıllık karar dokunuşu 91'den 82, 19 ve 4'e
iner. Altyapı hizmeti dokunuşun yalnız %10'unu kaldırır — beş karar devretmenin karşılığı bu
kadardır. Platform %79'unu kaldırır. Devir başına kalkan dokunuş 1,8, 3,1 ve 3,5'tir; bu ölçüde
en verimsiz adım altyapıdır.

Farkın nedeni karar kümesinin içinde görünür. Yılda 12 dokunuşla en ağır kalem güvenlik yamasıdır
ve altyapı hizmetinde elde kalır; kütüphane sürümü 9, ağ güvenlik kuralı 9, uyarı eşiği 6 ve
yeniden başlatma 6 dokunuş yazar. Altyapının devrettiği beş kararın yıllık dokunuşu ise toplam
dokuzdur. **Devredilen kararın ağırlığı sayısıyla değil, yılda kaç kez dokunulduğuyla ölçülür**;
beş karar devretmek dokuz dokunuş, on sekiz karar devretmek altmış üç dokunuş kaldırır.

#### Bir Gereksinim Geldiğinde

Üçüncü tablo aynı altı isteği dört düzende koşturur. Kendi donanımında altısı da aynı gün
karşılanır. Altyapıda beşi karşılanır; arıza değiştirme süresi artık müşterinin kararı değildir.
Platformda dördü karşılanır ve toplam bekleme 33 güne çıkar — üçü birer gün, biri otuz gün. Yazılım
hizmetinde **altı istekten yalnız biri** karşılanır ve o da otuz gün bekler.

Bu tablo ikinci tablonun tersini söyler. Yazılım hizmeti devir başına en çok dokunuşu kaldıran
modeldir (3,5), ama aynı model altı gereksinimin beşini karşılayamaz. **İşletim yükünün kalkması,
gereksinimi karşılayamamakla ödenir**; iki sayı ayrı ayrı okunursa aynı model hem en iyi hem en
kötü görünür.

Platform hizmetindeki 33 günlük bekleme de ayrı bir kalemdir. Karar teknik olarak geri alınabilir,
ama geri alma süresi artık müşterinin değil sözleşmenin hızındadır. Kendi donanımında sıfır olan
bir sayı, devirle birlikte otuz güne çıkmıştır.

Karar kümesinin en çok dokunulan kalemleri seçim yaparken ayrı bir ağırlık taşır. Bir ekip yılda
altı kez uyarı eşiğine dokunuyorsa, o kalemin `E` mi `P` mi `G` mi olduğu tablodaki diğer yirmi beş
karardan daha çok belirleyicidir. **Hizmet modeli seçimi bütün karar kümesi üzerinden değil, o
kümenin en sık dokunulan onda biri üzerinden verilir**; geri kalanı yılda bir kez fark edilir.

#### Çıkışta Ne Yeniden Verilir

Dördüncü tablo çıkışı sayar. Çıkışta yeniden verilecek karar sayısı devredilen karar sayısıdır:
0, 5, 23, 25. Bunların içinden aynı ayarla taşınabilenler 3, 15 ve 8'dir; **yerine yeni bir çözüm
isteyenler** 2, 8 ve 17'dir. Taşınan karar oranı %100'den %92, %69 ve %35'e iner.

Platform ile yazılım arasındaki fark burada en açıktır. Devredilen karar sayısı 23'ten 25'e yalnız
iki artar, ama gömülü karar 8'den 17'ye çıkar ve taşınan oran %69'dan %35'e iner. **Çıkış
maliyetini devredilen kararın sayısı değil, devredilenin geri alınabilirliği belirler.**

#### Özet

- 26 kararlık kümede devredilen karar 0 → 5 → 23 → 25'tir; en büyük sıçrama altyapı ile platform
  arasındadır (on sekiz karar) ve hizmet modelleri eşit aralıklı bir merdiven değildir.
- Devredilenin parametreyle geri alınabilen oranı 2/5, 9/23 ve 3/25'tir; ilk iki adımda oran
  korunur, yazılım hizmetinde üçte bire iner ve 25 devrin 17'si gömülüdür.
- Karşılığında alınan işletim yükü düşüşüdür: yıllık karar dokunuşu 91 → 82 → 19 → 4; devir başına
  kalkan dokunuş 1,8, 3,1 ve 3,5'tir.
- Altı gereksinim isteğinin karşılanan sayısı 6, 5, 4 ve 1'dir; platformda toplam bekleme 33 gün,
  yazılımda 30 gündür. Devir başına en verimli görünen model isteklerin beşini karşılayamaz.
- Çıkışta taşınan karar oranı %100 → %92 → %69 → %35; platformdan yazılıma iki karar daha
  devredilirken gömülü karar 8'den 17'ye çıkar — çıkış maliyetini sayı değil geri alınabilirlik
  belirler.

#### Sonraki Adım

Bu ders **ne kadarının** kiralandığını saydı ve devredilen kararı geri alınabilirliğine göre üçe
ayırdı. Ama bütün sayılar tek bir sessiz varsayım altında çıktı: kiralanan hizmet herkese açık bir
havuzdan alınıyor. Oysa aynı hizmet türü yalnız tek bir kuruma ayrılmış bir düzende de
kurulabilir, ya da iş yükünün bir kısmı biri diğeri ötekinde koşabilir. Sonraki ders aynı iş yükünü
üç dağıtım düzeninde koşturur ve **denetim altında kalan kalemi, sabit maliyeti, esneklik
penceresini** ve verinin nerede durabileceği kısıtını kalem kalem karşılaştırır.

### Dağıtım Modelleri

Source: https://academia.sh/tr/kurslar/bulut-temelleri/dagitim-modelleri

Genel, özel ve karma dağıtımın ölçüsü: altı bileşenlik aynı iş yükünde genel düzenin iki bileşeni yerleştirememesi ve yedi çağrı bağından altısının kurulamaması, denetimde kalan kalemin 8/24, 36/36, 20/36 ve 28/36 olması, sabit ayrılmış kapasitenin %0, %100, %45 ve %75, esneklik penceresinin 1,0, 21,0, 10,0 ve 16,0 gün olması, karmanın her iki biçiminde de 18 işletim kalemi, iki kimlik dizini ve altı eşleme kalemi ödemesi.

Önceki ders kiralamanın **derinliğini** ölçtü: aynı karar kümesinin üç hizmet modelinde nasıl
bölündüğünü. Bütün sayılar tek bir sessiz varsayım altında çıktı — kiralanan hizmet herkese açık
bir havuzdan alınıyor. Oysa aynı hizmet türü yalnız tek bir kuruma ayrılmış bir düzende de
kurulabilir, ya da iş yükünün bir kısmı birinde, kalanı ötekinde koşabilir.

Bu üç seçeneğin adı **genel bulut**, **özel bulut** ve **karma bulut**tur. Genel bulutta kaynak
paylaşımlı bir havuzdan gelir; özel bulutta havuz tek bir kuruma ayrılmıştır; karma bulutta iş
yükü ikiye bölünür. Bu ders aynı iş yükünü üçünde de kurar ve dört kalemi birlikte sayar:
**denetim altında kalan kalem**, **sabit ayrılmış kapasite**, **esneklik penceresi** ve verinin
nerede durabileceği kısıtı.

#### İş Yükü ve Yerleşim Sınıfı

Örnek, kursun kurgu **bölgesel ölçüm ağı**dır: okuma toplayıcı, doğrulayıcı, faturalama, iş emri,
gecelik toplu iş ve abone portalı. Ağ da bileşenler de kurgudur; aşağıdaki yerleşim bir
**modeldir**, gerçek bir veri merkezi ya da sözleşme yoktur. Verinin nerede durabileceği burada
**tür** olarak ele alınır; hiçbir düzenlemenin adı geçmez.

**BK13:** iş yükü altı bileşen ve yedi çağrı bağıdır; her bileşenin bir kapasite payı ve bir veri
yerleşim sınıfı vardır. **BK14:** üç yerleşim sınıfı vardır — sınırsız, belirli sınır içinde,
yalnız kurum tesisinde. **BK15:** genel düzen ilk iki sınıfı karşılar, özel düzen üçünü de; karma
düzen bileşeni bileşen bölerek karşılar. **BK16:** denetim kalemleri altıdır; genel tarafta
bunlardan ikisi müşteride kalır, kurum tesisinde altısı da. **BK17:** esneklik penceresi genel
tarafta 1, kurum tesisinde 21 kurgu gündür; sabit ayrılmış kapasite, kurum tesisine düşen
bileşenlerin kapasite payıdır. **BK18:** işletim kalemi kümesi dokuzdur ve her kurulu düzen için
ayrı yürütülür; birden çok düzen varsa her bileşen için bir kimlik eşlemesi kalemi eklenir.

```js
// bulut/dagitim.mjs — kurgu olcum aginin uc dagitim duzeninde yerlesimi (model): gercek bir
// veri merkezi, gercek bir duzenleme ya da gercek bir sozlesme yok. Rastgelelik yok.

// yerlesim sinifi: sinirsiz < belirli-sinir < kurum-tesisi (en kisitli)
export const BILESEN = `
  toplayici      30  kurum-tesisi
  dogrulayici    20  belirli-sinir
  faturalama     15  kurum-tesisi
  is-emri        10  belirli-sinir
  gecelik-toplu  15  sinirsiz
  portal         10  belirli-sinir`
  .trim().split("\n").map((r) => {
    const [ad, pay, sinif] = r.trim().split(/\s+/);
    return { ad, pay: +pay, sinif };
  });

export const BAG = `
  toplayici dogrulayici / dogrulayici faturalama / dogrulayici gecelik-toplu /
  faturalama is-emri / portal faturalama / portal toplayici / is-emri toplayici`
  .trim().split("/").map((r) => r.trim().split(/\s+/));

// Dort kullanici akisi: her akis art arda cagri baglarindan gecer.
export const AKIS = `
  okuma-akisi        toplayici dogrulayici faturalama
  gecelik-akis       toplayici dogrulayici gecelik-toplu
  abone-sorgusu      portal faturalama is-emri
  saha-akisi         is-emri toplayici`
  .trim().split("\n").map((r) => {
    const [ad, ...yol] = r.trim().split(/\s+/);
    return { ad, yol };
  });

// Alti denetim kalemi; genel tarafta yalniz ikisi musteride kalir, kurum tesisinde altisi da.
export const DENETIM = ["fiziksel-erisim", "donanim-omru", "komsuluk", "yama-takvimi",
  "gunluk-kaydina-erisim", "anahtar-saklama-yeri"];
export const GENEL_DENETIM = ["gunluk-kaydina-erisim", "anahtar-saklama-yeri"];
export const ISLETIM = ["yama-akisi", "izleme", "yedekleme", "kimlik", "ag-kurali",
  "kapasite-plani", "gunluk-toplama", "surum-dagitimi", "olay-yordami"];
export const PENCERE = { genel: 1, ozel: 21 };   // esneklik penceresi (kurgu gun)

// Duzen: her bilesen "genel" ya da "ozel" tarafa dusuyor; null = yerlestirilemiyor.
export const DUZEN = {
  genel: (b) => (b.sinif === "kurum-tesisi" ? null : "genel"),
  ozel: () => "ozel",
  "karma-dar": (b) => (b.sinif === "kurum-tesisi" ? "ozel" : "genel"),
  "karma-genis": (b) => (b.sinif === "sinirsiz" || b.ad === "is-emri" ? "genel" : "ozel"),
};

export function kos(duzenAd) {
  const yer = Object.fromEntries(BILESEN.map((b) => [b.ad, DUZEN[duzenAd](b)]));
  const kurulu = BILESEN.filter((b) => yer[b.ad]);
  const taraf = [...new Set(kurulu.map((b) => yer[b.ad]))];
  const payToplam = kurulu.reduce((a, b) => a + b.pay, 0);
  const sabit = kurulu.filter((b) => yer[b.ad] === "ozel").reduce((a, b) => a + b.pay, 0);
  const denetim = kurulu.reduce((a, b) =>
    a + (yer[b.ad] === "ozel" ? DENETIM.length : GENEL_DENETIM.length), 0);
  const pencere = kurulu.reduce((a, b) => a + b.pay * PENCERE[yer[b.ad]], 0) / payToplam;
  const sinir = BAG.filter(([a, b]) => yer[a] && yer[b] && yer[a] !== yer[b]).length;
  const kopuk = BAG.filter(([a, b]) => !yer[a] || !yer[b]).length;
  const akis = AKIS.map((a) => {
    if (a.yol.some((x) => !yer[x])) return { ad: a.ad, gecis: null };
    let g = 0;
    for (let i = 1; i < a.yol.length; i++) if (yer[a.yol[i - 1]] !== yer[a.yol[i]]) g++;
    return { ad: a.ad, gecis: g };
  });
  return { duzen: duzenAd, akis, taraf: taraf.length, sinir, kopuk, dizin: taraf.length,
    yerlesmeyen: BILESEN.length - kurulu.length, sabit: Math.round((sabit / payToplam) * 100),
    denetim, hucre: kurulu.length * DENETIM.length,
    pencere: pencere.toFixed(1), isletim: ISLETIM.length * taraf.length,
    eslesme: taraf.length > 1 ? kurulu.length : 0 };
}
```

```js
// bulut/olc.mjs — ayni is yuku uc dagitim duzeninde: denetim, sabitlik, esneklik, sinir bedeli.
import { kos, BILESEN, BAG, AKIS, DUZEN, DENETIM, ISLETIM, PENCERE } from "./dagitim.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const D = Object.keys(DUZEN), R = Object.fromEntries(D.map((d) => [d, kos(d)]));

console.log(`is yuku: ${BILESEN.length} bilesen, ${BAG.length} cagri bagi, ` +
  `${DENETIM.length} denetim kalemi, ${ISLETIM.length} isletim kalemi; ` +
  `esneklik penceresi genel ${PENCERE.genel} / ozel ${PENCERE.ozel} gun`);

const A = [-16, 6, 12, 10, 12, 13];
console.log("\n1. hangi bilesen nereye dusuyor (veri yerlesim sinifina gore)");
yaz(A, "bilesen", "pay", ...D);
for (const b of BILESEN) yaz(A, b.ad, b.pay, ...D.map((d) => DUZEN[d](b) ?? "yerlesmez"));

const B = [-36, 10, 12, 13, 13];
console.log("\n2. ayni is yuku kalem kalem");
yaz(B, "olcu", ...D);
for (const [ad, f] of [
  ["yerlesemeyen bilesen", (r) => r.yerlesmeyen],
  ["denetimde kalan kalem (bilesen x 6)", (r) => `${r.denetim}/${r.hucre}`],
  ["sabit ayrilmis kapasite (%)", (r) => r.sabit],
  ["esneklik penceresi (gun, agirlikli)", (r) => r.pencere],
  ["kurulan duzen sayisi", (r) => r.taraf]])
  yaz(B, ad, ...D.map((d) => f(R[d])));

const C = [-36, 10, 12, 13, 13];
console.log("\n3. karmanin gizli bedeli");
yaz(C, "olcu", ...D);
for (const [ad, f] of [
  [`sinir gecen cagri bagi (${BAG.length} uzerinden)`, (r) => r.sinir],
  ["kurulamayan bag (bilesen yerlesmedi)", (r) => r.kopuk],
  ["yurutulen isletim kalemi", (r) => r.isletim],
  ["kimlik dizini", (r) => r.dizin],
  ["kimlik eslesmesi kalemi", (r) => r.eslesme]])
  yaz(C, ad, ...D.map((d) => f(R[d])));

const F = [-36, 10, 12, 13, 13];
console.log("\n4. dort kullanici akisi kac kez sinir geciyor (- = akis kurulamiyor)");
yaz(F, "akis", ...D);
AKIS.forEach((a, i) => yaz(F, `${a.ad} (${a.yol.length} durak)`,
  ...D.map((d) => R[d].akis[i].gecis ?? "-")));
yaz(F, "kurulabilen akis", ...D.map((d) => R[d].akis.filter((a) => a.gecis !== null).length));
yaz(F, "toplam sinir gecisi", ...D.map((d) =>
  R[d].akis.reduce((a, x) => a + (x.gecis ?? 0), 0)));

const E = [-36, 10, 12, 13, 13];
console.log("\n5. cikista ne yeniden kurulur");
yaz(E, "olcu", ...D);
for (const [ad, f] of [
  ["sokulecek duzen", (r) => r.taraf],
  ["yeniden kurulacak sinir bagi", (r) => r.sinir],
  ["tasinamayan denetim kalemi", (r) => r.hucre - r.denetim],
  ["denetimde kalan oran (%)", (r) => Math.round((r.denetim / r.hucre) * 100)]])
  yaz(E, ad, ...D.map((d) => f(R[d])));
```

```
is yuku: 6 bilesen, 7 cagri bagi, 6 denetim kalemi, 9 isletim kalemi; esneklik penceresi genel 1 / ozel 21 gun

1. hangi bilesen nereye dusuyor (veri yerlesim sinifina gore)
bilesen            pay       genel      ozel   karma-dar  karma-genis
toplayici           30   yerlesmez      ozel        ozel         ozel
dogrulayici         20       genel      ozel       genel         ozel
faturalama          15   yerlesmez      ozel        ozel         ozel
is-emri             10       genel      ozel       genel        genel
gecelik-toplu       15       genel      ozel       genel        genel
portal              10       genel      ozel       genel         ozel

2. ayni is yuku kalem kalem
olcu                                     genel        ozel    karma-dar  karma-genis
yerlesemeyen bilesen                         2           0            0            0
denetimde kalan kalem (bilesen x 6)       8/24       36/36        20/36        28/36
sabit ayrilmis kapasite (%)                  0         100           45           75
esneklik penceresi (gun, agirlikli)        1.0        21.0         10.0         16.0
kurulan duzen sayisi                         1           1            2            2

3. karmanin gizli bedeli
olcu                                     genel        ozel    karma-dar  karma-genis
sinir gecen cagri bagi (7 uzerinden)         0           0            6            3
kurulamayan bag (bilesen yerlesmedi)         6           0            0            0
yurutulen isletim kalemi                     9           9           18           18
kimlik dizini                                1           1            2            2
kimlik eslesmesi kalemi                      0           0            6            6

4. dort kullanici akisi kac kez sinir geciyor (- = akis kurulamiyor)
akis                                     genel        ozel    karma-dar  karma-genis
okuma-akisi (3 durak)                        -           0            2            0
gecelik-akis (3 durak)                       -           0            1            1
abone-sorgusu (3 durak)                      -           0            2            1
saha-akisi (2 durak)                         -           0            1            1
kurulabilen akis                             0           4            4            4
toplam sinir gecisi                          0           0            6            3

5. cikista ne yeniden kurulur
olcu                                     genel        ozel    karma-dar  karma-genis
sokulecek duzen                              1           1            2            2
yeniden kurulacak sinir bagi                 0           0            6            3
tasinamayan denetim kalemi                  16           0           16            8
denetimde kalan oran (%)                    33         100           56           78
```

Sayılar **ölçüm** sınıfındadır; girdileri BK13–BK18'dir.

#### Yerleşim Kısıtı Bir Maliyet Değil, Bir Olabilirlik

İkinci tablonun ilk satırı diğer bütün satırlardan önce okunur: genel düzende **iki bileşen hiç
yerleşemez**. Toplayıcı ham sayaç okumasını, faturalama abone kimliğiyle tutarı tutar; her ikisi
de kurum tesisi sınıfındadır. Bu iki bileşen yerleşemeyince üçüncü tablodaki `kurulamayan bag`
satırı yedi bağdan **altısını** siler — geriye yalnız doğrulayıcı ile gecelik toplu iş arasındaki
bağ kalır.

Bu, "genel bulut daha ucuz ama daha az denetimli" biçiminde bir denge sorusu değildir. Denge
kurulmadan önce bir olabilirlik kapısı vardır: **tek bir bileşenin yerleşim sınıfı, bütün bir
düzeni eleyebilir.** Genel düzenin denetimde kalan 8/24 kalemi ve 1,0 günlük esneklik penceresi
teknik olarak doğrudur ama yalnız dört bileşen için geçerlidir; kalan iki bileşen için hiçbir
sayı yoktur.

Özel düzen kısıtı tümüyle karşılar ve denetim kalemlerinin **36'sının 36'sını** elde tutar. Bedeli
alt iki satırdadır: sabit ayrılmış kapasite %100 ve esneklik penceresi 21,0 gündür. Yani ilk
dersin ölçtüğü 30 günlük bekleme özel düzende yirmi bire iner ama sıfıra inmez; kaynak kurumun
kendi tesisindeyse, isteğe bağlılık kurumun kendi tedarik hızıyla sınırlıdır.

#### Karma Bir Ayar Değil, Bir Eğri

Karma düzen iki biçimde kuruldu. **Dar karma** yalnız zorunlu iki bileşeni kurum tesisine koyar:
sabit kapasite %45, esneklik penceresi 10,0 gün, denetimde kalan kalem 20/36. Ama yedi çağrı
bağından **altısı sınırı geçer** — çünkü kurum tesisine düşen iki bileşen ağın merkezindedir ve
neredeyse her yol onlardan geçer.

**Geniş karma** doğrulayıcıyı ve portalı da kurum tesisine alır. Sınır geçen bağ altıdan **üçe**
iner ve denetimde kalan kalem 28/36'ya çıkar. Karşılığında sabit kapasite %45'ten %75'e, esneklik
penceresi 10,0'dan 16,0 güne çıkar.

İki karma sütunu yan yana okunduğunda karma düzenin bir düğme değil bir **eğri** olduğu görünür:
sınır bağını azaltmanın tek yolu daha çok bileşeni sabit tarafa taşımaktır ve sabit tarafa taşınan
her bileşen esneklik penceresini geri büyütür. Üç sınır bağı kazanmak, sabit kapasitede otuz puan
ve esneklik penceresinde altı gün ödemek demektir. **Karmada bölme çizgisi veri sınıfının çizdiği
yerde değil, çağrı grafiğinin en ince yerinde durmalıdır** — ve bu iki yer aynı olmak zorunda
değildir.

#### Karmanın Sabit Girişi

Üçüncü tablonun alt üç satırı iki karma sütununda **aynıdır**: 18 işletim kalemi, 2 kimlik dizini,
6 kimlik eşlemesi kalemi. Dokuz işletim kalemi iki düzen için ayrı ayrı yürütülür; yama akışı iki
kez kurulur, izleme iki kez, yedekleme iki kez. Kimlik iki dizine ayrılır ve altı bileşenin her
biri için bir eşleme kalemi doğar.

Bu, yerleşimden bağımsız bir **giriş bedelidir**. Bölme çizgisi ne kadar iyi seçilirse seçilsin,
karma düzene geçmek işletim kalemini dokuzdan on sekize çıkarır. Tek düzenli iki seçenek — genel
ve özel — bu satırlarda 9, 1 ve 0 yazar. Karma, denetim ile esneklik arasında bir orta yol sunar,
ama o orta yolun kapısında sabit bir ücret vardır ve bu ücret bileşen sayısı arttıkça büyür.

#### Sınır Nereden Geçiyor

Dördüncü tablo bağ sayısını kullanıcı akışına çevirir. Genel düzende dört akışın **dördü de**
kurulamaz — her akış yolunun üstünde yerleşemeyen bir bileşen vardır. Toplam sınır geçişi sütunu
orada sıfır yazar, ama bu sıfır bir başarı değil, akış olmadığının sonucudur; iki satır birlikte
okunmazsa tablo yanıltır.

Dar karmada okuma akışı iki kez, abone sorgusu iki kez, gecelik akış ve saha akışı birer kez sınır
geçer. Geniş karmada okuma akışı sınıra hiç dokunmaz; kalan üç akışın her biri bir kez geçer.
Bölme çizgisi doğrulayıcıyı kurum tarafına aldığında **en sık koşan akış tümüyle tek tarafta
toplanır**; ödenen bedel doğrulayıcının 20 birimlik kapasite payının artık esnek olmamasıdır.

#### Çıkışta Ne Yeniden Kurulur

Beşinci tablo çıkışı sayar. Tek düzenli seçeneklerde sökülecek düzen birdir ve yeniden kurulacak
sınır bağı yoktur. Karmada iki düzen sökülür ve sınır bağları — altı ya da üç — yeni yerde baştan
kurulur. Taşınamayan denetim kalemi genel düzende 16, dar karmada 16, geniş karmada 8, özel
düzende 0'dır.

Son satır kursun ölçü eksenini bu derse çevirir: denetimde kalan oran %33, %100, %56 ve %78. Bu
oran ne kadar düşükse, çıkışta yeniden pazarlık edilecek kalem o kadar çoktur. Dar karma denetimde
%56 tutar ve altı sınır bağı taşır; geniş karma %78 tutar ve üç bağ taşır — ama ikisi de aynı
sabit girişi ödemiştir.

#### Özet

- Genel düzen altı bileşenin ikisini yerleştiremez ve yedi çağrı bağının altısı kurulamaz;
  yerleşim sınıfı bir denge kalemi değil, dengeden önce gelen bir olabilirlik kapısıdır.
- Denetimde kalan kalem 8/24, 36/36, 20/36 ve 28/36'dır; karşılığında sabit ayrılmış kapasite
  %0, %100, %45 ve %75, esneklik penceresi 1,0, 21,0, 10,0 ve 16,0 gündür.
- Özel düzen denetim kalemlerinin tamamını tutar ama esneklik penceresi 21,0 günde kalır: kaynak
  kurumun tesisindeyse isteğe bağlılık kurumun kendi tedarik hızıyla sınırlıdır.
- Karma bir düğme değil bir eğridir: sınır geçen bağı 6'dan 3'e indirmek sabit kapasiteyi %45'ten
  %75'e ve esneklik penceresini 10,0'dan 16,0 güne çıkarır. Dört kullanıcı akışında toplam sınır
  geçişi 6'dan 3'e iner ve geniş karmada okuma akışı sınıra hiç dokunmaz.
- Karmanın gizli bedeli yerleşimden bağımsızdır ve iki biçimde de aynıdır: 18 işletim kalemi
  (dokuzun iki kez yürütülmesi), 2 kimlik dizini, 6 kimlik eşlemesi kalemi.
- Çıkışta karma iki düzeni söker ve altı ya da üç sınır bağını yeniden kurar; denetimde kalan
  oran %33, %100, %56 ve %78'dir.

#### Sonraki Adım

Bu ders dağıtım düzenlerini denetim, sabitlik ve esneklik cinsinden karşılaştırdı; hiçbirinde
para geçmedi. Oysa "sabit ayrılmış kapasite %100" ile "%0" arasındaki fark asıl kendini bir
ödeme biçiminde gösterir: biri önden ve bir kez, öteki sürekli ve kullanıma göre. Sonraki ders
aynı iş yükünü sabit yatırım ile değişken kira arasında koşturur, **başabaş noktasını** çıkarır ve
kullanım eğrisi değiştikçe o noktanın nereye kaydığını sayar. Fiyatlar kurgudur ve kurgu bir
birimle yazılır.

### Şirket İçi ile Karşılaştırma

Source: https://academia.sh/tr/kurslar/bulut-temelleri/sirket-ici-ile-karsilastirma

Sabit yatırım ile değişken kiranın ölçüsü: aynı 36 aylık kullanım eğrisinde başabaş ayının açık hesapta 15, 19 ve 13, tam hesapta 36, 36'dan sonra ve 23 çıkması, kendi donanımında görünmeyen kalemlerin toplamın %64, %55 ve %48'ini, kiralamada %13'ünü tutması, çıkış ayı 12'den 36'ya kaydıkça kazananın düz eğride kiradan kendi donanımına, tepe yapan eğride yeniden kiraya dönmesi. Bedeller kurgudur ve kurgu birimle yazılır.

Önceki ders üç dağıtım düzenini denetim, sabitlik ve esneklik cinsinden karşılaştırdı ve hiçbir
yerde para geçmedi. Oysa "sabit ayrılmış kapasite %100" ile "%0" arasındaki fark asıl kendini bir
**ödeme biçiminde** gösterir: biri önden ve bir kez, öteki sürekli ve kullanıma göre. Bu ders o
iki ödeme biçimini aynı kullanım eğrisinde koşturur.

Karşılaştırmanın sonucu tek bir cümleye indirilemez, çünkü sonuç **kullanım eğrisinin biçimine**
ve **ne kadar kalınacağına** bağlıdır. Ölçülen şey bu iki değişkendir: sabit yatırımın kümülatif
harcamasının değişken kiranın altına indiği ay — **başabaş noktası** — ve o noktanın eğri
değiştikçe nereye kaydığı.

Bu dersteki bütün bedeller **kurgudur**. Gerçek bir para birimi, gerçek bir fiyat listesi ya da
gerçek bir sağlayıcı yoktur; her şey kurgu bir birimle (`kb`) yazılır. Sayıların anlamı
büyüklüklerinde değil, birbirlerine oranlarındadır.

#### İki Ödeme Biçimi ve Altı Kalem

Örnek, kursun kurgu **bölgesel ölçüm ağı**dır: okuma toplayıcı, doğrulayıcı, faturalama ve iş emri
servisleri, gecelik toplu iş, beş ekip. Ağ da servisler de kurgudur; aşağıdaki maliyet yapısı bir
**modeldir**.

**BK19:** model 36 aylık bir pencere koşar; bütün bedeller kurgudur ve `kb` ile yazılır.
**BK20:** kendi donanımında kapasite birimi başına bir kez 110 kb ödenir, en küçük alım 4 birimdir
ve birim ömrü 36 aydır; kurulu birim başına ayda 3 kb işletim emeği ve düzen ayakta olduğu sürece
ayda 20 kb tesis bedeli doğar. **BK21:** kiralamada birim-ay 12 kb'dir; birim-ay başına 36.000
istek düşer ve her 1.000 istek 0,05 kb tutar, yani birim-ay başına 1,8 kb istek ücreti eklenir;
çıkışta bir kez 250 kb çıkış ücreti doğar. **BK22:** kapasite her ay talebi karşılar; kendi
donanımı dört birimlik bloklarla alır ve azaltmaz, kiralama her ay talep kadardır. **BK23:** açık
hesap yalnız iki görünür kalemi sayar — donanımın peşin bedeli ve birim-ay kirası; tam hesap altı
kalemin hepsini sayar. **BK24:** çıkışta kendi donanımının kalan defter değerinin %40'ı geri
gelir; kiralamada çıkış ücreti bir kez eklenir.

```js
// bulut/maliyet.mjs — sabit yatirim ile degisken kirayi ayni kullanim egrisinde kosturan model.
// Butun bedeller KURGUDUR ve kurgu bir birimle (kb) yazilir; gercek bir para birimi, gercek bir
// fiyat listesi ya da gercek bir saglayici yoktur. Rastgelelik yok.

export const AY = 36;
export const F = {
  pesin: 110,   // kendi donanimi: kapasite birimi basina bir kez (kurgu kb)
  blok: 4,      // kendi donanimi: en kucuk alim
  omur: 36,     // kendi donanimi: birim omru (ay)
  emek: 3,      // kendi donanimi: kurulu birim basina ay (isletim emegi)
  tesis: 20,    // kendi donanimi: ay basina sabit (guc, sogutma, yerlesim)
  kira: 12,     // kiralama: birim-ay (istege bagli kapasite)
  istek: 1.8,   // kiralama: birim-ay basina istek ucreti
  cikis: 250,   // kiralama: cikista bir kez (veri tasima)
  geri: 0.4,    // kendi donanimi: cikista kalan defter degerinin geri alinabilen orani
};

// Maliyet kalemleri: taraf, gorunur mu (sozlesmede/faturada ilk bakista okunan), aciklama.
export const KALEM = `
  donanim-pesin        kendi  gorunur
  isletim-emegi        kendi  gorunmez
  tesis-guc-sogutma    kendi  gorunmez
  birim-ay-kirasi      kira   gorunur
  istek-basina-ucret   kira   gorunmez
  cikis-ucreti         kira   gorunmez`
  .trim().split("\n").map((r) => {
    const [ad, taraf, g] = r.trim().split(/\s+/);
    return { ad, taraf, gorunur: g === "gorunur" };
  });

const TABAN = {
  duz: () => 5,
  tepe: (a) => (a >= 14 && a < 20 ? 16 : 5),
  buyuyen: (a) => 3 + 0.4 * a,
};
export const egri = (ad) => Array.from({ length: AY }, (_, a) => Math.ceil(TABAN[ad](a)));

// kip "acik": yalniz gorunur kalemler sayilir. kip "tam": butun kalemler sayilir.
export function kos(egriAd, kip) {
  const T = egri(egriAd), g = (ad) => kip === "tam" || KALEM.find((k) => k.ad === ad).gorunur;
  const alim = [];                                  // {ay, birim} kendi donanimi alimlari
  let kap = 0;
  const kendi = [], kira = [];
  let kk = 0, ki = 0;
  for (let a = 0; a < AY; a++) {
    while (kap < T[a]) { kap += F.blok; alim.push({ ay: a, birim: F.blok }); }
    if (g("donanim-pesin")) kk += alim.filter((x) => x.ay === a).length * F.blok * F.pesin;
    if (g("isletim-emegi")) kk += kap * F.emek;
    if (g("tesis-guc-sogutma")) kk += F.tesis;
    if (g("birim-ay-kirasi")) ki += T[a] * F.kira;
    if (g("istek-basina-ucret")) ki += T[a] * F.istek;
    kendi.push(kk); kira.push(ki);
  }
  return { T, alim, kap, kendi, kira };
}

// Basabas: kendi donaniminin kumulatif harcamasinin kiranin altina indigi ilk ay (1 tabanli).
export function basabas(r) {
  for (let a = 0; a < AY; a++) if (r.kendi[a] <= r.kira[a]) return a + 1;
  return null;
}

// Cikis: o ay ayrilirsa net bedel. Kendi donaniminda o ana kadar alinmis birimlerin kalan defter
// degerinin bir orani geri gelir; kiralamada cikis ucreti bir kez eklenir.
export function cikis(r, ay, kip) {
  const kalan = r.alim.filter((x) => x.ay < ay).reduce((s, x) =>
    s + x.birim * F.pesin * Math.max(0, F.omur - (ay - x.ay)) / F.omur, 0) * F.geri;
  const ek = kip === "tam" ? F.cikis : 0;
  return { kendi: Math.round(r.kendi[ay - 1] - kalan), kira: Math.round(r.kira[ay - 1] + ek) };
}
```

```js
// bulut/olc.mjs — basabas noktasi, kullanim egrisi degisince kaymasi ve gorunmeyen kalemler.
import { kos, basabas, cikis, egri, KALEM, F, AY } from "./maliyet.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const EGRI = ["duz", "tepe", "buyuyen"];
const R = Object.fromEntries(EGRI.flatMap((e) => ["acik", "tam"]
  .map((k) => [`${e}-${k}`, kos(e, k)])));
const ay = (b) => (b === null ? `>${AY}` : b);

console.log(`${AY} aylik pencere; butun bedeller KURGU ve kurgu birimle (kb) yazili. ` +
  `kapasite birimi: pesin ${F.pesin}, kira ${F.kira}/ay`);

const A = [-22, 9, 12, 34];
console.log("\n1. maliyet kalemleri (gorunur = sozlesmede ilk bakista okunan)");
yaz(A, "kalem", "taraf", "gorunur", "kurgu bedel");
const BEDEL = { "donanim-pesin": `${F.pesin} kb / birim, bir kez`,
  "isletim-emegi": `${F.emek} kb / kurulu birim-ay`,
  "tesis-guc-sogutma": `${F.tesis} kb / ay`,
  "birim-ay-kirasi": `${F.kira} kb / birim-ay`,
  "istek-basina-ucret": `${F.istek} kb / birim-ay`,
  "cikis-ucreti": `${F.cikis} kb, bir kez` };
for (const k of KALEM) yaz(A, k.ad, k.taraf, k.gorunur ? "evet" : "hayir", BEDEL[k.ad]);

const B = [-10, 12, 12, 10, 12, 13];
console.log("\n2. basabas ayi: kendi donanimi kirayi ne zaman gecer");
yaz(B, "egri", "en dusuk", "en yuksek", "alim", "acik hesap", "tam hesap");
for (const e of EGRI) {
  const T = egri(e);
  yaz(B, e, Math.min(...T), Math.max(...T), R[`${e}-tam`].kap,
    ay(basabas(R[`${e}-acik`])), ay(basabas(R[`${e}-tam`])));
}

const C = [-10, 12, 11, 13, 11, 10, 13];
console.log(`\n3. ${AY}. ayda kumulatif harcama (kb) ve gorunmeyenin payi`);
yaz(C, "egri", "kendi acik", "kendi tam", "gorunmez (%)", "kira acik", "kira tam",
  "gorunmez (%)");
const pay = (a, t) => `${Math.round(t - a)} (${Math.round(((t - a) / t) * 100)})`;
for (const e of EGRI) {
  const a = R[`${e}-acik`], t = R[`${e}-tam`], i = AY - 1;
  yaz(C, e, a.kendi[i], Math.round(t.kendi[i]), pay(a.kendi[i], t.kendi[i]),
    a.kira[i], Math.round(t.kira[i]), pay(a.kira[i], t.kira[i]));
}

const D = [-10, 10, 12, 12, 12, 12];
console.log(`\n4. tam hesapta cikis ayina gore net bedel (kb; kalan defter degerinin ` +
  `%${F.geri * 100}'i geri gelir)`);
yaz(D, "egri", "cikis ayi", "kendi", "kira", "fark", "kazanan");
for (const e of EGRI) for (const m of [12, 24, 36]) {
  const c = cikis(R[`${e}-tam`], m, "tam");
  yaz(D, e, m, c.kendi, c.kira, c.kendi - c.kira, c.kendi < c.kira ? "kendi" : "kira");
}
```

```
36 aylik pencere; butun bedeller KURGU ve kurgu birimle (kb) yazili. kapasite birimi: pesin 110, kira 12/ay

1. maliyet kalemleri (gorunur = sozlesmede ilk bakista okunan)
kalem                     taraf     gorunur                       kurgu bedel
donanim-pesin             kendi        evet           110 kb / birim, bir kez
isletim-emegi             kendi       hayir            3 kb / kurulu birim-ay
tesis-guc-sogutma         kendi       hayir                        20 kb / ay
birim-ay-kirasi            kira        evet                  12 kb / birim-ay
istek-basina-ucret         kira       hayir                 1.8 kb / birim-ay
cikis-ucreti               kira       hayir                   250 kb, bir kez

2. basabas ayi: kendi donanimi kirayi ne zaman gecer
egri          en dusuk   en yuksek      alim  acik hesap    tam hesap
duz                  5           5         8          15           36
tepe                 5          16        16          19          >36
buyuyen              3          17        20          13           23

3. 36. ayda kumulatif harcama (kb) ve gorunmeyenin payi
egri        kendi acik  kendi tam gorunmez (%)  kira acik  kira tam gorunmez (%)
duz                880       2464    1584 (64)       2160      2484     324 (13)
tepe              1760       3872    2112 (55)       2952      3395     443 (13)
buyuyen           2200       4216    2016 (48)       4488      5161     673 (13)

4. tam hesapta cikis ayina gore net bedel (kb; kalan defter degerinin %40'i geri gelir)
egri       cikis ayi       kendi        kira        fark     kazanan
duz               12        1173        1078          95        kira
duz               24        1819        1906         -87       kendi
duz               36        2464        2734        -270       kendi
tepe              12        1173        1078          95        kira
tepe              24        2684        2817        -133       kendi
tepe              36        3735        3645          90        kira
buyuyen           12        1123        1175         -52       kendi
buyuyen           24        2499        2900        -401       kendi
buyuyen           36        3864        5411       -1547       kendi
```

Sayılar **ölçüm** sınıfındadır; girdileri BK19–BK24'tür ve hepsi kurgu bedellerdir.

#### Başabaş Noktası

İkinci tablo aynı hesabı iki kez yapar. **Açık hesap** yalnız sözleşmede ilk bakışta okunan iki
kalemi sayar: donanımın peşin bedeli ve birim-ay kirası. Bu hesapta düz eğride başabaş **15. ay**,
tepe yapan eğride 19., büyüyen eğride 13. aydır. Bu üç sayı, "iki yılda kendini amorti eder"
biçimindeki cümlenin çıktığı yerdir.

**Tam hesap** altı kalemin hepsini sayar ve aynı üç eğride başabaş 36., 36'dan sonra ve 23. aya
kayar. Düz eğride kayma 21 ay, tepe yapan eğride pencerenin dışına, büyüyen eğride 10 aydır.
**Başabaş noktası bir gerçek değil, hesaba hangi kalemlerin alındığının bir sonucudur**; iki hesap
arasındaki fark, tartışmadaki tarafların çoğu zaman aynı şeyi ölçmediğini gösterir.

#### Eğri Değişince Başabaş Nereye Kayar

Üç eğri aynı servisi üç farklı talep biçimiyle koşturur. **Düz eğride** talep 36 ay boyunca 5
birimdir; kendi donanımı dört birimlik blok yüzünden 8 birim alır ve fazlasını ömrü boyunca taşır.
Tam hesapta başabaş tam pencerenin sonundadır — yani üç yıl boyunca kalınırsa ancak eşitlenir.

**Tepe yapan eğride** talep altı ay boyunca 5'ten 16 birime çıkar ve sonra geri iner. Kendi
donanımı o tepeyi karşılamak için 16 birime çıkar ve tepe geçtikten sonra da 16 birimi elde tutar;
kiralama tepe boyunca ödeyip sonra iner. Tam hesapta başabaş pencerenin dışındadır. **Tek bir
altı aylık tepe, üç yıllık bir yatırım kararını tersine çevirir.**

**Büyüyen eğride** talep 3'ten 17 birime düzenli olarak çıkar. Burada kendi donanımı en erken
başabaşı verir (23. ay), çünkü kiralama her ay biraz daha fazla öder ve toplam kira 36. ayda
5.161 kb'ye ulaşır — üç eğrinin en yükseği. **Kiralamanın kaybettirdiği yer öngörülebilir biçimde
büyüyen yüktür**; orada esneklikten alınan hiçbir şey yoktur, çünkü kapasite zaten hiç geri
inmemektedir.

#### Görünmeyen Kalemler

Üçüncü tablo iki hesabın farkını kalem olarak yazar. Kendi donanımında 36. ayda açık hesap düz
eğride 880 kb, tam hesap 2.464 kb'dir: **görünmeyen 1.584 kb, toplamın %64'ü**. Tepe yapan eğride
%55, büyüyen eğride %48'dir. Görünmeyen kalemlerin adı bellidir — kurulu birim başına işletim
emeği ve aylık tesis bedeli — ve ikisi de bir satın alma kararında görünmez, çünkü ikisi de
donanımın faturasında yazmaz.

Kiralamada aynı oran üç eğride de **%13**'tür ve tek kaynağı istek başına ücrettir. Oranın düşük
ve sabit olması kiralamanın daha dürüst olduğu anlamına gelmez; kiralamanın görünmeyen en büyük
kalemi bu tabloda hiç yoktur, çünkü o kalem yalnız **çıkarken** doğar.

Görünmeyen payın eğriden eğriye değişme yönü de bir şey söyler. Kendi donanımında oran düz eğride
en yüksek (%64), büyüyen eğride en düşüktür (%48) — çünkü büyüyen eğride peşin donanım harcaması
büyüdükçe görünen kalem payı da büyür. Yani **düşük kullanımda hesabın görünmeyen kısmı en
büyüktür**: donanımın az kullanıldığı durumda peşin bedel küçük kalır, ama işletim emeği ve tesis
bedeli ilk günden itibaren tam olarak işler. Kiralamada oranın eğriden bağımsız kalması, o tarafın
görünmeyen kaleminin kullanımla orantılı olmasındandır.

#### Çıkış Ayı Kazananı Değiştirir

Dördüncü tablo aynı üç eğriyi üç farklı çıkış ayında keser ve çıkış kalemlerini de sayar: kendi
donanımında kalan defter değerinin %40'ı geri gelir, kiralamada 250 kb çıkış ücreti eklenir.

Düz eğride 12. ayda kiralama 95 kb önde, 24. ayda kendi donanımı 87 kb önde, 36. ayda 270 kb
öndedir. Tepe yapan eğride sıra iki kez döner: 12. ayda kiralama, 24. ayda kendi donanımı, 36. ayda
yine kiralama kazanır (90 kb). Büyüyen eğride kendi donanımı üç kesitte de öndedir ve fark 36. ayda
1.547 kb'ye açılır.

Tepe yapan eğrinin iki kez yön değiştirmesi bu dersin ana bulgusudur. Kararın doğru cevabı yoktur;
**cevabı belirleyen şey ne kadar kalınacağıdır** ve o süre karar anında bilinmez. Kendi donanımının
erken çıkışta kaybettiği şey kalan defter değerinin geri gelmeyen %60'ı, kiralamanın geç çıkışta
kaybettiği şey biriken birim-ay kirasıdır. İki taraf da bir tür bağlanma satın alır: biri varlığa,
öteki sözleşmeye.

#### Özet

- Başabaş ayı açık hesapta 15, 19 ve 13; tam hesapta 36, 36'dan sonra ve 23'tür. Kayma sırasıyla
  21 ay, pencerenin dışı ve 10 aydır; başabaş bir gerçek değil, hesaba alınan kalemlerin sonucudur.
- Kendi donanımında görünmeyen kalemler 36. ayda toplamın %64, %55 ve %48'ini tutar; kiralamada
  aynı oran üç eğride de %13'tür ve tek kaynağı istek başına ücrettir.
- Tepe yapan eğride kendi donanımı 16 birime çıkar ve tepe geçtikten sonra da elde tutar; tek bir
  altı aylık tepe tam hesaptaki başabaşı 36 aylık pencerenin dışına atar.
- Kiralamanın kaybettirdiği yer öngörülebilir biçimde büyüyen yüktür: orada toplam kira 36. ayda
  5.161 kb'ye çıkar ve başabaş 23. aya iner.
- Çıkış ayı kazananı değiştirir: düz eğride 12. ayda kiralama, 24. ve 36. ayda kendi donanımı;
  tepe yapan eğride sıra iki kez döner (12. ayda kiralama, 24. ayda kendi donanımı, 36. ayda yine
  kiralama).
- Görünmeyen kalemlerin adı bellidir — kendi donanımında işletim emeği ve tesis, kiralamada istek
  başına ücret ve çıkış ücreti; ikisi de kararın verildiği belgede yazmaz.

#### Sonraki Adım

Bu ders kiralamanın bedelini paraya çevirdi ve hesabın hangi kalemleri saydığına göre kazananın
değiştiğini gösterdi. Ama bütün tablo boyunca bir kalem hiç sorulmadı: kiralanan hizmette bir şey
ters gittiğinde **kimin yapması gerekiyordu**. İşletim emeği kalemi kendi donanımında bir sayıdır;
kiralamada o emeğin bir kısmı sağlayıcıya geçer, ama tam olarak hangi kısmı? Sonraki ders bir
**sorumluluk matrisi** kurar: kalem kalem hangi taraf, kaç kalem **boşlukta** kalıyor ve kaç kalem
**çakışıyor**.

### Paylaşılan Sorumluluk Modeli

Source: https://academia.sh/tr/kurslar/bulut-temelleri/paylasilan-sorumluluk-modeli

Sağlayıcı ile müşteri sınırının ölçüsü: 24 kalemlik sorumluluk matrisinde sağlayıcıya geçen kalemin 6'dan 16 ve 20'ye çıkması, boşlukta kalan kalemin 2, 4 ve 5, çakışan kalemin 2, 4 ve 2 olması, sekiz olayın toplam 56, 73 ve 68 turda kapanması ve bu turların 28, 35 ve 35'inin yalnız boşluktan gelmesi, sekiz olaydan 4, 5 ve 4'ünün veri kaybıyla kapanması, çıkışta taşınan kalemin 18'den 8 ve 4'e inmesi.

Önceki ders kiralamanın bedelini paraya çevirdi ve bir kalemi adıyla saydı: **işletim emeği**.
Kendi donanımında o emek tek bir sayıdır ve tümü kurumundur. Kiralamada bir kısmı sağlayıcıya
geçer — ama tam olarak hangi kısmı? Bu ders o sınırı çizer ve çizginin iki yanında değil,
**üstünde** ne olduğunu sayar.

**Paylaşılan sorumluluk**, bir hizmetin ayakta ve güvende kalması için gereken işlerin sağlayıcı
ile müşteri arasında bölünmesidir. M20'nin **devir sözleşmesi**yle aynı biçimdedir ama sınırı
başka yerdedir: orada iş yazan ekip ile işleten ekip arasında bölünüyordu ve iki taraf da aynı
kurumdaydı; burada sınırın öte yanı bir sözleşmedir ve karşı taraf masaya oturmaz. Bu fark tek bir
yeni sınıf üretir: bir kalem **hiç kimsenin** olabilir.

#### Sorumluluk Matrisi

Örnek, kursun kurgu **bölgesel ölçüm ağı**dır: okuma toplayıcı, doğrulayıcı, faturalama ve iş emri
servisleri, gecelik toplu iş, beş ekip. Ağ da servisler de kurgudur; aşağıdaki matris bir
**modeldir**, gerçek bir sağlayıcı, sözleşme ya da olay kaydı yoktur.

**BK25:** sorumluluk matrisi 24 kalemdir; her kalem üç hizmet modelinde sağlayıcıda, müşteride ya
da paylaşılandır. **BK26:** paylaşılan kalem üç biçimde davranır — **sağlam** (iki taraf da kendi
payını üstlenir), **boşluk** (iki taraf da ötekinin yaptığını sanır, kimse yapmaz), **çakışma**
(ikisi de yapar, hangisinin geçerli olduğu belirsizdir); bu eğilim kaleme özgüdür ve modelden
bağımsızdır. **BK27:** sekiz olay vardır, her olay üç kaleme dokunur. **BK28:** olay turu kalemin
sınıfına göredir — sağlayıcıda 1, müşteride 1, sağlam paylaşılan 2, çakışan 3, boşlukta 8 tur;
boşluktaki kalem olay sırasında sıfırdan kurulur. **BK29:** dokunduğu kalemlerden biri boşlukta
olan olay veri kaybıyla kapanır. **BK30:** çıkışta müşteride kalan kalem taşınır; sağlayıcıda ve
paylaşılan olan kalemler yeni sağlayıcıda yeniden pazarlık edilir.

```js
// bulut/sorumluluk.mjs — kurgu olcum agi icin paylasilan sorumluluk matrisi (model): gercek bir
// saglayici, gercek bir sozlesme ya da gercek bir olay kaydi yok. Rastgelelik yok.

export const MODEL = ["altyapi", "platform", "yazilim"];
// Sutunlar: altyapi platform yazilim. S saglayicida, M musteride, P paylasilan.
// egilim: paylasilan kalem nasil davranir — saglam / bosluk / cakisma.
export const KALEM = `
  fiziksel-guvenlik        S S S  saglam
  ana-makine-yamasi        S S S  saglam
  konuk-is-sistemi-yamasi  M S S  saglam
  uygulama-yamasi          M M S  saglam
  ag-kurali                P P S  bosluk
  kenar-korunmasi          P P S  cakisma
  duragan-sifreleme        M P S  saglam
  aktarim-sifrelemesi      P P S  cakisma
  anahtar-yonetimi         M P P  bosluk
  kimlik-ve-erisim         M M M  saglam
  yedekleme-alma           M P S  saglam
  yedekten-donme-provasi   M M M  bosluk
  gunluk-toplama           M P P  saglam
  gunluk-saklama           M M P  bosluk
  uyari-esigi              M M M  saglam
  olay-ilk-yanit           M P P  cakisma
  olay-kok-neden           P P P  bosluk
  kapasite                 M P S  saglam
  imaj-dagitimi            M S S  saglam
  yapilandirma-denetimi    M M P  bosluk
  veri-siniflandirma       M M M  saglam
  veri-silme               M P P  bosluk
  bilesen-taramasi         M M P  saglam
  felaket-tatbikati        M P P  cakisma`
  .trim().split("\n").map((r) => {
    const [ad, ...k] = r.trim().split(/\s+/);
    return { ad, egilim: k[3], s: Object.fromEntries(MODEL.map((m, i) => [m, k[i]])) };
  });

// Cozumleme: sozlesme degeri P ise kalemin egilimi sinifi belirler.
export const sinif = (k, m) =>
  (k.s[m] === "P" ? { saglam: "pay", bosluk: "BOS", cakisma: "CAK" }[k.egilim]
    : k.s[m] === "S" ? "sag" : "mus");
export const SINIF = ["sag", "mus", "pay", "BOS", "CAK"];
export const say = (m, c) => KALEM.filter((k) => sinif(k, m) === c).length;

// Olay turu: kalem hangi siniftaysa o kadar tur. Boslukta kalem olay sirasinda sifirdan kurulur.
export const TUR = { sag: 1, mus: 1, pay: 2, CAK: 3, BOS: 8 };

export const OLAY = `
  sizinti-suphesi       gunluk-toplama gunluk-saklama olay-kok-neden
  veri-kaybi            yedekleme-alma yedekten-donme-provasi veri-siniflandirma
  disaridan-tarama      ag-kurali kenar-korunmasi olay-ilk-yanit
  anahtar-suresi        aktarim-sifrelemesi anahtar-yonetimi uyari-esigi
  yetkisiz-erisim       kimlik-ve-erisim gunluk-toplama olay-kok-neden
  yama-acigi            konuk-is-sistemi-yamasi bilesen-taramasi imaj-dagitimi
  yanlis-yapilandirma   yapilandirma-denetimi ag-kurali olay-ilk-yanit
  genis-kesinti         felaket-tatbikati kapasite yedekten-donme-provasi`
  .trim().split("\n").map((r) => {
    const [ad, ...k] = r.trim().split(/\s+/);
    return { ad, kalem: k.map((x) => KALEM.find((y) => y.ad === x)) };
  });

export function kos(m) {
  const olay = OLAY.map((o) => {
    const c = o.kalem.map((k) => sinif(k, m));
    return { ad: o.ad, tur: c.reduce((a, x) => a + TUR[x], 0),
      bos: c.filter((x) => x === "BOS").length, cak: c.filter((x) => x === "CAK").length };
  });
  const t = (f) => olay.reduce((a, o) => a + f(o), 0);
  return { olay, tur: t((o) => o.tur), kayipli: olay.filter((o) => o.bos > 0).length,
    bosTur: t((o) => o.bos * (TUR.BOS - 1)), cakTur: t((o) => o.cak * (TUR.CAK - 1)),
    tasinan: say(m, "mus"), pazarlik: KALEM.length - say(m, "mus") };
}
```

```js
// bulut/olc.mjs — sinir nerede, kac kalem boslukta, kac kalem cakisiyor, olayda ne oluyor.
import { KALEM, MODEL, OLAY, SINIF, TUR, sinif, say, kos } from "./sorumluluk.mjs";

const yaz = (g, ...s) => console.log(s.map((v, i) =>
  (g[i] < 0 ? String(v).padEnd(-g[i]) : String(v).padStart(g[i]))).join(""));
const R = Object.fromEntries(MODEL.map((m) => [m, kos(m)]));

console.log(`sorumluluk matrisi: ${KALEM.length} kalem x 3 hizmet modeli; ` +
  `${OLAY.length} olay, olay basina 3 kalem; olay turu ` +
  SINIF.map((c) => `${c} ${TUR[c]}`).join(", "));

const A = [-25, 11, 11, 10];
console.log("\n1. sorumluluk matrisi (sag saglayicida, mus musteride, pay paylasilan,");
console.log("   BOS ikisi de otekinin yaptigini saniyor, CAK ikisi de yapiyor)");
yaz(A, "kalem", ...MODEL);
for (const k of KALEM) yaz(A, k.ad, ...MODEL.map((m) => sinif(k, m)));

const B = [-36, 11, 11, 10];
console.log("\n2. sinir uc modelde nereye kayiyor");
yaz(B, "sinif", ...MODEL);
for (const c of SINIF) yaz(B, c, ...MODEL.map((m) => say(m, c)));
yaz(B, "saglayiciya gecen (sag+pay+BOS+CAK)", ...MODEL.map((m) => KALEM.length - say(m, "mus")));
yaz(B, "sorunlu kalem (BOS+CAK)", ...MODEL.map((m) => say(m, "BOS") + say(m, "CAK")));

const C = [-28, 11, 11, 10];
console.log("\n3. sekiz olay kac turda kapaniyor (parantez: boslukta kalem sayisi)");
yaz(C, "olay", ...MODEL);
OLAY.forEach((o, i) => yaz(C, o.ad,
  ...MODEL.map((m) => `${R[m].olay[i].tur} (${R[m].olay[i].bos})`)));
for (const [ad, f] of [["toplam tur", (r) => r.tur],
  ["  bosluktan gelen ek tur", (r) => r.bosTur],
  ["  cakismadan gelen ek tur", (r) => r.cakTur],
  ["veri kaybiyla kapanan olay", (r) => `${r.kayipli}/${OLAY.length}`]])
  yaz(C, ad, ...MODEL.map((m) => f(R[m])));

const D = [-33, 11, 11, 10];
console.log("\n4. cikista ne tasinir");
yaz(D, "olcu", ...MODEL);
for (const [ad, f] of [["tasinan kalem (musteride)", (m) => R[m].tasinan],
  ["yeniden pazarlik edilecek kalem", (m) => R[m].pazarlik],
  ["  bunlarin kaci zaten sorunlu", (m) => say(m, "BOS") + say(m, "CAK")],
  ["tasinan kalem orani (%)", (m) => Math.round((R[m].tasinan / KALEM.length) * 100)]])
  yaz(D, ad, ...MODEL.map(f));
```

```
sorumluluk matrisi: 24 kalem x 3 hizmet modeli; 8 olay, olay basina 3 kalem; olay turu sag 1, mus 1, pay 2, BOS 8, CAK 3

1. sorumluluk matrisi (sag saglayicida, mus musteride, pay paylasilan,
   BOS ikisi de otekinin yaptigini saniyor, CAK ikisi de yapiyor)
kalem                        altyapi   platform   yazilim
fiziksel-guvenlik                sag        sag       sag
ana-makine-yamasi                sag        sag       sag
konuk-is-sistemi-yamasi          mus        sag       sag
uygulama-yamasi                  mus        mus       sag
ag-kurali                        BOS        BOS       sag
kenar-korunmasi                  CAK        CAK       sag
duragan-sifreleme                mus        pay       sag
aktarim-sifrelemesi              CAK        CAK       sag
anahtar-yonetimi                 mus        BOS       BOS
kimlik-ve-erisim                 mus        mus       mus
yedekleme-alma                   mus        pay       sag
yedekten-donme-provasi           mus        mus       mus
gunluk-toplama                   mus        pay       pay
gunluk-saklama                   mus        mus       BOS
uyari-esigi                      mus        mus       mus
olay-ilk-yanit                   mus        CAK       CAK
olay-kok-neden                   BOS        BOS       BOS
kapasite                         mus        pay       sag
imaj-dagitimi                    mus        sag       sag
yapilandirma-denetimi            mus        mus       BOS
veri-siniflandirma               mus        mus       mus
veri-silme                       mus        BOS       BOS
bilesen-taramasi                 mus        mus       pay
felaket-tatbikati                mus        CAK       CAK

2. sinir uc modelde nereye kayiyor
sinif                                   altyapi   platform   yazilim
sag                                           2          4        11
mus                                          18          8         4
pay                                           0          4         2
BOS                                           2          4         5
CAK                                           2          4         2
saglayiciya gecen (sag+pay+BOS+CAK)           6         16        20
sorunlu kalem (BOS+CAK)                       4          8         7

3. sekiz olay kac turda kapaniyor (parantez: boslukta kalem sayisi)
olay                            altyapi   platform   yazilim
sizinti-suphesi                  10 (1)     11 (1)    18 (2)
veri-kaybi                        3 (0)      4 (0)     3 (0)
disaridan-tarama                 12 (1)     14 (1)     5 (0)
anahtar-suresi                    5 (0)     12 (1)    10 (1)
yetkisiz-erisim                  10 (1)     11 (1)    11 (1)
yama-acigi                        3 (0)      3 (0)     4 (0)
yanlis-yapilandirma              10 (1)     12 (1)    12 (1)
genis-kesinti                     3 (0)      6 (0)     5 (0)
toplam tur                           56         73        68
  bosluktan gelen ek tur             28         35        35
  cakismadan gelen ek tur             4         10         6
veri kaybiyla kapanan olay          4/8        5/8       4/8

4. cikista ne tasinir
olcu                                 altyapi   platform   yazilim
tasinan kalem (musteride)                 18          8         4
yeniden pazarlik edilecek kalem            6         16        20
  bunlarin kaci zaten sorunlu              4          8         7
tasinan kalem orani (%)                   75         33        17
```

Sayılar **ölçüm** sınıfındadır; girdileri BK25–BK30'dur.

#### Sınır Nereye Kayıyor

İkinci tablo sınırı üç modelde okur. Sağlayıcıda duran kalem 2'den 4 ve 11'e çıkar; müşteride kalan
18'den 8 ve 4'e iner. Sağlayıcı tarafına geçen toplam kalem — sağlayıcıda, paylaşılan, boşlukta ve
çakışan — 6, 16 ve 20'dir. Buraya kadarki tablo önceki derslerin devredilen karar sayımıyla aynı
yöne bakar.

Asıl bulgu son satırdadır. **Sorunlu kalem sayısı — boşlukta artı çakışan — 4, 8 ve 7'dir.** En
yüksek sayı en çok devreden modelde değil, **ortadaki** modeldedir. Nedeni üçüncü satırdır:
paylaşılan kalem sayısı 0, 4 ve 2'dir ve boşluk ile çakışma yalnız paylaşılan kalemlerde doğar.
Altyapı hizmetinde neredeyse her şey müşterinindir, yazılım hizmetinde neredeyse her şey
sağlayıcının; ortada ise kalemlerin yarısı iki tarafa birden bakar.

**Belirsizlik, sınırın uçlarında değil kaydığı yerde birikir.** `olay-kok-neden` üç modelde de
boşluktadır: sağlayıcı kendi katmanının altını görmez, müşteri sağlayıcının içini göremez.
`kenar-korunmasi` ve `aktarim-sifrelemesi` altyapı ve platformda çakışmadadır — ikisi de
yapıldığı için kimse yokluğunu fark etmez, ama hangi ayarın geçerli olduğu bir olay anında
sorulur.

#### Boşluk Bir Olayda Ne Yapıyor

Üçüncü tablo matrisi sekiz olayın üstünde koşturur. Toplam kapanış turu altyapıda 56, platformda
73, yazılımda 68'dir. Alt satırlar bu turların nereden geldiğini yazar: sıradan bir kalem
bir tur tutar, boşluktaki kalem sekiz; aradaki **ek tur boşlukta 28, 35 ve 35**, çakışmada 4, 10
ve 6'dır.

Altyapı sütunu bu dersin en keskin sayısını verir. Yirmi dört kalemin **ikisi** boşluktadır ve o
iki kalem, sekiz olayın toplam 56 turunun **tam yarısını** yazar. Boşlukta kalan kalem bir belge
eksiği değildir; olay anında sıfırdan kurulan bir iştir ve olayın saatini durdurmaz.

Tek tek olaylara bakıldığında etki daha nettir. `sizinti-suphesi` yazılım hizmetinde iki boşluk
kalemine birden dokunur ve 18 turda kapanır; aynı olay altyapıda 10 turdur. Buna karşılık
`veri-kaybi` ve `yama-acigi` hiçbir modelde boşluğa dokunmaz ve üç ile dört tur arasında kapanır.
Olayın pahalı olup olmadığını olayın kendisi değil, **dokunduğu kalemin matriste nereye düştüğü**
belirler.

Son satır bedeli teknik olmayan bir birime çevirir: sekiz olaydan **dördü, beşi ve dördü veri
kaybıyla kapanır**. Bu sayı üç modelde neredeyse aynıdır. Hizmet modelini derinleştirmek boşluk
sayısını 2'den 5'e çıkarır ama veri kaybıyla kapanan olay sayısını düşürmez — çünkü boşluk
kalemleri olay yollarının üstünde dağınık durur, tek bir yerde toplanmaz.

#### Çakışma Boşluktan Ucuzdur

İki sorunlu sınıf aynı ağırlıkta değildir. Çakışan kalem olay başına iki ek tur yazar, boşluktaki
kalem yedi. Platformda matris dört çakışan ve dört boşlukta kalan kalem içerir; sekiz olayda
çakışma 10, boşluk 35 ek tur yazar — kalem sayıları eşit, bedelleri üç buçuk kat farklı.

Yönleri de terstir. Devir derinleştikçe çakışma 2'den 4'e çıkıp yeniden 2'ye iner, boşluk ise 2, 4,
5 diye artar. Sağlayıcı bir kalemi açıkça üstlendiğinde çakışma kaybolur; **açıkça üstlenilmeyen
kalem ise kaybolmaz, boşluğa düşer.** Bir sorumluluk matrisinde tehlikeli olan hücre iki işaretin
birden olduğu hücre değil, **hiç işaret olmayan** hücredir — ve o hücre denetlenirken
atlanır, çünkü tabloda boş görünen bir satır tamamlanmamış bir kayıt gibi durur, karşılıksız bir
yükümlülük gibi değil.

Bu ayrım denetim sırasını da belirler. Çakışan kalem, iki tarafın da yaptığı iş olduğu için ilk
bakışta göze çarpar: iki ayrı ayar, iki ayrı kayıt, iki ayrı fatura satırı vardır. Boşluktaki
kalemin hiçbir izi yoktur — ne bir ayar, ne bir kayıt, ne bir sorumlu. Matriste dört çakışan
kalemi bulmak bir öğleden sonra sürer; dört boşluğu bulmak, her kalemi tek tek iki tarafa da
sormayı gerektirir. **Sorumluluk matrisinin değeri doldurulmuş hücrelerinde değil, boş bırakılmış
hücrelerinin arandığında ortaya çıkar.**

#### Çıkışta Ne Taşınır

Dördüncü tablo kursun ölçü eksenini kapatır. Müşteride kalan ve bu yüzden yeni bir düzene olduğu
gibi taşınan kalem 18, 8 ve 4'tür — sırasıyla 24 kalemin %75'i, %33'ü ve %17'si. Yeniden pazarlık
edilecek kalem 6, 16 ve 20'dir.

Son satır çıkışın gizli kısmını gösterir: yeniden pazarlık edilecek kalemlerin 4, 8 ve 7'si
**zaten sorunludur**. Yani çıkarken taşınan şey yalnız bir sorumluluk listesi değil, o listedeki
tanımsız hücrelerdir; boşlukta kalan bir kalem yeni sağlayıcıda da boşlukta kalmaya eğilimlidir,
çünkü boşluğun nedeni sağlayıcı değil, kalemin iki tarafın da görüş alanının dışında durmasıdır.

#### Özet

- 24 kalemlik matriste sağlayıcıya geçen kalem 6, 16 ve 20'dir; müşteride kalan 18, 8 ve 4.
- Boşlukta kalan kalem 2, 4 ve 5; çakışan kalem 2, 4 ve 2'dir. Sorunlu kalem toplamı (4, 8, 7) en
  çok devreden modelde değil, **sınırın en çok kaydığı ortadaki modelde** en yüksektir.
- Sekiz olay 56, 73 ve 68 turda kapanır; bu turların 28, 35 ve 35'i yalnız boşluktan gelir.
  Altyapıda iki boşluk kalemi toplam turun tam yarısını yazar.
- Sekiz olaydan 4, 5 ve 4'ü veri kaybıyla kapanır; hizmet modelini derinleştirmek bu sayıyı
  düşürmez, çünkü boşluk kalemleri olay yollarının üstünde dağınık durur.
- Çakışma boşluktan ucuzdur: kalem sayıları eşitken platformda çakışma 10, boşluk 35 tur üretir.
  Devir derinleştikçe çakışma azalır, boşluk artar.
- Çıkışta taşınan kalem oranı %75, %33 ve %17'dir; yeniden pazarlık edilecek kalemlerin 4, 8 ve
  7'si zaten boşlukta ya da çakışmadadır.

#### Sonraki Adım

Bu konu kiralamayı beş kez ölçtü: kapasitenin ne kadar çabuk geldiğini, kaç kararın devredildiğini,
iş yükünün hangi düzene sığdığını, hesabın kaç kalemi sakladığını ve sorumluluk sınırının nereden
geçtiğini. Sınır artık çizilidir ve kimin neyi yaptığı — ve kimsenin yapmadığı — yazılıdır.

Yine de bütün bu ölçümlerde bir soru hiç sorulmadı: kiralanan şey **fiziksel olarak nerede
duruyor**. Sorumluluk matrisindeki `fiziksel-guvenlik` satırı üç modelde de sağlayıcıdadır, ama
sağlayıcının o kalemi hangi coğrafyada, kaç ayrı yerde ve hangi arıza sınırlarıyla tuttuğu
sorulmadı. Bir arıza olduğunda ayakta kalanı belirleyen şey sorumluluk tablosu değil, kiralanan
kaynağın **nerede durduğudur**. Sonraki konu bu soruyla başlar.

## Altyapı Coğrafyası ve Tasarım İlkeleri

Kiralanan kapasitenin nerede durduğu ve nasıl fiyatlandığı: bölge ile erişilebilirlik alanının arıza alanı olarak ayrılması, kullanıcıya yakınlık için kenar konumları, tasarım çerçevesinin sütunlarının birbirini kısıtlaması, isteğe bağlı, ayrılmış ve kesintili kapasitenin fiyat ile risk dengesi ve yeniden barındırma, platform değiştirme ile yeniden mimari göç stratejilerinin bedeli.

### Bölgeler ve Erişilebilirlik Alanları

Source: https://academia.sh/tr/kurslar/bulut-temelleri/bolgeler-ve-erisilebilirlik-alanlari

Kiralanan kalemin fiziksel olarak nerede durduğunun sayılması: tek alana yerleşimde bir alan kaybının ayakta bıraktığı kalem, iki ve üç alana yayılmanın fazladan kapasite bedeli, bölge kaybının alan yayılımından bağımsız kalması ve bölgeler arası gecikmenin gecelik toplu işe eklediği süre.

Önceki ders sorumluluk sınırını çizdi: hangi kalemin bakımı sağlayıcıda, hangisi kiracıda, hangisi
ikisinin de öteki yapıyor sandığı boşlukta. Sınır çizildi, ama bir soru sorulmadan kaldı —
kiralanan şey **fiziksel olarak nerede duruyor**. Bir kira sözleşmesi hangi binada ve hangi
elektrik hattında oturulduğunu söylemez; oysa o hat kesildiğinde hizmetin ne kadarının ayakta
kaldığı bu bilgiye bağlıdır.

**Erişilebilirlik alanı**, kendi gücü, soğutması ve ağ girişi olan, komşusuyla aynı anda düşmeyecek
biçimde ayrılmış bir yerleşim birimidir. **Bölge**, birbirine düşük gecikmeli bağlarla bağlanmış
böyle alanların kümesidir. İkisi arasındaki fark bir coğrafya sorusu değil bir **arıza alanı
ayrımı** sorusudur: iki kalem aynı alandaysa aynı arıza ikisini birlikte alır, ayrı alanlardaysa
almaz. Bu dersin ölçtüğü şey o ayrımın karşılığı ve bedelidir. Dağıtım damgası ve coğrafi kopya
ölçümü Dayanıklılık Kalıpları kursunda yapıldı; burada tekrarlanmaz.

#### Yerleşim Modeli

Aşağıdaki düzenek bir **modeldir**. Kurgu bölgesel ölçüm ağının kalemleri — su sayacı okuma
toplayıcı, doğrulayıcı, faturalama, iş emri servisi, depolar ve gecelik toplu iş — kapsamlarına
göre etiketlenir. Gerçek bir bölge, alan ya da sağlayıcı yoktur; kapasite sayıları kurgu bir
`birim/saat` cinsindendir.

- **BC1.** Bu modelde bir bölge, bağımsız güç, soğutma ve ağ girişi olan üç erişilebilirlik
  alanından oluşur. Gerçek sağlayıcılarda alan sayısı — ve bir bölgede alan bulunup bulunmadığı —
  sağlayıcıdan sağlayıcıya değişir.
- **BC2.** Ağın 13 kalemi vardır ve her kalem alan, bölge ya da küresel kapsamlıdır.
- **BC3.** Alan kapsamlı kalemin hangi alana konacağını kiracı seçer. Bölge ve küresel kapsamlı
  kalemi sağlayıcı dağıtır; dağıtımın ayrıntısı kiracıya görünmez ve sınanamaz.
- **BC4.** Bir alan kaybı o alandaki bütün kalemleri aynı anda alır; iki alan aynı anda düşmez.

```js
// cografya/model.mjs — bolge/alan yerlesimi MODELIDIR: kurgu olcum aginin kalemleri, kapsamlari
// ve taban kapasiteleri. Gercek bolge, alan ya da saglayici yoktur; butun sayilar kurgudur.
export const ALAN = ["a1", "a2", "a3"];        // bir bolgedeki ayri ariza alanlari (kurgu)

// ad, kapsam, taban kapasite (kurgu birim/saat), yazma ucu tekil mi
export const KALEM = [
  ["okuma-toplayici", "alan", 12, false], ["abone-ucu", "alan", 6, false],
  ["faturalama", "alan", 4, false], ["is-emri-servisi", "alan", 3, false],
  ["okuma-deposu", "alan", 8, true], ["tarife-deposu", "alan", 2, true],
  ["gecelik-toplu-is", "alan", 5, true], ["dogrulayici", "bolge", 6, false],
  ["ham-okuma-deposu", "bolge", 3, false], ["okuma-kuyrugu", "bolge", 2, false],
  ["yuk-dagitici", "bolge", 2, false], ["anahtar-yonetimi", "bolge", 1, false],
  ["ad-cozumleme", "kuresel", 1, false],
];

export const kapsamli = (k) => KALEM.filter(([, k2]) => k2 === k);
export const TABAN = kapsamli("alan").reduce((a, [, , c]) => a + c, 0);       // 40 birim
export const BOLGE_KIRA = kapsamli("bolge").reduce((a, [, , c]) => a + c, 0); // dagitimi saglayicida
export const KURESEL_KIRA = kapsamli("kuresel").reduce((a, [, , c]) => a + c, 0);

// n alana yayilan bir yerlesimde bir alan kaybindan sonra ayakta kalan taban kapasite orani
export const ayaktaOran = (n) => (n - 1) / n;
// kayiptan sonra tam kapasite icin her alana taban/(n-1) konur; toplam kiralanan = TABAN*n/(n-1)
export const carpan = (n) => (n < 2 ? Infinity : n / (n - 1));

export function planOlc(n) {
  const alanKalem = kapsamli("alan").length;
  const ayaktaKalem = n < 2 ? 0 : alanKalem;          // tek alanda kopya yok, hepsi ayni alanda
  const tam = n < 2 ? Infinity : TABAN * carpan(n);
  return {
    n, ayaktaKalem, alanKalem, ayaktaOran: ayaktaOran(n),
    yalin: TABAN + BOLGE_KIRA + KURESEL_KIRA,          // fazladan almadan kiralanan
    tam: n < 2 ? Infinity : tam + BOLGE_KIRA + KURESEL_KIRA,
    fazladan: n < 2 ? Infinity : tam - TABAN,
    yazmaKesen: kapsamli("alan").filter(([, , , t]) => t).length, // yazma ucu tek alandadir
  };
}
```

#### Bir Alan Düştüğünde

Ölçü iki sayıyı birlikte okur: kayıptan sonra **ayakta kalan** ve tam kapasiteyi geri getirmek
için **fazladan kiralanan**. İkincisi olmadan birincisi bir karar taşımaz.

```js
// cografya/olc.mjs — bir alan dustugunde ayakta kalan kalem, ayakta kalan kapasite ve
// tam kapasiteyi geri getirmenin fazladan bedeli; alan sayisi arttikca ikisi birlikte
import { KALEM, TABAN, BOLGE_KIRA, KURESEL_KIRA, kapsamli, planOlc, carpan } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x) => (Number.isFinite(x) ? x.toFixed(2) : "-");
const AD = { 1: "tek-alan", 2: "iki-alan", 3: "uc-alan", 4: "dort-alan" };

console.log(`${KALEM.length} kalem: ${kapsamli("alan").length} alan kapsamli, ` +
  `${kapsamli("bolge").length} bolge kapsamli, ${kapsamli("kuresel").length} kuresel.`);
console.log(`alan kapsamli taban kapasite ${TABAN} birim; bolge kapsamli kira ${BOLGE_KIRA}, ` +
  `kuresel kira ${KURESEL_KIRA} birim (kurgu).`);
console.log(`alan secimini kiraci yapmayan kalem: ${KALEM.length - kapsamli("alan").length}`);
console.log();

console.log("plan      | alan | ayakta kalem | ayakta kapasite | yalin kira | tam kapasite kirasi | fazladan");
console.log("----------|------|--------------|-----------------|------------|---------------------|---------");
for (const n of [1, 2, 3, 4]) {
  const p = planOlc(n);
  console.log(`${AD[n].padEnd(9)} | ${s(n, 4)} | ${s(`${p.ayaktaKalem}/${p.alanKalem}`, 12)} | ` +
    `${s(`%${(100 * p.ayaktaOran).toFixed(1)}`, 15)} | ${s(y(p.yalin), 10)} | ` +
    `${s(y(p.tam), 19)} | ${s(y(p.fazladan), 8)}`);
}

console.log();
console.log("alan | carpan | fazladan birim | bir onceki plana gore kazanc");
console.log("-----|--------|----------------|-----------------------------");
let oncekiFazladan = null;
for (const n of [2, 3, 4, 5, 6]) {
  const f = TABAN * carpan(n) - TABAN;
  const kazanc = oncekiFazladan === null ? "-" : y(oncekiFazladan - f);
  console.log(`${s(n, 4)} | ${s(y(carpan(n)), 6)} | ${s(y(f), 14)} | ${s(kazanc, 28)}`);
  oncekiFazladan = f;
}

console.log();
const p2 = planOlc(2);
console.log(`bir alan kaybinda yazma ucu kesilen kalem: ${p2.yazmaKesen}/${kapsamli("alan").length}` +
  ` — yayilma okumayi kurtarir, tekil yazma ucunu kurtarmaz.`);
```

```
13 kalem: 7 alan kapsamli, 5 bolge kapsamli, 1 kuresel.
alan kapsamli taban kapasite 40 birim; bolge kapsamli kira 14, kuresel kira 1 birim (kurgu).
alan secimini kiraci yapmayan kalem: 6

plan      | alan | ayakta kalem | ayakta kapasite | yalin kira | tam kapasite kirasi | fazladan
----------|------|--------------|-----------------|------------|---------------------|---------
tek-alan  |    1 |          0/7 |            %0.0 |      55.00 |                   - |        -
iki-alan  |    2 |          7/7 |           %50.0 |      55.00 |               95.00 |    40.00
uc-alan   |    3 |          7/7 |           %66.7 |      55.00 |               75.00 |    20.00
dort-alan |    4 |          7/7 |           %75.0 |      55.00 |               68.33 |    13.33

alan | carpan | fazladan birim | bir onceki plana gore kazanc
-----|--------|----------------|-----------------------------
   2 |   2.00 |          40.00 |                            -
   3 |   1.50 |          20.00 |                        20.00
   4 |   1.33 |          13.33 |                         6.67
   5 |   1.25 |          10.00 |                         3.33
   6 |   1.20 |           8.00 |                         2.00

bir alan kaybinda yazma ucu kesilen kalem: 3/7 — yayilma okumayi kurtarir, tekil yazma ucunu kurtarmaz.
```

Birinci satır bu dersin en sert sayısıdır: tek alana yerleşimde bir alan düştüğünde ayakta kalan
kalem **0/7** ve ayakta kalan kapasite **yüzde 0**. Yedeklilik ya da yeniden başlatma politikası bu
satırı değiştirmez: kaybedilen şey kopya değil, kopyaların oturduğu **tek** arıza alanıdır.

İki alana yayılınca ayakta kalan kalem 7/7 oluyor, ama ayakta kalan kapasite yüzde 50'de kalıyor:
kalemin var olması ile yükü kaldırması ayrı sayılardır. Kayıptan sonra tam kapasite isteniyorsa her
alanın tek başına bütün yükü taşıması gerekir ve kiralanan 55 birimden **95 birime** çıkar. Üçüncü
sütun asıl kararı veriyor: üç alana yayılan aynı güvence **75 birime** düşüyor. Alan sayısı arttıkça
her alana düşen pay $1/(n-1)$ ile küçüldüğü için **üç alan iki alandan 20 birim ucuza aynı işi
yapıyor** — arıza alanı eklemek kapasite bedelini artırmaz, düşürür.

İkinci tablo bu düşüşün nerede durduğunu gösteriyor. Fazladan bedel ikiden üçe geçişte 20 birim
azalıyor, üçten dörde geçişte 6,67, dörtten beşe 3,33. Dördüncü alan üçüncünün kazandırdığının
üçte birini kazandırıyor; **azalan getiri noktası üç alandır** ve dördüncü alanın gerekçesi
kapasite bedeli değil, artık başka bir şey olmak zorundadır.

Son satır yayılmanın karşılamadığı yeri adlandırıyor. Yedi kalemin üçünde yazma ucu tekildir; o uç
hangi alandaysa, o alanın kaybı okuma trafiğini değil ama **yazmayı** kesintiye uğratır. Alanlara
yayılmak 7/7 kalemi ayakta tutarken 3/7 kalemin yazma yolunu ayakta tutmaz.

#### Bölge Düştüğünde ve Eşzamanlı Yazmanın Bedeli

Alan ayrımı bir bölgenin **içindeki** arızayı böler. Bölgenin kendisi — ortak ağ girişi, ortak
denetim düzlemi, ortak coğrafya — bölünmez.

- **BC5.** Bir bölgedeki alanlar arası gidiş-dönüş 1,2 ms, iki bölge arası 68 ms (kurgu).
- **BC6.** Gecelik toplu iş 480.000 okuma kaydı yazar, paralellik 8, pencere 240 dk; tepe gün
  hacmi üç katıdır. Taban yazma süresi 4,0 ms.

```js
// cografya/bolge.mjs — bolge kaybi alan yayilimindan bagimsizdir; bolgeler arasi gecikme
// eszamanli yazmaya bir sayiyla baglanir. Sureler MODELDEN turetilir, saat okunmaz.
import { KALEM, TABAN, BOLGE_KIRA, KURESEL_KIRA, kapsamli, planOlc } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 2) => x.toFixed(n);
const KAYIT = 480_000, PARALEL = 8, PENCERE = 240, TEPE = 3;  // kurgu: gecelik toplu is
const YAZMA = 4.0, ALAN_RTT = 1.2, BOLGE_RTT = 68.0;          // kurgu ms

console.log("plan      | alan kaybinda ayakta | bolge kaybinda ayakta | tek bolge kira | iki bolge kira");
console.log("----------|----------------------|-----------------------|----------------|---------------");
for (const n of [1, 2, 3]) {
  const p = planOlc(n);
  const kira = Number.isFinite(p.tam) ? p.tam : p.yalin;
  console.log(`${["tek-alan", "iki-alan", "uc-alan"][n - 1].padEnd(9)} | ` +
    `${s(`${p.ayaktaKalem}/${KALEM.length}`, 20)} | ${s(`${kapsamli("kuresel").length}/${KALEM.length}`, 21)} | ` +
    `${s(y(kira), 14)} | ${s(y(2 * kira - KURESEL_KIRA), 14)}`);
}
console.log(`bolge kaybi uc planda da ayni: yalniz kuresel kalem ayakta.`);
console.log();

console.log("yazma duzeni          | gidis-donus | yazma suresi | verim (yazma/s) | toplu is | tepe gun");
console.log("----------------------|-------------|--------------|-----------------|----------|---------");
for (const [ad, rtt] of [["alan ici", 0], ["alanlar arasi", ALAN_RTT], ["bolgeler arasi", BOLGE_RTT]]) {
  const sure = YAZMA + rtt;
  const dk = (KAYIT * sure) / PARALEL / 60_000;
  console.log(`${ad.padEnd(21)} | ${s(y(rtt) + " ms", 11)} | ${s(y(sure) + " ms", 12)} | ` +
    `${s(y((1000 / sure) * PARALEL), 15)} | ${s(y(dk) + " dk", 8)} | ${s(y(TEPE * dk) + " dk", 8)}`);
}
console.log(`pencere ${PENCERE} dk; tepe gunde bolgeler arasi eszamanli yazma penceresinin ` +
  `%${y((100 * TEPE * KAYIT * (YAZMA + BOLGE_RTT)) / PARALEL / 60_000 / PENCERE, 1)}'ini kullanir.`);
console.log();

console.log("kapsam   | kalem |  kira | yerlesim karari | kayip sinanabilir | cikista tasinan");
console.log("---------|-------|-------|-----------------|-------------------|----------------");
for (const [k, kira] of [["alan", TABAN], ["bolge", BOLGE_KIRA], ["kuresel", KURESEL_KIRA]]) {
  const kiraci = k === "alan";
  console.log(`${k.padEnd(8)} | ${s(kapsamli(k).length, 5)} | ${s(y(kira), 5)} | ` +
    `${(kiraci ? "kiraci" : "saglayici").padEnd(15)} | ${(kiraci ? "evet" : "hayir").padEnd(17)} | ` +
    `${kiraci ? "evet" : "hayir"}`);
}
const devir = KALEM.length - kapsamli("alan").length;
console.log(`devredilen yerlesim karari ${devir}/${KALEM.length}; ` +
  `bunlarin kirasi ${y(BOLGE_KIRA + KURESEL_KIRA)} birim ve fazladan kapasite bedeli 0.`);
```

```
plan      | alan kaybinda ayakta | bolge kaybinda ayakta | tek bolge kira | iki bolge kira
----------|----------------------|-----------------------|----------------|---------------
tek-alan  |                 0/13 |                  1/13 |          55.00 |         109.00
iki-alan  |                 7/13 |                  1/13 |          95.00 |         189.00
uc-alan   |                 7/13 |                  1/13 |          75.00 |         149.00
bolge kaybi uc planda da ayni: yalniz kuresel kalem ayakta.

yazma duzeni          | gidis-donus | yazma suresi | verim (yazma/s) | toplu is | tepe gun
----------------------|-------------|--------------|-----------------|----------|---------
alan ici              |     0.00 ms |      4.00 ms |         2000.00 |  4.00 dk | 12.00 dk
alanlar arasi         |     1.20 ms |      5.20 ms |         1538.46 |  5.20 dk | 15.60 dk
bolgeler arasi        |    68.00 ms |     72.00 ms |          111.11 | 72.00 dk | 216.00 dk
pencere 240 dk; tepe gunde bolgeler arasi eszamanli yazma penceresinin %90.0'ini kullanir.

kapsam   | kalem |  kira | yerlesim karari | kayip sinanabilir | cikista tasinan
---------|-------|-------|-----------------|-------------------|----------------
alan     |     7 | 40.00 | kiraci          | evet              | evet
bolge    |     5 | 14.00 | saglayici       | hayir             | hayir
kuresel  |     1 |  1.00 | saglayici       | hayir             | hayir
devredilen yerlesim karari 6/13; bunlarin kirasi 15.00 birim ve fazladan kapasite bedeli 0.
```

Birinci tablonun ikinci sütunu üç satırda da aynı: bölge kaybında ayakta kalan kalem **1/13** ve
ayakta kalan tek kalem ad çözümlemesidir. Alan ayrımına ödenen 20 ya da 40 birim bu sütunu bir
kalem bile oynatmıyor. İkinci bölgede tam kopya tutmak üç alanlı planda kirayı 75'ten **149
birime** çıkarıyor, yani alan ayrımının bedelinin yaklaşık dört katı. Arıza alanı ayrımı
katmanlıdır ve her katmanın bedeli ayrı ödenir.

İkinci tablo o bedelin gizli kısmını gösteriyor. Alanlar arası 1,2 ms'lik gidiş-dönüş bir eşzamanlı
yazmayı 4,0 ms'den 5,2 ms'ye çıkarıyor; toplu iş 4,00 dakikadan 5,20 dakikaya uzuyor — yüzde 30'luk
bir artış, 240 dakikalık pencerede fark etmez. Bölgeler arası 68 ms aynı yazmayı **72,0 ms** yapıyor
ve yazma verimi 2000'den **111,11 yazma/s**'ye düşüyor. Toplu iş 72 dakikaya çıkıyor; tepe günde
216 dakika ile pencerenin **yüzde 90'ını** yiyor ve elde 24 dakika kalıyor. Bölgeler arası eşzamanlı
yazma bir dayanıklılık kararı gibi görünür, ama faturayı kesen yer gecelik toplu işin penceresidir.

#### Devredilen Karar ve Çıkışta Taşınan

Üçüncü tablo bu dersin kiralama defteridir. On üç kalemin **7'sinde** yerleşim kararı kiracıdadır:
hangi alana kaç kopya konacağı yazılabilir, sınanabilir ve bir alan düşürülerek ölçülebilir. Kalan
**6 kalemde** karar devredilmiştir; bunların kapsamı bölge ya da küreseldir ve hangi alanlara nasıl
dağıtıldıkları kiracıya görünmez.

Devrin karşılığı iki kalemdir. Birincisi, 15 birimlik kira içinde alanlar arası dağıtımın da
bulunması: kiracı bu 6 kalem için **0 fazladan kapasite** ödüyor, oysa aynı yedekliliği kendi
kursaydı üç alanlı planda yüzde 50 fazladan öderdi. İkincisi, bu 6 kalemin işletim yükünün hiç
görünmemesi. Devrin bedeli üçüncü sütundur: kayıp **sınanamaz**. Bir alanı düşürüp ölçmek yalnız
7 kalemde mümkündür; 6 kalem için elde yalnız sağlayıcının sözü vardır.

Çıkışta taşınan da aynı ayrımı izliyor. Alan kapsamlı 7 kalemin yerleşim planı bir tanımdır — kaç
kopya, hangi ayrı arıza alanı, kayıptan sonra hangi kapasite — ve bu tanım başka bir kiralamada
aynen kurulabilir. Bölge ve küresel kapsamlı 6 kalemin dağıtımı hiç görünmediği için taşınacak bir
tanım da yoktur; karşı tarafta yeniden ölçülmesi, çoğu durumda yeniden **satın alınması** gerekir.
Kiralanan coğrafyanın yarısına yakını, çıkarken elde kalmıyor.

#### Özet

- Erişilebilirlik alanı bağımsız güç, soğutma ve ağ girişi olan bir yerleşim birimidir; bölge böyle
  alanların düşük gecikmeli kümesidir. Ayrım bir coğrafya değil bir arıza alanı ayrımıdır.
- Tek alana yerleşimde bir alan kaybı 7 alan kapsamlı kalemin **0'ını** ayakta bırakır ve ayakta
  kalan kapasite yüzde 0'dır; iki ve üç alanda 7/7 kalem ayakta kalır, ama yazma ucu tekil olan
  3 kalemin yazma yolu ayakta kalmaz.
- Kayıptan sonra tam kapasite için kiralanan iki alanda 95, üç alanda 75, dört alanda 68,33 birim:
  **üç alan iki alandan 20 birim ucuzdur** ve azalan getiri noktası üçüncü alandır.
- Bölge kaybında ayakta kalan kalem üç planda da 1/13'tür; ikinci bölgede tam kopya üç alanlı
  kirayı 75'ten 149 birime çıkarır.
- Bölgeler arası eşzamanlı yazma bir yazmayı 4,0 ms'den 72,0 ms'ye, gecelik toplu işi 4 dakikadan
  72 dakikaya çıkarır; tepe günde 216 dakika ile 240 dakikalık pencerenin yüzde 90'ını kullanır.
- Yerleşim kararı 13 kalemin 6'sında sağlayıcıya devredilmiştir: fazladan kapasite bedeli 0, ama
  kayıp sınanamaz ve çıkışta taşınacak bir tanım kalmaz.

#### Sonraki Adım

Bu ders coğrafyayı **arıza** tarafından okudu: kalemler nereye konursa bir kayıp neyi alır, ayakta
kalan kaç olur, ayrımın bedeli kaç birimdir. Aynı coğrafyanın ikinci bir yüzü var ve bu derste hiç
ölçülmedi: kalemler nereye konursa **kullanıcıya** ne kadar uzak kalır. Bölgeler arası 68 ms'lik
gidiş-dönüş burada yalnız yazmanın maliyeti olarak göründü; aynı sayı uzaktaki bir aboneye
gönderilen her yanıtın da içindedir ve o abone için hiçbir arıza olmadan da vardır. Sonraki ders
kullanıcı dağılımını ve konum kümesini modelleyip ortalama mesafenin konum ekledikçe nasıl
düştüğünü, konum başına bedeli ve düşüşün nerede durduğunu sayar; ayrıca kullanıcıya yakın konumun
**yapamadığı** işi ve oradan dönen yanıtın bayatlığını ölçer.

### Kenar Konumları

Source: https://academia.sh/tr/kurslar/bulut-temelleri/kenar-konumlari

Kullanıcıya yakınlığın bedelle birlikte sayılması: kenar konumu eklendikçe ortalama mesafenin ve gecikmenin düşüşü, konum başına düşen kazancın nerede durduğu, kenarın karşılayamadığı iş türlerinin payı ve kenardan dönen yanıtın günlük bayatlık sayısı.

Önceki ders coğrafyayı arıza tarafından okudu: kalem nereye konursa bir kayıp neyi alır ve ayrımın
bedeli kaç birimdir. Aynı coğrafyanın ikinci yüzü hiçbir arıza olmadan da vardır. Bir abone
bölgeden ne kadar uzaksa her isteği o kadar uzun yol gider; bu yol her gün, her istekte ödenir ve
hiçbir sağlık denetimine yakalanmaz.

**Kenar konumu**, kaynak bölgeden bağımsız, kullanıcıya yakın duran ve isteklerin bir bölümünü
oradan karşılayan bir yerleşim noktasıdır. Kiralanan şey burada bir makine değil bir **konum
kümesidir**: sağlayıcının işlettiği noktalardan hangilerinin kullanılacağı seçilir, o noktalarda ne
çalışacağı seçilmez. Bu ders yakınlığın karşılığını ve karşılamadığı işi birlikte sayar.

#### Konum Modeli

Aşağıdaki düzenek bir **modeldir**. Kurgu bölgesel ölçüm ağının aboneleri bir kurgu düzlemde
dağıtılır; gerçek bir şehir, ülke, bölge ya da sağlayıcı yoktur.

- **BC7.** Hizmet coğrafyası 1000×600 kurgu birimlik bir dikdörtgendir; bölge (150, 500)
  noktasındadır.
- **BC8.** 40 abone kümesi beş yoğunluk odağı çevresinde üretilir. Üreteç kendi yazılmıştır ve
  tohum 20260802 olarak görünür; her koşum aynı sayıları verir.
- **BC9.** Gecikme mesafeye doğrusaldır: 2,0 ms taban + birim başına 0,075 ms (kurgu).
- **BC10.** Bir kenar konumunun kirası 3,5 kurgu `birim/saat`; bölgenin kirası bu dersin dışındadır.
- **BC11.** Günlük istek 2.400.000 ve yedi türün payları sabittir.
- **BC12.** Yerleşik kenar önbelleğinde isabet oranı 0,93; taşınma sonrası soğuk önbellekte ilk gün
  0,55.

```js
// kenar/model.mjs — kullanici dagilimi ve konum kumesi MODELIDIR. Kurgu hizmet cografyasi
// 1000x600 birimlik bir dikdortgendir; gercek sehir, bolge ya da saglayici yoktur.
export function uretec(tohum) {                  // kendi yazilan dogrusal eslemeli uretec
  let s = tohum >>> 0;
  return () => ((s = (Math.imul(s, 1664525) + 1013904223) >>> 0) / 4294967296);
}
export const TOHUM = 20260802;                   // gorunur tohum; her kosumda ayni sayilar

export const BOLGE = { ad: "bolge", x: 150, y: 500 };
export const TABAN_MS = 2.0, MS_BIRIM = 0.075;   // kurgu: gecikme = taban + mesafe * katsayi
export const KONUM_KIRA = 3.5;                   // kurgu birim/saat, kenar konumu basina

export function abonatlar() {                    // 5 yogunluk odagi, odak basina 8 kume
  const r = uretec(TOHUM);
  const odak = Array.from({ length: 5 }, () => [r() * 1000, r() * 600]);
  const k = [];
  for (const [ox, oy] of odak)
    for (let i = 0; i < 8; i += 1)
      k.push({
        x: Math.min(1000, Math.max(0, ox + (r() + r() - 1) * 130)),
        y: Math.min(600, Math.max(0, oy + (r() + r() - 1) * 90)),
        agirlik: 1 + Math.floor(r() * 9),        // istek payi, 1..9
      });
  return k;
}

export function adaylar() {                      // saglayicinin sundugu kenar konumu kumesi
  const r = uretec(TOHUM ^ 0x5f5f);
  return Array.from({ length: 14 }, (_, i) => ({ ad: `k${i + 1}`, x: r() * 1000, y: r() * 600 }));
}

export const mesafe = (a, b) => Math.hypot(a.x - b.x, a.y - b.y);
export const gecikme = (d) => TABAN_MS + MS_BIRIM * d;

export function ortalama(kumeler, konumlar) {    // her kume en yakin konumdan karsilanir
  let ag = 0, top = 0;
  for (const c of kumeler) {
    top += c.agirlik * Math.min(...konumlar.map((k) => mesafe(c, k)));
    ag += c.agirlik;
  }
  return top / ag;
}

// istek karmasi: kenardan donebilen turler ve donemeyenler (yazma, tutarlilik isteyen okuma)
export const KARMA = [
  ["statik-kabuk", 0.28, "kenar", 3600, 0.2],
  ["tarife-tablosu", 0.10, "kenar", 900, 2],
  ["abone-ozeti", 0.08, "kenar", 60, 96],
  ["son-okuma", 0.26, "tutarli-okuma", 0, 0],
  ["okuma-yukleme", 0.18, "yazma", 0, 0],
  ["is-emri-acma", 0.06, "yazma", 0, 0],
  ["fatura-kesme", 0.04, "yazma", 0, 0],
];
export const GUNLUK = 2_400_000, GUN_SN = 86_400;
export const ISABET = 0.93, SOGUK_ISABET = 0.55;
```

#### Konum Eklendikçe

Konumlar açgözlü eklenir: her adımda ortalama ağırlıklı mesafeyi en çok düşüren aday seçilir. Her
adımda kazanç ve kira birlikte yazılır.

```js
// kenar/yerlesim.mjs — konum eklendikce ortalama mesafe, gecikme ve konum basina bedel birlikte
import { BOLGE, abonatlar, adaylar, ortalama, gecikme, KONUM_KIRA, TOHUM } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 2) => x.toFixed(n);
const kume = abonatlar(), aday = adaylar();
const secili = [BOLGE], kalan = [...aday];
const agirlik = kume.reduce((a, c) => a + c.agirlik, 0);

console.log(`tohum ${TOHUM}: ${kume.length} abone kumesi, toplam agirlik ${agirlik}, ` +
  `${aday.length} aday kenar konumu (kurgu cografya).`);
console.log();
console.log("konum | eklenen | ort. mesafe | ort. gecikme | kazanc ms | kira | birim basina ms | toplam kira");
console.log("------|---------|-------------|--------------|-----------|------|-----------------|------------");

let oncekiG = gecikme(ortalama(kume, secili));
console.log(`${s(0, 5)} | ${"-".padEnd(7)} | ${s(y(ortalama(kume, secili)), 11)} | ` +
  `${s(y(oncekiG), 12)} | ${s("-", 9)} | ${s("-", 4)} | ${s("-", 15)} | ${s(y(0), 11)}`);

for (let n = 1; n <= 8; n += 1) {
  let enIyi = null;
  for (const a of kalan) {
    const d = ortalama(kume, [...secili, a]);
    if (enIyi === null || d < enIyi.d) enIyi = { a, d };
  }
  secili.push(enIyi.a);
  kalan.splice(kalan.indexOf(enIyi.a), 1);
  const g = gecikme(enIyi.d), kazanc = oncekiG - g;
  console.log(`${s(n, 5)} | ${enIyi.a.ad.padEnd(7)} | ${s(y(enIyi.d), 11)} | ${s(y(g), 12)} | ` +
    `${s(y(kazanc), 9)} | ${s(y(KONUM_KIRA), 4)} | ${s(y(kazanc / KONUM_KIRA), 15)} | ` +
    `${s(y(n * KONUM_KIRA), 11)}`);
  oncekiG = g;
}
```

```
tohum 20260802: 40 abone kumesi, toplam agirlik 210, 14 aday kenar konumu (kurgu cografya).

konum | eklenen | ort. mesafe | ort. gecikme | kazanc ms | kira | birim basina ms | toplam kira
------|---------|-------------|--------------|-----------|------|-----------------|------------
    0 | -       |      338.60 |        27.39 |         - |    - |               - |        0.00
    1 | k2      |      215.03 |        18.13 |      9.27 | 3.50 |            2.65 |        3.50
    2 | k12     |      172.38 |        14.93 |      3.20 | 3.50 |            0.91 |        7.00
    3 | k13     |      146.26 |        12.97 |      1.96 | 3.50 |            0.56 |       10.50
    4 | k3      |      137.53 |        12.31 |      0.65 | 3.50 |            0.19 |       14.00
    5 | k7      |      134.13 |        12.06 |      0.26 | 3.50 |            0.07 |       17.50
    6 | k14     |      131.84 |        11.89 |      0.17 | 3.50 |            0.05 |       21.00
    7 | k1      |      130.96 |        11.82 |      0.07 | 3.50 |            0.02 |       24.50
    8 | k9      |      130.41 |        11.78 |      0.04 | 3.50 |            0.01 |       28.00
```

İlk konum tek başına ortalama gecikmeyi 27,39 ms'den 18,13 ms'ye indiriyor: 3,5 birimlik kira
karşılığında 9,27 ms, yani **birim başına 2,65 ms**. İkinci konum aynı kirayla 3,20 ms, üçüncüsü
1,96 ms getiriyor. Dördüncüde birim başına kazanç 0,19 ms'ye düşüyor — üçüncünün üçte biri,
ilkinin on dörtte biri.
**Azalan getiri noktası üçüncü konumdur.**

Sınırın sertliği son satırlarda görünüyor. Üç konum 10,50 birim kirayla gecikmeyi 12,97 ms'ye
indiriyor; sekiz konum 28,00 birim kirayla 11,78 ms'ye. Fazladan beş konum ve 17,50 birim, toplam
1,19 ms kazandırıyor. Eğri düzleşiyor çünkü konum sayısı arttıkça yeni aday, çoğunluğu zaten
karşılanmış bir kümenin artıklarına yaklaşıyor; kullanıcı dağılımı odaklıysa ilk üç odak alındıktan
sonra alınacak yoğunluk kalmıyor.

#### Kenarın Yapamadığı İş

Yukarıdaki tablo bütün isteklerin kenardan karşılandığını varsayıyor ve bu varsayım yanlıştır.
Kenar konumu bir kopyadır; **yazma** işlemini kabul edemez, çünkü kabul ettiği anda kayıt kaynakla
ayrışır. **Tutarlılık isteyen okuma** da dönemez: bir abonenin az önce yüklediği okumayı sorması,
kaynağın en son durumunu gerektirir.

```js
// kenar/karma.mjs — kenarin yapamadigi is, karma gercek gecikme ve kenardan donen yanitin bayatligi
import { BOLGE, abonatlar, adaylar, ortalama, gecikme, KARMA, GUNLUK, GUN_SN, ISABET,
  SOGUK_ISABET, KONUM_KIRA } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 2) => x.toFixed(n);
const kume = abonatlar(), aday = adaylar();
const secili = [BOLGE];                            // acgozlu secimin ilk uc konumu yeniden kurulur
for (let n = 0; n < 3; n += 1) {
  let e = null;
  for (const a of aday)
    if (!secili.includes(a)) {
      const d = ortalama(kume, [...secili, a]);
      if (e === null || d < e.d) e = { a, d };
    }
  secili.push(e.a);
}
const KENAR_MS = gecikme(ortalama(kume, secili)), BOLGE_MS = gecikme(ortalama(kume, [BOLGE]));

console.log("tur            |  pay | kenardan doner | TTL (sn) | gunluk degisim | bayat oran | gunluk bayat");
console.log("---------------|------|----------------|----------|----------------|------------|-------------");
let bayatTop = 0, kenarPay = 0;
for (const [ad, pay, sinif, ttl, degisim] of KARMA) {
  const oran = sinif === "kenar" ? (degisim * (ttl / 2)) / GUN_SN : 0;
  const bayat = Math.round(pay * GUNLUK * ISABET * oran);
  bayatTop += bayat; kenarPay += sinif === "kenar" ? pay : 0;
  console.log(`${ad.padEnd(14)} | ${s(y(pay), 4)} | ${s(sinif === "kenar" ? "evet" : sinif, 14)} | ` +
    `${s(ttl || "-", 8)} | ${s(degisim || "-", 14)} | ${s(oran ? `%${y(100 * oran)}` : "-", 10)} | ` +
    `${s(bayat || "-", 12)}`);
}

const kacirma = KENAR_MS + BOLGE_MS;
const kenarKarma = ISABET * KENAR_MS + (1 - ISABET) * kacirma;
const karma = kenarPay * kenarKarma + (1 - kenarPay) * BOLGE_MS;
console.log();
console.log(`kenardan donebilen pay ${y(kenarPay)}; donemeyen ${y(1 - kenarPay)} (yazma + tutarli okuma).`);
console.log(`gecikme: bolge ${y(BOLGE_MS)} ms, uc konumlu kenar ${y(KENAR_MS)} ms, ` +
  `kacirmada ${y(kacirma)} ms, isabet ${ISABET} ile kenar ortalamasi ${y(kenarKarma)} ms.`);
console.log(`karma gercek gecikme ${y(karma)} ms — dusus ${y(BOLGE_MS - karma)} ms ` +
  `(%${y((100 * (BOLGE_MS - karma)) / BOLGE_MS, 1)}), oysa yalniz kenar sayilsaydi ` +
  `%${y((100 * (BOLGE_MS - KENAR_MS)) / BOLGE_MS, 1)} gorunurdu.`);
console.log(`gunluk bayat yanit ${bayatTop.toLocaleString("tr-TR")} / ${GUNLUK.toLocaleString("tr-TR")} ` +
  `(%${y((100 * bayatTop) / GUNLUK, 2)}); en uzun bayatlik ${Math.max(...KARMA.map((k) => k[3]))} sn.`);

const yerlesik = GUNLUK * (1 - kenarPay + kenarPay * (1 - ISABET));
const soguk = GUNLUK * (1 - kenarPay + kenarPay * (1 - SOGUK_ISABET));
console.log(`kaynaga giden istek: yerlesik onbellekle ${Math.round(yerlesik).toLocaleString("tr-TR")}, ` +
  `tasinma sonrasi soguk onbellekle ${Math.round(soguk).toLocaleString("tr-TR")} ` +
  `(+%${y((100 * (soguk - yerlesik)) / yerlesik, 1)}); uc konumun kirasi ${y(3 * KONUM_KIRA)} birim.`);
```

```
tur            |  pay | kenardan doner | TTL (sn) | gunluk degisim | bayat oran | gunluk bayat
---------------|------|----------------|----------|----------------|------------|-------------
statik-kabuk   | 0.28 |           evet |     3600 |            0.2 |      %0.42 |         2604
tarife-tablosu | 0.10 |           evet |      900 |              2 |      %1.04 |         2325
abone-ozeti    | 0.08 |           evet |       60 |             96 |      %3.33 |         5952
son-okuma      | 0.26 |  tutarli-okuma |        - |              - |          - |            -
okuma-yukleme  | 0.18 |          yazma |        - |              - |          - |            -
is-emri-acma   | 0.06 |          yazma |        - |              - |          - |            -
fatura-kesme   | 0.04 |          yazma |        - |              - |          - |            -

kenardan donebilen pay 0.46; donemeyen 0.54 (yazma + tutarli okuma).
gecikme: bolge 27.39 ms, uc konumlu kenar 12.97 ms, kacirmada 40.36 ms, isabet 0.93 ile kenar ortalamasi 14.89 ms.
karma gercek gecikme 21.64 ms — dusus 5.75 ms (%21.0), oysa yalniz kenar sayilsaydi %52.7 gorunurdu.
gunluk bayat yanit 10.881 / 2.400.000 (%0.45); en uzun bayatlik 3600 sn.
kaynaga giden istek: yerlesik onbellekle 1.373.280, tasinma sonrasi soguk onbellekle 1.792.800 (+%30.5); uc konumun kirasi 10.50 birim.
```

Kenardan dönebilen pay **0,46**; kalan 0,54 yazma ile tutarlılık isteyen okumadır ve konum sayısı
kaç olursa olsun bölgeye gider. Bu yüzden karma gerçek gecikme 21,64 ms'de kalıyor ve düşüş
**yüzde 21,0** oluyor — yalnız kenar sütununa bakan bir ölçüm ise yüzde 52,7 raporlardı. İki sayı
arasındaki fark bir ölçüm hatası değil, hangi işin kenardan dönebildiği sorusunun cevabıdır.

Kaçırma satırı ikinci bir uyarı taşıyor. Önbellekte bulunmayan bir istek kenara gidip oradan
kaynağa geçtiği için 40,36 ms'ye çıkıyor, yani bölgeye doğrudan gitmekten daha uzun. Kenar
konumu her isteği hızlandırmaz; **isabet ettiklerini** hızlandırır, kaçırdıklarını yavaşlatır.

#### Bayatlık ve Çıkışta Taşınan

Kenardan dönen bir yanıt tanımı gereği bir kopyadır ve kopyanın yaşı vardır. Ölçü, önbellek
ömrünün ve verinin değişim sıklığının çarpımıdır: abone özeti 60 saniyelik ömürle günde 96 kez
değişiyor ve isteklerin **yüzde 3,33'ü** bayat dönüyor; tarife tablosu 900 saniye ve günde 2
değişimle yüzde 1,04; statik kabuk 3600 saniye ama günde 0,2 değişimle yüzde 0,42. Sıralama önbellek
ömrünün değil, ömür ile değişim hızının **çarpımının** sıralamasıdır.

Toplamda günde **10.881 bayat yanıt** dönüyor. Bütün isteklerin yüzde 0,45'i olan bu sayı, kabul
edilip edilmeyeceği kararının verilebilmesi için önce yazılması gereken sayıdır; en uzun bayatlık
3600 saniyedir ve bu, tarifesi az önce değişmiş bir abonenin bir saate kadar eski tarifeyi
görebileceği anlamına gelir.

Devredilen karar burada üç kalemdir: hangi konumların işletildiği, bir isteğin hangi konuma
yönlendirildiği ve bir girdinin önbellekten ne zaman çıkarıldığı. Karşılığında alınan, 10,50
birimlik kirayla 5,75 ms'lik karma düşüş ve kaynağa giden isteğin 2.400.000'den 1.373.280'e
inmesidir. Çıkışta taşınan ise yalnız **kurallardır**: üç tür için önbellek ömrü, anahtar ve
geçersizleştirme tanımı yazılıp aynen kurulabilir. Taşınamayan iki şey var — sağlayıcının konum
kümesi ve **ısınmış içerik**. Soğuk önbellekle ilk gün kaynağa giden istek 1.792.800'e, yani
**yüzde 30,5** yukarı çıkıyor; taşınmanın bedeli bir kereliğine bu farktır.

#### Özet

- Kenar konumu bir konum kümesi kiralamaktır: hangi noktaların kullanılacağı seçilir, o noktalarda
  ne çalışacağı seçilmez.
- Ortalama gecikme ilk konumda 27,39 ms'den 18,13 ms'ye iner; birim başına kazanç 2,65 ms'den
  üçüncü konumda 0,56 ms'ye, dördüncüde 0,19 ms'ye düşer — **azalan getiri noktası üçüncü konumdur**.
- Üç konum 10,50 birimle 12,97 ms verirken sekiz konum 28,00 birimle 11,78 ms verir: fazladan
  17,50 birim toplam 1,19 ms kazandırır.
- Kenardan dönemeyen pay 0,54'tür (yazma ve tutarlılık isteyen okuma); karma gerçek gecikme düşüşü
  yüzde 21,0 iken yalnız kenar sayılsaydı yüzde 52,7 görünürdü. Kaçırılan istek 40,36 ms ile
  bölgeye doğrudan gitmekten yavaştır.
- Bayatlık ömür ile değişim hızının çarpımıdır: abone özeti yüzde 3,33, tarife tablosu yüzde 1,04,
  statik kabuk yüzde 0,42; günde 10.881 bayat yanıt ve en uzun bayatlık 3600 saniye.
- Çıkışta önbellek kuralları taşınır, konum kümesi ve ısınmış içerik taşınmaz: soğuk başlangıçta
  kaynağa giden istek yüzde 30,5 artar.

#### Sonraki Adım

İki ders iki ekseni ayrı ayrı ölçtü ve ikisi birbirini çekiştiriyor. Üç alana yayılmak
dayanıklılığı yükseltti, eşzamanlı yazmayı yavaşlattı. Üç kenar konumu gecikmeyi düşürdü, günde
10.881 bayat yanıt ve 10,50 birimlik kira üretti. Her kararın bir kazanç ve en az bir kayıp
sütunu var, ama bu sütunlar şimdiye kadar ders ders ve dağınık sayıldı. Kararları tek bir tabloda
tutan, her birini aynı beş ölçüte göre puanlayan ve hangi ölçütün hangisiyle çeliştiğini görünür
kılan bir düzen var. Sonraki ders o beş sütunu tür olarak tanımlar ve bir karar kümesini üzerinde
puanlayarak sütunlar arası gerilimi sayar: bir sütunu yükselten kaç karar başka bir sütunu
düşürüyor ve hiçbir kararın iyileştirmediği sütun hangisi.

### Tasarım Çerçevesinin Sütunları

Source: https://academia.sh/tr/kurslar/bulut-temelleri/iyi-tasarlanmis-cerceve

Bir karar kümesinin beş sütunda puanlanması ve sütunlar arası gerilimin sayılması: kaç kararın bir sütunu yükseltirken başkasını düşürdüğü, en gergin sütun çiftinin hangisi olduğu, hiçbir kararın iyileştirmediği sütunun çıkarılması ve devredilen kararların sütun profili ile çıkışta taşınamayan payı.

İlk iki ders coğrafyayı iki ayrı eksende ölçtü ve her ikisi de aynı yapıda bitti: bir karar bir
sayıyı yükseltti, başka bir sayıyı düşürdü. Üç alana yayılmak ayakta kalan kalemi yükseltti, kirayı
ve eşzamanlı yazma süresini bozdu. Üç kenar konumu gecikmeyi düşürdü, günde on binden fazla bayat
yanıt üretti. Bu iki gözlem tek başına birer anekdottur; bir karar defterine dönüşmeleri için aynı
ölçütlerle ve aynı biçimde yazılmaları gerekir.

Kiralanan altyapıyı değerlendirmek için kullanılan tasarım çerçeveleri tam olarak bunu yapar. Bir
kararı iyi ya da kötü diye değil, **ayrı sütunlarda ayrı ayrı** puanlarlar. Bu ders beş sütun
kullanır — işletim, güvenlik, güvenilirlik, başarım ve maliyet — çünkü bu beşi yaygın çerçevelerin
ortak çekirdeğidir; sütun sayısı çerçeveden çerçeveye değişir ve kimi çerçeve buna sürdürülebilirlik
gibi altıncı bir sütun ekler. Çerçevenin adı bu derste geçmez; ölçülen şey ad değil, sütunların
birbirini nasıl kısıtladığıdır. Aynı biçimde bir gerilim matrisi önceki bir kursta nitelik
ölçütleri için kurulmuştu; yöntem aynıdır, oradaki sayılar buraya taşınmaz.

#### Beş Sütun ve Karar Kümesi

- **BC13.** Sütunlar tür adıyla anılır: işletim, güvenlik, güvenilirlik, başarım, maliyet.
- **BC14.** Karar kümesi bu kursta ve önceki iki derste alınmış 12 karardan oluşur; hepsi coğrafya,
  dayanıklılık ya da kiralama kararıdır.
- **BC15.** Puanlar -2 ile +2 arasında bir **varsayımdır**, ölçülmüş değer değildir; anlamlı olan
  sıralama ve işarettir, mutlak büyüklük değil.
- **BC16.** Bir karar, uygulanması sağlayıcının işlettiği bir hizmeti kiralamayı gerektiriyorsa
  **devir** sayılır.
- **BC17.** Çıkış sınıfı üç değerlidir: `tanim` (yazılıp başka bir kiralamada aynen kurulabilir),
  `kismi`, `yok`.
- **BC18.** Kararlar birbirinden bağımsız puanlanır. Gerçek kümelerde birbirlerini etkilerler; bu,
  modelin bilinen sınırıdır.

```js
// cerceve/model.mjs — karar kumesi ve sutun puanlari MODELIDIR. Sutunlar tur adiyla anilir;
// puanlar bu dersin varsayimidir, olculmus degerler degil. Gercek bir urun ya da katalog yoktur.
export const SUTUN = ["isletim", "guvenlik", "guvenilirlik", "basarim", "maliyet"];

// ad, [isletim, guvenlik, guvenilirlik, basarim, maliyet] (-2..+2), devir?, cikista tasinan
export const KARAR = [
  ["uc-alana-yayilma", [-1, 0, 2, 0, -1], false, "tanim"],
  ["ikinci-bolgede-tam-kopya", [-2, 0, 2, 1, -2], false, "tanim"],
  ["bolgeler-arasi-eszamanli-yazma", [-1, 0, 2, -2, -1], false, "tanim"],
  ["uc-kenar-konumu", [-1, 1, 1, 2, -1], true, "kismi"],
  ["abone-ozeti-onbellegi", [0, 0, 1, 2, 0], true, "tanim"],
  ["yonetilen-iliskisel-veritabani", [2, 1, 1, -1, -2], true, "kismi"],
  ["islev-calistirma-ortami", [2, 0, 1, -1, -1], true, "yok"],
  ["saglayici-anahtar-yonetimi", [1, 2, 0, -1, -1], true, "yok"],
  ["ortam-basina-ayri-kiralama", [-2, 2, 1, 0, -1], true, "tanim"],
  ["otomatik-yamalama-devri", [2, 2, -1, 0, 0], true, "yok"],
  ["tekil-yazma-ucu", [1, 0, -2, 1, 0], false, "tanim"],
  ["ham-okumayi-nesne-deposunda-tutma", [1, 0, 1, -1, -1], true, "kismi"],
];

export const puan = (k, s) => k[1][SUTUN.indexOf(s)];
export const yukselten = (s) => KARAR.filter((k) => puan(k, s) > 0);
export const dusuren = (s) => KARAR.filter((k) => puan(k, s) < 0);
export const toplam = (s) => KARAR.reduce((a, k) => a + puan(k, s), 0);

// gerilim: bir karar i sutununu yukseltirken j sutununu dusuruyorsa hucre bir artar
export function gerilim(i, j) {
  return KARAR.filter((k) => puan(k, i) > 0 && puan(k, j) < 0).length;
}
export const gergin = (k) => k[1].some((p) => p > 0) && k[1].some((p) => p < 0);
```

#### Sütunlar Arası Gerilim

```js
// cerceve/puan.mjs — sutun toplamlari ve sutunlar arasi gerilim matrisi
import { SUTUN, KARAR, puan, yukselten, dusuren, toplam, gerilim, gergin } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
console.log(`${KARAR.length} karar, ${SUTUN.length} sutun; puanlar -2..+2 araligindadir (varsayim).`);
console.log();
console.log("karar                             | isl | guv | gvn | bas | mal | net | gergin");
console.log("----------------------------------|-----|-----|-----|-----|-----|-----|-------");
for (const k of KARAR) {
  const net = k[1].reduce((a, b) => a + b, 0);
  console.log(`${k[0].padEnd(33)} |${k[1].map((p) => s(p, 4)).join(" |")} | ${s(net, 3)} | ` +
    `${gergin(k) ? "evet" : "hayir"}`);
}

console.log();
console.log("sutun        | toplam | yukselten karar | dusuren karar | en yuksek | en dusuk");
console.log("-------------|--------|-----------------|---------------|-----------|---------");
for (const t of SUTUN) {
  const p = KARAR.map((k) => puan(k, t));
  console.log(`${t.padEnd(12)} | ${s(toplam(t), 6)} | ${s(yukselten(t).length, 15)} | ` +
    `${s(dusuren(t).length, 13)} | ${s(Math.max(...p), 9)} | ${s(Math.min(...p), 8)}`);
}

console.log();
console.log("yukselen \\ dusen | isletim | guvenlik | guvenilirlik | basarim | maliyet | satir");
console.log("-----------------|---------|----------|--------------|---------|---------|------");
for (const i of SUTUN) {
  const h = SUTUN.map((j) => (i === j ? "-" : String(gerilim(i, j))));
  const satir = SUTUN.filter((j) => j !== i).reduce((a, j) => a + gerilim(i, j), 0);
  console.log(`${i.padEnd(16)} | ${s(h[0], 7)} | ${s(h[1], 8)} | ${s(h[2], 12)} | ` +
    `${s(h[3], 7)} | ${s(h[4], 7)} | ${s(satir, 5)}`);
}

const hicYukselmeyen = SUTUN.filter((t) => yukselten(t).length === 0);
const cift = [];
for (const i of SUTUN) for (const j of SUTUN) if (i !== j) cift.push([i, j, gerilim(i, j)]);
cift.sort((a, b) => b[2] - a[2]);
console.log();
console.log(`gergin karar ${KARAR.filter(gergin).length}/${KARAR.length}; ` +
  `hicbir sutunu dusurmeyen karar ${KARAR.filter((k) => !k[1].some((p) => p < 0)).length}.`);
console.log(`hicbir kararin iyilestirmedigi sutun: ${hicYukselmeyen.join(", ") || "yok"}.`);
console.log(`en gergin cift: ${cift[0][0]} yukselirken ${cift[0][1]} dusuyor — ${cift[0][2]} karar.`);
```

```
12 karar, 5 sutun; puanlar -2..+2 araligindadir (varsayim).

karar                             | isl | guv | gvn | bas | mal | net | gergin
----------------------------------|-----|-----|-----|-----|-----|-----|-------
uc-alana-yayilma                  |  -1 |   0 |   2 |   0 |  -1 |   0 | evet
ikinci-bolgede-tam-kopya          |  -2 |   0 |   2 |   1 |  -2 |  -1 | evet
bolgeler-arasi-eszamanli-yazma    |  -1 |   0 |   2 |  -2 |  -1 |  -2 | evet
uc-kenar-konumu                   |  -1 |   1 |   1 |   2 |  -1 |   2 | evet
abone-ozeti-onbellegi             |   0 |   0 |   1 |   2 |   0 |   3 | hayir
yonetilen-iliskisel-veritabani    |   2 |   1 |   1 |  -1 |  -2 |   1 | evet
islev-calistirma-ortami           |   2 |   0 |   1 |  -1 |  -1 |   1 | evet
saglayici-anahtar-yonetimi        |   1 |   2 |   0 |  -1 |  -1 |   1 | evet
ortam-basina-ayri-kiralama        |  -2 |   2 |   1 |   0 |  -1 |   0 | evet
otomatik-yamalama-devri           |   2 |   2 |  -1 |   0 |   0 |   3 | evet
tekil-yazma-ucu                   |   1 |   0 |  -2 |   1 |   0 |   0 | evet
ham-okumayi-nesne-deposunda-tutma |   1 |   0 |   1 |  -1 |  -1 |   0 | evet

sutun        | toplam | yukselten karar | dusuren karar | en yuksek | en dusuk
-------------|--------|-----------------|---------------|-----------|---------
isletim      |      2 |               6 |             5 |         2 |       -2
guvenlik     |      8 |               5 |             0 |         2 |        0
guvenilirlik |      9 |               9 |             2 |         2 |       -2
basarim      |      0 |               4 |             5 |         2 |       -2
maliyet      |    -11 |               0 |             9 |         0 |       -2

yukselen \ dusen | isletim | guvenlik | guvenilirlik | basarim | maliyet | satir
-----------------|---------|----------|--------------|---------|---------|------
isletim          |       - |        0 |            2 |       4 |       4 |    10
guvenlik         |       2 |        - |            1 |       2 |       4 |     9
guvenilirlik     |       5 |        0 |            - |       4 |       8 |    17
basarim          |       2 |        0 |            1 |       - |       2 |     5
maliyet          |       0 |        0 |            0 |       0 |       - |     0

gergin karar 11/12; hicbir sutunu dusurmeyen karar 1.
hicbir kararin iyilestirmedigi sutun: maliyet.
en gergin cift: guvenilirlik yukselirken maliyet dusuyor — 8 karar.
```

Birinci tablonun son sütunu bu dersin ilk sayısıdır: **12 kararın 11'i gergindir**, yani en az bir
sütunu yükseltirken en az bir sütunu düşürür. Hiçbir sütunu düşürmeyen tek karar abone özeti
önbelleğidir ve o bile ikinci derste bir bedelle geldi — bayat yanıtla. Sütun puanlaması bedeli
görmediyse, bedel yoktur demek değildir; **ölçüt kümesinin dışında kalmıştır** demektir.

İkinci tablo sütunları tek başlarına özetliyor. Güvenilirlik 9 kararla yükseliyor ve toplam +9 ile
en yüksek sütun. Maliyet ise **0 karar** tarafından yükseltiliyor, 9 karar tarafından düşürülüyor ve
toplamı -11. Bu, kararların kötü seçildiğini göstermez; kümenin bileşiminin bir sonucudur. Bu ders
coğrafya ve dayanıklılık kararlarını topladı ve bunların hiçbiri maliyeti yükseltmez — maliyeti
yükselten kararlar başka bir türden gelir ve henüz ölçülmedi. Güvenlik sütununun 0 düşüren karar
göstermesi de aynı biçimde okunur: bu küme güvenliği bozan bir karar içermiyor, güvenlik bozulamaz
değil.

Üçüncü tablo asıl ölçüdür. Satır bir sütunu yükselten kararları, sütun onların düşürdüğü ölçütü
sayar. Güvenilirlik satırı 17 ile açık ara en gergin satır: güvenilirliği yükselten kararlar 8
kararda maliyeti, 5 kararda işletimi, 4 kararda başarımı düşürüyor. **En gergin çift güvenilirlik
ile maliyettir ve 8 karar bu çifti taşır.** Maliyet satırının bütünüyle sıfır olması ise ikinci
tablonun aynı bulgusunun matris biçimidir: maliyeti yükselten bir karar olmadığı için maliyetin
başka bir sütunu düşürdüğü bir hücre de yok.

Matrisin işe yaradığı yer bir sıralama değil, **hangi çiftin açıkça karara bağlanması gerektiği**
listesidir. Güvenilirlik–maliyet hücresi 8 ile dolu olduğu için o çift bir kez konuşulup bir üst
sınıra bağlanmadığında, sekiz ayrı kararda sekiz ayrı ve birbirini bilmeyen ödünleşme yapılır.
Buna karşılık güvenilirlik–güvenlik hücresi 0'dır: güvenilirliği yükselten dokuz kararın hiçbiri
güvenliği düşürmüyor, dolayısıyla o çift için ayrı bir ödünleşme kuralı yazmaya gerek yok. Boş
hücreler dolu hücreler kadar bilgi taşır.

#### Devredilen Kararın Sütun Profili

Gerilim matrisi kararları sütunlara böldü; ikinci kesit onları **kime ait** olduklarına böler. Bir
karar sağlayıcının işlettiği bir hizmeti kiralamayı gerektiriyorsa devredilmiştir.

```js
// cerceve/devir.mjs — sutun profilinin devredilen ve elde kalan kararlara gore ayrilmasi
import { SUTUN, KARAR, puan } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x) => x.toFixed(2);
const CIKIS = { tanim: 2, kismi: 1, yok: 0 };
const grup = { devir: KARAR.filter((k) => k[2]), kendi: KARAR.filter((k) => !k[2]) };

console.log("grup  | karar | isletim | guvenlik | guvenilirlik | basarim | maliyet | cikis puani");
console.log("------|-------|---------|----------|--------------|---------|---------|------------");
for (const [ad, g] of Object.entries(grup)) {
  const ort = SUTUN.map((t) => g.reduce((a, k) => a + puan(k, t), 0) / g.length);
  const cikis = g.reduce((a, k) => a + CIKIS[k[3]], 0) / (2 * g.length);
  console.log(`${ad.padEnd(5)} | ${s(g.length, 5)} | ${s(y(ort[0]), 7)} | ${s(y(ort[1]), 8)} | ` +
    `${s(y(ort[2]), 12)} | ${s(y(ort[3]), 7)} | ${s(y(ort[4]), 7)} | ${s(`%${y(100 * cikis)}`, 11)}`);
}

console.log();
console.log("grup  | cikista tanim | kismi | yok | tasinmayan karar");
console.log("------|---------------|-------|-----|-----------------");
for (const [ad, g] of Object.entries(grup)) {
  const say = (t) => g.filter((k) => k[3] === t).length;
  console.log(`${ad.padEnd(5)} | ${s(say("tanim"), 13)} | ${s(say("kismi"), 5)} | ` +
    `${s(say("yok"), 3)} | ${s(`${say("kismi") + say("yok")}/${g.length}`, 16)}`);
}

const devirGuv = grup.devir.reduce((a, k) => a + puan(k, "guvenlik") + puan(k, "isletim"), 0);
const kendiGuv = grup.kendi.reduce((a, k) => a + puan(k, "guvenlik") + puan(k, "isletim"), 0);
console.log();
console.log(`devredilen ${grup.devir.length} karar isletim + guvenlik toplaminda ${devirGuv}, ` +
  `elde kalan ${grup.kendi.length} karar ${kendiGuv}.`);
console.log(`devredilen ${grup.devir.length} karardan cikista tanim olarak tasinamayan ` +
  `${grup.devir.filter((k) => k[3] !== "tanim").length}; elde kalan ${grup.kendi.length} karardan ` +
  `${grup.kendi.filter((k) => k[3] !== "tanim").length}.`);
```

```
grup  | karar | isletim | guvenlik | guvenilirlik | basarim | maliyet | cikis puani
------|-------|---------|----------|--------------|---------|---------|------------
devir |     8 |    0.63 |     1.00 |         0.63 |    0.00 |   -0.88 |      %43.75
kendi |     4 |   -0.75 |     0.00 |         1.00 |    0.00 |   -1.00 |     %100.00

grup  | cikista tanim | kismi | yok | tasinmayan karar
------|---------------|-------|-----|-----------------
devir |             2 |     3 |   3 |              6/8
kendi |             4 |     0 |   0 |              0/4

devredilen 8 karar isletim + guvenlik toplaminda 13, elde kalan 4 karar -3.
devredilen 8 karardan cikista tanim olarak tasinamayan 6; elde kalan 4 karardan 0.
```

Devir ile elde kalan arasındaki fark iki sütunda toplanıyor. İşletimde devredilen kararlar
ortalama +0,63, elde kalanlar **-0,75**; güvenlikte +1,00 ve 0,00. İkisinin toplamı 13'e karşı -3
demektir: kiralamanın karşılığı bu iki sütunda ödenir. Güvenilirlikte ise sıralama tersine dönüyor
— elde kalan kararlar ortalama +1,00, devredilenler +0,63. Güvenilirliği en çok yükselten kararlar
kimseye devredilemeyen kararlardır: alanlara yayılmak, ikinci bölgede kopya tutmak, yazmayı
eşzamanlı yapmak.

Son tablo çıkış sütununu veriyor ve bu dersin en keskin karşıtlığı burada. Elde kalan 4 kararın
**4'ü** çıkışta tanım olarak taşınır: kaç alan, hangi bölge, hangi yazma düzeni — hepsi yazılabilir
bir cümledir ve başka bir kiralamada aynen kurulabilir. Devredilen 8 kararın yalnız **2'si** taşınır;
6'sı kısmi ya da hiç taşınmaz. Çıkış puanı yüzde 100'e karşı **yüzde 43,75**. Kiralama işletim ve
güvenlik sütunlarını yükseltirken çıkış sütununu yarıdan aşağı indiriyor ve bu sütun yukarıdaki
beşinin hiçbirinde görünmüyor.

#### Özet

- Çerçeve bir kararı iyi ya da kötü diye değil sütun sütun puanlar; bu derste kullanılan beşi
  işletim, güvenlik, güvenilirlik, başarım ve maliyettir. Ölçülen şey ad değil, sütunların
  birbirini kısıtlamasıdır.
- 12 kararın **11'i gergindir**; hiçbir sütunu düşürmeyen tek karar vardır ve onun bedeli de
  sütunların dışında kalmıştır.
- Maliyeti yükselten karar **0**, düşüren 9; hiçbir kararın iyileştirmediği sütun maliyettir. Bu,
  kümenin coğrafya ve dayanıklılık kararlarından oluşmasının sonucudur.
- En gergin çift güvenilirlik ile maliyettir: 8 karar güvenilirliği yükseltirken maliyeti düşürür.
  Güvenilirlik satırı 17 ile en gergin satırdır.
- Devredilen 8 karar işletim ve güvenlikte ortalama +0,63 ve +1,00, elde kalan 4 karar -0,75 ve
  0,00; güvenilirlikte sıralama tersine döner (+1,00'e karşı +0,63).
- Çıkışta elde kalan kararların 4/4'ü tanım olarak taşınır, devredilenlerin yalnız 2/8'i: çıkış
  puanı yüzde 100'e karşı yüzde 43,75.

#### Sonraki Adım

Bu ders maliyeti bir sütun olarak saydı ve o sütunun tuhaf bir özelliği çıktı: on iki kararın
hiçbiri onu yükseltmiyor. Bunun nedeni kararların kötülüğü değil, kümenin bileşimidir — coğrafya ve
dayanıklılık kararları maliyeti ödeyen taraftır, kazanan taraf değil. Maliyet sütununu yükselten
kararlar başka bir yerden gelir ve şimdiye kadar tek bir tanesi bile ölçülmedi: aynı kapasitenin
**hangi koşulla** kiralandığı. Aynı makine, aynı saat, aynı iş; ama kapasite anında istenip anında
bırakılabiliyorsa bir fiyat, uzun süreli bir taahhüde bağlanıyorsa başka bir fiyat, sağlayıcı geri
isteyebiliyorsa üçüncü bir fiyat taşır. Sonraki ders üç modeli aynı yük profilinde koşturup toplam
maliyeti, geri alınan kapasite yüzünden yeniden koşan işi ve kullanılmayan taahhüdü birlikte sayar;
yük profili değiştikçe kazanan modelin de değiştiğini gösterir.

### Fiyatlandırma Modelleri

Source: https://academia.sh/tr/kurslar/bulut-temelleri/fiyatlandirma-modelleri

İsteğe bağlı, ayrılmış ve kesintili kapasitenin aynı yük profilinde koşturulması: toplam maliyet, geri alınan kapasite yüzünden yeniden koşan iş, kullanılmayan taahhüt, liste fiyatı ile etkin birim fiyat arasındaki fark ve pencerenin ortasında çıkıldığında kalan yükümlülük.

Önceki ders maliyeti bir sütun olarak saydı ve on iki kararın hiçbirinin onu yükseltmediğini
buldu. Bunun nedeni kararların kötülüğü değil, hepsinin **ne kiralandığı** üzerine olmasıydı. Bu
dersin sorusu farklı: aynı kapasite, aynı saat, aynı iş — **hangi koşulla** kiralanıyor.

Üç koşul vardır. **İsteğe bağlı kapasite** istendiği anda alınır ve bırakıldığı anda ödemesi biter;
hiçbir karar devredilmez ve birim fiyat en yüksektir. **Ayrılmış kapasite** belirli bir miktarın
pencere boyunca ödeneceği taahhüdüne karşılık indirim verir; devredilen karar **kapasiteyi
küçültme** kararıdır. **Kesintili kapasite** en büyük indirimi verir ama sağlayıcı kapasiteyi geri
isteyebilir; devredilen karar **işin ne zaman kesileceği** kararıdır. Aşağıdaki ölçüm bu üç koşulu
aynı yük altında koşturur.

#### Üç Model ve Yük Profilleri

- **BC19.** Fiyatlar **kurgudur** ve kurgu `birim/kb-saat` cinsindendir: isteğe bağlı 1,00,
  ayrılmış 0,62, kesintili 0,28. Gerçek bir para birimi ya da fiyat listesi kullanılmaz.
- **BC20.** Pencere 168 saattir. Öngörülemez profil kendi yazılan üreteçle üretilir; tohum
  20260804 görünürdür ve her koşum aynı diziyi verir.
- **BC21.** Ayrılmış taahhüt R, ortalama talebin yuvarlanmışıdır ve pencere boyunca kullanılsa da
  kullanılmasa da ödenir; R'yi aşan talep isteğe bağlı karşılanır.
- **BC22.** Kesintili kapasitenin geri alınma olasılığı yüke bağlıdır: $p = 0{,}02 + 0{,}40 \cdot
  (talep / 120)$, en çok 0,45.
- **BC23.** Kesintili kapasitede yalnız **ertelenebilir** iş koşar. Ertelenebilir pay profile göre
  0,45 / 0,60 / 0,10'dur, çünkü üç profili üreten iş türleri farklıdır.
- **BC24.** Geri alınan kapasitenin yaptığı iş kaybolur ve isteğe bağlı kapasitede yeniden koşar;
  yeniden koşma katsayısı 2,5'tir (ara durumun kaybı ve yeniden kuyruğa girme).

```js
// fiyat/model.mjs — fiyatlandirma MODELIDIR. Fiyatlar KURGUDUR ve kurgu `birim/kb-saat`
// cinsindendir; gercek bir para birimi, saglayici ya da fiyat listesi kullanilmaz.
export function uretec(tohum) {                    // kendi yazilan uretec, tohum gorunur
  let s = tohum >>> 0;
  return () => ((s = (Math.imul(s, 1664525) + 1013904223) >>> 0) / 4294967296);
}
export const TOHUM = 20260804, SAAT = 168;         // bir haftalik pencere

export const FIYAT = { istege: 1.00, ayrilmis: 0.62, kesintili: 0.28 };  // kurgu birim/kb-saat
export const YENIDEN = 2.5;                        // geri alinan isin yeniden kosma katsayisi
export const PAZAR_TEPE = 120;                     // kurgu: geri alma olasiliginin olcek noktasi
export const geriAlma = (d) => Math.min(0.45, 0.02 + 0.40 * (d / PAZAR_TEPE));

// profil: talep dizisi + ertelenebilir pay (profilin kaynagi farkli is oldugu icin farkli)
export function profiller() {
  const r = uretec(TOHUM);
  const duz = Array.from({ length: SAAT }, () => 40);
  const tepe = Array.from({ length: SAAT }, (_, t) => (t % 24 >= 2 && t % 24 <= 4 ? 120 : 20));
  const ong = Array.from({ length: SAAT }, () =>
    (r() < 0.6 ? Math.round(r() * 6) : 55 + Math.round(r() * 85)));
  return { duz: [duz, 0.45], "tepe-yapan": [tepe, 0.60], ongorulemez: [ong, 0.10] };
}

export function kos(model, talep, ertelenebilir) {
  const R = Math.round(talep.reduce((a, b) => a + b, 0) / talep.length);   // taahhut = ort. talep
  let maliyet = 0, kayip = 0, bosTaahhut = 0, yenidenBedel = 0;
  for (const d of talep) {
    if (model === "istege-bagli") maliyet += d * FIYAT.istege;
    else if (model === "ayrilmis") {
      maliyet += R * FIYAT.ayrilmis + Math.max(0, d - R) * FIYAT.istege;
      bosTaahhut += Math.max(0, R - d);
    } else {
      const q = d * ertelenebilir, p = geriAlma(d), k = q * p;
      maliyet += q * (1 - p) * FIYAT.kesintili + k * YENIDEN * FIYAT.istege
        + (d - q) * FIYAT.istege;
      kayip += k; yenidenBedel += k * YENIDEN * FIYAT.istege;
    }
  }
  return { model, maliyet, kayip, bosTaahhut, yenidenBedel, R };
}
export const MODEL = ["istege-bagli", "ayrilmis", "kesintili"];
```

#### Aynı Profilde Üç Koşum

```js
// fiyat/kosum.mjs — uc model ayni yuk profilinde kosturulur; toplam maliyet, kesintilide
// kaybedilen is ve ayrilmista kullanilmayan taahhut birlikte sayilir
import { profiller, kos, MODEL, SAAT, TOHUM, FIYAT } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 2) => x.toFixed(n);
const P = profiller();

console.log(`tohum ${TOHUM}, pencere ${SAAT} saat; fiyatlar KURGU birim/kb-saat: ` +
  `istege ${y(FIYAT.istege)}, ayrilmis ${y(FIYAT.ayrilmis)}, kesintili ${y(FIYAT.kesintili)}.`);
console.log();
console.log("profil       | toplam talep | ort | en dusuk | en yuksek | ertelenebilir pay | taahhut R");
console.log("-------------|--------------|-----|----------|-----------|-------------------|----------");
for (const [ad, [t, e]] of Object.entries(P)) {
  const top = t.reduce((a, b) => a + b, 0);
  console.log(`${ad.padEnd(12)} | ${s(top, 12)} | ${s(y(top / SAAT, 1), 3)} | ${s(Math.min(...t), 8)} | ` +
    `${s(Math.max(...t), 9)} | ${s(y(e), 17)} | ${s(kos("ayrilmis", t, e).R, 9)}`);
}

console.log();
console.log("profil       | model        | toplam maliyet | kaybedilen is | yeniden kosma | bos taahhut");
console.log("-------------|--------------|----------------|---------------|---------------|------------");
const kazanan = {};
for (const [ad, [t, e]] of Object.entries(P)) {
  let en = null;
  for (const m of MODEL) {
    const r = kos(m, t, e);
    if (en === null || r.maliyet < en.maliyet) en = r;
    console.log(`${ad.padEnd(12)} | ${m.padEnd(12)} | ${s(y(r.maliyet), 14)} | ` +
      `${s(r.kayip ? y(r.kayip, 1) : "-", 13)} | ${s(r.yenidenBedel ? y(r.yenidenBedel) : "-", 13)} | ` +
      `${s(r.bosTaahhut ? y(r.bosTaahhut, 1) : "-", 11)}`);
  }
  kazanan[ad] = en;
}

console.log();
console.log("profil       | kazanan      | ikinciye fark | ikinciye oran | en pahaliya fark");
console.log("-------------|--------------|---------------|---------------|-----------------");
for (const [ad, [t, e]] of Object.entries(P)) {
  const sirali = MODEL.map((m) => kos(m, t, e)).sort((a, b) => a.maliyet - b.maliyet);
  const [a, b, c] = sirali;
  console.log(`${ad.padEnd(12)} | ${a.model.padEnd(12)} | ${s(y(b.maliyet - a.maliyet), 13)} | ` +
    `${s(`%${y((100 * (b.maliyet - a.maliyet)) / a.maliyet, 1)}`, 13)} | ` +
    `${s(`%${y((100 * (c.maliyet - a.maliyet)) / a.maliyet, 1)}`, 16)}`);
}
console.log(`uc profilde kazanan model: ${Object.values(kazanan).map((k) => k.model).join(", ")}.`);
```

```
tohum 20260804, pencere 168 saat; fiyatlar KURGU birim/kb-saat: istege 1.00, ayrilmis 0.62, kesintili 0.28.

profil       | toplam talep | ort | en dusuk | en yuksek | ertelenebilir pay | taahhut R
-------------|--------------|-----|----------|-----------|-------------------|----------
duz          |         6720 | 40.0 |       40 |        40 |              0.45 |        40
tepe-yapan   |         5460 | 32.5 |       20 |       120 |              0.60 |        33
ongorulemez  |         7430 | 44.2 |        0 |       138 |              0.10 |        44

profil       | model        | toplam maliyet | kaybedilen is | yeniden kosma | bos taahhut
-------------|--------------|----------------|---------------|---------------|------------
duz          | istege-bagli |        6720.00 |             - |             - |           -
duz          | ayrilmis     |        4166.40 |             - |             - |           -
duz          | kesintili    |        5572.09 |         463.7 |       1159.20 |           -
tepe-yapan   | istege-bagli |        5460.00 |             - |             - |           -
tepe-yapan   | ayrilmis     |        5264.28 |             - |             - |      1911.0
tepe-yapan   | kesintili    |        4850.46 |         787.9 |       1969.80 |           -
ongorulemez  | istege-bagli |        7430.00 |             - |             - |           -
ongorulemez  | ayrilmis     |        8528.04 |             - |             - |      3907.0
ongorulemez  | kesintili    |        7475.12 |         261.3 |        653.25 |           -

profil       | kazanan      | ikinciye fark | ikinciye oran | en pahaliya fark
-------------|--------------|---------------|---------------|-----------------
duz          | ayrilmis     |       1405.69 |         %33.7 |            %61.3
tepe-yapan   | kesintili    |        413.82 |          %8.5 |            %12.6
ongorulemez  | istege-bagli |         45.12 |          %0.6 |            %14.8
uc profilde kazanan model: ayrilmis, kesintili, istege-bagli.
```

Son satır bu dersin bulgusudur: **üç profilde üç ayrı model kazanıyor.** Düz profilde ayrılmış
kapasite 4.166,40 birim tutuyor; aynı yük isteğe bağlı kapasitede 6.720,00 birimdir, yani
ayrılmışın yüzde 61,3 üstünde. Taahhüt tam olarak kullanıldığı için boş taahhüt sıfır. Tepe
yapan profilde ayrılmış kapasite kaybediyor, çünkü taahhüt ortalamaya kuruluyor ve talebin
yüzde 87,5'i o ortalamanın altında geçiyor: **1.911 kb-saat** ödendiği hâlde
kullanılmıyor. Öngörülemez profilde ise hiçbir devir işe yaramıyor ve en pahalı liste fiyatı olan
isteğe bağlı kapasite 7.430,00 birimle kazanıyor.

Kesintili kapasitenin iki gizli kalemi orta tabloda ayrı sütunlarda duruyor. Düz profilde
463,7 kb-saatlik iş geri alınan kapasiteyle birlikte kayboluyor ve yeniden koşturmak **1.159,20
birim** tutuyor — modelin toplam maliyetinin beşte birinden fazlası. Tepe yapan profilde kayıp
787,9 kb-saat ve yeniden koşma 1.969,80 birim; bu profil kazanıyor olmasına rağmen maliyetinin
yüzde 40'ı geri alınan işin bedelidir. **Kesintili kapasitenin fiyatı listede değil, geri alma
oranındadır.**

Öngörülemez profilin kesintili satırı bu kalemin ikinci yüzünü gösteriyor: kaybedilen iş 261,3
kb-saatle üç profilin en düşüğü, ama model yine de kaybediyor (7.475,12'ye karşı 7.430,00).
Sebebi kayıp değil, kazancın tavanıdır — o profilde ertelenebilir pay 0,10, yani indirim talebin
yalnız onda birine uygulanabiliyor. **Bir indirim ancak dokunabildiği paya kadar indirimdir.**

Üçüncü tablo farkların büyüklüğünü veriyor. Düz profilde kazanan ikinciyi yüzde 33,7 geçiyor: model
seçimi burada gerçek bir karardır. Öngörülemez profilde fark yüzde 0,6'ya iniyor — üç modelin
maliyeti neredeyse aynıdır ve seçimi maliyet değil **risk** belirler.

#### Etkin Birim Fiyat ve Çıkışın Bedeli

Liste fiyatı bir kiralamanın ne kadara mal olduğunu söylemez. Ölçülmesi gereken **etkin birim
fiyattır**: toplam maliyetin karşılanan toplam talebe bölümü.

```js
// fiyat/cikis.mjs — etkin birim fiyat, devredilen karar ve pencerenin ortasinda cikmanin bedeli
import { profiller, kos, MODEL, SAAT, FIYAT } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 3) => x.toFixed(n);
const P = profiller(), CIKIS = 84;                  // pencerenin ortasinda kiralamadan cikilir
const DEVIR = { "istege-bagli": 0, ayrilmis: 1, kesintili: 2 };
const LISTE = { "istege-bagli": FIYAT.istege, ayrilmis: FIYAT.ayrilmis, kesintili: FIYAT.kesintili };

console.log("profil       | model        | liste | etkin birim | listeye gore | devredilen karar");
console.log("-------------|--------------|-------|-------------|--------------|-----------------");
for (const [ad, [t, e]] of Object.entries(P)) {
  const top = t.reduce((a, b) => a + b, 0);
  for (const m of MODEL) {
    const etkin = kos(m, t, e).maliyet / top;
    console.log(`${ad.padEnd(12)} | ${m.padEnd(12)} | ${s(y(LISTE[m], 2), 5)} | ${s(y(etkin), 11)} | ` +
      `${s(`x${y(etkin / LISTE[m], 2)}`, 12)} | ${s(DEVIR[m], 17)}`);
  }
}

console.log();
console.log(`pencerenin ${CIKIS}. saatinde cikildiginda kalan yukumluluk (kurgu birim):`);
console.log("profil       | istege-bagli | kesintili | ayrilmis (kalan taahhut) | ayrilmis kazancinin orani");
console.log("-------------|--------------|-----------|--------------------------|--------------------------");
for (const [ad, [t, e]] of Object.entries(P)) {
  const r = kos("ayrilmis", t, e), tam = kos("istege-bagli", t, e);
  const kalan = (SAAT - CIKIS) * r.R * FIYAT.ayrilmis;
  const kazanc = tam.maliyet - r.maliyet;
  console.log(`${ad.padEnd(12)} | ${s(0, 12)} | ${s(0, 9)} | ${s(y(kalan, 2), 24)} | ` +
    `${s(kazanc > 0 ? `%${y((100 * kalan) / kazanc, 1)}` : "kazanc yok", 25)}`);
}
```

```
profil       | model        | liste | etkin birim | listeye gore | devredilen karar
-------------|--------------|-------|-------------|--------------|-----------------
duz          | istege-bagli |  1.00 |       1.000 |        x1.00 |                 0
duz          | ayrilmis     |  0.62 |       0.620 |        x1.00 |                 1
duz          | kesintili    |  0.28 |       0.829 |        x2.96 |                 2
tepe-yapan   | istege-bagli |  1.00 |       1.000 |        x1.00 |                 0
tepe-yapan   | ayrilmis     |  0.62 |       0.964 |        x1.56 |                 1
tepe-yapan   | kesintili    |  0.28 |       0.888 |        x3.17 |                 2
ongorulemez  | istege-bagli |  1.00 |       1.000 |        x1.00 |                 0
ongorulemez  | ayrilmis     |  0.62 |       1.148 |        x1.85 |                 1
ongorulemez  | kesintili    |  0.28 |       1.006 |        x3.59 |                 2

pencerenin 84. saatinde cikildiginda kalan yukumluluk (kurgu birim):
profil       | istege-bagli | kesintili | ayrilmis (kalan taahhut) | ayrilmis kazancinin orani
-------------|--------------|-----------|--------------------------|--------------------------
duz          |            0 |         0 |                  2083.20 |                     %81.6
tepe-yapan   |            0 |         0 |                  1718.64 |                    %878.1
ongorulemez  |            0 |         0 |                  2291.52 |                kazanc yok
```

Kesintili kapasitenin liste fiyatı 0,28, yani isteğe bağlının yüzde 72 altında. Etkin birim fiyatı
ise düz profilde 0,829, tepe yapanda 0,888, öngörülemezde **1,006** — listenin sırasıyla 2,96, 3,17
ve 3,59 katı. Öngörülemez profilde en ucuz görünen model, en pahalı görünenden fiilen **pahalıya**
geliyor. Ayrılmış kapasitede aynı desen daha ılımlı işliyor: liste 0,62 iken etkin fiyat tepe yapan
profilde 0,964, öngörülemezde 1,148.

Devredilen karar sütunu bu üçlüyü sıralıyor: isteğe bağlıda 0, ayrılmışta 1, kesintilide 2. Sıra
liste indirimiyle birebir örtüşüyor — indirim devredilen kararın karşılığıdır ve üç modelin de
etkin fiyatı, devredilen kararın kaç kez aleyhe işlediğine bağlı.

Son tablo çıkışı sayıyor. İsteğe bağlı ve kesintili kapasitede pencerenin ortasında çıkmanın kalan
yükümlülüğü **sıfırdır**. Ayrılmışta düz profilde 2.083,20 birim kalıyor; bu, aynı modelin o
profilde kazandırdığı toplam farkın **yüzde 81,6'sı** demektir. Tepe yapan profilde kalan
yükümlülük kazancın **yüzde 878,1'i**: taahhüdün ortasında çıkmak, taahhüdün bütün kazancını sekiz
kez siler. Kiralamanın çıkış bedeli burada bir tahmin değil, sözleşmenin doğrudan yazdığı sayıdır.

#### Özet

- Üç kapasite modeli devredilen karar sayısıyla sıralanır: isteğe bağlı 0, ayrılmış 1 (kapasiteyi
  küçültme), kesintili 2 (işin ne zaman kesileceği); liste indirimi bu sırayı izler.
- Aynı üç model üç yük profilinde koşturulduğunda **üç ayrı model kazanır**: düz profilde
  ayrılmış, tepe yapanda kesintili, öngörülemezde isteğe bağlı. İkinci sıradaki model kazanandan
  sırasıyla yüzde 33,7, yüzde 8,5 ve yüzde 0,6 pahalıdır. Tek bir doğru model yoktur.
- Kesintili kapasitenin gizli kalemi geri alınan iştir: düz profilde 463,7 kb-saat kayıp ve
  1.159,20 birim yeniden koşma; tepe yapanda 787,9 kb-saat ve 1.969,80 birim.
- Ayrılmış kapasitenin gizli kalemi kullanılmayan taahhüttür: tepe yapan profilde 1.911, öngörülemez
  profilde 3.907 kb-saat ödenip kullanılmıyor.
- Liste fiyatı ile etkin birim fiyat ayrı sayılardır: kesintili liste 0,28 iken etkin fiyat 0,829
  ile 1,006 arasında (listenin 2,96–3,59 katı) ve öngörülemez profilde isteğe bağlıyı geçiyor.
- Çıkışta isteğe bağlı ve kesintili kapasitenin kalan yükümlülüğü sıfır; ayrılmışta pencerenin
  ortasında çıkmak düz profilde kazancın yüzde 81,6'sını, tepe yapan profilde yüzde 878,1'ini siler.

#### Sonraki Adım

Dört ders kiralanan altyapının coğrafyasını ve fiyatını ölçtü: arıza alanı ayrımı, kullanıcıya
yakınlık, sütunlar arası gerilim ve kapasitenin hangi koşulla alındığı. Hepsi tek bir şeyi
varsaydı — kiralanacak iş **zaten kiralanmış durumda**. Oysa bölgesel ölçüm ağı bugün kendi
salonunda koşuyor ve buraya bir yerden gelmesi gerekiyor. Aynı hizmet olduğu gibi taşınabilir,
tek tek parçaları kiralanan karşılıklarıyla değiştirilebilir ya da baştan yazılabilir; üçü de aynı
sonucu vermez. Sonraki ders bu üç göç yolunu **devredilen karar** cinsinden karşılaştırır: her
yolda kaç karar sağlayıcıya geçiyor, kaç kalem yeniden yazılıyor, geçiş kaç dalgada tamamlanıyor
ve en önemlisi — bu dört derste sayılan çıkış bedeli her yolda ne kadar büyüyor.

### Bulut Göç Stratejileri

Source: https://academia.sh/tr/kurslar/bulut-temelleri/bulut-goc-stratejileri

Yeniden barındırma, platform değiştirme ve yeniden mimarinin aynı on kalemlik kümede karşılaştırılması: devredilen karar, göç günü, çıkışı zorlaştıran hizmete özgü kalem, dalga sayısı ile iki düzenin birlikte işletilme süresi, geride kalan kalemin yıllık yükü ve bitmeyen çift düzen bedeli.

Önceki ders kapasitenin hangi koşulla kiralandığını ölçtü ve üç yük profilinde üç ayrı modelin
kazandığını buldu. Bütün o hesaplar tek bir sessiz varsayım altında yapıldı: taşınacak iş **zaten
kiralanmış durumda**. Oysa kurgu bölgesel ölçüm ağı bugün kendi salonunda koşuyor.

Burada üç yol ölçülür. **Yeniden barındırma** kalemi olduğu gibi kiralanan makineye taşır; kod
değişmez. **Platform değiştirme** kalemin bazı parçalarını yönetilen karşılıklarıyla değiştirir;
arayüz katmanı yeniden yazılır. **Yeniden mimari** kalemi kiralanan yapı taşlarına göre baştan
yazar. Yaygın göç çerçeveleri bu üçünün yanına kalemi satın alınan bir hizmetle değiştirmeyi,
emekliye ayırmayı ya da olduğu yerde bırakmayı da sayar; bu ders taşımanın üç ayrı derinliğini
karşılaştırdığı için o üçüyle sınırlı kalır.
Aşamalı geçişin dalga mekaniği ve eski düzeni parça parça saran kalıp önceki kurslarda ölçüldü;
burada ölçülen şey dalganın kendisi değil, dalgaların **bitmediği** durumun yıllık bedelidir.

#### Kalem Kümesi ve Üç Strateji

- **BC25.** Kalem kümesi 10 servistir; her kalemin büyüklüğü (1–3), yıllık işletim günü ve yıllık
  değişiklik sayısı kurgudur.
- **BC26.** Strateji profilleri kalem başına sabittir ve model dosyasında yazılıdır: devredilen
  karar sırasıyla 3, 7 ve 11'dir.
- **BC27.** Karar ufku 5 yıldır; beş yıllık net kazancı sıfırın üstünde olmayan kalem taşınmaz.
- **BC28.** Ekip dalga başına 20 göç günü işler; bir dalga 30 takvim günü sürer.
- **BC29.** İki düzen birlikte işletildiği sürece ayda 1,5 ek işletim günü doğar. Geride kalan
  kalem varsa bu bedel bitmez.
- **BC30.** Karma yolda her kalem, en yüksek beş yıllık neti veren stratejiyi alır.

```js
// goc/model.mjs — goc MODELIDIR: kurgu olcum aginin on kalemi ve uc strateji profili.
// Gercek bir gocurme araci, saglayici ya da takvim yoktur; butun sayilar kurgudur.
// ad, buyukluk (1-3), yillik isletim gunu, yillik degisiklik sayisi
export const KALEM = [
  ["okuma-toplayici", 3, 22, 30], ["dogrulayici", 2, 14, 18], ["faturalama", 3, 18, 12],
  ["is-emri-servisi", 2, 10, 9], ["abone-portali", 2, 12, 24], ["gecelik-toplu-is", 1, 8, 4],
  ["okuma-deposu", 3, 20, 3], ["tarife-deposu", 1, 6, 2], ["rapor-ucu", 1, 3, 1],
  ["kimlik-dizini", 1, 5, 2],
];

// devir: kalem basina devredilen karar; dusus: isletim yukunden kalkan pay; teslim: degisiklik
// basina kazanilan gun; gun: buyukluk basina goc gunu; ozgu: kalem basina hizmete ozgu kalem
export const STRATEJI = {
  "yeniden-barindirma": { devir: 3, dusus: 0.15, teslim: 0.05, gun: 2, ozgu: 1, yaz: "degismez" },
  "platform-degistirme": { devir: 7, dusus: 0.55, teslim: 0.20, gun: 9, ozgu: 3, yaz: "kismi" },
  "yeniden-mimari": { devir: 11, dusus: 0.80, teslim: 0.70, gun: 34, ozgu: 5, yaz: "tam" },
};
export const AD = Object.keys(STRATEJI);
export const UFUK = 5, DALGA_KAP = 20, DALGA_GUN = 30, CIFT_AY = 1.5;  // kurgu

export const gocGunu = (k, s) => STRATEJI[s].gun * k[1];
export const kazanc = (k, s) => k[2] * STRATEJI[s].dusus + k[3] * STRATEJI[s].teslim;
export const net = (k, s) => kazanc(k, s) * UFUK - gocGunu(k, s);
export const enIyi = (k) => AD.reduce((a, s) => (net(k, s) > net(k, a) ? s : a), AD[0]);

// Bir yol: her kaleme bir strateji. Net kazanci sifirin altinda kalan kalem tasinmaz.
export function kos(sec) {
  const tasinan = KALEM.filter((k) => net(k, sec(k)) > 0);
  const geride = KALEM.filter((k) => net(k, sec(k)) <= 0);
  const t = (f) => tasinan.reduce((a, k) => a + f(k), 0);
  const gun = t((k) => gocGunu(k, sec(k)));
  const dalga = Math.ceil(gun / DALGA_KAP), birlikte = dalga * DALGA_GUN;
  const gecis = (birlikte / 30) * CIFT_AY;
  const kalici = geride.length ? CIFT_AY * 12 : 0;
  const yillik = t((k) => kazanc(k, sec(k))) - kalici;
  return {
    tasinan: tasinan.length, geride: geride.length, gun, dalga, birlikte, gecis, kalici, yillik,
    devir: t((k) => STRATEJI[sec(k)].devir),
    ozgu: t((k) => STRATEJI[sec(k)].ozgu),
    kalanYuk: t((k) => k[2] * (1 - STRATEJI[sec(k)].dusus)) + geride.reduce((a, k) => a + k[2], 0),
    gerideYuk: geride.reduce((a, k) => a + k[2], 0),
    net5: yillik * UFUK - gun - gecis,
  };
}
```

#### Aynı Kümede Üç Strateji

```js
// goc/strateji.mjs — uc strateji ayni kalem kumesinde: devredilen karar, yeniden yazilan kalem,
// goc gunu ve cikisi zorlastiran hizmete ozgu kalem
import { KALEM, STRATEJI, AD, UFUK, kos, net, enIyi } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 1) => x.toFixed(n);
const KISA = { "yeniden-barindirma": "barindirma", "platform-degistirme": "degistirme",
  "yeniden-mimari": "mimari" };
const R = Object.fromEntries(AD.map((a) => [a, kos(() => a)]));
R.karma = kos(enIyi);
const YOL = [...AD, "karma"];

console.log(`${KALEM.length} kalem, karar ufku ${UFUK} yil; butun sayilar KURGU ` +
  `"isletim gunu" ve "goc gunu" cinsindendir.`);
console.log();
console.log("olcu                         | barindirma | degistirme | mimari | karma");
console.log("-----------------------------|------------|------------|--------|-------");
for (const [ad, f] of [
  ["tasinan kalem", (r) => `${r.tasinan}/${KALEM.length}`],
  ["devredilen karar", (r) => r.devir],
  ["yeniden yazilan kalem", (r, a) => (a === "karma" ? "karisik" : STRATEJI[a].yaz)],
  ["goc gunu (toplam)", (r) => r.gun],
  ["hizmete ozgu kalem (cikis)", (r) => r.ozgu],
  ["yillik kazanc (isletim gunu)", (r) => y(r.yillik)],
  ["kalan yillik isletim yuku", (r) => y(r.kalanYuk)]])
  console.log(`${ad.padEnd(28)} | ${s(f(R[YOL[0]], YOL[0]), 10)} | ${s(f(R[YOL[1]], YOL[1]), 10)} | ` +
    `${s(f(R[YOL[2]], YOL[2]), 6)} | ${s(f(R.karma, "karma"), 5)}`);

console.log();
console.log(`kalem basina ${UFUK} yillik net kazanc (isletim gunu; en yuksek olan secilir)`);
console.log("kalem            | buyukluk | yuk | degisim | barindirma | degistirme | mimari | secim");
console.log("-----------------|----------|-----|---------|------------|------------|--------|-------");
for (const k of KALEM) {
  const n = AD.map((a) => net(k, a));
  console.log(`${k[0].padEnd(16)} | ${s(k[1], 8)} | ${s(k[2], 3)} | ${s(k[3], 7)} | ` +
    `${s(y(n[0]), 10)} | ${s(y(n[1]), 10)} | ${s(y(n[2]), 6)} | ${KISA[enIyi(k)]}`);
}
const say = (a) => KALEM.filter((k) => enIyi(k) === a).length;
console.log(`secim dagilimi: ` + AD.map((a) => `${a} ${say(a)}`).join(", ") +
  `; uc strateji de en az bir kalemde kazaniyor.`);
```

```
10 kalem, karar ufku 5 yil; butun sayilar KURGU "isletim gunu" ve "goc gunu" cinsindendir.

olcu                         | barindirma | degistirme | mimari | karma
-----------------------------|------------|------------|--------|-------
tasinan kalem                |      10/10 |      10/10 |   6/10 | 10/10
devredilen karar             |         30 |         70 |     66 |    78
yeniden yazilan kalem        |   degismez |      kismi |    tam | karisik
goc gunu (toplam)            |         38 |        171 |    442 |   339
hizmete ozgu kalem (cikis)   |         10 |         30 |     30 |    34
yillik kazanc (isletim gunu) |       22.9 |       85.9 |  117.1 | 132.6
kalan yillik isletim yuku    |      100.3 |       53.1 |   50.8 |  42.3

kalem basina 5 yillik net kazanc (isletim gunu; en yuksek olan secilir)
kalem            | buyukluk | yuk | degisim | barindirma | degistirme | mimari | secim
-----------------|----------|-----|---------|------------|------------|--------|-------
okuma-toplayici  |        3 |  22 |      30 |       18.0 |       63.5 |   91.0 | mimari
dogrulayici      |        2 |  14 |      18 |       11.0 |       38.5 |   51.0 | mimari
faturalama       |        3 |  18 |      12 |       10.5 |       34.5 |   12.0 | degistirme
is-emri-servisi  |        2 |  10 |       9 |        5.8 |       18.5 |    3.5 | degistirme
abone-portali    |        2 |  12 |      24 |       11.0 |       39.0 |   64.0 | mimari
gecelik-toplu-is |        1 |   8 |       4 |        5.0 |       17.0 |   12.0 | degistirme
okuma-deposu     |        3 |  20 |       3 |        9.8 |       31.0 |  -11.5 | degistirme
tarife-deposu    |        1 |   6 |       2 |        3.0 |        9.5 |   -3.0 | degistirme
rapor-ucu        |        1 |   3 |       1 |        0.5 |        0.3 |  -18.5 | barindirma
kimlik-dizini    |        1 |   5 |       2 |        2.3 |        6.8 |   -7.0 | degistirme
secim dagilimi: yeniden-barindirma 1, platform-degistirme 6, yeniden-mimari 3; uc strateji de en az bir kalemde kazaniyor.
```

Devredilen karar 30, 70 ve 66'dır. Yeniden mimarinin 66'sı bir tasarruf değil bir **eksikliktir**:
kalem başına 11 karar devreder ama on kalemin yalnız altısını taşıyabilir. Göç günü 38'den 171'e
ve 442'ye, çıkışı zorlaştıran hizmete
özgü kalem 10'dan 30'a çıkıyor. Yeniden barındırma en az kazandıran (yıllık 22,9 işletim günü) ama
çıkışı en az bozan yoldur.

İkinci tablo bu kazancın nereden geldiğini gösteriyor. Yeniden mimarinin kazandığı üç kalemin
ortak yanı yük değil **değişim** sayısıdır: 30, 18 ve 24. Yılda 3 kez değişen okuma deposu ikinci
en ağır kalem olmasına rağmen (yıllık 20 gün) yeniden mimaride net **-11,5** verir; yeniden
yazmanın karşılığı işletim yükünden değil **değişikliklerin ucuzlamasından** gelir. Rapor ucu bunun
ucudur: büyüklük 1, yük 3, değişiklik 1 ve yeniden mimaride **-18,5** — **küçük ve durağan bir
serviste yeniden mimari beş yılda geri dönmez**; orada en iyi seçim 0,5 ile yeniden barındırmadır.
Seçim dağılımı 1, 6 ve 3'tür: üç strateji de en az bir kalemde kazanıyor.

#### Aşamalandırma ve Taşımamanın Bedeli

```js
// goc/dalga.mjs — asamalandirma ve tasimamanin bedeli: dalga basina servis, iki duzenin
// birlikte isletilme suresi, geride kalanin yillik yuku ve bitmeyen cift duzen
import { AD, DALGA_KAP, DALGA_GUN, CIFT_AY, kos, enIyi } from "./model.mjs";

const s = (x, n) => String(x).padStart(n);
const y = (x, n = 1) => x.toFixed(n);
const R = { ...Object.fromEntries(AD.map((a) => [a, kos(() => a)])), karma: kos(enIyi) };
const YOL = [["barindirma", AD[0]], ["degistirme", AD[1]], ["mimari", AD[2]], ["karma", "karma"]];

console.log(`dalga kapasitesi ${DALGA_KAP} goc gunu, dalga suresi ${DALGA_GUN} takvim gunu; ` +
  `iki duzen birlikte isletildikce ayda ${CIFT_AY} ek isletim gunu (kurgu).`);
console.log();
console.log("yol        | goc gun | dalga | servis/dalga | birlikte | geride | cift duzen | 5 yil net");
console.log("-----------|---------|-------|--------------|----------|--------|------------|----------");
for (const [ad, v] of YOL) {
  const r = R[v];
  console.log(`${ad.padEnd(10)} | ${s(r.gun, 7)} | ${s(r.dalga, 5)} | ${s(y(r.tasinan / r.dalga), 12)} | ` +
    `${s(`${r.birlikte} g`, 8)} | ${s(r.geride, 6)} | ` +
    `${s(r.kalici ? `${y(r.kalici)}/yil` : "biter", 10)} | ${s(y(r.net5), 9)}`);
}
const m = R[AD[2]];
console.log(`gecis bedeli (bir kez): ` + YOL.map(([a, v]) => `${a} ${y(R[v].gecis)}`).join(", ") + ".");
console.log(`yeniden mimari ${m.geride} kalemi geride birakiyor; yillik yukleri ${y(m.gerideYuk)} gun ` +
  `ve cift duzen ${y(m.kalici)} gun/yil ile bitmiyor.`);
```

```
dalga kapasitesi 20 goc gunu, dalga suresi 30 takvim gunu; iki duzen birlikte isletildikce ayda 1.5 ek isletim gunu (kurgu).

yol        | goc gun | dalga | servis/dalga | birlikte | geride | cift duzen | 5 yil net
-----------|---------|-------|--------------|----------|--------|------------|----------
barindirma |      38 |     2 |          5.0 |     60 g |      0 |      biter |      73.7
degistirme |     171 |     9 |          1.1 |    270 g |      0 |      biter |     245.0
mimari     |     442 |    23 |          0.3 |    690 g |      4 |   18.0/yil |     109.0
karma      |     339 |    17 |          0.6 |    510 g |      0 |      biter |     298.3
gecis bedeli (bir kez): barindirma 3.0, degistirme 13.5, mimari 34.5, karma 25.5.
yeniden mimari 4 kalemi geride birakiyor; yillik yukleri 34.0 gun ve cift duzen 18.0 gun/yil ile bitmiyor.
```

Aşamalandırma dalga sayısını takvime çeviriyor. Yeniden barındırma 2 dalgada biter ve dalga başına
**5,0 servis** taşır; platform değiştirmede 1,1, yeniden mimaride **0,3 servise** iner — çoğu dalga
tek bir servisi bile bitiremez. İki düzenin birlikte işletilme süresi 60, 270 ve **690 gün**, bu
süre boyunca doğan geçiş bedeli 3,0, 13,5 ve 34,5 işletim günüdür.

Asıl kalem son iki sütundadır. Yeniden barındırma ve platform değiştirmede çift düzen **biter**;
yeniden mimaride bitmez, çünkü dört kalem hiç taşınmaz. O dört kalemin yıllık işletim yükü
**34,0 gün** olduğu gibi kalır ve üstüne çift düzen **18,0 gün/yıl** kalıcı olarak eklenir.
Taşımamak bir tasarruf değil süresiz bir aboneliktir: yıllık kazançta ikinci olan yol (117,1) beş
yıllık nette **109,0** ile üçüncüye düşüyor, platform değiştirme 245,0 yazıyor.

Karma yol hepsini geçiyor: 339 göç günü, 17 dalga, geride kalan **0** ve beş yıllık net **298,3**
— tek bir stratejiyi bütün kümeye uygulamanın bedeli, en iyi tekdüze yola göre 53,3 işletim
günüdür.

#### Özet

- Üç strateji aynı on kalemde 30, 70 ve 66 karar devreder; göç günü 38, 171 ve 442, hizmete özgü
  kalem 10, 30 ve 30'dur. Yeniden mimari yıllık kazançta ikinci (117,1 gün) ama beş yıllık nette
  üçüncüdür (109,0'a karşı 245,0).
- Yeniden yazmanın karşılığı işletim yükünden değil değişiklik sayısından gelir: kazandığı üç
  kalemin yıllık değişimi 30, 18 ve 24 iken, yılda 3 kez değişen okuma deposunda net -11,5'tir.
  Küçük ve durağan rapor ucunda -18,5 yazar; orada en iyi seçim yeniden barındırmadır (0,5).
- Aşamalandırma dalga başına 5,0, 1,1 ve 0,3 servis taşır; iki düzen 60, 270 ve 690 gün birlikte
  işletilir, geçiş bedeli 3,0, 13,5 ve 34,5 işletim günüdür.
- Taşımamak süresiz bir bedeldir: geride kalan dört kalemin 34,0 günlük yıllık yükü azalmaz ve çift
  düzen 18,0 gün/yıl ile bitmez. Kalem başına seçim yapan karma yol geride kalan bırakmaz ve beş
  yıllık nette 298,3 yazar.

#### Kurs Kapanışı

| Ders | Devredilen karar | Karşılığında alınan | Çıkışta taşınamayan |
|---|---|---|---|
| Bulut Bilişim Nedir | 3 karar (alım, miktar, yerleşim) | bekleme 30,0 → 1,0 gün | 8 kalemden 4'ü |
| Hizmet Modelleri | 26'dan 5 / 23 / 25 | dokunuş 91 → 82 / 19 / 4 | gömülü 2 / 8 / 17 karar |
| Dağıtım Modelleri | denetimin 16/24'ü | esneklik penceresi 21,0 → 1,0 gün | 16 denetim kalemi, 6 sınır bağı |
| Şirket İçi ile Karşılaştırma | sahiplik, 8 birim peşin alım | görünmeyen pay %64 → %13 | 250 kb çıkış ücreti |
| Paylaşılan Sorumluluk Modeli | 24'ten 6 / 16 / 20 | müşteride kalan 18 → 8 → 4 | pazarlık 6 / 16 / 20 kalem |
| Bölgeler ve Erişilebilirlik Alanları | 13 kalemden 6'sının yerleşimi | 0 fazladan kapasite bedeli | 6 kalemin dağıtım tanımı |
| Kenar Konumları | 3 karar (konum, yönlendirme, çıkarma) | gecikme %21,0 düşüş | ısınmış önbellek, +%30,5 yük |
| Tasarım Çerçevesinin Sütunları | 12 karardan 8'i | işletim +0,63, güvenlik +1,00 | 8 devirden 6'sı (%43,75) |
| Fiyatlandırma Modelleri | 0 / 1 / 2 karar | düz profilde isteğe bağlı %61,3 pahalı | kalan taahhüt 2.083,20 birim |
| Bulut Göç Stratejileri | 30 / 70 / 66 karar | yıllık 22,9 / 85,9 / 117,1 gün | hizmete özgü 10 / 30 / 30 |

Kursun kuralı on satırın hepsinde aynıdır: **kiralamak bir kararı devretmektir; devredilen her
karar bir kazanç ve bir çıkış bedeli taşır.** Orta sütun olmadan sol sütun bir kayıp listesi, sağ
sütun olmadan orta sütun bir satış konuşmasıdır.

Son sütun on satırda dört aileye iner. **Hizmete gömülü karar** dört derste tekrar eder (hizmet
modelleri, paylaşılan sorumluluk, sütunlar, göç stratejileri): kalem taşınır, onu ayarlayan karar
taşınmaz. **Sağlayıcının işlettiği ve hiç görünmeyen dağıtım** iki derste (dağıtım modelleri,
bölgeler): sınanamayan bir şeyin taşınacak tanımı da yoktur. **Zamanla biriken durum** iki derste
(başarım geçmişi, ısınmış önbellek). **Sözleşmenin yazdığı kalan yükümlülük** iki derste (çıkış
ücreti, kalan taahhüt) ve dördü içinde tek görünen ailedir. Kalan üçü ölçülmediği sürece çıkış
anında keşfedilir.

Kiralama kararı verildi, derinliği ve düzeni seçildi, sorumluluk sınırı çizildi, coğrafyası ve
fiyatı belirlendi, taşınma yolu ölçüldü. Yine de kiralanan **en somut şey** bu on derste hiç ele
alınmadı: makinenin kendisi ve o makineleri birbirine bağlayan ağ. Kapasite hep soyut bir "birim",
ağ hep bir "gecikme" olarak sayıldı. **M23/K02 Bulutta Hesaplama ve Ağ** o iki soyutlamayı açar:
kiralanan makine tipleri arasındaki fark neye göre ölçülür, bir ağ hangi kalemlerden kurulur ve
iki makine arasındaki yol kaç karar taşır.

