• Мы не удержались и тоже сделали SDK для мессенджеров: Web, Android и iOS


      Вообще мы в Voximplant занимаемся голосовой автоматикой. Принять звонок с сотового телефона, запустить JavaScript сценарий клиента – там пара тысяч строк логики что с этим звонком делать, включая исходящие на веб-браузеры и мобильные приложения – вот эта вся история. Отдельная история – видео. Образование, телемедицина, совещания. Тот же SIP, те же кодеки, только данных передается в сотню раз больше. При этом браузеры любят зависать и падать, когда им не нравится полученный с другой стороны WebRTC SDP пакет, а мы их от этого отучаем.

      Но, как оказалось, голоса и видео клиентам мало: “Мы не хотим сами писать чатик, уже два раза все переписывали и три питониста уволилось. Дайте нам стек unified communications, чтобы всё было на одной платформе, и мы не парились”. И на прошлой неделе мы стали этим самым “Unified Communications”. Теперь на нас можно собрать “Skype for Web” целиком: не только голосовые и видеозвонки, но и обмен сообщениями. Под катом я хочу показать как работает сделанный нами мессаджинг и, надеюсь, получить от вас фидбек – насколько хорошим получилось API и все ли с помощью него можно сделать?
      Читать дальше →
    • Дайджест свежих материалов из мира фронтенда за последнюю неделю №276 (14 — 20 августа 2017)

        Предлагаем вашему вниманию подборку с ссылками на новые материалы из области фронтенда и около него.

        Читать дальше →
      • Liscript — web REPL: поцелуи, велосипеды и экскаваторы



          Некоторое время назад я написал интерпретатор лиспоподобного языка, который назвал Liscript. Опубликовал несколько статей на Хабре, посвященных особенностям реализации ядра, TCO, GUI, REPL-ботов и т.п. Недавно добавил web-интерфейс REPL-у (ссылка в конце статьи).

          При чем здесь поцелуи и экскаваторы? Думаю, большинству известны такие аббревиатуры, как KISS (keep it simple stupid — делай это проще, дурачок), YAGNI (You ain't gonna need it — Вам это не понадобится), а также высказывания людей разной степени великости про архитектурных астронавтов, «все должно быть сделано так просто, насколько возможно, но не проще», и т.п.

          Допустим, перед вами стоит задача — выкопать яму. Какие есть варианты решения? Взять лопату и выкопать самому — дешево и сердито, но долго и возможно неоптимально (зависит от вашего уровня владения лопатой и размеров ямы). Отдать на аутсорс таджикам (не будем рассматривать здесь этот вариант, хотя я должен был его упомянуть). Взять экскаватор — быстро и эффективно, но затратно: бензин/аренда, плюс не факт, что он проедет в вашу садовую калитку, значит надо сносить/восстанавливать забор и т.д. Также, необходимо определиться с моделью (порой из 100500 вариантов), а если вы будете управлять им самостоятельно, надо разобраться во всех его рычагах и педалях.

          Разумеется, если вы — профессиональный экскаваторщик, копаете по 200 ям за день, или вы стремитесь им стать, а изначальная задача (вырыть яму) нужна вам не сама по себе, а как тренировка или демонстрация ваших умений, тогда выбор очевиден (остается разве что вопрос модели). Но даже профессионал возьмет лопату, сажая цветы.

          В общем, про выбор инструментов под задачи, и конкретные (подозреваю, что спорные) решения, которые я выбирал в процессе реализации проекта, под катом.
          Читать дальше →
        • Edge ненавидит ваши атрибуты

          Сказ о том, как мы бездумно использовали на проекте бойлерплейт с целым боекомплектом зависимостей, которыми никто не пользовался, как нам потом это акнулось, когда потребовалась поддержка Edge, и как мы героически починили то, что, по факту, сами и поломали.
          Нет, это слишком длинно.
          Сказ о том, что все браузеры — атрибутофобы, а некоторые особенно.


          Читать дальше →
        • Новые функции в Laravel 5.5

          • Перевод

          Laravel 5.5
          Новый релиз Laravel 5.5 станет релизом долгосрочной поддержки (Long Term Support, LTS). Это значит, что он будет получать правки багов в течение 2х лет, а обновления безопасности — в течение 3х. Таким же был релиз Laravel 5.1, но его двухгодичный срок правок подходит к концу в этом году. Давайте посмотрим без лишней суеты, что нас ждет в новой версии.

          Читать дальше →
        • Mountebank: гибкое мокирование web API

          image Когда речь заходит о разработке современных IT-систем, вопрос мокирования внешних зависимостей всегда идет где-то рядом. Внешний сервис может быть недоступен на этапе разработки, либо его функционал разрабатывается параллельно и на него нельзя полагаться. Особенно остро этот вопрос встает на этапе написания автотестов, ведь проверять нужно не только штатное поведение вашей системы, но и исключительные случаи: недоступность внешнего сервиса, случаи когда внешний сервис отвечает ошибкой и так далее.

          Даже если вам повезло и ваш продукт имеет минимум зависимостей от внешних сервисов, скорее всего внутри он разбит на компоненты (классика жанра — backend/frontend), которые можно и нужно тестировать по отдельности. Это значит, что внешней зависимостью уже является api соседнего компонента, команда разработки которого совсем не горит желанием предоставлять вам инструменты для управления его состоянием.

          По моим наблюдениям команды тестирования предпочитают ограничиться самыми базовыми кейсами автотестов, объясняя это как-раз невозможностью переопределить поведение внешней системы.

          Решить эту проблему может мокирование API внешних систем.

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

          В данной статье я опишу Mountebank: инструмент, который позволяет быстро и очень гибко мокировать API прямо из автотестов без необходимости писать свой веб-сервис.

          Возможности mountebank'а:

          • мокирование API на протоколах tcp, http, https, smtp;
          • мокирование неограниченного количества API одновременно;
          • гибкое переопределение логики mock-API прямо во время тестов используя конфигурационный API mountebank'a;

          Читать дальше →
          • +18
          • 2,8k
          • 2
        • Как мы делаем справку для Renga

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

            В этой статье я, технический писатель Renga Software Анастасия Тян, расскажу, от чего мы отталкивались в начале разработки справки для BIM-системы Renga и к чему в итоге пришли.

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



            С самого начала разработки Renga было понятно, что нам необходима современная онлайн-справка. Также было принято решение, что мы не будем отказываться от оффлайн-справки в формате CHM, чтобы пользователи могли к ней обращаться без подключения к интернету и не тонуть в ворохе html-файлов.
            Читать дальше →
          • Redux store: Расширение по «горизонтали»

            • Tutorial
            Redux Когда приложение, использующее Redux, разрастается до достаточно больших размеров, количество состояний увеличивается многократно. Для разделения редьюсеров на логические единицы применяется подход комбинирования их с помощью combineReducers. Данное решение позволяет расширить store по «вертикали». Но бывают случаи, когда данного разделения может быть недостаточно. Например, один из уровней несет в себе составную логику, которую тоже было бы неплохо разделить (или как говорил один из известных людей: «Ухлубить!»). Но такого подхода нет в API Redux. И поиск решения данного вопроса так же ничего не дал (может плохо искал). Поэтому я разработал свой подход расширения по «горизонтали» Redux Store.

            Хочу Вас ознакомить со своим проектом, который позволяет осуществить данный подход.

            Использование


            1) Сначала, на уровне редьюсера первого уровня, подключаем саму библиотеку:

            import {stateCombine, runCombine, getInitialState} from "redux-combine-deep-props";
            Читать дальше →
          • Бинарный поиск в JavaScript. Практический пример

            • Перевод
            • Tutorial
            image

            Что такое бинарный поиск?


            Когда нужно выполнить поиск в массиве, простейшим способом может быть использование indexOf() или, возможно, цикла for(). Любой из этих способов будет начинать перебирать массив начиная с начала и переходить по каждому элементу массива до тех пор, пока не будет найдено нужное значение.

            Теперь сравним это с бинарным поиском.

            Бинарный поиск позволяет выполнять поиск в отсортированном массиве путем многократного разбиения массива пополам.
            Читать дальше →
          • Непрерывная интеграция/внедрение приложения Symfony с помощью docker-compose и GitLab CI

            • Tutorial

            В статье я поделюсь своим опытом автоматизации всего процесса разработки приложения Symfony с нуля от настройки инфраструктуры до деплоя в production. От development- и до production-окружения для запуска приложения будет использоваться docker-compose, а все процедуры непрерывной интеграции/внедрения будут запускаться через GitLab CI/CD Pipelines в docker-контейнерах.


            Подразумевается, что вы знакомы с docker и docker-compose. Если нет или вы не знаете как его установить, я подготовил инструкцию по подготовке локального окружения разработчика. Фактически, для работы над приложением потребуется только Docker, VirtualBox и, опционально, Yarn.

            Читать дальше →
          Самое читаемое