Pull to refresh
0
0
Жандос @jandosul

Пользователь

Send message

WebRTC или как я научил нашу CRM звонить на телефоны

Reading time7 min
Views35K
Компания, в которой мне довелось работать, занимается продажей услуг по интернету. Каждое утро дежурная смена разбирает общий стек накопившихся заявок и начинается обзвон клиентов для уточнения заказов. В течение дня операторы еще и принимают входящие звонки. До начала моей затеи они использовали для звонков такой десктопный SIP-клиент:



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

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

Возникла идея объединить в одной системе и базе данных всю внутреннюю работу и звонки. Я долго допиливал нашу CRM с функцией встроенной звонилки c записью разговоров.
Для реализации звонков рассмотрел ряд технологий и пришел к выводу, что их не так уж и много. Нашлась пара опенсорсных и коммерческих реализаций, а так же несколько SAAS сервисов, которые не подходили в силу внутренних политик безопасности — обрабатывать звонки через собственный сервер.

В начале пытался использовать sipml5:

image
Читать дальше →

Получаем бесплатный SSL сертификат

Reading time4 min
Views517K
Привет, хабр!

О StartSSL я узнал от небезызвестного lissyara, в связи с чем ему очень благодарен.

Для начала расскажу, что же за зверь это. Как известно, SSL сертификаты выдаются центрами сертификации, чьи корневые сертификаты хранятся в хранилище сертификатов браузера\ОС (либо другого ПО, использующего SSL). Цена на большинство сертификатов зашкаливает, и платить приходится за каждый сертификат. Но у StartSSL весьма интересный подход — сами сертификаты у них бесплатные, вы платите только за проверку вашей личности.

Так же не может не радовать наличие русскоязычной поддержки.
Читать дальше →

Организованный фриланс. Часть 1

Reading time5 min
Views66K
В данной статье я хотел бы поделиться собственным опытом создания компании, не обремененной месторасположением. Лично мы называем это организованный фриланс.

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

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

В-третьих, вся работа выполняется сдельно, существуют премии, бонусы, но не оклады, что заставляет участников команды быть заинтересованными в высоких результатах, в больших объемах работы.
Читать дальше →

Замолвим слово об отладке и профилировании [PHP]

Reading time5 min
Views40K
Все идет от лени. Вы получили чужой очень большой проект в котором нужно сделать небольшие правки, или же написали скрипт и сразу не очевидно, что в нем еще требует оптимизации. Как быть? Читать и анализировать код, выводить каждый шаг на экран или в файл (var_dump() и т.д.) не всегда эффективно, ведь можно воспользоваться средствами отладки, которых на сегодняшний день очень много. Кратко перечислю часто встречающиеся…
Читать дальше →

BDD-разработка на django

Reading time6 min
Views17K
Программисты очень по разному относятся к тестированию, и многие не любят писать тесты. Процесс TDD же для новичков не особенно понятен — ведь приходится вместо функционала программы писать вначале тест, который его проверяет, то есть количество работы увеличивается. Однако со временем приходит осознание того, что автоматическое тестирование необходимо. К примеру, возьмем процесс разработки даже несложного проекта на django, пока в проекте пара вьюх и моделек все просто. Когда приложение обрастает функциями, внезапно обнаруживается, что совершать такое тестирование все сложнее — кликов больше, надо вносить какие-то данные и т.д., вот тут-то и на помощь приходит behavior-driven development (BDD).

image

Я хочу рассказать о BDD на примере создания примитивного приложения — рейтинга сайтов. Идея тривиальна — на странице отображается список сайтов, пользователь голосует за сайт, сайт поднимается в рейтинге и соответственно изменяет положение на странице.
Читать дальше →

Python-digest #20. Новости, интересные проекты, статьи и интервью [23 марта 2014 — 30 марта 2014]

Reading time3 min
Views9.2K
Очередной выпуск новостей о python и близлежайших технологиях, пусть и с суточным опозднаием — прибыл. Сегодня о REST, тестировании производительности, машинном обучении, внутренностях __del__ и еще много вего интересного

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

Читать дальше →

Памятка по составлению ИТ-бюджета

Reading time4 min
Views63K

Лучше один раз день потерять, а потом за 5 минут все согласовать




Формирование бюджета и обоснование затрат на ИТ — достаточно простая процедура, которая позволяет руководству компании увидеть выгоды инвестирования в технологии, а техническим специалистам разделять ответственность за состояние ИТ-инфраструктуры с руководством.

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

Планирование бюджета на ИТ можно разделить на три этапа:
Читать дальше →

Серьезное проектирование серьезного магазина. Часть 2. Модули интернет-магазина

