---
title: 'Programlanabilir Arayüzler'
source: 'https://academia.sh/tr/kurslar/ag-isletimi/programlanabilir-arayuzler'
course: 'Ağ İşletimi ve Otomasyon'
language: tr
updated: '2026-08-17T18:07:15+00:00'
license: 'CC BY-SA 4.0'
---

# Programlanabilir Arayüzler

Aynı değişiklik üç istek biçimiyle uygulandığında ekleme biçimi kırk aygıtın kırkında ikinci uygulamada durumu değiştirir; yanıt alınamayan dokuz aygıt yeniden denendiğinde ekleme beşini bozar, etkisiz iki biçim hiçbirini bozmaz ama tam değişim dokuz aygıtın model dışı alanını siler.

Önceki ders yapılandırma modelinin ne söyleyebildiğini ölçtü ve modelin yazıldığı yerde
durduğunu varsaydı. Model bir işe yaraması için aygıta ulaşmak zorundadır: bir yerden bir
istek gider, aygıt onu alır, uygular ve bir yanıt döner. Bu yolun kendi kuralları vardır.

En önemlisi tek bir soruda toplanır: **aynı isteği iki kez göndermek ne yapar?** Soru
kuramsal görünür ama işletmede en sık karşılaşılan durumdan doğar — yanıt gelmez ve operatör
isteğin uygulanıp uygulanmadığını bilemez. Bu dersin ölçtüğü şey arayüzün hızı ya da
zarafeti değil, bu sorunun yanıtıdır.

## Arayüz Ne Sağlar

Bir aygıta yapılandırma göndermenin en eski yolu, bir kabuk oturumu açıp komut yazmaktır.
Bu yolun otomasyon açısından üç kusuru vardır ve üçü de aynı kökten gelir: **çıktı insan için
biçimlendirilmiştir.**

Bir betik, komutun başarılı olup olmadığını ancak çıktı metnini ayrıştırarak anlayabilir.
Metnin biçimi değişirse betik sessizce yanlış okur. Hata durumunda dönen şey bir hata
kodu değil, bir cümledir. Ve birden çok komutun birlikte uygulanması diye bir kavram yoktur —
üçüncü komut kabul edilmezse ilk ikisi çoktan yürürlüktedir.

**Programlanabilir arayüz (programmable interface)** üçünü birden kapatır. İstek de yanıt da
önceki dersin modeline göre yapılandırılmıştır; alanlar adlarıyla gelir ve ayrıştırılacak bir
metin yoktur. Hata, işlenebilir bir yapı olarak döner: hangi alanın hangi kısıtı çiğnediği
bildirilir. Ve değişiklik bir **işlem sınırı** içine alınabilir — istek önce **aday
yapılandırma** olarak biriktirilir, doğrulanır, sonra tek bir adımda yürürlüğe alınır.

```text
# ogretilen istek/yanit dokumu , calistirilmamistir

istek
  hedef  : aygit/34
  islem  : birlestir
  govde  : { oncelik: 3 , kural: [ taban , sablon_kurali ] }

yanit
  durum  : kabul
  degisen: [ oncelik , kural ]
  islem  : 7f
```

Yanıttaki `degisen` listesi arayüzün en çok işe yarayan alanıdır: aygıt neyin gerçekten
değiştiğini söyler. Liste boş dönerse istek uygulanmış ama hiçbir şeyi değiştirmemiştir —
yani aygıt zaten istenen durumdaydı.

## Üç İstek Biçimi

Aynı değişiklik üç ayrı biçimde istenebilir ve üçü aygıtta aynı sonucu bırakmaz.

**Ekleme.** İstek "şu kuralı listeye ekle" der. Aygıt listeye bir satır daha koyar. İki kez
gönderilirse liste iki satır alır.

**Birleştirme.** İstek "şu alanların değeri şudur" der. Aygıt alanları anahtarlarına göre
eşler ve üzerine yazar; listelerde aynı girdiyi yinelemez. İki kez gönderilirse ikincisi
hiçbir şey değiştirmez.

**Tam değişim.** İstek yapılandırmanın tamamını verir. Aygıt kendisindekini atar ve isteği
neyse onu kurar. İki kez gönderilirse ikincisi hiçbir şey değiştirmez — ama ilk gönderim,
istekte bulunmayan her alanı da silmiştir.

