İçeriğe geç
academia.sh

Ders 01 / 14

Sanal Ortamlar

Aynı çözümleme paylaşılan bir sitede altı kurulum sırasında beş ayrı sonuç verir ve proje kendi çözdüğü kümeyi altı sıranın yalnız ikisinde görür; yalıtılmış sitede sayı bire iner ve altı sıranın altısında aynı küme kurulur.

İçindekiler

Önceki kurs on ders boyunca süre yerine adım saydı ve kapanışında bir cümle bıraktı: ölçmek bir disiplindir; paketlemek ve sınamak da öyle. O kursun sorusu ölçümün neyi saydığıydı — kurulum sayıma dahil mi, sınır nereye çekildi, birim hangi adla yazıldı.

Bu kursun sorusu bir adım geriye gider. Bir sayının sınırını yazmadan önce yanıtlanması gereken daha temel bir soru vardır: aynı girdi her seferinde aynı sonucu veriyor mu? Bir ölçüm iki koşumda iki ayrı değer veriyorsa, sınırını ne kadar iyi yazarsanız yazın karşılaştırılamaz. Bu kurs o soruyu bir projenin üç ayrı yerinde sorar: bağımlılıklarında, testlerinde ve yayımladığı paketinde. İlk yer, kodun hangi paketlerle karşılaşacağını belirleyen yerdir.

Kursun Ölçüsü: Ayrı Sonuç

Bir projenin sayısı çalışıp çalışmadığı değildir. Çalışan bir proje, ikinci makinede çalışmayabilir ve bu ikinci sonuç birinciyi geçersiz kılmaz — ikisi birden doğrudur, tıpkı önceki kursun altı bildirimi gibi. Sayılabilir olan şey şudur: aynı girdi kaç ayrı sonuç verdi?

Kursun ölçü adı ayrı sonuç (distinct outcome). Bir kurulumun sonucu, kurulan sürümlerin kümesidir; iki kurulum aynı kümeyi verdiyse tek sonuç sayılır, ayrı küme verdiyse iki. Bir sayının iki koşumda değişmemesi ise yeniden üretilebilirlik (reproducibility) olarak anılır ve bu kursun bütün ölçümleri onu arar.

Kurgu üç paketten oluşur: olcum, rapor ve ortak. Her birinin depoda yayımlanmış sürümleri vardır, ve proje bunları bir bağımlılık bildirimi (dependency declaration) ile ister: kabul edilen en küçük ve en büyük sürüm, üst sınır dahil değil. Bildirim bir sürüm söylemez, bir aralık söyler — bu ayrım sonraki dersin konusudur.

Bu kursun hiçbir dersi araç adı yazmaz. Sanal ortam aracı, paket yöneticisi (package manager), test çerçevesi ve derleme sistemi yalnız sınıf adıyla anılır; davranışları derste modellenir ve modellendiği yazılır. Standart kitaplığın parçası olan venv ve sysconfig modülleri dilin kendisine aittir ve adlarıyla anılabilir. Ölçümde gerçek kurulum yapılmaz, gerçek paket indirilmez; kurulum bir sözlüğe yazma işlemi olarak modellenmiştir.

Yalıtım Neyi Ayırır

Sanal ortam (virtual environment), yorumlayıcının paket arayacağı yerleşimi projeye özel kılan yalıtım sınırıdır. Kurulan paketlerin yerleştiği dizine bu derste site denir; yorumlayıcı içe aktarma sırasında oraya bakar. Standart kitaplıkta sysconfig modülü bu yerleşimi şema adlarıyla verir, venv modülü ise yeni bir yerleşim üretir. Gerçek yol yazılmaz, çünkü yol makineye bağlıdır ve yeniden üretilemez.

Yalıtımın sağladığı şey bir gizlilik sınırı değildir. Sağladığı tek şey şudur: aynı adlı paket iki projede iki ayrı sürümde bulunabilir. Tek bir site varken bu olanaksızdır, çünkü bir ad bir yerde bir sürüme karşılık gelir.

