Стендап Сьогодні
Що я зробив, що я хочу зробити, і що це все значить.
Повсякденні здобутки в форматі стендапу.
Детальніше в статті
Підписатись на RSS
📢
Канал в Telegram @stendap_sogodni
🦣
@stendap_sogodni@shevtsov.me в Федиверсі
13.11.2022
Бібліотека для форматування Markdown для публікації у Telegram
📢🤖🏆 Почав опен-сорсити свого бота для Телеграм. Першим пішов модуль для форматування записів, який буде корисним сам по собі.
Назвав його Telegold, бо в Go треба мати коротке імʼя, а якщо вже довге — то розбивати його слешами, а ніяк не рисочками.
Він стане до нагоди, якщо будете писати бота, що публікує будь-який користувацький контент у форматі Markdown. Технічно, можна вже брати (власне, мій бот так вже й робить), але тестів бракує.
12.11.2022
Мій найуспішніший Open-Source проєкт - Headless
🎃🏇🖥️ Розповім про свій найуспішніший та, можливо, найдурніший Open-Source проєкт, а саме бібліотеку для Ruby під назвою Headless. З 11 мільйонами завантажувань вона всього в 35 разів менше за популярністю від Rails.
Я створив Headless ще у той час, коли Ruby був модною технологією, тобто у 2010 році. Що він робить? А дуже просту річ — дозволяє, не виходячи з Ruby, запустити віртуальний графічний сервер Xvfb. Тоді це було потрібно, в першу чергу, щоб запускати браузери для інтеграційних тестів.
Дурний він тому, що фактично нічого сам не робить, а тільки запускає Xvfb. Це не якась там космічна технологія. Втім, це не заважало гему стати дуже популярним. Що, на мою думку, цьому сприяло, хоча я буквально ніяк розкруткою не займався:
- Ефектне та змістовне імʼя. Headless browser - це розповсюджений термін.
Headless- одне слово. Його легко знайти. Та до того ж ще й поетично натякає на “Легенду про Сонну Балку”. - Гарний синтаксис з використанням ідіом Ruby, наприклад, блокового інтерфейсу для виділення та звільнення ресурсів.
- Розв’язання актуальної проблеми, а саме — запуску браузера на CI без додаткових зусиль. Рубісти дуже люблять все робити “магічно” та без зусиль.
Але ж часи змінилися, і зараз, на мою думку, такий гем втратив сенс. Сучасні браузери чудово запускаються без графічного сервера взагалі, і це величезне досягнення, якому я особисто дуже радію, і зовсім не шкодую, що більше не потрібно ніякого Headless. Тому я все збираюсь заморозити його, але не знайду часу зробити це красиво.
11.11.2022
HealthKit та історичний графік ваги
⚖️❤️💹 Сьогодні продовжив працювати над проєктом для HealthKit. А саме, зробив базову версію історичного графіка ваги — за декілька місяців.
Оскільки на щоденному графіку кожне зваження “тягне” графік вниз чи вгору, то на щомісячному графіку я вирішив показувати, скільки всього за місяць “тягнуло” в той чи інший бік.
Таким чином, графік звертає увагу на найважливіший аспект контролю ваги — а саме, чи був місяць стабільним або бурхливим. Просто середня вага не дає такої інформації, а діапазон ваги не пояснює, в який бік вона змінювалась. Тому я вигадав цей “рибʼячий скелет”.
Також дізнався, що у Swift все ж таки є модуль для роботи з календарними датами, називається Calendar. Цікава абстракція — дати (Date) відтворюють моменти часу, але модуль Calendar дозволяє будувати та змінювати дати згідно з правилами календаря.
До речі, оскільки нещодавно ми перейшли на зимовий час, я вже встиг отримати баг через те, що додавав дні до дати як 86400 секунд, а день переводу часу був на 1 годину коротше. Тому на графіку зʼявилася некрасива нерегулярність. Використання модуля Calendar все виправило.
10.11.2022
Оголошення гему actionmailer-balancer
💌🚚🧑⚖️ Сьогодні анонс гему, який ми зробили для комфортабельної зміни провайдера електронного листування. Це actionmailer-balancer.
Якщо ви серйозно займаєтесь надсиланням електронної пошти, то репутація вашого домену — це суттєвий ресурс. Репутація — то базовий рівень довіри поштових сервісів. Чим вона краще, тим менше шансів, що ваші листи підуть у спам, або ще гірше — не будуть прийняті взагалі.
Репутація будується посиланням “хорошої” пошти, та униканням “поганої”. Погана пошта — то, очевидно, спам, але ж часто цілком нормальні листи отримують “погану” оцінку через всілякі технічні проблеми — відсутність підпису DKIM, репутацію IP адреси та інше.
Зміна поштового провайдера може фундаментально вплинути на всі ці технічні фактори. А значить, зіпсувати оцінки листів, навіть якщо їх зміст не змінився. Чим більше “поганих” листів отримують поштові сервіси, тим нижче впаде ваша репутація. Отже, переїзд - справа вкрай ризикована.
Вихід такий — переносити пошту на нового провайдера поступово, починаючи з незначної долі загального обсягу. Але як це зробити технічно? Для цього ми й зробили гем, що дозволить розділити потік пошти з додатка Ruby on Rails на два або декілька провайдерів. Завдяки гему, поступовий перехід здійснюється так же легко, як і перехід цілком.
(Ще actionmailer-balancer можна залучити для балансування декількох безплатних планів, щоб надсилати більший обсяг пошти, ніж це дозволить один з них. Але це іграшкова ситуація, як на мене.)
09.11.2022
Як поєднати Ruby on Rails та AWS Redshift
☁️🗄️☑️ Коротенький чекліст, як зробити, щоб Rails і Redshift запрацювали гармонічно:
-
Не забути про гем activerecord*-redshift-adapter (для вашої версії Rails). Без нього не вийде встановити підключення, бо Redshift не підтримує деякі системні команди.
-
Напевно, налаштувати додаток на роботу з двома базами — щоб не зберігати у Redshift транзакційні дані. Добре, що сучасна екосистема це цілком підтримує.
-
Вирішити, що робити локально. Якщо ви плануєте заміняти Redshift на Postgres, то напевно доведеться впровадити роздільні запити в деяких випадках — в першу чергу, для міграцій.
-
Вирішити, що робити з CI. Наполегливо раджу запускати тести з базою Redshift, бо інакше помилки через несумісність будуть випливати регулярно. Тож треба зробити схему, щоб запускати паралельно декілька збірок. Добре, що на одному кластері Redshift можна зробити багато баз.
-
Нарешті, навчитися використати потужні можливості Redshift з Rails - робити моделі з
VIEWтаMATERIALIZED VIEW, завантажувати дані через S3, відправляти до Redshift через Kinesis, та інше.
… Тож насправді чекліст виходить не такий і короткий.
08.11.2022
Як я почав програмувати
👶🧑🎓👨💻 Син попросив написати справжню історію, а не щось про сайти та додатки. Тож розкажу, як я почав програмувати.
Першою моєю мовою програмування був BASIC. Який саме? Та байдуже, бо програми я писав в зошиті, і компʼютера близько не було. Я читав пострадянські книжки по Бейсіку та мріяв створити собі компʼютер. Вже набагато пізніше пробував свої програми запускати, і вони потребували суттєвої доробки. Що зрозуміло, бо програми там були… від ігор до операційної системи.
Першою практичною мовою став, напевно, FoxPro - на ньому працювала моя мама, і у неї на роботі можна було навіть щось запустити. Це дуже цікава мова, бо хоч вона є фактично надбудовою над SQL, на ній можна було будувати цілі діалогові програми для MS DOS. На яких я намагався зробити гру, але не памʼятаю, щоб був якийсь результат.
Ще я в той час читав (після мами) книжку Thinking in Java. Ідеї ООП просто рвали мені мозок та Джава залишилась незбагненною. Мабуть, так і виглядає програмування зі сторони: як суцільно логічна система, але настільки віддалена від реальності, що ти не можеш приєднати до знайомих речей, а коли все ж таки намагаєшся, виходить повна нісенітниця.
Справжнє програмування почалось в девʼятому класі. Тоді я поступив в ліцей інформаційних технологій і отримав доступ до шкільних компʼютерів. Після першого уроку інформатики, де я побачив Turbo Pascal, та маючи майже нескінченний час за компʼютером (після занять - до чотирьох годин на день!), навички полетіли вгору. Я почав писати ігри, редактори до них, та всілякі дурні програми. Плюс до того ще й олімпіадна команда, де нас навчали серйозних речей. (Більш серйозних, ніж доводиться бачити на роботі й зараз.)
Після двох років, коли я вечори та вихідні проводив з Паскалем, більш нічого вже не лякало. Я був готовий розбиратися будь з чим — будь то асемблер, Delphi, С, C++, чи моя перша професійна мова - C#. Ну, може, до спроб вивчити Ruby on Rails, про який я вперше почув від моєї краш у 2006 році. Але то вже інше оповідання. :-)
07.11.2022
Автоматична перевірка формату постів за допомогою grep
😱🤖✅ Ще трохи про блог, а саме — про важливість автоматичної перевірки.
Вчора писав, що додав до постів в Стендап явно визначену дату. Та й відразу забув додати її до нового, вчорашнього поста. Пост вийшов на сайті датований першим січня першого року. 🤦
Щоб уникнути таких помилок в майбутньому, написав простеньку перевірялку, що виконується під час git commit:
if grep -Lr '^date:' content/stendap | grep -E '.md|.html'; then exit 1; fi
Як бачите, не треба шукати готову утиліту — її можна зібрати з наявних засобів, щоб вона робила саме те, що потрібно в вашій ситуації.
До речі, додав й інший схожий лінтер. Бо є така проблема: якщо в пості у форматі Markdown трапляється HTML, то Hugo його тихо підміняє на коментар raw HTML omitted. Так працює його безпечний режим. Взагалі то добре, але ж щоб не втрачати чесний контент, я також перевіряю на наявність цього коментаря в вихідному коді сайту.
06.11.2022
Оновлення блогу - категорії, пейджинація, SEO
🛠️📜🧹 Добре попрацював над блогом.
-
Розбив всі пости на категорії. Категорії це, на мою думку, найбільш зручний спосіб мандрувати по блогу. Водночас видно, про що я пишу, а про що — ні (наприклад, про Go тільки один пост, хоча здавалося що тем зустрічалось достатньо.)
-
Викинув теги. Систему тегів важко підтримувати в чистоті. Теги добрі як фолксономія — тобто як колективна категоризація — але для персонального блогу вони тільки додають шуму.
-
Додав пейджинацію — раніше було ліньки, але ж виводити сотні статей в одну сторінку це неправильно.
-
Прибрав всі сторінки-переліки з sitemap, та додав їм мітку
noindex. Мені здається, це допоможе з SEO. Ці сторінки дублюють зміст самих статей, а тому немає сенсу пропонувати їх пошукачам. -
Додав дату останньої зміни у sitemap для постів Стендапу. Розумієте, раніше я брав дату з назви файлу, наприклад
2022-11-06.md. Але Hugo про це нічого не знав, тому в сайтмепі не було дат. А без дат, як мені здається, пошукачі менш пріоритетно ставляться до цих сторінок. Тепер також вказую дату у frontmatter, тобто “нормально”.
До речі, є суттєвий прогрес по відвідуваннях з Google - а саме, з 50 відвідувань в останні місяці показник зріс до 80 відвідувань за жовтень. Це при тому, що до “SEO-покаліпсісу” було 1.5К на місяць.
05.11.2022
Оголошення статті про канал
📢🖼️📑 Сьогодні рівень “мета” досягає нової відмітки. Цей пост - про статтю про канал.
Бо я покращував інтеграцію цього каналу на сайті. Керування блогом вимагає багато різнопрофільної роботи, через що я раджу взяти готове рішення, а не робити своє. Але ж сам своїй пораді не слухаюсь і самотужки підтримую блог, спираючись тільки на можливості Hugo.
- Додав пейджинацію замість того, щоб показувати всі пости на одній сторінці.
- Додав відображення ілюстрацій до посту. Раніше вони зʼявлялись тільки в телеграмі, бо це не так просто:
- Перевірив, що ілюстрації мають зручний розмір як на великому екрані, так і на маленькому.
- Налаштував шаблон RSS-стрічки для Стендапу, щоб вона відповідала особливостям структури (наприклад, тих самих ілюстрацій).
- Потім, ще й написав статтю з оголошенням, а також більш детальним поясненням, в чому суть цього каналу.
Окрім того, все ще продовжую боротись з SEO та впроваджувати такі очевидні речі, як навігацію по категоріям.
04.11.2022
Генерація цифрового календарю відключень
🕑💡🕙 Коли життя дає тобі віялові відключення, час зробити з них цифровий календар.
Для цього достатньо згенерувати файл .ics та завантажити в програму — будь то Calendar.app, Google, або щось інше. Файли ці текстові та не дуже складні та технічно можна друкувати їх звичайним скриптом, без зайвих бібліотек.
Але в мене вже є схожий скрипт на Clojure, тож вирішив адаптувати його для цієї ситуації. Пошкодував, бо Clojure продовжує бути “академічною” мовою програмування — бібліотек мало, оновлюються нечасто, документація аматорська. Якщо в JavaScript можна обирати між декількома живими бібліотеками для операцій з часом, то у Clojure обираєш, яка не зовсім застаріла і має хоч якусь документацію. Шкода.
Код генератора графіка, більше як для ознайомлення — бо все одно у всіх свої особливості. Так, я спочатку подумав, що відключення відбуваються просто кожні 6 годин, але це виявилось не так — насправді формула складніша і простіше за все було навіть перекласти її на вибір з масиву.

