🎨 EBRIS: Görmenin Sanatı
Bir Eseri Matematik ve Bağlamla Okumak
Bir eserin rengini #182324 olarak tanımlamak bir makine için doğru olsa da, tuvalin başındaki bir sanatçı için ruhsuz ve anlamsızdır. Yağlı boya ve akrilik ile çalışırken hissettiğim dokuyu ve renklerin ağırlığını dijital bir sisteme aktarmak istedim. EBRIS, yüklenen bir eseri (tablo, çizim veya fotoğraf) önce ölçen, sonra yorumlayan kendi başına çalışan bir okuma motorudur.
Sistemin sarsılmaz kuralı şudur:
"Kesin olarak ölçülebilenler ile yoruma dayalı olanlar asla aynı cümlede buluşamaz."
EBRIS iki farklı modda çalışır: Hızlı Okuma ve Derin Okuma. Hızlı okuma araştırma yapmaz, bu nedenle kaynak göstermesi yasaktır; derin okuma ise web'de arama yapar ve yalnızca doğrulayabildiği kaynakları listeler.
Bu yazıda EBRIS'in "ne" olduğundan ziyade, arka plandaki mühendislik kararlarını ve sistem mimarisinin neden öyle kurgulandığını anlatacağım.
🧮 1. İstemci Tarafında (Client-Side) Ağır İşlem ve CIELAB Sözlüğü
Eserin paletini çıkarmak için 14 yinelemeli k-means algoritması, WCAG bağıl parlaklık oranı ve Sobel operatörü ile kenar yoğunluğu analizleri doğrudan tarayıcıda çalışır. Veriler cihazdan çıkmadan ~70 milisaniyede hesaplanır. Bulunan renkler CIELAB uzayında 55 tarihi pigmentten oluşan bir sözlükle eşleştirilerek is siyahı, yanmış siena, çivit gibi isimlerle sunulur.
Bu ölçümler yalnızca ekranda görsel bir detay olarak kalmaz; okuma üretilirken modele dayanak olarak da verilir. Yorum böylece havada durmaz, eserin kendi sayılarının üstüne kurulur.
⚖️ 2. Sunucu ve Arayüz Asimetrisi
Sistem iki parçalıdır: Arayüz (React 19) Vercel üzerinde manuel olarak yayına çıkarken,
sunucu (Express 5) Railway üzerinde main dalına itildiği an otomatik
derlenir. Bu asimetri, sunucunun arayüzden her zaman önce yayına çıkmasını sağlar. Böylece sunucu,
güncellenmemiş eski arayüzlerle sorunsuz konuşmaya devam eder ve yeni davranışlar eskisini kırmaz.
📡 3. Ağ Kesintilerine Direnen "İş Defteri" Mimarisi ve Ödünleşimler
Derin okuma analizleri 3-4 dakika sürebilir. Klasik HTTP istekleri bu sürede zaman aşımına uğrar veya
mobil kullanıcı ağ değiştirdiğinde yanıt kaybolur. Çözüm olarak POST /api/analyze ucu
isteği bekletmez; hemen bir iş numarası (202) döndürür ve arayüz sonucu yoklayarak
(polling) sorar.
Mobil ağda IP adresi istek ile yoklama arasında değişebileceği için, iş IP'ye bağlanmaz; giriş
yapmayanlarda tahmin edilemez UUID'lerle yönetilir. Bu iş defteri bellekte (in-memory)
tutulur. Elbette bunun bir mühendislik bedeli vardır: Sunucu yeniden başlarsa yarım kalan işler kaybolur
ve biten bir iş bellekte en fazla 15 dakika bekler. Karmaşık bir veritabanı kalıcılığı yerine, dışarıya
bakan yüzün ağ kesintilerine karşı sağlamlığı tercih edilmiştir.
🤫 4. Modeli "Susturmak": İki Katmanlı Ayrıştırıcı
Model bazen yorum yapmadan önce "Elimdeki verilerle analiz yapıyorum" diyerek kendi çalışmasını anlatır veya web aramaları arasında kendi kendine konuşur. Bu metin bloklarının yoruma karışmasını engellemek için iki katmanlı bir filtre yazdım:
- Sunucuda, son araç kullanımından önce gelen kısa metinler çöpe atılır.
- İstemcide ise, önsöz olmayan ilk gerçek başlıktan önce yer alan 200 karakterden kısa bloklar (birinci şahıs ve çalışma fiili barındırıyorsa) özel bir yakalayıcıyla elenir.
🖌️ 5. PDF ve Kartlar İçin Özel Tuval (Canvas) Motoru
Çıktıları PDF veya paylaşım kartı olarak üretirken html2canvas gibi kütüphaneleri
kullanmadım; çünkü bu araçlar modern CSS özelliklerini (gradyan, karışım kipi) sık sık yanlış çizer.
İkinci ve tamamen bağımsız sebep ise fontlardır: Metni PDF'e doğrudan bir 'yazı' olarak gömmek
isteseydim, ş, ğ, İ gibi harfler için özel yazı tiplerini (font) gömmem gerekecekti.
Bu iki sorunu aşmak için tüm içerik doğrudan tuval (Canvas) üzerine çizilir. Satır bölmeleri normalde boşluktan yapılır; ancak kaynak bağlantıları gibi tek başına satıra sığmayan uzun kelimeler sayfa kenarından taşmasın diye harf harf bölünerek alt satıra geçirilir.
🏛️ 6. Kanıta Dayalı Komşuluk
Metropolitan Müzesi'nin açık koleksiyonundan (CC0) 300 eser, EBRIS'in tarayıcıdaki ölçüm motorunun aynısıyla derleme zamanında indekslenmiştir. Sistem altı boş bir iddiayla "bu eser şuna benziyor" demez; matematiksel bir gerçeklikle "ölçüleri şununla komşu" der.
🔐 7. Gizlilik ve Kota Yönetimi
Giriş yapmadan kullanan ziyaretçiler için sistem hiçbir kayıt oluşturmaz; ne bir görsel, ne metin, ne de
bir veritabanı satırı tutulur. Kota sınırlarını aşmak için tek kullanımlık e-posta servisleri ve Gmail'in
artı-adresleme (ad+1@gmail.com) özelliği sıkça kullanılarak e-posta doğrulaması ucuzlatılır.
Bu istismarı önlemek için, aynı ağdan bağlanan kullanıcılar IP tabanlı ortak bir kota tavanını paylaşır.
Ayrıca kota sayacı analiz biterken değil, başlarken artar ve analiz üretilemezse iade edilir.
🛠️ Teknoloji Künyesi: React 19, Vite, Tailwind CSS 4, Express 5 (Node), Supabase, Claude API, The Met Collection API.
Galerinizden bir fotoğraf veya eser seçerek ebris.melikeebrukirkin.com adresinden Görmenin Sanatı'nı bizzat test edebilirsiniz.
SİNYAL GÖNDER
Uzay boşluğunda kaybolma, not bırak!
Fikrin bir yıldız gibi parlıyorsa ya da sadece uzayın derinliklerinden bir sinyal göndermek istiyorsan, buradayım.