Bir arayüzün **etkisiz (idempotent)** olması budur: isteği bir kez uygulamakla iki kez
uygulamak aynı durumu bırakıyorsa arayüz etkisizdir. Etkisizlik bir hız ya da doğruluk
özelliği değildir; **yeniden denenebilirlik** özelliğidir.

## Yanıt Kaybı ve Yeniden Deneme

Etkisizliğin neden bir işletme sorunu olduğu tek bir kurguda görülür. İstek gönderilir, aygıt
onu alır ve uygular, ama yanıt geri dönerken kaybolur. Operatörün elinde hiçbir bilgi yoktur:
istek aygıta hiç ulaşmamış da olabilir, uygulanmış da olabilir. İkisi dışarıdan
ayırt edilemez.

Bu durumda yapılabilecek tek şey yeniden denemektir. Etkisiz bir arayüzde yeniden deneme
bedelsizdir — istek uygulanmışsa ikincisi hiçbir şey yapmaz, uygulanmamışsa uygular. Etkisiz
olmayan bir arayüzde ise yeniden deneme, **başarılı olmuş aygıtları bozar**. Ve bozulanlar
tam olarak isteğin çalıştığı aygıtlardır.

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

- **OT13** — Kırk aygıtlık özne kümesi kursun sabitidir. Her aygıtın değişiklikten önceki
  durumu niteliklerinden türetilir: arayüz, adres ve bir taban kuralı; özel aygıtta ek olarak
  modelin taşımadığı yerel kural.
- **OT14** — Üç istek biçimi **aynı** değişikliği taşır: bir kural eklemek ve önceliği
  ayarlamak. Fark yalnız isteğin biçimindedir, içeriğinde değil.
- **OT15** — Etkisizlik ölçütü durumların karşılaştırılmasıdır: isteği bir kez uygulamakla
  iki kez uygulamak aynı durumu bırakıyorsa arayüz etkisizdir. Ölçüm arayüzün kendi
  bildirimine bakmaz.
- **OT16** — Yanıt kaybı kurgunun parametresidir: her beş aygıttan birinde yanıt alınamaz ve
  yanıtsız kalanların yaklaşık yarısında istek aslında uygulanmıştır. Bu bir ölçüm değildir;
  oran değişirse satırlar aynı yönde ölçeklenir.
- **OT17** — Yeniden deneme, yanıt alınamayan bütün aygıtlara aynı isteği yeniden gönderir.
  Operatör hangisinin uygulandığını bilemez; bilseydi yeniden denemeye gerek kalmazdı.
- **OT18** — Şablon aygıtın sınıfına göre yazılır ve rapor etkileşim sınıfı üzerine
  kuruludur; sınıfı uyuşmayan özel aygıt sapar, başka sınıftaki sapma rapora düşmez.

## Ölçüm

