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

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

«Stupid IE hack» by Microsoft

«Stupid IE» CSS hack (32.27КБ)

Многие видели наверное — два года назад кто-то нашёл в CSS-файле на одном из сайтов Microsoft классы «StupidIEMarginHack» и «StupidIEWidthHack». Два года прошло, но я наткнулся на этот скриншот случайно, предполагаю, что я не единственный, кто видит это в первый раз.
Комментировать
11 марта 2008 16:48

Опыт перевозки пневматического оружия на самолёте

Опыт перевозки пневматического оружия на самолёте оказался успешным — в Казани пистолет я сдал сотруднику безопасности. В Москве, в Домодедове — получил. Единственное, что я не знал — что газовый балончик к пистолету мне взять в самолёт не позволят, пришлось оставить его в Казани.
8 комментариев
11 марта 2008 14:38

Чем быстрее всего отрезать строку в кодировке UTF-8

Решил протестировать — чем быстрее всего можно отрезать строку в кодировке UTF-8. В PHP для этой цели (помимо использования извращений, типа SQL-запроса) можно использовать: mb_substr из модуля «Multibyte string function», iconv_substr из модуля iconv, preg_replace в режиме UTF-8 из Perl-Compatible regular expression function и собственную реализацию прохода по UTF-8 строке.

Я взял строку в 700 UTF-8-символов и отрезал от неё 500 разными функциями. Вот что получилось (PHP 5.2.4 без акселераторов): Если кому интересно, вот моя функция по проходу по строке в кодировке UTF-8:
    $len = strlen($text);
    for ($pos = $cutted = 0; $cutted < $cut && $pos < $len; ++$cutted)
    {
            $ch = ord($text[$pos]);

            // multibyte char
            if (0x80 & $ch)
            {
                    for (; $ch & 0x80; ++$pos, $ch <<= 1);
            }
            else
            {
                    $pos++;
            }
    }
Итак, лучший способ отрезать первые \$N символов UTF-8 таков: preg_replace('/^(.{'.\$N.'}).*\uSs', '\1', \$text)
15 комментариев
7 марта 2008 18:56

Когда клиент говорит «вы же профессионалы»…

Когда клиент говорит что-то навроде «вы же профессионалы» — это означает следующее: «я ни хрена не понимаю в том. что вы будете делать, но не позволю сделать так, как надо,а напротив — выебу мозг настаивая на своих тупых хотелках, и на том, что насоветовали мне мои друзья, которые когда-то что-то слышали о предметной области, буду доставать вас по каждой мелочи и стенать над каждой копейкой, требуя урезать сметы и сделать все как можно дешевле. А когда выйдет в итоге нечто непохожее на воздушный замок моих мечтаний, я буду вздыхать „ну что же вы, вы же — профессионалы…“»
Чудесная цитата с Bash. Запишу себе, чтобы не забыть.
Комментировать
7 марта 2008 15:38

Клуб нелюбителей C++

В своё время я посмотрел массу языков программирования (и продожаю смотреть), на некоторых — что-то писал, хотя бы реализацию известной американской считалочки. И мне всегда казалось, что C++ — самый уродливый, нелогичный и жуткий из всех языков. Оказалось — не казалось. Очень хорошая статья «За что я не люблю C++» Алексея Борескова — лишнее тому доказательство.
31 комментарий
7 марта 2008 00:18

Купил пневматический пистолет, красавец Beretta M92 FS

Beretta M92 FS (35.37КБ)

Вряд ли кто-то, кроме тех, кто видел меня в игровых автоматах или на «пейнтболе», подозревает о моей тяге к оружию и стрельбе. О, теперь я эту тягу могу реализовать в полном объёме. Купил себе «Беретту» M92 FS — пневматика 4.5 мм. Полная имитация оригинальной «Беретты» — внешний вид, количество зарядов, даже вес (около килограмма).

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

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

Во-вторых, пневматика делится на несколько классов, по диаметру ствола и силе выстрела. У меня — 4.5 мм, 3Дж, по закону РФ оружием это не считается. Есть 6 мм, у которых сила больше, оружием они так же не считаются (но считаются «спортивным снарядом» и продаются в специализированных магазинах), но расход газового балончика у них больше.

