Как стать автором
Обновить
  • по релевантности
  • по времени
  • по рейтингу

Почтовый сервис с принципом обратной связи

Чулан
Все (а если не все, то многие) современные почтовые сервисы основаны на связке очень старых, но проверенных временем протоколах POP3, SMTP или, реже, IMAP4. POP3 протокол позволяет принимать почту, SMTP — отправлять. IMAP4 же отличается от POP3 только развитыми средствами хранения и поиска почты на сервере (я специально утрирую, не обращайте внимания).

Мы создаём письмо, нажимаем «Отправить». Происходит соединение с SMTP-сервером, письмо отправляется. Мы нажимаем «Получить», почтовая программа соединяется с POP3-сервером, проверяет наличие писем и, если они есть, сливает их на компьютер. Всё просто.

Но что же делать, если я хочу получить письмо, не тридцать три раза проверив почтовый ящик, а один, гарантированный? Современные популярные почтовые сервисы позволяют подключить услугу «уведомление на почтовый ящик». Спрашивается, а смысл? Мне придётся проверить один ящик, чтобы узнать о получении письма на другой? Бред. Есть также услуга «уведомление на мобильный телефон». Но этот вариант не устраивает лично меня, потому что требует денег. Да и оперативным назвать приём почты посредством этой услуги я бы поостерёгся.

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

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

Что думаете по этому поводу?
Всего голосов 30: ↑15 и ↓15 0
Просмотры 466
Комментарии 55

Удобный callback

JavaScript *
Надоело каждый раз писать колбеки руками. Написал простенькую скриптину, которая запонимает функцию (функции) с массивом аргументов и контекстом в объекте с методом fire, который не зависит от this, чтобы можно было цеплять колбек не только в «чистом» коде, но и к онклику или таймеру. Набор исполняемых функций и аргументов/контекста к каждой из них произвольный.
Читать дальше →
Всего голосов 27: ↑13 и ↓14 -1
Просмотры 2.8K
Комментарии 20

Обратные вызовы и исключения С++

C++ *

Введение


Как известно, многие С-библиотеки используют обратные вызовы для обеспечения какого-либо функционала. Так поступает, например, библиотека expat для реализации SAX модели. Обратный вызов или callback используется для возможности выполнить пользовательский код на стороне библиотеки. Пока такой код не несет побочных эффектов — все нормально, но как только на арене появляется С++, все, как всегда, становится нетривиальным.

Читать дальше →
Всего голосов 40: ↑38 и ↓2 +36
Просмотры 6.1K
Комментарии 36

Использование Deferred объектов в jQuery 1.5

jQuery *
Перевод
Deferred объекты появились в jQuery 1.5. Они позволяют отделить логику, которая зависит от результатов выполнения действия от самого действия. Для JavaScript Deferred объекты не новы, они уже были в MochiKit и Dojo, но с изменениями логики jQuery ajax от Julian Aubourg, внедрение Deferred объектов было неминуемо. С Deferred объектами несколько callback могут быть связаны с результатом задачи и любые из них могут быть привязаны к действию даже после начала его выполнения. Выполняемая задача может быть асинхронна, но не обязательно.

Deferred объекты теперь встроены в $.ajax() таким образом вы будете получать их автоматически. Обработчики теперь могут быть связаны с результатом следующим образом:
// $.get, ajax запрос, он асинхронный по умолчанию
var req = $.get('foo.htm')
   .success(function( response ){
      // что-нибудь делаем с ответом
   })
   .error(function(){
      // делаем что-нибудь если запрос провалился
   });
 
// это выполнится перед тем как $.get() будет выполнено
doSomethingAwesome();
 
// Делаем что-то ещё перед завершением запроса
req.success(function( response ){
   // делаем  что-то ещё с ответом
   // он будет выполнен когда запрос завершится, а если запрос завершен, то будет вызван немедленно
   // если запрос уже был выполнен
});

Читать дальше →
Всего голосов 116: ↑113 и ↓3 +110
Просмотры 36K
Комментарии 19

Интеграция сервиса E1tele.com с Microsoft Outlook

