Каррирование и частичное применение

Я, оказывается, путал раньше каррирование и частичное применение. Даже не то чтобы путал, просто не пытался разобраться в чём разница между терминами, применяя то и другое по мере надобности. Недавно на «Хабре» в комментариях мне на моё незнание указали и я уяснил, наконец, что конкретно стоит за каждым термином.

Каррирование — преобразование функции от двух аргументов в функцию от первого аргумента, возвращающую функцию, результат вызова которой со вторым агрументом эквивалентен вызову первоначальной функции с упомянутыми аргументами. Немного запутанно, с примерами станет всё яснее. Я буду объяснять на примере Джаваскрипта, его больше народу знает, а на ПХП очень уж многословно получается. Кстати, в соответствующую статью в «Википедии» я добавил пример на «Гугл Гоу».

// функция, суммирующая два числа
function sum(x, y) {
    return x+y;
}

alert(sum(2, 8)); // вернёт 10

function sum(x) {
    return function (y) {
        return x+y;
    }
}

alert(sum(2)(8)); // тоже вернёт 10

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

Частичное применение функции (Partial function) — создание некой функции на базе указанной, где некоторые агрументы заменены конкретными значениями. Например:

function partial_one_arg(f, a) {
    return function(b) {
        return f(a, b);
    }
}

min0 = partial_one_arg(Math.min, 0);
min1 = partial_one_arg(Math.min, 1);

alert([min0(-5), min0(5)]); // вернёт [-5, 0]
alert([min1(-5), min1(5)]); // вернёт [-5, 1]

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

Очень простые штуки, часто встречающиеся в функциональном программировании.

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

Смените это немедленно!

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

Ещё банк помнит последние несколько паролей, так что менять два пароля по кругу тоже не получается.

Меня не устраивает метод, которым пользуются некоторые ребята — менять в конце пароля цифру. Я уже пару раз запутывался. Кстати, когдя я работал в «Яндексе», там тоже действовала похожая схема с регулярной схемой и запоминанием пароля.

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

Банк меня «защитил», я пользуюсь тем же паролем.

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

Максимум — посмотреть на что я трачу деньги. «Альфа» присылает мне одноразовый пароль платежа через СМС, «Райффайзен» разрешал платить только с использованием клиентского сертификата, «Ак барс» просит ввести одноразовый циферный код со специальной карточки.

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

Самое смешное, что любые банки определяют мою личность по телефону, по данным, которые легко узнать в интернете, плюс некое ключевое слово, которое, внимание, никогда не меняется в отличие от пароля. Хотите меня ограбить? Узнайте ключевое слово, зачем вам пароль?

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

Вопрос по организации переписки

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

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

Е́жи

Е́жи (52.98КиБ)

Сделал жене сюрприз — подарил на восьмое марта котёнка породы мейн-кун (из питомника My Cat’s Cradle). Имя надо было придумать на букву «е», долго думали, назвали Е́жи (ударение на первый слог), в честь героя одного из любимых нами с женой мультсериала «Ежи и Петруччо».

Спасибо, Ирек и Зухра, за помощь в подготовке сюрприза!

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

И у меня полноценный блог теперь! С фотографиями кошки!

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

Надеюсь «Пепси» с человечиной будет только выдумкой газетчиков

Отметим, что накануне Федеральная комиссия США по ценным бумагам и биржам (SEC) фактически разрешила компании PepsiCo выпустить новую газировку с усилителем вкуса на основе клеток человеческих эмбрионов, полученных при абортах.

Пищевому гиганту будет позволено заключить контракт со специализирующей на биотехнологиях компанией Senomyx, которая использует клетки почек мертвых эмбрионов (HEK 293 — Human Embryonic Kedney) при разработке усилителей вкуса.

В соответствии с решением SEC от 28 февраля, договоренность PepsiCo с Senomyx для производителя прохладительных напитков подпадает под определение «обычные деловые операции».