Reading time15 min
Views80K
В прошлый раз мы написали довольно популярную статью: «Серьезное проектирование серьезного магазина. Часть 1. Исследования», эта статья её логическое продолжение. В этой статье и в последующих мы опишем почти 60 функциональных модулей топовых интернет-магазинов мира, а также подробно разберем интерфейс многих страниц.

Главная страница интрнет-магазина в axure
Читать дальше →

Тонкости благополучного git-merge

Reading time8 min
Views374K

Вступительное слово


Считается, что «киллер фичей» СКВ Git является легковесное ветвление. Я ощутил это преимущество в полной мере, ведь я перешел на Git с SVN, где ветвление было достаточно дорогим процессом: для создания ветки нужно было скопировать весь рабочий каталог. В Git все проще: создание ветки подразумевает лишь создание нового указателя на определенный коммит в папке .git/refs/heads, который является файлом с 40 байтами текста, хешем коммита.

Основными командами пользовательского уровня для ветвления в Git являются git-branch, git-checkout, git-rebase, git-log и, конечно же, git-merge. Для себя я считаю git-merge зоной наибольшей ответственности, точкой огромной магической энергии и больших возможностей. Но это достаточно сложная команда, и даже достаточно длительный опыт работы с Git порой бывает недостаточным для освоение всех ее тонкостей и умения применить ее наиболее эффективно в какой-либо нестандартной ситуации.

Попробуем же разобраться в тонкостях git-merge и приручить эту великую магию.

Здесь я хочу рассмотреть только случай благополучного слияния, под которым я понимаю слияние без конфликтов. Обработка и разрешение конфликтов — отдельная интересная тема, достойная отдельной статьи. Я очень рекомендую так же ознакомиться со статьей Внутреннее устройство Git: хранение данных и merge, содержащей много важной информации, на которую я опираюсь.
Читать дальше →

Видеонаблюдение загородом посредством 3G интернета

Reading time8 min
Views117K
Появилась такая задача: Установить видеонаблюдение, в 15 км от города, где доступен только gprs интернет.
Условия:
  • Камерами можно будет управлять через интернет
  • Ограниченный бюджет
  • В городе есть 3G интернет но в области нет.
  • Сотовые операторы не дают «Белый и статический ip адрес».
  • Другого интернета нет.


Что бы решить данную задачу я решил построить такую сеть.
Взять самый дешевый сервер VDS. Недорогой роутер TP-LINK MR 3420, 3G модем от beeline, ip камеру. И построить такую сеть как на схеме.
Суть идеи такова: На сервере поднимается openvpn сервер, на роутере поднимается openvpn клиент, далее объединяем локальную сеть с сетью openvpn. Затем пробрасываем необходимые порты на сервере.


Читать дальше →

Автоматизация складских процессов интернет-магазина: опыт Аудиомании — Часть 2

Reading time6 min
Views27K


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

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

Читать дальше →

Автоматизация складских процессов интернет-магазина: опыт Аудиомании — Часть 1

Reading time7 min
Views41K


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

Читать дальше →

Простая сборка виртуальных машин с помощью PuPHPet

Reading time8 min
Views37K

Создание и управление средами разработки расстраивает вас, замедляет работу или отвлекать вас от разработки? У вас возникают трудности из-за того, что ваше локальное окружение и окружение при деплое отличаются? Если это так, у меня есть для вас решение — PuPHPet!

Введение


Я не могу с уверенностью сказать за вас, но одна из моих любимых мозолей* в разработке — это окружение, будь то создание и поддержание его для различных проектов с различными потребностями, обеспечение взаимодействия команды разработчиков, (особенно, распределенной), или настройка сред для разработки, тестирования и боевого окружения. Все это может быть трудоемкой задачей, особенно когда выполняется вручную.

В зависимости от требований руководства или клиентов разнообразие вариантов выбора может вогнать в депрессию. Все они могут тянуть в разные стороны (и тянут!), зачастую одновременно.
Читать дальше →

Делаем вебсокеты на PHP с нуля. Часть 2. IPC

Reading time5 min
Views39K
После написания моей предыдущей статьи Делаем вебсокеты на PHP с нуля я понял, что у сообщества есть некоторый интерес к поднятой мною теме.

В прошлой статье я обещал, что опишу:
  • запуск нескольких процессов для обработки соединений
  • межпроцессное взаимодействие
  • разделение процессов мастер-воркер
  • проксирование вебсокетов с помощью nginx
  • запуск из консоли
  • интеграция с вашим фреймворком на примере yii
  • демонстрация


И, как обычно, — получившийся код и ссылка на демонстрационный чат в конце статьи.
Читать дальше →

Использование EXPLAIN. Улучшение запросов

