Журнал розробника
«Сьогодні в цей день», «Тоді та зараз» і «Відмітки в паспорті».
«Сьогодні в цей день», «Тоді та зараз» і «Відмітки в паспорті» використовують різні методи: зіставлення з календарем, просторове розділення та оптичне розпізнавання символів (OCR). Вони дотримуються одного правила: знаходити щось корисне, пояснювати це та залишати остаточне рішення за мандрівником.
Три способи повернути минуле.
Більшість туристичних програм оптимізовані для наступної подорожі. Mapsake також має бути корисною для повернення користувача до подорожі, яка відбулася п'ять, десять або двадцять років тому.
Це оновлення додає три різні шляхи в минуле. У цей день Знаходить зв'язок з календарем. Тоді та зараз Знаходить зв'язок з місцезнаходженням. Візи в паспорті зберігає фізичний артефакт і використовує його для покращення карти.
Вони базуються на одному й тому ж принципі: починайте з даних, якими вже володіє користувач, виконуйте цікаві операції на пристрої та запитуйте підтвердження, коли припущення можуть бути невірними.
В основі цієї версії лежить ідея збереження даних, але це не означає «надсилати більше сповіщень». Архів атласу стає корисним, коли він створює нові причини для повторного перегляду старих даних. Найкраща причина – це реальний зв’язок, який користувачеві не потрібно було створювати вручну.
Функція «Сьогодні в цей день», «Тоді та зараз» і «Відмітки» створюють ці зв’язки різними способами. Це дозволило протестувати, чи зможе зростаючий набір функцій Mapsake спільно використовувати завантаження фотографій, визначення місцезнаходження, рендеринг, навігацію та правила конфіденційності, не перетворюючись на один величезний двигун пам’яті.
Функція «Сьогодні в цей день» використовує дати не тільки з фотографій.
Найпростіша реалізація передбачає пошук фотографій за поточний місяць і день у фотобібліотеці. Mapsake робить крок далі, оскільки фотографії – це лише один із видів доказів подорожей.
Кожне місце на карті може містити інформацію про дні перебування, отриману з ручних записів, імпорту, даних про перельоти та історії фотографій. Функція «Сьогодні в цей день» об'єднує ці дати з метаданими фотографій, що зберігаються в кеші, групує результати за роками та сортує їх, починаючи з найбільш конкретних місць. Місто або аеропорт може стати центральним елементом спогаду, в той час як його регіон і країна залишаються частиною тієї ж історії.
Фільтрація фотографій виконується окремо від основного інтерфейсу, тому що велика бібліотека все одно залишається великою бібліотекою, навіть якщо запит здається простим. Результати групуються за роками та відображаються у вигляді спокійних карток. Відкриття однієї з них показує її галерею та посилання на відповідні історії про місця.
Також є функція автоматичної підстановки найближчої інформації для днів, коли немає даних. Якщо в липні немає даних для 9, Mapsake може запропонувати найближчу доступну дату, а не показувати порожню сторінку.
Зіставлення календаря має більше нюансів, ніж здається.
Фраза «той самий місяць і день» звучить як просте твердження, поки не враховуються часові пояси та неповні записи. Дати фотографій беруться з медіафайлів, тоді як дати місць, введених вручну або імпортованих, можуть представляти день, а не точний момент. Тому ця функція працює в компонентах календаря, а не перевіряє, чи метки часу знаходяться рівно на 365 днів одна від одної.
Місця впорядковані за принципом «краще – першим» для відображення. Якщо атлас знає аеропорт, місто, регіон і країну для одного дня, аеропорт або місто повинні бути вказані в заголовку картки; перерахування всіх чотирьох як окремих спогадів було б перебільшенням одного елемента доказів. Повна ієрархія доступна у вигляді міток місць і сприяє навколишньому оповіданню.
Модуль обробки фотографій використовує кеш метаданих, який Mapsake вже створив під час імпорту. Він не запитує у PhotoKit повторне сканування всієї бібліотеки щоразу, коли відкривається профіль. Фільтрація за днями виконується в окремому завданні, а потім інтерфейс отримує невелику колекцію посилань на ресурси, які можна завантажити ліниво.
Перший пункт входу знаходився в Atlas. Тестування показало, що кнопка календаря робить найважливіший екран більш завантаженим, навіть у дні, коли немає спогадів. Перенесення точки входу в Profile дозволяє їй відображатися умовно, природно поєднуватися з іншими особистими функціями та відображати стан, що не прочитано, не конкуруючи з елементами керування картою.
Повідомлення потребують власної маршрутизації. Локальне повідомлення не надходить тим самим шляхом, що й натискання звичайного універсального посилання. Mapsake записує глибоке посилання в корисне навантаження сповіщення, перехоплює відповідь у делегаті програми та передає його в той самий стан навігації, який використовують інші глибокі посилання. Функція, що відображається, – це речення; для надійного натискання потрібен весь маршрут.
Нагадування навмисно включається за бажанням користувача.
Функція «Сьогодні в цей день» може запланувати м’яке сповіщення, але лише після того, як користувач її ввімкне. Mapsake готує майбутні дати пам’яті на основі локальних даних і додає глибоке посилання, щоб натискання на сповіщення відкривало відповідну сторінку.
Жоден сервер не визначає, які спогади важливі, і жодне фото не повинно покидати пристрій, щоб спрацювала нагадування. Плитка профілю відображається лише тоді, коли сьогодні є щось, що потрібно показати, з невеликою непрочитаною крапкою, яка зникає після відкриття.
Копія сповіщення може містити інформацію про більше одного року або місця, оскільки локальний розрахунок вже знає згруповану інформацію. Нагадування може містити інформацію про те, що мандрівник був у Редмонді, Римі та Токіо в цей день протягом кількох років. Текст формується на пристрої та локалізується разом з іншою частиною програми.
Цей умовний пункт був рішенням, яке було пов’язане не лише з розробкою, але й з продуктом. Постійна порожня картка частіше рекламувала б цю функцію, але вона робила б профіль більш шумним щодня, коли ця функція не мала нічого корисного.
«Then & Now» розглядає місцезнаходження як загальну тему.
«Then & Now» шукає фотографії, зроблені неподалік від одного й того ж місця, але не менше ніж через два роки. Для реалізації використовується компактна просторова сітка: відфільтровані координати фотографій розміщуються в клітинках розміром приблизно 280 метрів завширшки, і кожна клітинка зберігає лише найдавнішу та найновішу фотографію.
Клітинки з достатньо великим часовим інтервалом стають кандидатами. Найдовші інтервали відображаються першими, сусідні кандидати видаляються, щоб одна ділянка не заповнювала весь список, а скомпільована географічна база даних надає мітку міста та країни. Результат кешується до тих пір, поки індекс фотографії не зміниться.
Це навмисно не схоже на пошук схожих зображень. Фотографії не повинні показувати одну й ту ж композицію або об'єкт; це інша функція для Constellations. Then & Now ставить простіше питання: як виглядало це місце, коли ви повернулися через кілька років?
Пари відкриваються у звичайному переглядачі фотографій та можуть бути поділені через той самий шлях рендерингу, що й картки паспорта. Оригінали залишаються у вихідній бібліотеці, а Mapsake зберігає лише легкі метадані, необхідні для повторного пошуку пари.
Чому 280 метрів і два роки?
Просторова комірка навмисно допускає похибки. GPS телефону може давати збій, пам'ятка може бути сфотографована з протилежних боків площі, а стара камера може мати менш точні координати. Точна відповідність координат пропустить багато дійсних результатів. Відповідність за рівнем міста буде занадто широкою і може призвести до зіставлення не пов'язаних районів.
Приблизно 280 метрів є пороговим значенням для продукту, а не твердженням про те, що дві фотографії показують однакову фізичну точку. Це питання про те, чи достатньо близькі результати, щоб відчути зв'язок, коли зображення розташовані поруч. Мінімальний термін у два роки запобігає сприйняттю першого та останнього дня подорожі як довгострокової зміни.
Під час сканування зберігаються лише найдавніші та найновіші фотографії в кожній комірці. Це робить використання пам'яті пропорційним кількості заповнених комірок, а не загальній кількості зображень, і природним чином збільшує часовий проміжок. Кандидатські пари потім сортуються за тривалістю та просторово дедублюються, тому навіть якщо у людини є сотні фотографій навколо одного домашнього квадрата, вона все одно бачить різноманітні фотографії.
Ключ кешування базується на метаданих фотографії та кількості виключених фотографій. Імпорт нової партії фотографій або видалення фотографії з карти призводить до перерахунку пар; повторне відкриття екрана без зміни джерела дозволяє додатку використовувати раніше отриманий результат.
Перший етап тестування показав, що Then & Now також витрачає багато часу на пошук найближчих міст. Оскільки він використовує спільний довідник, а не функцію зворотного геокодування, специфічну для функції, ця робота з індексації географічних даних прискорила імпорт і роботу Constellations, що зробило ці мітки набагато дешевшими. Спільні основи створюють спільні успіхи.
Функція
«Then & Now» потребує двох фотографій з роками, місцем і періодом часу. Створення нового експортера призвело б до дублювання рендерингу світлої та темної теми, співвідношень сторін для соціальних мереж, попереднього завантаження зображень, збереження у «Фотографії» та системного аркуша обміну.
Замість цього, ця пара обертається у користувацьку карту Passport і передається на існуючий екран обміну. Зображення джерела попередньо завантажуються, тому що SwiftUI's offscreen ImageRenderer працює синхронно на кінцевій точці рендерингу. Користувач бачить ту саму схему попереднього перегляду та призначення, яка використовується для карт і статистики.
Повторне використання – це більше, ніж просто оптимізація коду. Це робить поведінку обміну передбачуваною: нічого не публікується автоматично, експортований файл виглядає як попередній перегляд, і застосовуються ті самі правила доступності та кольорової схеми.
Штампи в паспорті потребують допомоги, а не хибної впевненості.
Реальні штампи на паспорті – це складний матеріал для OCR. Вони можуть бути вицвілими, повернутими, накладеними на фонові зображення, написаними різними мовами і, іноді, нанесеними один на одного. Будь-який сканер, який заявляє про ідеальне автоматичне розпізнавання, може надати користувачеві невірні дані про подорожі.
Mapsake використовує фреймворк Apple Vision на пристрої для вилучення тексту, який може бути розпізнаний, а потім ранжує можливі збіги. Код аеропорту IATA є сильним сигналом. Двобуквений код країни, назва країни, місцева назва, місто, порт в'їзду або європейська дата можуть слугувати додатковими доказами. Частини назви аеропорту місцевою мовою допомагають визначити, чи було зроблено запис літаком, навіть якщо OCR не розпізнав кінець слова.
Сервіс зіставлення пропонує варіант і бажаний ланцюжок місць: країна, регіон, місто та аеропорт, якщо це доступно. Він ніколи не приймає рішення самостійно. На екрані перегляду завжди є можливість вибрати інший варіант або вказати місце вручну.
Ця обережна рекомендація важлива. Пропущена рекомендація коштує одного натискання. Впевнена, але неправильна рекомендація тихо пошкоджує карту.
Вицвілий марка з Ісландії змінив механізм зіставлення.
Один реальний штамп зробив обмеження більш наочними. Текст на аеропорту мав виглядати наступним чином: KEFLAVIKURFLUGVOLLUR,, але розмиті чорнила та перенесення рядка сприймалися як щось ближче до Vision. KEFLAVIKURFLUGVOLI UR.. Перевірка на повне слово для терміну «аеропорт» ісландською мовою не вдалася, тому Mapsake не змогла зробити висновок про рейс і не змогла визначити аеропорт Кефлавік.
Виправлення не було спеціальним випадком для одного паспорта. Тепер механізм зіставлення розпізнає корені для загальних слів, пов'язаних з аеропортами, кількома мовами: фрагменти, що відповідають слову "аеропорт" ісландською, німецькою, іспанською, португальською, нідерландською, скандинавськими мовами та іншими. Навіть пошкоджений суфікс може вказувати на спосіб в'їзду та зміщувати розв'язання місця в бік аеропорту.
Додано два нових уроки про штампи ЄС та Шенгенської зони. Двобуквений код країни у форматі ISO корисний лише тоді, коли він відображається окремо; інтерпретація кожного двобуквеного слова як країни призведе до невідповідностей. Європейські числові дати також потребують аналізу у форматі «день-місяць», перш ніж локально-залежний загальний детектор отримає можливість прочитати їх у форматі «місяць-день».
Розпізнавання точки входу є толерантним до префіксів з тієї ж причини. Довгі складні слова місцевою мовою можуть містити назву міста або аеропорту, навіть якщо вбудований географічний довідник містить коротшу англійську форму. Програма розпізнавання намагається використовувати значущі початкові фрагменти, а потім будує ланцюжок з країни, регіону, міста та аеропорту навколо підтвердженого результату.
Ланцюжок відображається перед збереженням. Вибір конкретного аеропорту може вказати місто, регіон і країну, але кожен рівень, отриманий в результаті аналізу, залишається видимим і доступним для редагування. Інтерфейс розроблений таким чином, щоб пропонувати найбільш ймовірний варіант, а потім надавати користувачеві можливість прийняти або відхилити його.
Зберігайте сам артефакт, а не його копію.
Запис штампа паспорта зберігає метадані та посилання на вихідне фото, а не повні байти зображення. Mapsake створює невелику, відтворювану мініатюру для стіни штампів і завантажує оригінал за запитом. Якщо вихідний файл, отриманий з Photos, видалено, то при звірці можна видалити його сиротній штамп, не вдаючи, що зображення все ще існує.
Слово «дійсно» в цьому реченні має значення. Обмежене дозволи «Фотографії» не може довести, що невидимий ресурс було видалено; він може просто знаходитися за межами дозволеного набору. Відновлення видаляє штамп лише в тому випадку, якщо дозвіл бібліотеки достатній, і жоден локальний або хмарний ідентифікатор не знайдено. Невизначеність зберігає запис.
Ця модель, заснована на посиланнях, також дозволяє зберігати невеликі дані, сумісні з CloudKit. Мітка може синхронізувати країну, дату, книгу, метод введення, сторінку, стан улюбленого, нотатку та ідентифікатори, не намагаючись зберігати фотографію паспорта в рядку бази даних. Локальний мініатюрний знімок 256 – це кеш, а не джерело істини.
Марки можна організувати у іменні паспорти, позначати як прибуття або від'їзд, призначати дати та способи в'їзду, а також переглядати за країнами. Обрізка, вирівнювання, поворот і кисть для розмиття допомагають підготувати корисне зображення перед публікацією колажу по країні або континенту.
Те саме можна використовувати для сканування сторінки з фотографією в паспорті в книгу. Розбір машиночитаної зони надає структуровані поля, де це можливо, а зображення залишається посиланням на власну бібліотеку користувача.
Розпізнавання MRZ відключає корекцію мови. Машинно-зчитувана зона – це суворий набір літер, цифр і кутових дужок; намагання змусити OCR перетворити її на природні слова може зробити її більш читабельною, але при цьому зменшити точність розпарсених полів. Надруковані поля, такі як місце народження, обробляються окремо, і кожен результат потрапляє у редагований формат книги.
Функції камери та вибору зображень використовують етап обрізки та повороту перед розпізнаванням. Пізніше було додано функцію вирівнювання, зум, панорамування та пензлик розмиття для захисту конфіденційної інформації. Редактор відключає конфліктуючі жести під час активного пензлика розмиття, а потім об'єднує зміни в вихідне зображення відповідно до обраного користувачем способу зберігання.
Галерея штампів групує артефакти за континентами та країнами, а не лише за сторінками паспорта. Натискання на розгорнутий список країн відкриває окремі штампи; можна фільтрувати прибуття, від'їзди та улюблені; заголовки континентів і країн можуть відображати колаж через конвеєр Passport. Країни залишаються корисними метаданими, але географічне розташування є більш природним способом перегляду в атласі подорожей.
Достатньо технічно просунутий, щоб викликати довіру.
Ці функції використовують три різні методи: об'єднання календаря, просторове розділення та оптичне розпізнавання символів (OCR). Користувацький інтерфейс слідує тій самій схемі.
- Отримайте кандидата на основі існуючих локальних даних.
- Складні функції слід виносити за межі основного інтерфейсу.
- Поясніть, що було знайдено.
- Надайте користувачеві можливість відкрити, виправити, поділитися або проігнорувати його.
Це той вид інтелекту, який я хочу бачити в Mapsake. Він повинен полегшувати повторне відкриття особистого журналу, не створюючи враження, що алгоритм краще розуміє життя, ніж людина, яка його прожила.
У цих функціях приховано більше інженерної роботи, ніж здається на перший погляд, але жодна з них не повинна бути складним завданням для користувача. Технічна робота успішна, коли «Сьогодні в цей день» відкривається на правильний рік, «Then & Now» показує несподіваний результат, а складний маркер пропонує корисний варіант, не перебільшуючи впевненість.