Ders 17 / 21
Etiketleme ve Maliyet Dağıtımı
Sahiplik bilgisi faturanın dışından gelir ve tam gelmez: 148 kaynaklı kurgu envanterde görünen etiket kapsamı %77,7 iken geçerli kapsam %75,0'tir, aylık 4.214,3 kurgu birimin %25,1'i hiçbir kurala girmeden atanamaz kalır. Paylaşılan 1.584,9 birim üç kuralla bölüştürüldüğünde aynı ekibin faturası %8,7 ile %18,6 arasında oynar. Etiket zorunluluğu atanamayan payı sıfırlar ama 37 kaynağı reddeder ve 511,9 birimlik 14 meşru işi durdurur; etiketler ay sonunda %95,9 kapsama çıksa bile o ayın 568,6 birimi (%13,5) geriye dönük düzelmez.
İçindekiler
Önceki ders faturanın on dört ayrım verdiğini, ağın ise doksan birim ayırmayı gerektirdiğini ölçtü. Aradaki boşluk faturadan kapanmaz; sahiplik bilgisi başka bir yerden gelmek zorundadır. Bulut tarafında o yer kaynağın kendisidir: kaynağa bir etiket takılır ve maliyet o etiketten dağıtılır.
Bu dersin sorusu dağıtımın nasıl yapılacağı değil, nerede tutmadığıdır. Ekip bazlı muhasebe ve bölüştürülemeyen kalem M22/K08’de ölçüldü; burada ölçülen şey onun girdisi olan etikettir.
Etiketli Kaynak Envanteri
Örnek kurgu bölgesel ölçüm ağıdır: beş ekip, üç ortam, kiralanmış makine, ağ, depo, işlev ve
kenar katmanı. Kaynaklar, etiketler ve tutarlar kurgudur; para birimi de kurgudur ve br
diye anılır, gerçek bir fiyat listesine karşılık gelmez.
BM7: envanterde 148 kaynak vardır; sekiz tür, üçü birden çok ekip tarafından kullanılır ve
paylasilan etiketi taşır. BM8: bir kaynakta sahip etiketinin olup olmaması onun nasıl
oluşturulduğuna bağlıdır; dört oluşturma yolu vardır. BM9: yanlış yazılmış sahip etiketi
kapsam raporunda etiketli görünür ama ekip listesinde karşılığı yoktur; dağıtımda geçersizdir.
BM10: paylaşılan kaynağın gerçek sürücüsü bilinmez — bu derste karşılaştırılacak bir
gerçek pay yoktur, ölçülen şey sapma değil, kurala göre oynamadır. BM11: bir kaynağa en çok
on etiket anahtarı takılabilir; ağ yedi anahtar kullanır. BM12: etiket bir günde tamamlanır;
o günden önce kesilmiş fatura satırları etiketsizdir ve düzelmez.
Envanter süreç içi bir modeldir ve bir üreteçten türer; tohum görünürdür.
// maliyet/envanter.mjs — etiketli kaynak envanteri modeli: gercek bir envanter yok. Kaynaklar // bir uretecle turetilir, tohum gorunurdur ve koşum tekrarlanabilir. Para birimi kurgudur ve // `br` diye anilir. Etiketin *olup olmamasi* kaynagin nasil olusturuldugu ile belirlenir; // yanlis yazilmis etiket ayri bir durumdur: kapsam raporunda etiketli, dagitimda gecersiz. export const TOHUM = 6108; export const ADET = 148; export const EKIP = ["sayac-okuma", "dogrulama", "faturalama", "saha", "raporlama"]; export const ORTAM = ["uretim", "hazirlik", "gelistirme"]; export const ETIKET_SINIRI = 10; // kaynak basina en cok etiket anahtari export const KULLANILAN_ANAHTAR = ["sahip", "ortam", "hizmet", "surum", "gecici", "sorumlu", "maliyet-merkezi"]; // tur adi, aylik br alt-ust, paylasilan mi (birden cok ekip kullanir) export const TUR = [ ["kiralanmis makine", 18, 96, false], ["blok depo", 4, 34, false], ["nesne deposu", 6, 52, false], ["islev", 1, 12, false], ["kenar dugumu", 3, 21, false], ["ag gecidi", 12, 40, true], ["ortak veri yolu", 20, 64, true], ["izleme toplayici", 9, 30, true], ]; // olusturma yolu: ad, pay, sahip etiketi olma olasiligi, etiketin dogru yazilma olasiligi export const YOL = [ ["sablon", 0.40, 1.00, 1.00], ["otomatik olcekleme", 0.26, 0.71, 0.94], ["elle", 0.22, 0.55, 0.78], ["eski gecis", 0.12, 0.08, 0.60], ]; const sec = (tablo, u) => { let a = 0; for (const s of tablo) { a += s[1]; if (u < a) return s; } return tablo[tablo.length - 1]; }; // yanlis yazim bicimleri: kapsam raporunda etiket gorunur, ekip listesinde karsiligi yok const VARYANT = [(e) => e.toUpperCase(), (e) => e.replace(/-/g, ""), (e) => e + "-ekibi"]; export const envanter = () => { let s = TOHUM >>> 0; const r = () => { s = (Math.imul(s, 1664525) + 1013904223) >>> 0; return s / 4294967296; }; const liste = []; for (let i = 0; i < ADET; i++) { const [tad, alt, ust, pay] = TUR[Math.floor(r() * TUR.length)]; const [yad, , pVar, pDogru] = sec(YOL, r()); const ortam = ORTAM[Math.floor(r() * ORTAM.length)]; const br = Math.round((alt + r() * (ust - alt)) * 10) / 10; const ekip = EKIP[Math.floor(r() * EKIP.length)]; let sahip = null, gecerli = false; if (pay) { sahip = "paylasilan"; gecerli = true; } else if (r() < pVar) { if (r() < pDogru) { sahip = ekip; gecerli = true; } else sahip = VARYANT[Math.floor(r() * VARYANT.length)](ekip); } const gun = 1 + Math.floor(r() * 34); // etiketin tamamlandigi gun; >30 hic const acil = yad === "elle" && r() < 0.18; // acil onarim isi liste.push({ id: i, tur: tad, paylasilan: pay, yol: yad, ortam, br, sahip, gecerli, duzeltmeGunu: sahip && gecerli ? 0 : gun, acil }); } return liste; }; export const topla = (v) => v.reduce((a, b) => a + b, 0); export const brToplam = (v) => topla(v.map((k) => k.br));
// maliyet/dagit.mjs — etiket kapsami, maliyetin ekiplere dagitimi (uc kural), etiket // zorunlulugunun reddettigi kaynaklar ve etiketin geriye islememesi. Sayilar envanter // modelinden turer; olculen sey etiketin dogrulugu degil, *dagitimin tutmadigi yerdir*. import { envanter, EKIP, TUR, YOL, ETIKET_SINIRI, KULLANILAN_ANAHTAR, TOHUM, topla, brToplam } from "./envanter.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 t0 = process.hrtime.bigint(); const K = envanter(), T = brToplam(K), pay = (x) => `%${(100 * x / T).toFixed(1)}`; console.log(`tohum ${TOHUM}: ${K.length} kaynak, aylik ${T.toFixed(1)} br (kurgu para birimi)`); console.log("\n1. etiket kapsami: olusturma yoluna gore"); const A = [-20, 8, 10, 10, 10, 11, 9]; yaz(A, "olusturma yolu", "kaynak", "etiketli", "gecerli", "gecersiz", "etiketsiz", "br payi"); for (const [ad] of YOL) { const g = K.filter((k) => k.yol === ad), e = g.filter((k) => k.sahip); yaz(A, ad, g.length, e.length, g.filter((k) => k.gecerli).length, e.filter((k) => !k.gecerli).length, g.filter((k) => !k.sahip).length, pay(brToplam(g))); } const etiketli = K.filter((k) => k.sahip), gecerli = K.filter((k) => k.gecerli); const gecersiz = K.filter((k) => k.sahip && !k.gecerli), bos = K.filter((k) => !k.sahip); yaz(A, "toplam", K.length, etiketli.length, gecerli.length, gecersiz.length, bos.length, "%100"); console.log(` gorunen kapsam %${(100 * etiketli.length / K.length).toFixed(1)}, ` + `gecerli kapsam %${(100 * gecerli.length / K.length).toFixed(1)}`); console.log(` gecersiz etiket ${gecersiz.length} kaynak ${brToplam(gecersiz).toFixed(1)} br ` + `(${pay(brToplam(gecersiz))}): kapsam raporunda etiketli gorunur`); console.log(` etiket anahtari siniri ${ETIKET_SINIRI}, kullanilan ` + `${KULLANILAN_ANAHTAR.length}, kalan ${ETIKET_SINIRI - KULLANILAN_ANAHTAR.length}`); console.log("\n2. dagitim: dogrudan atanan, paylasilan, atanamayan"); const dogrudan = K.filter((k) => k.gecerli && k.sahip !== "paylasilan"); const paylasilan = K.filter((k) => k.sahip === "paylasilan"); const atanamayan = K.filter((k) => !k.gecerli); const D = brToplam(dogrudan), P = brToplam(paylasilan), X = brToplam(atanamayan); const B = [-14, 9, 11, 9]; yaz(B, "kume", "kaynak", "aylik br", "pay"); yaz(B, "dogrudan", dogrudan.length, D.toFixed(1), pay(D)); yaz(B, "paylasilan", paylasilan.length, P.toFixed(1), pay(P)); yaz(B, "atanamayan", atanamayan.length, X.toFixed(1), pay(X)); const ekipBr = EKIP.map((e) => brToplam(dogrudan.filter((k) => k.sahip === e))); const ekipAdet = EKIP.map((e) => dogrudan.filter((k) => k.sahip === e).length); const oran = (v) => { const t = topla(v); return v.map((x) => x / t); }; const KURAL = { esit: EKIP.map(() => 1 / EKIP.length), maliyet: oran(ekipBr), "kaynak sayisi": oran(ekipAdet) }; console.log(` paylasilan ${P.toFixed(1)} br bir kurala gore bolusur;`); console.log(` atanamayan ${X.toFixed(1)} br (${pay(X)}) hicbir kurala girmez`); console.log("\n3. uc bolusturme kurali: ayni ekibin faturasi kurala gore ne kadar oynuyor"); const C = [-14, ...EKIP.map(() => 13)]; yaz(C, "kural", ...EKIP); const sonuc = {}; for (const [ad, p] of Object.entries(KURAL)) sonuc[ad] = EKIP.map((_, i) => ekipBr[i] + P * p[i]); yaz(C, "dogrudan", ...ekipBr.map((x) => x.toFixed(1))); for (const [ad, v] of Object.entries(sonuc)) yaz(C, ad, ...v.map((x) => x.toFixed(1))); const oynama = EKIP.map((_, i) => { const v = Object.values(sonuc).map((s) => s[i]); return [Math.min(...v), Math.max(...v)]; }); yaz(C, "en genis fark", ...oynama.map(([a, b]) => (b - a).toFixed(1))); yaz(C, "faturaya gore", ...oynama.map(([a, b]) => `%${(100 * (b - a) / a).toFixed(1)}`)); const en = oynama.map(([a, b]) => (b - a) / a); const i0 = en.indexOf(Math.max(...en)); console.log(` karsilastirilacak bir gercek pay yok: olculen sapma degil, kurala gore oynama`); console.log(` en cok oynayan ${EKIP[i0]}: %${(100 * en[i0]).toFixed(1)}; ` + `atanamayan ${pay(X)} her uc kuralda da faturada yok`); console.log("\n4. etiket zorunlulugu: kac kaynak reddedilir, kaci mesru is"); const red = K.filter((k) => !k.gecerli); const E = [-20, 9, 11, 12, 11]; yaz(E, "olusturma yolu", "reddedilen", "aylik br", "mesru is", "duran br"); let mesruAdet = 0, mesruBr = 0; for (const [ad] of YOL) { const g = red.filter((k) => k.yol === ad); const m = g.filter((k) => k.yol === "otomatik olcekleme" || k.acil); mesruAdet += m.length; mesruBr += brToplam(m); yaz(E, ad, g.length, brToplam(g).toFixed(1), m.length, brToplam(m).toFixed(1)); } yaz(E, "toplam", red.length, brToplam(red).toFixed(1), mesruAdet, mesruBr.toFixed(1)); console.log(` ${red.length} kaynak reddedilir (%${(100 * red.length / K.length).toFixed(1)}); ` + `bunun ${mesruAdet} tanesi kapasite ya da acil onarim isidir`); console.log(` zorunluluk atanamayan ${pay(X)} payi sifirlar, karsiliginda ` + `${mesruBr.toFixed(1)} br degerinde ${mesruAdet} is durur`); console.log("\n5. etiket sonradan eklenince: gecmis fatura duzelmiyor"); const GUN = 30, KILOMETRE = [1, 5, 10, 15, 20, 25, 30]; const F = [6, 14, 9, 16, 16]; yaz(F, "gun", "etiketlenmis", "kapsam", "atanan br/gun", "birikmis kayip"); const gunlukKayip = (g) => brToplam(K.filter((k) => !k.gecerli && k.duzeltmeGunu > g)) / GUN; let birikim = 0; for (let g = 1; g <= GUN; g++) { birikim += gunlukKayip(g); if (!KILOMETRE.includes(g)) continue; const kapali = K.filter((k) => k.gecerli || k.duzeltmeGunu <= g); yaz(F, g, kapali.length, `%${(100 * kapali.length / K.length).toFixed(1)}`, (brToplam(kapali) / GUN).toFixed(2), birikim.toFixed(1)); } const hic = K.filter((k) => !k.gecerli && k.duzeltmeGunu > GUN); console.log(` ay sonu kapsami %${(100 * (K.length - hic.length) / K.length).toFixed(1)}, ` + `ama ayin atanamayan payi ${birikim.toFixed(1)} br (%${(100 * birikim / T).toFixed(1)})`); console.log(` ${hic.length} kaynak hic etiketlenmez: ${brToplam(hic).toFixed(1)} br/ay ` + `her ay yeniden atanamaz`); const ms = Number(process.hrtime.bigint() - t0) / 1e6; // ham olcum basilmaz, bant denetlenir console.log(`\nbes tablo 2000 ms bandinda: ${ms < 2000 ? "evet" : "hayir"}`);
tohum 6108: 148 kaynak, aylik 4214.3 br (kurgu para birimi)
1. etiket kapsami: olusturma yoluna gore
olusturma yolu kaynak etiketli gecerli gecersiz etiketsiz br payi
sablon 58 58 58 0 0 %40.8
otomatik olcekleme 40 31 29 2 9 %30.6
elle 27 16 14 2 11 %14.5
eski gecis 23 10 10 0 13 %14.1
toplam 148 115 111 4 33 %100
gorunen kapsam %77.7, gecerli kapsam %75.0
gecersiz etiket 4 kaynak 123.6 br (%2.9): kapsam raporunda etiketli gorunur
etiket anahtari siniri 10, kullanilan 7, kalan 3
2. dagitim: dogrudan atanan, paylasilan, atanamayan
kume kaynak aylik br pay
dogrudan 58 1572.2 %37.3
paylasilan 53 1584.9 %37.6
atanamayan 37 1057.2 %25.1
paylasilan 1584.9 br bir kurala gore bolusur;
atanamayan 1057.2 br (%25.1) hicbir kurala girmez
3. uc bolusturme kurali: ayni ekibin faturasi kurala gore ne kadar oynuyor
kural sayac-okuma dogrulama faturalama saha raporlama
dogrudan 286.6 250.3 267.8 309.8 457.7
esit 603.6 567.3 584.8 626.8 774.7
maliyet 575.5 502.6 537.8 622.1 919.1
kaynak sayisi 641.8 550.9 568.4 555.7 840.3
en genis fark 66.3 64.7 47.0 71.0 144.4
faturaya gore %11.5 %12.9 %8.7 %12.8 %18.6
karsilastirilacak bir gercek pay yok: olculen sapma degil, kurala gore oynama
en cok oynayan raporlama: %18.6; atanamayan %25.1 her uc kuralda da faturada yok
4. etiket zorunlulugu: kac kaynak reddedilir, kaci mesru is
olusturma yolu reddedilen aylik br mesru is duran br
sablon 0 0.0 0 0.0
otomatik olcekleme 11 444.3 11 444.3
elle 13 222.8 3 67.6
eski gecis 13 390.1 0 0.0
toplam 37 1057.2 14 511.9
37 kaynak reddedilir (%25.0); bunun 14 tanesi kapasite ya da acil onarim isidir
zorunluluk atanamayan %25.1 payi sifirlar, karsiliginda 511.9 br degerinde 14 is durur
5. etiket sonradan eklenince: gecmis fatura duzelmiyor
gun etiketlenmis kapsam atanan br/gun birikmis kayip
1 112 %75.7 106.85 33.6
5 115 %77.7 108.90 161.3
10 119 %80.4 112.15 306.2
15 123 %83.1 115.44 434.3
20 133 %89.9 129.34 513.4
25 139 %93.9 136.04 552.4
30 142 %95.9 137.50 568.6
ay sonu kapsami %95.9, ama ayin atanamayan payi 568.6 br (%13.5)
6 kaynak hic etiketlenmez: 89.3 br/ay her ay yeniden atanamaz
bes tablo 2000 ms bandinda: evet
Sayılar ölçüm sınıfındadır; girdileri yukarıdaki varsayımlardır.
Kapsam Tek Sayı Değil
Birinci tablo etiket kapsamını oluşturma yoluna göre ayırır ve iki farklı sayı üretir. Görünen kapsam %77,7: 148 kaynağın 115’inde bir sahip etiketi vardır. Geçerli kapsam %75,0: bunların dördünde etiket değeri hiçbir ekibe karşılık gelmez. Dört kaynak, 123,6 birim, faturanın %2,9’u — kapsam raporunda sorunsuz görünür ve dağıtımda kaybolur.
Kapsamın nereden geldiği yolun kendisinde yazılıdır. Şablondan oluşan 58 kaynağın tamamı doğru etiketlidir; etiketi yazan insan değil, şablondur. Eski geçişten gelen 23 kaynağın 13’ünde hiç etiket yoktur, elle oluşturulan 27 kaynakta hem eksik etiket (11) hem yanlış yazım (2) görülür. Otomatik ölçeklemeden gelen 40 kaynağın dokuzunda etiket yoktur: kaynağı devralmayan ölçekleme etiketi de devralmaz.
Sınır da sayılır: kaynak başına on etiket anahtarı takılabilir, ağ yedi kullanır, kalan üçtür; yeni bir ayrım eklemek bu üç yuvadan birini harcar.
Üç Kural, Üç Farklı Fatura
İkinci tablo dağıtımı üçe böler: doğrudan atanan 1.572,2 birim (%37,3), paylaşılan 1.584,9 birim (%37,6) ve atanamayan 1.057,2 birim (%25,1). Atanamayan pay bir bölüştürme sorunu değildir; girdi eksiktir ve hiçbir kural onu kabul etmez.
Üçüncü tablo paylaşılanı üç kuralla böler: eşit pay, doğrudan atanan maliyet oranı ve kaynak sayısı oranı. Üçü de yalnız etiketten okunur. M22/K08’den farklı olarak burada bir gerçek pay yoktur; ölçülen şey sapma değil, aynı ekibin faturasının kurala göre oynamasıdır.
Raporlama en çok oynayandır: eşit payda 774,7, kaynak sayısında 840,3, maliyet oranında 919,1 birim — 144,4 birimlik fark, faturasının %18,6’sı. Faturalama en az oynar (%8,7). Ekip kendi kaynaklarında hiçbir şey değiştirmeden, yalnız merkezde bir kural değiştiği için faturasını altıda bir oynamış görebilir. Atanamayan %25,1 ise üç kuralda da görünmez; ekiplerin toplamı toplam faturayı vermez.
Zorunluluğun Durdurduğu İş
Dördüncü tablo bariz çözümü uygular: geçerli sahip etiketi olmayan kaynağın oluşturulmasına izin verilmez. Zorunluluk atanamayan %25,1’i sıfırlar, çünkü o kaynaklar hiç var olmaz.
Bedeli aynı tabloda durur. 37 kaynak reddedilir ve bunların 14’ü meşru iştir: otomatik ölçeklemenin açtığı 11 kaynak kapasite, elle açılanların üçü acil onarım işidir. Duran iş 511,9 birimdir. Otomatik ölçeklemede reddedilenlerin tamamı meşrudur — kural en çok, kimsenin klavye başında olmadığı yerde ısırır. Eski geçişten gelen 13 red (390,1 birim) hiçbir meşru işi durdurmaz: o kaynaklar zaten vardır ve zorunluluk yalnız yenilerine işler.
Etiket Geriye İşlemiyor
Beşinci tablo etiketleri ay içinde tamamlar. Kapsam 1. günde %75,7’den 30. günde %95,9’a çıkar; envanter raporu ay sonunda neredeyse temizdir. Ayın faturası temiz değildir: birikmiş atanamayan tutar 568,6 birim, ayın %13,5’i.
Nedeni tek cümledir: fatura satırları gün gün kesilir ve kesilen satırın etiket alanı bir daha değişmez. 20. günde etiketlenen kaynağın ilk on dokuz günü atanamaz kalır. Kapsam anlık, fatura süreklidir; ikisini aynı rapora koymak düzelmiş bir ay görüntüsü üretir. Altı kaynak hiç etiketlenmez: 89,3 birim her ay yeniden atanamaz.
Özet
- 148 kaynaklı kurgu envanterde görünen kapsam %77,7, geçerli kapsam %75,0’tir; aradaki dört kaynak (123,6 birim, %2,9) raporda etiketli görünür ve dağıtımda kaybolur. Kapsam oluşturma yoluna bağlıdır: şablondan gelen 58 kaynağın tamamı doğru etiketli, eski geçişten gelen 23 kaynağın 13’ü etiketsizdir.
- Aylık 4.214,3 birimin %37,3’ü doğrudan atanır, %37,6’sı paylaşılandır ve %25,1’i hiçbir kurala girmez; ekiplerin toplamı toplam faturayı vermez.
- Paylaşılan pay üç kuralla bölüştürüldüğünde aynı ekibin faturası %8,7 ile %18,6 arasında oynar; raporlamanın faturası 774,7 ile 919,1 birim arasında, 144,4 birimlik bir bantta durur.
- Etiket zorunluluğu atanamayan payı sıfırlar ama 37 kaynağı reddeder; bunun 14’ü meşru iştir ve 511,9 birimlik iş durur. Otomatik ölçeklemenin 11 reddinin tamamı kapasite işidir.
- Etiketler ay sonunda %95,9 kapsama çıksa bile o ayın 568,6 birimi (%13,5) atanamaz kalır: kapsam anlık, fatura süreklidir.
Sonraki Adım
Kalemler ayrıldı ve bir sahiplik denemesi yapıldı; ikisi de faturanın geldikten sonra okunmasıdır. Sıradaki ders soruyu zaman eksenine taşır: bir harcama eğrisi üzerinde iki uyarı türü koşturulur, fark etme günü sayılır ve faturanın gecikmeli gelmesi bir kısıt olarak tabloya girer — uyarı geldiğinde harcamanın ne kadarı çoktan yapılmış olur.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.