Цього місяця — три речі: виправна збірка SharkTTY Desk, яку можна завантажити вже сьогодні; чесний огляд того, що робиться для застосунку на iPhone та iPad (робиться — нічого з цього ще не випущено); і звіт про стан експериментального транспорту термінала. Тут — інженерна версія подій; стислі нотатки для користувачів живуть у розділі Що нового.
SharkTTY Desk 0.8.0 — збірка від 10 липня (уже доступна)
Це збірка-продовження минулотижневого випуску 0.8.0, версія та сама — 0.8.0. Завантажити тут.
Вада «Зупинити спільний доступ»
На цю ваду ми натрапили самі, у щоденній роботі. Поки ваш екран переглядають, macOS показує в рядку меню власний індикатор із власною кнопкою «Зупинити спільний доступ». Завершення сеансу звідти — а не зсередини SharkTTY — могло заклинити Desk: QR-код зникав, служба вдавала, що запускається, і кожна спроба повторного з'єднання провалювалася — аж до виходу з застосунку та повторного запуску. Вимкнути й увімкнути віддалене керування теж не допомагало. Це найгірший різновид збою: не аварія, про яку можна повідомити, а служба, що тихо перестала нею бути.
Що відбувалося насправді: після завершення сеансу агент перебудовує мережевий слухач для наступного з'єднання, і ця перебудова має отримати назад той самий локальний порт. Але звільнення порту старого слухача було лише побічним ефектом внутрішнього прибирання, час якого залежав від того, як саме завершився сеанс — і на цьому конкретному шляху прибирання могло сильно відставати від перебудови або не завершуватися взагалі. Перебудова пробувала прив'язатися, бачила, що порт досі зайнятий, здавалася після вікна повторів, яке виявилося коротшим за прибирання, і залишала агента взагалі без слухача. Зовні це виглядало як вічне «запускається».
Виправлення перетворює цю передачу з випадковості на контракт: вимкнення тепер звільняє порт явно й підтверджує звільнення, перш ніж перебудові дозволено продовжити; сама повторна прив'язка стала терплячішою і логує кожну спробу, тож майбутній звіт можна діагностувати прямо з Консолі. Урок, який ми забираємо з собою: демонтаж заслуговує на такий самий детермінізм, як і запуск. «Порт колись сам звільниться» — це не контракт.
Показ ключа з'єднання
Три менші виправлення показу ключа з'єднання на Mac — усі стосуються лише відображення: у тому, як ключ генерується й захищається, не змінилося нічого. Прихований ключ тепер показує заповнювач фіксованої довжини замість крапки на кожен символ — маска більше не натякає на довжину. Дуже довгі власні ключі зменшуються, щоб уміститися в один рядок, а не вилазити за межі картки (винним виявився міжлітерний інтервал, що не зменшувався разом зі шрифтом). А ще Desk запам'ятовує між запусками, що ви обрали приховати ключ — приховування не повинно бути ранковою рутиною. Для показу, як і раніше, потрібні Touch ID або пароль.
Сумісність без змін: ця збірка працює зі SharkTTY 1.6 або новішим на iPhone та iPad. Якщо ваш застосунок старіший, збірка SharkTTY Desk 0.5.0 досі доступна.
SharkTTY для iPhone та iPad — у розробці
Одразу чесно: ніщо з цього розділу ще не випущено. Це те, що вже працює в наших розробницьких збірках і прямує до наступного оновлення в App Store — ми воліємо розповісти, на якому все етапі, ніж мовчати до самого запуску.
Плавуча клавіатура, друга дія
Плавуча клавіатура починає другу дію. Розкладок стає шість замість однієї — US,
UK ISO, японська JIS, французька AZERTY, німецька QWERTZ, іспанська ISO — і це
справжні розкладки, а не переклеєні ковпачки: європейські мають повноцінний третій
рівень AltGr (термінал без
| { } [ ] \ — не
термінал), ISO-розкладки отримують свою додаткову клавішу біля лівого Shift, а ряд
fn→F1–F12 мапиться за фізичною позицією для кожної розкладки окремо. Ми написали
тест, що обходить кожну розкладку й доводить досяжність кожного критичного для
термінала символа — під час розробки він упіймав дві відсутні клавіші, і саме таким
соромом тест і має вміти дошкуляти. Перемикання між плавучою клавіатурою, панеллю
голосу та системною клавіатурою тепер живе в поповері налаштувань самої клавіатури
— там, де йому й належало бути від початку.
Над клавішами з'являється нова стрічка кандидатів: доповнення береться з того, що нещодавно надрукував ваш термінал, зі слів, набраних у цьому сеансі, та з короткого списку поширених команд оболонки. Усе обчислюється на пристрої, з тексту, який ваш екран і так показує — ніщо нікуди не надсилається заради підказки. Кнопка мікрофона на клавіатурі отримує диктування «натисни й говори» з живим попереднім переглядом у тій самій стрічці, а результат вставляється лише тоді, коли ви його торкнетеся. Остання деталь — свідома: термінал не пробачає недочутих слів, тож голос ніколи не йде в оболонку напряму.
Панель голосового введення
Панель голосу переймає віконні манери, які плавуча клавіатура вже має: її можна переміщати, змінювати розмір і знижувати непрозорість, поки крізь неї не читатиметься оболонка. Один набір керувань, дві панелі, жодних сюрпризів.
Вкладки віддаленого стола, що переживають розрив
Виправлення узгодженості, яке давно напрошувалося: від'єднання сеансу віддаленого стола закривало його вкладку, тоді як від'єднання SSH-сеансу залишало вкладку з кнопкою повторного з'єднання. Один застосунок — дві філософії. Тепер вкладки Desk поводяться як вкладки SSH: від'єднання зберігає вкладку, повторне з'єднання — один дотик, а закриття вкладки відбувається лише на самій вкладці.
Надійність синхронізації
Найменш помітна робота місяця — і, мабуть, найважливіша. Ваші збережені хости, скрипти й налаштування синхронізуються між пристроями, а під час будь-якого розгортання ваші пристрої тижнями працюють на суміші версій — це не крайній випадок, це нормальний стан світу довкола кожного випуску. Ми переробили обробку формату синхронізації так, щоб дані, записані новішою версією, проходили крізь старішу неушкодженими: старий застосунок зберігає те, чого не розуміє, і записує це назад дослівно — замість давитися чи тихо сплющувати до знайомої форми. Правило, якого ми тепер тримаємося, просте: старий застосунок ніколи не повинен мати змоги знищити те, що записав новіший. Цю функцію ви ніколи не побачите — у цьому й сенс.
Експериментально: транспорт Eternal Terminal
SharkTTY розмовляє SSH і Mosh. Mosh — це те, завдяки чому термінал переживає
залізничний тунель, але він працює поверх UDP, а деякі мережі UDP просто не
пропускають.
Eternal Terminal
розв'язує ту саму задачу поверх звичайного TCP, і чимало людей уже тримають
etserver на своїх
машинах. Наша позиція проста: якщо ви вже адмініструєте сервер, який це розв'язує,
вам не повинна бути потрібна наша інфраструктура, щоб цим скористатися — застосунок
має заговорити мовою вашого сервера.
Тож ми з нуля написали Rust-клієнт відкритого протоколу ET, і тепер він проходить
повний шлях проти справжнього
etserver:
під'єднатися, друкувати, розірвати канал посеред потоку, перепід'єднатися — і нічого
не втратити. Поки що він сидить за експериментальним перемикачем, набираючи
реального пробігу; щойно набере — з'явиться як третій транспорт на вибір для
кожного хоста, поруч зі SSH і Mosh. Якщо ви вже сьогодні тримаєте
etserver і хочете
допомогти обкатати, коли перемикач відкриється — стежте за цим блогом.
Запитання чи звіти про вади щодо будь-чого з наведеного? Найшвидший шлях — дошка відгуків.