Diario dello sviluppatore
"Questo giorno", "Then & Now" e "Passport Stamps"
"Questo giorno", "Then & Now" e "Passport Stamps" utilizzano tecniche diverse: associazioni di calendario, raggruppamento spaziale e riconoscimento ottico dei caratteri (OCR). Seguono la stessa regola: trovare qualcosa di utile, spiegarlo e lasciare la decisione finale al viaggiatore.
Tre modi per riportare in vita il passato.
La maggior parte dei software di tracciamento dei viaggi è ottimizzata per il prossimo viaggio. Mapsake deve anche essere in grado di riportare qualcuno a un viaggio avvenuto cinque, dieci o vent'anni fa.
Questo aggiornamento aggiunge tre percorsi diversi verso il passato. Questo giorno trova una connessione con il calendario. Allora e ora trova una connessione di posizione. Visti del passaporto conserva un artefatto fisico e lo utilizza per migliorare l'atlante.
Condividono un principio di progettazione: inizia con i dati che l'utente possiede già, esegui il lavoro interessante sul dispositivo e richiedi una conferma ogni volta che un'inferenza potrebbe essere errata.
C'è un'idea di conservazione dietro questo rilascio, ma non è "inviare più notifiche". Un atlante a vita diventa utile quando crea nuove ragioni per rivedere i vecchi dati. La migliore ragione è una vera connessione che l'utente non ha dovuto curare manualmente.
"Questo giorno", "Then & Now" e "Stamps" creano queste connessioni in modo diverso. Questo li ha resi un buon test per vedere se l'insieme di funzionalità in crescita di Mapsake poteva condividere il caricamento delle foto, la risoluzione delle posizioni, il rendering, la navigazione e le regole sulla privacy senza trasformarsi in un singolo motore di memoria gigante.
"Questo giorno" utilizza date provenienti da più delle sole foto.
L'implementazione più ovvia cercherebbe nella libreria di foto il mese e il giorno correnti. Mapsake fa un passo avanti perché le foto sono solo un tipo di prova di viaggio.
Ogni luogo nell'atlante può contenere giorni di presenza provenienti da inserimenti manuali, importazioni, voli e dalla cronologia delle foto. "In questo giorno" combina queste date con i metadati delle foto memorizzati nella cache, raggruppa il risultato per anno e ordina i luoghi più specifici per primi. Una città o un aeroporto possono essere evidenziati nella memoria, mentre la sua regione e il suo paese fanno parte della stessa storia.
Il filtraggio delle foto è separato dall'interfaccia principale perché una libreria grande rimane una libreria grande, anche quando la query sembra semplice. I risultati vengono raggruppati in ordine cronologico inverso e visualizzati come schede di anno chiare. L'apertura di una scheda mostra la sua galleria e i link alle storie dei luoghi pertinenti.
Esiste anche una funzione di fallback "memoria più vicina" per i giorni tranquilli. Se luglio 9 non ha nulla, Mapsake può indicare la data più vicina che ne ha, invece di presentare un vicolo cieco.
La funzione di corrispondenza del calendario presenta più dettagli di quanto sembri.
"Lo stesso mese e giorno" può sembrare un predicato banale fino a quando le zone orarie e i record incompleti entrano in gioco. Le date delle foto provengono dai media acquisiti, mentre le date dei luoghi inserite manualmente o importate possono rappresentare un giorno anziché un istante preciso. Questa funzione funziona quindi nei componenti del calendario invece di verificare se i timestamp sono esattamente 365 giorni separati.
I luoghi sono ordinati dal più fine al più fine per la presentazione. Se l'atlas conosce l'aeroporto, la città, la regione e il paese per un giorno, l'aeroporto o la città dovrebbero essere evidenziati nella scheda; elencare tutti e quattro come ricordi separati esagererebbe una prova.
La visualizzazione delle foto utilizza la cache dei metadati che Mapsake ha creato durante l'importazione. Non richiede a PhotoKit di scansionare l'intera libreria ogni volta che il profilo viene aperto. Il filtro giornaliero viene eseguito in un'attività separata e quindi l'interfaccia riceve una piccola raccolta di riferimenti di risorse che può caricare in modo differito.
Il primo punto di accesso si trovava nell'Atlante. I test hanno mostrato che un pulsante del calendario rendeva lo schermo visivamente più importante più disordinato, anche nei giorni senza ricordi. Spostare il punto di accesso nel Profilo gli ha permesso di essere visualizzato in modo condizionale, di abbinarsi naturalmente ad altre funzionalità personali e di visualizzare uno stato non letto senza competere con i controlli della mappa.
Le notifiche richiedono il proprio lavoro di routing. Una notifica locale non arriva tramite lo stesso percorso di un collegamento universale ordinario. Mapsake scrive un collegamento profondo nel payload della notifica, cattura la risposta nel delegato dell'app e la inoltra allo stesso stato di navigazione utilizzato da altri collegamenti profondi. La funzionalità visibile è una frase; il tocco affidabile richiede l'intero percorso.
Il promemoria è intenzionalmente facoltativo.
"Questo giorno" può programmare una notifica delicata, ma solo dopo che l'utente l'ha abilitata. Mapsake prepara le date di memoria future dai dati locali e aggiunge un collegamento profondo in modo che, toccando la notifica, si apra la vista corretta.
Nessun server decide quali ricordi siano importanti e nessuna foto deve lasciare il dispositivo affinché il promemoria funzioni. La scheda Profilo appare solo quando c'è effettivamente qualcosa da mostrare quel giorno, con un piccolo punto non letto che scompare dopo l'apertura.
La notifica può riassumere più di un anno o un luogo, perché il calcolo locale conosce già il risultato aggregato. Un promemoria potrebbe indicare che il viaggiatore era a Redmond, Roma e Tokyo in un determinato giorno, nel corso di diversi anni. Il testo viene assemblato sul dispositivo e localizzato insieme al resto dell'app.
Questa voce condizionale era una decisione sia di prodotto che di ingegneria. Una scheda permanentemente vuota promuoverebbe la funzionalità più spesso, ma renderebbe il profilo più rumoroso ogni giorno in cui la funzionalità non avesse nulla di utile da dire.
"Then & Now" considera la posizione come il filo conduttore.
"Then & Now" cerca foto scattate nelle vicinanze dello stesso luogo con una differenza di almeno due anni. L'implementazione utilizza una griglia spaziale compatta: le coordinate delle foto filtrate vengono posizionate in celle di circa 280 metri di larghezza, e ogni cella conserva solo la foto più vecchia e la più recente mentre viene analizzata.
Le celle con una durata sufficientemente lunga diventano candidate. I periodi più lunghi vengono visualizzati per primi, i candidati vicini vengono deduplicati in modo che un singolo luogo non possa riempire l'intera lista e il gazetteer raggruppato fornisce un'etichetta di città e paese. Il risultato viene memorizzato nella cache fino a quando l'indice delle foto cambia.
Questo non è intenzionalmente una somiglianza di immagini. Le foto non devono mostrare la stessa composizione o soggetto; questo è un compito diverso per Constellations. Come appariva questo luogo quando sei tornato anni dopo?
Le coppie si aprono nel visualizzatore di foto normale e possono essere condivise tramite lo stesso percorso di rendering delle carte Passport. Gli originali rimangono nella loro libreria di origine, mentre Mapsake conserva i metadati leggeri necessari per ritrovare la coppia.
Perché 280 metri e due anni?
La cella spaziale è deliberatamente tollerante. Il GPS del telefono può sbiadire, un punto di riferimento può essere fotografato dai lati opposti di una piazza, e una fotocamera più vecchia potrebbe avere coordinate meno precise. Una corrispondenza esatta delle coordinate tratterebbe male molti risultati validi. Una corrispondenza a livello di città sarebbe troppo ampia e abbinerebbe quartieri non correlati.
Circa 280 metri è una soglia di prodotto, non un'affermazione che due foto mostrino lo stesso punto fisico. Chiede se la corrispondenza è sufficientemente vicina da creare un senso di connessione quando le immagini sono affiancate. Il minimo di due anni evita che il primo e l'ultimo giorno di una vacanza siano presentati come un cambiamento a lungo termine.
Solo la foto più vecchia e quella più recente di ogni cella vengono conservate durante la scansione. Questo rende l'utilizzo della memoria proporzionale al numero di celle occupate piuttosto che al numero totale di immagini e massimizza naturalmente l'intervallo di tempo. Le coppie candidate vengono quindi ordinate per durata e deduplicate spazialmente, quindi una persona con centinaia di foto attorno a una singola cella vede comunque varietà.
La chiave di memorizzazione segue la generazione dei metadati della foto e il conteggio delle esclusioni. Importare un nuovo batch di librerie o rimuovere una foto dalla mappa e le coppie vengono ricalcolate; riaprire lo schermo senza modificare la sorgente e l'app riutilizza il risultato.
Un primo test di benchmark ha mostrato che "Then & Now" impiegava anche molto tempo nelle ricerche di città vicine. Poiché utilizza il Gazetteer condiviso anziché un decodificatore geografico inverso specifico per una funzionalità, il lavoro di indicizzazione geografica che ha accelerato le importazioni e "Constellations" ha reso anche queste etichette molto più economiche. Le basi condivise creano successi condivisi.
La condivisione utilizza la pipeline di Passport.
"Then & Now" aveva bisogno di una scheda con due foto, anni, luogo e periodo. La creazione di un nuovo esportatore avrebbe duplicato il rendering della luce e dell'oscurità, i rapporti di aspetto sociali, il precaricamento delle immagini, il salvataggio delle foto e il foglio di condivisione del sistema.
Invece, la coppia viene avvolta come una scheda Passport personalizzata e consegnata allo schermo di condivisione esistente. Le immagini di origine vengono precaricate perché ImageRenderer fuori schermo di SwiftUI è sincrono nel punto di rendering finale. L'utente vede lo stesso flusso di anteprima e destinazione utilizzato per mappe e statistiche.
Questo riutilizzo va oltre la semplice economia di codice. Rende prevedibile il comportamento della condivisione: nulla viene pubblicato automaticamente, l'esportazione assomiglia all'anteprima e le stesse regole di accessibilità e colore si applicano.
I timbri Passport hanno bisogno di un aiuto, non di una falsa certezza.
I timbri del passaporto reali sono un materiale difficile da elaborare con l'OCR. Sono sbiaditi, ruotati, sovrapposti a illustrazioni, scritti in molte lingue e a volte timbrati direttamente l'uno sull'altro. Qualsiasi scanner che affermi di offrire una perfetta riconoscimento automatico inganna l'utente fornendogli dati di viaggio imprecisi.
Mapsake utilizza il framework Vision di Apple sul dispositivo per estrarre il testo che può leggere, quindi classifica le possibili corrispondenze. Un codice aeroporto IATA è un segnale forte. Un codice paese di due lettere, il nome del paese, un endonimo locale, una città, un porto di ingresso o una data europea possono fornire ulteriori prove. I nomi degli aeroporti nella lingua locale aiutano a riconoscere che un'inserimento è stato probabilmente effettuato in aereo, anche quando l'OCR non riesce a leggere la fine della parola.
Il motore di corrispondenza suggerisce una catena di luoghi preferiti: paese, regione, città e aeroporto, se disponibili. Non fa mai una supposizione da solo. La schermata di revisione consente sempre un altro candidato o una selezione completamente manuale.
Questo approccio prudente è importante. Un suggerimento mancato costa un semplice tocco. Un suggerimento errato e sicuro corrompe silenziosamente l'atlante.
Un timbro di passaporto dell'Islanda sbiadito ha modificato l'algoritmo di corrispondenza.
Un vero timbro ha reso concreti i limiti. Il testo dell'aeroporto avrebbe dovuto indicare KEFLAVIKURFLUGVOLLUR, ma l'inchiostro sbiadito e l'interruzione di riga sono stati interpretati da Vision come qualcosa di più vicino a KEFLAVIKURFLUGVOLI UR. Un controllo di parole intere è fallito per il termine dell'aeroporto islandese, quindi Mapsake non ha dedotto un volo né ha risolto l'aeroporto di Keflavik.
La correzione non era un caso speciale per un singolo passaporto. Il comparatore ora riconosce i prefissi delle parole comuni dei nomi degli aeroporti in diverse lingue: frammenti corrispondenti alla parola "aeroporto" in islandese, tedesco, spagnolo, portoghese, olandese, lingue scandinave e altre. Una fine danneggiata può comunque suggerire il tipo di ingresso e influenzare la risoluzione della posizione verso un aeroporto.
Sono state aggiunte due lezioni in più sui timbri UE e Schengen. Un codice paese ISO di due lettere all'interno dell'ovale è utile solo quando appare da solo; trattare ogni parola di due lettere come un paese creerebbe corrispondenze assurde. Anche le date europee devono essere analizzate prima in base al giorno prima che un rilevatore generale sensibile alla località abbia la possibilità di leggerle in base al mese.
La risoluzione del punto di ingresso è tollerante ai prefissi per lo stesso motivo. Le lunghe parole composte nella lingua locale possono contenere un nome di città o di aeroporto, anche quando il glossario incluso memorizza la forma inglese più breve. Il risolutore tenta di utilizzare frammenti iniziali significativi e quindi costruisce la catena di paese, regione, città e aeroporto attorno al risultato confermato.
La catena viene mostrata prima del salvataggio. La selezione di un aeroporto con un livello di dettaglio fine può contrassegnare la sua città, regione e paese contemporaneamente, ma ogni livello inferito rimane visibile e modificabile. L'interfaccia utente è progettata attorno a un suggerimento forte seguito da una decisione umana.
Mantieni l'artefatto, non un'altra copia.
Un record di timbro di passaporto memorizza i metadati e un riferimento alla foto di origine, non agli interi byte dell'immagine. Mapsake crea una miniatura piccola e rigenerabile per il muro dei timbri e carica l'immagine originale su richiesta. Se un'immagine originale proveniente da Foto viene effettivamente eliminata, la riconciliazione può rimuovere il suo timbro orfano senza fingere che l'immagine esista ancora.
La parola "veramente" in questa frase è importante. Un'autorizzazione limitata di Foto non può provare che un elemento non visibile sia stato eliminato; potrebbe semplicemente essere al di fuori della selezione consentita. La riconciliazione rimuove un'etichetta solo quando l'autorizzazione della libreria è sufficiente e né l'identificatore locale né quello del cloud vengono risolti. L'ambiguità conserva la voce.
Questo modello basato su riferimenti mantiene anche i dati compatibili con CloudKit, di piccole dimensioni. Un timbro può sincronizzare il suo paese, la data, il libro, il metodo di inserimento, la pagina, lo stato preferito, una nota e gli identificatori, senza tentare di archiviare una fotografia del passaporto all'interno di una riga del database. Una miniatura locale 256 pixel è una cache, e non la fonte della verità.
I francobolli possono essere organizzati in album di passaporto denominati, contrassegnati come arrivi o partenze, assegnati date e metodi di ingresso e visualizzati per paese. Ritagliare, raddrizzare, ruotare e un pennello di sfocatura aiutano a preparare un'immagine utile prima di condividere un collage di un paese o di un continente.
Lo stesso flusso può scansionare una pagina di identificazione di un passaporto in un libro. L'analisi della zona leggibile dalla macchina fornisce campi strutturati ove possibile, mentre l'immagine rimane un riferimento alla libreria dell'utente.
Il riconoscimento MRZ disabilita la correzione linguistica. La zona leggibile dalle macchine è una sequenza rigida di lettere, numeri e parentesi angolari; chiedere all'OCR di convertirla in parole naturali può renderla più leggibile, ma rendere i campi analizzati meno accurati. I campi stampati, come il luogo di nascita, utilizzano un processo separato di miglior tentativo, e ogni risultato viene visualizzato in un formato di libro modificabile.
I flussi della fotocamera e del selettore condividono una fase di ritaglio e rotazione prima del riconoscimento. Successivamente, è stato aggiunto un quadrante di rettifica, zoom e panoramica, nonché un pennello di sfocatura per i dettagli sensibili. L'editor disabilita i gesti in conflitto mentre il pennello di sfocatura è attivo, quindi combina le modifiche nell'immagine sorgente salvata in base al comportamento di archiviazione scelto dall'utente.
La galleria di timbri raggruppa gli artefatti per continente e paese, invece che solo per libro di passaporto. Toccare una pila di paesi espansa apre i singoli timbri; arrivi, partenze e preferiti possono essere filtrati; le intestazioni di continente e paese possono visualizzare un collage tramite la pipeline di condivisione di Passport. I libri di viaggio rimangono metadati utili, ma la geografia è il percorso di navigazione più naturale in un'atlante di viaggio.
Abbastanza tecnico da essere affidabile
Queste funzionalità utilizzano tre tecniche diverse: join di calendario, raggruppamento spaziale e riconoscimento ottico dei caratteri (OCR). L'esperienza utente segue lo stesso schema:
- Deriva un candidato dai dati locali esistenti.
- Mantieni il lavoro complesso fuori dall'interfaccia principale.
- Spiega cosa è stato trovato.
- Permetti all'utente di aprire, correggere, condividere o ignorare.
Questo è il tipo di intelligenza che voglio in Mapsake. Deve facilitare la riscoperta del record privato senza agire come se un algoritmo comprendesse una vita meglio della persona che l'ha vissuta.
C'è più ingegneria in queste funzionalità di quanto suggeriscano le loro superfici calme, ma nessuna di queste deve diventare un compito per l'utente. Il lavoro tecnico ha successo quando "On This Day" si apre all'anno corretto, "Then & Now" mostra un ritorno sorprendente e un'etichetta difficile offre un candidato utile senza esagerare la certezza.