Featured image of post Akiyoka'nın Geliştirilme Aşaması

Akiyoka'nın Geliştirilme Aşaması

Sonunda Akiyoka yavaştan yaşamaya başladı.

Süper bir gün ve bugünü ise Akiyoka Dilinin İcadı ve Önemi Günü ilan ediyorum. Bu dili üretmek ve onu yaşatmak gerçekten zordur. Üstelik latin harflerle değilse o iş daha da karmaşa oluyor. Eğer daha önce okumadıysan, Akiyoka Dili Nedir? yazısını mutlaka okumalısın.

Bu yazıda bu dilin üretilme aşamasındaki yaşadığım maceraları anlatacağım. Dediğim gibi, şeffaf olacağıma dair söz vermiştim. Bu sözüme inanarak aklımdan kaldığı kadarıyla yazıyorum.

Calligraphr+Canva işlemi

Calligraphr bunu ilk kez duymuş olabilirsin. Yazı tipi yapacak insanlara bir şablon veriyor, sonra o şablonu gereken alfabeyi çizebilmen için sana özgürlük sunuyor. İstersen, tablette çiz istersen bilgisayarda sana karışmıyor. Onu çizince ona yükleyip yazı tipini ayarlamana yardım ediyor.

Ben daha önce Canva‘da çizmiştim. Ondan çizdiklerimi aktardım. Biraz rötüş yaptım, bir iki harf dengesiz kalmıştı diye. Gerçi şu an bile dengesizler var ama o kadar da çok göze batmıyorsa, mükemmeliyetçilik tuzağına düşmeden o işi çözdüm.

Açık kaynak yazılımların beş kuruş etmemesi

Yazı tipimi yaparken sorun yaşadığım en büyük engel. Amaç, sesliler altta olması, sessizlerin üstte. İlk sorun her seferinde bilgisayar o yazı tipini çıktıladığımda hata vermesi. Hatanın sebebi, belirli sayıları geçince, o yazı tipinin sistemini bozmasıdır. Düzeltmeyi her denediğimde bir çok harf birbirine girmesi.

Özellikle K ve L harfi, gerçekten bu programda başıma bela açtı. Çözemedim bile, çözmeyi her denediğimde diğer harflerde birbirine girince, hepsini sildim. Uygulama adı vermeyeceğim, reklam yapıp ellerine yağ sürmenin bir anlamı yok.

Ve kodla çözelim dedim, o uygulamadaki işlevler başımı ağrıtacak kadar berbat. Tutarsızlıklarla uğraşmadım. Çizerek çöz diyeceksin biliyorum ama zaten çizim yapmışım, oturup her harfin 5 envai çeşit çizimini yapmak tam bir amelelik. Ve ben onu sevmiyorum.

GO bilmecesi

Bu ayrı başlığı hak ediyor, güya dünyanın en basit kodlama dili. Altı-üstü harfleri birleştireceğim sistemde ciğer soldurttu sağ olsun. Sürekli çıktı alınan yazı tipini bozması da saçmalık. Çözümsüz olduğunu Google AI Studio söyledi.

Yazı tipini açacak hale getirmek için Transfonter sitesine at, indir ve aç. Sonra kur ve uygulamadan bak. Zaten o yazı tipi gösteren alan bile sorunlu diyor. Mesele go dilinde imiş. Ha bir de negatif sayı girememek bizi bitirdi. Meğersem, çözümü yanlış yerde arıyormuşum. Doğru çözüm son paragrafta.

py ve davranış sistemi

Tüm salakça çözümleri denedikçe delirdim. Delirdikçe çözüm ürettim. Bir ara sinirlenip FontForge ile baştan çizmeyi düşündüm ama dur dedim. Çözümsüz olamaz dedim.

Google AI Studio bana “gel Python3 ile çözelim” dedi. Ben önce sorun etsem de sonra olur dedim. Onun yazdığı kodu alıp deneyince olmadı. Gemini ile deneyince sorunları çöze çöze ilerledim. Kodu paylaşacağım, değerimi bilin ha.

Kod

icat.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
from fontTools.ttLib import TTFont
from fontTools.ttLib.tables._k_e_r_n import KernTable_format_0, table__k_e_r_n

# 1. Fontu yükle
font = TTFont("Akiyoka.ttf")
glyph_order = font.getGlyphOrder()
hmtx = font['hmtx'] # Genişliklerin olduğu asıl tablo


# --- İSİM DÜZENLEME (Yeni Eklenen Kısım) ---
new_name = "Akiyoka"
name_table = font['name']

for record in name_table.names:
    # 1: Font Family, 4: Full Name, 6: PostScript Name, 16: Typographic Family
    if record.nameID in [1, 4, 6, 16]:
        record.string = new_name.encode('utf-16-be') if record.platformID == 3 else new_name.encode('ascii')

