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

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

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

21.10.2022

Метапрограмування в Ruby як наслідок відсутності функцій як значень

🚂🚅🪆 Чому в Ruby метапрограмування — це норма, а в JavaScript його не роблять, віддаючи перевагу функціональній композиції? Ну, може, тому, що JavaScript - справжня функціональна мова, а Ruby - зовсім ні.

От вам треба зробити обгортку для якоїсь логіки. В Ruby, напевно, будете створювати методи через class_eval, який викликає інший метод, названий за деякою договореністю. На цьому побудований весь фреймворк Ruby on Rails.

А в JavaScript замість того можна просто передати в обгортку внутрішню функцію, а результат зберегти у константу, та вживати як будь-яку іншу звичайну функцію. Наприклад, так працює React, Redux, Reselect, та весь сучасний ідіоматичний JavaScript.

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

Що виявляється: найшвидше працюють саме названі методи, тобто створені напряму в класі командою def, або через class_eval. На цілих 75% повільніше працює Proc - найближче, що є в Ruby до справжніх функцій. А виклик методу командою send аж в 3 рази повільніше. Гірше над усе робити посилання на метод командою method, яка практично не зустрічається на практиці.

До того ж схоже на те, що кожний вкладений виклик накладає таку саму ціну, тобто в Ruby краще обходитись найпростішою абстракцією.

Тепер, порівняємо з аналогічним бенчмарком для JS. По-перше, в JavaScript варіантів побудови та виклику набагато менше. Функція — це значення, та й годі. Роби з нею, що хочеш.

По-друге, цікаво, що в Google Chrome та в Safari вкладені функції не впливають на швидкість виконання. Як я розумію, це завдяки потужному механізму оптимізації JIT.

Для мене можливість функціонального програмування робить JS набагато привабливішою та елегантнішою мовою, ніж Ruby.


20.10.2022

Як виправити помилковий git push --force

🤠🚒🛟 Сьогодні колега перезаписав мої зміни командою git push --force.

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

Треба розуміти модель Git: в ньому нічого не зникає назавжди (принаймні, відразу.) Git push перезаписує ланцюг комітів, це так. Але старі коміти залишаються в базі даних Гіта аж до виконання команди git gc (вручну або за досягненням межі по розміру.) Їх можна знайти командою git reflog - цю команду має знати кожний, хто любить push --force. Вона перелічить всі нещодавно активні коміти, навіть якщо вони були перезаписані. Далі залишається витягнути втрачений коміт командою git cherry-pick, і пушнути результат.

Чому я користуюсь git push --force? Зазвичай тому, що не люблю коміти-виправлення. А їх інколи доводиться робити багато. А ще, якщо змін багато, я люблю розбивати їх на логічні шматки по комітам. Звісно, відразу такого ніколи не заплануєш (хіба що не комітити до останнього — а це справжня небезпека, не те що push --force). Тому при підготовці пул-реквеста я сортую зміни командою git rebase --interactive.

(До речі, замість --force варто знати та використовувати більш обачливу опцію --force-with-lease.)


19.10.2022

Cloudflare for SaaS - генерація сертифікатів для користувацьких доменів

🔒✨🐇 Сьогодні увімкнули ще одну можливість Cloudflare - а саме, генерацію сертифікатів TLS для користувацьких доменів. Це у них загадково називається Cloudflare for SaaS.

Як це виглядає для користувача: вони роблять CNAME на наш домен, підтверджують його на нашому боці, і отримують на своєму домені HTTPS з правильним сертифікатом (і контент з нашого сервера).

Як це виглядає для нас: наш сервер має бути підключений через Cloudflare Proxy (як це нормально буває, якщо ви користуєтесь Cloudflare.) Потім, після реєстрації клієнтського домену ми по Cloudflare API додаємо його як Custom Hostname. По HTTP домен працює відразу, а з HTTPS через хвилину.

Як це працює: зрозуміло, що Cloudflare, по-перше, має підтвердити власність домену. Це можна зробити або доданням DNS запису, або відповіддю на HTTP запит за заданим шляхом. Так от, HTTP-випробування за нас пройде Cloudflare Proxy - бо домен клієнта вже направлений на нього через CNAME. До нашого додатка цей запит навіть не доходить. Отакою простою магією без жодних зайвих зусиль користувача він отримує TLS-сертифікат (тобто, сам сертифікат — ні, а підтримку HTTPS - так.) Радію від таких рішень.

Фіча доступна навіть на безплатних планах, а коштує $0.10 на домен на місяць, при чому перші 100 доменів безоплатно. Було б добре придумати якесь цікаве некомерційне застосування.


18.10.2022

Чому Dark Souls - моя улюблена гра

🎮🤺👹 Сьогодні цікаво розмовляли з колегою про те, що то є Dark Souls та чому це моя улюблена гра (тобто жанр.) Якщо підсумувати, то:

Для мене першою грою з серії стала Dark Souls (коли вийшла на ПК). З першої спроби здалося, що то повна дурня — нічого не зрозуміло, всі мене вбивають, і таке інше. Але потім (після того, як подивився let’s play Bloodborne від Game Grumps) вирішив спробувати ще, але зробити зусилля. Було так само важко, та я читав вікі, думав, і вчився. І коли, нарешті, я пройшов першого справжнього боса, та побачив перед собою нові, небачені простори, в той момент я зрозумів, що Dark Souls - це для мене.


17.10.2022

Як помітити поламку швидко? Налаштувати автоматичне спостереження

