Ландау и алкоголь

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

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

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

Диалог с чешским врачом Яном Ишем из книги Коры Ландау-Дробанцевой «Академик Ландау. Как мы жили». Описывается восстановление великого советского физика после страшной автокатастрофы, в которую он попал.

Кстати, советую прочитать книгу, про физику там почти ничего, Кора, жена Ландау, описывает его жизнь так, как видела её она — бытовые вещи, его (довольно необычные) взгляды на брак, общение с друзьями, всеобщее почитание и так далее. Очень жаль, что я мало знаю об этом удивительном человеке, заполняю пробел.

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

Пульс покоя

Пульс покоя (17.12КиБ)

Неожиданно обнаружил, что мои фитнесс-часы измеряют ещё и пульс покоя. Они понимают когда я просыпаюсь и измеряют пульс в это время. Я проездил на велосипеде немножко в конце апреля (16 км) и весь май (почти 400 км), за это время упомянутый показатель у меня снизился с 75 ударов в минуту до 66.

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

䶵

Самый сложный иероглиф в китайском (из тех что есть в юникодных шрифтах) содержит 27 черт — 17 черт ключа (тематического классификатора сложного иероглифа) и 10 черт его второй части. Выглядит он вот так: «䶵» и означает особую флейту с семью отверстиями.

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

Как Битюцкий стал Желязны

Если возьмешь издание «Осириса», том Желязны, перевернешь заднюю сторону обложки, то ты увидишь рассказ под названием «Когда расцветают бомбы». Так вот я тебе скажу, что это не Желязны. Это Битюцкий.

Я потратил на это дело пять лет расследования. История проста до безобразия: в 1982 в ростовском КЛФ «Притяжение» начинают печататься различные рассказы ребят-клубников. В многотиражке какого-то завода у Битюцкого выходит рассказ, который называется «Когда расцветают бомбы». В газетном тираже. Битюцкий его привозит в 1982 на «Аэлиту» [в 1983 — ЮЗ], и, естественно, раздает: «Вот публикация, вот новая фантастика…». Все классно. Этот рассказ питерские фэны увозят к себе. А тогда были распространены самопальные переводы, «самопалы», «ФЛП», «ЛПФ», что угодно… Я называю это ФЛП — «фантастика любительского перевода», это более благозвучно, чем «любительский перевод фантастики»… ФЛП — это более удачная аббревиатура…

Я «дернул за хвост», в различные годы, Кишинев, Одессу, Москву и Питер — потому что ко мне попадает сборник рассказов Желязны в самопальном переводе из Одессы, с просьбой передать его в Кишинев. Я просматриваю эту подборку, и в этом сборнике, отпечатанном на машинке, среди всех рассказов нахожу рассказ «Когда расцветают бомбы». Я охреневаю от этого всего, думаю: «Классно! Это же наши ребята, у меня же газета есть…»

Начинаю выяснять у одессита: «Откуда у тебя этот сборник?» «А мне, — отвечает, — москвичи передали…»

Ладно, хорошо. В Москве тогда печатали самопальный «Золотой фонд фантастики»… И тогда я москвичей дернул, говорю: «Кто сделал?» Они говорят: «Как — кто? Мы его в Питере выменяли».

Я ловлю ребят из Питера: «Кто, — говорю, — сделал?» Отвечают: «Это не я!» Я говорю: «Я знаю, что в Питере самопальные сборники делают три человека. Кто?..» «Нет, это не я… Это вообще без меня… Это он!»

Ладно, берусь за того: «Кто? — говорю. — Как ты мог такое сделать?» «Ты понимаешь, — он мне отвечает, — объем обмена ФЛП — 300 страниц, а я набил рассказов на 250 страниц, у меня не хватало 50 страниц текста… А рассказ Битюцкого хороший, он очень хорошо вписывается в систему Желязны… Я его просто взял из газеты, и передул на машинку… И все».

