Евгений Степанищев

Я — эксперт в области разработки веб-приложений и безопасности в интернете. Каждый месяц мой блог посещают около 90 тысяч человек. Работаю техническим директором в «Системах документооборота», занимаюсь электронным правительством.

JSSS, JavaScript-based Style Sheets

В своё время, когда браузер фирмы Netscape был лидером на рынке, в нём была поддержка интересной, на мой взгляд, технологии, которая уже при рождении была незаслуженно забыта — «JavaScript-based Style Sheets» (JSSS). Сейчас эту технологию, насколько я знаю, не поддерживает ни один из существующих браузеров, а в те времена я использовал её, чтобы разделить стили для Netscape и Internet Explorer, а сейчас это представляет интерес не больше, чем Gopher.

Итак, в чём суть? Суть та же самая, что и в CSS, разница лишь в представлении. Несколько примеров, думаю, достаточно наглядно покажут суть:
<style type="text/javascript"><!--
    // H1 { color: blue }
    tags.H1.color = "blue";

    // BODY { color: black; background: white }
    with(tags.BODY) {
         color = "black";
        bgColor = "white";
     }

    // H1 EM .reddish { color: red }
    contextual(tags.H1, tags.EM, classes.reddish.all).color = "red";

    /* UL  LI { color: red }
        UL UL LI { color: blue } */
    with(tags) {
         contextual(UL, LI).color = "red";
         contextual(UL, UL, LI).color = "blue";
     }

     // P:first-line { font-style: small-caps }
     tags.P.firstLine.fontStyle = "small-caps";

     // P:first-letter { font-size: 200% }
     tags.P.firstLetter.fontSize *= 2; // 200%
--></style>
Теперь самое интересное, вычисляемые значения и функции:
<style type="text/javascript"><!--
    tags.IMG.width = .50 * document.width;

    evaluate_style() {
        if (visual.colorDepth < 2) {
             bgColor = "white";
             color = "blue";
        } else {  
             bgColor = "black";
             color = "white";
        }
    }

   tag.BODY.apply = evaluate_style()
   tag.ids.headertable.apply = evaluate_style()
--></style>
2 комментария
17 декабря 2007 18:34

Блогосфера на gopher'e — все друг друга знают

Помните я про gopher писал? OMG, на этом протоколе есть два блога: gopher://hal3000.cx/1/Phlog и gopher://hactar.net/1/blog. Мне их даже посмотреть нечем — на новой машине я поставил «Оперу», есть Internet Explorer, они gopher не поддерживают.

Спасибо Ломакину Илье за ссылку.
6 комментариев
17 декабря 2007 13:45

MSIE6 (MuSt dIE 6.0)

Мне очень нравится проект «UpgradeBrowser», это очень разумный способ снижения доли устаревших Internet Explorer в интернете. Смысл в следующем. Вы устанавливаете у себя на сайте специальный JavaScript-код перед закрывающим тегом BODY:
<!--[if lte IE 6]>
<script type="text/javascript" src="http://upgradebrowser.org/ie6fuck.js"></script>
<![endif]-->
Так же код ie6fuck.js можно скачать себе и вызывать локально. Пользователи Internet Explorer 6.0 и ниже увидят сверху сайта следующую симпатичную надпись:

Через ваш устаревший и небезопасный браузер к вам могут попасть вирусы с сайтов. Обновите его!


Ссылка «обновите его» ведёт на страницу, где рассказывается о последних версиях Internet Explorer, FireFox и Opera. Чисто психологически проще поставить новую версию программы, чем переходить на её аналоги, так что на этой странице очень разумно первым упоминается Internet Explorer 7.0.

Что так же немаловажно, эту панельку можно закрыть (в оригинале справа есть крестик) и она не будет появляться ещё 30 дней. Кстати, она очень напоминает стандартную панель Internet Explorer, так что есть шанс, что многие пользователя подумают, что обновиться предлагает сам браузер.

Я код себе уже поставил, присоединяйтесь к проекту.
24 комментария
17 декабря 2007 00:59

Мои ошибки при ведении блога

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

Первое и самое главное — неверно выбранный формат блога. Понимая тенденцию к быстрому потреблению, я сократил тексты, но решил делать выпуски (как до сих пор делает «Кулер», который я читаю много лет), а не обновления. Мне показалось это удобным — заходить на сайт только раз в сутки и получать все новости сразу. Сейчас эту проблему решает наличие RSS — заходить на сайт, чтобы узнать об обновлениях вовсе необязательно. Беда в том, что выпуски делать сложнее, так как это отнимает массу времени. Поэтому иногда не подходил к блогу несколько месяцев.