```python
"""Programlanabilir arayuz: ayni istegi iki kez gondermenin sonucu.

Bolum 1 - uc istek bicimi, ikinci uygulamanin biraktigi fark.
Bolum 2 - yanit kayboldugunda yeniden deneme neyi bozar.
Bolum 3 - kuyruk: sablonun disinda kalan ve raporda gorunmeyen.
"""
TOHUM = 20260812
EK = "sablon_kurali"
BICIMLER = ("ekleme", "birlestirme", "tam degisim")


def uretec(tohum):
    d = tohum % 2147483646 + 1

    def r(n):
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def ozneler(sayi=40, tohum=TOHUM):
    r, liste = uretec(tohum), []
    for i in range(sayi):
        liste.append({"no": i + 1, "kapasite": 20 + r(81),
                      "gecikme": 5 + r(45),
                      "sinif": ("etkilesim", "toplu", "yedek")[r(3)],
                      "ozel": r(9) == 0})
    return liste


def durum(o):
    """Aygitin degisiklikten onceki yapilandirmasi."""
    d = {"arayuz": "ana", "adres": f"a{o['no']}", "kural": ["taban"]}
    if o["ozel"]:
        d["yerel_kural"] = f"k{o['no']}"
    return d


def istek(d, bicim):
    """Ayni degisiklik uc ayri istek bicimiyle uygulanir."""
    y = {k: (list(v) if isinstance(v, list) else v) for k, v in d.items()}
    if bicim == "ekleme":
        y["kural"] = y["kural"] + [EK]
    elif bicim == "birlestirme":
        y["kural"] = [k for k in y["kural"] if k != EK] + [EK]
    elif bicim == "tam degisim":
        y = {"arayuz": "ana", "adres": d["adres"], "kural": ["taban", EK]}
    y["oncelik"] = "3"
    return y


def uygula(oz, sablon_sinifi):
    """Tek sablon kirk aygita uygulanir; ozel aygitlar sapar."""
    uyan = sapan = gizli = 0
    for o in oz:
        if o["sinif"] == sablon_sinifi or not o["ozel"]:
            uyan += 1
        else:
            sapan += 1
            if o["sinif"] != "etkilesim":
                gizli += 1
    return uyan, sapan, gizli


oz = ozneler()
print(f"özne {len(oz)} | model dışı alan taşıyan aygıt "
      f"{sum(o['ozel'] for o in oz)} | istek biçimi {len(BICIMLER)}")
print()
print(f"{'istek biçimi':<14s} {'ikinci uygulama değiştirir':>26s} {'etkisiz':>8s} "
      f"{'model dışı alanı silinen':>25s}")
for b in BICIMLER:
    degisen = silinen = 0
    for o in oz:
        d = durum(o)
        bir = istek(d, b)
        iki = istek(bir, b)
        if iki != bir:
            degisen += 1
        if "yerel_kural" in d and "yerel_kural" not in bir:
            silinen += 1
    print(f"{b:<14s} {degisen:26d} {'hayır' if degisen else 'evet':>8s} "
          f"{silinen:25d}")

print()
r = uretec(TOHUM + 11)
yanitsiz, uygulanmis = [], set()
for o in oz:
    if r(5) == 0:
        yanitsiz.append(o["no"])
        if r(2) == 0:
            uygulanmis.add(o["no"])
print(f"yanıt alınamayan aygıt {len(yanitsiz)} | bunlardan isteği aslında "
      f"uygulamış olan {len(uygulanmis)}")
print()
print(f"{'istek biçimi':<14s} {'yeniden denenen':>16s} {'doğru duruma gelen':>19s} "
      f"{'bozulan':>8s}")
for b in BICIMLER:
    dogru = bozuk = 0
    for no in yanitsiz:
        o = oz[no - 1]
        d = durum(o)
        hedef = istek(d, b)
        onceki = hedef if no in uygulanmis else d
        son = istek(onceki, b)
        if son == hedef:
            dogru += 1
        else:
            bozuk += 1
    print(f"{b:<14s} {len(yanitsiz):16d} {dogru:19d} {bozuk:8d}")

print()
print(f"{'şablon sınıfı':<14s} {'uyan':>6s} {'sapan':>6s} "
      f"{'raporda görünmeyen':>19s} {'şablonu alan ve model dışı alan taşıyan':>40s}")
for s in ("etkilesim", "toplu", "yedek"):
    u, sp, g = uygula(oz, s)
    riskli = sum(1 for o in oz if o["ozel"] and o["sinif"] == s)
    print(f"{s:<14s} {u:6d} {sp:6d} {g:19d} {riskli:40d}")
```

```
özne 40 | model dışı alan taşıyan aygıt 9 | istek biçimi 3

istek biçimi   ikinci uygulama değiştirir  etkisiz  model dışı alanı silinen
ekleme                                 40    hayır                         0
birlestirme                             0     evet                         0
tam degisim                             0     evet                         9

yanıt alınamayan aygıt 9 | bunlardan isteği aslında uygulamış olan 5

istek biçimi    yeniden denenen  doğru duruma gelen  bozulan
ekleme                        9                   4        5
birlestirme                   9                   9        0
tam degisim                   9                   9        0

şablon sınıfı    uyan  sapan  raporda görünmeyen  şablonu alan ve model dışı alan taşıyan
etkilesim          34      6                   6                                        3
toplu              34      6                   3                                        3
yedek              34      6                   3                                        3
```

## Etkisizliğin Ölçüsü

Üst tablo üç biçimi ayırıyor. **Ekleme** biçiminde ikinci uygulama kırk aygıtın
**kırkında** durumu değiştiriyor; arayüz etkisiz değil. **Birleştirme** ve **tam değişim**
biçimlerinde ikinci uygulama **hiçbir** aygıtta bir şey değiştirmiyor; ikisi de etkisiz.

