ThatPigeonThatPigeon

This page is not translated yet. You are reading it in Romanian.

How it is built

Ai încredere într-o aplicație în care îți ții toată crescătoria doar dacă știi ce face cu ce îi dai. Pagina asta e scrisă pentru crescător, nu pentru programator: fără termeni pe care trebuie să îi cauți, fără promisiuni pe care nu le putem arăta. La capăt ai un link către descrierea tehnică, dacă vrei să mergi mai adânc.

Povestea unui „Salvează”

Ion e în crescătorie, cu telefonul într-o mână și un pui în cealaltă. Scrie numărul de pe inel, alege sexul, apasă Salvează. Pentru el s-a terminat acolo: pasărea apare în listă și poate trece la următoarea.

Între apăsare și pasărea din listă se întâmplă însă ceva ce merită spus pe îndelete, fiindcă aici se hotărăște cine poate vedea ce ai scris.

Telefonul împachetează rândul și îl trimite pe o legătură criptată. Nimeni de pe drum nu îl poate citi. Baza de date îl primește și pune prima întrebare care contează: cine trimite asta. Nu are încredere în telefon pe cuvânt, ci verifică sesiunea cu care ai intrat în cont.

Abia după ce știe că e Ion, rândul se scrie, iar pe el rămâne însemnat cine e proprietarul. Acel însemn nu e o etichetă decorativă. E cheia după care baza de date hotărăște, de fiecare dată când cineva cere ceva, dacă are voie să primească rândul acela. Regula se cheamă row-level security, securitate la nivel de rând, și e pornită pe fiecare tabel din baza noastră de date. Fără excepții.

Ion își vede pasărea în listă aproape instantaneu. Vecinul lui, care are cont în aceeași aplicație, nu o vede deloc, oricât ar căuta. Nu fiindcă interfața i-o ascunde, ci fiindcă baza de date refuză să i-o dea.

Ce se întâmplă după ce Ion apasă Salvează: telefonul trimite rândul criptat, baza de date verifică cine este, rândul se scrie pe contul lui și doar contul lui îl poate citi înapoi.

Unde stau datele

Baza de date stă pe servere din Uniunea Europeană. Asta e important pentru regulile europene de protecție a datelor, și e important și pentru un motiv mai simplu: e locul unde te afli și tu.

Pe fiecare tabel e pornită regula de mai sus. Porumbeii tăi, cursele tale, jurnalul tău, pozele tale: fiecare rând știe al cui e, și baza de date nu îl dă altcuiva. Crescătoria vecinului îți e invizibilă, a ta îi e invizibilă lui.

Asta nu e o setare pe care ți-o oferim și pe care ai putea uita să o pornești. E felul în care e construită baza de date, iar o modificare care ar adăuga un tabel neprotejat oprește lucrul înainte să ajungă la tine.

Telefonul tău vorbește cu o bază de date din Uniunea Europeană. Fiecare tabel are securitate la nivel de rând, așa că datele tale și ale altui crescător rămân separate.

Ce nu vedem niciodată

Ca să știm dacă aplicația se deschide, dacă exportul e folosit, dacă cineva se împiedică într-un ecran, avem nevoie de un semnal că ceva s-a întâmplat. Atât. Semnalele astea sunt numărate pe un serviciu găzduit tot în Uniunea Europeană, iar lista lor completă e mai jos, scrisă o singură dată în codul aplicației și citită de aici. Nu e o listă pe care o repetăm din memorie într-o pagină: e chiar lista pe care o folosește aplicația.

Ce nu pleacă de pe telefon ca semnal de folosire: numerele de pe inele, numele păsărilor sau al crescătoriei, rezultatele, vitezele, pedigree-urile, pozele. Numărul inelului nu părăsește telefonul ca dată de analiză. Știm că aplicația a fost deschisă; nu știm al cui porumbel, ce serie, ce rezultat.

Ce pleacă de pe telefon ca analiză de folosire și ce nu pleacă niciodată: numele evenimentelor, fără nimic care să te identifice pe tine sau păsările tale.

The signals the app sends

The list below is read straight from the app's code rather than written out a second time here. If a signal is added, it appears on this page on its own.

  • app_open — The app was opened. No time, no place, no device.
  • bird_created — A bird was added. Not which one — no ring number, no name.
  • result_created — A race result was saved. Not whose, and not from which race.
  • export_used — You exported data. Only which kind — birds, results, journal, health, pairings or listings.
  • statistics_viewed — You opened Statistics. The only detail sent: seasons — How many seasons your loft has — a count, never which seasons.
  • trends_viewed — You opened Trends. The only detail sent: insights — How many of the cards had something to say — a count, never which.

Din ce e făcută

Aplicația nu e o bucată mare. Sunt câteva piese, fiecare cu o treabă, iar împărțirea asta e motivul pentru care un calcul dă același răspuns pe telefon și pe site.

  • Aplicația de telefon e produsul: ce ții în mână în crescătorie.
  • Site-ul duce ghidul, paginile publice de porumbei și pedigree-urile tipăribile.
  • Partea de calcul ține socotelile, de la viteză la consangvinitate. Nu are interfață și nu știe nimic despre ecrane, tocmai ca să poată fi verificată bucată cu bucată.
  • Stratul de date e singura poartă prin care se scrie sau se citește din bază. Niciun ecran nu vorbește direct cu baza de date.
  • Baza de date ține totul: conturile, rândurile, pozele și regulile de acces descrise mai sus.

O piesă face o treabă. Cel mai util lucru din împărțirea asta e poarta unică: fiindcă tot ce intră și iese trece printr-un singur loc, regulile se aplică într-un singur loc.

Piesele din care e făcută aplicația și cum se leagă: aplicația de telefon, site-ul, partea de calcul, stratul de date și baza de date.

Mai departe

Pagina asta spune ce se întâmplă. Dacă vrei să vezi cum, cu numele componentelor și deciziile din spatele lor, descrierea tehnică e la arhitectura aplicației.

Also here