Стендап Сьогодні
Що я зробив, що я хочу зробити, і що це все значить.
Повсякденні здобутки в форматі стендапу.
Детальніше в статті
Підписатись на RSS
📢
Канал в Telegram @stendap_sogodni
🦣
@stendap_sogodni@shevtsov.me в Федиверсі
02.04.2025
Docker та стан у файлах
Docker це чудово, питань нема. Сервіси ізольовані, запускай хоч один хоч десять. Можна без простою запустити нову копію, а потім моментально на неї перемкнутись. Але є ситуація, в якій модель контейнеризації трохи розвалюється. Це коли контейнер має приєднану директорію, яка ще й зберігає стан.
Як яскравий приклад: в Docker недоцільно запускати базу даних. Якщо воно у вас локально та не страшно все зупинити та запустити наново — то най буде. Але в живому використанні, а то ще й на хмарному сервісі чи в Kubernetes - відразу виявиться проблемка: директорії зі станом зазвичай не розраховані на одночасне використання двома копіями сервісу. В кращому випадку отримаємо помилку на кшталт “сервіс вже запущений”, а в гіршому — вони тихо потроху псуватимуть стан.
Якщо вже сервіс розрахований на зберігання стану в файлах, я просто не знаю гарного рішення для запуску його в Docker. Окрім баз даних, це стосується, наприклад, WordPress, який погано почувається без можливості редагування власних файлів. Стан у файлах не є частиною застосунку 12 факторів. (Звісно, реальність така, що десь на файлах сидить база даних.)
Це не те щоб провина Docker - очевидно, що дві копії PostgreSQL в принципі не можна запустити одночасно з однієї директорії. Але з традиційною моделлю розгортування такої потреби й не виникає. (Щоправда, способу оновити PostgreSQL без простою я теж не знаю.)
01.04.2025
Гіпермедійні застосунки проти SPA
Переглянув тут книжку Hypermedia Systems, яку порадив автор дружнього каналу. Тезою книжки є те, що індустрія у любові до JavaScript втратила простіший, кращий підхід до розробки застосунків, де сервер займається промальовкою HTML, а клієнт вміє надсилати команди сервера згідно з семантичною розміткою. (А краще самі почитайте, бо одним реченням не передати.)
Я розумію привабливість цього підходу, особливо якщо звик працювати із серверними застосунками, або взагалі починав у вебі, коли окрім них нічого не було. Але, мій ідеал — це застосунки, здатні працювати локально, та SPA ближче до цього ідеалу, ніж гіпермедіа.
Звісно, переважна більшість SPA не має локального стану. Втім, це і є недолік та саме в цьому напрямку потрібно працювати. Від майже локальних рішень як Firebase до повноцінних баз даних.
Краще б розробники більше думали, чи потрібно їм ходити на сервер за тим чи іншим функціоналом. Взагалі єдине, що дійсно потребує сервера — це взаємодія з іншими людьми, чи синхронізація пристроїв. Вистачає ніш, де нічого такого не потрібно.
Але головною проблемою offline first є навіть не складність, як я писав раніше, а гроші. Бо великі гроші заробляються на корпоративних клієнтах, які потребують співпраці над даними. (До того ж в застосунках “для простих людей” гроші робляться на використанні даних… що легше зробити, коли вони на сервері.)
З тим, які потужні пристрої ми всі носимо в кишенях та рюкзаках, хотілося б щоб більше архітекторів вкладалися в локальний стан та використання сервера як засобу для синхронізації. (Але не обовʼязково це найпростіший шлях.)
31.03.2025
Очікування в інтеграційних тестах
Хто що використовує для фіча-тестів? Я вже бозна скільки років на Capybara, та про інші фреймворки знаю тільки поверхнево. Але це показник того, що Capybara така хороша, що для Ruby on Rails нічого більше не потрібно.
Але гадаю, тема сьогодні незалежна від інструмента. Фіча-тести ніколи не є на 100% стабільними. Графічний інтерфейс це вже складно, а коли його автоматизувати, то складність тільки помножується. Тому багато фіча-тестів дають хибу, але не кожного разу — а випадково.
Виправляти хиби важко, бо це ще й доводиться робити пізніше, коли контекст втрачений. (Ідея: якось зробити, щоб тільки що додані тести запускалися багато разів, для виявлення випадкових хиб.) Та що люди першим роблять: додають очікування. У випадку з Capybara це зажди помилка, оскільки Capybara чекає результатів автоматично.
Але то якщо правильно писати тести. Наприклад, Capybara чекатиме тільки всередині перевірок. Якщо просто звертатися до елементів, то невідомо, чого саме чекати. Ще є класична помилка expect(page).not_to have_content
: тут Capybara не знає, що потрібно чекати, поки зміст зникне. Правильна форма - expect(page).to have_no_content
.
До того ж очікування не розвʼязують питання послідовності дій. От виправляв тільки-но помилку, де сценарій інколи стартував ще до того, як компонент React встигне перемалюватися з даними. В такому разі перший крок сценарію затирався. Я собі стільки морочив голову над поведінкою та можливими проблемами з кнопкою SVG, а виявилося, що лише треба було на початку почекати правильного стану.
30.03.2025
Вимикач замість пультика
Приклад другий: в мене є люстра-вентилятор (цікавий факт: це вже друга люстра після тієї, з якої почався канал). Вона має єдиний вхід 220, а далі керується інфрачервоним пультом.
Раніше з цією люстрою просто була класична проблема, що вимикач на стіні вимикав її повністю, разом із вентилятором. Але після ремонту той фізичний вимикач приховали (та залишили, як резервний.) Тепер проблема інша: пульти я просто не переношу — тому керування було перенесено в розумний будинок.
Для того в мене є інфрачервоний прожектор Broadlink Universal Remote - я вже раз, два, третю роботу для нього знаходжу. Він є окремим пристроєм з живленням по USB, тому таких прожекторів можна розставити по кімнатах там, де це потрібно.
В базовому вигляді Broadlink надає можливість вивчити та надсилати команди по ІЧ. А якщо йдеться про вимикачі, то в інтеграції Broadlink для того є окремий режим вимикача. Там з двох команд утворюється сутність (entity) вимикача, для якої HA памʼятатиме стан та дозволить використати в автоматизаціях операцію “перемкнути”.
Нарешті, залишається ту операцію привʼязати до натискання вчорашньої Shely BLU Button, та фізичний вимикач готовий! Один — на світло, один — на вентилятор. 🌪️
29.03.2025
Вимикачі через HomeAssistant
В мене трохи відбувається ремонт, частиною якою — волею чи неволею — є впровадження розумного будинку. Чесно, я прибічник простих рішень та фізичних перемикачів, але інколи “просто” не виходить.
Приклад 1: є довгий коридор. В плані електрики я заклав на нього один вимикач освітлення. Так, треба було закладати більше, але фактично я це збагнув вже коли дійшла справа до монтажу ламп в стелю, тобто додавати проводку було вже пізно. 🙈
В екстреному порядку до ламп в кінцях коридору проклали окремі кабелі живлення та вивели до “центру мережі”. Потім я заживив їх через розумне реле Shelly, десь таке. (Shelly це, мабуть, моя улюблена марка розумного будинку.)
До реле достатньо підвести 220, хоча можна й фізичний вимикач. Решту воно робить через Wi-Fi. Те ж саме реле можна взагалі сховати у звичайній коробці будь-якого вимикача, та зробити його розумним, тобто додати можливість вмикати та вимикати віддалено. Проте в мене як раз вимикача й бракувало.
Shelly чудово інтегрується із HomeAssistant. Але вимикач потрібний фізичний. З цим в мене досвіду поки не було, тому взяв від тих же Shelly BLU Button. Набув досвіду: кнопка трохи повільна, на мій погляд, через те що вона на Bluetooth. (Зате менше жере енергії?) До речі: то ж саме реле виявилося здатним виступати як приймач Bluetooth, абсолютно несподівано, бо я збирався підʼєднувати до HA адаптер.
Втім, повільно чи ні, а кнопки працюють, світло вмикається та вимикається. Звісно, оскільки це проходить через автоматизацію HomeAssistant, то можна додати й більш просунуту поведінку, як-от вмикати все світло разом, або за розкладом.
Приклад 2… вже сьогодні не влізе. :)
28.03.2025
Почитай книгу
📚 Книга — недооцінений шлях прокачатися з початківсько-середнячкового рівня в чомусь до середнє-просунутого. Технічна книга, мається на увазі.
В наші часи стільки є джерел інформації, що наче книга є зайвою. Від StackOverflow до читання коду, а тепер ще й дослідження за допомогою LLM, наче немає потреби витрачати час та гроші на читання чогось, що ще й не має прямого відношення до насущних задач.
Втім, що книга дає — це структура та розуміння більш досвідченої людини. Це можливість перестрибнути брак власного досвіду та опинитись відразу в майбутньому. Одним словом, коли Нео вчив кунг-фу, він точно слухав аудіокнигу.
Звісно, ту книгу ще потрібно знайти. Бо хороша книга то рідкість. А потім за неї ще буде потрібно заплатити, часто немало. Та якщо вже пощастило натрапити на надійну книгу, не шкодуй грошей — вони окупляться. А до того ж в наші часи письменництво потрібно винагороджувати, бо інакше автори переведуться, а далі що?
Наведу пару прикладів. Колись мені дуже допоміг The DynamoDB Book - треба було зрозуміти, що ж воно таке то DynamoDB, та як на ньому збудувати архітектуру. Бо основи легко знайти в посібниках, але що з ними далі робити?
А з недавнього був Thinking in SwiftUI. Навіть після місяців практики, а також читання офіційної документації, форумів, та блог-постів, ця книга була справжнім одкровенням. Тільки з нею я нарешті зрозумів, збагнув, як SwiftUI працює в нюансах. Стало незрівнянно легше міркувати про свій код, коли в голові є моделі з книги.
Отже. Хочеш підвищити рівень — знайди почитати гарну фахову книгу.
27.03.2025
Чим складні SPF, DKIM, та DMARC?
Розгляньмо коротко три головні механізми автентифікації пошти, та чому вам варто звернутися до поштового сервісу (наприклад, до нас), та перекласти турботи на їхню голову.
SPF - це DNS (TXT) запис, що оголошує, з яких IP-адрес дозволено надсилати пошту від вашого домену. Складність 1: йдеться про Envelope FROM, то треба знати, що це таке. Та не забути налаштувати поштову програму, щоб вона використовувала правильний. А також, оскільки SPF оголошує айпішки, то треба, щоб поштова програма виконувалася на машині зі статичною айпішкою, а не десь в хмарі. Та, потрібно не забувати оновлювати той запис, коли адреси змінюються (та вміти його правильно скласти.)
DKIM - про який я вже розповідав - це асиметричний підпис листів. Публічний ключ сидить в TXT записі до вашого домену (А тут вже можна і домен Envelope FROM
, і просто From:
, а краще — обидва!) А приватним потрібно підписувати важливі заголовки в кожному листі. Мені особисто підпис заголовків це завжди головний біль, бо їх треба зібрати, нормалізувати, скласти до купи… Звісно, на то є бібліотеки, головне — інтегрувати їх у поштову програму.
DMARC - а оце дійсно просто. DMARC тільки оголошує про наш намір використати SPF та DKIM. Бо, бачите, без DMARC незрозуміло, чи вважати відсутність механізму сильним відʼємним сигналом. Але наявність DMARC (який стає зараз примусовим для листів на GMail та Yahoo) збільшує наслідки від поламки SPF/DKIM.
Але все ж головною проблемою є те, що всі ці механізми тільки підтверджують автентичність домену відправника. А те, що цей домен не bank.com
, а bank.com.abcdef.xyz
- їм всім абсолютно байдуже.
26.03.2025
Шифрування на кожний день: AEAD
В криптографії я повний дилетант. Тому, коли постає задача “щось зашифрувати”, очі розбігаються від різних алгоритмів, режимів, жаргону і так далі.
Тому ділюся головним скороченням, яке треба знати: AEAD. Якщо вам потрібно “щось зашифрувати”, то оце воно. AEAD попросту значить, що окрім зашифрованого повідомлення, передається також і його підпис — за яким можна підтвердити, що дані не сфальсифіковані. (Цікавий факт: будь-які двійкові дані можна “розшифрувати” за алгоритмом та отримати якийсь відкритий текст. Так що підпис рятує не тільки від фальсифікації, а й просто втрати інформації.)
Але насправді навіть не потрібно знати, що там є підпис, бо його за вас зробить (та перевірить) бібліотека шифрування. (Правило шифрування №1 - не пиши нічого сам!) А от що від нас залежить, так це вибір нонса, який повинен бути унікальним в межах одного ключа. Якщо ви не плануєте одним ключем шифрувати мільярди посилок, то звичайний випадковий нонс влаштує.
Щодо конкретних алгоритмів, то є 2. Золота класика: AES256-GCM. Оптимізований на апаратному рівні, використовується у Wi-Fi, TLS, та багато де ще. Та новий модний ChaCha20-Poly1305 - більш безпечний (як каже інтернет), швидший на ARM, теж використовується у TLS, WireGuard тощо. Обидва алгоритми вас влаштують.
У JWE - це який JWT, але зашифрований — теж, до речі, AEAD.
25.03.2025
Підтримка relref для Mastodon
Приблизно два роки в мене в ПЗ для каналу є спосіб вказати посилання так, щоб на сайті воно вело на сайт, а в каналі Telegram - на пост в каналі. Сьогодні доробив цей функціонал й для публікації в Mastodon.
До речі. Mastodon досі не вміє публікувати Markdown. Тому технічно, наразі я підтримую не Mastodon, а GoToSocial, та, здається, ще Akkoma. Але — я використовую API Mastodon, звідси й назва.
Тут цікавого те, що вихідний текст поста в мене в Markdown. Та на виході теж отримую Markdown. Тому, певно, можна було б підставити посилання магією регулярних виразів, але навіщо, коли в мене є готове рішення для синтаксичного дерева Markdown? Залишилось тільки з нього побудувати назад Markdown - для того в Goldmark є спеціальний рендерер — та справа зроблена.
Мені такий підхід згодиться й в майбутньому, бо він допоможе позбавитись від тих конструкцій, які підтримуються неповноцінно.
24.03.2025
Чому спамери краще вміють в SMTP?
Я тут багато писав про особливості SMTP (бо саме з ним пощастило працювати останніми роками на Mailtrap.) Натрапив тут на пост, де згадувалося, що спамери краще виконують (так, виконують, а не обходять) механізми захисту SMTP, ніж легітимні відправники. Хотілося прокоментувати.
Проблема тих механізмів (DKIM, SPF, DMARC) в тому, що вони складні чисто технічно. А подолати технічні складності набагато легше, коли це твоя головна робота. Фактично, кожний новий механізм тільки покращує позиції спамерів та погіршує — пересічних відправників.
Всі поточні механізми захисту привʼязані до домену відправника. Та оскільки спамери вільні реєструвати безліч нових доменів, немає ефективного способу позначити когось як спамера. В цілому, також немає способу позначити себе як “не спамера” (бо таким способом відразу ж скористались би спамери.)
Отже, можна сказати, що SMTP приречений на спам. Причому це значно більша проблема для відправників. Бо через підозри на спам можуть не дійти абсолютно непорочні листи — як-от відновлення пароля. Бо в ньому була картинка велика, а ще було посилання на домен підтримки, який схожий на ваш, але не зовсім (прямо як з фішингом). Тож спамфільтр вирішив, що лист підозрілий — та до побачення.