Buradan doğrudan bir sonuç çıkar. Tek site paylaşıldığında bir projenin gördüğü sürümler yalnız kendi bildirimine değil, siteyi paylaşan öbür projelere ve kurulum sırasına da bağlıdır. Ölçülecek olan budur.

Sınır Nerede Çizilir

Sanal ortamın ne olduğu kadar ne olmadığı da ölçümü belirler, çünkü sınırın dışında kalan her şey ayrı sonuç üretmeye devam eder.

Bir sanal ortam yorumlayıcıyı çoğaltmaz; var olan bir yorumlayıcıya bağlanır ve ona ayrı bir site verir. Ortamı kuran işlem, o yorumlayıcının içe aktarma sırasında bakacağı yerleşimi projeye özel kılmaktan ibarettir. Etkinleştirme de bir düzenek değil, aynı şeyin kabuk tarafındaki karşılığıdır: hangi yorumlayıcının çağrılacağı ve onun hangi siteyi göreceği belirlenir. Standart kitaplıkta bu yerleşimin adları sysconfig şemalarında durur; yeni bir yerleşim üretmek venv modülünün işidir.

Bunun bir sonucu doğrudan bu konunun son dersine bağlanır: yalıtım paketleri ayırır, yorumlayıcıyı ayırmaz. Ortam hangi yorumlayıcıya bağlandıysa onunla anlamlıdır; yorumlayıcı değiştiğinde ortamın yeniden kurulması gerekir, çünkü sitedeki paketlerin bir bölümü o yorumlayıcı için üretilmemiş olabilir.

İkinci bir dışarıda kalan, işletim sistemi düzeyidir. Paylaşılan sistem kitaplıkları, derleyici, ortam değişkenleri ve dosya sistemi sanal ortamın sınırının dışındadır; bir paket bunlardan birine dayanıyorsa iki makinede iki ayrı sonuç yine mümkündür. Bu daha geniş sınırı çizen araçlar başka bir sınıfa aittir ve bu kursun konusu değildir. Burada ölçülen sınır tek bir düzeyde durur: aynı makinede, aynı yorumlayıcıyla, iki projenin paket kümesi.

Ortamın Yaşam Döngüsü

Kurulum akışı dört adımdır: ortam kurulur, bildirim çözümlenir, seçilen sürümler siteye kurulur, proje o site üzerinden koşar. Dördüncü adımdan sonra ortam artık bir yapıttır — üretilmiş bir sonuç, yazılmış bir kaynak değil.

Bu ayrımın pratik karşılığı nettir: ortam sürüm denetimine konmaz. Konmamasının nedeni boyutu değil, kaynağının başka bir yerde olmasıdır. Ortamı yeniden üretecek olan şey bildirimdir; ortamın kendisi o bildirimin bir koşumudur. İki koşum aynı kümeyi veriyorsa ortamı saklamanın bir karşılığı yoktur.

Buradan bir sınama doğar. Ortamı silip aynı bildirimden yeniden kurduğunuzda kaybolan bir şey varsa, o şey bildirime hiç yazılmamış demektir — elle kurulmuş bir paket, elle düzeltilmiş bir sürüm, ortamın içinde biriken bir artık. Silme işlemi bu yüzden bir bakım işi değil, bir ölçümdür: bildirimin eksiksiz olup olmadığını başka hiçbir şey bu kadar doğrudan söylemez.

Ölçüm sorusunun ikinci yarısı da buradan çıkar. Ortam silinip yeniden kurulduğunda aynı küme mi geliyor? Yalıtılmış bir sitede komşu ve sıra elendiğine göre geriye tek bir değişken kalır: çözümlemenin kendisi. Bu dersin ölçümü o değişkeni sabit tutar ve yalnız yalıtımın payını sayar.

Paylaşılan Sitede Son Kuran Kazanır

Üç proje aynı siteyi kullanıyor. A bizim projemiz: bildirimini çözümleyip en yeni uygun sürümleri seçiyor. B ve C komşu projeler; ikisi de kendi kilitleriyle geliyor, yani kuracakları sürümler önceden yazılmış ve çözümleme yapmıyorlar. Üç projenin paket kümeleri kısmen örtüşüyor.

