Grok API'den vazgeçtim: tek yapay zeka merkezi Claude
Grok API aboneliğini iptal ettim; bundan sonra tek yapay zeka merkezim Claude. Ekran Çeviri'nin çeviri motoru Grok'a bağlıydı — kodda Google ve Bing motorları yedek olarak duruyor, ama kalite kapıları Grok yolunu varsayıyor. Yani bu iptal, uygulamanın çeviri hattında yeniden düzenleme gerektiriyor; kod hâlâ GrokMotor'u içeriyor. Vazgeçilen kararları da yazıyorum, çünkü build in public sadece işe yarayanları değil, geri alınanları da göstermek demek.
Grok API · Claude · Çeviri Motoru · Karar Değişikliği
Kayıt 50yayın
Depoyu Windows'a indirdim ve v1.1.0'ı yayınladım
Eski platform kaynağını depodan çıkarıp (git geçmişinde duruyor) Windows projesini köke taşıdım ve README'yi baştan Windows kullanıcısına göre yazdım. API anahtarı akışını uçtan uca bağladım: anahtar ilk açılışta soruluyor, yazarken maskeleniyor, Windows'un kendi şifrelemesiyle (DPAPI) saklanıyor ve ayar dosyasına asla düşmüyor; 'xai-' ile başlamayan metin reddediliyor, çünkü yanlış yapıştırma bütün çevirileri sessizce bozuyordu. GitHub Actions gerçek bir Windows makinesinde 54/54 testi geçirdi ve kurulum gerektirmeyen 74 MB'lık tek dosyalık .exe'yi üretti — testler geçmezse .exe hiç çıkmıyor.
Yayın · GitHub Actions · DPAPI · API Anahtarı
Kayıt 49guvenlik
Beş Uzman Denetimi: 77 Bulgu ve Ekrandan Gelen Talimat Riski
Arka planda beş ayrı uzman bakış açısıyla (sistem, güvenlik, dilbilim, UX, QA) denetim koşturdum; 77 bulgu çıktı, tekrarlar elenince 18'e indi. En kritiği güvenlikti: karşı tarafın ekrandaki mesajları sistem talimatına ham giriyor ve çıktı ben okumadan yapıştırılabiliyordu, yani ekrandaki bir metin bana mesaj yazdırabilirdi — güvenilmez içerik artık veri olarak etiketleniyor. Dilbilimci "1,5 saat 150 chf" girdisinin giden mesajda "15 stund 150"ye dönüştüğünü yakaladı; sayı koruma kuralı ve kalite kapısı ekledim. Ayrıca sızmış xAI anahtarı için önce yedek alıp 13 commit'lik git geçmişini yeniden yazdım ve QA'nın en sinsi bulgusunu kapattım: testler üretim kodunun kopyasını doğruluyordu, artık gerçek fonksiyonları çağırıyor.
Güvenlik · Prompt Injection · Git Geçmişi · Test · Denetim
Kayıt 48yeni platform
Windows sürümünü sıfırdan ikinci bir uygulama olarak yazdım
Arkadaşlarım Windows kullandığı için mevcut sürümü 'uyarlamak' mümkün değildi — ekran yakalama, yazı tanıma ve arayüzün tamamı platforma özgüydü. C# / .NET 8 / WPF ile ayrı bir uygulama yazdım: yakalama GDI BitBlt, yazı tanıma cihazda çalışan Windows.Media.Ocr, çeviri katmanı tıklamayı geçiren WPF katmanlı pencere, kısayol RegisterHotKey + SendInput. Çeviri zekâsının tamamını (lehçe algılama, sözlükler, istemler, rakam ve fiyat koruma kapıları) birebir taşıdım. 44 saf mantık testini koşturdum ve test gerçek bir hata yakaladı: 'chli' kelimesi Zürih'in güçlü işaret listesindeydi, oysa Bern'de de kullanılıyor — Bern lehçesiyle yazan birine Zürih lehçesinde cevap yazılıyormuş; iki sürümde de düzelttim.
Windows · C# · .NET 8 · WPF · Port
Kayıt 47denetim
Denetim 32 kusur çıkardı; en kötüsü silinen fiyatlardı
'Çeviriler yanlış anlaşılacak kadar bozuk' şikayetinin kökünü buldum: canlı modda bloklar yalnız ekrandaki konumlarına bakılarak eşleştiriliyordu, metne hiç bakılmıyordu — yeni mesaj gelip liste yukarı kayınca her mesaj bir üsttekinin çevirisini alıyordu. İkinci ağır hata daha sinsiydi: saat damgası temizleyicisi 12.50 (fiyat), 10-15 (süre) ve 12.05 (tarih) desenlerini de saat sanıp metinden siliyordu; düzeltmeden sonra ölçtüm, sayı kaybı 0/5. Ayrıca ekran yakalama çağrılarına zaman aşımı koydum — yanıt gelmezse iş kuyruğu kalıcı kilitleniyordu — ve kirlenmiş çeviri hafızasını sürümleyip temizledim, çünkü uygulamanın kendi çıktısı ve tek harflik anahtarlar orada kayıtlıydı.
Uygulamayı kapatıp tekrar "Bölgeyi Çevir" dediğimde hiçbir şey olmuyordu — uyarı da yoktu. Sebep, arka plan iş kuyruğunun ortasında ana iş parçacığını bekleyen bir çağrıydı: ana iş parçacığı bir pencereyle meşgulse sıra kilitleniyor ve "çeviri sürüyor" bayrağı sonsuza dek açık kalıyordu. Bekleyen çağrıyı kaldırdım, onay penceresini kuyruktan çıkardım, takılı işi 15 saniye sonra iptal eden bir kurtarma ve 5 saniyede bir kontrol yapan sağlık bekçisi ekledim. Kendi senaryomu 20 tur koşturdum, 20/20 temiz geçti; bu döngü artık yayın kapısında, testler geçmeden paket üretilmiyor.
Swift · Eşzamanlılık · Deadlock · Test Otomasyonu
Kayıt 43kararlılık
Çökmenin kök nedeni: aynı veriye iki iş parçacığından yazmak
Uygulama arada çöküyor, arada ağ hatası verip hiç çevirmiyordu. Denetimde çeviri önbelleği, blok listesi ve çeviri metinlerine iki iş parçacığından aynı anda erişildiğini buldum — bu bellek bozulması, yani çökme demek; hepsini kilitledim ve 8 kuyruk × 3.000 turluk saldırı testinde tek çökme almadım. Ağ tarafında tek bir geçici hata tüm çeviriyi düşürüyordu; kendi ağ oturumumu açıp 0,6 ve 1,8 saniye arayla 3 deneme koydum, erişilemez adreste bekleme 11 saniyeden 0'a indi. Üçüncü sorun bendendi: gün içinde ~20 kez yeniden derlediğim için uygulamanın imzası her seferinde değişiyor ve sistem erişilebilirlik iznini iptal ediyordu — sabit bir imza kimliği oluşturup iznin derlemeler arasında korunduğunu doğruladım.
Çökme · Eşzamanlılık · Ağ Dayanıklılığı · İzinler
Kayıt 40ozellik
Yerel Çeviri Hafızası Kurdum, OCR'da Harf Düşmesini Ölçüp Kapattım
Her çeviriyi diske kaydedip yeni mesajda önce hafızaya bakan bir akış kurdum: aynı mesajların ikinci çevirisi 8.3 saniyeden 0.00 saniyeye indi, OCR metni biraz farklı okusa bile bulanık eşleşme yakalıyor ve motora hiç gitmiyor. "Harf düşmesi" şikayetinin kök nedenini ölçerek buldum — metin Vision'a çok küçük gidiyordu; Lanczos ile büyütünce karakter hata oranı %0.50'den %0.16'ya, tam doğru satır oranı %88.5'ten %96.6'ya çıktı. Yol boyunca çevirilerin yanlış mesajlara yazılmasına yol açan numaralandırma hatasını yakalayıp sıralamayı modele emanet etmeyi bıraktım ve regresyon testi ekledim. 6 dakikada 31 MB'dan 106 MB'a büyüyen bellek sızıntısını da kapattım; şimdi 81 MB'da sabit.
OCR · Apple Vision · Önbellek · Bellek Sızıntısı · Grok API
Kayıt 39yeni özellik
İsviçre Almancası lehçelerini tek tek ayırt etmeyi öğrettim
Uygulama düz Almanca'yı çeviriyordu ama İsviçre Almancası'nda saçmalıyordu; asıl ihtiyacım tam da oradaydı. Gerçek sohbet geçmişinden 15.610 mesajlık bir altın test seti çıkardım ve Züridütsch, Bärndütsch, Baseldytsch, Doğu İsviçre, Wallis lehçelerini otomatik ayırt eden bir algılama yazdım — panel hangi lehçede olduğunu gösteriyor ve benim Türkçe yazdığım cevap da o lehçede yazılıyor. Sohbet geçişi testinde Bern → Zürih → Bern → Hochdeutsch geçişlerinin hepsi doğru çıktı; 31/31 birim testi ve 6 dakikalık 40 turluk dayanıklılık testi hatasız geçti. Bir de yerel çeviri hafızası ekledim: daha önce çevrilmiş bir cümle modele hiç gitmiyor.
Lehçe Algılama · İsviçre Almancası · Test · Çeviri Hafızası
Kayıt 22güvenlik
Kısayolla yazdığımı çevirme ve pakete sızan API anahtarı
Türkçe yazdığım mesajı kısayola basınca karşı tarafın dilinde ve seçtiğim üslupta yeniden yazan bir özellik ekledim; kısayolu artık uygulama içinden atayabiliyorum. Denetimde paketleme betiğinin geliştirme makinemdeki config.json'u uygulama paketine varsayılan ayar olarak kopyaladığını gördüm — yani kişisel API anahtarım dağıtılan pakete giriyordu; bunu kestim. Ayrıca 13 ağsız birim testi yazıp yayın betiğini testlere bağladım: testler geçmeden paket üretilmiyor.
Kısayol · Güvenlik · Test · Yayın Kapısı
Kayıt 20hata düzeltme
Uygulama kendi çevirisini okuyup tekrar çeviriyordu
Canlı modun sonsuz döngüye girdiğini fark ettim: ekrana yazdığı Türkçe çeviriyi bir sonraki turda 'yeni mesaj' sanıp tekrar çeviriyordu. Çeviri katmanını ekran yakalamanın dışına aldım, döngü kapandı. Aynı turda motorları zincire bağladım — Bing → Google → Grok; biri düşerse diğeri devralıyor ve panelde hangisinin çalıştığı yazıyor. Ayrı sohbet balonlarını tek blok sanıp birleştiren gruplama mantığını da düzelttim, çünkü birleşen balonlar anlamı tamamen bozuyordu.
Canlı Çeviri · OCR · Çeviri Motoru · Balon Gruplama
Kayıt 19yeni proje
Alfred betiğini gerçek bir masaüstü uygulamasına çevirdim
İş, Alfred'e bağlı tek bir çeviri betiği olarak başlamıştı; onu menü çubuğunda kendi başına duran kurulu bir uygulamaya taşıdım. Ekranda bir bölge seçiyorsun, uygulama o alandaki yazıyı okuyup çeviriyi geri veriyor. Yol boyunca iki tuzağı çözdüm: arka plan uygulaması olduğu için işletim sistemi uygulamanın tüm bildirim pencerelerini sessizce gizliyordu ve ekran kaydı izni doğru kimlikle istenmiyordu. İlk gün sonunda uygulama gerçekten açılıp bölge seçebiliyordu.