Цитата из статьи на сайте «РБК. Общество». Богатая идея, жду хьюман-бургеров в «Маках».

Добавлено позднее: в ЖЖ есть подсказанная читателем заметка «К теме каннибализма», которая рассказывает о том, что вышеприведённая процитированное выше не соответствует действительности.

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

Блог жизни

Таскаю ящики с вещами дома — ремонт продолжается, надо освобождать ещё две комнаты. В одном из ящиков нашли восемь тетрадок — мои «дневники жизни», так раньше назывались закрытые блоги.

В моём первая запись от 25/IV-1989.

Некоторые записи вполне в формате твиттера. Например:

9/V-90 г. Ничего такого нет всё обычно, сделал схема, а она „не пашет“.

22/I-91 г. Проснулся, сейчас пойду в школу.

18/II-91 г. Сегодня Наиля опять запутывала следы: ей зададут вопрос, а она на него сто слов никак не относящихся к вопросу.

Правда, большинство записей куда более длинные, множество — на несколько страниц.

Пролистал, чего только нет. Надо будет его в электронный вид переводить потихоньку. Там есть вырезанные куски обоев в квартире родителей (вся история как клеили и в каком порядке), исследование почерков моих родственников, планы всех перестановок мебели, приклеенные билеты от автобуса, рисунки схем, листинги первых программ, рассуждения на тему строения мира, изобретение собственных «смайликов» и так далее. Надо заканчивать чтение, а то залипну на часы.

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

А когда у вас появился первый «блог»?

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

Сцеплер

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

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

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

Перемена мест слагаемых

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

Цитата из одного известного закрытого блога.

Кстати, да, логично же. У лампы накаливания куча энергии уходит на нагрев, то есть на отопление окружающего пространства. Если сменить лампы накаливания на энергосберегающие, отопительные элементы просто будут больше работать.

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

Апач vs. Энжиникс

Меня кто-то убеждал буквально недавно, что Апач уже давно отдаёт статику столь же эффективно, как и nginx. На реальном весьма нагруженном проекте опыт смены одного на другое такой:

Я поставил и настроил ngnix для отдачи статического контента. Это снизило нагрузку в 2 раза…

Речь идёт о сайте president2012.ru. Версия Апача — 2-2.2.16-6+squeeze4, nginx — 0.7.67-3.

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

Магические методы

Что мне никогда не нравилось в Пайтоне, так это «магические» методы и свойства. Сейчас их существует за сотню:

bolk@Bolk ~  $ wget -O- http://docs.python.org/reference/datamodel.html 2>&- | egrep -o '__(\w+)__' | sort -u | wc -l
     108

Я, даже если очень постараюсь, вряд ли вспомню хотя бы половину. Всё «магическое» в Пайтоне начинается и заканчивается двумя подчёркиваниями, например, если сменить знак у объекта (сделать „-something“), то Пайтон попытается вызвать магический метод «__neg__». В более распространнённом ПХП всё примерно так же, но «магических» методов сильно меньше, их я уже помню на память все, но и возможности гораздо уже.

Запомнить все эти методы, наверное, реально при помощи тщательной зубрёжки, но сделать это естетственно, во время изучения языка, нереально, по моему мнению. Причина — неинтуитивность. Я давно высказывался на тему, почему хотя бы не расширить синтаксис и некоторые методы не разрешить называть как операции, то есть «/», «+», «[]» и так далее, смутно вспоминая, что в Си++, кажется, так и сделано.

Оказывается, так в точности сделано в языке «Скала»:

trait Ord{
    def < (that:Any):Boolean
    def<=(that:Any):Boolean = (this < that) || (this == that)
    def> (that:Any):Boolean = !(this <= that)
    def>=(that:Any):Boolean = !(this < that)
}

Это гораздо проще выучить, изучая язык, чем «__lt__», «__le__», «__gt__», «__ge__» (впрочем, когда перечисляешь в ряд несколько конструкций, кажется что ничего страшного в этом нет, но надо держать в голове, что их больше сотни).