Второе. Я убирал заголовки, мне они показались ненужным элементом. Заголовки оказались нужны для RSS, писем с сайта и обособления записей в блоге друг от друга. Благодаря заголовкам пользователь может оценить — тратить ли ему время на чтение текста или пролистать дальше.

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

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

Это уже Web 3.0, новый уровень всемирной паутины, когда интернет работает не на уровне HTTP, а на уровне «сайт» и представляет собой свободноинтегрированные друг в друга сайты.
34 комментария
15 декабря 2007 01:02

₥₳₪€¥

Отличную расшифровку DRM подсмотрел — «₫¥₲¥₮₳£ R€$₮r¥₡₮¥¤₦₴ ₥₳₪₳₲€₥€₦₮» (искажённое «Digital Rights Management», составленное из знаков валют) . Напомню, что DRM — это технические средства для защиты авторских прав.
Комментировать
14 декабря 2007 15:23

Easter Ogg

Из HTML5 официально исключены форматы Ogg Vorbis и Ogg Theora (предназначенные для использования проигрывания мультимедия в тегах AUDIO и VIDEO). Против формата выступали фирмы Nokia и Apple.

Напомню корень проблемы: в HTML есть стредство для внедрения рисунков и определены форматы (GIF, PNG, JPEG), которые гарантированно будут показываться во всех графических браузерах, но нет ничего подобного для видео и аудио. Нет единых форматов и средств управления проигрыванием из браузера через JavaScript. С появлением HTML5 ситуация должна быть исправлена появлением тегов VIDEO и AUDIO и введением стандартов кодеков, которые должны поддерживаться всеми браузерами.

Возможно, вместо форматов Ogg, будут использованы H.264 (MPEG-4) для видео и AAC для звука. Аргументы — тот же H.264 выбирается из-за аппаратной поддержки, что очень критично на мобильных устройствах, тогда как для Ogg придётся писать довольно тяжеловестный по размеру кодек, кроме того, есть опасения по поводу патентов на эти форматы, опасаются, что часть формата может быть покрыта неизвестными патентами.

Так же ходят слухи, что основной причиной того, что форматы Ogg исключили, является то, что они не поддерживают DRM (средства для защиты авторских прав), это соображение возникло, большей частью из-за того, что противником форматов Ogg являются именно Nokia и Apple.
9 комментариев
13 декабря 2007 16:11

Как бы ноги не ошпарить

Новое рабочее место (49.76КБ) Я в Москве, это моё новое рабочее место, пока сфотографировать ничего не могу, но от нового компьютера писаю кипятком.

Кстати, у меня наконец-то работают комментарии!
21 комментарий
11 декабря 2007 21:13

А город подумал: ученья идут

На все сайты в домене exler.ru уже несколько дней идёт мощнейшая DDoS-атака. Поэтому сайт может иногда «пропадать». Для тех кто не знает, поясню. DoS-атака — это атака «отказ в обслуживании» («Denial of Service»), когда атакуемую машину заваливают запросами так, что она не справляется с загрузкой или каким-то иным способом добиваются недоступности ресурса (например, атака, при помощи которой добиваются ложного срабатывания системы защиты).

DDoS — это «Distributed Denial of Service» («распределённая» DoS-атака), когда атакующих машим несколько. Атака, по всей видимости, идёт с зарубежный «зомби»-сетей.

Сейчас админы уже успешно справились с отражением атаки, так что если и будут «пропадания», то очень кратковременные.
1 комментарий
9 декабря 2007 01:11

Ваш собственный OpenID

Многие думают, что OpenID — это что-то невероятно сложное в использовании. Вовсе нет. Давайте я покажу простой и полезный, для тех, у кого есть собственный сайт, пример использования OpenID. Как многие знают, для того, чтобы авторизоваться на чужом сайте, нужно иметь аккаунт на каком-нибудь сервере OpenID — ЖЖ, Li.Ru, MoiKrug, Ya.Ru и т.п. Если у вас есть логин в одном из этих сервисов, то у вас есть OpenID.

Что делать, если вы хотите подписываться у меня в комментариях не как «user.livejournal.com», а как «myblog.sample.com»? Наверное вам нужно будет установить себе на сайте собственный сервер OpenID? Правильно? Неправильно!