Блог компании E1tele.com
В нашу фирму обратился клиент с вопросом: а можно ли совершать звонки из контактов outlook? Пока наши специалисты помогали ему разобраться с этой задачей, я решила, что напишу об этом подробную статью. Всё-таки, наш сервис можно использовать во всём его многообразии, особенно, если разобраться, как это просто.
Если вы имеете привычку заносить все телефонные номера партнеров и коллег в контакты Microsoft Outlook, то это может обернутся вам функциональным сервисом связи, который облегчает ежедневное общение.
Читать дальше →
Всего голосов 2: ↑2 и ↓0 +2
Просмотры 963
Комментарии 2

Ip-телефония для блондинок

Блог компании E1tele.com
Одно из моих самых любимых достижений современной науки и техники – это ip-телефония. И
если раньше я имела об этом весьма смутное представление, то когда моя мама переехала в Америку (2 года назад), пришлось задуматься. Потому что денег на мобильную связь уходило безумное количество, но ощущение того, что я ещё не всё сказала, оставалось перманентным. Люблю, знаете ли, поболтать.
Всем известно, что IP-телефония – это дешево и качественно. Правда, слегка сложновато. Я
далеко не сразу разобралась с таким нестандартным способом совершения звонка. Но если подойти к этому делу основательно, никаких проблем не возникнет. Именно поэтому я решила посвятить данному вопросу свою статью. Надеюсь, что полезно будет не только блондинкам=).
В качестве материала для разбирательств, естественно, воспользуюсь сайтом нашей компании
e1tele.com. Мы предлагаем юзерам одну из следующих технологий: callback или callin.
Несмотря на очевидность названий, есть нюансы, которые будут рассмотрены ниже. Иллюстрации по тексту в помощь девушкам=).
Читать дальше →
Рейтинг 0
Просмотры 2.5K
Комментарии 0

Inline-callback в tornado server для asyncmongo

Разработка веб-сайтов *
Пару недель назад разработчики tornado добавили нативный модуль по созданию inline callback (аналог inlineCallbacks в Twisted, Seq в Node.js, Fibers в Ruby).
Ниже примеры использования и примеры с участием asyncmongo (асинхронным драйвером для mongoDB)
Читать дальше →
Всего голосов 25: ↑22 и ↓3 +19
Просмотры 3.7K
Комментарии 5

Последовательный вызов асинхронных функций

JavaScript *
Как известно, язык JavaScript преследует парадигму событийно-ориентированного программирования. Это, безусловно, хорошо, но что делать, если за одной асинхронной функцией должна вызываться другая асинхронная функция, а затем еще одна, и еще… Иногда такой код очень запутывает, и не только человека привыкшего к синхронному и поочередному вызову функций. Это касается сложных анимаций, таймаутов, аякса, когда за одним должно следовать другое, и так дальше.

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

UPD
image
Ниже моё решение, являющееся аналогом этой функции модуля async и кучи других подобных решений, представленных в комментариях. Спасибо всем комментирующим и sedictor в частности.
/UPD

Рассмотрим пример (который взят из головы и в нем возможны ошибки) гипотетического парсера сайта, который после парсинга заносит данные в БД, и, после занесения, вызывает некоторый код.

var html = '';
request.on('response', function (response) {

    response.on('data', function (chunk) {
        html = html + chunk;
    });

    response.on('end', function() {
        //какой-то парсер
        parse(html, function(data){  
                //какая-нибудь функция, добавляющая данные в базу
		addToDatabase(data, function() {  
			doSomething();
		})
	});

    });
});


Много вложенных колбеков — не есть гуд, пробуем по-другому.
Читать дальше →
Всего голосов 50: ↑40 и ↓10 +30
Просмотры 30K
Комментарии 33

Асинхронные функции в Javascript и ключевое слово this

Разработка веб-сайтов *JavaScript *
Из песочницы
При использовании асинхронных функций в классах часто возникает проблема, когда в теле функции невозможно обратиться к объекту класса, вызывающему функцию. Это хорошо видно на примере с аяксом (с использованием jQuery):

function Loader()
{
    this.load = function()
    {
        $.ajax({
            url: '/test.php',
            success: function(data, textStatus, jqXHR) {
                // здесь уже никак нельзя обратиться к объекту класса
                console.log(this); // this содержит внутренний объект jQuery,
                                   // вызывающий функцию success
            }
        });
    }
}
(new Loader()).load();

