Steven
Steven4 dk okuma

Ekran Kaydı Neden Yanlış Monitörü Yakalar (ve Nasıl Düzelttik)

İki monitörlü bir kurulumda GeekBye, hangi ekranda çalışırsanız çalışın hep birincil ekranı kaydediyor ve onun ekran görüntüsünü alıyordu. Düzeltme tek küçük bir işlevdi — ama ilk sürümü yanlıştı ve kod incelemesi nedenini yakaladı.

Ekran Kaydı
Çoklu Ekran
Mühendislik
GeekBye Sürümleri
Ekran Kaydı Neden Yanlış Monitörü Yakalar (ve Nasıl Düzelttik)

İşte yalnızca iki monitörünüz varsa var olan bir hata — bu yüzden bir süre sessizce yaşadı. Yan ekranınızda çalışıyorsunuz, bir GeekBye kaydı başlatıyorsunuz ve o, birincil monitörünüzü kaydediyor. Menü çubuğu olan monitörü. Bakmadığınız monitörü.

Aynı kusur, daha sessizi ve daha kötüsü, GeekBye'ın bağlam olarak yapay zekâya gönderdiği ekran görüntülerini vurdu: ikinci monitörünüzde ekran görüntüsü kısayoluna basın, yapay zekâ birincisinin resmini alsın. Görsel bir işaret yok — asistan yanlış ekran hakkında yanıt veriyor ve siz neden kafasının karıştığını merak ediyorsunuz. GeekBye v2.0.10 ikisini de düzeltti.

İki hat, tek tembel varsayılan

Masaüstünde ekran yakalama iki ayrı kod yolundan oluşuyor ve ikisi de birbirinden bağımsız olarak birincil ekranı seçmişti:

  • Video kaydı mevcut ekran kaynaklarını sıralıyor ve ilkini alıyordu — sources[0]. macOS'ta bu, fiilen her zaman ana ekran demek. Seçici yok, gerçekte nerede olduğunuza dair bir mantık yok. Kendi kodumuzdaki yorum kelimenin tam anlamıyla "auto-select first screen source." diyordu.
  • Ekran görüntüleri, macOS screencapture komutunu -m bayrağıyla kullanıyordu. O bayrağın tam olarak tek bir anlamı var: main display only (yalnızca ana ekran). Sabit kodlanmış.

İki yol da hiçbir zaman asıl önemli soruyu sormadı: kullanıcı hangi ekranda?

Asla bozuk olmayan, ama insanlar bozuk sandığı için açıklığa kavuşturmaya değer bir şey: aynı monitörde macOS Space'leri arasında geçiş yapmak her zaman çalıştı. Yakalama ekran düzeyinde gerçekleşir — seçilen ekranda hangi Space görünüyorsa onu alır. Hata hiçbir zaman Space'lerle ilgili değildi. Her zaman yanlış fiziksel ekranı seçmekle ilgiliydi.

Bariz görünen — ve yanlış olan — düzeltme

Doğru sinyal kolay görünüyor: kullanıcının üzerinde olduğu ekranı yakala. İlk uygulamamız GeekBye'ın overlay penceresine tutundu — overlay hangi ekranda yaşıyorsa onu yakala.

Kod incelemesi bunu haklı olarak öldürdü. GeekBye'ın overlay'i, birincil ekranda, (0,0) konumunda, tam çalışma alanı kaplayan bir pencere olarak oluşturulur. Yalnızca hapını fiziksel olarak oraya sürüklerseniz başka bir monitöre taşınır — ve onu oraya buraya iten klavye kısayolları, birincil ekranın boyutlarına sıkıştırır, dolayısıyla onu ikinci bir monitöre hiç taşıyamazlar. Yakalamayı overlay'e tutundurmak şu demekti: overlay'i tesadüfen çalışma ekranına sürüklememiş her kullanıcı için, "düzeltme" doğruca birincil ekrana geri dönüyordu. Neredeyse hiç kimseyi düzeltmeyecekti — oysa tek monitörlü bir geliştirme makinesinde yapılan hızlı bir testte çalışıyormuş gibi görünüyordu.

Doğru çıpa imleçtir. Fareniz neredeyse, çalıştığınız ekran orasıdır — ve bir yakalamanın başladığı her yol için doğrudur: bir klavye kısayolu işaret ettiğiniz yerde tetiklenir ve Kaydet düğmesine tıklamak, tanımı gereği imlecinizi o ekrana koyar. Nihai düzeltme iki satırlık bir işlev: imlece en yakın ekran. Video, yakalama kaynağını o ekranın id'siyle eşleştirir; ekran görüntüleri ise ana ekran -m bayrağı yerine o ekranın sınırlarını screencapture -R (belirli bir dikdörtgen) komutuna geçirir.

-D (bir ekran indeksi) yerine bilinçli olarak -R (küresel ekran koordinatlarında açık bir dikdörtgen) seçtik: işletim sisteminin ekran indeksinin, framework'ün ekran sıralamasıyla garantili bir karşılığı yok, dolayısıyla bir indeks ikinci bir tahmin oyunu olurdu. Gerçek ekran sınırlarından alınan bir dikdörtgen ise nettir — ve bayrağın davranışını, birincilin solunda konumlanan ekranlar için negatif koordinatlar dahil, yayınlamadan önce gerçek bir çoklu monitör düzeneğinde doğruladık.

Bu neden öğretici bir hata

  1. "Ekranı yakala" bir kararı gizler. Tek ekranda karar yoktur, dolayısıyla karar hiç tasarlanmaz — varsayılana bırakılır. Çoklu monitör, her örtük varsayılanın su yüzüne çıktığı yerdir.
  2. Sessizce-yanlış, görünür-yanlıştan kötüdür. Video hatası insanları rahatsız etti. Ekran görüntüsü hatası ise yapay zekâyı, görünmez biçimde yanılttı. Bir modele bağlam besleyen özellikler kurduğunuzda, yanlış bir girdi hiçbir yerde bir hata olmadan kendinden emin biçimde yanlış bir çıktı üretir. En çok kovalanmaya değer arızalar bunlardır.
  3. Sizin makinenizde geçen bir düzeltme, herkesin makinesinde çuvallayabilir. Overlay'e tutunan sürüm, tek monitörlü bir testte çalıştı. Hatanın bütün mesele çoklu monitör olması — ve inceleyen kişi, yeşil teste güvenmek yerine pencerenin gerçek konumu üzerine akıl yürüttü. İnceleme, çalışan koda bir onay mührü değildir; kodun neden çalıştığına dair ikinci bir modeldir.

GeekBye v2.0.10, hem kayıt hem de ekran görüntüleri için imleç tabanlı düzeltmeyi yayınlıyor. Birden fazla ekran kullanıyorsanız, yakalama artık sizi takip ediyor.

Bu serinin komşu sürümleri için, yapay zekâ not asistanınızın neden toplantının ortasında kaydı durdurduğu (v2.0.9) ve yapay zekâ transkripsiyonunun teknik terimleri neden yanlış duyduğu (v2.0.11) yazılarına bakın. Overlay'in aramalar sırasında nasıl davrandığı için, ekran paylaşımı sırasında nasıl görünmez kalınacağına bakın.