На правах рекламы

Используя собственные наработки, в краткий срок создаем качественные и современные веб приложения для автоматизации любых бизнес-процессов. Системы взаимодействия с клиентами (CRM), документооборота, складской учет, интернет-магазины, службы доставки, биллинговые системы, сервисы на базе телефонии (вплоть до уровня распределённых колл-центров) и многое другое.

Интеграция с социальными сетями, генераторы отчетов, готовое SDK для мобильных приложений и другие нужные функции работают «из коробки».

Не Гербалайф PHP!

В работе используем Blank, Go, Node.js, React.js, Angular.js, MongoDB, ClickHouse, PostgreSQL и другие современные технологии.

В зависимости от проекта, возможно применение гибкой методологии разработки по Agile/Scrum.

Обращайтесь по контактам в меню.

Двойной API для асинхронных функций

Когда пишешь публичные асинхронные методы на JavaScript, желательно придерживаться двух простых правил:

  1. Если метод может вернуть ошибку в колбэке, то ошибка должна идти первым аргументом. Часто, даже если метод никогда не возвращает ошибку, первым аргументом передают null для того, чтобы унифицировать все асинхронные вызовы;
  2. Если в метод не передана колбэк-функция, то метод должен вернуть Promise.


Читать целиком


Мой подход к тестированию. Часть первая

Сколько бы «в прошлой жизни» я не пытался заставить себя писать тесты, получалось довольно плохо. Точнее, оно получалось, но как-то всё хромало, как у Винни-Пуха правильнописание. Казалось, что быстрее и проще потыкать в браузере, или клавиши понажимать, проверить, а дальше просто будет работать.

По мере усложнения создаваемых приложений, логика становилась всё замудрённее, времени на такое вот «протыкивание» стало уходить всё больше. Каким-то своим отдельным путём я пришёл к тому, что стал писать мелкие отдельные файлы, которые выполняли некоторые функции из проекта и проверяли вывод на корректность. Таким образом, я для себя открыл юнит тестирование. Проблема была в том, что тесты необходимо поддерживать в актуальном состоянии, модифицировать вместе с основным кодом, а ведь кажется, что есть гораздо более важные задачи на данный момент.

В мае 2016 года было принято решение начать писать тесты в принудительном порядке, тем более, что исходные тексты новой версии нашей платформы Blank мы открыли сразу, а в грязь лицом ударить не хотелось.


Читать целиком


Версионирование go программ

Читая новости на отличном ресурсе по Go, наткнулся на статью Дейва Чени Гоферы, тэгируйте свои релизы. Вкратце, там говорится о полезности тэгов к комитам пакета в git репозитории, а так же о том, что при указании версии, стоит обратить внимание на формат SemVer 2.0.0.

Что самое интересное, статья написана 24 июня, примерно в то же время, может быть, днём ранее, я написал инструмент для себя, который позволяет автоматизировать процесс изменения патч-версии приложений, написанных на Go.


Читать целиком


Прокаченный таймер на Go

У языка Go шикарная стандартная библиотека, инструменты на все случаи жизни, при этом достаточно лаконичные. Например, рассмотрим отличный пакет time. За всё время работы с Go, мне всего лишь дважды приходилось расширять его возможности.

Первый раз, около года назад, понадобилось строковое представление времени и периодов на русском языке, что привело к созданию пакета russian-time. Он не очень красивый, создан на скорую руку, потому не буду на нём останавливаться.

Второй инструмент мне кажется более интересным. Предпосылкой к созданию этого небольшого пакета, была необходимость контроля времени выполнения скриптов во встроенном интерпретаторе JavaScript Google V8. Так уж повелось, что JavaScript, как правило, характеризуется асинхронным поведением, что несколько затрудняло выполнение поставленной задачи. Одним из компонентов решения должен был стать таймер, который можно приостанавливать на неопределённое время, а после запускать снова с момента остановки. Так появился timer.


Читать целиком


go-logger – простой и информативный логгер для Go

Не смотря на всё многообразие существующих логгеров для Go, как-то не удалось подобрать удобный и подходящий для меня. Хотелось иметь инструмент, похожий на те, какими пользовался в других языках. Если хочешь сделать что-то хорошо, сделай это сам.


Читать целиком


Amigo – лучший друг Golang и Asterisk

Начиная писать свой первый Peach Dialer, я выбрал язык, который довольно хорошо знал, благо работал с ним с 1999 года — PHP. Меня не смущало, что он, в принципе, не предназначен для создания долгоживущих процессов, но то, что получилось в итоге, работает по несколько месяцев и радует своих владельцев.

Потом пошла мода на Websocket, который захотелось применить в интерфейсе, а PHP в то время не очень-то умел с ними работать (может, и сейчас не умеет). Я обратил внимание на node.js. Классная штука, любовь на века, подумал я, но вскоре захотелось большего.

Бо́льшим для меня стал Go — язык, совмещающий скорость и удобство деплоя компилируемых языков с простотой разработки, свойственной интерпретируемым языкам. К сожалению, разработанных библиотек надлежащего качества и с ожидаемым функционалом для взаимодействия с Asterisk в то время не было. Были какие-то начинания, но не доведённые до конца.

Итак, по сусекам поскребя, да по амбару пометя́, испёк я Amigo — удобную библиотеку для работы с астериском посредством AMI протокола.


Читать целиком


Шаблонизатор экселя для Go

В процессе работы над платформой Blank, возникла задача генерации документов. Так как платформа предполагает очень широкое применение, очень не хотелось формировать документы полностью программно. Нужно дать возможность интеграторам и администраторам системы удобно создавать шаблоны, на основе которых, в дальнейшем, будут формироваться различные документы.

Сервер написан на Go, поэтому первым делом я принялся изучать что уже придумано умными людьми для решения подобных задач. Оказалось, что совсем не много. Обсуждения, в основном, скатываются в область — есть решения на Яве, используйте их. Неее, не для того мы на Go пишем, чтобы за собой Яву тянуть.


Читать целиком


Умный колбэк

В настоящее время сложно предложить клиентам что-то действительно уникальное, конкурентная борьба переходит в иные плоскости. Сегодняшние клиенты довольно разборчивы. Цена продукта уже не всегда играет решающую роль, покупатели ценят сервис.

Естественно, многие компании придумывают различные способы привлечения и удержания клиентов. Рассмотрим вариант, как правильно настроенный на принятие входящих звонков телефонный сервис поможет не терять потенциальных и удерживать существующих клиентов.


Читать целиком


Инкремент переменной в дайлплане Астериска

Если требуется реализовать какой-то счетчик в дайлплане, удобно использовать переменную канала. Но просто так изменить её значение, прибавляя единицу, не получится.


Читать целиком


Глубокий дебаг астериска

Иногда можно потерять довольно много времени, пытаясь в консоли астериска отловить ошибку выполнения agi скрипта, или просто внешнего приложения, запускаемого из дайлплана. Есть один способ, который в документации в явном виде не описан, но очень помогает. Мы запустим asterisk в режиме, похожем на монопольный в , при этом будем видеть в его консоли все предупреждения и ошибки.


Читать целиком