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

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

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

23.08.2022

Cloudflare. Порівняння MacBook Air M1 та MacBook Air M2

🛡🚤🏎 Дві цікавинки сьогодні. По-перше, Cloudflare - все ж таки дуже корисний сервіс, з безліччю функцій для захисту. Тут і точне керування протоколами шифрування. І статистика по ним. І можливість закрити весь сайт за примусовим логіном (корисно для стейджингу.) І CDN. Очі розбігаються. Радий що спробували, бо у AWS для всього цього треба робити свої рішення.

По-друге, порівняв MacBook Air M1 vs MacHook Air M2 на самому об'єктивному бенчмарку - а саме, тестах нашого проєкта. Тут і Ruby, і PostgreSQL, і інтеграційні тести фронтенду на React у браузері Chrome. Тобто те, що доводиться робити кожного дня.

Отже, результат: M2 виявився швидше за M1 на 8%. Дрібниці насправді, але приємно. (Набагато важливіше +8 GB RAM.)

Окремий результат - жоден ноут не навантажував CPU більш ніж на 25%. Це обумовлено тим, що тести працюють фактично з одним ядром CPU з восьми. Може, двома, якщо врахувати роботу браузера. Висновок перший: насправді веб-розробнику ніякий M1 Pro з 10 ядрами не потрібен. Висновок другий: при звичайній роботі розробника MacBook Air не має підстав нагріватися та гальмувати.

І нарешті, порівнював ігровий тест, а саме, вбудований тест Shadow of the Tomb Raider. Був здивований майже однаковим результатам: на найвищих налаштуваннях та 1280x800 обидва ноута показують 31 FPS, а на 1920x1200 M2 показує 17 FPS супротив 15 у M1. Остаточний висновок: брати модель з 10 GPU великого сенсу немає.


22.08.2022

Захист від DDOS засобами Cloudflare

🕸🛡☁️ Сьогодні налагоджував захист сайту через Cloudflare. Перше, що для цього потрібно зробити - це перенести DNS записи до Cloudflare. Наші DNS записи описані у Terraform. Як зазвичай, Cloudflare також підтримується терраформом, так що перенесення звелося до переписування ресурсів з aws_route53_record у cloudflare_record. Кльово, що деякі значення у Cloudflare беруться з ресурсів AWS (наприклад, записи для підтверждення сертифікатів.)

Terraform залишається улюбленим інструментом.

Ще така кумедна історія вийшла: в мене вже пару місяців докер віджирав біля 25% CPU. Я це списував на вроджені вади докера, і нічого не робив. Сьогодні прокрастинував і подивився, що ж таке жре CPU в докері. Виявилось, що це не сам докер, а контейнери з haproxy, а потів виявилось, що у haproxy 2.6.3 є баг з постійним використанням 100% одного CPU. Відкотився до 2.6.2, споживання CPU зникло.

До речі, корисна команда: docker stats


21.08.2022

Локалізація пошти для Cінтри

✉️🌍✅ Сьогодні займався локалізацією, доробляв переклади листів. Раніше шаблони листів були у Handlebars (ще раніше просто в Mailgun). Тепер ті самі шаблони обробляються бібліотекою i18next. Так простіше, тим паче нічого більш заміни змінних ми в шаблонах не використовували. Тепер можна і теми листів локалізувати, і форматування дат сховати в шаблон, і консистентність з іншим локалізованим кодом краще.

Цікаво що шаблони листів ми тримаємо в текстових файлах (а теми в типовій структурі i18next.) Стало питання, як бути впевненим, що для кожного різновиду листів визначені обидва шаблона. А до того ж, що кожний шаблон має переклад.

У таких випадках має сенс написати скрипт. Скрипт дуже простий - завантажує ресурси локалізації та перевіряє, що всі переклади задані і немає зайвих. Додав його до лінтерів і таким чином до CI. Тепер можна бути впевненим, що все перекладено вірно.

Скрипти для власного користування - часто зневажена категорія програмування. Чи робиш ти рутинні дії, які міг би за тебе робити скріпт?


20.08.2022

