«Четверо под одной обложкой»

Четверо под одной обложкой (101.72КБ) Пару месяцев назад я взялся переводить в электронный вид книгу Арканова, Горина, Успенского и Камова «Четверо под одной обложкой». Меня она заинтересовала тем, что из одного рассказа, содержащегося в ней, растут ноги известнейшей фразы «рояль в кустах». К сожалению, в интернете книги не оказалось Я, с большим трудом разыскав одного из немногочисленных её владельцев, получил от него сканы и приступил к переводу в электронный вид.

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

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

Хочу так же сказать огромное спасибо Денису Олеговичу Стребкову за предоставленные сканы!
1 комментарий
29 июля 2014 11:35

Use SVG

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

Одним из главных помощников в такой вёрстке является, без сомнения, формаг СВГ — формат векторной графики, который на данный момент поддерживают все распространённые браузеры (включая ИЕ, с девятой версии). Особенно приятно, что его можно включать прямо внутрь ХТМЛя, это очень удобно — если СВГ используется для кучи мелких значков на странице, то не будет лишних соединений с сервером — ведь всё грузится вместе с основным кодом.

Но встаёт другая проблема — проблема повторного использования. Если одни и те же значки присутствуют на странице в изобилии, страница будет распухать, что печально.

К счастью, есть выход. СВГ — гибкая штука, в этом формате есть возможность использования частей изображения повторно. Первым шагом нужно определить тег-контейнер с необходимыми нам изображениями, по одному в теге symbol. У каждого из них будет собственный идентификатор, по которому мы ниже будем на них ссылаться:
<svg style="display:none">
    <symbol id="folder" viewBox="0 0 49.833 67.167">
        <!-- код не рабочий, только для примера -->
        <path d="M15.938,67.…"/>
        <path d="M3.59,30.531c…"/>
    </symbol>
    <symbol id="file" viewBox="0 0 49.833 67.167">
        <path d="M12.233c0.…"/>
        <path d="M3.28C2.76…"/>
    </symbol>
</svg>
Тут у нас два изображения — folder и file, на которые мы можем сослаться следующим образом:
<svg width="28" height="37">
    <use xlink:href="#folder"/>
</svg>

<svg width="28" height="37">
    <use xlink:href="#file"/>
</svg>
Таких вставок может быть сколько угодно и все они будут использовать одни и те же изображения, описанные в теге-контейнере. Остаётся даже возможность лёгкой настройки под себя, например, можно задать парочку классов и раскрасить часть изображения в разные цвета:
svg.green {
    fill: green;
}

svg.red {
    fill: red;
}
Классы можно повесить на ссылающиеся теги СВГ, жаль только этот способ полон ограничений. Кроме как в ФФ более избирательные селекторы использовать не удаётся — всё, что ниже тега use для таблицы стилей как будто не существует. Если и есть какой-то способ это починить, я его не нашёл.
5 комментариев
29 июля 2014 00:09

Улетаем в Испанию

Через четыре дня мы с женой улетаем в Испанию на две недели. Это мой первый полноценный отпуск за три последних года. Посоветуйте — что с собой брать, куда ехать, как развлекаться. Мы думаем погулять по Барселоне (что стоит посмотреть), съедить в Андорру (как добраться?), вероятно — слетать в Париж (какие авиакомпании посоветуете, где смотреть билеты?). Tahiti Playa (99.32КБ) Фото взято с сайта отеля в котором мы будем отдыхать.
17 комментариев
25 июля 2014 15:35

Простой Цой

На 36 году жизни узнал, что строка из Цоя «а я сажаю алюминиевые огурцы на брезентовом поле» — про застёгивание брезентовой куртки на алюминиевые кнопки.
11 комментариев
19 июля 2014 23:22

Чипотл и Дейотл спешат на помощь

Чипотл Саусвест (248.73КБ) Спросил у продавщицы в «Сабвее» почему у них соус называется «Чипотл Саусвест», а не «Юго-западный копчёный чили». На что она мне без тени сомнения сказала, что «Чипотл Саусвест» звучит гораздо красивее и посмотрела мне в лицо, без тени сомнения ожидая, что я с нею соглашусь.

Как вы думаете, эта ахинея правда красивее звучит? В чём же красота?
44 комментария
18 июля 2014 14:27

Дыбонины

Всегда хотел иметь в дереве более-менее уникальную фамилию, мне казалось, что так данные будет проще искать. И вот у меня в дереве есть Дыбонины — фамилия настолько редкая, что Вконтакте людей с ней всего десяток человек. Дало ли мне это хоть что-то? Увы, нет. По крайней мере пока. В архивных документах сохранность по населённым пунктам, где они жили, плохая, а все носители этой фамилии ничем помочь не могут — либо не отвечают, либо историей семьи не интересуются никак. Дыбонины (91.31КБ) Жил-был в маленькой деревеньке Ново-Исаково около Бугульмы однодворец Иван Фёдорович Дыбонин 1794 года рождения. Как он туда попал история пока умалчивает, так же она умалчивает и чем жил Иван Фёдорович — как кормил семью.

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

