Распознавание CAPTCHA MTC

МТС сделал у себя на сайте защиту спама в сервисе отправки SMS. Защита, надо сказать плюшевая — усреднением помехи убираются почти подчистую, дальше распознать цифры очень просто — я пробовал. Удалось добиться стопроцентной вероятности распознавания.

CAPTCHA МТС (1.69КиБ)

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

Кстати, подходящее время вернуться к разговору о защите от спамовых роботов, специализирующихся на форумах, гостевых книгах и т. п. Поводом послужила попытка Helix (aka Ulitka) усовершенствовать предложенные мною методы CAPTHA.

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

Предлагаю, умозрительно, поискать другие способы защиты от роботов, в стороне от методов CAPTCHA. Скажем, некоторые форумы генерируют для каждого пользователя или хоста, заходящего к ним, идентификатор, который может зависеть, от IP и User-agent пользователя. Идентификатор этот заносится в hidden-поле формы и должен присутствовать в данных формы. Как сервер получает эти данные, идентификатор удаляется и генерируется другой. Если по прошествии какого-то времени идентификатор не был использован, он так же удаляется.

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

Как известно, в браузерах есть скриптовые языки. Наиболее распространённым является JavaScript — его понимает максимальное количество современных браузеров. Код на этом языке включается прямо в страницу браузера «как есть», что делает заимствование кода на JavaScript часто минутным делом. Это положение вещей не устраивает некоторых разработчиков, что привело к появлению (обычной для интерпретируемых языков) защиты — программ изменяющих код таким образом, чтобы его было трудно прочитать человеку (такие программы часто называют «obfuscator»).

Обычно такие программы изменяют имена пользовательский функций, процедур и переменных, убирают форматирование и, иногда, модифицируют сам код программы. Даже программисту средней руки вполне по силам создать неплохой obfuscator, делающий над строкой такие преобразования, чтобы JavaScript смог восстановить исходную строку, а написание программы-раскодировщика стало проблемой — ведь можно написать obfuscator, который при двух запусках выдаст разный, сгенерированный случайно (в каких-то пределах) код.

Таким образом, объединение «маркеров», которыми помечаются пользователи и JS-obfuscator’a, возможно, будет хорошим решением проблемы защиты от роботом-спамеров. Проблемы, которые нужно решить — написание хорошего obfuscator для JavaScript и вопрос генерации «маркера» (не забывайте о защиты от flood’a, если «маркер» генерируется при каждом заходе пользователя, злоумышленник может сгенерировать гигантское количество «маркеров»), оставляю на читателя.

Оставить комментарий

Ждать!

Финское чудо — телефон Nokia 6230, руссифицированный, думаю, где-то в пределах России, обладает исконно российским хамством. При включении, если очень быстро открыть адресную книгу, он может сообщить «Ждать, SIM-карта не готова».

Оставить комментарий

Видеокарта приехала

Теперь у меня дома есть горстка сибирской пыли — заботливо упакованная в четыре (!) пакета, пупырчатый полиэтилен и коробку из-под сибирских котлет приехала она на видеокарте Nvidia GeForce3 Ti 200. Дима Смирнов, узнав, что у меня «до сих пор Riva TNT2» подарил мне свою старую карточку. Мне и старой хватало, но теперь я знаю что такое нормальный ClearType — без спецэффекта «мы работаем на XT». Спасибо, Дима!

Кстати, наверное некоторые уже и не знают что такое XT. XT — это машины с процессорами 8086/8088. Вот Pentium (еще до Celeron) считался 80586. Когда я начинал работать лаборантом на ВМК, там в одном классе стояли эти замечательные машины. Было видно как печатаются буквы в «Нортоне».

Оставить комментарий

Моностих

Из статьи «Хайку и Моностихи»:

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

В статье цитируется несколько моностихов, мне более всех понравился моностих Александра Смира:

Денег… на лепесток розы

Оставить комментарий

Sort в PHP

Оказывается функция sort в PHP не использует установки локали в PHP4. Косвенно это можно узнать из руководства:

Sorting type flags:

SORT_REGULAR — compare items normally

SORT_NUMERIC — compare items numerically

SORT_STRING — compare items as strings

SORT_LOCALE_STRING — compare items as strings, based on the current locale. Added in PHP 5.0.2

