Каждый сентябрь обещаю себе «в этот раз не свалюсь», но организм считает иначе. Пока тело борется с вирусом, мозг решает задачи посложнее: телефония, чат-боты, архитектуры, фреймворки. Всё как всегда — немного температуры, немного кода и полная лирика между строк.
Заболел в очередной раз ОРВИ, с сентября всё болею, уже достало. Прошлый пост пропустил, так как все выходные «изображал тюленя» на диване. Хочется крикнуть: «Лунная призма дай мне силы», но не поможет.
Попробую выступить в жанре «коротко о длинном». В моей компании на главной странице сайта написаны номера телефонов. И начальник сообщил, чтобы я нарисовал маршрутизацию звонков. Оказалось, на 3 номера телефона приходится 4 оператора связи. Один номер на 8-800 тупо, безусловно переадресуется на тюменский номер. 2 номера приходят на старую версию голосового меню. А внутренняя адресация звонка ну до того дивная, что напоминает скорее горный серпантин, чем прямую дорогу. Убил день, чтобы 3 номера на официальном сайте звонили напрямую на новое голосовое меню. Миром правит не тайная ложа, а явная лажа.
На работе мне поручили написать очередного чат-бота. Он должен читать письма из почтового ящика и пересылать их в «Телеграмм». В письмах необходимо вырезать персональные данные, показывать только сокращённую версию и т. д. Я уже становлюсь экспертом по чат-ботам. Зная, что аппетит начальства приходит во время еды. Чувствую, что мой чат-бот будет ждать уйму доработок. Я решил не изобретать велосипед и использовать фреймворк NestJS https://nestjs.com/. На него есть уйма критики, но он мне как-то понравился. Любая моя проблема гуглится на раз-два. Код получается хоть многословным, но логичным. Есть другой безумно популярный фреймворк на NodeJS — NextJS https://nextjs.org/, но он про другое, он про генерацию страниц на стороне сервера, концепцию Backend for frontend (BFF) и т. п. А NestJS — чисто бэкенд, про вызов функций через API и Cron. Пока мой выбор — NestJS.
Я уже наученный горьким опытом, прежде чем что-то судорожно программировать начал, сначала реализовал архитектуру приложения. Нарисовал и довольный эти кубики и стрелочки начальнику отдела программистов. Он добро посмеялся и указал места, где много оверинжениринга. В результате архитектура получилась простая как табуретка. Сначала чат-бот получает почтовые сообщения. MessageID сохраняет в Redis, чтобы избежать дедупликации. Затем полученные письма отправляет в RabbitMQ, а другой модуль приложения из «кролика» считывает и отправляет 3 раза в Telegram. По результатам этой операции сообщение перемещается в папку Processed или Failed.
А можно обойтись без RabbitMQ? А нельзя, операции получения и отправки должны быть разделены. Telegram может быть недоступен, писем придёт много и т. д. В результате один созвон с начальником сэкономил уйму времени на ненужное программирование.
Haskell меня не отпускает, решил разобраться в нём до конца. На Windows Haskell полный фуфель, программирование в нём напоминает кодинг в блокноте. Что-то написал, а результаты увидишь только после компиляции. А вот бы сделать так, чтобы глупые ошибки видеть ещё до компиляции? Я решил поставить Haskell на MacOS. Больше всего меня добило, что все инструменты Haskell собирают из исходных кодов. Набрал команду и ждёшь 20-30 минут, это линтер собирается. Но я всё-таки установил и сам язык программирования, и линтер, и форматер. Эх, ещё бы IDE для Haskell, но это мечты.
Haskell решил изучать по книге Курта Уилла «Программируй на Haskell», прочитал первую главу, пока понравилась. Почему я решил изучить Haskell? Просто этот язык программирования заложен в основу многих других популярных языков. И когда команда разработки с гордостью заявляет о реализованном новом функционале, на проверку оказывается, это уже до них придумали лет 40-50 назад.
Каждый мой осенний вирус — повод перезапустить не только тело, но и мозг. Очередной бот почти готов, архитектура вычищена, Haskell побеждён наполовину. Возможно, именно так и выглядит взросление программиста — когда вместо таблеток ищешь новые фреймворки и способы думать.
Заболел в очередной раз ОРВИ, с сентября всё болею, уже достало. Прошлый пост пропустил, так как все выходные «изображал тюленя» на диване. Хочется крикнуть: «Лунная призма дай мне силы», но не поможет.
Попробую выступить в жанре «коротко о длинном». В моей компании на главной странице сайта написаны номера телефонов. И начальник сообщил, чтобы я нарисовал маршрутизацию звонков. Оказалось, на 3 номера телефона приходится 4 оператора связи. Один номер на 8-800 тупо, безусловно переадресуется на тюменский номер. 2 номера приходят на старую версию голосового меню. А внутренняя адресация звонка ну до того дивная, что напоминает скорее горный серпантин, чем прямую дорогу. Убил день, чтобы 3 номера на официальном сайте звонили напрямую на новое голосовое меню. Миром правит не тайная ложа, а явная лажа.
На работе мне поручили написать очередного чат-бота. Он должен читать письма из почтового ящика и пересылать их в «Телеграмм». В письмах необходимо вырезать персональные данные, показывать только сокращённую версию и т. д. Я уже становлюсь экспертом по чат-ботам. Зная, что аппетит начальства приходит во время еды. Чувствую, что мой чат-бот будет ждать уйму доработок. Я решил не изобретать велосипед и использовать фреймворк NestJS https://nestjs.com/. На него есть уйма критики, но он мне как-то понравился. Любая моя проблема гуглится на раз-два. Код получается хоть многословным, но логичным. Есть другой безумно популярный фреймворк на NodeJS — NextJS https://nextjs.org/, но он про другое, он про генерацию страниц на стороне сервера, концепцию Backend for frontend (BFF) и т. п. А NestJS — чисто бэкенд, про вызов функций через API и Cron. Пока мой выбор — NestJS.
Я уже наученный горьким опытом, прежде чем что-то судорожно программировать начал, сначала реализовал архитектуру приложения. Нарисовал и довольный эти кубики и стрелочки начальнику отдела программистов. Он добро посмеялся и указал места, где много оверинжениринга. В результате архитектура получилась простая как табуретка. Сначала чат-бот получает почтовые сообщения. MessageID сохраняет в Redis, чтобы избежать дедупликации. Затем полученные письма отправляет в RabbitMQ, а другой модуль приложения из «кролика» считывает и отправляет 3 раза в Telegram. По результатам этой операции сообщение перемещается в папку Processed или Failed.
А можно обойтись без RabbitMQ? А нельзя, операции получения и отправки должны быть разделены. Telegram может быть недоступен, писем придёт много и т. д. В результате один созвон с начальником сэкономил уйму времени на ненужное программирование.
Haskell меня не отпускает, решил разобраться в нём до конца. На Windows Haskell полный фуфель, программирование в нём напоминает кодинг в блокноте. Что-то написал, а результаты увидишь только после компиляции. А вот бы сделать так, чтобы глупые ошибки видеть ещё до компиляции? Я решил поставить Haskell на MacOS. Больше всего меня добило, что все инструменты Haskell собирают из исходных кодов. Набрал команду и ждёшь 20-30 минут, это линтер собирается. Но я всё-таки установил и сам язык программирования, и линтер, и форматер. Эх, ещё бы IDE для Haskell, но это мечты.
Haskell решил изучать по книге Курта Уилла «Программируй на Haskell», прочитал первую главу, пока понравилась. Почему я решил изучить Haskell? Просто этот язык программирования заложен в основу многих других популярных языков. И когда команда разработки с гордостью заявляет о реализованном новом функционале, на проверку оказывается, это уже до них придумали лет 40-50 назад.
Каждый мой осенний вирус — повод перезапустить не только тело, но и мозг. Очередной бот почти готов, архитектура вычищена, Haskell побеждён наполовину. Возможно, именно так и выглядит взросление программиста — когда вместо таблеток ищешь новые фреймворки и способы думать.
NestJS - A progressive Node.js framework
NestJS is a framework for building efficient, scalable Node.js web applications. It uses modern JavaScript, is built with TypeScript and combines elements of OOP (Object Oriented Programming), FP (Functional Programming), and FRP (Functional Reactive Programming).
👍5
Неделя выдалась насыщенной: боты, почта, Docker и вечные «давайте уточним». Хотел просто закрыть задачи и выдохнуть, но вместо этого получил классический набор приключений — от зависшего начальства до капризной Prisma. Делюсь, как всё это прошло и чем закончилось.
Написал телеграмм-бота для отправки почтовых сообщений в телеграмм. Задача важная и срочная. Меня постоянно контролировали и уточняли информацию. А вот как дошло до сдачи, критичную информацию, из каких почтовых ящиков забирать сообщения, не дают, начальство думает и думает... А я жду и жду... Печально.
Но я узнал у коллеги-админа, а какие, собственно, ящики начальство может предложить. Он дал пару почтовиков, и мне поплохело, там около 10 тыс. сообщений в каждом. За день сотня сообщений стабильно приходит. Сидел переписывал под эти объёмы. Даже завёл базу данных PostgreSQL, чтобы хранить неотправленные сообщения. В моих мечтах и фантазиях почты должно было приходить в разы меньше. Эх...
Но ещё правил ошибки в моём первом боте для Bitrix24. Создал багфикс, дай, думаю, задеплою на production. Залил исходники на удалённый сервер, а Docker-образ не собирается, оказывается, библиотека Prisma ORM русских не любит. Поднимать VPN на внутреннем сервере — результат так себе. Я прекрасно знаю про container registry, и он у нас даже поднят, но залогиниться я туда не могу, сколько я ни бился. Пообщался с коллегой, он подсказал простую идею: Docker-контейнеры — это просто файл, в котором каждая команда создаёт слой. Этот файл можно сохранить у себя и восстановить на production. Сказано — сделано.
Сам создал себе проблему, сам решил. А container registry я внедрю.
Посмотрел 2 хороших видео блогера Soer по функциональному программированию.
«Три реализации задачи в функциональном стиле» https://www.youtube.com/watch?v=aoFZG6l8iiU и «FizzBuzz: четыре варианта решения на JS» https://www.youtube.com/watch?v=TWmmfDvcYO0. Оба видео очень хорошо показывают причудливую логику функционального программирования.
В общем, как обычно: хотел просто написать бота, а в итоге прокачал терпение, DevOps-скиллы и немного философию. Главное — не забывать сохранять образы, не только Docker, но и собственные.
Написал телеграмм-бота для отправки почтовых сообщений в телеграмм. Задача важная и срочная. Меня постоянно контролировали и уточняли информацию. А вот как дошло до сдачи, критичную информацию, из каких почтовых ящиков забирать сообщения, не дают, начальство думает и думает... А я жду и жду... Печально.
Но я узнал у коллеги-админа, а какие, собственно, ящики начальство может предложить. Он дал пару почтовиков, и мне поплохело, там около 10 тыс. сообщений в каждом. За день сотня сообщений стабильно приходит. Сидел переписывал под эти объёмы. Даже завёл базу данных PostgreSQL, чтобы хранить неотправленные сообщения. В моих мечтах и фантазиях почты должно было приходить в разы меньше. Эх...
Но ещё правил ошибки в моём первом боте для Bitrix24. Создал багфикс, дай, думаю, задеплою на production. Залил исходники на удалённый сервер, а Docker-образ не собирается, оказывается, библиотека Prisma ORM русских не любит. Поднимать VPN на внутреннем сервере — результат так себе. Я прекрасно знаю про container registry, и он у нас даже поднят, но залогиниться я туда не могу, сколько я ни бился. Пообщался с коллегой, он подсказал простую идею: Docker-контейнеры — это просто файл, в котором каждая команда создаёт слой. Этот файл можно сохранить у себя и восстановить на production. Сказано — сделано.
; Сохраняем образ на своём компьютере
docker save -o chat-bot.tar chat-bot:latest
; Восстанавливаем образ на production
docker load -i chat-bot.tar
Сам создал себе проблему, сам решил. А container registry я внедрю.
Посмотрел 2 хороших видео блогера Soer по функциональному программированию.
«Три реализации задачи в функциональном стиле» https://www.youtube.com/watch?v=aoFZG6l8iiU и «FizzBuzz: четыре варианта решения на JS» https://www.youtube.com/watch?v=TWmmfDvcYO0. Оба видео очень хорошо показывают причудливую логику функционального программирования.
В общем, как обычно: хотел просто написать бота, а в итоге прокачал терпение, DevOps-скиллы и немного философию. Главное — не забывать сохранять образы, не только Docker, но и собственные.
YouTube
Три реализации задачи в функциональном стиле
#soer #itubeteam
Основной канал для общения и публикации новых видео - Телегарм - https://t.me/softwareengineervlog
Спонсорство - https://donate.s0er.ru
Сайт платным контентом - https://soer.pro
Зеркало для видео Дзен Видео - https://zen.yandex.ru/i…
Основной канал для общения и публикации новых видео - Телегарм - https://t.me/softwareengineervlog
Спонсорство - https://donate.s0er.ru
Сайт платным контентом - https://soer.pro
Зеркало для видео Дзен Видео - https://zen.yandex.ru/i…
Продолжаю путь в мир автоматизации, инфраструктуры и телефонии. Иногда попадаются неожиданные преграды, но тем интереснее искать обходные манёвры и проверять гипотезы. Собрал заметки о свежем опыте, чтобы не потерялось и вдруг кому-то оказалось полезным.
Завершил разработку бота, который пересылает сообщения из почты в Telegram. Проблему с библиотекой Prisma удалось обойти: отправил маршрут на роутере на адрес https://binaries.prisma.sh через сервис из трёх букв, который нельзя называть. Может кому пригодиться. Блокировку осуществляет не сама Prisma, а сервис Cloudflare, где она расположена.
Мечту о написании CI/CD для моего бота я не оставляю. У нас в качестве Container Registry используется система Harbor https://goharbor.io/. Поговорил с инженером, который поднял эту систему. Основной критерий выбора этой системы был, что у неё хорошая админка, и всё. Оказалось, что контейнер из-под Windows на неё не залить, чтобы я не делал. А вот под Linux всё идёт с полпинка. Буду «мучить» Linux.
Ещё есть мечта ошибки ошибки бота отправить на Sentry, но времени не хватает.
Почти всю неделю занимался телефонией. Делал прозвонку по номерам компании. Часть номеров должна быть отключена прошлым связистом, но по факту не отключена. А компания за них платит деньги...
Анализировал статистику, кто и по каким транкам и номера внутри транка звонят. Транков уйма, номеров ещё больше, а звонят максимум на десяток. Отключил ненужное. Но пока отключение хитрое, это не написание официальных писем, а просто установка заглушки, что «Линия не обслуживается». Но на этой заглушке я установил логирование. Через пару дней выяснил, что один номер отключил зря. Включил обратно. До нового года хотим отключить всё ненужное и оставить пару операторов связи и телефоны, которые используются. Пока полный зоопарк.
Неделя как сборка конструктора: что-то починил, что-то выкинул, что-то временно прилепил скотчем. Главное, что система становится чище и предсказуемее. Работа идёт — боты шевелятся, телефония перестаёт быть зоопарком. Продолжаю шаг за шагом приводить хаос в порядок и двигать автоматизацию вперёд.
Завершил разработку бота, который пересылает сообщения из почты в Telegram. Проблему с библиотекой Prisma удалось обойти: отправил маршрут на роутере на адрес https://binaries.prisma.sh через сервис из трёх букв, который нельзя называть. Может кому пригодиться. Блокировку осуществляет не сама Prisma, а сервис Cloudflare, где она расположена.
Мечту о написании CI/CD для моего бота я не оставляю. У нас в качестве Container Registry используется система Harbor https://goharbor.io/. Поговорил с инженером, который поднял эту систему. Основной критерий выбора этой системы был, что у неё хорошая админка, и всё. Оказалось, что контейнер из-под Windows на неё не залить, чтобы я не делал. А вот под Linux всё идёт с полпинка. Буду «мучить» Linux.
Ещё есть мечта ошибки ошибки бота отправить на Sentry, но времени не хватает.
Почти всю неделю занимался телефонией. Делал прозвонку по номерам компании. Часть номеров должна быть отключена прошлым связистом, но по факту не отключена. А компания за них платит деньги...
Анализировал статистику, кто и по каким транкам и номера внутри транка звонят. Транков уйма, номеров ещё больше, а звонят максимум на десяток. Отключил ненужное. Но пока отключение хитрое, это не написание официальных писем, а просто установка заглушки, что «Линия не обслуживается». Но на этой заглушке я установил логирование. Через пару дней выяснил, что один номер отключил зря. Включил обратно. До нового года хотим отключить всё ненужное и оставить пару операторов связи и телефоны, которые используются. Пока полный зоопарк.
Неделя как сборка конструктора: что-то починил, что-то выкинул, что-то временно прилепил скотчем. Главное, что система становится чище и предсказуемее. Работа идёт — боты шевелятся, телефония перестаёт быть зоопарком. Продолжаю шаг за шагом приводить хаос в порядок и двигать автоматизацию вперёд.
goharbor.io
Our mission is to be the trusted cloud native repository for Kubernetes
👍3
Был на митапе тюменских программистов «ИИ в разработке» https://vkvideo.ru/video-64545043_456239475, узнал уйму нового, буду внедрять. Но фото получилось какое-то замученное.
👍4
Неделя пролетела как одно мгновение — вроде только началась, а уже пятница. Планы, как обычно, были грандиозные, а реальность внесла свои правки. В итоге получилось много мелких побед, немного философии и целая россыпь новых идей — от телефонии до Prometheus и ИИ.
Возился с телефонией. Общался с менеджерами «Билайна» по поводу фантазий и иллюзий о будущем нашей телефонии. Уйти от 50 транков, всё объединить, настроить в 2 канала: основной и резервный. Фантазии — это, конечно, хорошо, но есть территориальные коммутаторы, региональные счета, разделение на кабельную и мобильную связь и т. д. В общем, каналов будет больше, чем два, но не 50, что тоже хорошо.
Читал логи по дозвонам на заблокированные линии, которые планируем отключить. У нас какие-то странные клиенты: вечером звонят на отключенные линии, слушают отбивку и звонят ещё раз пять-семь. А вдруг робот ответит иначе?
Закончил мини-курс по Prometheus. Prometheus — это аналог Zabbix, собирает метрики, рисует графики, шлёт сообщения по триггерам, если что-то работает не так. Более свежая версия, написанная на Go.
Prometheus мне понравился больше, чем Zabbix. По факту это набор кубиков, главное их правильно вместе соединить. У Zabbix по умолчанию есть всё, 90% этого всего не используется в принципе.
По курсу осталось последнее задание: поднять в Docker блог на WordPress и его промониторить. Мониторить надо хостовую машину, Docker, базу данных, само приложение, я хочу ещё добавить сбор логов. Построить графики и настроить аллерты в Telegram.
Логика работы с Prometheus следующая. В первую очередь вы устанавливаете prometheus как центральный сервер мониторинга. После этого вы ищете у себя все операционные системы, железки, сервисы и приложения, для которых устанавливаете свои экспортеры и подключаете их к prometheus. Затем вы устанавливаете Grafana, подключаете ее к prometheus и на grafana.com ищете уже готовые стандартные dashboards для ваших экспортеров. Вуаля! У вас готовые графики по всем компонентам вашей системы! Затем настраиваете триггеры и пересылку событий триггеров в разные каналы: от почты до Telegram.
Кстати, насчёт своего блога https://infoblog72.ru/ я его решил удалить, его никто не читает. Продолжу вести блог в Telegram и VK.
Потихоньку «щупаю» ИИ. Понравилось видео по Claude «Claude code: полный гайд по разработке с ИИ-агентом» https://www.youtube.com/watch?v=PwtfglP241c. Что понравилось: ИИ-агент отдельно, IDE отдельно. Пишешь, что хочешь получить, а он правит файлы. А то все интеграции с Visual Studio Code (Cursor, WindSurf и т. д.) ну сильно мне не нравятся.
Я всё думал, что мне напоминает работа с ИИ, и понял: это декларативный язык программирования. Вроде SQL или Prolog. Надо описать, что ты хочешь получить в результате, и он это сделает. Хорошо или плохо — другой вопрос.
Продолжаю реализовывать мечту о написании CI/CD для моего бота. Хоть я и бота сдал и задачу закрыл, но хочется сделать всё грамотно. Просто у начальства аппетит приходит во время еды, и я чувствую, моего бота ждут ещё уйма изменений, но с пометками «Важно», «Срочно», «Немедленно». Будет не до CI/CD. Но я уже добился успеха, контейнер с моим ботом попал в Container Registry (Harbor). 26 попытка заливки образа была успешная.
Каждая неделя — как тестовая сборка: не без багов, зато с улучшениями. И если к концу пятницы система не падает, а наоборот работает чуть стабильнее — значит, обновление прошло успешно.
Возился с телефонией. Общался с менеджерами «Билайна» по поводу фантазий и иллюзий о будущем нашей телефонии. Уйти от 50 транков, всё объединить, настроить в 2 канала: основной и резервный. Фантазии — это, конечно, хорошо, но есть территориальные коммутаторы, региональные счета, разделение на кабельную и мобильную связь и т. д. В общем, каналов будет больше, чем два, но не 50, что тоже хорошо.
Читал логи по дозвонам на заблокированные линии, которые планируем отключить. У нас какие-то странные клиенты: вечером звонят на отключенные линии, слушают отбивку и звонят ещё раз пять-семь. А вдруг робот ответит иначе?
Закончил мини-курс по Prometheus. Prometheus — это аналог Zabbix, собирает метрики, рисует графики, шлёт сообщения по триггерам, если что-то работает не так. Более свежая версия, написанная на Go.
Prometheus мне понравился больше, чем Zabbix. По факту это набор кубиков, главное их правильно вместе соединить. У Zabbix по умолчанию есть всё, 90% этого всего не используется в принципе.
По курсу осталось последнее задание: поднять в Docker блог на WordPress и его промониторить. Мониторить надо хостовую машину, Docker, базу данных, само приложение, я хочу ещё добавить сбор логов. Построить графики и настроить аллерты в Telegram.
Логика работы с Prometheus следующая. В первую очередь вы устанавливаете prometheus как центральный сервер мониторинга. После этого вы ищете у себя все операционные системы, железки, сервисы и приложения, для которых устанавливаете свои экспортеры и подключаете их к prometheus. Затем вы устанавливаете Grafana, подключаете ее к prometheus и на grafana.com ищете уже готовые стандартные dashboards для ваших экспортеров. Вуаля! У вас готовые графики по всем компонентам вашей системы! Затем настраиваете триггеры и пересылку событий триггеров в разные каналы: от почты до Telegram.
Кстати, насчёт своего блога https://infoblog72.ru/ я его решил удалить, его никто не читает. Продолжу вести блог в Telegram и VK.
Потихоньку «щупаю» ИИ. Понравилось видео по Claude «Claude code: полный гайд по разработке с ИИ-агентом» https://www.youtube.com/watch?v=PwtfglP241c. Что понравилось: ИИ-агент отдельно, IDE отдельно. Пишешь, что хочешь получить, а он правит файлы. А то все интеграции с Visual Studio Code (Cursor, WindSurf и т. д.) ну сильно мне не нравятся.
Я всё думал, что мне напоминает работа с ИИ, и понял: это декларативный язык программирования. Вроде SQL или Prolog. Надо описать, что ты хочешь получить в результате, и он это сделает. Хорошо или плохо — другой вопрос.
Продолжаю реализовывать мечту о написании CI/CD для моего бота. Хоть я и бота сдал и задачу закрыл, но хочется сделать всё грамотно. Просто у начальства аппетит приходит во время еды, и я чувствую, моего бота ждут ещё уйма изменений, но с пометками «Важно», «Срочно», «Немедленно». Будет не до CI/CD. Но я уже добился успеха, контейнер с моим ботом попал в Container Registry (Harbor). 26 попытка заливки образа была успешная.
Каждая неделя — как тестовая сборка: не без багов, зато с улучшениями. И если к концу пятницы система не падает, а наоборот работает чуть стабильнее — значит, обновление прошло успешно.
👍3
У меня выдался насыщенный технический период: одновременно дорабатываю CI/CD, экспериментирую с Docker и Kubernetes, пишу скрипты под Zabbix, настраиваю мониторинг и разбираюсь с очередными сюрпризами от операторов связи. Разнообразие задач огромное, но именно благодаря этому появляется цельная картина и ощущение серьёзного прогресса.
Всё-таки доделал CI/CD на моём чат-боте, но в полуавтоматическом режиме.
Т. к. я работаю над этим проектом один, то я сразу коммичу в main. И не все коммиты предполагают законченный релиз, это могут просто наработки за день.
Поэтому я сделал так: pipeline на создание образов запускаю в ручном режиме. Эта задача создаёт образы и помещает их в registry harbor. А затем я на production вытягиваю образы из registry также в ручном режиме. Хотя по факту это одна команда. Меня такая автоматизация устраивает, не буду автоматизировать всё и вся.
При реализации была ещё была одна проблема. Docker Compose по умолчанию ищет
На прошлой неделе я программировал под Zabbix. Необходимо было написать JS-скрипт, чтобы оповещение о проблеме приходило в канал Bitrix24. К сожалению, Zabbix поддерживает только JS версии ES5. По факту надо было собрать данные, их обработать и создать POST-запрос в Bitrix24. С этим я справился. Вот документация https://www.zabbix.com/documentation/6.4/ru/manual/config/items/preprocessing/javascript/javascript_objects, где только JavaScript не встроена.
Смотрю курс «Вечерняя школа Слёрм по Кубернетес» https://www.youtube.com/playlist?list=PL8D2P0ruohOA4Y9LQoTttfSgsRwUGWpu6 и понял, что курс, который я смотрел первоначально, ну совсем базовый. Узнаю уйму нового. Самое интересное, они тоже изначально сообщили, что этот курс тоже базовый, есть более углублённый (и дорогой).
Посмотрел блок, связанный с кластером, там k8s поднимают в кластере 50–100 узлов, и этот кластер считается небольшим. В нашей фирме кластер будет микроскопическим.
Почитал статью «Kubernetes: шпаргалка для собеседования» https://habr.com/ru/companies/gazprombank/articles/788978/ и понял, что очень и очень многого в k8s не знаю. Но в распределённых системах просто и быстро не получится, но я обязательно разберусь.
Меня умиляют мои коллеги. Провожу оптимизацию номерной ёмкости компании. У нас более 70 номеров у 5 операторов связи. Большая часть не используется. Часть номеров запланировано на отключение. Но прежде чем номер отключить, я устанавливаю на этот номер отбивку «Обслуживание данной линии не осуществляется» и скрипт, который записывает, кто на эту линию звонит. Скрипт просто в csv-файл пишет. Проходит 2–3 недели, и коллеги начинают узнавать, а что им клиенты не могут дозвониться, так как линия не работает. По ряду номеров включил всё обратно. У коллег клиенты не могут дозвониться, и им хорошо.
Долго бился с жёлто-полосатым оператором связи, не работала исходящая связь. Перебрали уйму всякой ерунды, ничего не работает, и никто не может сказать почему. Пока связист не предложил переехать на другую железяку через создание нового канала, и как-то всё с полпинка заработало. Времени и сил убито на эту проблему немерено.
Всё-таки доделал CI/CD на моём чат-боте, но в полуавтоматическом режиме.
Т. к. я работаю над этим проектом один, то я сразу коммичу в main. И не все коммиты предполагают законченный релиз, это могут просто наработки за день.
Поэтому я сделал так: pipeline на создание образов запускаю в ручном режиме. Эта задача создаёт образы и помещает их в registry harbor. А затем я на production вытягиваю образы из registry также в ручном режиме. Хотя по факту это одна команда. Меня такая автоматизация устраивает, не буду автоматизировать всё и вся.
При реализации была ещё была одна проблема. Docker Compose по умолчанию ищет
.env в том же каталоге, где лежит docker-compose.yml. А у меня .env лежит в каталоге ./docker/. Поэтому, чтобы не плодить копии, я сделал симлинк: ln -s ./docker/.env .env. Простое, но эффективное решение.На прошлой неделе я программировал под Zabbix. Необходимо было написать JS-скрипт, чтобы оповещение о проблеме приходило в канал Bitrix24. К сожалению, Zabbix поддерживает только JS версии ES5. По факту надо было собрать данные, их обработать и создать POST-запрос в Bitrix24. С этим я справился. Вот документация https://www.zabbix.com/documentation/6.4/ru/manual/config/items/preprocessing/javascript/javascript_objects, где только JavaScript не встроена.
Смотрю курс «Вечерняя школа Слёрм по Кубернетес» https://www.youtube.com/playlist?list=PL8D2P0ruohOA4Y9LQoTttfSgsRwUGWpu6 и понял, что курс, который я смотрел первоначально, ну совсем базовый. Узнаю уйму нового. Самое интересное, они тоже изначально сообщили, что этот курс тоже базовый, есть более углублённый (и дорогой).
Посмотрел блок, связанный с кластером, там k8s поднимают в кластере 50–100 узлов, и этот кластер считается небольшим. В нашей фирме кластер будет микроскопическим.
Почитал статью «Kubernetes: шпаргалка для собеседования» https://habr.com/ru/companies/gazprombank/articles/788978/ и понял, что очень и очень многого в k8s не знаю. Но в распределённых системах просто и быстро не получится, но я обязательно разберусь.
Меня умиляют мои коллеги. Провожу оптимизацию номерной ёмкости компании. У нас более 70 номеров у 5 операторов связи. Большая часть не используется. Часть номеров запланировано на отключение. Но прежде чем номер отключить, я устанавливаю на этот номер отбивку «Обслуживание данной линии не осуществляется» и скрипт, который записывает, кто на эту линию звонит. Скрипт просто в csv-файл пишет. Проходит 2–3 недели, и коллеги начинают узнавать, а что им клиенты не могут дозвониться, так как линия не работает. По ряду номеров включил всё обратно. У коллег клиенты не могут дозвониться, и им хорошо.
Долго бился с жёлто-полосатым оператором связи, не работала исходящая связь. Перебрали уйму всякой ерунды, ничего не работает, и никто не может сказать почему. Пока связист не предложил переехать на другую железяку через создание нового канала, и как-то всё с полпинка заработало. Времени и сил убито на эту проблему немерено.
Закончил мини-курс по Prometheus. Вроде всё просто и понятно. Но начал делать финальную работу — мониторинг сервера с Wordpress, и оказалось Prometheus не такой и простой, особенно в docker. И есть несколько подходов решения одной и той же задачи. Но я справился, я с сервера с Wordpress собираю логи, метрики хоста, docker, mysql. Строю красивые графики, и при неполадках посылаются сообщения в Telegram. Вот репозиторий https://github.com/orion55/prometheus (2 сервера в одном).
Очень помогли видео «Подключаем мониторинг и логирование» https://www.youtube.com/watch?v=2tFKT4wmiZI. Из него я узнал, что существуют плагины для Docker. Например, плагин для loki
В общем, движуха продолжается: то я ковыряю CI/CD, то общаюсь с капризными операторами, то разбираю новые схемы в k8s и Prometheus. Местами непросто, местами забавно, но главное — я реально расту и расширяю кругозор. Чем больше погружаюсь, тем отчетливее понимаю, что иду в правильном направлении и набираю хороший темп.
Очень помогли видео «Подключаем мониторинг и логирование» https://www.youtube.com/watch?v=2tFKT4wmiZI. Из него я узнал, что существуют плагины для Docker. Например, плагин для loki
docker plugin install grafana/loki-docker-driver --alias loki --grant-all-permissions. Но в новой версии docker он не работает. И это тоже хорошее видео «Мониторинг и логи продакшен уровня — grafana + loki + prometheus + promtail» https://www.youtube.com/watch?v=2JIyHNskK-c. В общем, движуха продолжается: то я ковыряю CI/CD, то общаюсь с капризными операторами, то разбираю новые схемы в k8s и Prometheus. Местами непросто, местами забавно, но главное — я реально расту и расширяю кругозор. Чем больше погружаюсь, тем отчетливее понимаю, что иду в правильном направлении и набираю хороший темп.
GitHub
GitHub - orion55/prometheus
Contribute to orion55/prometheus development by creating an account on GitHub.
👍4
Эта неделя прошла под знаком постоянных доработок и новых открытий. Чат-бот, телефония, Kubernetes — всё смешалось в один рабочий поток, и я решил пройтись по каждому направлению, довести до ума, что давно откладывал, и заодно разобраться в том, что давно хотел понять.
Я дорабатывал своего чат-бота, который события о пропущенных телефонных звонках отправляет в Bitrix24. Коллега указал на одну проблему: бот «торчит» в интернет своим API, и любой желающий может отправить всякую «хрень» в чат Битрикса. Не то чтобы это просто и очевидно, но было бы желание. Поэтому я решил добавить аутентификацию между сервисами. Почитал в интернете, видов аутентификации вагон и маленькая тележка: JWT, SSO, OpenID, HMAC. Пообщался с коллегой-программистом, он сказал, не нужно усложнять, поэтому я реализовал аутентификацию по API Key.
Я командой
И к каждому POST-запросу на сервере телефонии добавил заголовок
Продолжил изучать Кубернетес по плейлисту «Вечерняя школа Слёрм по Кубернетес» https://www.youtube.com/playlist?list=PL9G8hWz_wWFPWzxp1YIweOdNW9AD1TARy. У Kubernetes (k8s) есть занимательный механизм Taints and Tolerations.
Taints помечают узлы «нежелательными» для большинства подов: к ним нельзя назначаться без специальных условий. Каждый taint имеет ключ, значение и эффект (NoSchedule, PreferNoSchedule, NoExecute).
Tolerations добавляются в под и разрешают ему игнорировать конкретные taints.
Так достигается изоляция, специализированные узлы и предсказуемое размещение.
Это хитрый фильтр, на определённые узлы можно разместить определённые поды, например Nginx или базу данных.
Механизм RBAC (Role-based access control) я так и не понял, что-то сильно перемудрили с ролями и правами.
Всё хорошо, но этот курс я смотреть больше не буду, он сильно теоретический, преподаватель что-то объясняет, что-то показывает. А вот чтобы это самому это воспроизвести, нужных файлов и инфраструктуры нет.
Решил изучить курс «Kubernetes База» тоже от Слёрм. В нём упор делается именно на многонодовую конфигурацию. Просто пока Кубернетес на одном компьютере, всё просто и понятно, но вот когда компьютеров хотя бы десяток, начинается полная дичь. Особенно если несколько то отключаются, то включаются.
Поэтому дальше сосредотачиваюсь на курсе с практикой, чтобы собрать полноценный кластер и понять, как Kubernetes ведёт себя в боевых условиях.
Эта неделя снова показала: чем глубже копаюсь в инфраструктуре, тем яснее становится общая картина. Где-то подтянул безопасность, где-то разобрался в механизмах Kubernetes, и снова появился азарт двигаться дальше. Продолжу строить свой стек, шаг за шагом превращая хаос в рабочую систему, которой можно доверять.
Я дорабатывал своего чат-бота, который события о пропущенных телефонных звонках отправляет в Bitrix24. Коллега указал на одну проблему: бот «торчит» в интернет своим API, и любой желающий может отправить всякую «хрень» в чат Битрикса. Не то чтобы это просто и очевидно, но было бы желание. Поэтому я решил добавить аутентификацию между сервисами. Почитал в интернете, видов аутентификации вагон и маленькая тележка: JWT, SSO, OpenID, HMAC. Пообщался с коллегой-программистом, он сказал, не нужно усложнять, поэтому я реализовал аутентификацию по API Key.
Я командой
openssl rand -hex 32 сгенерировал ключ и положил его в файл .env. И к каждому POST-запросу на сервере телефонии добавил заголовок
X-Internal-Token с этим ключом, а сервер проверяет, правильный он или нет. Простая защита лучше, чем никакой.Продолжил изучать Кубернетес по плейлисту «Вечерняя школа Слёрм по Кубернетес» https://www.youtube.com/playlist?list=PL9G8hWz_wWFPWzxp1YIweOdNW9AD1TARy. У Kubernetes (k8s) есть занимательный механизм Taints and Tolerations.
Taints помечают узлы «нежелательными» для большинства подов: к ним нельзя назначаться без специальных условий. Каждый taint имеет ключ, значение и эффект (NoSchedule, PreferNoSchedule, NoExecute).
Tolerations добавляются в под и разрешают ему игнорировать конкретные taints.
Так достигается изоляция, специализированные узлы и предсказуемое размещение.
Это хитрый фильтр, на определённые узлы можно разместить определённые поды, например Nginx или базу данных.
Механизм RBAC (Role-based access control) я так и не понял, что-то сильно перемудрили с ролями и правами.
Всё хорошо, но этот курс я смотреть больше не буду, он сильно теоретический, преподаватель что-то объясняет, что-то показывает. А вот чтобы это самому это воспроизвести, нужных файлов и инфраструктуры нет.
Решил изучить курс «Kubernetes База» тоже от Слёрм. В нём упор делается именно на многонодовую конфигурацию. Просто пока Кубернетес на одном компьютере, всё просто и понятно, но вот когда компьютеров хотя бы десяток, начинается полная дичь. Особенно если несколько то отключаются, то включаются.
Поэтому дальше сосредотачиваюсь на курсе с практикой, чтобы собрать полноценный кластер и понять, как Kubernetes ведёт себя в боевых условиях.
Эта неделя снова показала: чем глубже копаюсь в инфраструктуре, тем яснее становится общая картина. Где-то подтянул безопасность, где-то разобрался в механизмах Kubernetes, и снова появился азарт двигаться дальше. Продолжу строить свой стек, шаг за шагом превращая хаос в рабочую систему, которой можно доверять.
👍2
Иногда рабочие задачи подбрасывают такие сюрпризы, что поневоле начинаешь чувствовать себя звукорежиссёром, инженером и чуть-чуть шаманом одновременно.
На работе возникла интересная задача: необходимо передавать записи звонков для речевой аналитики в систему распознавания речи. Всё хорошо, но этой AI-системе не нравится смешение голосов. Но для каждого звонка может быть подготовлен единый стереофайл, в котором левый канал содержит речь клиента, а правый канал — речь оператора.
Техническая реализация возможна это возможно следующим образом: сначала в Asterisk записываются две монодорожки — направление к клиенту (-out.wav) и направление от клиента (-in.wav). Затем по завершении звонка эти файлы объединяются в один стереофайл с помощью внешнего скрипта на базе sox или ffmpeg. После этого готовый файл может быть передан в систему анализа речи. Но в каком конкретно формате и куда передавать, я ещё буду разбираться.
Продолжаю изучать Haskell. Наткнулся на книгу «О Haskell по-человечески» https://www.ohaskell.guide/. Haskell стоит на трёх китах, имена которым: функция, тип и класс типов. Они же, в свою очередь, покоятся на огромной черепахе, имя которой — выражение.
Сразу начинает ломаться мозг. Переменных нет, циклов нет. Точнее есть, но иные. Вместо переменных константы, значения в которые прибиты гвоздями навсегда. Если надо что-то изменить, необходимо создать новую константу. Циклов нет, но есть рекурсия. При обработке списков мне понравилась ассоциация с змеёй. У каждого списка, как у змеи, есть голова
Но можно это же записать и через префиксную форму
Почти все ASCII-символы (а также их всевозможные комбинации) можно использовать в качестве операторов в Haskell. Это даёт широкие возможности для реализации различных EDSL (англ. Embedded Domain Specific Language), своего рода «языков в языке». Вот простая композиции действий.
Ну что может быть в этой функции непонятно? ;-)
Но вот работа с лямбда-функциями весьма красива.
Я теперь знаю, откуда Javascript взял свой функциональный подход.
И всё это неожиданно складывается в любопытную мысль: чем сложнее становится моя работа, тем сильнее тянет к языкам, которые требуют ясно мыслить и точно формулировать. Будто мозг сам ищет баланс между хаосом задач и стройностью функциональной парадигмы. Возможно, именно поэтому Haskell так цепляет — он учит видеть структуру там, где её сначала совсем не заметно.
На работе возникла интересная задача: необходимо передавать записи звонков для речевой аналитики в систему распознавания речи. Всё хорошо, но этой AI-системе не нравится смешение голосов. Но для каждого звонка может быть подготовлен единый стереофайл, в котором левый канал содержит речь клиента, а правый канал — речь оператора.
Техническая реализация возможна это возможно следующим образом: сначала в Asterisk записываются две монодорожки — направление к клиенту (-out.wav) и направление от клиента (-in.wav). Затем по завершении звонка эти файлы объединяются в один стереофайл с помощью внешнего скрипта на базе sox или ffmpeg. После этого готовый файл может быть передан в систему анализа речи. Но в каком конкретно формате и куда передавать, я ещё буду разбираться.
Продолжаю изучать Haskell. Наткнулся на книгу «О Haskell по-человечески» https://www.ohaskell.guide/. Haskell стоит на трёх китах, имена которым: функция, тип и класс типов. Они же, в свою очередь, покоятся на огромной черепахе, имя которой — выражение.
Сразу начинает ломаться мозг. Переменных нет, циклов нет. Точнее есть, но иные. Вместо переменных константы, значения в которые прибиты гвоздями навсегда. Если надо что-то изменить, необходимо создать новую константу. Циклов нет, но есть рекурсия. При обработке списков мне понравилась ассоциация с змеёй. У каждого списка, как у змеи, есть голова
head (первый элемент) и хвост tail (всё остальное). Вот так можно подсчитать сумму списка.sumList :: [Int] -> Int
sumList [] = 0
sumList xs = head xs + sumList (tail xs)
main :: IO ()
main = print (sumList [1,2,3])
Но можно это же записать и через префиксную форму
sumList xs = (+) (head xs) (sumList (tail xs)).Почти все ASCII-символы (а также их всевозможные комбинации) можно использовать в качестве операторов в Haskell. Это даёт широкие возможности для реализации различных EDSL (англ. Embedded Domain Specific Language), своего рода «языков в языке». Вот простая композиции действий.
prog = moveUp 3 *> moveRight 2 <* attack "orc" <|> (heal 10 >> defend *> retreat 1)Ну что может быть в этой функции непонятно? ;-)
Но вот работа с лямбда-функциями весьма красива.
process :: [Int] -> [Int]
process = map (\x -> x * x) . filter (\n -> even n)
Я теперь знаю, откуда Javascript взял свой функциональный подход.
И всё это неожиданно складывается в любопытную мысль: чем сложнее становится моя работа, тем сильнее тянет к языкам, которые требуют ясно мыслить и точно формулировать. Будто мозг сам ищет баланс между хаосом задач и стройностью функциональной парадигмы. Возможно, именно поэтому Haskell так цепляет — он учит видеть структуру там, где её сначала совсем не заметно.
www.ohaskell.guide
О Haskell по-человечески
О Haskell по-человечески. Ваша первая книга о прекрасном и удивительном языке программирования.
👍2
Последнее время копался сразу в двух довольно «мозголомных» штуках — Haskell и Kubernetes. Оба инструмента умные, красивые и местами пугающе глубокие. Чем больше в них погружаешься, тем чаще ловишь себя на мысли: кажется, я только что приоткрыл дверь в очень большой и странный мир. Ниже — мысли по ходу этого погружения, без учебников и пафоса, просто как я это прожил.
В Haskell есть бесконечные списки — и это не метафора. Они действительно бесконечные, потому что язык вычисляет значения лениво.
Философия простая: даже если выражение огромное, Haskell считает ровно столько, сколько нужно прямо сейчас. Не больше. Технически это называется вычислением до слабой головной нормальной формы (WHNF) — то есть «понять, что это за штука, но не разворачивать её полностью».
Пример из жизни:
Этот список начинается с двойки и идёт дальше через один — 2, 4, 6, 8… и так без конца. Но если я напишу:
Или ещё пример:
Но у ленивой стратегии есть и тёмная сторона — space leak, утечка памяти.
Она возникает, когда мы вроде бы «ничего не считаем», но держим в памяти кучу отложенных вычислений. Типичная ситуация:
Если написать неаккуратно, Haskell может сначала наоткладывать миллионы сложений, а потом внезапно понять, что память закончилась. Формально он был ленивым, а по факту — слишком терпеливым. Поэтому ленивость — это мощный инструмент, но обращаться с ним нужно осознанно.
Haskell я поизучал и решил остановиться, и вот почему. Главная особенность Haskell — в его происхождении. Он вырос из академической среды: университеты, исследователи, строгая математика, чистые абстракции. Отсюда и стиль языка — «строим собор»: всё выверено, логично, красиво, под присмотром умных архитекторов. Рекурсивные типы, функторы, аппликативы, монады — всё на своих местах.
С одной стороны, это огромный плюс. Haskell даёт редкое ощущение интеллектуальной чистоты и надёжности. С другой — он часто кажется далёким от повседневных задач. Академическая логика не всегда совпадает с тем, как думает инженер, которому нужно просто «чтобы работало здесь и сейчас».
Инженерный мир живёт практикой и эксплуатацией. Если идея прекрасна в теории, но требует недель вхождения и особого мышления — она сложна в применении. В этом и напряжение вокруг Haskell: язык мощный и точный, но дружелюбным он становится только после того, как ты к нему дорастаешь. Большинство не дорастает. Я тоже решил отложить функциональное программирование. Но опыт его освоения был весьма занимательным.
Я всё ещё ковыряюсь в Kubernetes. Нашёл на официальном сайте реально хорошие гайды — написаны понятно, без лишней магии, тот же пример с WordPress и MySQL зашёл отлично https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
Но чем дальше лезу, тем сильнее ощущение, что Kubernetes — это какой-то новый Linux: огромный, многослойный и у каждого он «свой». И в какой-то момент поймал себя на мысли, что без живых задач его можно изучать бесконечно и так ни к чему конкретному не прийти. Поэтому решил поставить обучение на паузу и вернуться к нему, когда появится реальная задача, а не просто академический интерес.
В какой-то момент я понял, что снова делаю типичную айтишную ошибку: изучаю мощные инструменты просто потому, что они мощные. Haskell и Kubernetes — отличные штуки, но они не любят праздного любопытства. Им нужны задачи, боль и контекст. Так что я нажал на паузу без чувства вины. Знания никуда не делись, опыт остался, а интерес — жив. Значит, всё было не зря.
В Haskell есть бесконечные списки — и это не метафора. Они действительно бесконечные, потому что язык вычисляет значения лениво.
Философия простая: даже если выражение огромное, Haskell считает ровно столько, сколько нужно прямо сейчас. Не больше. Технически это называется вычислением до слабой головной нормальной формы (WHNF) — то есть «понять, что это за штука, но не разворачивать её полностью».
Пример из жизни:
nums = [2,4..]Этот список начинается с двойки и идёт дальше через один — 2, 4, 6, 8… и так без конца. Но если я напишу:
take 3 nums Haskell даже не пытается «построить весь список». Он честно говорит: «Мне нужны только первые три — окей, вот 2, 4, 6. Остальное не трогаем».Или ещё пример:
head (map (*2) [1..]) Кажется, что тут бесконечность на бесконечности, но по факту вычисляется только: 1 → умножили на 2 → получили 2 → остановились. Магия? Нет, лень. В хорошем смысле.Но у ленивой стратегии есть и тёмная сторона — space leak, утечка памяти.
Она возникает, когда мы вроде бы «ничего не считаем», но держим в памяти кучу отложенных вычислений. Типичная ситуация:
sum [1..10000000]Если написать неаккуратно, Haskell может сначала наоткладывать миллионы сложений, а потом внезапно понять, что память закончилась. Формально он был ленивым, а по факту — слишком терпеливым. Поэтому ленивость — это мощный инструмент, но обращаться с ним нужно осознанно.
Haskell я поизучал и решил остановиться, и вот почему. Главная особенность Haskell — в его происхождении. Он вырос из академической среды: университеты, исследователи, строгая математика, чистые абстракции. Отсюда и стиль языка — «строим собор»: всё выверено, логично, красиво, под присмотром умных архитекторов. Рекурсивные типы, функторы, аппликативы, монады — всё на своих местах.
С одной стороны, это огромный плюс. Haskell даёт редкое ощущение интеллектуальной чистоты и надёжности. С другой — он часто кажется далёким от повседневных задач. Академическая логика не всегда совпадает с тем, как думает инженер, которому нужно просто «чтобы работало здесь и сейчас».
Инженерный мир живёт практикой и эксплуатацией. Если идея прекрасна в теории, но требует недель вхождения и особого мышления — она сложна в применении. В этом и напряжение вокруг Haskell: язык мощный и точный, но дружелюбным он становится только после того, как ты к нему дорастаешь. Большинство не дорастает. Я тоже решил отложить функциональное программирование. Но опыт его освоения был весьма занимательным.
Я всё ещё ковыряюсь в Kubernetes. Нашёл на официальном сайте реально хорошие гайды — написаны понятно, без лишней магии, тот же пример с WordPress и MySQL зашёл отлично https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
Но чем дальше лезу, тем сильнее ощущение, что Kubernetes — это какой-то новый Linux: огромный, многослойный и у каждого он «свой». И в какой-то момент поймал себя на мысли, что без живых задач его можно изучать бесконечно и так ни к чему конкретному не прийти. Поэтому решил поставить обучение на паузу и вернуться к нему, когда появится реальная задача, а не просто академический интерес.
В какой-то момент я понял, что снова делаю типичную айтишную ошибку: изучаю мощные инструменты просто потому, что они мощные. Haskell и Kubernetes — отличные штуки, но они не любят праздного любопытства. Им нужны задачи, боль и контекст. Так что я нажал на паузу без чувства вины. Знания никуда не делись, опыт остался, а интерес — жив. Значит, всё было не зря.
Kubernetes
Example: Deploying WordPress and MySQL with Persistent Volumes
This tutorial shows you how to deploy a WordPress site and a MySQL database using Minikube. Both applications use PersistentVolumes and PersistentVolumeClaims to store data.
A PersistentVolume (PV) is a piece of storage in the cluster that has been manually…
A PersistentVolume (PV) is a piece of storage in the cluster that has been manually…
❤3👍1
Перечитал роман «Гиперион» Дэна Симмонса. Впервые я читал его около двадцати лет назад, ещё студентом, и тогда без колебаний поставил ему 10/10. Сейчас впечатление изменилось.
«Гиперион» — это не совсем космоопера в привычном смысле. Скорее роман-путешествие и сборник притч. Семь паломников летят к планете Гиперион, чтобы встретиться с загадочным и смертельно опасным Шрайком накануне галактической войны. По пути каждый из них рассказывает свою историю — о любви, вере, науке, страхе и ответственности.
По сути, «Гиперион» — это разговор о религии в XXVIII веке, о вере и её трансформации. Здесь сосуществуют католицизм, ислам, иудаизм и новые духовные течения. Религия в романе не догма, а живой и болезненный процесс поиска смысла.
Само название отсылает к поэме Джона Китса «Гиперион», посвящённой битве олимпийских богов и титанов. Титан Кронос пожирает своих детей, но Зевс освобождает братьев и побеждает его. Гиперион — титан света, готовящийся к войне. Поэма Китса описывает смену старых богов новыми, переход от стихийных сил к персонифицированным божествам. Этот мотив смены эпох и богов напрямую отражается в романе Симмонса.
Паломничество к «святой земле» имеет в мире «Гипериона» ключевое значение. Считается, что Шрайк исполнит желание одного из паломников, а остальных принесёт в жертву. Один из героев — военный — уже сталкивался с Шрайком, обитающим в Гробницах Времени, которые движутся из будущего в прошлое. Он видел своих спутников, распятых на Древе Боли. При этом идея о том, что один металлический бог с лезвиями вместо тела способен решить проблемы цивилизации, копившиеся веками, вызывает у меня серьёзные сомнения.
Особенно запоминается история священника Поля Дюре. Католическая церковь в XXVIII веке находится в упадке и фактически превратилась в маргинальную секту. Основная религия галактики — дзен-гностицизм, который Симмонс намеренно описывает фрагментарно. Можно лишь предположить, что в его основе — отказ от ритуалов и акцент на личном, внутреннем общении с Богом. Учитель Дюре на Гиперионе заражается крестоформом — паразитом, прикрепляющимся к позвоночнику и воскрешающим человека после смерти. Каждое возрождение сопровождается деградацией личности: стирается память, притупляется разум. Формально это путь к бессмертию, но по сути — утрата человечности, вечная жизнь без свободы и воли.
История поэта Мартина Силена посвящена упадку поэзии в XXVIII веке. Одна из его книг становится популярной исключительно благодаря маркетингу. Он отчаянно пытается вернуть славу, написав новое произведение. Лично мне этот сюжет кажется ироничным: поэзия, по ощущениям, умирает уже несколько веков — и всё никак не умрёт окончательно.
Война показана через призму опыта профессионального солдата Федмана Кассада — мусульманина, тактика и офицера элитных подразделений. Его история — размышление о войне как о замкнутом, самовоспроизводящемся круге, в котором меняются только декорации.
Профессор этики Сол Вайнтрауб сталкивается с проклятием своей дочери Рахели: она молодеет с каждым днём, превращаясь из женщины в младенца. Вайнтрауб — иудей, ему снятся сны, в которых Яхве требует принести дочь в жертву. Он размышляет об этике жертвоприношения и вступает в спор с библейским мифом об Аврааме. Если бы сын Авраама погиб, считает Вайнтрауб, тот не стал бы поклоняться такому Богу — потому что Бог стал бы злым.
Если двадцать лет назад «Гиперион» вызывал у меня безоговорочный восторг, то сегодня он оставляет более противоречивые чувства. Это осознанно фрагментарное произведение — смесь космооперы, философского трактата, религиозной притчи, хоррора и киберпанка. Роман обрывается намеренно: основные события начинаются уже в следующей книге — «Падение Гипериона». Шрайк, Гробницы Времени и многие ключевые загадки долго остаются без объяснений.
И всё же это великая книга. В моём личном рейтинге — 9/10. Рекомендую к прочтению.
«Гиперион» — это не совсем космоопера в привычном смысле. Скорее роман-путешествие и сборник притч. Семь паломников летят к планете Гиперион, чтобы встретиться с загадочным и смертельно опасным Шрайком накануне галактической войны. По пути каждый из них рассказывает свою историю — о любви, вере, науке, страхе и ответственности.
По сути, «Гиперион» — это разговор о религии в XXVIII веке, о вере и её трансформации. Здесь сосуществуют католицизм, ислам, иудаизм и новые духовные течения. Религия в романе не догма, а живой и болезненный процесс поиска смысла.
Само название отсылает к поэме Джона Китса «Гиперион», посвящённой битве олимпийских богов и титанов. Титан Кронос пожирает своих детей, но Зевс освобождает братьев и побеждает его. Гиперион — титан света, готовящийся к войне. Поэма Китса описывает смену старых богов новыми, переход от стихийных сил к персонифицированным божествам. Этот мотив смены эпох и богов напрямую отражается в романе Симмонса.
Паломничество к «святой земле» имеет в мире «Гипериона» ключевое значение. Считается, что Шрайк исполнит желание одного из паломников, а остальных принесёт в жертву. Один из героев — военный — уже сталкивался с Шрайком, обитающим в Гробницах Времени, которые движутся из будущего в прошлое. Он видел своих спутников, распятых на Древе Боли. При этом идея о том, что один металлический бог с лезвиями вместо тела способен решить проблемы цивилизации, копившиеся веками, вызывает у меня серьёзные сомнения.
Особенно запоминается история священника Поля Дюре. Католическая церковь в XXVIII веке находится в упадке и фактически превратилась в маргинальную секту. Основная религия галактики — дзен-гностицизм, который Симмонс намеренно описывает фрагментарно. Можно лишь предположить, что в его основе — отказ от ритуалов и акцент на личном, внутреннем общении с Богом. Учитель Дюре на Гиперионе заражается крестоформом — паразитом, прикрепляющимся к позвоночнику и воскрешающим человека после смерти. Каждое возрождение сопровождается деградацией личности: стирается память, притупляется разум. Формально это путь к бессмертию, но по сути — утрата человечности, вечная жизнь без свободы и воли.
История поэта Мартина Силена посвящена упадку поэзии в XXVIII веке. Одна из его книг становится популярной исключительно благодаря маркетингу. Он отчаянно пытается вернуть славу, написав новое произведение. Лично мне этот сюжет кажется ироничным: поэзия, по ощущениям, умирает уже несколько веков — и всё никак не умрёт окончательно.
Война показана через призму опыта профессионального солдата Федмана Кассада — мусульманина, тактика и офицера элитных подразделений. Его история — размышление о войне как о замкнутом, самовоспроизводящемся круге, в котором меняются только декорации.
Профессор этики Сол Вайнтрауб сталкивается с проклятием своей дочери Рахели: она молодеет с каждым днём, превращаясь из женщины в младенца. Вайнтрауб — иудей, ему снятся сны, в которых Яхве требует принести дочь в жертву. Он размышляет об этике жертвоприношения и вступает в спор с библейским мифом об Аврааме. Если бы сын Авраама погиб, считает Вайнтрауб, тот не стал бы поклоняться такому Богу — потому что Бог стал бы злым.
Если двадцать лет назад «Гиперион» вызывал у меня безоговорочный восторг, то сегодня он оставляет более противоречивые чувства. Это осознанно фрагментарное произведение — смесь космооперы, философского трактата, религиозной притчи, хоррора и киберпанка. Роман обрывается намеренно: основные события начинаются уже в следующей книге — «Падение Гипериона». Шрайк, Гробницы Времени и многие ключевые загадки долго остаются без объяснений.
И всё же это великая книга. В моём личном рейтинге — 9/10. Рекомендую к прочтению.
👍3❤1