Что почитать в выходной

«25 лет: счастье и разочарование» — история условной Люси, представительницы поколения, воспитанного в завышенных ожиданиях. Трансформация «ты сможешь стать кем угодно» в «ты станешь кем захочешь» как причина кажущейся неудачи в жизни Люси.

Питерский мастер Юрий Хвтисишвили сделал потрясающую копию мотоцикла ИЖ-49 в масштабе 1:1 полностью из дерева. На работу ушло несколько месяцев. Потрясающе, просто потрясающе.

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

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

«Эволюция „зиги“» — версия, откуда появился жест, знакомый нам с детства по фильмам про войну — так называемая «зига», жест, которым приветствовали Гитлера. А так же трансформация этого жеста в другой — «рука на сердце», который сейчас широко используют политики.

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

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

Случайные числа в Sed

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

В основном, задачи очень простые и даже рутинные, ничего интересного, но вот вчера прислали действительно интересный вопрос. Вопрос в том можно ли командами «Седа» получить случайное число?

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

Итак, что же можно сделать? Команды жёстко заданы и менять их нельзя, возможно что-то можно сделать с входными данными?

Я как-то давно эксперементировал с гнушным «Седом» (gnu-sed, gsed) — он содержит в себе расширенный набор команд, в частности — команду «R», позволяющую читать первую строку файла. Тогда же я подумал — интересно, что будет, если прочитать файл /dev/urandom? Я о нём как-то писал — при чтении из него генерируется случайный поток байт.

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

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

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

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

В общем, у меня вышел вот такой код:

#!/usr/local/bin/gsed -n -f

# Очищаем экран, выставляем цвет чёрное на чёрном, убираем курсор
1i\\x1B[2J\x1B[f\x1B[30;40m\x1B[?25l

# Читаем файл случайных чисел, пока не встретим перевод строки
1R /dev/urandom

# Запрашиваем текущие координаты курсора 
1a\\x1B[6n

2{
    # Смотрим чему равна первая (Y) координата, оставляем только её
    s/.*\x1B\[\([0-9]*\);1R.*/Random number: \1/
    # Убираем текущий текст в буфер
    h
    # Очищаем экран, восстанавливаем цвет и курсор
    i\\x1B[2J\x1B[f\x1B[0m\x1B[?25h
    # Вынимаем из буфера сохранённое
    g
    # Печатаем сохранённое на экран
    p
    # Выходим
    q
}

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

2 комментария