Steven
Steven4 perc olvasás

Miért rögzíti a képernyőfelvétel a rossz monitort (és hogyan javítottuk)

Kétmonitoros felállásban a GeekBye az elsődleges kijelzőt vette fel és arról készített képernyőképet, függetlenül attól, melyik képernyőn dolgoztál. A javítás egyetlen apró függvény volt — de az első verziója rossz volt, és a code review elkapta, miért.

Képernyőfelvétel
Multi-Display
Mérnökség
GeekBye kiadások
Miért rögzíti a képernyőfelvétel a rossz monitort (és hogyan javítottuk)

Íme egy hiba, amely csak akkor létezik, ha két monitorod van — ezért is élt csendben egy ideig. Az oldalsó kijelződön dolgozol, elindítasz egy GeekBye-felvételt, az meg az elsődleges monitorodat veszi fel. Azt, amelyiken a menüsáv van. Azt, amelyiket nem nézted.

Ugyanez a hiba, csendesebben és rosszabbul, azokat a képernyőképeket érintette, amelyeket a GeekBye kontextusként küld az AI-nak: megnyomod a képernyőkép-gyorsbillentyűt a második monitorodon, az AI meg az elsőről kap képet. Nincs semmilyen vizuális jel — az asszisztens egyszerűen a rossz képernyőről válaszol, te meg csak találgatod, miért van összezavarodva. A GeekBye v2.0.10 mindkettőt megjavította.

Két pipeline, egy lusta alapérték

A képernyő rögzítése a desktopon két külön kódútvonal, és mindkettő egymástól függetlenül az elsődleges kijelzőt választotta:

  • A videófelvétel felsorolta az elérhető screen source-okat, és az elsőt vette — sources[0]. macOS-en ez gyakorlatilag mindig az elsődleges kijelző. Nincs picker, nincs logika arról, hogy valójában hol voltál. A saját kódunkban a komment szó szerint azt mondta: „auto-select first screen source."
  • A képernyőképek a macOS screencapture parancsot használták a -m flag-gel. Annak a flag-nek pontosan egy jelentése van: csak az elsődleges kijelző. Beégetve.

Egyik útvonal sem tette fel soha a kérdést, amely számít: melyik képernyőn van a felhasználó?

Egy dolog, ami soha nem volt elromolva, és érdemes tisztázni, mert az emberek azt feltételezik, hogy volt: az azonos monitoron lévő macOS Spaces közötti váltás mindig működött. A rögzítés kijelző szinten történik — azt a Space-t kapja el, amelyik a kiválasztott kijelzőn látható. A hiba soha nem a Spaces-ről szólt. Mindig a rossz fizikai kijelző kiválasztásáról szólt.

A javítás, amely nyilvánvalónak tűnt — és rossz volt

A helyes jel könnyűnek tűnik: rögzítsd azt a kijelzőt, amelyen a felhasználó van. Az első implementációnk a GeekBye overlay ablakához horgonyzott — rögzítsd azt a kijelzőt, amelyen az overlay él.

A code review megölte, jogosan. A GeekBye overlay-e full-workarea ablakként jön létre az elsődleges kijelzőn, a (0,0) pozícióban. Csak akkor kerül át másik monitorra, ha fizikailag odahúzod a pirulát — a gyorsbillentyűk pedig, amelyek arrébb tolják, az elsődleges kijelző méreteire korlátozódnak, tehát egyáltalán nem tudják átvinni egy második monitorra. A rögzítés overlay-hez horgonyzása azt jelentette: minden felhasználónál, aki nem éppen áthúzta az overlay-t a munkaképernyőjére, a „javítás" pontosan visszaoldódott az elsődleges kijelzőre. Szinte senkinél sem javított volna — miközben egy egymonitoros dev gépen egy gyors teszten úgy nézett ki, mintha működne.

A helyes horgony a kurzor. Bárhol is van az egered, az az a kijelző, amelyen dolgozol — és ez minden rögzítésindítási módra helyes: egy gyorsbillentyű ott sül el, ahová mutatsz, a Record gomb megnyomása pedig definíció szerint arra a kijelzőre helyezi a kurzorodat. A végleges javítás egy kétsoros függvény: a kurzorhoz legközelebbi kijelző. A videó a capture source-át ahhoz a kijelző id-jéhez igazítja; a képernyőképek annak a kijelzőnek a bounds-át adják át a screencapture -R-nek (egy konkrét téglalap) a -m elsődleges-kijelző flag helyett.

