понедельник, 29 марта 2010 г.

Проприетарщина...

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

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

Почему бы и в соф-разработке не сделать возврат денег, в случае обнаружения дефекта? Тогда бы разработку платной проприетарщины только крупные компании смогли бы себе позволить.

четверг, 18 марта 2010 г.

Кому верить?

Расскажу одну поучительную историю.

В далеком 2004 году я "увлекся" Перлом. Появился у меня один вопрос по реализации некоторого алгоритма, с ним я как раз и направился на один из форумов по программировании на Перле.

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

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

Через месяц заглянул в свой топик на форуме, так, для инетреса. Оказалось, что "гуру" на нем запоздало отметились. По их мнению мой алгоритм был не реализуем, что я маюсь дурью и мне стоило бы воспользоваться любезно перечисленными ими "костылями".

Основной вопрос, вытекающий из истории - кто учит нас на многочисленных форумах, кому мы верим?

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

Кому верить?

среда, 17 марта 2010 г.

Работать нужно, а не всякой херней заниматься...

Как-то давно попался мне "на глаза" один кадр - он тупо регистрировал на себя доменные имена третьего уровна и ставил на них заглушки, что типа домен его и e-mail где-то на странице. Видимо таким образом, на продаже (бесплатных) доменов третьего уровня он хотел "зарабатывать" :)

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

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

Хочешь хорошо жить и красиво одеваться - иди и работай. Куда более засирать и без того засранный интернет?

суббота, 6 марта 2010 г.

AdBlock - надолго ли?

Написал тут на днях скрипт, импортирующий блэклисты AdBlock'а в Privoxy. Вроде этого должно хватить за глаза, но AdBlock же еще поддерживает CSS фильтры контента - почему бы и их не импортировать?


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

Интересно, сколько в подписке таких "мертвых" шаблонов? Чем популярнее AdBlock, тем быстрее администраторы сайта почувствуют потери и оставят банерорезку "с носом".

Как сделать невозможным CSS фильтрацию контента AdBlock'ом? Элементарно - нужно внедрять рекламу в блоки со стилями, аналогичными стилям важных частей страницы, выделять особым стилем ее незачем. Захочет кто убить назойливую рекламу - фильтр CSS контента скроет заодно и полезную информацию.

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

То же самое касается и Оперных UsersCSS.

Создание фильтров для privoxy

Для создания фильтров в Privoxy используется синтаксис регулярных выражений. Регулярные выражения в полном объеме изучать конечно не стоит, но в общих чертах ориентироваться необходимо.

Терминология

Фильтр — фрагмент кода, используемый Privoxy для фильтрации контента. Фильтр может состоять из одного или нескольких шаблонов.

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

Регулярные выражения (regular expressions, RegExp, RegEx) — формальный язык поиска и замены в текстовых строках.

Создание косметических фильтров, основанных на внедрении кода CSS.

Скрытие фрагментов html страницы широко используется как в Opera, так и в AdBlock. Каким образом это реализуется в Privoxy мы сейчас и рассмотрим.

Для начала в user.filter запишем строчку:

FILTER: site-specific-u Site specific user filters

этой строчкой мы создаем «site-specific-u» фильтр. Все, что последует после этой строчки и до объявления следующего фильтра будет принадлежать «site-specific-u» фильтру.

Шаблон CSS фильтра прост

s@(</head>)@\n<style type="text/css">\n\
[Стиль 1], [Стиль 2], [Стиль 3], [Стиль ...], [Стиль n]\n\
{ display: none !important; outline:1px solid !important }\n\
</style>\n$1@si

пользователю остается только воспользоваться консолью разработчика, имеющегося практически в каждом вменяемом браузере, определиться какой стиль управляет отображением рекламного блока и вписать его в шаблон фильтра. К примеру, рекламный блок на images.google.ru управляется стилем id*="tads" (<div id="tads">), вписав который в шаблон фильтра мы избавимся от рекламного блока навсегда.

Шаблон для скрытия рекламного блока на images.google.ru будет выглядеть следующим образом:

#images.google.ru
s@(</head>)@\n<style type="text/css">\n\
[id*="tads"]\n\
{ display: none !important; outline:1px solid !important }\n\
</style>\n$1@si

Остается только активировать этот фильтр для images.google.ru и все. Шаблоны на основе CSS для других сайтов делаются аналогично.

Создание фильтров контента

Все шаблоны фильтров Privoxy имеют следующее строение:

s/Поиск/Замена/Модификаторы

Модификаторы определяют режим поиска:
g — поиск и замена производится до тех пор, пока условие соблюдается.
i — производится регистронезависимый поиск/замена
s — производится многострочный поиск/замена

Рассмотрим простой вариант, к примеру, нам нужно удалить следующий фрагмент:

<a href="http://site.com/promo/2421.htm"><img src="/img/2421.jpg" /></a>

Шаблон будет выглядеть следующим образом:

s@<a\s+[^>]*site\.com/promo/[^>]*.*</a>@@sig

где:
«<a\s+» - начало тега «а» с гарантированным пробелом
«[^>]*» - любое количество символов за исключением границы открывающего тега «a»
«site\.com/promo/» - ключевой фрагмент адреса
«.*</a>» - любое количество символов до закрывающего тега «a»

Отсутствие символов в замене говорит о том, что найденный шаблон будет удаляться полностью.
Модификаторы «sig» показывают, что поиск должен продолжаться много раз, быть многострочным и регистронезависимым.

Рассмотрим вариант немного сложнее — нам нужно удалить рисунок, но оставить ссылку с описанием из alt тега.

<a href="http://site.com/promo/2421.htm" alt="Promo links"><img src="/img/2421.jpg" /></a>

s@(<a\s+[^>]*site\.com/promo/[^>]*alt="([^"]*)[^>]*>).*(</a>)@$1Blocked: $2$3@sig

где:
в переменную $1 заносится весь открывающий тег «<a ...>»
в переменную $2 заносится содержимое тега «alt="..."»
в переменную $3 заносится закрывающий тег «</a>»

После все эти переменные используются в замене, вначале открывающий тег «<a ...>», затем текст, содержащийся в теге «alt="..."», а затем и закрывающий тег «</a>».

В итоге из графической ссылки мы получили обычную текстовую.

Самый сложный вариант — когда нам надо удалить из контента javascript с определенным ключевым словом.

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

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

Фильтр будет состоять из трех шаблонов, функционал каждого из них описан выше:

s@</(script)@\e</$1@sig
s@<script[^\e]*?banner[^\e]*?\e</\script>@<!-- Blocked ad-script -->@sig
s@\e</(script)@</$1@sig

где «[^\e]*?» как раз и определяет любое количество символов до появления символа ограничения «\e» - обозначающего начало закрывающего тега.

Заключение.

Не стоит сразу бросаться на написание собственных фильтров, они становятся последним рубежом, когда обычная блокировка по URL (адресу) уже не помогает.