Параметр SORT_LOCALE_STRING появился только в PHP 5.0.2. На мой взгляд, это очень странно. Valshooter рекомендует в этом случае использовать

usort($fruit, 'strcoll');

правда, в том случае, если локаль у вас UTF8 вряд ли сортировка вернёт осмысленные данные.

Оставить комментарий

ЛЮДИ ГОЛОС

Газета "Люди Голос" (21.04КиБ)

Кадр из фильма «Небесный капитан». Судя по фразам, переводили какой-то программой-переводчиком: газета называется «Люди Голос» («Глас народа», должно быть), написали каждое слово с большой буквы, что для русского совершенно не характерно, зато часто используется в английском, да и обрывочные предложения построены явно не носителем русского языка.

Меня это всегда удивляло — неужели из многомиллионного бюджета фильма нельзя выделить потратить сотню баксов на переводчиков (в фильме мелькают передовицы газет различных стран)? Сколько возмёт переводчик за перевод шести строк текста? На программу для перевода они ж потратились, а стоила она, подозреваю, далеко за сотню.

Фразы, которые удаётся различить:

ЛЮДИ ГОЛОС. СОВЕТ. которые присту.. чтобы печататься СССР. … марта. На вопрос, … атмость каждого из этих…

(Гига)нтские Металлические …асы Наций Кражи …шин Угля, Нефти и Урана. (М)ировые Лидеры Двигаются, (что)бы Защитить Запасы. …механические атакуют Россию

Оставить комментарий

Кастанеда

Я сейчас сделаю страшное признание: я не люблю Кастанеду. Не люблю потому что я ему поверил, а он всех нас (ладно — меня) обманул. За его произведениями нет учения, это чистой воды «фантазия на тему».

Начните со статьи Дон Хуан живее всех живых или история одного обмана, потом походите по гуглю.

27 комментариев

Курение может стать причиной медленной и мучительной смерти

Цитата с сайта Adme:

Комиссар ЕС по делам здравоохранения Дэвид Бирн представил эскизы нового оформления сигаретных пачек, которое вскоре станет обязательным для всех производителей табака для европейцев. Всего предлагается использовать 42 фотографии, иллюстрирующих вредное воздействие курения на человека.

На пачке сигарет «Brand» — предупреждение: фотография человека с поражённой нижней челюстью и надпись «Smoking can cause a slow and painful death».

Надпись на иллюстрации — «Курение может стать причиной медленной и мучительной смерти». Загляните на сайт — там ещё несколько картинок.

Оставить комментарий

Мой mod_autoindex

Испокон веков в Apache (внимание! речь идёт об Apache 1.x) существует модуль mod_autoindex — в комментариях в его исходном коде есть дата, видимо написания первой версии — 23 марта 1993 года. С тех пор модуль, очевидно, претерпевал какие-то изменения, но с 1993 года форматирование вряд ли изменилось — всё тот же тег PRE.

С 1993 года HTML обогатился таблицами и каскадными стилями (CSS). Вряд ли сейчас кто-то использует браузеры не знающие что это такое, странно, что для вывода информации в модуле mod_autoindex до сих пор используется PRE. Сам по себе модуль очень неплох — он позволяет быстро (часто для этого вообще ничего не надо делать — просто убрать индексный файл из папки) организовать файловые архивы, а главное — организовать их без использования относительно медленного скриптинга, что может часто бывает критично для сервисов, пользующихся большой популярностью.

В моём портфолио есть несколько проектов, где приходилось изобретать какие-то вещи (где-то, наверняка, велосипеды, знания о всех готовых решениях у меня нет) для улучшения производительности. Как я уже сказал, для огранизации файловых архивов иногда очень удобно использовать модуль mod_autoindex. Удобно, да вот незадача — владельцу сервиса, как правило, помимо производительности важна такая вещь как дизайн, оформление.

Стандартный модуль Apache позволяет менять, в этом плане:

  • header, т. е. часть над списком файлов (HeaderName, SuppressHTMLPreamble)
  • footer, часть под списком файлов (ReadmeName)
  • размер иконок (IconWidth, IconHeight)
  • внешний вид иконок (AddIcon, AddIconByType, AddIconByEncoding)
  • убирать из списка некоторые столбцы (SuppressLastModified, SuppressSize, SuppressDescription)
  • изменять описание файла (AddDescription)
  • и весьма ограниченно менять внешний вид выводимой информации (FoldersFirst, SuppressColumnSorting и т. п.)