Kurulumun modeldeki davranışı tek satırlıktır: bir paketi kurmak, sitedeki sürümün üzerine yazmaktır. Son kuran kazanır. Bu, tek siteli bir yerleşimin kaçınılmaz davranışıdır; bir ad bir sürüme bağlanabildiği için kuran son proje bağı kendi lehine çevirir.

A’nın çözümlemesi altı sıranın hepsinde aynıdır ve ölçümde bu ayrıca yazdırılır. Değişen şey A’nın çözdüğü küme değil, koşum anında gördüğü kümedir.

Ölçümün varsayımları:

  • OB1 — Kâhin kurgunun kendisidir: depodaki sürümleri ve üç projenin isteklerini biz yazdık, bu yüzden her sıranın doğru sonucu ölçmeden bilinir.
  • OB2 — Depo ve bildirim ortak tanımdan birebir alınır; ders ikisini de değiştirmez.
  • OB3 — A bildirimini en yeni uygun sürüm stratejisiyle çözer. Strateji bu derste sabittir; değiştiğinde ne olduğu sonraki iki dersin konusudur.
  • OB4 — B ve C çözümleme yapmaz; kuracakları sürümler kilitlerinde yazılıdır ve kurgunun parçasıdır.
  • OB5 — Kurulum sitedeki sürümün üzerine yazar. Sürüm karşılaştırması ya da “zaten kurulu” denetimi yoktur; modelin tek kuralı son kuranın kazanmasıdır.
  • OB6 — Paylaşılan rejimde tek site vardır ve üçü de oraya kurar. Yalıtılmış rejimde her projenin kendi sitesi vardır.
  • OB7 — Ölçülen şey A’nın sitesinde koşum anında duran olcum, ortak ve rapor sürümleridir; öbür projelerin ne gördüğü sayılmaz.
  • OB8 — Altı sıra üç projenin bütün kurulum sıralarıdır; hiçbiri ayrıcalıklı değildir. Gerçek bir makinede sırayı belirleyen şey kurulumların takvimidir ve proje onu seçmez.
  • OB9 — Kurulum bir sözlüğe yazma işlemidir. Gerçek kurulum yapılmaz, gerçek paket indirilmez, depoya dosya bırakılmaz.
  • OB10 — Süre ölçülmez. Sayılan şey ayrı sonuç ve ayrı sonucu üreten sıra sayısıdır.
  • OB11 — Ölçüm tek koşumdur ve belirlenimcidir; kurguda rastgelelik yoktur.

Ölçüm

"""Yalitim: ayni cozumleme, ayri site; kurulum sirasi kac ayri sonuc veriyor."""
from itertools import permutations

DEPO = {
    "olcum": [(1, 0), (1, 1), (1, 2), (2, 0)],
    "rapor": [(0, 9), (1, 0), (1, 1)],
    "ortak": [(3, 0), (3, 1), (3, 2), (4, 0)],
}
BILDIRIM = {"olcum": ((1, 0), (2, 0)), "rapor": ((1, 0), (2, 0)),
            "ortak": ((3, 0), (4, 0))}

# Komsu projeler kendi kilitleriyle geliyor; ayni depoyu ayri surumlerde kullaniyorlar.
KOMSU = {"B": {"ortak": (3, 0), "rapor": (1, 0)},
         "C": {"olcum": (1, 1), "ortak": (3, 1)}}
PAKETLER = ("olcum", "ortak", "rapor")


def uygun(paket):
    alt, ust = BILDIRIM[paket]
    return [s for s in DEPO[paket] if alt <= s < ust]


def coz(strateji="en yeni"):
    secim = {}
    for paket in sorted(BILDIRIM):
        adaylar = uygun(paket)
        secim[paket] = adaylar[-1] if strateji == "en yeni" else adaylar[0]
    return secim


def yaz(site, secim):
    """Kurulum sitedeki surumun uzerine yazar: son kuran kazanir."""
    site.update(secim)
    return site


def secimi(ad):
    return coz() if ad == "A" else KOMSU[ad]