Macbook Air M2 - перші враження

📦💻🤩 Сьогодні розпаковував новий макбук Air M2. Про попередню модель я вже писав детально - новий відрізняється не сильно, але в декількох важливих деталях. Якщо в двух словах, то це все ще кращий ноут для веб-девелоперів, беріть - не пошкодуєте.

- "опівнічний" колір виглядає чорним з ледве помітним синім відливом. Скучив за чорним ноутом, так що дуже задоволений.
- тепер нарешті можна взяти 24 ГБ оперативки, щоб влізли всі докери, рубішні програми, редактори на електроні та інше.
- цей Air зроблений в новому дизайні Apple Silicon, тобто нарешті зовнішність співпадає наповненню
- люблю Fn-рядок з клавішами в повну висоту. ще більше люблю Escape нормального поважного розміру.
- щось дивне зробили з динаміками, тепер вони в торці та направлені в екран. ще не розібрався чи краще чи гірше.

Migration Assistant не захотів переносити по шнурку USB-C, а використав peer-to-peer Wi-Fi. До того, не переніс більшу частину папки з проєктами. Могло бути й краще.


19.08.2022

Сон, їжа, тренування - простий фудамент самопочуття

🛌🍲🏃 Сьогодні робота не дуже клеїлась. Можна шукати багато пояснень, але я в свому житті прийшов до того, що три дуже прості речі є заставою самопочуття і продуктивності.

- Сон - хоча б сім, а краще вісім годин в день. Недостача сна буквально робить нас дурніше, показують дослідження. І це, мабуть, головне, що треба виправляти більшості айтівців.
- Їжа - здорове і регулярне харчування. Якщо неясно, з чого почати, раджу почитати про середземноморсью дієту. Не забуваєм і про українські суперфуди - борщ та гречку. (Серйозно, греча вважається нарівні з модними кіноа та амарантом.)
- Моціон - байдуже що, але головне щоб регулярно. Хоча б прогулянки на свіжому повітрі. Але краще щось, що задіє все тіло. Якщо душа до спорту не лежить, є 7-хвилинні тренування.

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


18.08.2022

Дебаг, AWS Kinesis Firehose, sidekiq-unique-jobs

🐛🔍🔥 Сьогодні (та й вчора, та й позавчора) довго дебажив. Дебажив досить складний шлях перетворення даних, що проходить через декілька систем. Добре що це було на стейджингу, і що в нас є хелс-чек, який хоча б підказав, що щось поламане.

Окрім хелс-чеків, у складній системі перетворень важливо пам'ятати, де слаба ланка.

Технологія, яка не підводить: AWS Kinesis Firehose. Це такий безрозмірний приймач повідомлень, які він батчить та складає в базу. Зручно для ситуації, коли потрібне бути впевненим в масштабуванні. Колись на проєкті мільярди повідомлень в день збирали, і Firehose цілком спокійно їх обробляв. Ще Firehose добре порається з помилками на боці бази, а саме вміє спробувати завантаження декілька разів, та в разі остаточної невдачі складає помилкові записи на S3. Та й моніторінг у нього зручний і прозорий. Дуже класна технологія і недорога - близько $0.03 за ГБ даних.

Технологія, яка підвела вже не раз: гем sidekiq-unique-jobs. Він запобігає подвійному запуску завдання за допомогою запираючих записів у Redis. Але, в разі катастрофічного виходу ці записи можуть залишитись назавжди, і наступного разу завдання ніколи не запуститься. А якщо не налаштувати правильно вихід sidekiq при зупинці сервісу, то катастрофічним буде кожний вихід. Через це ми пройшли минулого разу коли це трапилось. Цього разу ще додав Time-To-Live. Раджу без Time-To-Live для лок-записів навіть не починати з цим гемом.


17.08.2022

Маленька гра на React Native

📱🎮⏱ Сьогодні несподівано для себе зробив маленьку, але справжню мобільну гру, і навіть встиг завантажити до Test Flight. Ну тобто не всю гру, а "вертикальний зріз". Але, як кажуть, лиха біда - початок.

