14 МайРаспределённая рекламная сеть

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

10 АпрУдаление объекта flash под IE8

Недавно, в одном из форматов рекламы, была обнаружена ошибка, появляющаяся в IE7 и IE8. После закрытия баннера появлялась JS-ошибка ‘null’ is null or is not an object. После дебага удалось обнаружить место, в котором возникала ошибка, это происходило в коде:

try { document.getElementById("_banner_").SetReturnValue( __flash__toXML(window.location.href.toString()) ); } catch (e) { document.getElementById("_banner_").SetReturnValue("“); }

Но это не код показа баннера, это код взаимодействия flash с JS. Дальнейшее изучение проблемы показало, что document.getElementById(”_banner_”) возвращает null.

Проблема, как оказалось, была в том, что объект flash не удалялся после удаления div-а, служащего контейнером для flash-баннера. Т.е. div вместе с object удалялся из DOM, но оставался в памяти браузера и продолжал отсылать сообщения, но, так как элемента document.getElementById(”_banner_”) больше не существовало, появлялась ошибка.

Решилась проблема небыстро, но решение оказалось простым. Надо было просто удалить object. Т.е. перед удалением контейнера надо удалить object и это решает проблему.

21 МарСистема управления рекламой Videoclick: уроки

Каждый раз, начиная разработку нового проекта, придумываешь новые алгоритмы, новые способы решения задач, новые подходы. Так произошло и с новой версией системы управления рекламой для Videoclick.

Потоки вместо процессов

В старой системе использовались процессы, по одному процессу на каждый воркер (воркер занимается разбором запроса и формированием ответа). Плюс такого подхода в том, что при падении одного из процессов, всегда есть ещё процесс/процессы, которые обработают запросы пока мастер (процесс, контролирующий работу воркеров, собирающий статистику и т.п.) не поднимет новый процесс взамен упавшему, т.е. мы потеряем только один запрос, на котором процесс упал. Минус в том, что для шаринга данных между процессами приходится пользоваться shared memory, а работа с ней не самое приятное занятие.

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

Зато как легко работать с общими данными. Достаточно легко удалось избежать использования всякого рода блокировок. Всё работает быстро и без головной боли.

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

15 ФевАпгрейд ноута

Проапгрейдил свой макбук… Достало что на Tiger новый софт стал глючить либо вообще отказывается ставиться. Купил Snow Leopard. Но это не самое главное, самое главное, что купил SSD Transcend на 128Gb. Хотел взять Intel X25-E 80Gb, но его найти не удалось, а вернее задолбался искать, а потому взял Transcend, тем более что он по тестам не сильно отстаёт от Intel в посведневных задачах…

По новой системе пока никаких особых впечатлений кроме возможости поставить Google Chrom и другой нужный софт… А вот винт радует… Явное увеличение скорости загрузки приложений… В общем, я доволен :)

23 СенБыли получены исходники 3300 глобальных интернет-проектов

Про сабж можно почитать на хабре: http://habrahabr.ru/blogs/infosecurity/70330/.

21 АвгДиван лучше табуретки

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

Во вторник его отвезли в больничку. Не смотря на то, что дорога была близкая, ехал он долго. Четырежды хозяин останавливался, остужал двигатель и доливал холодной воды в радиатор. А сегодня его забрали, здорового и бодренького. Заправили полный бак бензина и поехали кататься. Кататься просто так, а не по делам. Видимо хозяин соскучился, ведь старый диван всегда лучше новой табуретки :)

28 ИюлТак ли страшен серый волк?

Исследовал тему хранилищ типа ключ/значение и обратил внимание, что все тесты на производительность сетевых хранилищ производились в однопоточном режиме. Типа “Tokyo Cabinet крутая бибилиотека, выдаёт порядка 17К запросов в секунду на дисковой базе данных, но через сеть (Tokyo Tyrant) всего 1.6К запросов в секунду”, а потом “latency — это зло”. Но почему-то не видел многопоточных тестов, как это бывает в реальных web-приложениях со множеством фронтендов. И не видел клиентских библиотек, работающих по событийной схеме, а не по схеме “послал запрос, жду ответа, ненавижу latency”. Ведь в этих случаях latency будет не так страшна, или я где-то не прав?

27 МарРоссийская география

Гео-база maxmind окончательно задолбала своими приколами, когда треть Москвы определяется как область в Великобритании. Могу себе представить как она определяет географию для других городов России. В поисках нормальной базы ip-адресов России нашёл ipgeobase.ru. Бесплатная, поддерживаемая, актуальная база для России. Но когда дело дошло до парсинга, меня её формат взбесил. Вместо того, чтобы сделать так, как делают те же maxmind, где последовательно располагаются блоки адресов, они реализовали структуру со множественными вложениями, парсер для которой, без поллитра не напишешь.

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

Скачать скрипт можно тут: ipgeobase.php.gz.

Для работы скрипта нужен файл cidr_ru_block.txt из архива db_files.tar.gz. Запускаться скрипт должен в том же каталоге, что и cidr_ru_block.txt. После работы скрипта появляются 3 файла: ipgeobase-states.dat, ipgeobase-cities.dat, ipgeobase-ips.dat.

В ipgeobase-states.dat храняться области в формате [идентификатор области]\t[название области].
В ipgeobase-cities.dat храняться города в формате [идентификатор города]\t[идентификатор области]\t[название города].
В ipgeobase-ips.dat храняться диапазоны ip-адресов в формате [IP от]\t[IP до]\t[идентификатор области]\t[идентификатор города].

При повторном запуске скрипт начитывает данные из ipgeobase-states.dat и ipgeobase-cities.dat (если они есть). Таким образом, при появлении новых городов или областей, идентификаторы “старых” записей не изменятся. IP храняться в виде беззнакового 32-битного числа.

Как-то так, надеюсь кому-то мой труд облегчит жизнь :)

P.S. Исправлена ошибка в скрипте, приводящая к появлению “левых” диапазонов, типа 774930432 774930431 92 658, спасибо Виталию (werzer) за наводку.

15 ФевТакси в День Святого Валентина

Вчера возникла необходимость воспользоваться такси для поездки от дома до The Real McCoy на Баррикадной. Google запросу “такси москва” выдал кучу предложений.

В одном месте на звонок не ответили, но перезвонили через 20 минут и, не представившись, спросили зачем звонили. Это было неожиданным, потому что на сайте был указан “многоканальный телефон”, а на деле оказался мобильный частного таксиста.

Вторым сайтом был www.500-50-50.ru. Вот эти ребята натурально удивили и порадовали. Приятная девушка приняла заказ. Секунд через 10 пришла SMS-ка о том, что заказ принят, с указанием куда и в какое время подать такси. Такси было заказано на 18:30. В районе 16:30 часов пришла SMS-ка с указанием модели машины, госномером, именем водителя и его мобильным телефоном. В 18:25 пришла SMS-ка о том, что такси ждёт у подъезда. Доехали без приключений. Через минуту после приезда пришла SMS-ка со “спасибками”, указанием стоимости поездки (290 рублей) и указанием что на накопительный счёт капнуло 14 рублей. В общем, молодцы, порадовали.

04 ФевПулированный связный список

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

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