Săriți la conținut

Blog ·

Un fir pe care îl trageți, și exact un declanșator

Tragerea unui fir este partea ușoară. Greu era ce poate atinge un buton de test, cine acționează când nu se uită nimeni și cât poate dura o pauză.

De Provibr

Fluxurile noastre de automatizare au început ca o listă de pași, au devenit un graf, apoi o pânză, iar în această rundă au primit în sfârșit gestul pe care și-l imaginează toată lumea când aude „editor de fluxuri”: apucați punctul din dreapta unui nod și trageți un fir până la punctul din stânga altuia.

Gestul acela înseamnă câteva rânduri de cod și un comentariu lung care explică de ce stau acele rânduri unde stau. Restul rundei au fost întrebări care nu au nicio legătură cu tragerea. Câte locuri pot porni un flux. Ce are voie să atingă un buton de test. Cine acționează când nu se uită nimeni. Și cât poate face pauză un pas.

Captura care înghite clicul

Pânza are un singur strat de transformare. Nodurile stau în el absolut, iar firele sunt un SVG în exact același strat, deci nu există un al doilea sistem de coordonate care să se decaleze față de primul. Partea aceea este plictisitoare intenționat.

Interesantă este captura indicatorului. Când apăsați pe un punct de ieșire, ceva trebuie să urmărească indicatorul până la eliberare, inclusiv în afara ferestrei. Implementarea evidentă capturează pe punctul apăsat, și este greșită într-un fel care nu produce nicio eroare.

Captura redirecționează fiecare eveniment de indicator următor către elementul care capturează, pointerup inclusiv, iar navigatorul declanșează apoi click pe strămoșul comun al apăsării și al eliberării. Dacă punctul capturează el însuși, o tragere care se termină pe alt punct nu ajunge niciodată acolo; se întoarce de unde a plecat. Prin urmare captura o face suprafața, iar unde s-a ridicat degetul cu adevărat este o întrebare separată, la care răspunde document.elementFromPoint().

Răspunsul are trei trepte. Un punct de intrare sub cursor. Dacă nu, o cutie de nod sub cursor, care duce la prima ei intrare. Dacă nu, un magnet: intrarea cea mai apropiată în raza de șaisprezece pixeli de ecran, și tocmai asta face gestul îngăduitor fără să oblige pe nimeni să nimerească o țintă de zece pixeli.

Două descoperiri mai mici, care apar abia când construiți asta. React leagă wheel pasiv la rădăcină, deci împiedicarea acțiunii implicite în tratantul lui nu face nimic și pagina derulează în timp ce încercați să măriți; ascultătorul acela trebuie pus pe elementul însuși, explicit nepasiv. Iar mijlocul unei curbe Bézier nu este centrul cutiei sale de încadrare: nimerirea unui fir înseamnă deci să cereți traseului un punct la o anumită lungime și să îl treceți prin matricea de transformare curentă.

Clic, apoi clic, funcționează în continuare. Nu este calea inferioară: este calea care funcționează cu tastatura, și de aceea punctele au rămas butoane adevărate.

Un declanșator, și patru lucruri atârnate de el

Un graf are exact un nod declanșator. Zero este o eroare la salvare și doi este o eroare la salvare. Sună a ordine. Este portant, iar patru funcții se sprijină pe el.

Ce aduceDe ce este nevoie de un singur declanșator
AccesibilitateaFiecare nod executabil trebuie să fie accesibil dintr-un singur punct de plecare cunoscut
Detectarea ciclurilorO parcurgere în adâncime cu marcare pe culori cere o rădăcină; două rădăcini înseamnă două parcurgeri și două răspunsuri de contopit
Selectorul de variabileCe variabile există depinde de evenimentul declanșat, iar un al doilea declanșator ar însemna două răspunsuri într-un singur editor
Curățarea contextuluiUn grup de variabile pe care acest eveniment nu îl poate furniza este eliminat: citirea lui este deci o eroare și nu un șir gol