Чаще всего этого для «упаковки» списка файлов в дизайн очень мало. Для облегчения задачи интеграции вывода mod_autoindex в дизайн я несколько усовершенствовал этот модуль. Всё по порядку.

Что умеет новый модуль

my_mod_autoindex (10.06КиБ)
  • Режим FancyIndex всегда включен и не выключается. Вряд ли найдётся много людей
    не использующих этот режим.
  • В основном режиме (об этом подробнее — чуть ниже) таблица файлов выводится при
    помощи тега TABLE, где у большинства объектов (например, у первой строка, чётных
    и нечётных строк) прописаны идентификаторы CSS-классов, из чего следует, что внешний
    вид таблицы вы легко сможете задать при помощи файла стилей.
  • Новая опция, позволяющая включить в листинг файла ссылку на корень сайта
    (IndexOptions +RootFolder, при использовании не забудьте добавить иконку,
    например так: «AddIcon /icons/back.gif .»)
  • Появилась возможность перенести Description в отдельную (новую) строку
    (IndexOptions +DescriptionAtNewRow)
  • Появилась возможность локализовать (перевести на родной язык) текстовую
    информацию модуля (директивы ParentStr, RootStr, NameStr, SizeStr, DescriptionStr, LastModifiedStr).
  • С первой страницы (если пользователь находится в корне сайта) убрана
    ссылка «Parent Directory», ведущая в этом случае, на ту же самую страницу.
  • Появился новый режим вывода, основанный на теге SPAN (именно он на иллюстрации),
    в частности, количество иконок в строке в этом режиме зависит от ширины окна браузера
    (IndexOptions +BoxWidth=N +BoxHeight=N +MaxIconHeight=N)

Новый режим вывода  

Прямоугольник (7.08КиБ)

Новый режим вывода включается автоматически, если были использованы параметры BoxWidth и BoxHeight. Эти два параметра отвечают за размер прямоугольника, в который заключена иконка (на иллюстрации выделено чёрным) и, по сути, определяют расстояние между соседними иконками.

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

В этом режиме под иконкой выводится имя файла, размер и дата модификации (если, конечно, не были использованы опции SuppressLastModified и SuppressSize), описание файла выводится в аттрибут «title» тега SPAN, охватывающего иконку и надписи (если не была использована опция SuppressDescription) — вы можете использовать DHTML, чтобы выводить информацию из title в статусную строку, всплывающую подсказку и т. п.

Пример

Файлы для вывода информации так, как это изображено на иллюстрации выглядят так:

Файл «.htaccess»:

IndexOptions +SuppressHTMLPreamble +NameWidth=*
IndexOptions +SuppressLastModified +FoldersFirst +RootFolder +DescriptionWidth=*
IndexOptions +BoxWidth=80 +BoxHeight=80 +MaxIconHeight=33

HeaderName /_bolk_autoindex/.HEADER.html
ReadmeName /_bolk_autoindex/.FOOTER.html
ParentStr "Наверх"
RootStr "В корень"
NameStr "Имя"
SizeStr "Размер"
DescriptionStr "Описание"

Файл «.HEADER.html»:

<head>
    <title></title>
    <style type="text/css">
    td,
    body { background-color: white; font-family: Verdana,Tahoma; font-size:10px }
    a    { color: black; text-decoration:none }
    .cell0, .cell1 {text-align: center}
    a:hover { text-decoration: underline }
    </style>

</head>
<body>
<h4>Пример использования</h4>
Содержимое каталога:
<!--#echo var="DOCUMENT_URI" encoding="none" -->
<br clear="all" /><br />

Файл «.FOOTER.html»:

</body>

Где взять и как установить

Файл можно взять у меня на сайте (ZIP, около 15Кб), для установки нужно переписать его на место старого модуля (каталог src/modules/standard) и перекомпилировать Apache.   Проблемы и их решения