В-третьих, о стоимости «реактивов». Вам потребуются балончики CO² и пульки. Балончики стоят 12-25 рублей, в зависимости от марки, от стоимости ничего не зависит. Пульки различаются по весу, калибру и форме. У меня в используются «рюмочки», в магазинах они стоят по-разному, упаковка в 250 штук обходится в 50 рублей — 20 копеек за штуку. Я пока расстрелял один балончик, его хватило на какое-то довольно дикое количество пулек.

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

В-пятых, есть такая штука как перевозка. По закону РФ рружием данный пистолет не является (к пистолету приложен сертификат), но в самолёт с ним вас не пустят. Вот что мне ответили на мой вопрос по этому поводу в компании «S7»:

Оружие (в т.ч. пневматическое) перевозится в упакованном виде, в изолированных от пассажирских салонов отсеках воздушного судна, при наличии у пассажира разрешения на право их хранения и ношения.

Прием оружия к перевозке, оформление необходимых документов, доставка на борт воздушного судна в аэропорту отправления и выдачу оружия в аэропорту назначения осуществляет сотрудник службы авиационной безопасности (САБ).
С точки зрения авиакомпании, даже столовый нож — оружие, любая пневматика так же считается оружием.
53 комментария
6 марта 2008 20:09

Комментарии на сайте

Проект переезжает на другой домен — bolknote.ru (и другой хостинг заодно). С прежнего имени сделан редирект, обновите закладки. Кстати, пока не работает HTTPS OpenID-авторизация, из-за отсутствия cURL на площадке.

Кстати, название домена придумал Дима Смирнов, за что ему большое спасибо.

6 комментариев
6 марта 2008 12:44

Internet Explorer 8.0 beta 1: можно скачать

Вышла первая бета Internet Explorer 8. Уже можно качать и пробовать, доступны версии для Windows XP, Vista, Server 2003. Проходит 17% теста ACID3 (IE7 проходил 13% теста), тест ACID2проходит полностью, CSS3 selector test — 335 тестов из 578 пройдено (Opera 9.50b, к примеру, проходит этот тест полностью).

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

То, что видно навскидку — режим эмуляции IE7, подсвечивание домена в строке URL, корректная работа с favicon (или это уже в седьмой версии было?), открытие окна в фоновой закладке кликом мышиным колесом, как в остальных браузерах, и встроенные инструменты для разработчика (просмотр DOM, CSS, отладка JavaScript и так далее), а после подения он спрашивает восстанавливать ли закладки.

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

Теперь версия IE на моей машине выглядит так: 8.0.6001.17184. Некоторые глюки, кстати, видны невооружённым глазом — кое-где что-то подвисает, иногда в окно нельзя переключиться и так далее.
Комментировать
5 марта 2008 23:51

Библейская загадка: зачем мужчине соски?

Теперь о самой семье. Почему Богу было угодно разделить человека на мужчину и женщину? Именно разделить. Признаки этого разделения даже видны на мужском теле. Никто не может сказать, зачем мужчине два сосца на его груди. Они не несут никаких функций. У женщины понятно: предполагается, что она будет матерью, будет кормить дитя. А мужчина? У него нет даже молочных желез, но сосцы присутствуют. Загадка, тайна, на нее нет ответа. В Библии об этом тоже не говорится. «Вопрос на засыпку».
Цитата из доклада «Библейские основы православной семьи», докладчик — протоиерей Димитрий Смирнов, второй международный конгресс «Мир семьи».

Загадка века просто — зачем мужчине соски. Никто не знает, да.
15 комментариев
5 марта 2008 23:18

«Вектор идей» для индустрии косметики

В пику инструменту «Матрица идей» студии Артемия Лебедева, сделал «Вектор идей» для производителей косметики (попробуйте перезагрузить страницу несколько раз). Ваши варианты приветствуются.
5 комментариев
5 марта 2008 18:17

ICQ2Go: humor? Moja ponimat!

У ICQ есть онлайн-клиент, написанный на Flash, многие, наверное, его видели. Но, думаю, мало кто видел, что будет, если кликнуть на нём правой кнопкой мыши и выбрать «View Source» («посмотреть исходный код»). В окно подгружается якобы исходный код этого клиента:
REM Flash ICQ Client version 1.0 build 2