Rândul acela se plătește singur. Există patru evenimente declanșatoare: un server aprovizionat, reinstalat, șters sau pornit de mână. Un server șters nu are identificator de sistem de operare, deci întregul grup al sistemului de operare dispare din context în loc să fie pus pe un obiect gol. Cu variabile stricte, citirea lui produce atunci o eroare lizibilă „variabilă necunoscută” chiar în momentul salvării. Dacă îl goliți în schimb, condiția care îl citește devine falsă, în tăcere, pentru totdeauna, pe ramura care conta.

Tot de aceea nu există un nod de injectare separat. Pornirea manuală este un eveniment declanșator și nu o a doua intrare; adăugarea unuia ar rupe invariantul de care depind toate cele patru funcții, în schimbul unui nod care se desenează puțin mai bine.

O rulare de probă nu atinge nimic, și tot parcurge

Editorul are un buton Test run, iar un graf poate conține acum un nod care pornește, oprește, închide, suspendă sau reia serverul acelei rulări. Aceste două fapte pe același ecran sunt o capcană: cineva va apăsa pe testare ca să vadă ce ramură ia un graf, și va stinge o mașină de client.

O rulare de probă nu trimite deci niciodată o comandă. Nodul de acțiune se întoarce imediat, marcat ca omis, cu un cod de motiv redat în limba celui care citește. Și, esențial: ia ramura ok. O probă care ar cădea pe ramura de eroare ar susține că graful face ceva ce nu face, iar asta este mai rău decât să nu spună nimic. Acțiunea adevărată trece prin injectare, care este o rulare reală și cere o confirmare.

Cine acționează când nu se uită nimeni

O rulare de flux nu are spectator. La o comandă, persoana care a apăsat Comandă este cel mult din întâmplare cea căreia ar trebui atribuită acțiunea. La o ștergere poate să fi plecat deja. Dar găsirea unui server cere un actor cu un profil de drepturi, iar acel profil trebuie să vină de undeva.

Alegerea este că o rulare acționează ca persoana proprietară a contului, din trei motive în ordinea greutății. Momentul autorizării este publicarea și nu rularea: salvarea unui flux cere modulul de scripturi, agățarea lui de un plan cere drepturi pe planuri, iar aceasta este aceeași formă ca o sarcină programată sau ca lucrătorul de supraveghere. Acțiunea ca cel care a apăsat ar face graful nereproductibil: același flux ar porni o mașină pentru un cumpărător și nu pentru altul, din cauza unei căsuțe de drepturi care nu are nimic de-a face cu fluxul. Iar granița adevărată rămâne oricum dură: căutarea primește identificatorul de organizație al rulării și refuză orice rând din afara lui, iar acest nod poate adresa prin construcție doar serverul acestei rulări.

Înainte să se nască o comandă, două site trebuie să spună amândouă da: poate acest furnizor această comandă, și poate acest fel de resursă. Pe Proxmox, astăzi, niciuna dintre cele cinci acțiuni nu este refuzată pe un container, și tocmai de aceea proba cap la cap cere și o mărire de disc și pretinde ca aceea să fie refuzată. O sită care nu spune niciodată nu este de nedeosebit de o sită care nu este conectată.

Cinci minute, pentru că pauza stă într-o cerere

Nodul de întârziere acceptă de la cinci la trei sute de secunde. Sarcina cerea șase sute, iar șase sute este greșit dintr-un motiv măsurabil: un flux declanșat de o comandă este așteptat în interiorul cererii de comandă. Zece minute de pauză înseamnă zece minute în care un client plătitor se uită la un indicator de încărcare.

