Hata çözümleri

Hatanızı yapıştırın, test edilmiş çözümü bulun

Buradaki her çözüm, projelerimden birinin Salvor hafızasındaki bir öğrenilmiş hata kaydından geliyor: ne bozuldu, neden, ne düzeltti ve düzeltme nasıl kontrol edildi. Proje adları, dosya yolları ve sunucular çıkarıldı.

Bu sayfayı X'te paylaş

Google OAuth yenileme anahtarı her 7 günde bir ölüyor

Rapor ajanı hafızası ·

Belirti
Zamanlanmış bir iş bir hafta çalıştı, sonra anahtar yenileme HTTP 400 invalid_grant döndü: "Token has been expired or revoked".
Neden
OAuth izin ekranı Testing modundaydı. Google Testing modunda 7 gün sonra süresi dolan yenileme anahtarları veriyor (refresh_token_expires_in = 604799).
Çözüm
Hemen devam etmek için yeniden yetki verin. Kalıcı çözüm, izin ekranını Production'a almak (Google incelemesi gerekebilir). İş, boş rapor üretmek yerine "yeniden yetki gerekli" diye açıkça hata versin.
Nasıl kontrol edildi
Yeni anahtarın refresh_token_expires_in alanı; Testing'de kaldıkça 7. günden önce bir hatırlatma.

Cihaz kodlu (TV) OAuth istemcisi analytics iznini alamıyor

Rapor ajanı hafızası ·

Belirti
Cihaz kodu akışıyla yetkilendirme yükleme için çalıştı, ama izin ekranı ne derse desin YouTube Analytics okuma izni reddedildi.
Neden
"TV ve sınırlı giriş" istemci türüne yt-analytics.readonly gibi hassas izinler verilemiyor.
Çözüm
Masaüstü uygulaması türünde ikinci bir OAuth istemcisi açın ve analytics için kendi anahtar dosyasıyla loopback akışını kullanın. Cihaz akışlı istemciyi yapabildiği işlerde tutun.
Nasıl kontrol edildi
Her anahtar dosyası yalnızca istemci türünün alabildiği izinleri taşıyor; iki iş de kendi anahtarıyla çalışıyor.

MCP sunucusu CONNECT_TIMEOUT ile bağlanamıyor

Ajan kurulumu hafızası ·

Belirti
Bir MCP sunucusu neredeyse her açılışta CONNECT_TIMEOUT ile düştü, ama elle çalıştırınca sorunsuz açıldı.
Neden
npx -y paket@latest ile başlatılıyordu. npx her seferinde kayıt deposunu kontrol ediyor, gerekirse paketi indirip açıyor; bu, istemcinin bekleme süresinden uzun sürebiliyor.
Çözüm
Sabit bir sürümü bir kez, yazabildiğiniz bir klasöre kurun ve ayarı npx yerine bu yerel dosyaya yönlendirin.
Nasıl kontrol edildi
Art arda birkaç istemci yeniden başlatması, hepsi bağlandı. Not: eklenti senkronu npx satırını geri getirebiliyor.

ffmpeg'de drawtext ya da libx264 yok, sudo da yok

Ajan kurulumu hafızası ·