def paylasilan(sira):
    site = {}
    for ad in sira:
        yaz(site, secimi(ad))
    return tuple(site[p] for p in PAKETLER)


def yalitilmis(sira):
    siteler = {"A": {}, "B": {}, "C": {}}
    for ad in sira:
        yaz(siteler[ad], secimi(ad))
    return tuple(siteler["A"][p] for p in PAKETLER)


def yazim(goru):
    return " / ".join(".".join(map(str, s)) for s in goru)


SIRALAR = list(permutations(("A", "B", "C")))
BEKLENEN = tuple(coz()[p] for p in PAKETLER)

print(f"{'kurulum sırası':<16s} {'paylaşılan sitede A':>21s} {'yalıtılmış sitede A':>21s}")
p_goru, y_goru = [], []
for sira in SIRALAR:
    a, b = paylasilan(sira), yalitilmis(sira)
    p_goru.append(a)
    y_goru.append(b)
    print(f"{' '.join(sira):<16s} {yazim(a):>21s} {yazim(b):>21s}")

print(f"\nA'nın çözümlemesi altı sıranın hepsinde {yazim(BEKLENEN)}")
print(f"altı kurulum sırası, paylaşılan sitede {len(set(p_goru))} ayrı sonuç, "
      f"yalıtılmış sitede {len(set(y_goru))}")
print(f"çözdüğü kümeyi gören sıra: paylaşılan {p_goru.count(BEKLENEN)}/{len(SIRALAR)}, "
      f"yalıtılmış {y_goru.count(BEKLENEN)}/{len(SIRALAR)}")
kurulum sırası     paylaşılan sitede A   yalıtılmış sitede A
A B C                  1.1 / 3.1 / 1.0       1.2 / 3.2 / 1.1
A C B                  1.1 / 3.0 / 1.0       1.2 / 3.2 / 1.1
B A C                  1.1 / 3.1 / 1.1       1.2 / 3.2 / 1.1
B C A                  1.2 / 3.2 / 1.1       1.2 / 3.2 / 1.1
C A B                  1.2 / 3.0 / 1.0       1.2 / 3.2 / 1.1
C B A                  1.2 / 3.2 / 1.1       1.2 / 3.2 / 1.1

A'nın çözümlemesi altı sıranın hepsinde 1.2 / 3.2 / 1.1
altı kurulum sırası, paylaşılan sitede 5 ayrı sonuç, yalıtılmış sitede 1
çözdüğü kümeyi gören sıra: paylaşılan 2/6, yalıtılmış 6/6

Altı Sıra, Beş Sonuç

Sol sütun altı satırda beş ayrı küme veriyor. Yalnız iki sıra aynı sonucu üretiyor (B C A ile C B A), ve ikisinin ortak özelliği A’nın son kurmuş olmasıdır. Kalan dört sıranın her biri kendi kümesini veriyor.

İlk satır uç durumu veriyor. A B C sırasında A önce kuruyor ve üç paketini de kendi seçtiği sürümlerle yazıyor; sonra B ortak ile rapor üzerine, sonra C olcum ile ortak üzerine yazıyor. Sonuçta A’nın gördüğü üç sürümün üçü de başka projelerden geliyor — kendi kararlarından ayakta kalan yok. B A C sırasında yalnız rapor ayakta kalıyor, çünkü C o paketi hiç kurmuyor. C A B sırasında ayakta kalan tek paket olcum; ortak ile rapor en son B’den geliyor.

Bu beş sonucun hiçbiri bildirimi çiğnemiyor. A’nın bildirimi ortak için üç sürümü de kabul ediyor, olcum için üçünü de, rapor için ikisini de. Yani A hangi sırada kurulursa kurulsun kabul ettiği bir sürümle karşılaşıyor ve hiçbir uyarı doğmuyor. Kusurun sessiz olması buradan geliyor: bildirim bir aralık olduğu için, aralığın içindeki her sapma meşrudur.

