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

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

ПХП и Винда

Порядка полугода назад разговаривали с кем-то о кроссплатформенности скриптовых языков, речь и о ПХП шла, в частности. Я, помятуя о каких-то проблемах, связанных с тем, что когда-то разрабатывал на собственной машине под «Виндой», а потом переносил на «Линукс», доказывал, что по меньшей мере в ПХП всё плохо, но конкретных проблем вспомнить не мог.

А тут, на днях, нужно было продумать веб-сервис на ПХП, который именно под «Виндоуз» и работает, нужно обращаться к КОМ-объекту программы, которая только на этой платформе бывает. Сразу проблема всплыла.

По задумке внешний клиент дёргает «ручку» у сервиса, получает некий идентификатор и ждёт до поры до времени. Работа сервиса же какое-то время продолжается, тут я планировал использовать register_shutdown_function. Не тут-то было.

Функция не заработала правильно ни с «Апачем», ни с «Энжиникс», в комментариях пользователей к документации есть одинокий комментарий 2002-го года, который сообщает о проблеме:
Note that register_shutdown_function() does not work under Apache on Windows platforms. Your shutdown function will be called, but the connection will not close until the processing is complete. Zend tells me that this is due to a difference between Apache for *nix and Apache for Windows.
Похоже с тех пор ничего не изменилось. Ну хорошо, я вспомнил, что в последние ПХП входит патч php-fpm, который похожий функционал содержит — функцию fastcgi_finish_request. Оказалось, что php-fpm не работает под «Виндой».

Решили не перебирать больше решения, а сразу перейти на запуск отдельного фонового процесса. Оказалось и это не тривиально сделать. Под «Виндой» нужно это делать следующим образом:
$commandline = 'start /b тут-программа-которую-надо-запустить';
pclose(popen($commandline, 'r'));
Сплошные приключения.
2 комментария
4 февраля 2012 18:04

%u → UTF-8

Столкнулся сегодня с задачей — надо сконвертировать пришедшую из JavaScript строку (в ней символы Юникода в виде «%uXXXX») в UTF-8 на PHP. Придумал, на мой взгляд, самый короткий способ это сделать:
echo json_decode(str_replace('%u', '\\u', json_encode($str_from_javascript)));
5 комментариев
3 февраля 2012 11:57

Эй, Эпл, эй, Эпл?



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

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

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

В общем, в видео именно это и показано — «Виндоуз» несколько раз окликает «Мак», прежде чем тот отвечает.
13 комментариев
1 февраля 2012 20:52

Годы испытательного срока

Новые подробности о компании Apple опубликовал в одном из интервью Адам Лащински (Adam Lashinsky), автор книги Inside Apple… По его словам, инженеры разного уровня подготовки, и обладающие разным опытом, подвергаются многократным собеседованиям в несколько этапов. Период интервью порой длится до 9 месяцев…

Также, инженеры могут годами работать над продуктами и проектами, которые оказываются фальшивыми, ненастоящими. Такая проверка проводится с единственной целью – изучить характер и честность новичков, а также их лояльность к новому работодателю. Если за годы испытательного срока информация о якобы революционном продукте не попадет в прессу, то таким сотрудникам можно доверять
Пишет «Макрадар». Годы испытательго срока, только вдумайтесь! Каково это в один прекрасный момент узнать, что то, куда ты вкладывал душу несколько лет, никому не нужно и это был «испытательный срок»?
11 комментариев
1 февраля 2012 11:42

«Сосчитал количество ног и поделил на четыре»

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

Бородатый анекдот в тему:
Едут два англичанина в поезде. Поезд проезжает мимо пасущегося стада коров.
Один из англичанин говорит:
— Пятьдесят восемь голов в стаде…
— Как вы узнали? — Очень просто — сосчитал количество ног и разделил на четыре…
17 комментариев
29 января 2012 11:02

ChinesePython

А вы знали, что существует ChinesePython? Выглядит как настоящий, но не радует.

Язык полностью переведён на китайский, включая ключевые слова, встроенные типы и так далее, код основан на Пайтоне 2.1.3. Вот пример того как смотрится программа на этом языке:
載入 系統
文件名 = 系統.參數[1:]

定義 修正行尾(文件):
    內文 = 打開(文件名).讀入()
    內文 = 內文.替換('\n\r','\n')
    傳回 內文

取 文件 自 文件名:
    寫 修正行尾(文件)
«載入 系統» — это «import sys». Эта же программа на традиционном Пайтоне выглядит вот так:
import sys
filenames = sys.argv[1:]