Belirti
"No such filter: 'drawtext'" ya da "Unknown encoder 'libx264'". Makinedeki tek ffmpeg kısıtlı bir derlemeydi, apt install ise root istiyor.
Neden
Hazır gelen ffmpeg --disable-everything ile derlenmişti. Tam sürümü kurmak normalde root gerektiriyor.
Çözüm
apt'ye paketleri --print-uris ile listeletin (root gerekmez), wget ile indirin, her birini dpkg-deb -x ile tek klasöre açın ve LD_LIBRARY_PATH'i o klasörün lib dizinine yönlendirin.
apt-get install --reinstall -y --print-uris ffmpeg 2>&1 | grep -oP "^'[^']+'" | tr -d "'" > uris.txt
mkdir pkgs sysroot && (cd pkgs && wget -q -i ../uris.txt)
for f in pkgs/*.deb; do dpkg-deb -x "$f" sysroot/; done
export LD_LIBRARY_PATH=$PWD/sysroot/usr/lib/x86_64-linux-gnu
sysroot/usr/bin/ffmpeg -filters | grep drawtext
Nasıl kontrol edildi
ffmpeg -filters çıktısında drawtext var; yazılı, H.264 ve AAC'li deneme videosu oynuyor.

sshpass ya da expect olmadan şifreli SSH girişi

Ajan kurulumu hafızası ·

Belirti
Bir betiğin yalnızca şifre kabul eden bir sunucuya girmesi gerekiyor. sshpass: command not found, expect yok, kurmak için sudo yok.
Neden
OpenSSH şifreyi varsayılan olarak terminalden okuyor, betik de şifre yazamıyor.
Çözüm
OpenSSH şifreyi küçük bir yardımcı programdan da isteyebiliyor. SSH_ASKPASS'i şifreyi yazdıran bir betiğe, SSH_ASKPASS_REQUIRE'ı force'a ayarlayın (OpenSSH 8.4+) ve ssh'yi terminalsiz çalışması için setsid -w ile başlatın. Yardımcı betiği özel bir geçici klasörde tutun, işiniz bitince silin.
export SSH_ASKPASS=$TMP/askpass.sh SSH_ASKPASS_REQUIRE=force
setsid -w ssh user@host 'echo OK' < /dev/null
Nasıl kontrol edildi
OK ve sunucu adı geri geliyor; scp de aynı yolla çalışıyor.

Remotion ses geçişi hata vermeden uygulanmıyor

Video hattı hafızası ·

Belirti
Uzun bir ses Sequence'ındaki kısılma son videoda hiç olmadı, hata da yoktu. Bazen ffmpeg "Missing ')' or too many args in 'if(between(t,..." hatasıyla durdu.
Neden
Uzun bir Sequence'ta volume={(f) => ...} fonksiyonu, her kare için bir dalı olan dev bir iç içe ffmpeg if(between(...)) ifadesine dönüşüyor. Birkaç yüz kareden sonra ifade ayrıştırıcısı taşıyor.
Çözüm
Remotion'da sabit ses seviyeleri kullanın, geçişleri render sonrası ffmpeg afade ile uygulayın. Birkaç karelik kısa fonksiyonlar sorun çıkarmıyor.
Nasıl kontrol edildi
Çıktıda ffmpeg -af astats: geçiş seviyelerde görünüyor, tepe değer 0 dB'nin altında.

LLM API'si birden model_not_found döndürüyor

Doğruluk kontrolü API hafızası ·

Belirti
Önceden çalışan çağrılar varsayılan model için model_not_found hatasıyla düşüyor.
Neden
Sağlayıcı, kodda varsayılan olarak yazılı model kimliğini kullanımdan kaldırmış.
Çözüm
Sağlayıcının güncel model listesinden geçerli bir model seçin, kimliği kod yerine ayarda tutun ve her hatada model adını loglayın.
Nasıl kontrol edildi
Açılışta ayarlı modeli sağlayıcının model listesiyle karşılaştıran bir kontrol.

Kayıtlı TF-IDF dizini yeniden yüklenince NotFittedError

Doğruluk kontrolü API hafızası ·

Belirti
Arama, servis yeniden başlayana kadar çalıştı; sonra query() NotFittedError ("not fitted") verdi.
Neden
Yalnızca matris kaydedilip yükleniyordu. Sorguyu vektöre çeviren vektörleştirici yüklemede yeniden eğitilmiyor, ayrıca kaydedilmiyordu da.
Çözüm
Yüklerken vektörleştiriciyi kayıtlı belgelerle yeniden eğitin ya da matrisle birlikte kaydedin (örneğin joblib ile).
Nasıl kontrol edildi
Yeni bir örnek oluşturan, hiçbir şey eklemeden diskten yükleyen ve sorgu çalıştıran bir test.

Yeniden deneme döngüsü zaman aşımı ve 5xx hatalarında vazgeçiyor

Doğruluk kontrolü API hafızası ·

Belirti
Kod 3 kez yeniden deniyor gibi görünüyordu, ama zaman aşımı ve sunucu hataları hemen boş sonuç döndürdü.
Neden
Döngü yalnızca HTTP 429'da yeniden deniyordu. Diğer her hata doğrudan return []'e düşüyordu.
Çözüm
Zaman aşımı, bağlantı hatası ve 5xx'te de bekleme süresiyle yeniden deneyin. Son hatayı boş liste döndürmek yerine loglayın.
Nasıl kontrol edildi
İlk çağrının zaman aşımına uğradığı ya da 503 döndürdüğü ve yeniden denemenin beklendiği bir test.

Bir şey bozuluyor ama hiçbir yerde hata yok

Doğruluk kontrolü API hafızası ·

Belirti
Veri çekme ve ayrıştırma boş döndü, loglar ise temizdi.
Neden
Yedi tane çıplak except bloğu hataları yakalayıp hiçbir şey yapmıyordu.
Çözüm
Her except bloğunda loglayın (en azından hatayı ve işlenen şeyi). Mümkün olduğunda belirli hata türlerini yakalayın.
Nasıl kontrol edildi
Log çağrısı olmayan except bloklarını grep ile arayın; zorla oluşturulan bir hata logda görünüyor.

Canlı sayfa, yayındaki API yerine localhost'u çağırıyor

Doğruluk kontrolü API hafızası ·

Belirti
Sayfa benim bilgisayarımda çalıştı; canlı sitede istekler arka uca hiç ulaşmadı.
Neden
Sayfanın varsayılan API adresi http://localhost:8000 idi.
Çözüm
Varsayılan olarak yayındaki API adresini kullanın, localhost'u yalnızca sayfa localhost'tan açıldığında kullanın.
Nasıl kontrol edildi
Canlı sayfayı tarayıcının ağ sekmesiyle açın ve isteğin hangi adrese gittiğine bakın.

Dil alt klasöründeki sayfa stilsiz açılıyor

Doğruluk kontrolü API hafızası ·

Belirti
/tr/ altındaki çeviri sayfası düz, stilsiz HTML gösterdi. Stil dosyası isteği 404 oldu.
Neden
Sayfa assets/style.css kullanıyordu; bu, tr/ içinden bakınca tr/assets/style.css demek.
Çözüm
Alt klasördeki sayfalarda ../assets/ (ya da köke göre /assets/) kullanın.
Nasıl kontrol edildi
Alt klasöre sayfa ekledikten sonra iç link ve dosya taraması.

Ziyaretçiler yayından sonra hâlâ eski siteyi görüyor

Statik site hafızası ·

Belirti
Değişiklikler sunucuda canlıydı, ama geri dönen ziyaretçiler eski sayfaları almaya devam etti.
Neden
Service worker kendi önbelleğinden sunuyordu. Önbellek adı değişmediği için hiç yenilenmedi.
Çözüm
Dosya değiştiren her yayında sw.js'teki önbellek adını artırın. Önce canlıdaki değeri okuyun: bir keresinde sunucu yerel kopyanın ilerisindeydi.
Nasıl kontrol edildi
Yayından sonra canlı sw.js'i curl ile çekip önbellek adını karşılaştırın.

Yükleme başarılı diyor ama dosya olması gereken yerde değil

Statik site hafızası ·

Belirti
scp iki seferde de 0 ile çıktı, ama canlı adres hâlâ eski dosyayı ya da 404 gösterdi.
Neden
Yayın komutu dosyayı yanlış klasöre koydu. 0 çıkış kodu yalnızca kopyanın bir yere yapıldığını söylüyor.
Çözüm
Yolların korunması için depo kökünden rsync --files-from ile yayınlayın, sonra değişen her adresi canlı sitede kontrol edin.
Nasıl kontrol edildi
Değişen her canlı dosyanın yerel kopyayla curl karşılaştırması.

Sitemap'teki sayfalar "Tarandı, şu anda dizine eklenmedi"de kalıyor

Statik site hafızası ·

Belirti
Search Console bu sayfaları haftalarca taranmış ama dizine eklenmemiş olarak gösterdi.
Neden
Yalnızca sitemap'te listeleniyorlardı. Hiçbir sayfa onlara normal bir linkle bağlanmıyordu (bazılarına yalnızca JavaScript ile ulaşılıyordu).
Çözüm
Her sayfaya ilgili bir sayfadan en az bir statik <a href> linki verin. Site taramasına sahipsiz sayfa kontrolü ekleyin.
Nasıl kontrol edildi
Ana sayfadan başlayan bir tarama sitemap'teki her adrese ulaşıyor.

hreflang var olmayan bir sayfayı gösteriyor

Statik site hafızası ·

Belirti
Sayfalar İngilizce ve x-default alternatif bildiriyordu, ama bu adresler 404 döndü.
Neden
Etiketler, henüz yapılmamış bir İngilizce sürüm için eklenmişti.
Çözüm
hreflang'i yalnızca var olan sayfalar için ve iki yönlü bildirin. Site taraması her hreflang hedefini istesin.
Nasıl kontrol edildi
Her hreflang adresi 200 dönüyor ve geri bağlanıyor.

Ekrandaki oyun düğmeleri telefonda tepki vermiyor

Statik site hafızası ·

Belirti
Ok düğmeleri fareyle çalıştı, ama telefonda dokununca işe yarar bir şey olmadı.
Neden
Düğmelerde yalnızca onclick vardı.
Çözüm
{ passive: false } ile kaydedilmiş, preventDefault çağıran touchstart dinleyicileri ekleyin.
Nasıl kontrol edildi
Dinleyici grep'i değil, gerçek bir taklit dokunuş (örneğin telefon profiliyle Playwright .tap()).

Ok tuşları oyunu oynatırken sayfayı da kaydırıyor

Statik site hafızası ·

Belirti
Ok tuşlarına basınca oyuncu hareket etti ve aynı anda bütün sayfa kaydı.
Neden
keydown dinleyicisi tuşları kullanıyor ama tarayıcının varsayılan davranışını durdurmuyordu.
Çözüm
Oyunun kullandığı tuşlar (oklar, boşluk) için e.preventDefault() çağırın.
Nasıl kontrol edildi
Pencereden uzun bir sayfada oynayarak deneyin.

Canvas'ta saat kolları 90° kaymış çiziliyor

Statik site hafızası ·

Belirti
Her saat çeyrek tur dönmüş görünüyordu: 6:00'da akrep 3'te, yelkovan 9'da çizildi. Testlerin hepsi geçti.
Neden
−90° (saat 12) kaydırması iki kez uygulanmıştı: kol şekli zaten yukarı bakıyordu, açıdan yine de π/2 çıkarılıyordu. Testler pikselleri değil cevap değerini okuyordu.
Çözüm
Kaydırmayı tam bir kez uygulayın. Çizimleri bilinen saatlerle (3:00, 6:30, 9:15, 12:45) ekran görüntüsünde kontrol edin.
Nasıl kontrol edildi
Cevabı çizimle gösterilen her oyunda yayından önce bilinen saatlerin ekran görüntüsü.

SVG <use> öğeleri dev lekeler olarak çiziliyor

Bu sitenin hafızası ·

Belirti
100 küçük düğümlü bir animasyon ajanın tüm kontrollerinden geçti, ama gerçek tarayıcıda düğümler sayfayı dev renk lekeleri olarak kapladı.
Neden
Her düğüm width ve height verilmemiş bir <use href="#symbol"> idi; sembol üst görünüm alanının %100'ü boyutunda çizildi.
Çözüm
Boyutlu temel şekiller (circle, rect, path) kullanın ya da her <use>'a açık width ve height verin.
Nasıl kontrol edildi
Her SVG'nin yayından önce gerçek tarayıcı ekran görüntüsü. Tarayıcısı olmayan bir ajan bunu göremiyor.

CSS ya da JS içeren Python f-string'inde SyntaxError

Bu sitenin hafızası ·

Belirti
Sayfa şablonuna satır içi JavaScript eklenince build betiği "f-string: expecting '}'" hatasıyla durdu.
Neden
Şablon tek büyük bir f-string. JavaScript ve CSS'teki { } Python yer tutucusu olarak okundu.
Çözüm
f-string içindeki her gerçek süslü parantezi ikiye katlayın ({{ ve }}) ya da betiği ayrı bir dosyaya taşıyın.
Nasıl kontrol edildi
Build çalışıyor ve üretilen sayfada tekli parantezler var.

Eski yedek kopyalar herkese açıktı

Bu sitenin hafızası ·

Belirti
Ana sayfanın eski bir sürümü .bak dosya adıyla hâlâ açılabiliyordu.
Neden
Yedekler web kökünün içinde, canlı dosyaların yanında alınmıştı; sunucu oradaki her dosyayı sunuyor.
Çözüm
Yedekleri web kökünün dışında tutun, oradaki başıboş .bak ve eski kopyaları silin.
Nasıl kontrol edildi
Her yayından sonra web kökünün listesinde .bak ya da eski kopya yok.

Bu kayıtlar nereden geliyor

Salvor, kodlama ajanları için depo içinde duran bir hafıza katmanı. Bir ajan hatırlanmaya değer bir hatayla karşılaşınca bir öğrenilmiş hata kaydı öneriyor; kayıt ancak bir insan evet dedikten sonra saklanıyor.

Sonraki ajan oturumu önce bu kayıtları okuyor, böylece aynı hata tekrarlanmadan yakalanıyor. Bu sayfa, o kayıtların bir kısmının temizlenmiş, herkese açık bir kopyası.

Açıklama: Salvor'a katkıda bulunuyorum. Kayıtlar benim; araç Dan'in açık kaynak projesi.

Salvor'u nasıl test ettim → · GitHub'da Salvor ↗

Bir hata mı buldunuz, ya da bir çözüm sizde farklı mı çalıştı? Yazın. İletişim →