Читать дальше →
Всего голосов 17: ↑9 и ↓8 +1
Просмотры 6K
Комментарии 12

Понимание callback-функций (колбеков)

JavaScript *
Перевод
Callback-функции чрезвычайно важны в языке Javascript. Они есть практически повсюду. Но, несмотря на имеющийся опыт программирования на C/Java, с ними у меня возникли трудности (как и с самой идеей асинхронного программирования), и я решил в этом разобраться. Странно, но я не смог найти в интернете хороших вводных статей о callback-функциях — в основном попадались отрывки документации по функциям call() и apply() или короткие кусочки кода, демонстрирующие их использование, и вот, набив шишек в поисках истины, я решил написать введение в callback-функции самостоятельно.
Читать дальше →
Всего голосов 27: ↑13 и ↓14 -1
Просмотры 290K
Комментарии 16

Лямбда-функции и реализация удобного механизма Callback-ов на C++

C++ *
Из песочницы
В этой статье на примере реализации механизма обратного вызова будет рассмотрена возможности применения лямбда функций в удобной и быстрой форме.
Читать дальше →
Всего голосов 22: ↑14 и ↓8 +6
Просмотры 40K
Комментарии 8

Asterisk: обратный вызов с использованием AMI

Блог компании Southbridge Asterisk *Разработка систем связи *
Asterisk Manager Interface (AMI) – это программный интерфейс который позволяет внешним программам как управлять, так и контролировать систему Asterisk. AMI слушает соединения на TCP порту, по-умолчанию это 5038. Клиентская программа может соединяться с AMI, передавать команды в Asterisk, получать ответ о статусе выполнения команд.
В данном посте мы рассмотрим использование AMI на примере решения определенной задачи: настроить Asterisk на генерацию звонков по заданному url, в котором должны устанавливаться параметры звонка.

Настройка Asterisk AMI



Первое что необходимо сделать, это включить AMI и завести пользователя с помощью которого клиентская программа будет аутентифицироваться:

/etc/asterisk/manager.conf
[general]
enabled = yes
port = 5038
bindaddr = 0.0.0.0


/etc/asterisk/manager.conf
[c2call]
secret=FrUyHn6FSaX
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
read=system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate
write=system,call,log,verbose,command,agent,user,config,command,dtmf,reporting,cdr,dialplan,originate


Для применения изменений выполним reload:

asterisk -rx "module reload manager"


Теперь нам потребуется создать внутренний номер который, собственно, и будем соединять с вызываемым абонентом:

/etc/asterisk/sip.conf
[3200]
deny=0.0.0.0/0.0.0.0
permit=192.168.0.0/255.255.0.0
secret=3200
dtmfmode=rfc2833
canreinvite=no
context=OUT_IN1
host=dynamic
type=friend
nat=yes
port=5060
qualify=yes
callcounter=yes
faxdetect=no


После создания внутреннего номера, потребуется перечитать конфигурацию Asterisk:
asterisk -rx "sip reload"


На этом настройка Asterisk завершена.

Читать дальше →
Всего голосов 9: ↑7 и ↓2 +5
Просмотры 54K
Комментарии 9

Нетривиальная задача с callback + DID в Asterisk

Asterisk *Разработка систем связи *
Из песочницы
Здравствуйте, уважаемые хабравчане и любители астериска!
Хочу поделиться интересной задачей и вариантом её решения. Итак, вот условия задачи.
Имеем:
— модифицированный дистрибутив Elastix 2.3
— asterisk 1.8.13.1
— FreePBX 2.8.1
— 24 номера подключением по sip и 30 каналов
— ~40 различных ООО в составе холдинга
Текущая задача:
— сделать callback сервис для каждого номера DID (и соответственно от каждого ООО)

Казалось бы, «это же freePBX — там всё делается мышкой». Это не совсем так.
Читать дальше →
Всего голосов 9: ↑8 и ↓1 +7
Просмотры 16K
Комментарии 14

Дополнительные функции Aastra Mobile Client

Разработка систем связи *
В этой статья я продолжу начатую мной ранее тему – Aastra Mobile Client. Теперь мы рассмотрим дополнительный функционал, который позволяет реализовать решение от AMC.

HTTPS Callback