Тем временем, отсутствие фамилий у крестьян порождало путаницу — с налогообложением и службой в армии. Пойди разберись во всех этих бесконечных Фёдорах Николаевичах, да Михайлах Степановичах, поэтому в 1888 году Сенат постановляет, что «именоваться определенной фамилией составляет не только право, но и обязанность всякого полноправного лица, и означение фамилии на некоторых документах требуется самим законом».

Так крестьяне начинают получать фамилии. Этот процесс растянулся почти на полвека — в некоторых деревнях крестьяне жили без фамилий аж до 30-х годов прошлого века.

Некоторые потомки однодворцев, помня свои потерянные фамилии, брали именно их — моя фамилия, Степанищев — однодворческая, по историческим источникам хорошо видно как она перестаёт употребляться, а потом появляется вновь.

А вот Дыбонины свою фамилию то ли забыли, то ли взять не смогли и стали Шапкиными. Во время процесса получения крестьянством фамилий, Пелагея Прохоровна из семьи Шапкиных (правнучка Ивана Фёдоровича Дыбонина), была замужем за моим прапрадедом — Павлом Степановичем. И он то ли не разобрался в идее фамилий, то ли виной тому была какая-то другая ошибка, но он взял на то время фамилию жены и стал Шапкиным.

На тот момент у него уже было несколько детей и по крайней мере один из них — Василий Павлович, 1884 г.р. так и записан с этой фамилией.

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

Вот такая непростая история.
6 комментариев
17 июля 2014 11:07

Язык программирования ГАРФ

Из случайно оборонённого комментария к одной из статей в интернете, узнал о существовавшем когда-то функциональном языке программирования ГАРФ (GARF — Generalized Arithmetic Recursive Functions), разрабатываемом в середине 1960-х Ильёй Шмаиным, советским специалистом в области математической логики и языков программирования.

Информации о языке очень мало, наиболее полное упоминание в рунете я нашёл в статье, которая так и называется  — «Илья Шмаин»:
Это больше, чем язык программирования, это некоторый способ, стиль программирования вместе с математической теорией этого стиля. Это программирование на основе рекурсивных функций, опирающееся на классические работы Клини и одно их обобщение, сделанное Есениным-Вольпиным.

ГАРФ — это язык функционального программирования. Но он намного более абстрактен и универсален, чем первые языки такого типа. На нем можно было определять произвольные типы объектов и произвольные (но вычислимые) функции и функционалы на этих объектах.

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

2. Упомянутые выше «индуктивно-определяемые области» содержали, в частности, идею того, что позже стало называться объектно-ориентированным програмированием (или абстрактными типами данных). Т.е. язык содержал средства для задания любых типов объектов с заданными на них функциями и отношениями, а потом уже на такого рода областях задавалась сама программа.

3. То, что в ГАРФе «и функции, и области понимаются в самом широком смысле», означало, что можно было задавать любые функционалы, причем их определение могло содержать параметры (тем самым тип функций и объектов не фиксировался жестко).
В общем, ничего конкретного в статье нет, а жаль — упомянутое интересно, любопытно было бы взглянуть!
10 комментариев
11 июля 2014 14:59

Цу-е-фа

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

Либо меня подводит память, либо меня она в детстве как-то миновала. Миновали и другие варианты — «ку-е-фа», «бу-це-фа», «ка-ма-но» и прочее.

Но вот именно «цу-е-фа» является исконным вариантом, а остальное — искажение. Кажется невероятным, но память поколений российский детей, играющих в эту игру, сохранила почти в неприкосновенности китайскую фразу «取悦發», как она звучит можно послушать на «Гугл Транслейте», утверждают, что переводится она примерно как «начинайте, пожалуйста».

Причём же тут китайская фраза? Оказывается, игра «камень-ножницы-бумага» была изобретена в Китае, где-то в 206 г. до нашей эры—220 г. нашей эры. Из Азии в начале 20 века игра попала в Европу и получила популярность в 1920-х годах, постепенно расползаясь по всему миру.

Существует так же вариант, где добавляется ещё и «колодец» (либо он заменяет «камень»), предположительно это французская модификация, её я тоже помню — играл в детстве.
17 комментариев
6 июля 2014 18:28

Велосипедная сигнализация

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

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

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

Набрал в «Гугле» и сразу нашёл замки с сигнализацией фирмы «Зена». Почитал подробнее, всё, в принципе, устроило — вешается на тормозной диск (с замком не уедешь), срабатывает на наклоны и вибрацию, воет громко (120 дБ, я послушал для интереса — это очень громко), сделан из стали, к штырю фиг подлезешь, чтобы перекусить. Взял себе довольно простую модель — «Икс-Икс-6», брал в магазине «Шоп-Байк», за 3,5 тысячи (седло со штырём мне обошлось в 4,2, для сравнения). Zena XX6 (39.91КБ) На фото выше я положил рядом визитку, чтобы были понятны размеры. Штука довольно увесистая, кстати, — полкило. В случае чего — ещё и оружие, снимаем футболку, кидаем туда сигналку и кистень готов.