В OpenID есть интересная возможность — делегирование. Вы можете попросить другой OpenID-сервер выполнять функции OpenID на вашем сайте, достаточно иметь на этом другом сервере аккаунт. Для того, чтобы использовать эту возможность, нужно просто вставить две строки между открывающим и закрывающим тегом HEAD на первой странице вашего сайта. В одной строке нужно указать ваш OpenID (т.е. сам идентификатор) на другом сервере, во второй — URL используемого сервера.

Вот как это выглядит для сервера myopenid.com (кстати, очень рекомендую его к использованию):
<link rel="openid.server" href="http://www.myopenid.com/server/" />
<link rel="openid.delegate" href="http://ваш_ник.myopenid.com/" />
А вот так это будет выглядеть для Ya.Ru:
<link rel="openid.server" href="http://openid.yandex.ru/server.xml" />
<link rel="openid.delegate" href="http://openid.yandex.ru/users/ваш_ник" />
Так, для Живого Журнала:
<link rel="openid.server" href="http://www.livejournal.com/openid/server.bml" />
<link rel="openid.delegate" href="http://ваш_ник.livejournal.com" />
Для Liveinternet.ru:
<link rel="openid.server" href="http://www.liveinternet.ru/openid.php" />
<link rel="openid.delegate" href="http://http://www.liveinternet.ru/users/ваш_ник" />
Для того, чтобы изготовить эту строку для каких-то других сервисов пользуйтесь универсальным правилом: обычно значение поля «openid.delegate» совпадает с вашей персональной страницей на этом сервисе, а значение для «openid.server» можно взять из исходного кода той же страницы, там должен быть аналогичный тег LINK.
95 комментариев
6 декабря 2007 01:36

«Спеста» — винтажная система статистики, часть II.

Ещё несколько советов по работе со «Спестой», предыдущая пачка — в первой части статьи.

Совет пять. Судя по коду, «Спеста» иногда способна пропустить какую-то часть хитов (кстати, у «Spesta 2» тот же недостаток). Для слабопосещаемого сайта это не слишком важно, для сильнонагруженных станет серьёзной проблемой. Для того, чтобы поправить ситуацию, открываем файл counter.php, ищем строки, содержащие «SP_fr ($COUNT_FILE)» и «SP_fw ($COUNT_FILE, $content)». Заменяем их на следующие куски кода (первую найденную строку — на первый, вторую — на второй):
$fp = fopen($COUNT_FILE, 'a+');
flock($fp, LOCK_EX);
fseek($fp, 0);
$conts = fread($fp, filesize($COUNT_FILE));
ftruncate($fp, 0);
fseek($fp, 0);
fwrite($fp, $content);
fclose($fp);
Совет номер шесть. Открываем все PHP-файлы последовательно и в каждый, в начало PHP-кода ставим нижеприведённый кусок. Файл mailto.php удаляем.
$s_addurl = "";
9 комментариев
5 декабря 2007 18:21

PHP2EXE

Решил посмотреть что у нас на старую добрую тему php2exe — т.е. PHP-компиляторов. В последнее время в разговорах всё чаще мелькало упоминание RoadSend PHP Compiler, вот я его решил скачать и скомпилировать свой «Photoshop's Crap Remover». Эта програмка была написана в 2002-м году для удаления из файлов JPEG лишней информации. Фотошоп тогда очень активно её туда записывал — вплоть до preview, так что было актуально, но и сейчас, бывает, программа пригождается.

Вот этот компилятор я и скачал. Версия 2.9.0, бета. Первое, что я выяснил, когда нашёл где включается режим вывода лога компиляции, инсталлировать надо было туда, куда программа предлагала по умолчанию. Путь «Program Files» вызывает проблемы из-за пробела посередине. Следующая проблема — библиотека для работы с регулярными выражениями в формате Perl породила массу ошибок. Я решил это легко — у меня в программе одно, незначащее регулярное выражение, т.е. я его просто убрал.

В итоге, эксперимент окончился плачевно. Мало того, что итоговый файл оказался размером шесть мегабайт (при том, что исходная программа занимает 1.5 килобайта) — это ещё терпимо, понятно, что с ростом исходной программы этот размер меняться почти не будет, да и упаковывается он до одного мегабайта, например, при помощи NPack. Хуже, что скомпилированная (даже не сжатая) программа так и не заработала — при выполнении возникают ошибки переполнения.