У некоторых методов название упрощать не нужно, например «__unicode__» (преобразование к юникодной строке) всё равно дёргается стоит вызвать unicode(something) или «__del__» (деструктор) вызывается, в частности, если сделать «del something» (если ссылок больше нет). Они уже содержат название операции, просто оно буквенное. Есть методы, которые вряд ли вообще можно как-то проще назвать, например «__new__» и «__init__» — названия конструкторов для «новых» и «старых» объектов Пайтона.

Наверняка есть часть, которую понятнее не назовёшь. На ум сразу приходит метод «__hash__», думаю есть и ещё.

Но, бо́льшую часть, мне бы хотелось именовать как-то понятнее. Причём, вполне можно предложить синтаксис для левостоящих и правостоящих объектов, что-то вроде «def self+» и «def +self».

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

Перевод картинки в серый средствами CSS

Серое в CSS (92.76КиБ)

Экспериментировал в рамках прототипа для рабочего проекта с преобразованием изображения в серую гамму. Вообще, конечно, есть тег CANVAS, там это запросто, но интересно посмотреть появилось ли что-то в CSS со времён фильтров «Эксплорера». В IE с незапамятных времён (ещё с пятой версии) есть фильтр «gray», который даёт нужный эффект. Сейчас фильтры обзавелись префиксами и их рекомендуемый синтаксис иной, но суть та же:

.gray {
        filter: gray; /* IE 5+ */
        -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)"; /* new IE */
}

Я всё ждал когда же W3C «переизобретёт» микрософтские фильтры. Свершилось. Недавно появилась спецификация Filter Effects, которая, конечно, гораздо шире того, что когда-то предложили в «Микрософте», но основной смысл тот же, и даже некоторые фильтры похожи.

«Хром» включил в готовящуяся 18-ю версию эксперементальную поддержку этих фильтров:

.gray {
        -webkit-filter: grayscale(1); /* Chrome 18+ */
}

В «Опере» и «Файрфоксе» поддержки этих фильтров пока нет, но есть поддержка других — фильтров SVG. Можно, например, засунуть растровое изображение внутрь SVG и применить к нему нужный фильтр:

<svg style="width: 0; height: 0">
<filter id="gray">
<feColorMatrix type="saturate" values="0"/>
</filter>
</svg>

<!-- тут какой-то HTML код и вдруг понадобилась серая картика -->
<svg style="width:400px; height: 431px"><image xlink:href="/imgs/2008.11.27.jpg" width="100%" height="100%" filter="gray" /></svg>

Хорошие новости — SVG можно мешать с HTML. С версии 3.5 в «Файерфоксе» есть способ лучше — можно применять фильры SVG прямо к тегам HTML (и делать всякие другие чудесные штуки), правда все описания в документации почему-то относятся к XHTML или внешним ресурсам, но я обнаружил, что уже с четвёртой версии этот же трюк работает и с обычным HTML:

<style>
    .gray {
        filter: url(#gray);  /* Firefox 4+ */
    }
</style>

<svg style="width: 0; height: 0">
<filter id="gray">
<feColorMatrix type="saturate" values="0"/>
</filter>
</svg>

<body><img src="/imgs/2008.11.27.jpg" class="gray" /></body>

Добавлено позднее: в ходе дальнейших экспериментов оказалось, что в более ранних «Хромах» (нижнюю границу я пока не выяснил, но в моём 17-м работает), можно через CSS задавать фильтры для SVG, вот таким образом:

<style>
    .gray {
        -webkit-filter: url(#gray); /* Chrome ?? */
        -webkit-filter: grayscale(1); /* Chrome 18+ 
    }
</style>

<svg style="width: 0; height: 0">
<filter id="gray">
<feColorMatrix type="saturate" values="0"/>
</filter>
</svg>

<!-- тут HTML и внезапно понадобилась серая картинка -->

<svg style="width:400px; height: 431px"><image xlink:href="/imgs/2008.11.27.jpg" width="400" height="431" class="gray" /></svg>

При этом «Хром» требует, чтобы ширина и высота картинки были заданы в абсолютных единицах (остальные браузеры прекрасно понимают проценты).

Если собрать всё вместе, получается нижеприведённый код. Я поставил рядом два изображения: слева обычный элемент HTML img, справа — растр в SVG, по ссылке можно протестировать что поддерживает ваш браузер.

Посмотреть код.

<html>
<meta http-equiv="X-UA-Compatible" content="IE=9" />
<style>
    .gray {
        cursor: pointer;

        filter: url(#gray);  /* Firefox 4+ */
        filter: gray; /* IE 5+ */
        -webkit-filter: url(#gray); /* Chrome ?? */
        -webkit-filter: grayscale(1); /* Chrome 18+ */
        -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(grayscale=1)"; /* new IE */
    }

    .gray:hover {
        filter: none;
        -webkit-filter: none;
        -ms-filter: none;
    }

</style>

<svg style="width: 0; height: 0">
<filter id="gray">
<feColorMatrix type="saturate" values="0"/>
</filter>
</svg>

<body>
<img src="/imgs/2008.11.27.jpg" class="gray" />
<svg style="width:400px; height: 431px"><image xlink:href="/imgs/2008.11.27.jpg" width="400" height="431" class="gray" /></svg>
</body>

</html>

Мне негде потестировать IE и тем более десятую версию, но я где-то читал, что из «десятки» убрали фильтры, поэтому я, на всякий случай, поставил режим совместимости с девятой версией в коде.

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

libjpeg-turbo

Сегодня от нашего системного администратора узнал о библиотеке libjpeg-turbo. Это оптимизированная под SIMD-инструкции (MMX, SSE и NEON) библиотека libjpeg.

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

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

Я погонял тесты у себя на ноутбуке с «МакОС», результаты получились следующие:

bolk@Bolk ~  $ otool -L `which jpegtran` | fgrep libjpeg
    /usr/local/Cellar/jpeg/8d/lib/libjpeg.8.dylib (compatibility version 13.0.0, current version 13.0.0)

bolk@Bolk ~  $ time for _ in {1..100}; do jpegtran -optimize -crop 4000x3000+2+2 ex.jpg > /dev/null; done

real	1m28.244s
user	1m20.063s
sys	0m7.705

bolk@Bolk ~ $ otool -L /opt/libjpeg-turbo/bin/jpegtran | fgrep libjpeg
/opt/libjpeg-turbo/bin/jpegtran:
    /opt/libjpeg-turbo/lib/libjpeg.62.dylib (compatibility version 63.0.0, current version 63.0.0)

bolk@Bolk ~  $ time for _ in {1..100}; do /opt/libjpeg-turbo/bin/jpegtran -optimize -crop 4000x3000+2+2 ex.jpg > /dev/null; done

real	0m59.433s
user	0m50.509s
sys	0m7.728s

В моём случае прирост порядка 30%. Для теста я взял случайную картинку из фотоальбомов с разрешением 5184×3456 и при помощи утилиты jpegtran вырезал оттуда кусок изображения. Каждый тест повторялся сто раз.

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

6/9/20

С этим дробными номерами домов всю жизнь путаница.

Я всю жизнь считал, что дробный номер дома означает, что дом стоит более чем по одной улице и через косую черту перечисляются номера дома на улицах, на которых он стоит. Например, в Москве есть П-образный дом по адресу «ул. Рождественка, д.6/9/20». Он стоит на улицах Рождественка, Кузнецкий мост и Пушечная.

Но я знаю ребят, которые считают, что «30/1» означает «дом 30 корпус 1». Я с ними всегда спорил.

Оказывается в разных городах косая черта означает разные вещи. В Москве и Казани — как раз это номера по улицам на которых дом стоит, в Тюмени — номер корпуса, а в Саратове, если здание построено на месте снесённых «(например, с номерами 7, 9, 11), то иногда такому дому дают номер по первому и последнему снесённым через дробь (7/11)».

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

«Мой IP» на клиентской стороне

Бывает, что на стороне клиента надо узнать свой IP-адрес. Если не страшно подключать себе на страницу чужой JS, то это можно сделать следующим образом:

<!-- pure JS my IP -->
<script>
!function(callback) {
    var old = document.write;

    document.write = function (str) {
        var re = /(\d{1,3}\.){3}\d{1,3}/;

        callback(re.exec(str)[0]);
        document.write = old;
    }
}(alert);
</script>
<script src="http://en.dnstools.ch/out/4.js"></script>

Вместо «alert» можно передавать любую функцию, ей первым параметром будет передан искомый IP-адрес. Если на странице больше нигде не используется «document.write», то JS с внешнего ресурса вполне можно подключать как «defer», тут это нестрашно.

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

О разнице в восприятии

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

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

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

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

Жёны агёнтов спёцслужб, или Ещё раз о важности «ё»

А вот свежая цитата с «Баша»:

Агентов спецслужб, которых поймали на неверности их жены, выгоняют с работы по профнепригодности.

Интересна она тем, что совершенно неясно есть там «ё» в слове «жены» или нет. В зависимости от этого смысл меняется, но фраза всё равно остаётся непротиворечивой.

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

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

Я ♥ яблоки?

Скоро уже год как я используют только «Мак», но до сих пор помню, что в тот же день, когда я на него пересел, меня тут же записали в фанаты техники «Эпл». Сейчас у нас дома два «Мака» (у меня и жены) и один «Айпад 2», но я до сих пор не считаю, что я фанат.

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

Это какой-то пародокс, потому что миллионы офисных работников, опытных пользователей «Виндоуз» и «Ворда» не считаются фанатами этих продуктов. Я пересел на «Мак» по своим причинам и остался на нём, потому что он мне подходит.

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

Если мне подходит что-то другое, я, не колеблясь, выберу это другое. Например, сейчас на мне ботинки «Экко», футболка «Адидас», свитер «Коламбия» и джинсы «Колинс».

При этом на столе «Мак», в сумке «Айпад», но в руке «Гугл Нексус Уан», смартфон на «Андроиде».

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

Челябинск

Я уже два раза был в Челябинске, но ещё ни разу о нём не написал. Надо исправляться, тем более, что я обещал Илье Бирману это сделать.

Основная ассоциация с Челябинском у того, кто в этом городе не был — Челябинск суровый. Мем, рождённый, кажется «Нашей Рашей» и подхваченный в интернетах надёжно закрепился и в моей голове. Суров ли Челябинск? А то!

— Нечего дурью маяться, — считают суровые челябинские сотрудники Бюро Занятости, — проходи в тоннель, начинай подметать!

Табличка на стене: «Государственное учреждение ЦЕНТР ЗАНЯТОСТИ НАСЕЛЕНИЯ города Челябинска. Отдел по Ленинскому району». Синий объект на стене, вход в туннель.

Суровые челябинцы паркуют на улицах танки и БМП. Танк — серьёзная машина, не чета вашим «хаммерам». Один из них стоит около «МакАвто».

Зелёная боевая машина пехоты с номером 318 стоит на снежном валу у здания с вывеской «ОЛОВО», рядом припаркованы легковые автомобили и проходят пешеходы.
Зелёный танк Т-34, покрытый снегом, стоит на городской площади вечером; рядом играют дети, на башне видна красная звезда, на фоне — многоэтажный дом с освещёнными окнами.

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

Светофор на металлической опоре с ржавчиной, установленный на фоне ясного голубого неба; видны три секции с защитными решётками и проводами.

Суровые челябинские дворники скалывают ломом айсберги с асфальта.

Человек в тёмной куртке и белой шапке стоит у огромной кучи голубого льда и снега на фоне рекламного щита с адресом отеля «Аврора» на улице Двержинского.

В Челябинске даже дышится как-то сурово.

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

Суровый челябинский паб как бы спрашивает у вас…

Фасад здания с вывеской «Ну, и чё?» (арт-паб) и «Спортбар Букмекерский», припаркованные машины, снежные крыши, уличные фонари.

Суровый челябинский панк идёт без шапки и волос. На улице суровый мороз.

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

В центральном парке Челябинска запрещён выпас скота!

Строгий запрет на проезд, костры, мусор, рубку леса и выпас скота в парке им. Ю. А. Гагарина в Челябинске; указаны контакты управления экологии.

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

PHP 5.4

Поставил себе на ноут ПХП 5.4, смотрю как работает. Трейты, конечно, приятная штука, но гораздо важнее, что синтаксис в порядок стали приводить. К сожалению, с первой попытке порядок навести не удалось, но стало гораздо логичнее.

class B {
   function arr() {
       return [
           'i' => 0b101,
           'f' => function () {
               return ['i' => 1];
            }
       ];
   }
}

var_dump((new b)->arr()['i']); // works!
var_dump(call_user_func((new b)->arr()['f'])['i']); // still works…
var_dump((new b)->arr()['f']()); // don't :(

В примере дан класс «B», метод «arr» которого возвращает массив из двух элементов. По индексу «i» там число, по «f» — анонимная функция, которая так же возвращает массив. В новом (5.4) ПХП есть возможность получить элемент массива, возвращаемый функцией, не присваивая его переменной (и, кстати, вызвать метод объекта сразу после его создания).

Но увы, пока нельзя так же вольно обращаться с функциями, приходится их оборачивать в «call_user_func». Но я рад, что ПХП постепенно избавляется от своих болезней.

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

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

Был ли Альберт Эйнштейн троечником в школе

Опубликовали оцифрованный персональный архив Эйнштейна. В частности, есть копия его школьного аттестата (выданный высшей технической школой Цюриха). То есть можно теперь доподлинно узнать правдиво ли распространнёное мнение, что Эйнштейн был троечником в школе.

Аттестат (31.97КиБ)

Итак список оценок (шесть — максимальный балл):

Немецкий — 5 Французский — 3 Английский — не аттестован Итальянский — 5 История — 6 География — 4 Алгебра — 6 Геометрия — 6 Начертательная геометрия — 6 Физика — 6 Химия — 5 Естественная история — 5 Художественный рисунок — 4 Технический рисунок — 4

Как видите, да, Эйнштейн чисто технически троешник, хотя его «тройка» выше нашей, отечественной (насколько я понял систему оценок в Швейцарии, в тех случаях, когда у нас ставят «кол», у них ставят «ноль», так что их система вообще семибалльная).

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

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

Кабинетный портрет

Я как-то писал о старой фотографии, которую нашёл у родственников в Сергиевске.

На фотографии никаких надписей, но на картонке, на которую она наклеена, написано «Cabinet Portrait». Я надеялся, что это название ателье, оказалось всё проще.

«Cabinet Portrait» («кабинетный портрет») — распространённый когда-то формат фотопродукции 16,5×11,5 см (4½×6½ дюйма). Картонка, на которую наклеено фото называлась паспарту (Passe-partout), само фото имело размер примерно 10×14 см (4×5½ дюйма).

Кабинетные портреты впервые появились в Англии, в 1866 году, затем в США и постепенно распространились по всему миру.

Лого на картонке, как правило, относилось к её производителю. Впрочем иногда там бывали и реквизиты ателье, а некоторые известные фотографы клеили фотографии на именные паспарту.

Лого фабрики (34.75КиБ)

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

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

Шутки про технологии

abeshkov: Знаю отличную шутку про UDP, но не факт что она до вас дойдет. :)  n1313: про технологии шутим, да? Ну вот я знаю того, кто знает отличную шутку про DNS.  bolk: n1313, но ты не уверен, правильно ли помнишь?  n1313: чем дальше, тем сильнее, да. Но если что, я переспрошу.

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

«Не держите его так»

В фирме, которая выпускает программный продукт «ВИПнет» (сертифицированный, защищённый VPN, с алгоритмами ГОСТ) рассказали, что пытались договориться с «Эпл», чтобы встроить свой продукт в «Айпад» или распространять его для корпоративного сектора каким-то ещё образом. В «Эпстор» «ВИПнет» не пускают — приложению нужен слишком широкий доступ к устройству.

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

Но в «Эпле» решили, что у клиентов необходимости в этой реализации VPN для «Айпада» нет.

Из штаб-квартиры пришло письмо. В нём три фото — Медведев с «Айпадом», с «Айфоном» и «Макбуком», и подпись: «если руководитель вашей страны может работать с нашими продуктами, то почему остальные не могут?».

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

Ребус

Ребус (1.76КиБ)

Вот, ребус придумался. Поймёт кто-нибудь?

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

Гоу вышел

Today marks a major milestone in the development of the Go programming language. We’re announcing Go version 1, or Go 1 for short, which defines a language and a set of core libraries to provide a stable foundation for creating reliable products, projects, and publications.

Появился релиз языка «Гоу». Это означает, что язык стабилизировался и обратную совместимость ломать больше не будут.

Оставить комментарий

Лингвистические открытия

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

— Так же и пропащая душа, Саша Антипов, — сказала Сусанна. — Надеюсь, вы не имеете ничего против друг друга? Или, как теперь говорят, вы монтируетесь?

Из книги «Время и место» Юрия Трифонова, книга 1981 года. Не уверен, кто когда-либо слышал, чтобы слово «монтироваться» употребляли в этом ключе.

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

Слово pekoe происходит от тайваньского слова 白毫, пѐк-хо (бай хао), — «белый пух». Отсюда и русское слово «байховый». Таким образом, «пекой» — это чай из почек и листьев, на которых есть эти ворсинки.

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

Что это было вообще?

После представления в самом большом , концертном зале Цюриха — «Корсо» о нем говорил весь город. Ассистент втыкал ему в грудь и спину кинжалы и рапиры, а он абсолютно не реагировал на это…

Вот как описал его выступление перед студентами-медиками один из очевидцев: «Мирин Дажо, голый по пояс, молча стоит в центре комнаты. Ассистент очень быстро подходит сзади и вонзает в него 80-сантиметровую рапиру куда-то в область почек. Гробовая тишина. Студенты и преподаватели сидят с раскрытыми ртами, не в силах поверить своим глазам.Сомнений нет: клинок прошел через тело, кончик торчит спереди. Самое удивительное — даже не невозмутимость Дажо, а то, что на его теле нет ни капли крови…»

Это цитата из описания другого ролика на «Ютубе» про него же.

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

Мой прапрадед

У меня есть пока единственная фотография моего прапрадеда — Никанора Ивановича Литвинова. Судя по дате рождения его дочери, моей прабабушки, он родился где-то в 1870-80 гг.

Фотография подписана им собственноручно (если я правильно понимаю) и я знаю, что где-то, по родственникам есть минимум ещё одна его фотография, собираюсь её найти.

На обратной стороне открытки рукописная надпись: «На память в честь Евдокии Никоновой. От Никитора Иванова».
Литвинов Н. И.

Согласно «Статистическому ежегоднику Россіи» за 1913 год, показатель грамотности для мужчин в России на 1897 год был 29,3. Это те, кто умели читать. Писать должно было уметь меньшее количество. Правда в крупных городах этот показатель был сильно выше, например в Питере аж 65,2%, но мой предок жил, судя по тому что я знаю, в каком-то селе.

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

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

← сюда туда →