Запирается сигналка нажатием на цилиндр замка, снимается при помощи ключа. При постановке на сигнализацию, пищит, сразу слышно — встала или батарейка села. Батарейки, как утверждают, хватает на год (т.е. на сезон должно хватить). Если будете брать себе, обратите внимание — на сайтах магазинов есть шаблон, который надо распечатать и приложить к тормозному диску, чтобы понять, подойдёт сигналка по размеру или нет. Zena XX6 на колесе (74.29КБ) Вообще, противоугонных аксессуаров хватает, на тросиках и замках свет клином не сошёлся — бывают «секретки» вместо эксцентриков, есть фонарь с модулем ДжиПиС, который сообщает хозяину свои координаты или такой же модуль, скрытый внутри рамы, в общем, чего только нет.

Своей сигнализацией пользуюсь уже неделю (устанавливаю, когда приезжаю на работу), а на ночь теперь велосипед всё-таки заношу в квартиру.
16 комментариев
5 июля 2014 23:25

Chrome (but not Safari) CSS hack

Обратил внимание, что половина интернета сбилась с ног в попытках найти стильевой хак для «Хрома», который не срабатывал бы в «Сафари». Неясно почему его ещё никто не придумал, у меня на это ушла пара минут:
@supports (top: 0__qem) {
    .chrome-only {
        border: 1px solid #000; /* стиль только для Chrome (не Safari) */
    }
}
Работает начиная с 28-го «Хрома» и не работает на «Сафари» (включая последнюю версию 7.0.5). Принцип простой, как чихание — «Сафари», даже самый свежий, не поддерживает конструкцию «@supports», правда её поддерживает Файерфокс и зомби «Оперы».

Эта стандартная конструкция предназначена для проверки — поддерживает ли браузер указанное свойство. Недостаточно подставить туда свойство с префиксом webkit — сейчас многие браузеры читают такие свойства как свои, над что-то иное.

Чтобы отсечь лишнее, я использую нестандартную единицу измерения Вебкита — «__qem», я о ней писал несколько лет назад. Вместе получается, что стиль в «Сафари» не срабатывает, потому что тот не поддерживает «@supports», а в остальных браузерах — потому что они не поддерживают «__qem».

Естественно, обёртки над Вебкитом (новая «Опера», браузер «Яндекса» и прочее) стиль увидят — но на то они и обёртки.

Случайные числа в 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 комментария
29 июня 2014 14:39

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

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

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

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

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

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

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

Чудно́е в PHP

На работе сейчас с любопытным багом в ПХП разбирались. Разобрались, вот выжимка:
interface I {}

var_dump(class_exists('cI')); // false
var_dump(class_exists('C')); // true

class cI implements I {}
class C {}

var_dump(class_exists('cI')); // true
var_dump(class_exists('C')); // true

Выходит, если класс реализует интерфейс, то его не существует выше строки, где он декларируется, класс без реализации интерфейса виден в любом месте. Версия ПХП — 5.5.11. Я для интереса попробовал на 5.6а1 (есть под рукой собранный) — работает так же.
4 комментария
20 июня 2014 10:40

Что почитать перед выходными

Алекс Экслер выложил у себя в блоге историю Максима Баталина о разблокировке Айфона, заблокированного кракерами-мошенниками. За разблокировку требовали 1000 рублей, самостоятельно это можно сделать бесплатно.

В блоге Архивариуса появилась статья о краске «Мумия», которая когда-то, как написано в статье, делалась из египетских мумий. Правда это или нет, не знаю, но статья любопытная.

Разоблачение «Шестидесяти фактов о Николае Втором» — очень проработанная статья в историческом сообществе Живого Журнала.

И напоследок — небольшая презентация об интерпретаторе ПХП нового поколения — ПХПНГ, несмотря на краткость, самая суть передана.
Комментировать
20 июня 2014 07:08

CSS variables

Константы в ЦСС (которые почему-то называются «переменными») — прекрасная штука, особенно в сочетании с вычисляемыми выражениями (calc). Я рад, что браузеры постепенно внедряют эксперементальную поддержку, с нынешними темпами обновшения есть надежда начать это использовать уже очень скоро (calc я уже использую, его ограниченно поддерживает даже IE9).

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

В 31-м Файерфоксе (он пока ещё в бете) синтаксис констант сменился и теперь будет включен по-умолчанию. Выглядит это так:
:root {
  --bgcolor: #000; 
}

body {
  background-color: var(--bgcolor);
}
Как видите, префикс «var» сменился на два минуса в полном соответствии с изменениями в стандарте. Чем не устроил предыдущий синтаксис мне не интересно, но этот префикс набирать определённо быстрее — всего-то надо нажать одну клавишу два раза.
2 комментария
19 июня 2014 11:57