Вывод: возможно, это огрехи бета-версии, но инструмент нерабочий.
6 комментариев
5 декабря 2007 13:05

Новую собаку старым трюкам

Егор Куновский описал способ при помощи которого можно научить Google понимать переходы с Rambler, Mail.ru и других российских поисковых машин. Не знаю, действительно ли Google знает только Яндекс, но лучше сделать это более аккуратным способом. У меня, до того как я убрал Google Analytics было так:
_uacct = "UA-ВАШНОМЕ-Р";
_uOsr.push('mail.ru','rambler.ru','webalta','aport','blogs.yandex.ru')
_uOkw.push('q','words', 'q', 'r', 'text')
urchinTracker();
Первой строчкой указываются адреса поисковых сайтов, второй — параметр в котором указывается поисковый запрос.
2 комментария
5 декабря 2007 01:27

Сирены «Титана»

Моё прежнее рабочее место (44.14КБ) На фотографии — моё предыдущее рабочее место, где я провёл три с лишним года на посту технического директора. В понедельник буду обживать новые место, в Москве, там уже купили какого-то четырёхпроцессорного монстра (!) мне в качестве рабочей машины. Так что, вероятно, кратковременно пропаду из интернета, не до того будет.
10 комментариев
4 декабря 2007 18:58

Spesta — винтажная система статистики

Выкинул гугловский «Урчин» и поставил смирновскую «Спесту». Все эти Flash-графики у «Гугла» — это очень красиво, но мне не нравится смотреть по нескольку минут на процесс загрузки, а время дорого. Тем более, что большинство инструментов, которые предоставляет эта статистика, мне не нужны, я туда даже не заглядываю.

Четыре совета, если будете ставить «Спесту».

Во-первых, Дима писал её в бородатые времена, так что для работы на нормальном хостинге она требует влюченного register_globals и выключенного error_reporting. В Apache, в файле .htaccess это делается так:
php_flag error_reporting off
php_flag register_globals on
Во-вторых, откройте файл index.php, найдите строку 162 (там выводится значение ТИЦ, в этой строке должно быть слово cycounter), после этой строки добавьте:
echo "<b>Google</b>:<br /><br />
<script language='JavaScript'
src='http://www.mipagerank.com/mipagerank.php/$hosturl?d=2'></script>";
Теперь вы сможете видеть ещё и PageRank вашего сайта.

Совет номер три. Откройте counter.php, найдите строку 150, там определяется IP человека, который к вам зашёл. Определяется несколько… некорректно, да и считает всех с одного IP за одного человека. Чтобы хоть как-то поправить это положение, впишите туда следующее, вместо кода определения IP-адреса:
$ip = $_SERVER['REMOTE_ADDR'];
$fields = array
(
	'HTTP_X_FORWARDED_FOR', 'CLIENT_IP', 'HTTP_FROM', 'HTTP_CLIENT_IP', 'HTTP_CLIENTIP',
	'HTTP_CLIENT', 'HTTP_X_FORWARDED', 'HTTP_X_DELEGATE_REMOTE_HOST', 'HTTP_SP_HOST',
);

foreach ($fields as $field)
if (isset($_ENV[$field]))
{
	$ip .= ' '.$_ENV[$field];
	break;
}

$fields = array
(
        'HTTP_USER_AGENT', 'HTTP_ACCEPT_LANGUAGE', 'HTTP_ACCEPT_CHARSET',
        'HTTP_ACCEPT_ENCODING', 'HTTP_TE', 'HTTP_UA_CPU', 'HTTP_UA_OS', 'HTTP_UA_COLOR',
        'HTTP_UA_PIXELS', 'HTTP_UA_VOICE',
);

$uniq = '';
foreach ($fields as $field)
if (isset($_SERVER[$field])) $uniq .= '~'.$_SERVER[$field];

$ip .= ' ('.md5($uniq).')';
Четвёртый совет — поставьте flock. Нет, не настройку в конфигурационном файле, она ни на что не влияет. Если умеете — поставьте вызов flock после каждого fopen. Если не умеете — ну оставьте как есть.
16 комментариев
4 декабря 2007 17:31

ЖЖ попал в СУП

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

Кстати, узнал оттуда новое для меня выражение «tl;dr» («too long; didn't read»), вариант нашего «ниасилил».
20 комментариев
3 декабря 2007 16:59