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

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

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

10.05.2023

Точна перевірка як антипаттерн

Виявив, на велике диво, що в нас в черзі задач бовтається задача ще з лютого місяця. Причиною стало особлива бізнес-логіка, по якій задача має N шансів отримати помилку та спробувати пізніше, а на N+1 спробу повинна видати “жорстку” помилку та остаточно закінчитись. (Так, зазвичай черги мають таку функцію вбудовану, але тут не зовсім стандартна черга.)

За цією логікою, задача не могла залишатись в черзі більше як добу. Що трапилось? Умова остаточного виходу була з перевіркою на рівність: attemptNumber == N+1. Через незрозумілу мені ситуацію, логіка на N+1 спробі не спрацювала — скоріш за все, команда на видалення з черги не була опрацьована. Та на N+2, N+3, N+100-й спробі задача призводила тільки до “мʼякої” помилки.

Інтуїтивно мені завжди хочеться зробити максимально чітку перевірку — якщо я знаю, що гілка має трапитись на N+1 спробі, то так і треба написати? Власне, сьогоднішній випадок показує, що ні. Треба осягнути всі можливі значення змінної, та визначити, що має трапитись в кожному. Тут у нас є дві множини значень, які розгалужують логіку. Все, що до N, створює “мʼяку” помилку. Все, що після N, створює “жорстку”. Саме це й має висловлювати умова: attemptNumber > N.

…Окремий випадок — це дробові числа. Їх взагалі не можна надійно порівнювати точно через особливості обчислень з рухомою комою. Підійде або наближене порівняння: abs(a-b) < EPSILON, де EPSILON - незначне маленьке значення, або ж, знов-таки, порівняння більше/менше.


09.05.2023

Останні, поки що, міркування про ВР

Пройшов Half-Life: Alyx, потім подивився відео як воно з шоломом грається (бо тепер без спойлерів)… Ну так, безперечно, суть цієї гри саме в ВР. От, наприклад, щоб відкрити ящик з припасами, треба розвʼязати простеньку головоломку на повертання кулі. В моді без ВР такі ящики відкривалися просто кнопкою. З іншого боку, стрілянина досить примітивна, що особливо помітно на кінці гри, коли її стає багато. Зброї, як виявилося, всього три різновиди, тобто ніякої тактичної глибини немає. Як шутер, гра на четвірку з мінусом.

Проте я радий, що вдалося пограти, побачити сюжет та краєвиди. Бо моя головна проблема з Half-Life: Alyx була в тому, що ВР мені не цікавий, а тут виходить, що команда Valve вирішила вкластися саме в ВР-гру. Хоча, на цей час, можна сказати, що ВР стає більш нішевою технологією, а не такою, що замінить ігри на моніторі та телевізорі. (Та насправді найбільше гравців та грошей зараз в смартфонах.)

Чому не люблю ВР? Головним чином, не хочу бути ще більше ізольованим від світу — чесно кажучи, проводити час абсолютно зануреним в гру мене навіть лякає. Я й так багато часу сиджу за екраном. Також, хоч ВР й збільшує занурення, але через це суттєво обмежує потенціал ігор. Мої улюблені жанри (а саме, soulslike та boomer shooter) потребують свободи рухів, яку ВР не може забезпечити. Та чого там, навіть стрибати по Morrowind зі швидкістю коня у ВР не вийде. Тому тенденція переходу ігор у ВР мене тривожила. Поки ця тенденція була. Але зараз виглядає так, що ВР буде розвиватися своїм шляхом та розкривати свій унікальний потенціал.

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


08.05.2023

Як зібрати гаражний VR-комплект за декілька тисяч гривень

…Насправді це моя друга спроба пограти в Alyx. До цього я зібрав собі VR “з підручних засобів” та навіть успішно… Було це ще у 2020-му, карантин, робити не було чого. Ось стисла інструкція:

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


07.05.2023

Half-Life: Alyx без ВР