Reading time10 min
Views191K
Когда вы выполняете какой-нибудь запрос, оптимизатор запросов MySQL пытается придумать оптимальный план выполнения этого запроса. Вы можете посмотреть этот самый план используя запрос с ключевым словом EXPLAIN. EXPLAIN – это один из самых мощных инструментов, предоставленных в ваше распоряжение для понимания MySQL-запросов и их оптимизации, но печальным фактом является то, что многие разработчики редко его используют. В данной статье вы узнаете о том, какие данные предлагает EXPLAIN на выходе и ознакомитесь с примером того, как использовать его для оптимизации запросов.
Читать дальше →

Chef за 21 день. Часть третья. Chef и AWS

Reading time13 min
Views16K
Здравствуй, хабраюзер. Вот и подоспела третья часть моей статьи, которая подытожит цикл (часть 1 и часть 2) статей для начинающих. Эта часть будет посвящена конкретному примеру применения Chef в облаке Amazon. Как я уже упоминал – это достаточно популярный сценарий. Для простоты понимания, будет рассмотрен случай с двумя ec2-instance (виртуальные сервера Amazon), один из которых будет выполнять роль Chef-сервера, а второй – узла.

AWS и Chef


Сразу же уточню, что запускать instance мы будем используя AWS CloudFormation. Можно было бы, конечно, запустить и управлять ними вручную, но какой смысл в такой автоматизации?
Читать дальше →

Обработка входящих заявок, опыт небольшой веб-студии

Reading time3 min
Views34K
Мы — небольшая веб-студия, но и у нас, нет-нет да и потеряется входящая заявка от клиента или застрянет где-нибудь в почте между сотрудниками. Я расскажу как мы решили задачу работы с заявками. Скажу сразу, это простое решение — в статье не будет про CRM которая интегрируется с ip-телефонами, вычисляет день рожденья клиента по фотографии или ходит на встречи вместо менеджера, представители крупных интернет-компаний вряд ли найдут здесь что-то интересное.

В нашем случае обработкой входящих заявок на разных этапах занимаются два человека — директор в моем лице и менеджер.

Почему мы не используем CRM?
Читать дальше →

Как работает yield

Reading time6 min
Views728K
На StackOverflow часто задают вопросы, подробно освещённые в документации. Ценность их в том, что на некоторые из них кто-нибудь даёт ответ, обладающий гораздо большей степенью ясности и наглядности, чем может себе позволить документация. Этот — один из них.

Вот исходный вопрос:
Как используется ключевое слово yield в Python? Что оно делает?

Например, я пытаюсь понять этот код (**):
def _get_child_candidates(self, distance, min_dist, max_dist):
    if self._leftchild and distance - max_dist < self._median:
        yield self._leftchild
    if self._rightchild and distance + max_dist >= self._median:
        yield self._rightchild

Вызывается он так:
result, candidates = list(), [self]
while candidates:
    node = candidates.pop()
    distance = node._get_dist(obj)
    if distance <= max_dist and distance >= min_dist:
        result.extend(node._values)
        candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
        return result


Что происходит при вызове метода _get_child_candidates? Возвращается список, какой-то элемент? Вызывается ли он снова? Когда последующие вызовы прекращаются?

** Код принадлежит Jochen Schulz (jrschulz), который написал отличную Python-библиотеку для метрических пространств. Вот ссылка на исходники: http://well-adjusted.de/~jrschulz/mspace/

Подробный и обстоятельный ответ

Chef за 21 день. Часть вторая. Создание и использование cookbook

Reading time7 min
Views17K
Привет-привет, хабраюзер! Все еще с нами? CHEF – это интересно! Продолжим наш вояж к мастерству воина-автоматизатора, который начался в первой части данной статьи. В этой статье речь пойдет о первом опыте написания cookbook-а, о рецептах, атрибутах и шаблонах.
Читать дальше →

Несколько полезных шорткатов для Sublime Text ниндзи

Reading time2 min
Views217K
Доброго времени суток, уважаемые хабравчане. Многие пользуются замечательным редактором Sublime Text, который стал популярен благодаря своей простоте, гибкости/кастомизации и огромному количеству плагинов. Хочу поделиться с вами, на мой взгляд, самыми полезными шорткатами при работе с Sublime.

image

Переход по фрагментам

Win/Linux: CTRL+R
Mac: CMD+R
Вероятно, самое полезное сочетание клавиш для экономии вашего времени. Содержимое документа разбивается на определенные фрагменты (функции, HTML теги или CSS стили). Переход происходит при выборе соответствующего фрагмента во всплывающем окне.

Читать дальше →

Information

Rating
Does not participate
Location
Казахстан
Date of birth
Registered
Activity