Часто, помимо имени файла, его размера и даты создания, хочется вывести другую полезную информацию — например, разрешение для картинок, ID3 теги для MP3 файлов и так далее. Для этой цели я рекомендую воспользоваться полем «Description» и директивой «AddDesription». Задачей модуля не является и, надеюсь, не будет являться (иначе это приведёт к снижению производительности) автоматический вывод информации такого рода. Напишите скрипт (кстати, возможно позднее я его выложу), который пробежит по каталогам и добавит эту информацию в соответствующие .htaccess файлы и вызывайте его далее по мере необходимости.

Один из заказчиков попросил предоставить пользователю возможность самому выбирать какой вид листинга файлов он хочет получить — табличный или в виде иконок. К сожалению, у Apache 1.x нет методов переключения конфигурации в зависимости от каких-то внешних условий «на лету», так что было выбрано такое решение. На портах 80 и 443 (обычно используется для HTTPS-соединений) были заведены два виртуальных хоста:

<VirtualHost example.com:80>
...
AccessFileName .htaccess .htaccess-table
...
</VirtualHost>

<VirtualHost example.com:443>
...
AccessFileName .htaccess .htaccess-icons
...
</VirtualHost>

где прописаны одно общее имя .htaccess-файла для общих настроек и деректив AddDescription и два разных имени для различных наборов настроек mod_autoindex. Переключение происходит перенаправлением пользователя на определённый порт.   Хотелось бы ещё…

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

Оставить комментарий

«Чёрный бумер»

Тест: слышите ли вы примерно на 10-й секунде тему гармошки из песни «Чёрный бумер» в файле Bahet.mid? Мне кажется, что слышится очень отчётливо, с некоторыми поправками, конечно.

Оставить комментарий

myPHPinfo

Известно, что некоторые хостеры отключают функцию phpinfo из соображений безопасности. Неприятно, но часто приходится мириться и делать какие-то проверочные скрипты, чтобы узнать что же всё-таки есть на сервере.

Именно для таких случаев я написал myPHPinfo — программу на PHP, эмулирующую вывод функции phpinfo, насколько это возможно, конечно. Инструкции, ссылки для скачивания и изучения примеров работы есть в специальном разделе сайта.

Наученный горьким опытом даю совет: если вам кажется, что «зачем это нужно, если есть phpinfo», то перечитайте текст выше — там как раз об этом.

Оставить комментарий

Новый 8sender

Обновился 8sender (PHP) — программа, позволяющая отправлять на e-mail файлы в формате «BOLK quoted printable» (это наиболее экономичный формат пересылки файлов по почте). Программа писалась с единственной целью — экономить трафик и время адресата.

Новое в этой версии:

  • Имена передаваемых файлов записываются ещё и в тему письма.
  • E-mail отправителя теперь можно не указывать — в этом случае
    система автоматически подставит «admin@example.com»

Напоминаю, что для того, чтобы использовать эту программу, вам нужен интерпретатор языка PHP (минимально — файлы php.exe и php4ts.dll).

Для удобства тех, кто работает под Windows я сделал специальный файл — 8sender.bat. Скачивать и запускать нужно его, в пределах видимости скрипта должен быть расположен файл php.exe — той же папке или в любой папке, указанной в системной переменной PATH.

Плохие новости владельцев Windows 95/98/ME — вам придётся указать SMTP сервер для отправки сообщений. Инструкцию по запуску можно получить, запустив программу без параметров.

Оставить комментарий

Pimpin Aint Easy Watch

На иллюстрации — Pimpin Aint Easy Watch. Часы с 72 светодиодами. размеры 30x55x10 мм, водонепроницаемые, выдерживают до 3 атмосфер. Стоят 17800 йен или 155 долларов США. Производит их компания Tokyo Flash.

Pimpin Aint Easy Watch (13.72КиБ)

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

Оставить комментарий

Будущее CAPTCHA

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

Традиционно, разработчики либо мирятся с неизбежным злом, либо используют так называемый CAPTCHA-метод — пользователю выводится (часто зашумлённая) картинка с кодом или кодовым словом, пользователь должен ввести то, что он видит на картинке в специальное поле.

CAPTCHA-метод плох вот чем. Относительно простые изображения легко распознаются. Я, в качестве эксперимента, писал простой OCR для Chat.Ru и, посложнее, для SMS-сервиса Beeline.Ru (вероятность правильного распознования — 90%).