def fixline(filename):
    text = open(filename).read()
    text = text.replace('\n\r','\n')
    return text

for file in filenames:
    print fixline(file)
Основная цель создания интерпретатора на китайском, по словам автора — популяризация программирования. Начинающий китайский программист, вместо того, чтобы учить недоанглийский, который всё равно не позволит ему говорить на этом языке, но позволит понимать слова Пайтона и называть переменные на корявеньком английском, может сосредоточиться на концепциях, алгоритмах и тому подобном.
20 комментариев
29 января 2012 09:37

Ерунда на itertools и генераторах

Я люблю itertools и генераторы в Пайтоне, но как-то по работе пока не удаётся их применить, поэтому, чтобы не завять, приходится время от времени писать всякую ерунду.

Прочитал тут на «Хабре», что дробь 1/998001 даёт последовательность из чисел от нуля до 997. Вот я и написал код с использованием генераторов и itertools, который берёт эту дробь и выводит из неё все числа последовательно, пока не попадутся числа с разницей не равной единице.
from decimal import Decimal, getcontext
from itertools import groupby, islice, izip, takewhile, chain, imap

getcontext().prec = 3000

n = (
    groupby(
        enumerate(
            islice(str(1 / Decimal(998001)), 2, None)
        ),
        lambda n: n[0] // 3)
    )

n = (int(''.join(n[1] for n in n[1])) for n in n)

n = chain(*takewhile(lambda n: n[1] - n[0] == 1, izip(n, n)))

print ', '.join(imap(str, n))
Кстати, для вычисления дроби с точностью до трёхтысячного знака, используется модуль decimal.

Подумалось, что многим, наверное, было интересно сравнить как выглядит эквивалентный код на Пайтоне без всех этих страшных (на взгляд большинства) ленивых выражений. А то некоторые ребята по моей вине уже думают, что Пайтон какой-то адский язык. Ничего подобного. Вот, посмотрите, более традиционное решение:
from decimal import Decimal, getcontext

getcontext().prec = 3000

number, prev, out = str(1 / Decimal(998001)), -1, []

for i in xrange(2, len(number), 3):
    curr = int(number[i:i+3])

    if curr - prev != 1: break

    prev = curr
    out.append(str(curr))

print ', '.join(out)
17 комментариев
28 января 2012 17:14

Некоторые проблемы SQLite

Товарищ Адепт пишет в ЖЖ про проблемы SQLite. Если вкратце, то выявлены минимум две проблемы.

SQLite при снятии дампа «CREATE VIEW» выписываются в порядке создания. Если у нас две вьшки, «A» и «Б», созданные в порядке перечисления и мы пересоздаём вьюху «А» с использованием «Б», то при заливке дампа будет ошибка — в дампе-то первым будет создание вьюшки «А», которая попытается использовать несуществующую вью «Б».

Если создана вью, в конце которой комментарий стоит, то и в дампе будет комментарий в конце строки создания, экранирующий конечную точку с запятой.
create view commented_view
  as select something
       from some_table -- pretty useless view;
create view another_view as…
5 комментариев
28 января 2012 11:44

Стеганография и пробел нулевой длины

Болею, не спится мне. Вспомнил старую свою идею.

В Юникоде есть такой символ замечательный — пробел нулевой длины (код 0x200B), на печать не выводится, понимается всеми современными браузерами и большинством редакторов. Интервала между буквами, как следует из названия, не даёт.

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

Например. Дан текст: «Болк», в нём надо скрыть короткий текст: «yes». Я взял английские символы, чтобы не заморачиватсья с кодировкой.

Коды символов «yes» — 121, 101, 115. Значит текст приобретает следующий вид:

[121 символ пробела нулевой длины]Б[101 символ пробела нулевой длины]о[115 символов пробела нулевой длины]лк

Можно, кстати, вычитать из кода символа 31, если мы не планируем использовать символы перевода строки и табуляции в скрываемом тексте. Небольшой код на Пайтоне, приведённый ниже, иллюстрирует идею.
​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​#​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​E​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​x​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​a​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​m​p​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​l​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​e​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​b​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​y​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​ ​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​E​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​v​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​g​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​e​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​n​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​​y Stepanischev
from itertools import groupby, izip_longest
import sys
import codecs

sys.stdin = codecs.getreader('utf-8')(sys.stdin)
sys.stdout = codecs.getwriter('utf-8')(sys.stdout)

toenc = 'Evgeny Stepanischev'
input = sys.stdin.read()

def decode(input):
    return ''.join(chr(31+len(list(x[1])))
            for x in groupby(input, lambda x: x == u"\u200b") if x[0])

def encode(input):
    if len(input) < len(toenc):
        raise ValueError()

    return ''.join(x[0] + x[1]
            for x in izip_longest((u"\u200b" * (ord(x)-31)
            for x in toenc), input, fillvalue=''))


print(encode(input) if input.find(u"\u200b") == -1 else decode(input))
Если на вход ему подать текст без пробелов нулевой длины, он добавит в него скрытый текст, иначе попытается его оттуда извлечь.

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

Конечно, важна длина текста — таким способом не скрыть текст, длина которого много больше исходной, но способ можно и улучшить в этом смысле. Например, в качестве прерывающего символа выбрать что-то другое, что не выводится на экран как символ. Например, управляющий символ смены направления текста или что-то в этом роде.
14 комментариев
23 января 2012 02:11

Ёлки…

Смотрели «Ёлки-2»? Там есть момент, когда пассажирский самолёт с отказавшими двигателями садится на всеми забытую полосу, которую, однако, поддерживает в «боеспособном» состоянии её смотритель, не теряя веры, что она когда-нибудь пригодится.

Сегодня наткнулся на замечательный сайт «ТУГЕЗА», а там — на следующее описание:
Сергей Сотников – начальник вертолётной площадки в селе Ижма. Еще двенадцать лет назад эта площадка была пусть небольшим, но аэродромом. Но, как это часто бывает, бюджет урезали, взлётно-посадочную полосу закрыли и самолёты летать перестали.

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

В сентябре 2010 у Ту-154, летевшего из Якутии в Москву, отказали двигатели, и пилотам пришлось сажать самолёт с 72 пассажирами посреди тайги. Им повезло: на глаза попалась та самая списанная взлётно-посадочная полоса, за которой присматривал Сергей. Самолёт сел, все пассажиры остались целы.
История-то оказалось невыдуманной.
12 комментариев
22 января 2012 20:16

Почерк

Я сегодня как-то умудрился заболеть «на ровном месте», за последние полгода я ночевал в холодных помещениях, ходил с промокшими ногами и мокрой головой по морозу, а тут за ночь дома, в тёплой кровати, с закрытыми форточками умудрился простудить горло.

Поэтому лежу в постели, смотрю фильмы и ем всякое полезное и противное.

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

А ведь раньше, я помню, близкие люди знали почерки друг друга наизусть, я помню почерк своих родителей, например.

Это не хорошо и не плохо, просто как факт.
3 комментария
21 января 2012 22:31

«Альфа-банк» через восемь лет

20-й год? (49.16КБ) Я уже жаловался на ужасный интернет-клиент «Альфа-банка», но в прошлый раз то, что он показывает поддавалось хоть какой-то логике.

Сегодня я заметил, что у меня в некоторых платежах встречается тринадцатый и даже двадцатый год. Что бы это значило?
18 комментариев
21 января 2012 22:25

Всякая мелочь одним постом-8

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

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

Почему-то для многих трудная тема — использование «float» в CSS хорошо рассмотрена в статье «Float'омагия: пробуем не „плавать“ в спецификации, чтобы не утонуть в потоке» на «Хабре».

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

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

Германия готовится запретить перекуры на работе. Основной аргумент следующий: курильщики «получают возможность сделать дополнительный перерыв, а значит, подвергают дискриминации некурящих сотрудников… страдают работодатели, вынужденные оплачивать эти пробежки до „специально отведенного места“».
15 комментариев
21 января 2012 16:42

Лондонские сендвичи

Лондонские сендвичи (64.99КБ) Справа — фотография логотипа лондонского метро, сделанная Ильёй в Лондоне, в мае. Слева — логотип какой-то сендвичной, на улице Университетской, в Казани. Сегодня успел заснять из окна автомобиля сотовым телефоном.
7 комментариев
19 января 2012 20:44

КГУ

Я помню, что когда учился в КГУ, в Казанском Государственном Университете (сейчас он называется КФУ), мы шутливо расшифровывали его как «Как будто Где-то Учился».

Я ещё знаю расшифровки ВУЗов «Могила Вырытая Трудами Учёных» (МВТУ), «Хер Где Такое Увидишь» (ХГТУ), «Моя Тут Учёба — Совершеннейший Идиотизм» (МТУСИ), «Много Алкоголиков, Мало Инженеров» (МАМИ), «Место Исторического Развития Эпидемии Алкоголизма» (МИРЭА).

У аббревиатуры вашего ВУЗа была альтернативная расшифровка?
29 комментариев
19 января 2012 09:39