Стендап Сьогодні

Що я зробив, що я хочу зробити, і що це все значить.
Повсякденні здобутки в форматі стендапу.
Детальніше в статті

Підписатись на RSS
📢 Канал в Telegram @stendap_sogodni
🦣 @stendap_sogodni@shevtsov.me в Федиверсі

22.04.2024

Jupyter: спостереження

Дивлюся досить непоганий курс Андрія Карпати про програмування нейронних мереж. Що поки вразило, так це те, що курс ведеться цілком в Jupyter - інтерактивному “блокноті” для Python. Я, певно, перший раз бачу його в реальному використанні.


21.04.2024

Мої незамінні доповнення до HTPC


20.04.2024

Освітлення з добовим ритмом

Відступ: взагалі, я вважаю, що штучне освітлення вдома повинно включатися тільки коли немає природного, та повинно бути максимально червоним (тобто 2700K). Але не буду заглиблюватись в цю тему. Таке правило має виключення. Деякі лампи вдома дійсно включаються вдень, наприклад, освітлення в туалеті. Червоне світло вдень виглядає неприємно.

В ідеалі, освітлення мало б адаптуватись до часу доби. Тому довелося відступити від правила покупати тільки якісні червоні лампи та знайти щось зі змінною температурою. Знайшов такий виріб, як Philips WiZ Connected Tunable White Smart LED.

Тепер, як зробити, щоб температура лампи відповідала часу? Пішов спочатку складним шляхом: через HomeAssistant. В цілому, автоматизація за часом — зрозуміло. Але нюанс — в мене ця лампа йде під звичайний, не розумний вимикач. Тобто вносити зміни доведеться тоді, коли лампа вмикається. Чи може HomeAssistant “помітити”, що лампа зʼявилася в мережі? Так. Тільки доведеться використати подію “сутність змінила стан з Недоступний на Увімкнений” замість більш звичної “пристрій увімкнено”.

З такою автоматизацією задача була розвʼязана. З єдиним недоліком: поки лампа зловить Wi-Fi, проходило декілька секунд, під час яких лампа була в попередньому режимі. (Насправді в реальному використанні це абсолютна дрібниця. Але…) (О, до речі, відразу через застосунок Wiz вимкнув функцію, коли лампа автоматично перемикає світло з синього на жовте на кожне увімкнення.)

Тоді вирішив звернутися до (очевидно гірших?) засобів автоматизації, вбудованих у Wiz. Та був дуже здивований, що добовий ритм — це стандартна функція цих ламп! Налаштувати розклад тривіально (див. ілюстрацію). Ніякого HomeAssistant тут не потрібно. Єдине — що все одно режим змінюється з затримкою.


19.04.2024

Стохастичний трекер: перші успіхи

Несподівано пройшов цілий місяць користування стохастичним таймтрекером. Але написати хотів не про те. Я нарешті зрозумів, що ця програма може дати (бо без того розробка трохи застрягла — проєкт без користі продуктом не стане.)

Нагадаю, що трекер складається з випадкових (розподілених пуассонівські) пінгів, для яких ти записуєш, чим займаєшся в той самий момент. Як я раніше писав, на один день пінгів дивитися мало сенсу через випадковість — тому я збираю статистику по тижнях. На ілюстрації видно, що на рівні тижнів пінги показують цілком реальну картину (хіба що в широких межах; смуга на графіку це область ймовірної тривалості тегу.)

Проте на статистиці по тижнях зміни зʼявляться тільки наприкінці тижня. Не дуже дієво. Тож я сидів, записував пінги та думав, що робити.

Аж допоки цього тижня не помітив, що посеред тижня тег “робота” був якось… низько. Та цього сигналу було достатньо, щоб звернути увагу та догнати плани на тиждень. Без трекера, я б просто не побачив різницю завчасно.

Насправді пригадав, що це не перший такий випадок. Минулого місяця навпаки, помітив, що BG3 може затягнути на години — що ще важче помітити самостійно. Зазвичай буває “ой, вихідні минули, а нічого не встиг”.

Одним словом, буду робити функціонал раннього попередження, коли розподіл тегів відрізняється від звичайного.


18.04.2024

Як зробити мінікарту?

Добре, вчора я отримав GPS-трек для відео з реєстратора. Наступний крок — зробити з нього мінікарту на кшталт GTA.

Першою ідеєю було отримати зображення з плитками карти та зробити анімацію власноруч, приблизно як я робив тут. Вже приготував математичну частину (взагалі вона цікава, та до глобуса я ще повернусь.)

Але растрові плитки цього разу мене не влаштовують; якщо в глобусі були світлини з супутника, то тут для правильного ефекту вкрай потрібні підписи та значки на карті. Оскільки карта обертається за напрямком руху, то влаштує тільки векторна карта, а щоб малювати власноруч векторну карту я недостатньо дурний.

Тоді план Б це використати пакет векторних карт та записати з нього відео. Тобто… доведеться звертатися до вебпрограмування. На щастя, MapTiler, звідки я беру карти, має гарний SDK. Показати та зорієнтувати карту — справа на хвилини. Результат — зверху.

Єдиний недолік — відео трохи смикається — спочатку не знайшов, як робити анімацію. Бо не шукав: приклад лежить на поверхні, а анімація функцією flyTo робиться практично так само, як просто перехід до координат. Тільки easing повинен бути лінійним для плавного руху — за замовчуванням він не лінійний та з серією рухів карта все одно стрибає.


17.04.2024

Отримання GPS-треку з відеореєстратора

Давно в мене є маленька мрія взяти відео з реєстратора та накласти на них UI перегонової гри. Ну, тобто в першу чергу мінікарту, а також бажано спідометр та трек прогресу. Проте такий проєкт потребує багато розрізнених навичок. Вирішив потроху розплутувати.

