Прочитал книгу Брюса Э. Тейта «Семь языков за семь недель». Автор разбирает по одному языку программирования каждую неделю.
Языки следующие: Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell.
Выбор языков какой-то странный, он взял разные языки на разных подходах, но почему-то «забыл» про низкоуровневое программирование. Я про языки С/С++/Rust. Они, конечно, высокоуровневые, но железо надо знать очень и очень хорошо, чтобы на них программировать. Смотрю канал Ольги Павловой https://www.youtube.com/@olgapavlova, она на C программировала драйвер для клавиатуры, которую собрала сама из запчастей. Драйвер для ядра Linux. В одном видео она пробовала писать свою реализацию протокола USB для этой клавиатуры, плюнула и использовала готовую микросхему. Протокол USB на С написать не так просто, как кажется.
Автор делает упор именно на функциональное программирование (Scala, Erlang, Clojure, Haskell). Что мне понравилось в функциональном программировании, основной принцип: в программе на вход приходят данные, и выходят тоже данные. А связь между входом и выходом можно представить в виде цепочки функций (конвейера). Автор всё агитирует за чистые функции.
- Чистые (pure) функции
– Всегда возвращают одно и то же значение при одинаковых входных параметрах.
– Не имеют побочных эффектов (не читают и не пишут внешнее состояние, не делают I/O).
Но мы живём в реальном мире, нечистых функций намного больше.
- Нечистые (impure) функции
– Могут возвращать разные значения на тех же входах или менять поведение в зависимости от внешнего состояния (например, времени, случайных чисел, глобальных переменных).
– Имеют побочные эффекты: чтение/запись файлов, сетевые запросы, логирование, мутация данных и т. п.
Их делят на разные модули. Про это автор умолчал. Также из сложных аспектов выделил только монады, а функторы, аппликативы, ко‑монады?
Не понравился Clojure, это язык с неизменяемостью данных, лаконичный синтаксис Lisp, мощные макросы, высокая параллельность, JVM‑экосистема. Но недостатки всё перевешивают. Очень крутой порог вхождения из‑за Lisp‑нотации. Читаешь код на Clojure — ощущение математики, его создали для роботов. Язык очень мощный, но эту мощность ещё нужно постичь, 2–3 года минимум. Понравилась концепция: код — это данные. А так как это данные, их можно менять. В Clojure можно вводить свои синтаксические конструкции.
А вот Haskell мне понравился. Язык чисто функциональный, ленивые вычисления, сильная статическая типизация с выводом типов, выразительный синтаксис, каррирование и модульность. Самый чистый из функциональных.
Недостатки: крутая кривая обучения, но не такая, как в Clojure.
А Prolog показал какое-то двойственное отношение. Декларативный язык логического программирования, удобство для задач ИИ и экспертных систем, обработки естественного языка, простая рекурсивная логика, краткость кода. Ключевое здесь — декларативный язык, как SQL. Нужно описать объекты, связи между ними и что хочешь получить в результате, и он найдёт решение (или не найдёт). Но все задачи, которые привёл автор, я видел решение на SQL на Хабре. Популярным Prolog так и не стал.
Понравился Erlang — это язык параллельного программирования. Там процессы процессами погоняют. Основной принцип языка: «Позвольте приложению потерпеть неудачу». Там есть процессы-гипервизоры, которые наблюдают за другими процессами, если процесс «умер», его запускает гипервизор. Гипервизоры наблюдают друг за другом. Горячая замена кода без остановки системы. Чем-то напоминает Kubernetes, меняем одни контейнеры на другие без перезапуска приложения. Про потокобезопасные неизменяемые структуры автор почему-то умолчал.
Scala не понравилась, с одной стороны, объектно-ориентированный подход, с другой — функциональный, скрестили ежа и ужа. Io — убогая пародия на JavaScript, Ruby мне понравился «синтаксическим сахаром», на нём писать легко.
Я решил зайти на HH и посмотреть, сколько вакансий на этих языках:
Scala/Java = 337
Elixir/Erlang = 10
Haskell = 2
Prolog = 0
Языки следующие: Ruby, Io, Prolog, Scala, Erlang, Clojure, Haskell.
Выбор языков какой-то странный, он взял разные языки на разных подходах, но почему-то «забыл» про низкоуровневое программирование. Я про языки С/С++/Rust. Они, конечно, высокоуровневые, но железо надо знать очень и очень хорошо, чтобы на них программировать. Смотрю канал Ольги Павловой https://www.youtube.com/@olgapavlova, она на C программировала драйвер для клавиатуры, которую собрала сама из запчастей. Драйвер для ядра Linux. В одном видео она пробовала писать свою реализацию протокола USB для этой клавиатуры, плюнула и использовала готовую микросхему. Протокол USB на С написать не так просто, как кажется.
Автор делает упор именно на функциональное программирование (Scala, Erlang, Clojure, Haskell). Что мне понравилось в функциональном программировании, основной принцип: в программе на вход приходят данные, и выходят тоже данные. А связь между входом и выходом можно представить в виде цепочки функций (конвейера). Автор всё агитирует за чистые функции.
- Чистые (pure) функции
– Всегда возвращают одно и то же значение при одинаковых входных параметрах.
– Не имеют побочных эффектов (не читают и не пишут внешнее состояние, не делают I/O).
Но мы живём в реальном мире, нечистых функций намного больше.
- Нечистые (impure) функции
– Могут возвращать разные значения на тех же входах или менять поведение в зависимости от внешнего состояния (например, времени, случайных чисел, глобальных переменных).
– Имеют побочные эффекты: чтение/запись файлов, сетевые запросы, логирование, мутация данных и т. п.
Их делят на разные модули. Про это автор умолчал. Также из сложных аспектов выделил только монады, а функторы, аппликативы, ко‑монады?
Не понравился Clojure, это язык с неизменяемостью данных, лаконичный синтаксис Lisp, мощные макросы, высокая параллельность, JVM‑экосистема. Но недостатки всё перевешивают. Очень крутой порог вхождения из‑за Lisp‑нотации. Читаешь код на Clojure — ощущение математики, его создали для роботов. Язык очень мощный, но эту мощность ещё нужно постичь, 2–3 года минимум. Понравилась концепция: код — это данные. А так как это данные, их можно менять. В Clojure можно вводить свои синтаксические конструкции.
А вот Haskell мне понравился. Язык чисто функциональный, ленивые вычисления, сильная статическая типизация с выводом типов, выразительный синтаксис, каррирование и модульность. Самый чистый из функциональных.
Недостатки: крутая кривая обучения, но не такая, как в Clojure.
А Prolog показал какое-то двойственное отношение. Декларативный язык логического программирования, удобство для задач ИИ и экспертных систем, обработки естественного языка, простая рекурсивная логика, краткость кода. Ключевое здесь — декларативный язык, как SQL. Нужно описать объекты, связи между ними и что хочешь получить в результате, и он найдёт решение (или не найдёт). Но все задачи, которые привёл автор, я видел решение на SQL на Хабре. Популярным Prolog так и не стал.
Понравился Erlang — это язык параллельного программирования. Там процессы процессами погоняют. Основной принцип языка: «Позвольте приложению потерпеть неудачу». Там есть процессы-гипервизоры, которые наблюдают за другими процессами, если процесс «умер», его запускает гипервизор. Гипервизоры наблюдают друг за другом. Горячая замена кода без остановки системы. Чем-то напоминает Kubernetes, меняем одни контейнеры на другие без перезапуска приложения. Про потокобезопасные неизменяемые структуры автор почему-то умолчал.
Scala не понравилась, с одной стороны, объектно-ориентированный подход, с другой — функциональный, скрестили ежа и ужа. Io — убогая пародия на JavaScript, Ruby мне понравился «синтаксическим сахаром», на нём писать легко.
Я решил зайти на HH и посмотреть, сколько вакансий на этих языках:
Scala/Java = 337
Elixir/Erlang = 10
Haskell = 2
Prolog = 0
Подразумевается, те, кто знают Java, знают и Scala. Erlang живёт с Elixir, а вот Haskell и Prolog никому не нужны.
Чисто для себя я решил изучить:
С/С++/RUST для низкоуровневого программирования
Haskell — для функционального
Go — для жизни.
Чисто для себя я решил изучить:
С/С++/RUST для низкоуровневого программирования
Haskell — для функционального
Go — для жизни.
👍3
Неделя выдалась насыщенной: то алкоголик врывается в рабочие процессы, то архитектуру для чат-бота приходится собирать по кусочкам.
В понедельник весь день звонил упорный алкоголик по телефону заказа чековой ленты. 7 раз звонил. В результате я отправил его в блек-лист. Где он нашёл этот старый номер — непонятно.
В нашей фирме есть традиция каждый год переделывать голосовое меню. Я начал анализировать существующее. Ощущение, что старое написано хвостом пьяной обезьяны, уйма логики, которая не делает ничего. Где-то 3 дня разбирался, что было запрограммировано до меня. Переделал под новые требования. Понравился только один момент: есть сайт https://isdayoff.ru/20250727?cc=ru, который говорит, текущий день является выходным или праздничным, и можно к этому привязать голосовое меню.
Продолжил писать чат-бота под Битрикс24 на Typescript. За основу взял сервер Fastify https://fastify.dev/. Для создания веб-серверов во всех курсах используют ExpressJS. Он самый простой, но уже морально устарел. А Fastify более быстрый и типизируемый. Он мне понравился.
Начал писать код и поймал себя на мысли, что файл
Вот так я познакомился с библиотекой InversifyJS https://inversify.io/, которая реализует IoC-контейнеры в Typescript. Все свои функции я превратил в классы, а классы через интерфейсы поместил в IoC-контейнеры. И это мне понравилось: у приложения появилась архитектура, классы общаются между собой через интерфейсы. Один минус: кода стало больше, но приложение приобрело модульность. В коде появились декораторы и синглтоны из коробки.
Чат-боты под Битрикс24 — это что-то с чем-то. Они явно вдохновлялись Telegram-ботами, но до них им ещё очень и очень далеко. Мне по факту нужно было создать сообщение, что был звонок, и добавить под ним 2 кнопки: «Принять» и «Отклонить». Основная засада была именно с этими кнопками. Знаете, как они называются? Клавиатура (Keyboard) https://apidocs.bitrix24.ru/api-reference/chats/messages/keyboards.html. А что в этой клавиатуре располагается? Клавиши? Нет, команды. Но команды надо сначала зарегистрировать у бота. И при вызове команды приходит событие ONIMCOMMANDADD https://apidocs.bitrix24.ru/api-reference/chat-bots/commands/events/on-im-command-add.html. В результате получилась дивная матрёшка, пока разобрался, чуть не поседел.
По факту весь чат-бот построен на событиях. Подключили чат-бота в чат — возникло событие ONIMBOTJOINCHAT https://apidocs.bitrix24.ru/api-reference/chat-bots/chats/events/on-imbot-join-chat.html. Чат-бот приветствует жителей чата.
И ещё все события сильно заточены под PHP. Я заколебался парсить ответы из Typescript, но справился.
Сейчас более-менее разобрался с написанием чат-бота под Битрикс24, но пришлось тяжко. Примеров нет, доступен только справочник.
Чат-бота почти закончил, осталось его контейнизировать и интегрировать в голосовое меню. Думаю, справлюсь.
Самое интересное: в нашей фирме и программисты есть, но они загружены работой над основным приложением на ближайший год. И моё голосовое меню будет в самом конце беклога. Кстати, я понял простую мысль: проще бэкендеру выучить Javascript, чем фронтендеру стать бэкендером. Новых концепций программирования вагон и маленькая тележка.
В понедельник весь день звонил упорный алкоголик по телефону заказа чековой ленты. 7 раз звонил. В результате я отправил его в блек-лист. Где он нашёл этот старый номер — непонятно.
В нашей фирме есть традиция каждый год переделывать голосовое меню. Я начал анализировать существующее. Ощущение, что старое написано хвостом пьяной обезьяны, уйма логики, которая не делает ничего. Где-то 3 дня разбирался, что было запрограммировано до меня. Переделал под новые требования. Понравился только один момент: есть сайт https://isdayoff.ru/20250727?cc=ru, который говорит, текущий день является выходным или праздничным, и можно к этому привязать голосовое меню.
Продолжил писать чат-бота под Битрикс24 на Typescript. За основу взял сервер Fastify https://fastify.dev/. Для создания веб-серверов во всех курсах используют ExpressJS. Он самый простой, но уже морально устарел. А Fastify более быстрый и типизируемый. Он мне понравился.
Начал писать код и поймал себя на мысли, что файл
settings.yml я читаю с нуля в трёх местах. Осознал, что делаю что-то не то. Вспомнил, что во фронте есть же storage. Например, zustand https://zustand-demo.pmnd.rs/. Всё хорошо, только на backend он не работает. Потом вспомнил, что на курсе по NodeJS Антон Ларичев https://www.youtube.com/@PurpleSchool/ рассказывал про внедрение зависимости (Dependency injection) и его применение в виде IoC-контейнеров. Сразу скажу: в ReactJS никаких IoC-контейнеров нет, там одни функциональные компоненты, а обмен между ними идёт через storage. Точнее, есть, но до AngularJS я так и не добрался.Вот так я познакомился с библиотекой InversifyJS https://inversify.io/, которая реализует IoC-контейнеры в Typescript. Все свои функции я превратил в классы, а классы через интерфейсы поместил в IoC-контейнеры. И это мне понравилось: у приложения появилась архитектура, классы общаются между собой через интерфейсы. Один минус: кода стало больше, но приложение приобрело модульность. В коде появились декораторы и синглтоны из коробки.
Чат-боты под Битрикс24 — это что-то с чем-то. Они явно вдохновлялись Telegram-ботами, но до них им ещё очень и очень далеко. Мне по факту нужно было создать сообщение, что был звонок, и добавить под ним 2 кнопки: «Принять» и «Отклонить». Основная засада была именно с этими кнопками. Знаете, как они называются? Клавиатура (Keyboard) https://apidocs.bitrix24.ru/api-reference/chats/messages/keyboards.html. А что в этой клавиатуре располагается? Клавиши? Нет, команды. Но команды надо сначала зарегистрировать у бота. И при вызове команды приходит событие ONIMCOMMANDADD https://apidocs.bitrix24.ru/api-reference/chat-bots/commands/events/on-im-command-add.html. В результате получилась дивная матрёшка, пока разобрался, чуть не поседел.
По факту весь чат-бот построен на событиях. Подключили чат-бота в чат — возникло событие ONIMBOTJOINCHAT https://apidocs.bitrix24.ru/api-reference/chat-bots/chats/events/on-imbot-join-chat.html. Чат-бот приветствует жителей чата.
И ещё все события сильно заточены под PHP. Я заколебался парсить ответы из Typescript, но справился.
Сейчас более-менее разобрался с написанием чат-бота под Битрикс24, но пришлось тяжко. Примеров нет, доступен только справочник.
Чат-бота почти закончил, осталось его контейнизировать и интегрировать в голосовое меню. Думаю, справлюсь.
Самое интересное: в нашей фирме и программисты есть, но они загружены работой над основным приложением на ближайший год. И моё голосовое меню будет в самом конце беклога. Кстати, я понял простую мысль: проще бэкендеру выучить Javascript, чем фронтендеру стать бэкендером. Новых концепций программирования вагон и маленькая тележка.
Fastify
Fastify — Fast and low overhead web framework, for Node.js
Fastify is a web framework highly focused on providing the best developer experience with the least overhead and a powerful plugin architecture.
👍3❤1
В итоге за неделю я прокачал архитектурное мышление, разобрался с InversifyJS, обошёл подводные камни Bitrix24 и внедрил осмысленную логику в голосовое меню. Стало ясно: если хочешь, чтобы что-то работало — делай сам. Параллельно убедился, что backend на TypeScript — это мощно, а грамотная архитектура экономит кучу времени. Продолжаю развивать проект.
👍4
Последние недели выдались насыщенными — и по рабочим проектам, и по изучению новых технологий. Пришлось и автоматизацию подкрутить, и с «дятлами» разобраться, и пару курсов пройти. Расскажу, что удалось сделать и с какими забавными моментами столкнулся.
На работе реализовал новое голосовое меню. Теперь нет коллективных звонков на весь отдел. Пришёл звонок — мой чат-бот создаёт новую заявку в Bitrix24, на которую необходимо перезвонить. Больше всего возмутилась бухгалтерия, вот когда проект обсуждали, они молчали, а вот когда надо перезванивать, стали возмущаться.
В одном отделе тупо и на звонки не отвечали, и перезванивать не собираются. Странные люди. Внедрение нового идёт тяжко.
Ещё реализовал защиту от «дятлов». Есть клиенты, которые оставили заявку, подождали ровно 10 секунд, им никто не перезвонил. Они звонят и оставляют ещё одну, и так 3–4 раза. Я их назвал «дятлами». Их заявки забивают всю ленту, теперь мой чат-бот проверяет номер телефона и не создаёт новую заявку, а выводит количество звонков в текущей. Но заявки «дятлов» суммируются только в течение суток, потом всё начинает с начала. Для реализации использовал Redis, там есть фича, запись можно удалить по времени. Теперь Redis сам очищает просроченные записи. Мне «понравилась» установка Redis для Windows из официальной документации. Установите Docker с Linux, а в нём Redis.
Ещё у ряда коллег появилось уйма идей для доработок нового голосового меню, но не всё технически реализуемо. Эти бы силы они направляли на основную деятельность, мы бы давно достигли Марса.
Продолжают звонить какие-то боты через «Манго-офис», за день 6 раз звонят. Звонят, слушают голосовое меню, ничего не делают, и их сбрасывает по таймауту. Секретарь перезванивает, а дозвониться не может. Какие-то жулики. В блеклист их
Прошёл бесплатный курс на Stepik «Ansible для начинающих» https://stepik.org/course/123806/syllabus. Курс сильно для начинающих, все примеры ну очень простые. Как бы учащиеся не перетрудились. Получил сертификат с отличием.
Начал проходить другой курс «Ansible На Русском Языке» https://www.youtube.com/playlist?list=PLg5SS_4L6LYufspdPupdynbMQTBnZd31N. Он более серьёзный, но тоже бесплатный.
Вот что мне понравилось в Ansible — это идемпотентность. Идемпотентность — это свойство задач выполняться так, чтобы повторный запуск не изменял систему, если она уже в нужном состоянии. Т. е., например, я внёс в файл hosts запись с IP-адресом и именем сервера. Если Ansible запустить второй раз, она проверит, а есть ли эта запись, и если есть, ничего нового вносить не будет.
В итоге, последние недели прошли под знаком экспериментов, внедрений и борьбы с неожиданными «сюрпризами». Где-то получилось сделать удобнее, где-то — отсеять лишнее, а кое-где — и поломать устоявшиеся привычки коллег. Параллельно прокачал навыки в Ansible, а новые идеи для автоматизации уже лежат в списке «в работу». Так что дальше будет ещё интереснее.
На работе реализовал новое голосовое меню. Теперь нет коллективных звонков на весь отдел. Пришёл звонок — мой чат-бот создаёт новую заявку в Bitrix24, на которую необходимо перезвонить. Больше всего возмутилась бухгалтерия, вот когда проект обсуждали, они молчали, а вот когда надо перезванивать, стали возмущаться.
В одном отделе тупо и на звонки не отвечали, и перезванивать не собираются. Странные люди. Внедрение нового идёт тяжко.
Ещё реализовал защиту от «дятлов». Есть клиенты, которые оставили заявку, подождали ровно 10 секунд, им никто не перезвонил. Они звонят и оставляют ещё одну, и так 3–4 раза. Я их назвал «дятлами». Их заявки забивают всю ленту, теперь мой чат-бот проверяет номер телефона и не создаёт новую заявку, а выводит количество звонков в текущей. Но заявки «дятлов» суммируются только в течение суток, потом всё начинает с начала. Для реализации использовал Redis, там есть фича, запись можно удалить по времени. Теперь Redis сам очищает просроченные записи. Мне «понравилась» установка Redis для Windows из официальной документации. Установите Docker с Linux, а в нём Redis.
Ещё у ряда коллег появилось уйма идей для доработок нового голосового меню, но не всё технически реализуемо. Эти бы силы они направляли на основную деятельность, мы бы давно достигли Марса.
Продолжают звонить какие-то боты через «Манго-офис», за день 6 раз звонят. Звонят, слушают голосовое меню, ничего не делают, и их сбрасывает по таймауту. Секретарь перезванивает, а дозвониться не может. Какие-то жулики. В блеклист их
asterisk -rx "database put blacklist 9998887766 1".Прошёл бесплатный курс на Stepik «Ansible для начинающих» https://stepik.org/course/123806/syllabus. Курс сильно для начинающих, все примеры ну очень простые. Как бы учащиеся не перетрудились. Получил сертификат с отличием.
Начал проходить другой курс «Ansible На Русском Языке» https://www.youtube.com/playlist?list=PLg5SS_4L6LYufspdPupdynbMQTBnZd31N. Он более серьёзный, но тоже бесплатный.
Вот что мне понравилось в Ansible — это идемпотентность. Идемпотентность — это свойство задач выполняться так, чтобы повторный запуск не изменял систему, если она уже в нужном состоянии. Т. е., например, я внёс в файл hosts запись с IP-адресом и именем сервера. Если Ansible запустить второй раз, она проверит, а есть ли эта запись, и если есть, ничего нового вносить не будет.
В итоге, последние недели прошли под знаком экспериментов, внедрений и борьбы с неожиданными «сюрпризами». Где-то получилось сделать удобнее, где-то — отсеять лишнее, а кое-где — и поломать устоявшиеся привычки коллег. Параллельно прокачал навыки в Ansible, а новые идеи для автоматизации уже лежат в списке «в работу». Так что дальше будет ещё интереснее.
👍2
Последние месяцы у меня проходят под знаком экспериментов и внедрения новых технологий. Периодически кажется, что я одновременно и программист, и админ, и тестировщик — всё в одном лице. Так появился мой чат-бот для Bitrix24. Но вскоре стало ясно: бот без мониторинга — как машина без приборной панели. Вроде едет, но не понимаешь, когда заглохнет.
С этого и начались мои эксперименты с проверками и интеграцией в Zabbix. По совету ChatGPT я реализовал 3 функции:
Начал интегрировать мои наработки в Zabbix. А не получается, хотя и курс по Zabbix прошёл. Позвал коллегу, он объяснил, как настроить узел сети, источники данных, триггер, как правильно парсить JSON-ответ от сервера. Методы
И вот настал ответственный момент, я «уронил» чат-бота, возникла «проблема» в Zabbix. И всё. А как настроить отправку сообщений email и в Telegram или мне сидеть и медитировать перед браузером? Коллега знал, но подзабыл. Я начал разбираться сам. Помогли вот эти видео: https://www.youtube.com/watch?v=zGqzOOA4OeM и https://www.youtube.com/watch?v=yKueieCKiBk и статья https://serveradmin.ru/nastroyka-opoveshheniy-zabbix-v-telegram/. Оказалось не сильно сложно, но уж больно заморочено. Неудивительно, что коллега точный алгоритм не помнил.
Я решил продолжить дальше и настроил мониторинг Asterisk лично для себя, т. к. сообщения об ошибках валяться в общий чат, а там что-то найти трудоёмко. Zabbix оказался сложнее, чем я думал.
Но по голосовому меню затея с отправкой звонков сразу в чат провалилась, сотрудники тупо не перезванивают. А это уже не техническая проблема, поэтому решили вернуть всё взад и создать новое меню, звонок сначала идёт на отдел, а потом, если не удалось дозвониться, в чат, как пропущенный звонок.
Решил, что хватит проходить курсы по Ansible, надо внедрять полученные знания в производство. Кто не знает Ansible — это ещё вид межгалактической связи в фантастических романах. Решил создать playbook (сценарий) для первоначальной настройки Debian. За основу взял вот эту статью https://r4ven.me/it-razdel/zametki/pishem-ansible-playbook-dlya-nachalnoj-nastrojki-linux-servera/. Для Ansible есть репозиторий, где уже находятся готовые playbook https://galaxy.ansible.com/ui/. Скачал один, посмотрел, что-то сильно сложно, решил сделать проще. Я ведь только настраиваю сервер под Debian. Но вот просто не получилось, Debian он очень разных версий от 10 до 13, и то, что работает в одной версии, не работает в другой. Но я всё-таки справился, вот мой сценарий https://github.com/orion55/ansible. Проверил на 5 серверах, вроде работает, но опять же это лично мои настройки. Чтобы смотреть Youtube, я использую сервис из 3 букв, о котором нельзя говорить. За последний год я переезжал на разные серверы раза три, и на первоначальную настройку Debian-сервера уходило в среднем 1 час. На этот сервер мало установить приложения firewall, fail2ban, tmux и т. д., ещё их необходимо настроить. Больше всего времени уходит именно на настройку. Скрипт Ansible делает это за 5 минут.
Решил ещё автоматизировать установку и настройку Docker, начал, оценил объём задачи и взял уже готовый playbook https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/docker/, у которого 23 млн. загрузок. Он всё сделал за меня.
Ansible мне понравился, очень хорошо автоматизирует повторяющиеся задачи на серверах, жаль, что не знал раньше.
С этого и начались мои эксперименты с проверками и интеграцией в Zabbix. По совету ChatGPT я реализовал 3 функции:
/live, /ready, /status. /live показывает, что сервис просто «жив», /ready ещё делает запросы к БД и Redis, а /status при помощи специального плагина определяет нагрузку памяти и процессора и возвращает 503-ошибку, если пороговые значения превышены.Начал интегрировать мои наработки в Zabbix. А не получается, хотя и курс по Zabbix прошёл. Позвал коллегу, он объяснил, как настроить узел сети, источники данных, триггер, как правильно парсить JSON-ответ от сервера. Методы
/live и /status забраковал. Остался только метод /ready, и ответ из него я доработал в виде «ключ-значение», чтобы было удобней парсить. То, что удобно для программиста, для DevOps оказалось не очень. И вот настал ответственный момент, я «уронил» чат-бота, возникла «проблема» в Zabbix. И всё. А как настроить отправку сообщений email и в Telegram или мне сидеть и медитировать перед браузером? Коллега знал, но подзабыл. Я начал разбираться сам. Помогли вот эти видео: https://www.youtube.com/watch?v=zGqzOOA4OeM и https://www.youtube.com/watch?v=yKueieCKiBk и статья https://serveradmin.ru/nastroyka-opoveshheniy-zabbix-v-telegram/. Оказалось не сильно сложно, но уж больно заморочено. Неудивительно, что коллега точный алгоритм не помнил.
Я решил продолжить дальше и настроил мониторинг Asterisk лично для себя, т. к. сообщения об ошибках валяться в общий чат, а там что-то найти трудоёмко. Zabbix оказался сложнее, чем я думал.
Но по голосовому меню затея с отправкой звонков сразу в чат провалилась, сотрудники тупо не перезванивают. А это уже не техническая проблема, поэтому решили вернуть всё взад и создать новое меню, звонок сначала идёт на отдел, а потом, если не удалось дозвониться, в чат, как пропущенный звонок.
Решил, что хватит проходить курсы по Ansible, надо внедрять полученные знания в производство. Кто не знает Ansible — это ещё вид межгалактической связи в фантастических романах. Решил создать playbook (сценарий) для первоначальной настройки Debian. За основу взял вот эту статью https://r4ven.me/it-razdel/zametki/pishem-ansible-playbook-dlya-nachalnoj-nastrojki-linux-servera/. Для Ansible есть репозиторий, где уже находятся готовые playbook https://galaxy.ansible.com/ui/. Скачал один, посмотрел, что-то сильно сложно, решил сделать проще. Я ведь только настраиваю сервер под Debian. Но вот просто не получилось, Debian он очень разных версий от 10 до 13, и то, что работает в одной версии, не работает в другой. Но я всё-таки справился, вот мой сценарий https://github.com/orion55/ansible. Проверил на 5 серверах, вроде работает, но опять же это лично мои настройки. Чтобы смотреть Youtube, я использую сервис из 3 букв, о котором нельзя говорить. За последний год я переезжал на разные серверы раза три, и на первоначальную настройку Debian-сервера уходило в среднем 1 час. На этот сервер мало установить приложения firewall, fail2ban, tmux и т. д., ещё их необходимо настроить. Больше всего времени уходит именно на настройку. Скрипт Ansible делает это за 5 минут.
Решил ещё автоматизировать установку и настройку Docker, начал, оценил объём задачи и взял уже готовый playbook https://galaxy.ansible.com/ui/standalone/roles/geerlingguy/docker/, у которого 23 млн. загрузок. Он всё сделал за меня.
Ansible мне понравился, очень хорошо автоматизирует повторяющиеся задачи на серверах, жаль, что не знал раньше.
👍2
Решил проинтегрировать Asterisk и Bitrix24 через плагин Itgrix https://itgrix.ru/. Всё хорошо, но на FreeBSD он не работает. Мне понравилась фраза из документации: «Мучительно проходит установка на FreeBSD». Я даже написал в техподдержку, часть клиентов как-то настроила на FreeBSD, как разработчики не знают. Если хочется настроить на FreeBSD, настраивай. В результате плагин решил установить на виртуалку с Debian. Пока процесс идёт.
Для себя я сделал вывод: без практики все курсы и статьи остаются просто теорией. Настоящее понимание приходит только тогда, когда сталкиваешься с ошибками и ищешь выход самостоятельно. И пусть не всегда всё работает с первого раза, зато потом результат радует вдвойне. А значит, стоит продолжать пробовать новое, закреплять знания и превращать эксперименты в реальную пользу.
Для себя я сделал вывод: без практики все курсы и статьи остаются просто теорией. Настоящее понимание приходит только тогда, когда сталкиваешься с ошибками и ищешь выход самостоятельно. И пусть не всегда всё работает с первого раза, зато потом результат радует вдвойне. А значит, стоит продолжать пробовать новое, закреплять знания и превращать эксперименты в реальную пользу.
👍5👎1
Раз старое голосовое меню не пошло, надо реализовать новое. Когда думаешь о голосовом меню, кажется, что всё просто: сделал схему, прописал сценарии и готово. Но реальность совсем иная. Вместо стройной логики получаешь клубок переходов, бесконечные проверки и тонны тестов. Asterisk требует терпения, чат-бот в Битрикс24 добавляет новых задач, а Docker и Prisma превращают процесс в настоящее испытание. В итоге любое решение даётся через маленькую победу.
Начальник нарисовал потоковую диаграмму меню со множеством ветвлений и с хитрыми очередями с задержками. Смысл меню: если до сотрудника не дозвонились, то сообщение должно приходить в чат Битрикс24. Ни один звонок не должен пропасть. И ещё должен быть отчёт в Excel, сколько пришло звонков и сколько обработано.
Программирование голосового меню через DialPlan под Asterisk — это какое-то издевательство над программистом. Есть текстовый редактор nano с подсветкой синтаксиса и всё. Никаких линтеров, ни анализаторов, ничего.
То, что ты ошибся, знаешь в лучшем случае при запуске команды
Да и сам язык программирования DialPlan тот ещё кадр. Ну что сложного передать функцию с параметром? Например, надо вызвать функцию main-menu-busy с параметром menu-press-1. А нельзя. GotoIf не позволяет передавать параметры функциям, он может только их вызывать без параметров. Вот этот пример не работает.
Нужно вот так. Перейти на метку, и из неё через
Код стал напоминать «лапша»-код с многочисленными Goto.
Тестировал всю неделю голосовое меню, оказалось, достал весь офис звонками, но коллеги из соседнего молчали, как партизаны, а когда меня нашли, я перевёл телефоны для тестирования в беззвучный режим.
Но DialPlan — это только полбеды. Надо же ещё самого чат-бота запрограммировать. Неожиданно выползла библиотека Prisma https://www.prisma.io/, которая прекрасно работает на моём компьютере, но вот заставить работать её в Docker с минимальным набором зависимостей — задача ещё та. Я где-то день убил, пока выяснил, что ей нужно.
Проблема ещё в том, что с одним источником данных она работает легко и быстро, а у меня их два. Моя база sqlite и CDR-логи Asterisk в формате MySQL. И теперь всё в ручном режиме, т. к. она не понимает, что от неё просят.
Мне ещё миграции для sqlite необходимо применять перед запуском приложения, т. к. база данных — это просто файл. Я хорошо произвращался над Dockerfile, прежде чем это организовал.
Но сама Prisma оказалась тот ещё фуфель. Простые запросы получаются красиво и читаемо, как только пошла группировка, агрегирующие функции и более-менее сложная аналитика. Она, оказывается, такие запросы не делает, только raw-режим. И зачем мне такая ORM?
Посмотрел 2 лекции «Функциональное программирование» https://www.youtube.com/playlist?list=PLlb7e2G7aSpTDub2LFDVBvvjWj-53Gfuh. Курс, который хвалят за академичность и доскональность. Преподаватель-математик разбирает программирование на Haskell с точки зрения математики, всё доказывает через теоремы. За 2 лекции к программированию так и не приступили. Нафиг такой курс, который я не могу понять. Поищу попроще.
Начальник нарисовал потоковую диаграмму меню со множеством ветвлений и с хитрыми очередями с задержками. Смысл меню: если до сотрудника не дозвонились, то сообщение должно приходить в чат Битрикс24. Ни один звонок не должен пропасть. И ещё должен быть отчёт в Excel, сколько пришло звонков и сколько обработано.
Программирование голосового меню через DialPlan под Asterisk — это какое-то издевательство над программистом. Есть текстовый редактор nano с подсветкой синтаксиса и всё. Никаких линтеров, ни анализаторов, ничего.
То, что ты ошибся, знаешь в лучшем случае при запуске команды
dialplan reload. А чаще всего через звонок по телефону и чтение логов. Можешь запрограммировать любую чушь, и про ошибку узнаешь только минут через пять, когда дойдёшь до нужной ветки сценария. Напоминает экзамен Яндекса на доске. Алгоритм хороший, только не работает. Я оценил, оказывается, в JavaScript великолепные инструменты разработки, программировать в текстовом редакторе удовольствие ещё то.Да и сам язык программирования DialPlan тот ещё кадр. Ну что сложного передать функцию с параметром? Например, надо вызвать функцию main-menu-busy с параметром menu-press-1. А нельзя. GotoIf не позволяет передавать параметры функциям, он может только их вызывать без параметров. Вот этот пример не работает.
same => n, GotoIf($["${QUEUESTATUS}"="TIMEOUT"]?main-menu-busy,1(menu-press-1))Нужно вот так. Перейти на метку, и из неё через
Gosub вызвать функцию с параметром.same => n, GotoIf($["${QUEUESTATUS}"="TIMEOUT"]?start-nobody,1)
exten => start-nobody,1, Gosub(main-menu-busy,s,1(menu-press-1))
same => n, Hangup()Код стал напоминать «лапша»-код с многочисленными Goto.
Тестировал всю неделю голосовое меню, оказалось, достал весь офис звонками, но коллеги из соседнего молчали, как партизаны, а когда меня нашли, я перевёл телефоны для тестирования в беззвучный режим.
Но DialPlan — это только полбеды. Надо же ещё самого чат-бота запрограммировать. Неожиданно выползла библиотека Prisma https://www.prisma.io/, которая прекрасно работает на моём компьютере, но вот заставить работать её в Docker с минимальным набором зависимостей — задача ещё та. Я где-то день убил, пока выяснил, что ей нужно.
Проблема ещё в том, что с одним источником данных она работает легко и быстро, а у меня их два. Моя база sqlite и CDR-логи Asterisk в формате MySQL. И теперь всё в ручном режиме, т. к. она не понимает, что от неё просят.
Мне ещё миграции для sqlite необходимо применять перед запуском приложения, т. к. база данных — это просто файл. Я хорошо произвращался над Dockerfile, прежде чем это организовал.
Но сама Prisma оказалась тот ещё фуфель. Простые запросы получаются красиво и читаемо, как только пошла группировка, агрегирующие функции и более-менее сложная аналитика. Она, оказывается, такие запросы не делает, только raw-режим. И зачем мне такая ORM?
Посмотрел 2 лекции «Функциональное программирование» https://www.youtube.com/playlist?list=PLlb7e2G7aSpTDub2LFDVBvvjWj-53Gfuh. Курс, который хвалят за академичность и доскональность. Преподаватель-математик разбирает программирование на Haskell с точки зрения математики, всё доказывает через теоремы. За 2 лекции к программированию так и не приступили. Нафиг такой курс, который я не могу понять. Поищу попроще.
❤3
Зато начал смотреть курс «Kubernetes и Helm» от PurpleSchool, и он мне понравился. Там Kubernetes разбирать с самых азов и на простых примерах, пока всё просто и понятно. Ещё выяснил, что обозначает цифра 8 в сокращении k8s, это 8 пропущенных букв. Так слово Kubernetes писать короче. Я развернул при помощи Docker Desktop на своём компьютере кластер кубера и по курсу переношу в кластер простое приложение. Пока всё получается.
Всё это напомнило, что разработка редко бывает гладкой. Asterisk со своим DialPlan, капризная Prisma, Docker и новые для меня k8s — каждый шаг требовал времени, нервов и экспериментов. Но именно через эти пробы и ошибки приходит понимание: хаос можно приручить, а сложное сделать рабочим. В итоге остаётся не усталость, а чувство, что с каждым таким проектом я становлюсь сильнее как разработчик.
Всё это напомнило, что разработка редко бывает гладкой. Asterisk со своим DialPlan, капризная Prisma, Docker и новые для меня k8s — каждый шаг требовал времени, нервов и экспериментов. Но именно через эти пробы и ошибки приходит понимание: хаос можно приручить, а сложное сделать рабочим. В итоге остаётся не усталость, а чувство, что с каждым таким проектом я становлюсь сильнее как разработчик.
❤2
Иногда работа сисадмина напоминает не стройную инженерную систему, а череду маленьких приключений. Сегодня ковыряешься в коде, завтра упираешься в странности чужих API, послезавтра выясняешь, что офисный телефон «живет своей жизнью». Вот так и проходит мой рабочий день — то борьба с Excel, то эксперименты с телефонией, то погружение в Kubernetes.
Продолжаю программировать чат-бота, который делает отчёт о звонках. Отчёт создаю в Excel при помощи библиотеки ExcelJS https://www.npmjs.com/package/exceljs. Оказалось, создание отчёта — дело на редкость муторное, мало создать данные для отчёта. Их надо стилизовать, вывести в нужные ячейки, каждой таблице сделать заголовок и т. д. и т. п. Уйма времени ушло чисто на форматирование. Где же ты, ReactJS с шаблонными компонентами? Пообщался с нашими программистами, у них на отчёты в Excel у них тоже уходит уйма времени. Я как-то работу бэкендера представлял по-иному.
Но Excel-файл сгенерировал, но чтобы его отправить пользователю в Bitrix24, его нужно сохранить на общий диск и поделиться ссылкой с этого диска. Но загружать этот файл необходимо в определённую глубоко вложенную папку, а эту папку фиг найдёшь. Инструменты Bitrix24 сильно примитивные, получилась рекурсия в рекурсии. «Смерть Кощея на конце иглы, игла в яйце, яйцо в утке, утка в зайце, заяц в шоке».
Были и интересные случаи в телефонии. У коллеги SIP-телефон «булькал» при городских звонках. Оказалось, не тот кодек стоит по умолчанию. Необходимо было перестроить на G711аlaw. Я изменил, но он всё равно продолжал «булькать». Загрузил портянку настроек SIP этого телефона в ChatGPT, и он предложил изменить ряд параметров, до которых я бы сам не догадался в принципе. Провёл настройку, и ушло «бульканье». Я уже хотел телефон менять.
Ещё у коллеги перестал работать телефон, оказалось, выпал провод под столом, коллега активно отбивалась, что она ногой его вытащила. Пришли к версии, что пришли злоумышленники, залезли под стол, вытащили провод и ушли, а коллега ничего не делала.
Продолжаю изучать курс «Kubernetes и Helm». Количество абстракций зашкаливает. Но я так подумал, если система сложная, распределённая и отказоустойчивая, проще и не получится. Ещё оказывается у k8s есть дашбоард, но автор курса говорит, лучше всё ручками будет, меньше ошибок.
Снаружи может показаться, что работа однообразна: серверы, телефоны, код. Но на деле это бесконечная цепочка историй и задач, где каждая мелочь способна удивить. И чем глубже погружаюсь, тем яснее вижу, что в этом и есть суть профессии — уметь справляться с неожиданностями и находить в них повод для развития.
Продолжаю программировать чат-бота, который делает отчёт о звонках. Отчёт создаю в Excel при помощи библиотеки ExcelJS https://www.npmjs.com/package/exceljs. Оказалось, создание отчёта — дело на редкость муторное, мало создать данные для отчёта. Их надо стилизовать, вывести в нужные ячейки, каждой таблице сделать заголовок и т. д. и т. п. Уйма времени ушло чисто на форматирование. Где же ты, ReactJS с шаблонными компонентами? Пообщался с нашими программистами, у них на отчёты в Excel у них тоже уходит уйма времени. Я как-то работу бэкендера представлял по-иному.
Но Excel-файл сгенерировал, но чтобы его отправить пользователю в Bitrix24, его нужно сохранить на общий диск и поделиться ссылкой с этого диска. Но загружать этот файл необходимо в определённую глубоко вложенную папку, а эту папку фиг найдёшь. Инструменты Bitrix24 сильно примитивные, получилась рекурсия в рекурсии. «Смерть Кощея на конце иглы, игла в яйце, яйцо в утке, утка в зайце, заяц в шоке».
Были и интересные случаи в телефонии. У коллеги SIP-телефон «булькал» при городских звонках. Оказалось, не тот кодек стоит по умолчанию. Необходимо было перестроить на G711аlaw. Я изменил, но он всё равно продолжал «булькать». Загрузил портянку настроек SIP этого телефона в ChatGPT, и он предложил изменить ряд параметров, до которых я бы сам не догадался в принципе. Провёл настройку, и ушло «бульканье». Я уже хотел телефон менять.
Ещё у коллеги перестал работать телефон, оказалось, выпал провод под столом, коллега активно отбивалась, что она ногой его вытащила. Пришли к версии, что пришли злоумышленники, залезли под стол, вытащили провод и ушли, а коллега ничего не делала.
Продолжаю изучать курс «Kubernetes и Helm». Количество абстракций зашкаливает. Но я так подумал, если система сложная, распределённая и отказоустойчивая, проще и не получится. Ещё оказывается у k8s есть дашбоард, но автор курса говорит, лучше всё ручками будет, меньше ошибок.
Снаружи может показаться, что работа однообразна: серверы, телефоны, код. Но на деле это бесконечная цепочка историй и задач, где каждая мелочь способна удивить. И чем глубже погружаюсь, тем яснее вижу, что в этом и есть суть профессии — уметь справляться с неожиданностями и находить в них повод для развития.
👍8
Каждую неделю я записываю небольшие заметки о том, чем занимался и какие открытия сделал. Это помогает структурировать опыт и взглянуть на свои проекты со стороны. На этой неделе было всё: баги с датами, эксперименты с линтерами, автоматизация серверов и даже первый шаг в сторону Haskell. Ниже — мои наблюдения и выводы.
Всю неделю программировал чат-бота. Откровенно заколебался с тайм-зонами. У меня оказалось их три. В одной базе данных UTC, в другой Москва, а в самом чат-боте Тюмень. Работа с тайм-зонами в JavaScript реализована от слова «никак». По умолчанию даты не имеют тайм-зоны. Всё решается через сторонние библиотеки. И пока найдёшь ошибку, почему здесь работает, а здесь то работает, то не работает, можно поседеть.
Я долго мучался с eslint и prettier, так новый конфиг eslint и не победил. Он то алиасы TypeScript не видит, то декораторы. Посмотрел видео Михаила Непомнящего «Next.js 15 перешёл на Biome» https://www.youtube.com/watch?v=FBbywTFHbRU
и перешёл на Biome https://www.npmjs.com/package/@biomejs/biome. Это eslint и prettier в одном флаконе. И он мне это понравился, что не нужно отключил. Работает быстро, т. к. написан на Rust. Пакет рекомендую.
Загрузку файлов на сервер Bitrix24 я победил. Есть 4 варианта, как загружать файлы. Работает по факту только один. Надо файл представить в виде base64 и загрузить в нужный каталог, а чат-бот вернёт ссылку на файл.
Наконец добрался до сисадминской задачи. Поднимал Elastic Stack (ELK) Elasticsearch, Kibana & Logstash на VPS. Решил использовать мои наработки по Ansible. И они сработали на новом сервере. Неделя работы на автоматизацию и в результате 5 минут первоначальной настройки. Кроме того, перенёс файлы Docker на второй большой диск. В целом почти настроил, но не до конца.
Начал изучать Haskell. По бесплатному курсу «Функциональное программирование на языке Haskell» https://stepik.org/course/75/syllabus. Преподаватель тот же, что и у роликов на YouTube, которые я бросил смотреть. В этом курсе он каждое своё утверждение не доказывает как теорему, и это радует. Я в математике после ВУЗа больше не практиковался. Я, конечно, понимаю, что за всеми этими буквами и цифрами заключен большой смысл, но я его уже не понимаю.
Haskell — чисто функциональный язык программирования. И в нём главное — функция.
- Функциональное программирование позволяет создавать сложные функции через композиции.
- Функции передаются как параметры и могут быть получены и возращены.
- Композиции функций позволяют строить более сложные алгоритмы.
В объектно-ориентированном программировании другие особенности.
- Объект является основным элементом.
- Объекты могут содержать другие объекты, создавая иерархию.
Ключевое отличие между функцией и объектом — наличие состояния у объекта, у функции никакого состояния нет.
Функциональное программирование лучше подходит для программ, занимающихся вычислениями и обработкой данных. Объектно-ориентированное программирование ближе к реальному миру. Большинство кода написано на объектно-ориентированных языках. Увы, чисто функциональные языки не прижились. То, что сущность «пользователь» — это функция, большинство программистов принять не могут, а то, что это объект — легко.
Все эти разнородные задачи — от автоматизации серверов до философии функционального программирования — объединяет одно: практика. Я всё больше убеждаюсь, что рост программиста измеряется не только написанными строками кода, но и способностью искать решения в разных областях. А такие недели напоминают, что развитие всегда идёт параллельными треками — и это делает процесс интересным.
Всю неделю программировал чат-бота. Откровенно заколебался с тайм-зонами. У меня оказалось их три. В одной базе данных UTC, в другой Москва, а в самом чат-боте Тюмень. Работа с тайм-зонами в JavaScript реализована от слова «никак». По умолчанию даты не имеют тайм-зоны. Всё решается через сторонние библиотеки. И пока найдёшь ошибку, почему здесь работает, а здесь то работает, то не работает, можно поседеть.
Я долго мучался с eslint и prettier, так новый конфиг eslint и не победил. Он то алиасы TypeScript не видит, то декораторы. Посмотрел видео Михаила Непомнящего «Next.js 15 перешёл на Biome» https://www.youtube.com/watch?v=FBbywTFHbRU
и перешёл на Biome https://www.npmjs.com/package/@biomejs/biome. Это eslint и prettier в одном флаконе. И он мне это понравился, что не нужно отключил. Работает быстро, т. к. написан на Rust. Пакет рекомендую.
Загрузку файлов на сервер Bitrix24 я победил. Есть 4 варианта, как загружать файлы. Работает по факту только один. Надо файл представить в виде base64 и загрузить в нужный каталог, а чат-бот вернёт ссылку на файл.
Наконец добрался до сисадминской задачи. Поднимал Elastic Stack (ELK) Elasticsearch, Kibana & Logstash на VPS. Решил использовать мои наработки по Ansible. И они сработали на новом сервере. Неделя работы на автоматизацию и в результате 5 минут первоначальной настройки. Кроме того, перенёс файлы Docker на второй большой диск. В целом почти настроил, но не до конца.
Начал изучать Haskell. По бесплатному курсу «Функциональное программирование на языке Haskell» https://stepik.org/course/75/syllabus. Преподаватель тот же, что и у роликов на YouTube, которые я бросил смотреть. В этом курсе он каждое своё утверждение не доказывает как теорему, и это радует. Я в математике после ВУЗа больше не практиковался. Я, конечно, понимаю, что за всеми этими буквами и цифрами заключен большой смысл, но я его уже не понимаю.
Haskell — чисто функциональный язык программирования. И в нём главное — функция.
- Функциональное программирование позволяет создавать сложные функции через композиции.
- Функции передаются как параметры и могут быть получены и возращены.
- Композиции функций позволяют строить более сложные алгоритмы.
В объектно-ориентированном программировании другие особенности.
- Объект является основным элементом.
- Объекты могут содержать другие объекты, создавая иерархию.
Ключевое отличие между функцией и объектом — наличие состояния у объекта, у функции никакого состояния нет.
Функциональное программирование лучше подходит для программ, занимающихся вычислениями и обработкой данных. Объектно-ориентированное программирование ближе к реальному миру. Большинство кода написано на объектно-ориентированных языках. Увы, чисто функциональные языки не прижились. То, что сущность «пользователь» — это функция, большинство программистов принять не могут, а то, что это объект — легко.
Все эти разнородные задачи — от автоматизации серверов до философии функционального программирования — объединяет одно: практика. Я всё больше убеждаюсь, что рост программиста измеряется не только написанными строками кода, но и способностью искать решения в разных областях. А такие недели напоминают, что развитие всегда идёт параллельными треками — и это делает процесс интересным.
YouTube
Next.js 15 перешёл на Biome — пора ли отказаться от ESLint и Prettier?
Next.js 15 официально переходит с ESLint и Prettier на Biome — новый инструмент для линтинга и форматирования кода. 🚀
В этом видео я рассказываю:
- зачем Next.js сделал такой выбор;
- чем Biome отличается от ESLint и Prettier;
- реальные бенчмарки скорости…
В этом видео я рассказываю:
- зачем Next.js сделал такой выбор;
- чем Biome отличается от ESLint и Prettier;
- реальные бенчмарки скорости…
👍6
За короткий промежуток времени мне удалось прикоснуться к целому спектру задач: от настройки Click2Call в Asterisk и оптимизации Elastic Stack до запуска нового IVR и первых шагов в Kubernetes. Каждая история оказалась с неожиданными поворотами: техническими, организационными и даже человеческими. Этот опыт хочется зафиксировать и рассказать подробнее.
Пришла следующая задача. Пользователь кликнул на ссылку с номером телефона на сайте, и его телефон звонит и соединяет с абонентом, по ссылке которому он кликнул. Эта технология называется Click2Call (c2c).
На Asterisk эта технология реализуется при помощи технологии Asterisk Manager Interface (AMI). Смысл технологии простой: надо подключится к Asterisk через telnet и послать текстовый файл, и Asterisk выполнит команды из него.
Но реализация хитрая, при помощи текстового файла Asterisk позвонит пользователю, а вот чтобы соединить с клиентом, надо использовать context из DialPlan.
Отправку текстового файла можно реализовать через WebSocket и через них же получение ответа, что я и сделал, написав приложение на Typescript.
Я уже радостный хотел сдавать задачу, но была пара нюансов, которые я начал выяснять в Project Manager. Выяснил, то, что написано у меня в тех. задании и то, что имел в виду клиент, это две большие разницы. И моё решение нафиг никому не нужно. Но я его довёл до конца, выложил на хостинг. Может, когда-то кому-то и будет нужно. Т. к. подсистему телефонии в нашем приложении уже давно хотят переписывать. А я разобрался с технологией AMI, поэтому поводу напишу статью в блог.
Затем несколько дней я переносил Elastic Stack (ELK) на другой сервер. При помощи Elastic можно не только логи собирать, но и реализовывать полнотекстовый поиск. Поэтому решили сделать два сервера: один для программистов, другой для админов.
Первоначально, когда я настраивал ELK, я решил писать всё. Это «всё» оказалось горой ненужного мусора, всякие debug, трассировки и т. д. В результате свободное место заканчивалось за пару дней. Сейчас весь мусор остаётся на сервере, а на ELK идут информативные логи. Буду мониторить, что я настроил.
С понедельника вся фирма перешла на новое голосовое меню. Оказалось, уйма клиентов тупо набирают основной номер и не выбирают ни одну цифру из меню, сидят и ждут. Итак 3–4 раза. Им позвонили, оказываются, они ждут оператора. Ну нет у нас оператора, цифру надо нажимать. Они просто не слушают, что им говорят по телефону.
Или один клиент, ему обещал перезвонить инженер и не перезвонил в течение последующих 2-х минут, и он начал обзванивать всех, но только не менеджера, с которым работает. Уйма звонков, которые не ведут никуда. В результате недовольный клиент.
Я завершил курс по «Kubernetes и Helm». Теперь, если по шкале от 0 до 10, я знаю Kubernetes (k8s) на 0.1. Он реально огромный. Но курс понравился, хоть и сильно вводный. Автор сначала поднял фронтенд, бекенд и nginx локально. Этот вариант от docker compose отличается мало. А затем всё шаблонизировал через helm. Больше всего не понравилось, в самом k8s всё очень сильно завязано на пробелы в yaml-файлах. Дело в том, что helm код для yaml-файлов генерирует, и при добавлении лишних 2-х пробелов создаётся такая простыня с ошибками. Ощущение, что система умерла в муках и не воскреснет никогда.
Ещё, что не понравилось в k8s. Есть система хранения секретов (пароли, доступы и т. д.), по умолчанию она ничего не защищает. Просто все секреты кодирует в base64. Нет, это решает дополнительными плагинами, но по умолчанию дыра дырой.
Почему я решил изучать Kubernetes? У нас просто в фирме упорно ходят слухи по поводу светлого микросервисного будущего и облачного Kubernetes. Интуиция мне подсказывает, что это светлое будущее реализовывать буду именно я. Но пока есть время на подготовку.
Все эти задачи — от Click2Call до Kubernetes — показали мне простую истину: технологии редко работают «из коробки», а ещё реже совпадают с ожиданиями бизнеса. Но именно в этих несовпадениях и рождается опыт. Каждый новый шаг, даже если он кажется бесполезным, открывает дверь к пониманию глубже, чем любой учебник или курс.
Пришла следующая задача. Пользователь кликнул на ссылку с номером телефона на сайте, и его телефон звонит и соединяет с абонентом, по ссылке которому он кликнул. Эта технология называется Click2Call (c2c).
На Asterisk эта технология реализуется при помощи технологии Asterisk Manager Interface (AMI). Смысл технологии простой: надо подключится к Asterisk через telnet и послать текстовый файл, и Asterisk выполнит команды из него.
Но реализация хитрая, при помощи текстового файла Asterisk позвонит пользователю, а вот чтобы соединить с клиентом, надо использовать context из DialPlan.
Отправку текстового файла можно реализовать через WebSocket и через них же получение ответа, что я и сделал, написав приложение на Typescript.
Я уже радостный хотел сдавать задачу, но была пара нюансов, которые я начал выяснять в Project Manager. Выяснил, то, что написано у меня в тех. задании и то, что имел в виду клиент, это две большие разницы. И моё решение нафиг никому не нужно. Но я его довёл до конца, выложил на хостинг. Может, когда-то кому-то и будет нужно. Т. к. подсистему телефонии в нашем приложении уже давно хотят переписывать. А я разобрался с технологией AMI, поэтому поводу напишу статью в блог.
Затем несколько дней я переносил Elastic Stack (ELK) на другой сервер. При помощи Elastic можно не только логи собирать, но и реализовывать полнотекстовый поиск. Поэтому решили сделать два сервера: один для программистов, другой для админов.
Первоначально, когда я настраивал ELK, я решил писать всё. Это «всё» оказалось горой ненужного мусора, всякие debug, трассировки и т. д. В результате свободное место заканчивалось за пару дней. Сейчас весь мусор остаётся на сервере, а на ELK идут информативные логи. Буду мониторить, что я настроил.
С понедельника вся фирма перешла на новое голосовое меню. Оказалось, уйма клиентов тупо набирают основной номер и не выбирают ни одну цифру из меню, сидят и ждут. Итак 3–4 раза. Им позвонили, оказываются, они ждут оператора. Ну нет у нас оператора, цифру надо нажимать. Они просто не слушают, что им говорят по телефону.
Или один клиент, ему обещал перезвонить инженер и не перезвонил в течение последующих 2-х минут, и он начал обзванивать всех, но только не менеджера, с которым работает. Уйма звонков, которые не ведут никуда. В результате недовольный клиент.
Я завершил курс по «Kubernetes и Helm». Теперь, если по шкале от 0 до 10, я знаю Kubernetes (k8s) на 0.1. Он реально огромный. Но курс понравился, хоть и сильно вводный. Автор сначала поднял фронтенд, бекенд и nginx локально. Этот вариант от docker compose отличается мало. А затем всё шаблонизировал через helm. Больше всего не понравилось, в самом k8s всё очень сильно завязано на пробелы в yaml-файлах. Дело в том, что helm код для yaml-файлов генерирует, и при добавлении лишних 2-х пробелов создаётся такая простыня с ошибками. Ощущение, что система умерла в муках и не воскреснет никогда.
Ещё, что не понравилось в k8s. Есть система хранения секретов (пароли, доступы и т. д.), по умолчанию она ничего не защищает. Просто все секреты кодирует в base64. Нет, это решает дополнительными плагинами, но по умолчанию дыра дырой.
Почему я решил изучать Kubernetes? У нас просто в фирме упорно ходят слухи по поводу светлого микросервисного будущего и облачного Kubernetes. Интуиция мне подсказывает, что это светлое будущее реализовывать буду именно я. Но пока есть время на подготовку.
Все эти задачи — от Click2Call до Kubernetes — показали мне простую истину: технологии редко работают «из коробки», а ещё реже совпадают с ожиданиями бизнеса. Но именно в этих несовпадениях и рождается опыт. Каждый новый шаг, даже если он кажется бесполезным, открывает дверь к пониманию глубже, чем любой учебник или курс.
Знаете, что такое Click2Call? Это когда нажал на номер на сайте — и твой телефон уже звонит нужному человеку. Удобно, правда? Я решил разобраться, как эта штука работает на Asterisk, и оказалось, что всё не так уж сложно, если знать, куда копнуть.
Я написал статью в блоге, где подробно показал, как настроить
Хочется посмотреть все детали и попробовать самому? Тогда заглядывайте в блог https://infoblog72.ru/moi-proektyi/click2call-na-asterisk-ot-idei-do-rabochego-sczenariya.html — там полная версия с примерами и кодом.
Я написал статью в блоге, где подробно показал, как настроить
manager.conf, проверить подключение через telnet и собрать рабочий AMI-скрипт для звонка. Там же есть пример контекста в extensions.conf и кусок кода на TypeScript, который отправляет команды прямо на сервер. Короче, пошаговый разбор от идеи до живого сценария, который реально работает.Хочется посмотреть все детали и попробовать самому? Тогда заглядывайте в блог https://infoblog72.ru/moi-proektyi/click2call-na-asterisk-ot-idei-do-rabochego-sczenariya.html — там полная версия с примерами и кодом.
👍2