Herkes için YAML

Mert Kışlakçı
Turk Telekom Bulut Teknolojileri
6 min readJun 10, 2022

Selamlar… Bu yazı dizisinde son zamanlarda oldukça popüler olan YAML’den bahsedeceğiz.

YAML v1.0–2004'te ortaya çıktı. Düz metin serileştirmeyi kolaylaştırmak için daha önce Perl’de XML’in basitleştirilmiş bir sürümü olarak kullanılıyordu.

YAML (Ain’t Markup Language)

YAML zaman içinde geliştirilmeye devam edilirken, geliştiriciler JSON’un varlığından habersizdiler. JSON ile tesadüfen tanıştılar ve ardından JSON’u YAML’nin bir alt kümesi olarak konumlandırdılar. Kısa sürede YAML başta Python olmak üzere birçok farklı dilin kütüphanelerinde yer almaya başladı ve popülaritesi katlanarak arttı.

YAML Step by Step

Peki ama YAML nedir, ne değildir veya neden bu kadar popüler hale gelmiştir bunlara bir cevap bulamak gerekirse:

  • YAML bir programlama dili değil, bir veri serileştirme dilidir.
  • YAML sözdizimi, veri nesnelerini metne dönüştürmek için kullanılabilir.
  • Veri göndermek ve depolamak için kullanışlıdır.
  • Biçim yorumlanabilir, yani insanlar tarafından kolayca okunabilir.
  • YAML’deki serileştirilmiş verilerin metni, ‘unicode’ yani yazdırılabilir karakterlerden oluşur. Bu, verileri temsil etmek için harflerin, sayıların, noktalama işaretlerinin vb. kullanılabileceği anlamına gelir.
  • Docker ve Kubernetes gibi diğer büyük teknolojiler, yapılandırma dosyalarını derlerken genellikle YAML tercih eder.

YAML Kullanmanın Avantajları

  1. Diller arası veri paylaşımı (Cross-language data sharing): YAML, nesneleri seri hale getirmek için kullanılabilir veya diller arasında veri paylaşımı için kullanılabilir. Örneğin, nesneler javascript’te seri hale getirilebilir ve ardından PHP’de kullanılmak üzere dışa aktarılabilir.
  2. Yapılandırma dosyaları (Configuration files): YAML yapılandırma dosyaları için de çok kullanışlıdır. Yapılandırma gereksinimleri, YAML’nin temel temel bloklarıyla uyumludur.
  3. Log dosyaları (Log files): YAML, kendi belgelerine göre günlüğe kaydetme için kullanılabilir ve standartların benimsenmesi, YAML’yi destekleyen panoların günlük dosyalarını otomatik olarak işlemesine olanak tanır
  4. Nesne kalıcılığı (Object persistence): YAML’nin sadece otomatik yorumlayıcı tarafından değil, aynı zamanda insanlar tarafından da yorumlanması kolaydır.
  5. Farklı yazılım dillerinde çalışma (Working in different programming languages): PHP, JS ve Python gibi YAML yerel veri yapısıyla eşleşen dillerle entegre olabilir.

YAML temel olarak 3 yapı taşı üzerine kurulmuştur.

  • Diziler (Sequence): Listeler
  • Anahtar Değer Çiftleri (Mapping): Sözlükler
  • Skaler (Scalar): Sayılar, Boolean, Timestamp
YAML Style

YAML dosyaları yazarken tercih edebileceğiniz iki stil vardır:

Block Style: Her dize elemanının başına (-) ile eklenmesiyle yazılır. Blok tarz girdilere duyarlıdır.

block:
- YAML
- JSON
- XML

Blok tarz kullanarak yazdığınızda aslında böyle yorumlanacaktır.

{'block': ['YAML', 'JSON', 'XML']}

Flow Style: JSON formatta [], {} kullanarak da yazmanıza izin veren tarzdır. Flow tarz girdilere duyarlı değildir.

flow: [YAML, JSON, XML]

Flow tarz kullanarak yazdığınızda aslında böyle yorumlanacaktır.

{'flow': ['YAML', 'JSON', 'XML']}

YAML da dosya yazarken aynı anda hem blok hem de flow tarzı kullanabilirsiniz.

kind:
fruits:
- apple
- banana
- cherry
vegetables: [tomato, cucumber, lettuce]

İki tarzı da kullanarak yazdığınızda aslında böyle yorumlanacaktır:

{
'kind':
{
'fruits': ['apple', 'banana', 'cherry'],
'vegetables': ['tomato', 'cucumber', 'lettuce']
}
}

İç içe Diziler (Nested Sequences): YAML da iç içe diziler oluşturulabilir.

flow_list:
- [yaml, json]
- [python, java]
#result = {'flow_list': [['yaml', 'json'], ['python', 'java']]}--------------------------------------------------------------------
block_lists:
-
- Yaml
- Json
-
- Python
- Java
#result = {'Block_lists': [['Yaml', 'Json'], ['Python', 'Java']]}

Yorum Satırı: YAML da yorum satırları # işareti ile yazılır.

desserts: #desserts made with sherbet
- kunefe
- baklava
- tulumba
#result = {'desserts': ['kunefe', 'baklava']}

Etiketler (Tags): Etiketleri kullanarak sayıları metin ifadesi olarak alabilir. Özel karakterleri metin olarak yazdırabilirsiniz.

spec:
cpu: !!int 4
ram: !!str 1024Mi
#result = {'spec': {'cpu': 4, 'ram': '1024Mi'}}

Tarihler (Dates): YAML da timestamp (2022–03–22T22:19:56.10+02:00) gibi tarih değişkenlerini bir dize olarak saklamak isterseniz !!str ile kullanmanız gerekir.

date:
timestamp: 2001-12-14T21:59:43.10-05:00
#result = {'date': {'timestamp': datetime.datetime(2001, 12, 14, 21, 59, 43, 100000, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=68400)))}}--------------------------------------------------------------------
date:
timestamp: !!str 2001-12-14T21:59:43.10-05:00
#result = {'date': {'timestamp': '2001-12-14T21:59:43.10-05:00'}}

YAML DRY: YAML işaretlenen yerlerin başka bir dizi de tekrarlanmasını sağlar. Tekrarlanması istenen ifadelerin başına & eklenir ve tekrarın yapılacağı yere de * ile belirtilir. Ayrıca tekrar edilecek ifade de değiştirilecek yerler varsa << koyulmalıdır.

Person: &person
Name: Mert
Age: 25
Adress:
Street: Gebze
City : Kocaeli
Person1:
<<: *person
Name: Onur
Age: 20
#result = {'Person': {'Name': 'mert', 'Age': 25, 'Adress': {'Street': 'Gebze', 'City': 'Kocaeli'}}, 'Person1': {'Name': 'onur', 'Age': 20, 'Adress': {'Street': 'Gebze', 'City': 'Kocaeli'}}}

YAML Belgesi(YAML Document): YAML belgeleri --- ile başlar … ile biter.

--- # A list of tasty fruits
- Apple
- Orange
- Mango
...
Folding and Chomping

Folding: Çok satırlı dize de yeni satıra nasıl başlanacağı ile ilgilidir. Yeni satırın gerçek bir satır olup olmadığı veya kesme işaretinin dize olarak yorumlanması veya kaldırılması gibi.

  • > Satır atlamalarını gösterir. (\n)
  • >+ Sondaki boşlukları tutar.
  • >- Sondaki boşlukları siler. (\n gibi)
text:
This is a
folding
application text.
#result = {'text': 'This is a folding application text.'}--------------------------------------------------------------------text: >
This is a
folding
application text.
#result = {'text': 'This is a \n folding \n application text.\n'}--------------------------------------------------------------------
text:>-
This is a
folding
application text.
#result = {'text': 'This is a \n folding \n application text.'}--------------------------------------------------------------------
text: >+
This is a
folding
application text.
#result = {'text': 'This is a \n folding \n application text.\n\n'}

Chomping: Her yazılan ifade de her satırbaşını görmek için kullanılır.

  • | Tüm satır atlamalarını gösterir. \n
  • |+ Varsa değerin sonundaki satırbaşını gösterir.
  • |- Varsa değerin sonundaki satırbaşını kaldırır.
text:
This is a
folding
application text.#result = {'text': 'This is a folding\napplication text.'}--------------------------------------------------------------------text: |
This is a
folding
application text.
#result = {'text': 'This is a \n folding \n\n application text.\n'}--------------------------------------------------------------------
text:|-
This is a
folding
application text.
#result = {'text': 'This is a \n folding \n\n application text.'}--------------------------------------------------------------------
text: |+
This is a
folding
application text.
#result = {'text': 'This is a \n folding \n\n application text.\n\n'}
Common mistakes when writing YAML

