Стендап Сьогодні
Що я зробив, що я хочу зробити, і що це все значить.
Повсякденні здобутки в форматі стендапу.
Детальніше в статті
Підписатись на RSS
📢
Канал в Telegram @stendap_sogodni
🦣
@stendap_sogodni@shevtsov.me в Федиверсі
18.10.2022
Чому Dark Souls - моя улюблена гра
🎮🤺👹 Сьогодні цікаво розмовляли з колегою про те, що то є Dark Souls та чому це моя улюблена гра (тобто жанр.) Якщо підсумувати, то:
-
Головний герой будь-якої доброї Soulslike - це ти — гравець. В прямому сенсі. Арка героя складається з набуття тобою навичок та опанування механізмів гри. Розвиток персонажу не має такого значення — тому гравці світового рівня здатні грати без розвитку, без обладнання, уникаючи уражень і таке інше. Звісно, багато ігор потребують навчання, але у Soulslike це вдосконалено. Найважливіше те, що всі випробування важкі, але чесні, і вимагають від нас навчання та росту. Відчуття росту — це особливе задоволення, яке нечасто отримуєш від ігор.
-
Мені дуже подобається збирати предмети, але в більшості сучасних ігор це абсолютно безглуздо, тому що по їх світу розкидана безліч нічого не значущих купок одних і тих самих припасів чи іншого. Натомість в Dark Souls кожен розташований у грі предмет має значення, тому обходити всі куточки мапи і шукати секрети це завжди корисно. І ще важливо — це скінченна праця. Навіть в Elden Ring з її відкритим світом.
-
Надзвичайна система спілкування з іншими гравцями. Це і легендарні написи для інших гравців, що потрібно складати з шаблонів та словникових слів, тому вони виходять і кумедні, і загадкові, і корисні, і підступні. І можливість допомогти чи позвати на допомогу — кооператив всього не декілька хвилин, без зайвих зобовʼязань. І випадкові вторгнення і дуелі, які спочатку наводять жах, а після набуття досвіду розбавляють гру інтригою та азартом.
Для мене першою грою з серії стала Dark Souls (коли вийшла на ПК). З першої спроби здалося, що то повна дурня — нічого не зрозуміло, всі мене вбивають, і таке інше. Але потім (після того, як подивився let’s play Bloodborne від Game Grumps) вирішив спробувати ще, але зробити зусилля. Було так само важко, та я читав вікі, думав, і вчився. І коли, нарешті, я пройшов першого справжнього боса, та побачив перед собою нові, небачені простори, в той момент я зрозумів, що Dark Souls - це для мене.
17.10.2022
Як помітити поламку швидко? Налаштувати автоматичне спостереження
😬😱😳 Нема нічого гірше, ніж помітити, що на продакшні щось поламалось, і причому давно. А ти це міг помітити, але не помітив аж до непристойно пізнього часу.
В мене найстрашніший випадок був з блогом. Для редизайну я обрав несистемний шрифт, але забув під’єднати деякі варіанти. Та всі відвідувачі бачили весь текст на блозі жирним курсивом! Я ж цього не знав, тому що такий шрифт був встановлений в мене в системі, тому бачив текст нормальним. Так от, я це помітив майже через рік, і те, коли хтось прислав неповʼязаний з цим багом скриншот. Ото було сорому.
Але ж пропустити поламку на вісім годин це теж дуже неприємно.
У таких випадках завжди здається, що ситуацію було легко виправити — добре перевірити, бути уважним, ще щось. Я думаю, що це хибний підхід, хоч теоретично дієвий.
Натомість треба думати про автоматичне спостереження, а також системи автоматичного сповіщення, такі, як PagerDuty. Така система буде писати вам СМС, дзвонити, нагадувати всіма можливими способами, доки ви не підтвердите, що прийняли екстрену ситуацію.
Ну, й впроваджувати хелс-чек на кожне місце, де такі ситуації виникають.
16.10.2022
Завантаження текстових даних у react-native-health, та інтеграція з redux
❤️🗄️📈 Продовжую робити додаток з react-native-health.
-
Відразу виникла потреба завантажити тестові дані, бо симулятор пустий. Зробити це досить просто, бо обмежень на створення записів в HealthKit немає, тому можна хоч за цілий рік занести. Спочатку думав, що буду відразу робити імпорт з CSV, але зрозумів, що на справжньому айфоні вже є мої записи та імпорт не потрібен, а для симулятора згенерувати дані набагато простіше, ніж робити імпорт.
-
Потім виявилось, що HealthKit не дуже швидко працює, а саме, завантаження двохсот записів (за декілька місяців) на симуляторі займає декілька секунд. Тобто потрібно принаймні під час роботи додатка кешувати ці дані. Також виходить, що максималістичний підхід до читання даних не працює, а треба брати стільки, скільки потрібно.
-
Отже, знайдеться місце для Redux, що взагалі добре, бо я зрозумів, що без reselect я теж не хочу обходитися.
-
Наступний крок — побудувати гарний графік на react-native-svg.
Коли працюєш над новим проєктом, потрібно постійно собі нагадувати, що найпростіше рішення допоможе швидше побачити результат, і це більш важливо, ніж відразу робити все “як треба”.
15.10.2022
Мій розумний дом з Home Assistant
📺🔊🪄 Коротка розповідь про початок мого “розумного дому”, і навіщо це треба.
Щоб зрозуміти потребу, треба спочатку отримати задачу. В мене нею стало керування домашнім медіацентром, коли ми придбали караоке:
- є телевізор на LG WebOS;
- до нього підключений компʼютер по HDMI;
- а ще тепер система караоке, теж по HDMI;
- але — караоке подає аудіо напряму на колонки по RCA кабелю. Через HDMI ніяк неможливо, бо буде затримка — вона цього не підтримує взагалі.
- Отже, довелося замінити зручний саундбар на пару більш просунутих колонок;
- але ж телевізор теж має підключатись до колонок — по оптичному кабелю — бо зрозуміло що вбудований в ТВ звук значно гірше.
- виходить, що при перемиканні між компʼютером та караоке, окрім відеовходу, також потрібно перемикати аудіовхід колонок.
- для цього у колонок теж є пульт. Звісно, і вмикати колонки треба теж окремо від телевізора.
- робити це вручну самому вже незручно. пояснити сімʼї та гостям… знущання.
Так от, все це вдалося автоматизувати за допомогою розумного дому, а саме 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, так і людина за телефоном або месенджером. Але перше відбудеться за долі секунди, а друге — за хвилини.
У людей краще виходять задачі аналітичні, інтуїтивні, з нечітко оголошеними параметрами (або взагалі без них.)
У машини краще виходять облік, контроль, агрегація.
Щоб була синергія, треба і в маленькому, і в великому контексті шукати — де доля людини, а де доля машини.
11.10.2022
Бібліотека i18next як шар людської мови в додатку
📚🚲🌎 Для інтернаціоналізації в Javascript добре відома бібліотека i18next. Але вона буде корисна, навіть якщо ви поки не плануєте перекладати додаток.
Сьогодні піднялося питання — досить типове — як варіювати деяке повідомлення для однини та множини, тобто зробити плюралізацію.
Класичне інженерне рішення — просто змінити текст так, щоб плюралізація на нього не впливала. Наприклад, замість “5 повідомлень” - “повідомлень: 5”. Швидко, просто, зовсім не якісно.
Наступний рівень — винайти власний “ровер”, ну, наприклад, функцію, що приймає кількість та варіанти тексту. Або, для англійської, додає закінчення “s” та, якщо здогадається, обробляє винятки. Підходів багато, але спільне в них те, що якісний плюралізатор вийде доволі складним. (Тому я і раджу почати з функції, що приймає текст для однини та множини — це рішення просте та надійне, хоч і не “елегантне”.)
Так от, якісний та довершений плюралізатор вже є в i18next. Як і інші засоби роботи з текстами:
- форматування дат;
- вибір рядка зі словника (щоб зробити підпис для переліку значень, наприклад,
status;) - шаблонування або ж будування тексту зі структури.
Взагалі, я дивлюсь на i18next як на “шар людської мови” - тобто єдине місце для всіх рядків, що призначені для читання користувачами. В іншому коді мають вживатись тільки ключі до словника i18next.
Можна почати з використання i18next для плюралізації та йменування статусів, а потім, коли буде потрібен переклад, у вас вже буде готова основа.
10.10.2022
Спеціалісти схильні ускладнювати ситуації в свій бік
👨🔬👨⚕️👨🏭 Кожний спеціаліст дивиться на ситуацію з боку своєї спеціалізації, і так само ставить задачі.
Виконроб дивиться, як зробити повний ремонт. Хірург шукатиме, що прооперувати. Програміст застосує свою улюблену мову і фреймворк. Системний архітектор запланує хмарну інфраструктуру.
Добрий спеціаліст також вміє помітити, що задачі для нього тут немає.
Тому цінний той стоматолог, який скаже, що поки що ніяких пломб ставити не потрібно. А програміст — той, що не буде робити сайт-візитку на Ruby on Rails.
Щоб розвинути в собі таку якість, раджу розширювати свої навички в різні боки, пробувати щось не таке, як завжди. Тоді буде легше побачити, що твоя спеціалізація — не найкращий вибір в даній ситуації.
А також, коли приймаєш поради, мати на увазі, до чого звичний твій радник, і чи сходиться це з твоїми потребами.
09.10.2022
Бібліотека react-native-health та кодогенерація
⚛️🍎❤️ Продовжив розбиратись з react-native-health. Дуже швидко натрапив на проблему: в обгортці не вистачає функції preferredUnitsForQuantityTypes ; як, до речі, і в обгортках, що з нею конкурують. Тобто не можна отримати налаштування одиниць вимірювання, і доведеться питати користувача окремо.
Само собою що проблема це незначна, і можна було відкласти її рішення принаймні до появи у додатка другого користувача. Бо для мене одного можна просто вказати одиниці константами. Але яка в тому втіха?
Додати в обгортку для React Native один метод на Objective C справа цілком реальна і багато часу на це не пішло, хоча на Objective C я пишу “зі словником” (а насправді з гуглом, авжеж). Навіть якщо обгортку треба писати з нуля, то можна впоратись за пару годин. Objective C - одна з найменш зрозумілих для мене мов, синтаксис ні на що не схожий.
Але тут стала інша проблема. Категорії значень — вхідне значення методу — треба передати у вигляді типу HKObjectType. В JavaScript, відповідно, треба передати рядок, який потім перекласти у цей самий тип. Простого методу для цього немає, бо в Objective C так не роблять — автори бібліотеки цілком раціонально очікують, що ми будемо вживати готові константи, а не довільні рядки.
Тобто треба написати словник. Можна побудувати його вручну. Але ж є проблема — на цей час в HealthKit існує 182 різних типи значень, а в майбутньому зʼявляться ще. (Зауважу, що для розв’язання моєї задачі вистачило б одного типу. Але яка в тому втіха?)
На допомогу знову приходить кодогенерація. Я знайшов файл, де перелічені всі ці типи - HKTypeIdentifiers.h (Він вже схожий на згенерований, до речі.) Далі рядки файлу можна розібрати регулярним виразом, побудувати перелік типів, і згенерувати для них як словник для Objective C, так і декларації для JavaScript/TypeScript.
Кодогенерація це, можливо, не дуже “чистий” підхід програмування, але для деяких задач підходить ідеально.