😬😱😳 Нема нічого гірше, ніж помітити, що на продакшні щось поламалось, і причому давно. А ти це міг помітити, але не помітив аж до непристойно пізнього часу.

В мене найстрашніший випадок був з блогом. Для редизайну я обрав несистемний шрифт, але забув під’єднати деякі варіанти. Та всі відвідувачі бачили весь текст на блозі жирним курсивом! Я ж цього не знав, тому що такий шрифт був встановлений в мене в системі, тому бачив текст нормальним. Так от, я це помітив майже через рік, і те, коли хтось прислав неповʼязаний з цим багом скриншот. Ото було сорому.

Але ж пропустити поламку на вісім годин це теж дуже неприємно.

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

Натомість треба думати про автоматичне спостереження, а також системи автоматичного сповіщення, такі, як PagerDuty. Така система буде писати вам СМС, дзвонити, нагадувати всіма можливими способами, доки ви не підтвердите, що прийняли екстрену ситуацію.

Ну, й впроваджувати хелс-чек на кожне місце, де такі ситуації виникають.


16.10.2022

Завантаження текстових даних у react-native-health, та інтеграція з redux

❤️🗄️📈 Продовжую робити додаток з react-native-health.

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


15.10.2022

Мій розумний дом з Home Assistant

📺🔊🪄 Коротка розповідь про початок мого “розумного дому”, і навіщо це треба.

Щоб зрозуміти потребу, треба спочатку отримати задачу. В мене нею стало керування домашнім медіацентром, коли ми придбали караоке:

Так от, все це вдалося автоматизувати за допомогою розумного дому, а саме Home Assistant, а ще інфрачервоного мосту Broadlink.

Як це працює: Home Assistant постійно слідкує, чи увімкнений телевізор, та який на ньому обраний відеовхід. Також в нього записані команди з ІЧ-пульта колонок. При зміні стану телевізору Home Assistant виконає той чи інший скрипт, який пошле через ІЧ-мост команду, що увімкне колонки, чи змінить аудіовхід.

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

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

А ще, тепер я можу керувати всім цим з додатка Home Assistant на телефоні. Там можна побудувати “пульт” з улюблених команд.

А ще, за допомогою цієї системи можна зробити розумним будь-який кондиціонер, бо вони керуються ІЧ-командами. До речі, стан кондиціонера зберігається в його пульті, і при будь-якій зміні відправляється в кондиціонер повністю. Тобто досить легко зберегти в Home Assistant декілька улюблених режимів кондиціонера і вмикати їх за обставинами, наприклад, за температурою у приміщенні.

І тут… варто тільки почати, можливостей безліч.


14.10.2022

Чому ми обираємо один великий сервіс замість купи мікросервисів

🐳🤝🐳 Сьогодні з двох сервісів вирішили зробити один. І то навіть не мікро-, а дуже такі макросервіси. Просто підстава причина мати два окремих сервіси. І то добре

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

Є декілька приводів робити більше одного сервісу:

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

Щоб розділяти контексти та спростити розробку, краще використати можливості вашої мови програмування — модулі та таке інше. Може це не ідеально, але я не бачив ще, щоб мікросервіси робили щось краще. Крім того, очевидно що мікросервіси впроваджують в розробку купу складнощів, потребують гарного дизайну інтерфейсів, та навичок мережевого програмування. Тому я не бачу, як введення мікросервісів дозволить, наприклад, долучити до розробки більшу кількість менш досвідчених інженерів — принаймні, ефективно. Бо то тільки здається, що легко замінити виклик функції на виклик API. Розкажу про це якось іншим разом.


13.10.2022

StarCraft - моя улюблена стратегія

🧑‍🚀👽🐜 Сьогодні несподівано пост про Старкрафт.

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

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

На мою думку, кампанія взагалі не дуже “стратегічна” гра у тому сенсі, що вона ніколи не є чесною грою, а натомість є чередою головоломок. Кожна місія ставить особливе випробування, а задача гравця — зрозуміти, що воно є, та впоратись.

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

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

Інколи головоломка очевидна — наприклад, місії, де гравцю забороняють повітряні юніти — а інколи треба дивитись на обставини — який надали юніт. Наприклад, попередня місія - Into the Darkness - потребує опанування і використання здатності героя копіювати юніти — галюцинація — бо карта повна ворожих камікадзе, що вибухають, і я просто не уявляю, як це пройти без виманювання їх на галюцинації.

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


12.10.2022

Додаток єППО - ідеальний перетин здібностей людини та машини

🚀👀📱 Зверну увагу на додаток єППО, що вийшов сьогодні. Він дозволяє будь-кому долучитись до захисту України від ракет — повідомляти про ракети та дрони, якщо побачиш їх в небі. Далі, як я розумію, дані агрегуються, фільтруються, та додаються до системи виявлення цілей.

(Дисклеймер: я ніяк з додатком та його авторами не повʼязаний.)

На мою думку, це чудова ідея для додатка. Зазначу очевидне — ППО рятує життя. А також те, що спосіб щось зробити зі смертю, що пролітає над головою — це потужна психічна допомога для кожного пересічного українця.

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

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

Повідомити, де саме вона летить, може як і додаток по API, так і людина за телефоном або месенджером. Але перше відбудеться за долі секунди, а друге — за хвилини.

У людей краще виходять задачі аналітичні, інтуїтивні, з нечітко оголошеними параметрами (або взагалі без них.)

У машини краще виходять облік, контроль, агрегація.

Щоб була синергія, треба і в маленькому, і в великому контексті шукати — де доля людини, а де доля машини.