Если сильно исказить картинку, пользователь может не понять (со мной такое бывало), что на ней, собственно, изображено и после первой же неудачно попытки ввода уйти — робота же это не смутит. Если, скажем, вероятность распознавания составить всего лишь 20%, ничего не мешает роботу сделать несколько попыток до успеха.

Второй недостаток… Недавнее изобретение спамеров — метод «леммингов». Спамер открывает порносайт и… предлагает всем желающим войти, в качестве «платы», ввести код, написанный на картинке. Картинка берётся с сайта «жертвы». Как только «лемминг» вводит код, спам-робот использует его для регистрации или спама в нужном ему форуме.

Разновидность этого CAPTCHA-метода — просто писать слово с опечаткой или пропущенной буквой с просьбой ввести правильный вариант. Решение простое, но, когда я подумал над проблемой обхода такой защиты, решение этой проблемы пришло мне в голову менее чем за 15 минут. Многие сервисы поисковика «Яндекс» (например, Lingvo) предлагают варианты замены неверно написанного слова. Дело техники — «скормить» Яндексу слова с ошибкой и получить верное написание.

Защиту от техники леммингов, в общем случае, я предложить не берусь — разве что отлавливать подозрительную активность с какого-то IP адреса. А вот плохораспознаваемые роботом CAPTCHA-методы, но хорошо воспринимаемые человеком, на мой взгляд (приглашаю к здоровой дискуссии), существуют. Методы расположено от более вероятных (опять же, на мой взгляд), к более сомнительным.

Образы.

Иллюстрация (3.45КиБ)

Незаслуженно редко используют в качестве CAPTCHA-токенов изображения. Подобрать сто случайных изображений и сменить их, в случае активности спамеров — не проблема. Защиты такого рода существуют, но у них, на мой взгляд, существует недостатки:

  • Они предлагают пользователю ввести слово
    целиком. Пользователю неудобно. Я предлагаю использовать radio-кнопки, вероятность
    угадывания роботом увеличивается, но смотри пункт 2.
  • Они ничего не делают в случае неправильного ответа. Единственное, что сразу приходит
    в голову — сразу блокировать IP нарушителя. Делать так можно, но существует
    опасность заблокировать весь dialup-пул какого-нибудь провайдера, всех пользователей
    какого-нибудь NAT или прокси-серверов.

    Пользователь (см. иллюстрацию)
    может не попасть по «зайцу» (кто-то отвлёк, мышка заела) и выбрать «дрезину», но
    он не за что не кликнет в «рукомойник». Человек, в здравом уме, не спутает зайца с рукомойником.
    Ошибки позиционирования для близлежащих элементов можно и нужно прощать, за остальные —
    наказывать: для этого IP переходить к другому, более неприятному CAPTHA-методу,
    заставляя вводить слово целиком.
  • Они не пытаются запутать робота. Базу картинок, можно слить, если спам на
    данный сервер очень важен или у спамера много свободного времени,
    составить hash каждой иллюстрации и занести в базу.

    Несложно увеличить стоимость взлома — достаточно выводить не одну картинку, а, например,
    вывести в одну картинку сразу три изображения и туда же (в картинку) писать вопросы вида:
    «что изображено на картинке в центре».

    Количество вариантов изображения увеличивается
    до N*M*S, где N — количество изображений в базе, M — количество изображений, печатаемых
    в одну иллюстрацию, S — количество вариантов фраз. Важно, кстати, не делать изображения
    фиксированными по ширине — иначе их легко будет разделить. Проявите фантазию — изображения
    можно чуть масштабировать, инвертировать или перечеркнуть, фразу — писать в случайном месте
    и так далее. Число вариантов увеличивается настолько, что базу можно и не менять. А методы
    разделения и распознавания изображения по его участку не сработают.

Figlet.

История FIGlet началась весной 1991 года. Frank Sheeran написал другу автора первой версии Ian Chai письмо, где в качестве подписи использовалась строка, написанная ASCII-графикой. После чего Glenn Chappell, автор первой версии FIGlet, написал на C небольшуй программу, позволяющую писать придуманным им шрифтом любые строчки. FIGlet так и расшифровывается «Frank, Ian and Glen’s letters» («письма Френка, Иана и Глена).

С тех пор появилось несколько версий подобных программ, библиотеки на различных языках, я сам, относительно недавно, написал библиотеку Text_Figlet для PHP (скоро войдёт в PEAR). В данный момент доступно примерно 420 шрифтов для написания.

