Обработчик сообщений на JavaScript при участии jQuery
Представим себе web-приложение, которое взаимодействует с серверной частью посредством сообщений в формате JSON. Ответные сообщения, так же в виде кортежей, обернутых в JSON, передаются на сторону клиента, где декодируются и, в зависимости от содержимого, происходит то или иное действие.
В возвращаемом со стороны сервера кортеже (точнее, списке кортежей, но это на данный момент не играет роли) присутствует идентификатор события в виде поля action. Самый простой и незатейливый способ написать обработчик сообщений при помощи switch/case:
1 2 3 4 5 6 7 8 9 10 | $.vico.dispatchMessage = function(p) { var res = true; switch(p.action) { case('noauth') : { ... break; } } return res; } |
Разумеется, этот способ хоть и наглядный, но не самый приятный для чтения, поскольку предполагает простыню кода в случае наличия более 10 типов сообщений. Поэтому я запросил совета в твиттере, а пока реализовал более простую схему при помощи eval.
1 2 3 4 5 6 7 8 | $.vico.dispatchMessage = function(p) { var re = new RegExp('^[a-z0-9]+$', "g"); if(re.test(p.action)) { eval("var fn = $.vico.cb_" + p.action + ";"); if(fn) return fn(p); else return false; } else return false; } |
В этом случае для написания обработчика нового события потребуется только добавление новой, специально именованной функции. Поскольку eval потенциально ненадежное средство, кодификатор сообщения проверяется при помощи регулярного выражения (никому веры нет).
Тут в твиттере опытные товарищи напомнили про вариант с массивом, когда обработчик берется из таблички соответствия:
1 2 3 4 | var m_cb = new Array(); m_cb["noauth"] = $.vico.cbNoAuth; if(m_cb[p.action]) m_cb[p.action](p); |
Этот вариант не использует потенциально опасный eval, однако требует, чтобы в процессе написания кода обработчика изменения производились в двух точках – в массиве и в самой декларации функции.
Чтобы еще больше усложнить эту процедуру, было решено написать небольшой «класс», позволяющий добавлять/убирать из массива произвольное количество обработчиков события, что позволяет в дальнейшем расширять систему не только вглубь, но и в ширь.
Код выглядит примерно следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | (function($) { $.AEvents = function() { $.AEvents.map = new Array(); }, $.AEvents.map = null, $.AEvents.bind = function(event, fn) { if($.isArray($.AEvents.map[event])) { if($.inArray(fn, $.AEvents.map[event]) == -1) { $.AEvents.map[event].push(fn); } } else { $.AEvents.map[event] = new Array(); $.AEvents.map[event].push(fn); } }, $.AEvents.detach = function(event, fn) { if($.isArray($.AEvents.map[event])) { var t = new Array(); $($.AEvents.map[event]).each(function(i, v) { if(v != fn) t.push(v); }) $.AEvents.map[event] = t; } }, $.AEvents.pass = function(event, data) { var r = new Array(); if($.AEvents.map) $($.AEvents.map[event]).each(function(i, v) { r.push(v(data)); }); return r; } })(jQuery); |
Использовать его тоже несложно:
1 2 3 4 5 6 7 8 9 10 11 | $.AEvents(); $.AEvents.bind("noauth", $.vico.noAuth); $.AEvents.bind("authok", $.vico.authPassed); $.vico.dispatchMessage = function(p) { var r = $.AEvents.pass(p.action, p); if(r && r.length > 0) return true; else return false; } |
Разумеется, следующий шаг – привнесение в этот класс функционала обмена сообщениями с сервером. В итоге получается что-то (не побоюсь громкого слова) отдаленно напоминающее gen_server в Erlang.
Вещание видеопотока при помощи erlyvideo
Каким бы хорошим не был Wowza Media Server, но у него есть одно очень неприятное (но вполне справедливое) неудобство – версия для разработчика ограничена 10 одновременными подключениями, а финансирование некоторых проектов не позволяет приобретать полноценную версию. Поэтому с самого момента работы с RTMP мною рассматривались различные варианты использования открытых разработок. Увы, более-менее рабочим решением до недавнего момента был Red5 – медиа-сервер, сделанный на платформе J2EE, который оставлял впечатление тяжелого и неповоротливого монстра, а остальное и вовсе не выдерживало никакой критики.
Подробнее »»
Ограничения на воспроизведения видео на iPhone
В предыдущей заметке я рассказал про то, как сделать видео для iPhone, которое можно передавать на гаджет с использованием принципа Smooth Streaming. И даже дал ссылку на собственный проект, где применил результаты своего знания. К сожалению, как оказалось – весьма поспешно: люди, проверившие ресурс на iPhone 3G, сообщили, что ничего не работает и выдается одна и та же ошибка, схожая с той, которую получал я на своем аппарате – «Формат видео не поддерживается».
То, что я посчитал ограничением первой версии аппарата, оказалось более системным. Сложилось так, что эмуляция iPhone в SDK, распространяемом Apple, строится на немного иных принципах, нежели традиционная эмуляция аппаратуры, как это делали в QEMU в проекте OpenMoko. Если во втором случае действительно эмулировался ARM SoC, то разработчики iPhone пошли по пути меньшего сопротивления – они просто пересобрали среду под традиционную платформу (которая x86), и когда запускался эмулятор – по сути дела работает родной для платформы код, но с ограничениями, налагаемыми эмулятором. А когда программу для гаджета необходимо перенести на устройство – используется кросс-компиляция и уже генерируется код для платформы ARM.
Разумеется, при первых испытаниях трансляции псевдо-потока я использовал iPhone первого поколения и результат был плачевен – устройство от казалось играть данный формат. Но попытка воспроизвести тот же самый фрагмент в эмуляторе оказалась успешной, что и привело к ошибочному выводу, позднее опровергнутому посетителями ресурса. Скорее всего, эмулятор использует мультимедиа-прослойку операционной системы, гораздо менее привередливую, нежели та, которая используется в iPhone OS (у которой ноги растут тоже из Mac OS X). Поэтому он беспроблемно показал то видео, которое мой телефон посчитал сбойным.
Причина же невоспроизведения видео кроется не в формате, а в кодеке видео h.264. В его реализации для мобильной платформы Apple внесло ряд ограничений, нарушение которых ведет к тому, что файл просто не воспроизводется. Поэтому правильно подобранные параметры из ссылки в предыдущей статье приводят к закономерно успешному результату.
Мне остается выразить благодарность всем тем, кто протестировал мой ресурс и указал на ошибку. Спасибо большое!
Потоковое видео на iPhone
Как я уже ранее писал, вещать видео на iPhone можно было начиная с самых первых версий прошивки в псевдо-потоковом режиме, как, собственно, и делал популярный сервис YouTube. Т.е. через сеть поверх HTTP-протокола отдавался mp4-файл, а сервер умел отрабатывать параметры, передаваемые плеером и формировать заголовки формата в случае, если пользователь желал посмотреть ролик с середины.
Подробнее »»
Как сделать гаджет для Google Wave
Google Wave – новый инновационный сервис Google, призванный заменить одновременно электронную почту, чат и средство групповых обсуждений. В основе лежат волны (wave) и вейвлеты (wavelet), представляющие собой ветви дискуссии, посвященные какой-либо теме. Сообщения, или всплески (blip), могут создаваться и редактироваться в рамках волн как участниками обсуждения, так и роботами, следящими за дискуссией и дополняющие ее данными (например, автоматическим переводом фраз между языками). Помимо текста во всплески можно добавлять гаджеты – объекты, реализующие дополнительную функциональность, например, систему голосования, интерактивную карту и т.п. Изготовлением гаджетов и займемся в нашей статье.
Для начала рекомендую посетить описание Google Wave API – это полезное чтение, особенно если вы решили, что возможностей гаджетов недостаточно и нужно написать робота. В отличие от последних, гаджеты пишутся на традиционной для клиентской части вэба связке HTML + CSS + JS и представляют собой некий контейнер с данными, помещенный во всплеск через iframe.
Git-репозитарий с доступом по HTTPS
Время, когда правил только CVS, прошло безвозвратно, а посему сейчас много систем контроля версий, хороших и разных, централизированных и распределенных. Прелесть последних состоит в том, что каждая рабочая копия репозитария может также служить как сервер для создания других рабочих копий, поэтому даже если с основным хранилищем произойдет что-то нехорошее – можно воспользоваться рабочей копией.
Прелесть распределенных систем не ограничивается подобной «устойчивостью к отказам». Если проект очень сложен, требуется сложная и инвариантная разработка с последующей интеграцией изменений, без распределенных систем контроля версий приходится очень туго. В частности, Git, написанный Линусом Торвальдсом, используется для разработки ядра ОС Linux, сложность разработки которого можно себе представить, если поглядеть на размер кода. Git очень удобен, с учетом многообразия его возможностей, которые позволяют построить на его базе действительно распределенное хранилище данных. К сожалению, использование Git ограничено в основном не-Windows системами, для разработки в рамках гетерогенных сред следует использовать Mercurial и другие DSCM.
Подробнее »»
Скорость обработки видео при помощи x264
По мере работы над HDin.TV обнаружилась неприятная особенность – если скорость обработки одного сезона сериала из 24 серий для tulavideo.net составляла чуть более, чем половину суток, то в случае использования HD-разрешения (720p) сезон кодировался порядка половины недели (примерно 3-4 часа на серию). Это, разумеется, не могло не расстраивать, поскольку объем работы по перекодировке предстоял и еще предстоит весьма значительный.
Подробнее »»
Защита SSH-сервера при помощи sshguard
Как известно, многим людям не дает покоя слава Кевина Митника и прочих не столь раскрученных личностей. Поэтому когда в сеть выставляется сервер с SSH-демоном, то вполне вероятно, что вскоре на него начнется атака по подбору паролей. Что, в принципе, не очень приятно.
Решений тут много, подкину еще одно – при помощи sshguard. Рецепт прост:
1 | apt-get install sshguard |
далее прописываем строки в /etc/rc.local и повторяем их в консоли
1 2 3 | /sbin/iptables -N sshguard /sbin/iptables -A INPUT -p tcp --dport 22 -j sshguard tail -n0 -F /var/log/auth.log | /usr/sbin/sshguard & |
Первые две команды создают одноименную цепочку и перенаправляют туда все входящие на 22-й порт, последняя – транслирует логи к программе, которая смотрит частоту вхождения и успешность/неуспешность попытки и добавляет в цепочку правила по блокировке юных взломщиков.
Сборка Linux-окружения при помощи Buildroot
Как известно, Linux – это пластилин, который можно применять как в рабочих станциях, так и во встраиваемых системах. Если в первом случае все понятно – берем общепользовательский дистрибутив и далее процесс не отличатся от традиционной установки любых операционных систем, то со встраиваемыми и мобильными системами, как всегда, все плохо. Такие устройства, как правило, могут быть построены на базе архитектуры, отличной от х86, иметь ограниченный объем памяти и часто сопрягаются с весьма специфическими устройствами (благо, интерфейс нынче более-менее стандартизированы и остается реализовывать только протокол обмена). Однако, все не так страшно.
Подробнее »»
IPTV на дому или чтоже там внутри…
Принцип IPTV (передачи TV-каналов поверх IP-сетей) и VoD (видео по запросу, доставка мультимедиа-контента в зависимости от заказа пользователя) весьма прост в техническом аспекте. Ниже я попробую рассказать, как можно построить локальное IPTV в рамках локальной домашней сети. Данный рассказ базируется на опыте работы с IPTV-системами и знаниях функционала отдельных компонентов системы, а потому, возможно, что на практике окажется все много сложнее. ![]()
Подробнее »»