REM #include <stdio.h>
REM Had to comment out the include line, VB didn't like it 

REM Initialize contact list
10 CLS
REM CLS added by dfl 10 Dec 2003

15 OPEN DIALOG
REM 20 FOR I=1 to 100
REM dfl 27-Dec-2004, added support for 103 contacts
20 FOR I=1 to 103
30		READ CONTACT$
40		PRINT CONTACT$
50	NEXT I

REM Main application loop

60 INPUT "" COMMAND$
65 IF COMMAND$ = "EXIT" THEN GOTO 200
70 IF COMMAND$ = "SEND_MESSAGE" THEN GOTO 90
75 IF COMMAND$ = "GET_MESSAGE" THEN GOTO 100
78 IF COMMAND$ = "QUIT" THEN GOTO 82
REM $$ Todo: add support for multilingual input
80 GOTO 60
82 GOTO 130

90 SEND MESSAGE$
95 GOTO 60
100	READ IN_MESSAGE$
100 PRINT IN_MESSAGE$
110 GOTO 60

REM Begin client cleanup sequence

130 GOTO 150
150 GOTO 170

REM End cleanup, we're ready to die

170 STOP
200 END

REM END
8 комментариев
5 марта 2008 11:39

Apple Air

На «Горбушке» уже в субботу можно было купить Apple Air, цена — 75000. Я посмотрел. Плоский, красивый, да. Но, извините, это не то устройство, которое отвечает понятию «ноутбук» как я это понимаю. Это… я не знаю… КПК-переросток.
23 комментария
3 марта 2008 15:54

Илья Бирман

Наконец-то познакомился с человеком, с которым общаюсь уже более 4-х лет (думаю, нас можно назвать друзьями) — живущим в Челябинске Ильёй Бирманом. Впечатления очень положительные, очень рад знакомству.

Я и Илья Бирман (44.08КБ)
8 комментариев
2 марта 2008 03:30

«Go!messenger» для PSP вышел!

«Go!messenger» — официальное приложение (имеется ввиду не «homebrew»), которое работает на обеих версиях PSP («fat» и «slim») и позволяет обмениваться видео- и аудио-сообщениями. Приложение доступно в Европе, но это не мешает установить его прямо сейчас:
Комментировать
29 февраля 2008 18:51

Чудесный Lua

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

Одна из мощных функций языка — метатаблицы, позволяющая переопределить операции для любого типа данных, включая любые составные. Вот например:
mt = {}

function mt.__add (a,b) 
    return { x = a.x + b.x, y = a.y + b.y }
end
Задаётся метатаблица (mt) у которой ключ __add (функция, отвечающая за сложение) определена как функция сложения вектора с двумя координатами. Например, в следующем примере (все примеры взяты из статьи «Язык Lua и использование скриптов на нём в программах на C++») я устанавливаю заданную метатаблицу «mt» для переменной «u», причём сложение «u» и «v» работает правильно — поскольку Lua ищет обработчик сложения сначала у второго оператора, в случае неудачи — у следующего.
u = { x = 1, y = 2 }
v = { x = 0, y = 1 }

setmetatable ( u, mt )   -- установить для таблицы u метатаблицу

w = u + v                -- осуществить сложение таблиц
print ( w.x, w.y )
Самое интересное — дальше. Тут мой мозг не ломается, но без руководства я бы не догадался. Дело в том, что метатаблица «mt», точнее её операция «__add» определена некорректно. Сложение пройдёт великолепно, но у переменной «w» новой операции сложения не будет — метатаблица «mt» для этой переменной не установлена. Правильный способ определения вот такой:
function mt.__add (a,b) 
    return setmetatable ( { x = a.x + b.x, y = a.y + b.y }, mt )
end
Т.е. таблица устанавливается ещё и для получившегося выражения. (Для тех, кто уже ничего не понимает, но знает PHP. Запись «{ x = a.x + b.x, y = a.y + b.y }» на PHP выглядела бы как «array('x'=>\$a['x']+\$b['x'], 'y'=>\$a['y']+\$b['y'])»).
9 комментариев
29 февраля 2008 14:01