Steven
Steven4 min čítania

Prečo nahrávanie obrazovky zachytáva nesprávny monitor (a ako sme to opravili)

Na zostave s dvoma monitormi GeekBye nahrával a snímal obrazovku primárneho displeja bez ohľadu na to, na ktorej obrazovke ste pracovali. Oprava sa zmestila do jednej malej funkcie — no jej prvá verzia bola nesprávna a code review zachytilo prečo.

Nahrávanie obrazovky
Viac displejov
Inžinierstvo
Vydania GeekBye
Prečo nahrávanie obrazovky zachytáva nesprávny monitor (a ako sme to opravili)

Tu je bug, ktorý existuje, iba ak vlastníte dva monitory — preto istý čas žil potichu. Pracujete na bočnom displeji, spustíte nahrávanie GeekBye a ono nahrá váš primárny monitor. Ten s panelom ponuky. Ten, na ktorý ste sa nepozerali.

Ten istý defekt, tichší a horší, zasiahol snímky obrazovky, ktoré GeekBye posiela AI ako kontext: stlačíte skratku snímky na druhom monitore a AI dostane obrázok prvého. Nie je tu žiadne vizuálne znamenie — asistent jednoducho odpovedá o zlej obrazovke a vy sa čudujete, prečo je zmätený. GeekBye v2.0.10 opravil oboje.

Dve cesty, jeden lenivý predvolený výber

Zachytávanie obrazovky na počítači sú dve samostatné cesty kódu a obe si nezávisle vybrali primárny displej:

  • Nahrávanie videa vymenovalo dostupné zdroje obrazovky a vzalo prvý — sources[0]. Na macOS je to prakticky vždy hlavný displej. Žiadny výber, žiadna logika o tom, kde ste v skutočnosti boli. Komentár v našom vlastnom kóde doslova hovoril "auto-select first screen source" (automatický výber prvého zdroja obrazovky).
  • Snímky obrazovky používali macOS príkaz screencapture s flagom -m. Tento flag má presne jeden význam: iba hlavný displej. Napevno zadrôtované.

Ani jedna cesta sa nikdy nespýtala otázku, na ktorej záleží: na ktorej obrazovke je používateľ?

Jedna vec, ktorá nikdy nebola pokazená, a stojí za vyjasnenie, lebo ľudia predpokladajú opak: prepínanie medzi priestormi (Spaces) macOS na tom istom monitore vždy fungovalo. Zachytávanie prebieha na úrovni displeja — chytí ten priestor, ktorý je viditeľný na zvolenom displeji. Bug nebol nikdy o priestoroch. Vždy bol o výbere nesprávneho fyzického displeja.

Oprava, ktorá vyzerala samozrejme — a bola nesprávna

Správny signál sa zdá jednoduchý: zachyť displej, na ktorom je používateľ. Naša prvá implementácia sa ukotvila na okne prekrytia GeekBye — zachyť ten displej, na ktorom prekrytie žije.

Code review ju správne zabilo. Prekrytie GeekBye sa vytvára ako okno na celú pracovnú plochu na primárnom displeji, v pozícii (0,0). Presunie sa na iný monitor len vtedy, ak tam jeho pilulku fyzicky pretiahnete — a klávesové skratky, ktoré ním pohýnajú, sú orezané na rozmery primárneho displeja, takže ho nemôžu presunúť na druhý monitor vôbec. Ukotvenie zachytávania na prekrytí znamenalo: pre každého používateľa, ktorý zhodou okolností neprestiahol prekrytie na svoju pracovnú obrazovku, sa „oprava" vyriešila naspäť na primárny displej. Neopravila by takmer nikoho — a pri rýchlom teste na jednomonitorovom vývojárskom stroji by vyzerala, že funguje.

Správnou kotvou je kurzor. Kdekoľvek je vaša myš, to je displej, na ktorom pracujete — a je to správne pre každý spôsob, akým sa zachytávanie začne: klávesová skratka sa spustí tam, kam ukazujete, a kliknutie na tlačidlo Nahrávať umiestni váš kurzor na ten displej z definície. Finálna oprava je dvojriadková funkcia: displej najbližší kurzoru. Video zosúladí svoj zdroj zachytenia s id toho displeja; snímky odovzdajú hranice toho displeja do screencapture -R (konkrétny obdĺžnik) namiesto flagu -m (iba hlavný displej).