Шрифт в изображении можно уменьшить, например, до 4 пикселей и фраза на экране будет занимать вполне приемлемое пространство. Жизнь спамера осложняется не только тем, что количество шрифтов довольно велико, но и эффектом „smushing“ (горизонтальная склейка), который используется в некоторых шрифтах. Посмотрите внимательно на написанную фразу — соседние буквы в ней „склеены“.

В начале было слово…

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

Некоторые сервисы (LiveJournal), например, используют альтернативный CAPTCHA-метод — проговаривание фразы синтезированным голосом. В синтезе голоса давно нет ничего удивительного, но есть свои недостатки — синтез голоса более ресурсоёмкая операция, фраза с трудом распознаётся не носителями языка, да и звуковые платы есть не у всех. Пока метод можно рекомендовать к использованию разве что в качестве альтернативы.

Активный контент.

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

Разобраться в том, как это приложение работает, чтобы понять что оно выводит роботу не по силам. В принципе, можно было бы давать Java-машине или Flash-плагину отобразить изображение, снять с него скриншот и распознать его, но стоимость такого взлома, как мне кажется, непомерно высока.

Animated GIF.

Несколько более простая разновидность предыдущего метода не требующая отдельного плагина — Animated GIF. Если бы вы смогли разыскать где-нибудь 13-й параграф из „Ководства“ Лебедева (на сайте его нет), то вы бы смогли прочитать следующее:

Хитрость заключается в том, что GIF позволяет создавать анимации, где каждый кадр может иметь свою локальную палитру. Предел палитры в GIFе, как мы знаем — 256 цветов. Но никто не говорил, что нельзя записать 10 кадров, в каждом из которых было бы по максимуму цветов и которые были бы все одновременно видны. В результате мы получим 2560 цветов. Неплохо для начала.

Градиентный фон, переходящий от насыщенного красного слева к оранжевому справа.

Подобная идея приходила в голову не одному только Лебедеву, конечно. Картинка — одна из иллюстраций из статьи True Color GIF, где в формате GIF используются 32796 цветов. Заливка, которую вы видите, нужна лишь для демонстрации — в „Ководстве“ Лебедева GIF, содержащий 1792 цвета отображался без заливки, сразу целиком.

Пора, наверное, уже сказать к чему я клоню, если вы ещё сами не догадались. Разбор GIF’a, скомпонованного подобным образом — задача довольно сложная. Писать можно полноцветными буквами, части которых находятся в разных кадрах, играя с их перекрытием (например, заслонять символы или их части).

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

Оставить комментарий

Как писать ВЫ

Случайно нашёл на сайте Яндекс документ «Как писать слово ВЫ»:

Таким образом, местоимения Вы, Ваш пишутся с прописной буквы при обращении к одному лицу в текстах следующих жанров:

(а) личное письмо (адресат — конкретное лицо; факультативное написание — выбор определяет сам пишущий, выражая/ не выражая вежливое или уважительное отношение к адресату);

(б) официальные документы (адресат — конкретное лицо, отношение пишущего к адресату не имеет значения);

(в) анкеты (адресат — неконкретное лицо; отношение пишущего к адресату не имеет значения).

Еще раз напомним, что при обращении к нескольким лицам местоимения вы, ваш пишутся со строчной буквы (см. выше).

…

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

Оставить комментарий

Съёмки «Волкодава»

Тем временем, съёмки фильма «Волкодав» идут полным ходом.

Кадр из фильма "Волкодав" (23.37КиБ)

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

Оставить комментарий

Сессии в SSI

Один из проектов, в разработке которого я участвовал в недавнем времени, расчитывался на огромную посещаемость (забегая вперёд, скажу — проект действительно стал исключительно посещаемым), в связи с чем пришлось разрабатывать и использовать технические решения, позволяющие проекту не «падать» под огромными нагрузками.

В частности, была разработана система кеширования, которую можно охарактерировать как «всё по максимуму в в HTML, остальное — включаем через SSI и фреймы». Поскольку на сайте используются пользовательские сессии, сложилась ситуация, когда сессию должны могли инициировать и скрипты (язык программирования — PHP, основной сервер — Apache 1.x), включенные через SSI. Тут надо заметить, что из-за жёсткого требования заказчика — в строке запроса не должны присутствовать PHPSID и т.п (на сайте используются ЧПУ), использование trans_sid исключалось.