Nu există o stare de așteptare durabilă, iar cât timp nu există, o pauză nu poate supraviețui unei cereri. Cusătura aceea poartă un nume în cod, ca „de ce nu poate fluxul meu să aștepte o oră” să fie o întrebare cu răspuns găsibil. Cere o coadă capabilă să păstreze o rulare pe jumătate terminată și să o reia mai târziu, iar abia după ce va exista se pot pune în discuție buclele.

Nodul HTTP, și de ce nu este fetch

Un nod HTTP într-o unealtă de automatizare este o mașină de falsificare a cererilor din partea serverului dacă nu sunteți atenți, iar atenția exclude aici clientul obișnuit.

fetch nu poate face singurul lucru pe care îl cere această politică: să se conecteze la o adresă aleasă de noi în timp ce numele de gazdă rămâne în Host și în SNI. Rezolvă pe cont propriu, iar a doua rezolvare este exact fereastra în care trăiește reasocierea DNS. Treceți prin sită o adresă publică, iar o jumătate de secundă mai târziu clientul se conectează la bucla locală pentru că durata de viață a înregistrării era zero.

Clientul HTTP propriu al lui Node acceptă o rezolvare proprie, iar a noastră întoarce exact o adresă: cea aprobată de sită. Host și SNI rămân derivate din numele de gazdă, deci TLS este validat față de nume. Validarea certificatului este pornită fără vreun întrerupător care să o oprească, iar variabilele de mediu de intermediar nu fac nimic, pentru că acel client nu le citește.

Redirecționările sunt urmate manual, cel mult trei, iar fiecare salt este trecut din nou prin sită de la început: schema, informația de utilizator, portul, DNS, fiecare adresă. O redirecționare deschisă către un punct de metadate al unui nor este refuzată la al doilea salt, chiar dacă primul era o gazdă publică respectabilă. Sunt admise șapte nume de antet, iar două dintre ele pot purta doar o referință către un secret stocat, descifrat pentru cerere, cenzurat în tot ce se păstrează și consemnat doar cu numele.

Ce am nota

  1. Capturați pe înveliș, nu pe ceea ce ați apucat. Captura indicatorului redirecționează tot ce urmează, iar simptomul este un gest care se termină în tăcere acolo unde a început.
  2. Un gest îngăduitor cere un lanț de rezerve, nu o țintă mai mare. Elementul de sub cursor, apoi părintele lui, apoi un prag de distanță.
  3. O singură intrare cumpără patru funcții. Accesibilitatea, detectarea ciclurilor, selectorul de variabile și curățarea contextului cer toate patru o rădăcină cunoscută. Numărați ce pierdeți înainte să adăugați o a doua.
  4. Eliminați ce nu poate exista; nu îl goliți. Un grup de variabile absent eșuează cu voce tare la salvare; unul gol eșuează în tăcere la rulare.
  5. Un buton de test care poate atinge producția nu este un buton de test. Omiterea și totuși luarea ramurii de succes este combinația cinstită.
  6. O pauză este mărginită de cel care o așteaptă. Dacă apelantul este o cerere HTTP, pauza se măsoară în secunde.

Pentru claritate despre ce este acest lucru: fluxurile sunt accesibile din ecranul de scripturi, iar pânza este acum singurul editor. Trei lucruri nu sunt dovedite. Așteptarea unei comenzi cu adevărat încheiate nu a fost măsurată față de un hipervizor real, tragerea a fost condusă cu evenimente simulate ale protocolului navigatorului și nu cu o mână, iar nimic din toate acestea nu a fost măsurat pe o compilare de producție.

Din munca de platformă a Provibr. De ce graful trebuie să fie finit de la bun început se află în un flux este un graf, iar un graf trebuie să fie finit, iar felul în care un ecran de sinteză citește tabelele altora fără să scrie vreodată în ele se află în a proiecta, niciodată a înlocui.

Începeți cu o gazdă și un agent

Creați un cont, instalați agentul cu o singură comandă și conectați primul dumneavoastră host Proxmox. Perioada de probă durează 14 zile și nu cere date de plată.