А когда Центрполиграф начал печатать серию «Осирис» — а в книге указано «перевод с английского» — они просто тупо брали самопальную распечатку и гнали ее в тираж. И вот так рассказ Желязны попал из ФЛП в книгу. И когда я через два года встречаю Битюцкого и говорю: «Сережа, я рад приветствовать мистера Желязны на русской земле! Я тебя поздравляю», — ну, и все такое прочее… Говорю: «Ну, сходи в Центрполиграф, попроси у них английское издание этого рассказа, пусть они покажут!» А он мне: «Да брось ты…»

Искал почитать «что-нибудь похожее на Желязны» (из самого Желязны я, кажется, совсем всё прочитал), наткнулся на такую вот забавную историю.

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

Надписи на школьной доске, которой около 100 лет

Школьная доска (111.57КиБ)

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

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

Как при помощи этого круга можно было изучать умножение, может у кого-то есть какие-нибудь идеи?

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

PHP/FI

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

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

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

В общем, пришлось сделать две разные функции.

#!php.cgi -q
<?
# однострочные комментарии только такие, два слеша не работают

    /* так описываются функции */
    function var_dump_scalar $var, $indent (
        if ($indent) {
            /* вот так выглядит конкатенация строки — плюс, а не точка */
            /* интерполяции нет, а одинарные кавычки вернут код символа в них */
            $indent = strtr(sprintf("%' '" + $indent + "d", 0), "0", " ");
            /* функции str_repeat тоже нет, приходится вот так выкручиваться */
        } else {
            $indent = "";
        }

        /* всего три типа данных, нет булевого типа, нет ресурсов — fopen вернёт число */
        /* объектов тоже нет, конечно же */
        switch (gettype($var)) {
            case "integer"; /* после case точка с запятой, а не двоеточие */
                echo "%sint(%d)\n" $indent, $var;
                break;
            case "string";
                echo "%sstring(%d) \"%s\"\n" $indent, strlen($var), $var;
                break;
            case "double";
                echo "%sfloat(%f)\n" $indent, $var;
                break;
        }
        /* можно было бы вернуть всё через return, но мне не удалось бы продемонстрировать несколько вещей */
    );

    function var_dump $var (
        /* смотрим — передан ли параметр */
        if (isset($var)) {
            /* пытаемся определить — не массив ли это, отдельного типа нет */
            $cnt = count($var);
            if ($cnt > 1 || key($var) != "0") {
                reset($var);
                /* echo умеет принимать форматирующую строку */
                echo "array(%d) {\n" $cnt;

                /* других способов проверять конец массива нет — только итерировать по длине */
                /* цикла for в языке тоже нет */
                while ($cnt > 0) {
                    $key = key($var);
                    echo "  [\"%s\"]=>\n" $key;
                    next($var);

                    /* тут только скаляры, так как массивов, кроме одномерных не бывает */
                    var_dump_scalar($var[$key], 2);

                    $cnt--;
                }

                echo "}\n";
            } else {
                var_dump_scalar($var, 0);
            }
        } else {
            echo "Warning:  var_dump() expects exactly 1 parameter, 0 given\n";
        }
    );

/* ассоциативный массив */
$b["aaa"] = "aaa";

/* числовой массив, отдельного типа массива нет, любой тип является нулевым элементом массива */
/* конструкции array(...) тоже нет, массивы задаются только так — в строку */
$a = 1;
$a[1] = 2;

/* двухмерных массивов у нас нет, это просто операция слияния массивов */
$a[] = $b;

var_dump($a);

/* Результат работы:
array(3) {
  ["0"]=>
  int(1)
  ["1"]=>
  int(2)
  ["2"]=>
  string(3) "aaa"
}
*/

/* вот так заканчиваются PHP-скрипты, знака вопроса у закрывающего тега нет */
>

Но самый сок, конечно, это две функции — ClearStack и SecureVar. Их я не использовал, просто не придумал как. Первая является костылём к парсеру (почитайте описание, у меня нет сил это описывать), вторая — фильтрует переменные из ГЕТ- (но почему-то не из ПОСТ-) запроса через маску. Секюрити!

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