Callback — телефонная услуга, позволяющая клиенту заказать соединение с нужным абонентом таким образом, чтобы звонок был входящим для них обоих. Некоторые компании предлагают своим абонентам услугу, позволяющую совершать международные звонки с помощью метода callback с обычного мобильного телефона. Поскольку на большинстве мобильных операторов входящие звонки бесплатные, абонент ничего не платит своему оператору и разговаривает по тарифам IP-телефонии. Это особенно удобно, когда вы находитесь в роуминге, и входящий вызов стоит дешевле, чем исходящий.

В контексте AMC, услуга обратного вызова реализуется посредством метода – HTTPS callback. Т.е. абонент со своего мобильного клиента AMC инициирует https-запрос в сторону AMC-контроллера. В данном запросе будет содержаться: номер абонента (это может быть любой номер от внутрикорпоративного или стационарного, до международного), который хочет вызвать клиент AMC и мобильный номер собственно самого клиента AMC (который, к слову сказать уже содержится в AMC-контроллере).

Далее, AMC-контроллер вызывает абонента-Б (того, которому мы хотим позвонить) и абонента-А, т.е. пользователя AMC, перезванивая ему на его мобильный номер. Вызов абонента-Б начинается только после ответа AMC абонента. Схематично это выглядит так:

Стоит обратить внимание, на тот факт, что услуга callback доступна абонентам AMC, только в случае недостаточной полосы пропускания 3G. О чем сигнализирует значок на статус панели (only data connection).




Читать дальше →
Всего голосов 3: ↑3 и ↓0 +3
Просмотры 2.3K
Комментарии 1

Пример использования DataSnap Callback: запрос данных от пользователя во время вызова серверного метода

Программирование *Delphi *
Из песочницы
Что это и для чего надо:

Работа с Datasnap заключается в запросе от сервера данных и вызове серверных методов, например:
  — Запросить список товаров с сервера (dataset )
  — Создать новый документ
  — Добавить в него позиции
  — Закрыть документ

Иногда при добавлении позиции необходимо сделать дополнительный выбор, например выбрать партию товара или разрез.

    Это можно сделать через возврат кода ошибки (что-то вроде Prepare/Execute), чтобы клиент запросил пользователя, а затем попробовал снова выполнить операцию.
    Или же дать серверу возможность запросить клиента непосредственно во время операции все необходимые ему данные.


Что можно сделать:
Всего голосов 4: ↑4 и ↓0 +4
Просмотры 8.8K
Комментарии 2

О вольностях в ссылках или простейший обмен сообщениями

C++ *
Из песочницы
Обмен сообщениями достаточно фундаментальная вещь в науке Computer Science. Будем рассматривать её в приближении к событийно-ориентированному программированию (event-driven). Терминология, возможности и реализации могут отличаться: события (events), сообщения (messages), сигналы/слоты (signals/slots) и callbacks. В целом суть, что с приходом события запускается ответная реакция.
Сама система обмена сообщениями в статье послужила демонстрацией вольной, но допустимой интерпретации ссылок/указателей, упрощающей код. Получившаяся система тривиальна и умеет только регистрировать обработчик на определённый код сообщения и посылать сообщения с таким кодом.
Допустим что обработчики нетривиальные, а сообщений немного. И что мы сами генерируем сообщения и они не приходят нам по сети, например. В таком случае хочется иметь что-то более удобное с явными объявлениями переменных в сообщении. Например, нечто подобное:
StringMessage* str_message = ...;
send(my_message);
...
void handle_message(const Message* message) {
	assert(message);
	const StringMessage* str_message = dynamic_cast<const StringMessage*>(message);
	assert(str_message);
	std::cout << str_message->message ...
}

Но хочется убрать проверочный код, не имеющий отношения к логике работы, под капот. Заменим поэтому указатель на ссылку, показав что в обработчик точно приходит объект, а не NULL nullptr. И пусть обработчик сразу принимает требуемый им тип сообщения.
void handle_message(const StringMessage& message) {
	...
}

Как осуществить задуманное и поддержать другие возможные классы сообщений?
Читать дальше →
Всего голосов 16: ↑13 и ↓3 +10
Просмотры 9.6K
Комментарии 7