Trans_sid использовать нельзя, скрипты, включенные через SSI заголовок выдать не могут и, следовательно, проставить сессию в cookie — тоже. Сначала я, было, решил полностью отказаться от SSI и работать исключительно с iframe, но подумал — нельзя ли Apache заставить генерировать идентификатор сессии самостоятельно?

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

This module provides a magic token for each request which is guaranteed to be unique across «all» requests under very specific conditions. The unique identifier is even unique across multiple machines in a properly configured cluster of machines.

Внимательно пролистав список официальных модулей Apache, я нашёл в списке mod_usertrack — модуль, маркирующий пользователей при помощи cookie. Обычно он используется для того, чтобы различать пользователей в логах веб-сервера, но для нас главно то, что он маркирует пользователей идентификатором, который можно прочитать.

Проведя испытания, я столкнулся с вполне ожидаемыми трудностями — во время первого запроса, когда сервер только что отослал cookie клиенту, в переменной PHP \_COOKIE$ пусто — cookie ещё не пришли от клиента назад и, соотвественно, не были записаны в эту переменную.

В PHP есть функция apache_response_headers, возвращающая массив всех заголовков, выдаваемых в HTTP-запросе в данный момент. Естественно, в числе этих заголовков нашёлся и тот, что отвечает за простановку cookie. Функция, читающая такой заголовок и cookie, может выглядеть, например, так:

<?php
function U_sid()
{
    // Если идентификатор уже есть в cookie, возвращаем его
    if (isset($_COOKIE['Apache'])) return $_COOKIE['Apache'];

    // Иначе - ищем его в ответе Apache
    $responce = apache_response_headers();
    foreach (preg_split('/s*;s*/', @$responce['Set-Cookie']) as $chunk)
    {
        list($key, $value) = explode('=', $chunk, 2);
        if ($key == 'Apache') return $value;
    }

    return null;
}

«Apache» — это имя cookie, которое проставляет Apache. Далее — всё просто, в php.ini отключаем «session.use_trans_sid» и «session.use_cookies», чтобы запретить PHP создавать сессии, в .htaccess помещаем директивы модуля mod_usertrack:

CookieFormat Compact CookieTracking on CookieStyle Cookie

А в библиотечный файл (или наши файлы PHP, поближе к началу), вызов необходимых, для создания сессии, функций:

<?php
// Узнаём идентификатор сессии
if (($sid = U_sid()) !== null)
{
    // Если он не null, создаём сессию
    session_id($sid);
    session_start();
}

В итоге мы получаем cookie-сессию, которая создаётся даже в файле, включенном через SSI.

Оставить комментарий

Решение проблемы box-model

В журнале kukutz’a на сайте NPJ появилась заметка «Решение проблемы box-model» — перевод «Box model tweaking»:

Известно, что есть как минимум два варианта бокс-модели:

W3Cшный, когда в ширину блока включен только размер содержимого (контента), майкрософтовский, когда в ширину блока включается ещё padding и border.

Майкрософтовский, надо сказать, куда более понятен и интуитивен.

Сегодня мы рассмотрим, как, проиграв в валидируемости ваших CSS, попросить все браузеры придерживаться Майкрософтовской бокс-модели.

Оставить комментарий

Находка

Меня поправляют. Спасибо Ильгизу Ахмадуллину:

Найдя чужую вещь,необходимо заявить о находке в милицию или в орган местного самоуправления (ст. 227 Гражданского кодекса РФ). Если в течение шести месяцев со дня заявления о находке лицо, управомоченное получить найденную вещь, не будет установлено или не заявит о себе в органы милиции, местного самоуправления, — нашедший вещь приобретает на нее собственность (согласно ст. 228 Гражданского кодекса РФ). В то же время лицо, нашедшее вещь, вправе потребовать от собственника вознаграждения. Согласно ст. 229 ГК РФ размер вознаграждения за находку может составлять до двадцати процентов стоимости вещи. Ссылка.

Что называется — я слышал звон, да не знаю где он. Что примечательно — впервые узнал я о положении с находками именно из программы «Час суда». Видимо, невнимательно слушал судью или неверно понял.

Оставить комментарий