Zámerne sme zvolili -R (explicitný obdĺžnik v globálnych súradniciach obrazovky) pred -D (index displeja): index displeja v OS nemá zaručenú zhodu s poradím displejov vo frameworku, takže index by bol druhá hra na hádanie. Obdĺžnik zo skutočných hraníc displeja je jednoznačný — a správanie flagu sme overili vrátane záporných súradníc pre displeje umiestnené naľavo od primárneho, na skutočnej viacmonitorovej zostave pred vydaním.

Prečo je toto dobrý učebný bug

  1. „Zachyť obrazovku" skrýva rozhodnutie. Na jednom displeji rozhodnutie neexistuje, takže rozhodnutie sa nikdy nenavrhne — nastaví sa predvolene. Viac monitorov je miesto, kde vypláva na povrch každý implicitný predvolený výber.
  2. Ticho-nesprávne je horšie než viditeľne-nesprávne. Bug s videom ľudí otravoval. Bug so snímkou zavádzal AI, neviditeľne. Keď staviate funkcie, ktoré napájajú model kontextom, nesprávny vstup vyprodukuje sebavedomo nesprávny výstup bez akejkoľvek chyby kdekoľvek. Práve tie zlyhania sa oplatí loviť najzarytejšie.
  3. Oprava, ktorá prejde na vašom stroji, môže zlyhať na každom cudzom. Verzia ukotvená na prekrytí fungovala v jednomonitorovom teste. Celý zmysel bugu sú viaceré monitory — a recenzent uvažoval o skutočnej pozícii okna namiesto toho, aby dôveroval zelenému testu. Review nie je pečiatka na fungujúcom kóde; je to druhý model toho, prečo kód funguje.

GeekBye v2.0.10 prináša opravu založenú na kurzore aj pre nahrávanie, aj pre snímky. Ak používate viac displejov, zachytávanie vás teraz nasleduje.

Susedné vydania tejto série nájdete v prečo váš AI zapisovač prestane nahrávať uprostred stretnutia (v2.0.9) a prečo AI transkripcia komolí technické termíny (v2.0.11). O tom, ako sa prekrytie správa počas hovorov, si prečítajte v ako zostať neviditeľný počas zdieľania obrazovky.

Súvisiace články

Ticho bolo nosné
Steven
Steven7 min čítania

Ticho bolo nosné

Posledné dve vydania GeekBye v1 sú o tej istej nepríjemnej pravde: prepis v reálnom čase cez skutočnú sieť nie je bezstratový a čestný ťah je prestať predstierať, že je. v1.8.20 si nechalo kópiu každého úseku zvuku na disku, než ho počas opätovného pripojenia zahodilo, a začalo nahlas označovať medzery v prepise. v1.9.0 prestalo posielať ticho, aby ušetrilo šírku pásma — a zistilo, že ticho bolo presne tým signálom, podľa ktorého prepisovač vedel, že veta skončila. Dve vydania o cene zahadzovania vecí.

Inžinierstvo
Audio
Spoľahlivosť
Tri slovesá, ktoré udržujú Web Audio nažive
Steven
Steven8 min čítania

Tri slovesá, ktoré udržujú Web Audio nažive

Dve bodové vydania GeekBye, dva mesiace od seba a v dvoch rôznych súboroch, naučili náš audio kód tú istú lekciu z opačných koncov: prestaň zaobchádzať s prehliadačovým AudioContext ako s jednorazovým. Jedno vydanie sa naučilo resume() kontextu, ktorý macOS potichu pozastavil uprostred nahrávania; druhé sa naučilo suspend() namiesto close(), aby na seba nadväzujúce relácie prestali narážať do Chromiom nastaveného stropu zhruba šiestich kontextov. Resume, suspend, close — to je celá zápletka.

Inžinierstvo
Audio
Desktop
Rozoznať hovor od otvorenej aplikácie
Steven
Steven8 min čítania

Rozoznať hovor od otvorenej aplikácie

GeekBye si vie všimnúť, že si sa pripojil k videohovoru, a ponúknuť jeho nahranie. Detekcia sa ukáže ako ľahšia polovica — natívny Swift binárnik čítajúci tituly okien každých desať sekúnd. Ťažká polovica je presnosť: nespustiť sa, keď je Zoom len otvorený, neponúkať nahrávanie stretnutia, ktoré už nahrávaš, a nestlmiť mikrofón v hovore, v ktorom naozaj sedíš. Tri vydania, a každé z nich je poistka, ktorá sa musela naučiť neporaziť samu seba.

Inžinierstvo
macOS
Desktop