YAML yazarken sık yapılan hatalar:

  • Alıntı (Quotes): YAML da bir yol uzantısı verirken sıklıkla “ çift tırnak kullanılır” fakat yol uzantılarını ‘ tek tırnak ’ ile vermek oluşabilecek hataların önüne geçer.
path: 'C:\Users\Better\…'
  • Girinti (Indentation): YAML girintilere duyarlı bir serileştirme dilidir. Dolayısıyla dosyalar yazılırken girdiler YAML IDE ile yazılarak kontrol edilmelidir.
spices:
- salt
- pepper
- cayenne pepper
#result = {'spices': ['salt - pepper', 'cayenne pepper']}
  • Sayı Tipi (Number Type): YAML sık yapılan yanlışlardan biri de 0 ile başlayan numaraları örneğin telefon numarası gibi vb. ‘tek tırnak içine almamaktır’ şayet tırnak kullanmadan yazarsanız YAML bunu bir hexadecimal sayı olarak algılar ve yanlış sonuçlar üretir.
person:
name: Mert
phone: 0505
#result = {'person': {'name': 'Mert', 'phone': 325}}
  • Yinelenen Anahtarlar (Duplicate Keys): Bir YAML dosyasında aynı anda iki benzer anahtara izin verilmez. Eğer kullanılmışsa eski değer ezilir son değer yazılır.
city:
name: Tokat
name: Kocaeli
#result = {'city': {'name': 'Kocaeli'}}

Yanlışlıkla Liste Girişi (Accidental List Entry): Yanlışlıkla liste girişi, bir — ile başlayan bir değeriniz olduğunda yaml bunu liste öğesi olarak algılar.

quote:
mert: - Hello I am typing YAML
#result = Error: sequence entries are not allowed
  • İzin Verilmeyen Anahtar Kullanımı (Lists as Keys in Languages That Don’t Allow This): YAML da kullanılan mantıksal ifadelerin anahtar olarak kullanılmaması gerekir.
values:
int:
true:
false:
null:

YAML Şemaları (YAML Schemas): Şemalar YAML kurallarını içerir ve belirli bir YAML dosyasının kurallara uyup uymadığını doğrulamak için kullanılır. Şemalar ayrıca veri türleri oluşturmak için kullanılır ve dile özgü şemalarla özel veri türleri eklenebilir. YAML varsayılan şemaları şunlardır:

  • Failsafe Schema: 3 etiketi vardır,
!!str: a string value
!!map: a mapping
!!seq: a sequnece
  • JSON Schema: Failsafe etiketleri de dahil birçok etiketi kapsar,
!!null: a void
!!bool: a boolean
!!int: a integer
!!float: a comma value
  • Core Schema: JSON şemasının bir uzantısıdır ve JSON şemasıyla aynı etiketlere sahiptir ancak genişletilmiş etiket çözünürlüğüne sahiptir. dolayısıyla varsayılan olarak kullanılması tavsiye edilir.
YAML Parsing

YAML Ayrıştırma (YAML Parsing): Ayrıştırma ile bir formatın yeni bir formata dönüştürülmesini kastediyoruz. Önce YAML dosyası işlenir, ardından serileştirme gerçekleşir ve serileştirme ağacı oluşturulur. Daha sonra ağaç bir düğüm aracına dönüştürülür ve son olarak yerel veri yapısına çevrilir.

YAML, günümüzde birçok farklı teknoloji tarafından bir veri serileştirme dili olarak benimsenmektedir. Bu nedenle YAML dosyalarını okuyabilmek bir nevi genel kültür olarak kabul edilebilir. Bu yazı dizisi ile YAML’nin her noktasını atlamadan önemli olabileceğini düşündüğüm yerlere değindim umarım sizler için faydalı olmuştur. Eksik gördüğünüz noktaları söylemekten lütfen çekinmeyin unutmamak gerekir ki bilgi paylaştıkça azalan değil, paylaştıkça çoğalan bir hazinedir…

--

--

Mert Kışlakçı
Turk Telekom Bulut Teknolojileri

#Cloud Computing #vmware #virtualization #redhat #EdgeComputing #DataScience #AI #IoT #ComputerVision #Python #OpenCV #C #Virtualization