👓 Сьогодні нарешті довелося пограти в Half-Life: Alyx. Специфіка цієї гри в тому, що вона вимагає шолом віртуальної реальності. Я люблю халф-лайф, але не настільки, щоб купувати коштовне залізо. Натомість натрапив на мод HLA-NoVR, який повертає Half-Life: Alyx назад до форми звичайного шутера. І шутер виходить пречудовий.

Одним словом, якщо тобі подобаються шутери, то Half-Life: Alyx з модом HLA-NoVR рекомендую всім серцем. Атмосфера та графіка на висоті. Геймплей не гірше ніж, скажімо, Resident Evil 8 (тобто шутер “з елементами виживання”).

Само собою, елементи, що спираються на віртуальну реальність, в більшій частині втрачені. Не доведеться перезаряджати руками рушницю, копатися у смітті та малювати віртуальним маркером по віртуальній дошці. Взаємодія з простором нагадує ігри серії Amnesia. Деякі головоломки очевидно прибрані за неможливістю. Тож треба признати, що правильний спосіб пережити HL: Alyx - це з шоломом, та нічого його не замінить.

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

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


06.05.2023

Скомбінував глобус та карту

Скомбінував глобус та карту в єдину сцену. Вийшло саме так, як я собі уявляв, хоча анімація поки базова та не вистачає відміток.

Найскладніший аспект всієї цієї задачі — це орієнтація в системах координат. Наприклад, в програмуванні всі звикли, що перша координата (i) йде вниз, а друга (j) - ліворуч. Але в графіці перша координата то x, а y йде знизу вгору. Коли доводиться генерувати площини та відкладати текстурні координати, то мозок просто ламається. Потім по багато разів передивляєшся код, щоб ніде не було помилок.

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

Для того, щоб нормально стилізувати стежку, є клас Line2 - бо стандартна лінія може бути тільки шириною в один піксель. У Three.js багато таких “прикладів”, що часто містять бібліотеку, яку можна використати в власних проєктах.

Нарешті, за допомогою бібліотеки suncalc я визначаю розташування сонця в день походу та емулюю його джерелом світла. Дрібниця, але мені приємно. Та й робиться просто — оскільки карта вже зорієнтована так, що вісь Y вказує на північ, то сонячні азимут та висота збігаються зі стандартними сферичними координатами 𝜑 та 𝜃.


05.05.2023

Роблю перехід з глобуса на локальну карту

Продовжую змагатись з 3D-графікою, а саме, намагаюсь зробити перехід від глобуса до локальної карти. На перший погляд, задача не тільки проста, але й незрозуміло, що то взагалі за перехід, якщо фактично карта залишається тією самою.

Ось тільки рідко так буває, що 3D “сцена” відтворює реальну структуру фізичних обʼєктів, які вона відображає. Так, хоч локальна карта і є, теоретично, частиною глобуса, але для відображення її в 3D використовувати ту саму модель недоцільно. Глобус складається з тисячі трикутників, тож сторона кожного з них десь близько 500 км. А локальна карта має сторону у 25 разів менше. Тому навіть думати про глобус та карту в одній системі координат незручно.

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

От тільки виникла проблема. Який саме масштаб я хочу показати? В попередньому демо локальною картою є просто одна плитка текстури. Але ж для кінцевого варіанту треба вирізати з неї шматок, що відповідає заданому треку. Тут довелося знову пірнати в математику. Координати, що обмежують трек, відомі. По координатах можна вийти на розмір в метрах. Далі в метрах можна обвести трек квадратом, а цей квадрат знову перевести в координати. (Ще цікава річ — координати не відповідають кілометрам однорідно, бо довжина градуса довготи залежить від широти, на якій його вимірювати.)

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

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


04.05.2023

DNS сервер Knot