# --- İMZA VE YAPIMCI ALANI ---
yapimci_adi = "Ayhan" # Buraya kendi ismini yaz kanka
aciklama = "Akiyoka: 10 yillik bir siber-minimalist dil devrimi. Zorlastirmayiniz, kolaylastiriniz."

for record in name_table.names:
    # 9: Designer (Tasarımcı)
    if record.nameID == 9:
        record.string = yapimci_adi.encode('utf-16-be') if record.platformID == 3 else yapimci_adi.encode('ascii')
    # 10: Description (Açıklama/Hakkında)
    if record.nameID == 10:
        record.string = aciklama.encode('utf-16-be') if record.platformID == 3 else aciklama.encode('ascii')
    # 8: Manufacturer (Üretici - İstersen buraya da yazabilirsin)
    if record.nameID == 8:
        record.string = "Akiyoka Labs".encode('utf-16-be') if record.platformID == 3 else "Akiyoka Labs".encode('ascii')
        

# 2. Kritik Tanımlamalar
sesliler = ['A', 'E', 'I', 'O', 'U', 'a', 'e', 'i', 'o', 'u']
# Listenden aldığımız tüm boşluk ve kontrol karakterleri
bosluklar = ['space', 'nbsp', 'uni0020', 'uni00A0', 'nonmarkingreturn', 'CR', '.null']

# AYARLAR
oran = 0.72  # Kolon sıkılığı
bosluk_genisligi = 600 # Boşluk tuşunun manuel genişliği (Az gelirse 800 yap)

kerning_pairs = {}

# 3. GENİŞLİK SABİTLEME (Mesafe Kaybolmasın Diye)
for b_name in bosluklar:
    if b_name in hmtx.metrics:
        # Boşluğu manuel olarak genişletiyoruz ki kimse üzerine binemesin
        hmtx.metrics[b_name] = (bosluk_genisligi, hmtx.metrics[b_name][1])

# 4. KERNING HESAPLAMA
for s_name in glyph_order:
    # Karakter sessizse VE boşluk değilse
    if s_name not in sesliler and s_name not in bosluklar and s_name != '.notdef':
        if s_name in hmtx.metrics:
            s_width = hmtx.metrics[s_name][0]
            
            for v_name in sesliler:
                if v_name in hmtx.metrics:
                    # Sessiz + Sesli birleşimi
                    kerning_pairs[(s_name, v_name)] = -int(s_width * oran)

# 5. BOŞLUKLARI KORUMA (Kesin Blokaj)
# Boşluktan sonra gelen veya boşluktan önce gelen her şeyi sıfırlıyoruz
for b_name in bosluklar:
    if b_name in glyph_order:
        for any_g in glyph_order:
            kerning_pairs[(b_name, any_g)] = 0
            kerning_pairs[(any_g, b_name)] = 0

# 6. Tabloyu oluştur
if 'kern' not in font:
    font['kern'] = table__k_e_r_n()
    font['kern'].version = 0
    font['kern'].kernTables = []

subtable = KernTable_format_0()
subtable.format = 0
subtable.coverage = 1
subtable.tupleIndex = 0
subtable.kernTable = kerning_pairs
font['kern'].kernTables = [subtable]

# 7. Kaydet
font.save("Akiyoka_Final_Fix.ttf")
print(f"\n--- SİSTEM RESETLENDİ! ---")
print(f"Boşluk genişliği {bosluk_genisligi} birime sabitlendi ve kilitlendi.")

sinir.py

1
2
3
4
5
6
7
8
9
from fontTools.ttLib import TTFont

font = TTFont("Akiyoka.ttf")
glyph_order = font.getGlyphOrder()

for i, name in enumerate(glyph_order):
    # Sadece ilk 100 karakteri basar, boşluk genelde buralardadır
    if i < 100:
        print(f"ID: {i} -> İsim: {name}")

icat.py o dili üretirken, sinir.py o dilin alfabesinin ID değerlerini yazıyor.

Kusursuz mu?

Akiyoka’daki Orantı Sorunu

Hayır, %100 değil. Az bile olsa kusurlu. QWXŞÇÖĞÜıharfleri olmadığı için dönüştürücü yok içinde ama onun dışındaki tüm harfler iyidir. Bu sorun için çözüm araştıracağım. İlla ki bir çözümü mevcuttur.

Bir diğer sorun orantı. Onun sebebi, çizdiğim harflerin büyüklüğü ve genişliğindeki tutarsızlık ama en azından sessiz harfin konumuna az iyi bakarak çözebilirsin. Bunun çözümü bir ara üşenmeyip alfabeyi baştan belirli sınırlar içerisinde ayarlayıp düzenlemeler yaparak düzeltilecek. Bak bunu yazarken bile üşendim.

İndir

Drive Google

Bitirirken

Yazı tipini indirip kurduktan sonra seçin ve akiyoka yazın, dönüşecektir.