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

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

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

18.09.2022

Чому демократія в команді - це круто

🗳️👍👎 Сьогодні пару слів про демократію в нашій команді.

Інколи в роботі стають розбіжності, які колеги не можуть розвʼязати сами по собі — один тягне в один бік, другий в інший, виходу немає. Тобто питання політичні. Я бачив декілька підходів до командної політики.

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

Інший — спиратися на дані. Збираємо всі “за” і “проти”, зважуємо, підраховуємо, і маємо науковий результат. Нібито так все буде чесно. Але ж ні. Якби було очевидне обґрунтування, питання не стало б політичним в першу чергу. А так, збір аргументів перетворюється на конфлікт волі — більше збере той, хто більше прагне перемоги. І це, на мою думку, псує весь “логічно обґрунтований” підхід.

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

Чому це круто:


17.09.2022

Одночасна публікація постів в блог і в Telegram

🗞️🔄📢 Нарешті добив сьогодні одночасну публікацію в блог і в Телеграм.

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

Складнощі створило те, що у Telegram Bot API немає способу завантажити історію постів. Отакої. Є ще клієнтський API, який, напевно, зможе це зробити (бо клієнти історію показують.) Проте, щоб не звʼязуватись з ще одним API, знайшов спосіб експортувати історію вручну. Така можливість існує в так званому Telegram Desktop (не плутати з Telegram for Mac, яким я зазвичай користуюсь.) Експорт можна зробити у JSON формат (додатково прикладаються світлини та відео.) Потім цей JSON експорт перетворюю на пости для Hugo. Цікаво, що форматований текст, замість Markdown чи HTML, експортується у вигляді структури AST, з якої досить просто збудувати HTML (чому не Markdown? тому, що у HTML простіше екранувати спеціальні символи.)

Далі, коли всі пости вже готові, залишилось налаштувати шаблони на сайті — в Hugo таке називається content section.

Поки шаблони дуже прості, буду ще розвивати. Але розділ на сайті вже працює: https://leonid.shevtsov.me/stendap/.


16.09.2022

Публікування світлин до Telegram за допомогою боту

🏞️🌄🌆 Що ж, розібрався сьогодні з публікуванням світлин до Телеграму.

З боку бота все досить просто: замість sendMessage є метод sendPhoto. До нього можна навіть додати опис, в тому числі форматований. Але замість 4096 символів посту, опис може мати не більше 1024. До того ж пости зі світлинами мають вузький вигляд. Тому я вже раніше вирішив світлини відправляти окремо.

Але що з боку блогу? В блозі світлина до посту має бути разом з постом, звісно. Спочатку я розглядав ідею додавати фото розміткою в тексті поста, і витягувати при розборі. Але це складно. Тоді згадав по таку функцію Hugo, як ресурси сторінки: це відносно новий спосіб єднати пости та їхні ілюстрації в одній директорії. Після цього можна у метаданих (frontmatter) до посту доповнити ілюстрацію описом.

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

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


15.09.2022

Форматування текста для публікації в Telegram через бота

🚧🤖📢 Просуваюсь потрохи з телеграм-ботом. Переробив відправлення в формат HTML, тому що Markdown все ж таки вельми плющений. Щоб публікувати нормальний Markdown в Telegram, треба спочатку розібрати та зібрати наново з екрануванням всіх спеціальних символів.

З HTML набагато простіше — екранування потрібне тільки таке як завжди. Тут нюанс інший — в тексті мають бути тільки теги, що Telegram підтримує — це ті, що уможливлюють засоби форматування. Навіть тег <p> ставити не можна.

Я міг би писати пости прямо в HTML, але, по-перше, яка в тому радість, а по-друге, не вийде той самий пост покласти в блог — хоча б через відсутність параграфів. Тому знайшов спосіб зі звичайного Markdown робити такий HTML, щоб Телеграму подобалось.

Для цього узяв Markdown-парсер Goldmark, який використовується в Hugo. Та написав для нього особливий рендерер. Він не тільки параграфів не робить, а й конвертує списки назад у дефіси, і зберігає вірні перенесення строк.

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


14.09.2022

Мій досвід з Clojure

🧙☕🏕️ Сьогодні якось згадалась між словом мова Clojure, яку я обожнюю, хоч не використовую.

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

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

Якщо хочеться глянути на 50 рядків красивого коду на Clojure, пропоную мою імплементацію OAuth.


13.09.2022

Чому мені не подобається модель REST

🎂👮🍱 Сьогодні день програміста. Вітаю з 0х100!

Поскаржуся трохи на REST, як систему організації HTTP API.

Спочатку про хороше: більшість того, що ми робимо через API - це саме створення, перегляд, редагування та видалення ресурсів. Ці дії чудово вписуються в ментальну модель REST, і дуже добре, що є конвенція, яку всі знають і не треба кожного разу щось складати своє.

Тепер про погане: як і будь-яка система, модель REST не описує всі операції. Наприклад:

Оскільки у Ruby on Rails дуже зручно створювати API для ресурсів, то є тенденція натягувати на REST абсолютно все, до фанатизму. Так виходять ресурси на кшталт bulk_imports або, ще гірше, publishs - тобто з дієслова штучно робиться іменник. А ще HTTP-методи окрім GET та POST не повністю підтримуються браузерами — спробуйте зробити DELETE через форму.

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

REST - для явних ресурсів. Для всього іншого - POST по шляху з назвою дії.


12.09.2022

AppleScript для зберігання вкладок у Reeder

🤖✨🔖 Позавчора я розповідав, який зручний список читання у Reeder. А вчора навідкривав десь 40 вкладок (передивлявся архів Hacker News), після чого зрозумів — чого Reeder не вміє, це додати у список відразу всі вкладки. Що ж робити?

Сьогодні скористався вбудованими засобами автоматизації, щоб це виправити. Спочатку хотів написати AppleScript. Це давня та езотерична мова, яка надає доступ до даних запущених застосунків. З допомогою AppleScript можна отримати перелік всіх вкладок з Safari - після того, як трохи пограєшся з “наближеним до людської мови” синтаксисом.

Але є проблема. AppleScript працює тільки з тими застосунками, що його підтримують — оголошують власний API. На жаль, Reeder так не робить. Проте виявилось, що він підтримує Shortcuts - більш сучасну систему автоматизації. Shortcuts прийшов з iOS і дозволяє збирати скрипти з графічних блоків.

Shortcuts не працює з вкладками Safari. Зате, в шорткат можна вбудувати шматочок AppleScript (або JavaScript, або шелл-скрипта.) Оскільки скрипт я вже написав, залишилось додати до його результатів цикл та операцію додавання до Reeder. Тут теж не без хитрощів — треба, щоб між кроками збігались типи даних — але в цілому Shortcuts простіше у використанні, ніж AppleScript.

Готовий шорткат можна зашарити, а ви можете подивитись за посиланням. Дивна система поширення шорткатів — каталогу немає, просто ти отримуєш посилання і все.


11.09.2022

Бот для відправлення постів у Telegram

🤖🤝😁 Сьогодні метапост: я запостив цей пост за допомогою бота, який теж написав сьогодні. До цього пости публікував вручну через додаток Telegram.

Навіщо це потрібно? Є декілька важливих переваг:

Телеграм-бота створити досить нескладно — для Go є бібліотека, а реєстрація проходить через телеграм-бот @BotFather та займає хвилину.

До того ж для публікації постів потрібен не бот, а просто скрипт. Ідея скрипту проста: для телеграм-каналу створив окремий тип постів (а блог в мене на Hugo); також тримаю файл з відповідністю постів до ідентифікаторів у Telegram. Перед публікацією в Hugo запускаю скрипт, який запостить або оновить пост в Телеграмі, дивлячись на файл відповідностей.

Все б було ідеально, якби Телеграм не вимагав суворого екранування символів для Markdown (наприклад, треба екранувати дефіси та крапки.) Спробую для наступного поста HTML.


10.09.2022

Як я зберігаю список статей на майбутнє за допомогою Reeder

👓☕📰 Окрім RSS-читача та RSS-генератора, незамінною частиною мого читального арсеналу є сервіс "список для читання".

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

Найбільш відомий список для читання — на мою думку, Pocket, тож пропоную роздивитись його. Що не рекомендую, це вбудований список для читання з Safari. А я натомість користуюсь списком, вбудованим в обраний мною RSS-читач Reeder. Що я в ньому полюбляю:

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

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

Отже, десь так я і споживаю новини:

- підписуюсь на джерела — або безпосередньо, або за допомогою генератора
- продивляюсь повністю всі стрічки за розкладом (щотижня)
- додаю все цікаве в список читання
- нарешті, куштую статті зі списку на дозвіллі ☕


09.09.2022

Загрози простою AWS SSM Parameter Store та як їх уникнути

🔥🧑‍🚒🔥 Сьогодні простій того самого сервісу AWS SSM Parameter Store, який я так хвалив нещодавно, спричинив 3 години простою нашого. Як так сталось?

Зазвичай SSM досить безпечний сервіс. Параметри завантажуються при старті додатка, і якщо він вже запустився, то проблеми з SSM не страшні. Але тут є і зворотна сторона — якщо SSM відключений, то, напевно, стартувати не вийде. Але оскільки подібні відключення вкрай рідкісні, то я не бачив в цьому ризику. Стартувати додатки теж не так часто доводиться.

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

Стислі висновки:

- Хелс-чек краще робити найпростішим та з мінімальними залежностями. (Але так виходить не завжди.)
- Хелс-чек має видавати позитивний результат, якщо є побічна проблема з його виконанням — наприклад, з залежностями. Негативний результат видавати, тільки якщо сам хелс-чек працює добре, а додаток — ні.
- Конкретно по SSM: будемо зберігати останню успішну конфігурацію в локальне сховище, і використати в разі наступного відключення. Не думаю, що це дуже потрібно — головне виправити хелс-чек — але й зробити досить просто.