Быстрое создание callback-сценариев с помощью Voximplant

Блог компании Voximplant Разработка веб-сайтов *Разработка систем связи *
Tutorial
Не удивительно, что во многих бизнес процессах так или иначе встречается такая задача как позвонить на один номер телефона и потом соединить его с другим номером. Чаще всего такой сервис называют callback или обратный вызов, иногда — заказ звонка. Многие встречали его на сайтах интернет-магазинов, но в большинстве случаев это не автоматизированный обратный звонок, а обычная заявка, которая падает менеджеру на email или появляется в CRM, после чего менеджер ручками набирает номер клиента и с ним беседует. Некоторые крупные компании реализуют автоматизированный callback и даже интегрируют его с очередями в контакт-центре. В данном посте мы рассмотрим как буквально за несколько минут создать callback-сценарий с помощью платформы VoxImplant, а также интегрировать это хозяйство с каким-нибудь существующим бэкендом для сохранения/получения данных по звонку, запасайтесь поп-корном и добро пожаловать под кат.
Читать дальше →
Всего голосов 5: ↑4 и ↓1 +3
Просмотры 16K
Комментарии 41

ТТТ: jQuery-плагин анимации текста от Contorra

CSS *JavaScript *jQuery *
Рабочее название — TTT, или Тасующаяся Трансформация Текста. 
Разработан по спецзаказу digital-агенства Contorra.
Этот плагин позволяет сменить один текст на другой посредством событий «клика» или «наведения» на сам объект, либо любой другой, с эффектом трансформации каждого символа. Каждый символ текущего текста двигается по кратчайшему пути в массиве символов своего типа (заглавные, строчные буквы, цифры, знаки пунктуации и прочие) и останавливается при достижении конечного результата. В результате мы наблюдаем, как из хаоса вращающихся символов постепенно проявляется заданный текст.

Демо
Читать дальше →
Всего голосов 30: ↑17 и ↓13 +4
Просмотры 8.5K
Комментарии 12

Asterisk Обратный звонок, или как дешево звонить

Программирование *Asterisk *Разработка систем связи *
Встречается ситуация когда сотрудники находясь в командировках звонят с сотовых по межгороду в головной офис, хотя в офисе стоит АТС на которую заведет отличный дешевый оператор связи со вкусными ценами, или просто звонят на внутренний номер абонента, через внешний номер, да кучу ситуаций можно придумать общая проблема которых — обратный звонок. Именно для этих целей я и реализовал очередной сценарий, при котором сотруднику достаточно позвонить на номер, а потом АТС сама ему перезвонит и уже вызываемый абонент сможет сделать через АТС то, что ему необходимо не за счет своего баланса на сотовом, городском операторе или каком либо другом операторе предоставления телекоммуникационных услуг, а, например, за счет более дешевых услуг, подключенных к АТС.
Читать дальше →
Всего голосов 21: ↑18 и ↓3 +15
Просмотры 34K
Комментарии 27

Делаем очередь входящих звонков с функцией callback

Блог компании Voximplant Разработка веб-сайтов *Разработка систем связи *
Tutorial
При звонках в колл-центр компаний часто приходится сталкиваться с большим временем ожидания на линии, многие из нас слушали надоедливую мелодию в течение десятков минут хотя бы раз в жизни. Самое интересное заключается в том, что это совершенно невыгодно компании в колл-центр которой вы звоните, особенно если вы звоните на номер 8-800. К счастью, уже давно придуман способ, позволяющий решить данную проблему — это callback или обратный вызов. Суть этого способа очень простая: позвонившему предлагают отключиться от колл-центра при этом его номер так и остается в очереди на обслуживание и как только его очередь подойдет, то ему автоматически наберут и соединят с оператором, на которого распределился его звонок. Таким образом убиваем сразу несколько зайцев: не занимаются линии колл-центра, не тратятся дорогостоящие минуты 8-800, а клиенты не испытывают лишнего раздражения в ожидании ответа. Вендоры колл-центрового ПО хотят за такую функцию весьма приличных денег, а мы под катом расскажем как данный функционал достаточно просто и быстро реализуется с помощью платформы VoxImplant.
Читать дальше →
Всего голосов 26: ↑14 и ↓12 +2
Просмотры 13K
Комментарии 19