«Странный» JS

В ДжаваСкрипте полно странностей, да, но популярная картинка, которая получила сейчас широкое хождение (не буду её приводить, просто суть перепишу) имеет отношение только к безграмотности её авторов. Суть такова:

[] + [] // массив + массив
"" // результат — пустая строка

[] + {} // массив + объект
"[object Object]" // В результате получаем объект? Ну ок

{} + [] // объект + массив
0 // 0? Реально?

{} + {} // объект + объект
NaN // Not a Number? WAT?

Выглядит очень всё ооочень странно, если думать, что происходит именно то, что написано в коментариях справа. На самом деле происходящее неверно интерпретировано авторами.

В ДжаваСкрипте фигурные скобки, помимо объекта, задают ещё и блок кода. В данном случае все «объекты» слева — на самом деле блоки кода. Откроем консоль и попробуем это доказать:

Вот что происходит на самом деле (9.90КиБ)

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

С массивом, возвращающим пустоту при суммировании (конкатенации) всё ещё проще — в данном случае производится попытка вызвать метод toString, который у массива выводит строку его значений через запятую. Так как значений нет, строка пустая.

В общем, ничего сильно странного не происходит.

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

Кристина в красном

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

«Кристина в красном» — серия цветных (!) фотографий 1913 года, которые сделал Мервин О’Горман, британский авиационный инженер по методу автохрома. На фотографиях дочь Мервина — Кристина. Такие фото делались на стеклянные пластины, покрытые крахмалом, по методу запатентованному братьями Люмьер в 1903 году.

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

Странный PHP

А вот ПХП, в отличие от ДжаваСкрипта действительно странный. Давайте посмотрим на такой вот код и его результат:

$ php -a
Interactive shell

php > $a = 1; echo $a + $a++;
3
php > $a = 1; echo $a + $a + $a++;
3

Как видите, в том и другом случае у нас один результат — «3». Даже первая «тройка», казалось бы, противоречит здравому смыслу, а вторая — тем более. Что же происходит? Давайте разбираться.

Как работает первый пример?

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

Похожим образом обрабатывается умножение вместе со сложением: 2 + 2 * 2 = 6, а не 8, потому что умножение имеет более высокий приоритет.

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

В байт-кодах всё перечисленное выглядит следующим образом:

Байт-коды (23.90КиБ)

Тут с восьмой строки начинается второй пример (правда присваивание единицы во втором примере я опустил — как видите второй операции ASSIGN нет).

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

Tcl/tk и Retina

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

Ретинизированный Тикль (24.29КиБ)

Для этого нужно скачать программу Retinizer и бросить в неё Wish.app, который находится в /System/Library/Frameworks/Tk.framework/Versions/Current/Resources/

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

Изучаю TCL

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

Попробую пояснить как это работает. В данном случае все три параметра, передаваемых команде puts эквивалентны:

puts Hello; # это строка
puts "Hello"; # это тоже строка
puts {Hello}; # и это строка!

То есть фигурные скобки — это не «блок кода», а строка, правда со своими особыми правилами интерполяции. Это, вместе с конструкциями изменения уровня выполнения и позволяет создавать собственные дополнения к языку. Например, добавил в язык конструкцию unless (это такой if, только проверяется не истинность, а ложность условия):

proc unless {condition body} {
    ;# uplevel — конструкция, позволяющая выполнить блок выше по стеку
    ;# то есть, в данном случае, мы выполняем код в контектсе вызвавшего
    ;# процедуру unless кода, что позволяет увидеть все переменные, которые там определены
    uplevel [list if !($condition) $body]
}

set var false

;# Это наша новая команда
unless { $var } {
     puts "False: $var" ;# напечатает «False: false»
}

set var true

;# А это обычный if, которые есть в языке
if { $var } {
    puts "True: $var" ;#  напечатает «True: true»
}

Надо бы, конечно, что-то пописа́ть, чтобы лучше понять язык, задумки есть, скоро приступлю.

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

← сюда туда →