Раптом після вчорашнього посту знайшовся ще один локальний рекурентний DNS сервер - Knot Resolver. Чим він гарний — це той самий сервер, який використовує Cloudflare для свого відкритого DNS 1.1.1.1. Це цікаво, бо самі автори Knot не гарантують його підтримку “в продакшні”, а тільки для простих споживацьких потреб. Втім, як бачиш, для Cloudflare його функціоналу вистачає (хоча Cloudflare додали власний кеш та ще дещо; кеш Knot не масштабується та обмежений однією машиною.)

Рекомендація від Cloudflare багато значить саме тому, що такий сервер буде давати результати, схожі на їхні. А значить, можна очікувати, що не буде незрозумілої клієнтам розбіжності, яку створював unbound. Взагалі це найбільший ризик з локальними DNS серверами — що невідомо, як вони себе поведуть в складній ситуації.

Щодо технічних деталей, то Knot Resolver встановлюється хоч на Linux, хоч на macOS, хоч в Docker; цікаво він конфігурується — файл конфігурації є скриптом на Lua. Можна кешувати запити, можна навпаки, кеш вимкнути. Можна використати в інтерактивному режимі, на кшталт dig.

Найбільші граблі, на які я наступив, поки налаштовував — це те, що DNS працює за протоколом UDP, та порти для нього треба відкривати окремо. Наприклад, в Docker: docker -p 35353:53/udp. Причому — підтримка TCP теж є — але як резервний варіант. Тому без відкритого UDP ваш DNS сервер працювати буде, тільки не з кожним клієнтом, та майже напевно з затримками. Піди та здогадайся, чому.

🇨🇿 До речі, Knot - продукт чеського доменного реєстратора CZ.NIC; на їхньому акаунті в GitHub можна знайти ще багато цікавого.


03.05.2023

Чому всі перевірялки DNS такі повільні?

Якщо тобі доводилось додавати домен до якогось SaaS, будь то Heroku, Firebase, Cloudflare, і так далі — то ти, напевно, знаєш, що для підтвердження власності треба додати DNS запис. А потім зазвичай довго чекати, поки SaaS його перевірить. Деколи це займає хвилини, а деколи прямо кажуть приходити завтра.

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

Винний, як завжди, кеш. Поняття кешу закладене в основу протоколу DNS. Чому так? Бо записи DNS не сидять всі на одному сервері. Як я вже писав, пошук адреси в DNS - процес рекурсивний — рухаючись від центральних вузлів Інтернету до більш детальних серверів, аж допоки не знайде конкретний запис. Робити так щоразу дуже витратно, бо будь-який з серверів на шляху може бути повільним чи навіть недоступним. Тому проміжні та кінцеві результати пошуку DNS кешуються. Коли створюєш запис, вказуєш параметр TTL - Time-To-Live. Він і показує (або принаймні натякає), скільки цей запис можна тримати в кеші.

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

Можна спитати — а чому тоді сервіс не ходить щоразу до DNS сервера, що містить запис (це називається SOA - Source of Authority), та не перевіряє без всякого кешу? Це не так просто. По-перше, сам авторитетний DNS-сервер може мінятись, хоча це не так часто трапляється. По-друге, проміжні сервери теж можуть мати кеш.

По-третє, і найгірше, цей кеш може розрізнятись між собою, та тоді перевірка буде стрибати з одного результату на інший. Бо DNS-сервери зазвичай мають декілька копій. Наприклад, кореневих серверів зараз аж 1696. Ясно, що коренева конфігурація (тобто адреси DNS-серверів доменів верхнього рівня) не так часто змінюється. Та сервери провайдерів, такі, як GoDaddy або NameCheap, теж мають багато копій — інакше б вони не були надійними. І звісно, свіжо доданий запис ніяк не може синхронно зʼявитися на всіх копіях.

Мине час, та думка DNS серверів про твій домен зійдеться до однієї. Але поки він свіжий, проблем не минути. Або затримка — через кеш. Або результат, що стрибає.


02.05.2023

Медитація та метакогніція

🧘 Практика медитації відома мені багато років, але власне практикую я дедалі рідше. Але, знаєте, здається знайшов привід це робити.