Я давно це обіцяв синові, бо ідея його, та й оформлення буде теж його. З мене - програмування.

Почати було важко. Новий проєкт - купа питань. На чому писати. (До речі, гра має вийти в iOS/Play Store/Steam, тож щось кросплатформенне.) Як все облаштувати. І таке інше. Свято прокрастинації та гоління яків.

Але сьогодні все ж таки взяв найзнайоміший інструмент та почав. На React Native. І от, на створення проєкту та перші прототипи уйшло десь півгодини. У сучасного React Native гарний шаблон додатка, до того ж є версія на TypeScript. Ще півгодини на публікацію в TestFlight (акаунт в мене вже був.) Тепер є шанс, що гра все ж таки побачить світ.

Моралі дві:

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


16.08.2022

Що вміє ElasticSearch

🗄🗄🗄 Сьогодні продовжую розбиратися з ElasticSearch, тобто насправді з OpenSearch.

Завантажив датасет на 5 ГБ. Для цього є операція _bulk, в яку влазить невідомо скільки записів за раз. Сто тисяч точно влазить, а більше соромно було спробувати. Звісно, записи відправляються в форматі рядків JSON, тобто якщо ви відвантажили JSON з іншої бази, то його можна без перетворень залити в OpenSearch. Тільки й різниці, що перед кожним рядком треба додати рядок з командою _create. П'ять гігабайтів база забрала десь за 8 хвилин - це з негайною індексацією. Відзначу, що непогано працює система типів - mappings (а саме, значення типу "дата" або "IP адреса" проходять перевірку).

Після цього до бази можна ставити запити - або за допомогою езотеричних JSON-структур, або SQL з купою обмежень.І це, мабуть, найслабкіше місце OpenSearch. З прикладів видно, що база вміє дуже багато - наприклад, миттєво проводить пошук та агрегації. Але це якщо навчитись писати до неї запити.

Але ж так само з Redis, Mongo, CouchDB або будь-якою новітньою базою даних. У кожної є деякі переваги над SQL базами. Як правило це набагато краще продуктивність у деяких специфічних сценаріях. І кожну з них треба знати, коли і як використати. Натомість SQL бази можуть "все", але ж в продуктивності програють.


15.08.2022

Переклав українською мовою сервіс Miniflux, та як це робити

🇺🇦📲❤️ Сьогодні, на хвилі локалізації, переклав українською мовою RSS-читач miniflux.

Miniflux - це RSS-читач, написаний на Go, з самостійним розміщенням (в мене - на fly.io.) Люблю його за простоту та за надійність. З необхідних мені фіч, він вміє організувати стрічки в категорії та підтримує Google Reader API (що й досі є де-факто стандартним API для читачів RSS.)

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

- або знаходиш OSS проєкт з наявною підтримкою I18n, але відсутнєю українською мовою. Тоді все, що залишається - це перекласти словник з фразами. Ось приклад інструкції з miniflux.

- або знаходиш iOS/macOS додаток, який має підтримку декількох мов (це повідомляється на сторінці додадка у App Store), та пропонуєш творцям додати переклад. Далі, скоріш за все, перекладаєш такий самий словник.

А ще з цього вийшов би добрий хакатон.


14.08.2022

Чарівна синхронизація Firebase

🔥☁️🪄 Сьогодні ще трошки займався локалізацією, а саме перемиканням мови. Отже, хочу похвалитися чарівною синхронизацією, яку нам надає Firebase.

На скріншоті показано наш сайт та мобільний додаток. Вони ніяк між собою не пов'язані, окрім як через хмарну базу даних Firebase Firestore. І як ви бачите, при перемиканні мови на сайті, мова в додатку перемикається миттєво! Так працює не тільки локалізація, а й будь-які ваші дії. Це найкрутіший рівень синхронізації який я взагалі бачив. Особливо приємно, що Firestore так працює "сама", ми жодних зусиль до цього не прикладали. Все, що треба було зробити - це підключити клієнт та підписатись на оновлення документів. Ну та й звісно, використовувати React / Redux.

До речі, детальніше про нашу архітектуру я писав у статті.