Szándékosan a -R-t (egy explicit téglalap globális képernyő-koordinátákban) választottuk a -D (egy kijelző-index) helyett: az operációs rendszer kijelző-indexének nincs garantált megfelelése a framework kijelző-sorrendjével, így egy index egy második találgatós játék lenne. A kijelző tényleges bounds-ából származó téglalap egyértelmű — és a szállítás előtt egy valódi multi-monitoros rig-en ellenőriztük a flag viselkedését, beleértve az elsődlegestől balra elhelyezett kijelzők negatív koordinátáit is.

Miért ez egy jó tanulságos hiba

  1. A „rögzítsd a képernyőt" elrejt egy döntést. Egyetlen kijelzőn nincs döntés, így a döntést soha nem tervezik meg — alapértékként adódik. A multi-monitor az, ahol minden implicit alapérték felszínre kerül.
  2. A csendben-rossz rosszabb, mint a láthatóan-rossz. A videós hiba idegesítette az embereket. A képernyőkép-hiba az AI-t vezette félre, láthatatlanul. Amikor olyan funkciókat építesz, amelyek kontextussal táplálnak egy modellt, egy rossz bemenet magabiztosan rossz kimenetet produkál, sehol egy hibaüzenet. Ezek azok a hibák, amelyeket a legkeményebben érdemes vadászni.
  3. Egy javítás, amely a te gépeden átmegy, mindenki máséin megbukhat. Az overlay-hez horgonyzott verzió működött egy egymonitoros teszten. A hiba egész lényege a több monitor — és a reviewer az ablak valódi pozíciójáról okoskodott, ahelyett hogy a zöld tesztnek hitt volna. A review nem egy gumibélyegző a működő kódon; egy második modell arról, hogy miért működik a kód.

A GeekBye v2.0.10 a kurzoralapú javítást szállítja mind a felvételhez, mind a képernyőképekhez. Ha több kijelzőt használsz, a rögzítés mostantól követ.

A sorozat szomszédos kiadásaihoz lásd, miért állítja le az AI-jegyzetelőd a felvételt a meeting kellős közepén (v2.0.9) és miért hallja félre az AI-átirat a szakkifejezéseket (v2.0.11). Ahhoz, hogyan viselkedik az overlay hívások közben, lásd hogyan maradj láthatatlan képernyőmegosztás közben.

Kapcsolódó cikkek

Hogyan streamelj élő jelentést villódzás nélkül
Steven
Steven5 perc olvasás

Hogyan streamelj élő jelentést villódzás nélkül

Amikor véget ér a megbeszélésed, a GeekBye összefoglalója mostantól élőben töltődik ki, ahelyett hogy egy töltésjelzőt kellene bámulnod. Ahhoz, hogy a streamelő felület nyugodtnak tűnjön, ne pedig szaggatottnak, kétszer kellett megoldanunk a villódzást — egyszer a strukturált mezőkre, egyszer a markdownra —, és a második javítás egy olyan renderelő volt, amelyik már a miénk volt.

Mérnökség
Frontend
Streamelés
Egy CSS-változó, öt átnézési kör és egy Swift eszközlánc, ami hazudott
Steven
Steven6 perc olvasás

Egy CSS-változó, öt átnézési kör és egy Swift eszközlánc, ami hazudott

A GeekBye v2.0.7 az egész overlay-t állíthatóan áttetszővé tette — ami egysoros CSS-módosításnak hangzik, és egyáltalán nem az volt. Az igazi történet az, amit a kódátnézés elkapott: két felület, amely nem volt hajlandó elhalványulni, egy felvételi sáv, ami rossznak tűnt ugyanazon az áttetszőségen, és egy fordított bináris, ami 672 bájtot ingadozott, mert a saját dokumentációnk a rossz Swift-verziót mondta egy átnézőnek.

Mérnökség
Design
Build
A fülhallgató-bug: amikor a másik fél eltűnt a leiratunkból
Steven
Steven6 perc olvasás

A fülhallgató-bug: amikor a másik fél eltűnt a leiratunkból

A kétcsatornás átírás tökéletesen működött a laptop hangszóróin és a fülre simuló fejhallgatókon. Aztán valaki bedugott egy füles fülhallgatót, és a beszélgetőpartnere egyszerűen eltűnt a leiratból — mert a Chromium némán elnémította a hangunkat abban a pillanatban, amikor a partner megszólalt. Tizenegy javítás megbukott. A tizenkettedik az egész architektúrát megváltoztatta.

Mérnökség
Hang
Átírás