Beş kümeden yalnız biri A’nın kendi seçimidir. Kalan dördünü A hiç seçmedi, hiç istemedi ve hiçbir yerde yazmadı; yine de kodu o dördünün üzerinde koştu. Bu, ayrı sonucun neden “çalıştı” ya da “çalışmadı”dan ayrı bir ölçü olduğunu gösteriyor: altı sıranın altısında da proje koşabilir, hiçbiri hata vermeyebilir, ve arkada beş ayrı kurulum durur.

Sağ sütun aynı altı sırayı yalıtılmış rejimde gösteriyor ve tek bir küme veriyor: 1 ayrı sonuç. Altı sıranın altısında A, kendi çözdüğü kümeyi görüyor.

Alt satır farkı en keskin biçimde yazıyor. Paylaşılan sitede A, çözümlemesinin sonucunu altı sıranın ikisinde görüyor; yalıtılmış sitede altısında. Dörtte üçlük bir sapmanın kaynağı A’nın kendi kararlarında değil, tamamen dışarıdadır.

Yalıtımın Tekleştirmediği

Yalıtım bir şeyi çözer ve bir şeyi çözmez. Bu ayrım kursun geri kalanının çatısıdır.

Çözdüğü: komşu projelerin kararları ve kurulum sırası artık sonucu değiştirmiyor. Beş ayrı sonuç bire indi ve indiren şey daha iyi bir çözümleme değil, sınırın kendisi oldu. A’nın çözümlemesi ölçümün başında da sonunda da aynıydı; değişen, çözümlemenin sonucunun korunup korunmadığıydı.

Çözmediği: A’nın çözümlemesinin kendisi. Yalıtılmış sitede bile kurulan küme, o çözümlemenin hangi kuralla yapıldığına bağlıdır. Ölçümde bu kural sabit tutuldu — en yeni uygun sürüm — ve bu yüzden sağ sütun tek bir küme verdi. Kural değişseydi sağ sütun da değişirdi, çünkü bildirim bir sürüm değil bir aralık söylüyor.

İkinci sınır daha da dışarıdadır: aynı bildirim, depo değiştiğinde de ayrı bir küme verebilir. Bugün en yeni olan sürüm yarın en yeni olmayabilir ve bildirim yeni olanı da kabul eder. Yalıtım bu ikisine karşı hiçbir şey yapmaz; sınır, sitenin duvarında biter.

Bir sanal ortam bu yüzden yeniden üretilebilirliğin tamamı değil, ilk koşuludur. Sınırı çizmek, sınırın içinde ne olacağına karar vermekle aynı şey değildir.

Özet

  • Kursun ölçüsü ayrı sonuçtur: bir projenin sayısı çalışıp çalışmadığı değil, aynı girdinin kaç ayrı sonuç verdiğidir.
  • Sanal ortam bir yalıtım sınırıdır; sağladığı tek şey aynı adlı paketin iki projede iki ayrı sürümde bulunabilmesidir.
  • Tek site paylaşıldığında kurulum sırası sonucu belirler: altı sıra 5 ayrı sonuç verir ve proje kendi çözdüğü kümeyi yalnız 2/6 sırada görür.
  • Yalıtılmış sitede aynı altı sıra 1 ayrı sonuç verir ve proje kümesini 6/6 sırada görür; A’nın çözümlemesi iki rejimde de aynıdır, korunan şey çözümlemenin sonucudur.
  • Beş sonucun hiçbiri bildirimi çiğnemez; bildirim bir aralık olduğu için aralık içindeki sapma sessizdir ve uyarı üretmez.
  • Yalıtım komşuyu ve sırayı eler, ama çözümlemenin kendi kuralını ve deponun zaman içinde değişmesini elemez.

Sonraki Adım

Yalıtılmış sitedeki tek sonuç, ölçümde bir kuralın sabit tutulmasıyla elde edildi: en yeni uygun sürüm. O kural bir seçimdi ve başka seçimler de bildirime uygundur. Sonraki ders sınırın içine bakar ve aynı soruyu bir kez daha sorar: aynı bildirim, tek başına kaç ayrı sürüm kümesi belirtiyor? Ölçüm iki kuralı yan yana koyar, çıkan sayıyı bir dosyaya yazdırır, ve o dosyanın çözümlemeyi ortadan kaldırıp kaldırmadığını sınar.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat