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

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

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

10.11.2022

Оголошення гему actionmailer-balancer

💌🚚🧑‍⚖️ Сьогодні анонс гему, який ми зробили для комфортабельної зміни провайдера електронного листування. Це actionmailer-balancer.

Якщо ви серйозно займаєтесь надсиланням електронної пошти, то репутація вашого домену — це суттєвий ресурс. Репутація — то базовий рівень довіри поштових сервісів. Чим вона краще, тим менше шансів, що ваші листи підуть у спам, або ще гірше — не будуть прийняті взагалі.

Репутація будується посиланням “хорошої” пошти, та униканням “поганої”. Погана пошта — то, очевидно, спам, але ж часто цілком нормальні листи отримують “погану” оцінку через всілякі технічні проблеми — відсутність підпису DKIM, репутацію IP адреси та інше.

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

Вихід такий — переносити пошту на нового провайдера поступово, починаючи з незначної долі загального обсягу. Але як це зробити технічно? Для цього ми й зробили гем, що дозволить розділити потік пошти з додатка Ruby on Rails на два або декілька провайдерів. Завдяки гему, поступовий перехід здійснюється так же легко, як і перехід цілком.

(Ще actionmailer-balancer можна залучити для балансування декількох безплатних планів, щоб надсилати більший обсяг пошти, ніж це дозволить один з них. Але це іграшкова ситуація, як на мене.)


09.11.2022

Як поєднати Ruby on Rails та AWS Redshift

☁️🗄️☑️ Коротенький чекліст, як зробити, щоб Rails і Redshift запрацювали гармонічно:

… Тож насправді чекліст виходить не такий і короткий.


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

🛠️📜🧹 Добре попрацював над блогом.

До речі, є суттєвий прогрес по відвідуваннях з Google - а саме, з 50 відвідувань в останні місяці показник зріс до 80 відвідувань за жовтень. Це при тому, що до “SEO-покаліпсісу” було 1.5К на місяць.


05.11.2022

Оголошення статті про канал

📢🖼️📑 Сьогодні рівень “мета” досягає нової відмітки. Цей пост - про статтю про канал.

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

Окрім того, все ще продовжую боротись з SEO та впроваджувати такі очевидні речі, як навігацію по категоріям.


04.11.2022

Генерація цифрового календарю відключень

🕑💡🕙 Коли життя дає тобі віялові відключення, час зробити з них цифровий календар.

Для цього достатньо згенерувати файл .ics та завантажити в програму — будь то Calendar.app, Google, або щось інше. Файли ці текстові та не дуже складні та технічно можна друкувати їх звичайним скриптом, без зайвих бібліотек.

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

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


03.11.2022

Огляд додатків карт, якими я користуюсь

🗺️📍🧭 Сьогодні весь день за кермом, тож замість коду розповім про карти. Картографія — моє маленьке хобі. Зроблю короткий огляд додатків, якими постійно користуюсь.

Apple Maps - карти за замовчуванням. В Україні не те щоб в них погана карта (бо вона від TomTom, це одна з найкращих карт), але їм просто не вистачає полірування. Добре, що вони є, але я майже ніколи їх не відкриваю.

Google Maps - справжні карти за замовчуванням (навіть в DuckDuckGo за ключем !map). Добрі й для навігації, і для пошуку обʼєктів (особливо корисним є те, що вони підсвічують цікаві райони жовтим). Що тут казати, немає нічого кращого. В загальному плані.

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

Organic Maps - найкращий клієнт OpenStreetMap. Це гілка додатка Maps.me, яка має відкритий код, та не має трекерів. Бо Maps.me колись купив мейлру, і після цього я був вимушений припинити їм користуватись, хоча програма дуже зручна, особливо в подорожах, бо зберігає повний функціонал без інтернету. Їй навіть можна користуватись для автонавігації та навіть через CarPlay.

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


02.11.2022

Тип "дата" та його відсутність у різних мовах програмування

📆⏱️🙅‍♂️ Просуваюсь з HealthKit проєктом. Черговий раз стикаюсь з відсутністю типу даних для календарного дня, на цей раз у Swift. Поки терплю.

В чому моя проблема? Найбільш звичайний часовий тип в мовах програмування відповідає моменту часу. Навіть якщо при цьому називається Date. Так само в JavaScript та в Golang. Це добре, якщо ваша логіка працює з моментами, або довільними проміжками часу.

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

Наприклад: будь-які підписки робляться в днях, а ніяк не в секундах чи іншому. Звісно, можна перекласти це на проміжки часу (та й всі так роблять), але потрібно завжди памʼятати, які операції безпечні, а де треба проконтролювати; можливо, пильнувати за тим, щоб кожне значення було початком дня — але це теж не панацея.

Ось в Ruby є окремий тип Date і це чудово. Для JavaScript я зробив бібліотеку dayjs-date. А у Swift поки нічого не знаю, роблю як є.

А ще — чи знаєте ви, що можна в ActiveRecord створити модель, що буде працювати не з таблицею, а з вьюхою (view)? Працюватиме так само — з усіма вигодами Arel, асоціаціями та таке інше. Тільки, зрозуміло, без можливості збереження змін. Це може статися до нагоди, якщо будуватиме складні запити, або щоб показати їх в ActiveAdmin тощо.


01.11.2022

Организація нотатків у Obsidian

🪨📂🧊 Продовжуючи тему з Obsidian: для системи, що працює з простими файлами, можливостей організації тут багато.

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

Крім того, я створив теки для: проєктів; робочих нотаток; довідкових матеріалів; чернеток. Все це вже було в моїй базі нотаток, але без доброї організації. Раніше я спирався на теги, які в Obsidian, звісно, також є.

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

Про структуру: подивився, що таке канбан по-обсідіанівські. Дані для канбану зберігаються в одному файлі. Тобто технічно це особливий вигляд звичайного списку задач. Заголовки створюють стовпчики канбану, а власне задачі перетворюються на картки. Це значить, що можна відкрити весь канбан у Markdown, відредагувати, та повернутись назад — дуже зручно. Крім того, кожна картка канбану може посилатись на окрему нотатку з деталями та метаданими.

Відкриття дня — гра Frostpunk. Атмосферна стратегія про виживання міста у льодяній пустелі. Йде і на macOS, а ще зараз зі знижкою.