Взагалі медитація — поняття широке, та назвати так можна хоч праці Марка Аврелія. Я зазвичай під медитацією розумію так звану на Заході mindfulness meditation, тобто медитацію на свідомість. Суть її в тому, щоб… сидіти та усвідомлено дихати зазначений термін, від 5 хвилин та.. я, здається, у своїй практиці до 25 хвилин доходив, але це не точно.

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

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

Саме це й робить медитація на свідомість. Інструкція про дихання — то програма максимум. На практиці час медитації буде зайнятий випадковими думками, які зазвичай здатні унести нас далеко від запланованого заняття. Задача медитатора — помітити думки, та повернутись до дихання. Тобто виходить, що весь час медитації на свідомість присвячений спостереженню за думками, тобто розвитку метакогніції. Цим вона й відрізняється від “просто сидіння.” Раджу спробувати.

До речі, якщо потрібні інструкції, то можу порекомендувати тільки англійською, від Стіва Хагена. Він ще написав мою улюблену книжку про буддизм.


01.05.2023

AWS Parameter Store, Secrets Manager, та KMS: порівняння

Попросили порівняти ці схожі сервіси, які нібито всі зберігають різні ключі. Але насправді сервіси дуже різні.

AWS KMS (Key Management Service) - це сервіс шифрування, де ключі сховані “в чорний ящик”. Тобто за допомогою AWS IAM можна надати певним ролям дозвіл шифрувати або дешифрувати свої дані. Але — і це головне — при цьому ролі не отримують доступ до самих ключів. Ключі взагалі ніхто не може отримати, тільки сам AWS. Ми маємо тільки API для їх використання. Таким чином, за допомогою KMS можна не тільки поділитися доступом до зашифрованої інформації, а ще й потім цей доступ прибрати — бо якби ми поділилися самим ключем, то забрати його назад вже технічно неможливо.

KMS широко використовується в інших сервісах AWS як єдине рішення для шифрування даних. Всюди, де є шифрування — там є KMS та права доступу до нього. В тому числі й в наступних двох сервісах.

AWS Parameter Store - це сервіс збереження конфігурації. Про нього я вже писав. Але коротко, Parameter Store заміняє вам конфігураційні файли. Причому тут є і детальне керування доступом, і шифрування за бажанням, і навіть прості можливості аудиту. Проміж іншого, з Parameter Store можна вичитувати значення змінних оточення ECS та Lambda, або ж просто забирати значення через API. Дуже зручно “склеювати” сервіси до купи через значення Parameter Store, які автоматично записує Terraform.

Parameter Store розрахований для збереження великої кількості ключів, тому сховище Parameter Store безплатне. Обмежена тільки частота запитів (тому NoSQL базу з нього не зробиш, хаха), та розмір значення (до 4KB - далі платно).

AWS Secrets Manager - це спеціалізоване сховище для паролів. Причому так само як і Parameter Store, має таке саме шифрування та керування доступом. Чому ж тоді ключ Secrets Manager коштує $0.40 на місяць? Як я розумію, то фішка в тому, що Secrets Manager містить в собі автоматичну ротацію ключів. Причому ротацію не просто у вигляді тривіальної заміни ключа на новий, а з оновленням клієнта та сервера, тобто наживу, без простою, та в теорії безпечно. Тому також Secrets Manager інтегрується в сервіси AWS, що ці ключі споживають, наприклад, в AWS RDS.

Таким чином, в Secrets Manager має сенс розміщати ключі до баз даних та API, які підлягають ротації. Якщо ротацію ви не робите — то Parameter Store такий само безпечний, але ще й при цьому нічого не коштує. Тільки чомусь Secrets Manager - сервіс “першого рівня”, а Parameter Store “прихований” як частина Systems Manager. Та, якщо ти знайдеш перший, а не останній, то, як завжди, AWS про зайві витрати не попередить, та з радістю буде зберігати твої секрети по 40 центів за штуку. Caveat emptor.