Kırkın kırkı olması dikkat çekicidir. Etkisizlik ihlali bir azınlık olayı değildir: ekleme
biçiminde **her** aygıt ikinci uygulamada bozulur, çünkü bozulmanın nedeni aygıtın bir
özelliği değil isteğin biçimidir. Bu, bu kursta ölçtüğümüz öteki kuyrukların tersidir —
burada kuyruk yoktur, kaldıraç kırkın kırkına aynı biçimde yanlış hizmet eder.

Sağdaki sütun ikinci ayrımı veriyor ve etkisiz olmanın yetmediğini gösteriyor. **Tam
değişim** etkisizdir ama **9** aygıtın model dışı alanını siler. İstek o alanı taşımadığı
için aygıt onu bir eksik değil, bir **fazla** sayar ve atar. Önceki dersin dokuz `yerel_kural`
alanı burada yok olur; hem de arayüz hiçbir kusur bildirmeden, çünkü bu tam olarak istenen
işlemin tanımıdır.

Yani etkisizlik ile güvenlik ayrı iki özelliktir. Etkisiz olmayan bir arayüz yeniden
denemede bozar; etkisiz ama tam değişimli bir arayüz **ilk** denemede siler. İkisinin
kesişiminde duran biçim birleştirmedir: hem yeniden denenebilir hem de dokunmadığı alanı
korur.

## Yeniden Denemenin Ödettiği

Orta tablo kurguyu çalıştırıyor. Kırk aygıtın **9**'unda yanıt alınamıyor ve bunların
**5**'inde istek aslında uygulanmış. Operatörün elinde bu ayrımı yapacak bir bilgi yok;
dokuzunun dokuzunu da yeniden denemek zorunda.

**Ekleme** biçiminde yeniden deneme sonrası doğru duruma gelen aygıt **4**, bozulan **5**.
Bozulan beş aygıt, isteğin ilk seferde **çalıştığı** aygıtlardır. Bu sonucun biçimi
işletme açısından en kötüsüdür: yordam başarılı olduğu yerde zarar verir, ve zararın büyüklüğü
başarının büyüklüğüyle orantılıdır.

**Birleştirme** ve **tam değişim** biçimlerinde dokuz aygıdın dokuzu doğru duruma geliyor,
bozulan **0**. Etkisizliğin kazandırdığı tam olarak budur ve başka bir şey değildir: yeniden
denemeyi **düşünmeden** yapılabilir hâle getirir.

Kırk öznelik bir kümede ölçülebilen en küçük fark **1/40 = 0,025**'tir. Beş bozuk aygıt
**0,125**'lik bir paydır ve bandın rahatça içindedir.

## Etkisizliğin Korumadığı Şey

Etkisizlik operatörü **kendi** yinelemesine karşı korur. Korumadığı bir durum vardır ve
arayüzün okuma tarafından doğar.

Bir betiğin tipik döngüsü üç adımdır: aygıdın durumunu oku, üzerinde değişikliği hesapla,
sonucu yaz. Okuma etkisizdir, yazma etkisiz olabilir; ama **üçü birlikte** bir bütün değildir.
İki operatör aynı aygıtta aynı anda bu döngüyü çalıştırırsa, ikincisi birincinin okuduğundan
sonra yazar ve birincinin yazdığını görmeden onun üstüne yazar. Sonuç iki değişikliğin
toplamı değil, ikincisinin tek başına sonucudur; ve hiçbir istek hata döndürmez, çünkü her
istek kendi başına geçerlidir.

Etkisizlik burada hiçbir şey yapmaz. Aynı isteği iki kez göndermek sorun değildir; sorun
**iki ayrı isteğin** araya girmesidir. Arayüzün bu duruma karşı iki aracı vardır. Birincisi
işlem sınırıdır: değişiklik aday yapılandırmada birikirken aygıt bir kilit tutar ve ikinci
operatörün yazması reddedilir. İkincisi damgadır: her yapılandırmanın bir damgası olur, istek
"şu damgayı gördüm, onun üstüne yazıyorum" der ve damga değişmişse istek reddedilir. İkisi de
sorunu çözmez, **görünür kılar** — reddedilen istek bir hata değil, bir bildirimdir.

## Arayüzün Açtığı Yüzeyler ve Daraltmalar