Для початку, мені потрібний GPS-трек. Якщо придивитись, то мій реєстратор додавав координати GPS прямо на відео. А значить, за допомогою OCR можна забрати їх звідти. Так я собі й уявляв початок роботи — розтягати відео на кадри, залучити якийсь OCR, та витягувати координати.

Однак… цього робити виявилось не потрібно. В мене була надія, що відео містить трек як метадані — так само як світлини містять координати в блоці EXIF. Так воно і є — та метадані можна витягнути епічною утилітою ExifTool. Називаються дані QuickTime Tags та, в моєму випадку, містять не тільки координати, а й швидкість та навіть азимут. Якщо хочеш перевірити своє відео, то ось команда:

exiftool -g3 -ExtractEmbedded video.mp4

Кожний пакет даних вже привʼязаний до кадру, тобто залишається (якщо це слово доцільне) згенерувати відповідний кадр UI та накласти його. Далі буде.


16.04.2024

URL в повідомленнях про помилку

Просте та геніальне рішення: щоб покращити досвід від ваших повідомлень про помилки, можна зробити на сайті підтримки сторінку з поясненням та… вставити посилання на цю сторінку прямо в текст помилки. (Йдеться про повідомлення в API чи SDK, не в інтерфейсі — хоча там посилання на довідку теж доцільні.)

Дійсно, програмним засобам абсолютно байдуже, чи є зміст повідомлення текстом, чи посиланням. А людям не потрібно пояснювати, що є посиланням, або що з ним робити. Таким чином ми можемо розширити зміст пояснення практично без обмежень.

Мені подобається, що почати можна буквально зараз (якщо у вас є сайт підтримки, але якщо його немає, то краще почати з нього.) Та це не повинно бути глобальною зміною — можна взяти перше повідомлення, про яке частіше доводиться пояснювати клієнтам.

Також подобається, що таку документацію легше підтримувати, бо в коді є на неї посилання. Якщо ж робити окремо, на кшталт сторінки з переліком кодів помилок — то є всі шанси забути оновити її, коли зʼявляється ще один.

Такий підхід я бачив в деяких API Google. Також його регулярно використовують сервери SMTP. Не дивно, бо по SMTP ми постійно стикаємося з незнайомими серверами та несподіваними ситуаціями. Посилання — часто єдиний спосіб пояснити, що відбувається, та головне — що клієнт мусить зробити.


15.04.2024

Три різновиди імпорту/експорту в продукті

Деколи ці режими можуть бути поєднані в один. Проте частіше їхні потреби знаходяться в протиборстві: для користувача зручніше текст та дублювання інформації, для архіву — двійковий формат та нормальна форма. Або: ніби у “стандартний” формат можна запхати всі дані програми, але не в такому представленні, щоб прочитати їх назад.

Тому я б радив спочатку зʼясувати, який саме імпорт/експорт потрібно зробити, та не намагатись покрити всі вимоги відразу.


14.04.2024

Розклад-автопілот

Читаю нову книгу від автора “Глибока робота” - “Повільна продуктивність”. (Насправді, не читаю, а слухаю аудіокнигу — ось вам вже порада по продуктивності.)

Багато чого в книзі мені апріорі близько — наприклад, ідея того, що якщо звести кількість обовʼязків до мінімуму, можна досягти великого успіху в тому, що залишилось. (Я, нарешті, навчився відповідати — чесно — що “до вашого питання зможу дістатись тижня через два”. Замість того, щоб накопичувати обіцянки, а потім не встигати їх зробити.)

Про розклад-автопілот. Це свідома організація власних обставин так, щоб обовʼязки виконувались “на автопілоті”, тобто випливали з обставин. Наприклад: “після обіду я беру чашку кави, сиджу на кухні та перевіряю всі пул-реквести.” Або: “поки я роблю каву зранку, також розкладаю посудомийну машину”. Або: “Середами зранку ми зустрічаємось в кавʼярні та працюємо над проєктом.”

Цікаво, що так чи інакше у всіх є звички-“автопілоти” - прокидатись та залізати в телефон на 15 хвилин це теж “автопілот”. Тобто він дійсно працює. Залишається докласти усвідомленості та змусити автопілот працювати на тебе.


13.04.2024

Гра

Сьогодні завершив роботу та гра дійсно готова до того, щоб нею поділилися. Пограти можна тут: monsterland.leonid.codes.

Найскладніше було зробити екранну клавіатуру. Спочатку просто зрозуміти, як же ж воно може працювати: клавіатура повинна створювати події KeyboardEvent. Рухомих частин забагато, тому довго шукав, що не так з прикладами з Гітхабу, поки не зрозумів, що створюю події за старим стилем (тут в стандартах багато змін, як не дивно). Поміняв на актуальний та все запрацювало. (А якби код був на TypeScript, я б це швидше знайшов. Тільки розробка тут велася взагалі без тулчейну, напряму.)

Потім — налаштувати CSS, та ще й так, щоб на різних екранах було нормально. Сконцентрував зусилля на пейзажному режимі та ніби вийшло непогано. Навіть повноекранний режим працює (тільки не на iPhone - він його, як виявилось, не підтримує.)

Нарешті, довелося все ж трохи доробити гру, на рівні Community Patch. В першу чергу, додати візуальні запити, коли гра очікує на ввід — наприклад, після команди “кинути” треба вказати номер предмета — бо без того взагалі незрозуміло, чому гра зависла. Але також виправити пару очевидних багів та скоректувати колір тексту, бо не читалося зовсім.

О, до речі, щоб зробити картинку для фону, долучив ML-генератор Diffusion Bee. Якщо її ще й розмити, то вади стають непомітні — а для атмосфери фон досить важливий.