Programlanabilir bir arayüz, aygıtın yapılandırmasını değiştirebilen bir yoldur; bu tanım
gereği bir yüzeydir. Sayılan yüzeyler ve daraltmaları şunlardır.

**Birinci yüzey — yönetim yolunun kendisi.** Arayüz açıksa aygıtın yapılandırması ağ
üzerinden değiştirilebilir. **Daraltma:** arayüz ayrı bir yönetim ağına bağlanır ve veri
trafiğinin geçtiği yoldan erişilemez; erişim kaynağı adresle sınırlanır; okuma yetkisi ile
yazma yetkisi ayrı verilir. Bu üç daraltma birbirinin yerine geçmez, üst üste konur.

**İkinci yüzey — kimlik bilgisinin nerede durduğu.** Betik aygıta bağlanmak için bir kimlik
kullanır ve o kimlik bir yerde durur. Kimlik bilgisi, anahtar ve erişim belirteci bu kursun
hiçbir örneğinde yazılmaz. **Daraltma:** değer betiğin, şablonun ya da yapılandırma
deposunun içinde durmaz; betik yalnız bir başvuru taşır ve değeri çalıştığı ortamdan alır.

**Üçüncü yüzey — tam değişimin sildiği alan.** Ölçümde **9** aygıt, isteğin taşımadığı bir
alanı kaybediyor. Bu bir saldırı değil, arayüzün tanımlı davranışıdır ve tam olarak bu
yüzden tehlikelidir — hiçbir uyarı üretmez. **Daraltma:** tam değişim yalnız yapılandırmanın
tamamının gerçekten bilindiği durumda kullanılır; bilinmiyorsa birleştirme kullanılır.
Model dışı alan taşıyan aygıtlar önceden listelenir ve tam değişimin kapsamı o listeyle
kesiştiğinde işlem durdurulur.

**Dördüncü yüzey — kendi erişimini kesen değişiklik.** Yönetim arayüzünün kendisini kapatan,
yönetim ağının adresini değiştiren ya da erişimi filtreleyen bir istek uygulandığı anda
aygıta bir daha ulaşılamaz. Böyle bir isteğin komutu bu kursta çalıştırılabilir biçimde
yazılmaz; söylenecek şey geri alınamaz olduğudur. **Daraltma:** değişiklik önce aday
yapılandırma olarak yazılır, kuru çalışmayla sonucu hesaplanır, sonra bir **geri alma
zamanlayıcısıyla** yürürlüğe alınır — belirli bir süre içinde operatör onaylamazsa aygıt
kendiliğinden eski yapılandırmaya döner. Zamanlayıcı, erişimini kaybetmiş bir operatörün
elindeki tek araçtır.

## Özet

- Programlanabilir arayüz yapılandırılmış istek ve yanıt, işlenebilir hata ve işlem sınırı
  sağlar; kabuk çıktısını ayrıştıran bir betiğin üç kusurunu birden kapatır.
- Ekleme biçimi etkisiz değildir: ikinci uygulama kırk aygıtın **40**'ında durumu değiştirir.
  Birleştirme ve tam değişim etkisizdir, ikisinde de **0**.
- Yanıt alınamayan **9** aygıtın **5**'inde istek aslında uygulanmıştır; yeniden denemede
  ekleme biçimi bu **5**'ini bozar, etkisiz iki biçim **0** bozar.
- Etkisizlik ile güvenlik ayrıdır: tam değişim etkisizdir ama **9** aygıtın model dışı
  alanını ilk uygulamada siler ve hiçbir kusur bildirmez.
- Şablon tarafında uyan **34**, sapan **6**, raporda görünmeyen **6 / 3 / 3**; şablonu alan
  aygıtların **3**'ü model dışı alan taşır ve tam değişimde kaybedecek olan da onlardır.

## Sonraki Adım

Bu ders tek bir isteğin tek bir aygıtta ne bıraktığını ölçtü. İşletmede istek tek değildir:
bir betik kırk aygıta sırayla bağlanır, her birine aynı şablonu uygular ve sonunda bir rapor
yazar. Sonraki ders o betiğin kendisini ölçer — toplu değişikliğin kuru çalışmayla önden
hesaplanması, dilimler hâlinde yayılması ve geri alınması. Ve asıl soruyu orada yanıtlarız:
şablon uygulandığında kaç aygıt şablonun dışında kalıyor, ve o aygıtların kaçı yazılan
raporda görünüyor.
