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

Неожиданно обнаружил, что мои
䶵
Самый сложный иероглиф в китайском (из тех что есть в юникодных шрифтах) содержит 27 черт — 17 черт ключа (тематического классификатора сложного иероглифа) и 10 черт его второй части. Выглядит он вот так: «䶵» и означает особую флейту с семью отверстиями.
Как Битюцкий стал Желязны
Если возьмешь издание «Осириса», том Желязны, перевернешь заднюю сторону обложки, то ты увидишь рассказ под названием «Когда расцветают бомбы». Так вот я тебе скажу, что это не Желязны. Это Битюцкий.
Я потратил на это дело пять лет расследования. История проста до безобразия: в 1982 в ростовском КЛФ «Притяжение» начинают печататься различные рассказы
ребят-клубников. В многотиражкекакого-то завода у Битюцкого выходит рассказ, который называется «Когда расцветают бомбы». В газетном тираже. Битюцкий его привозит в 1982 на «Аэлиту» [в 1983 — ЮЗ], и, естественно, раздает: «Вот публикация, вот новая фантастика…». Все классно. Этот рассказ питерские фэны увозят к себе. А тогда были распространены самопальные переводы, «самопалы», «ФЛП», «ЛПФ», что угодно… Я называю это ФЛП — «фантастика любительского перевода», это более благозвучно, чем «любительский перевод фантастики»… ФЛП — это более удачная аббревиатура…Я «дернул за хвост», в различные годы, Кишинев, Одессу, Москву и Питер — потому что ко мне попадает сборник рассказов Желязны в самопальном переводе из Одессы, с просьбой передать его в Кишинев. Я просматриваю эту подборку, и в этом сборнике, отпечатанном на машинке, среди всех рассказов нахожу рассказ «Когда расцветают бомбы». Я охреневаю от этого всего, думаю: «Классно! Это же наши ребята, у меня же газета есть…»
Начинаю выяснять у одессита: «Откуда у тебя этот сборник?» «А мне, — отвечает, — москвичи передали…»
Ладно, хорошо. В Москве тогда печатали самопальный «Золотой фонд фантастики»… И тогда я москвичей дернул, говорю: «Кто сделал?» Они говорят: «Как — кто? Мы его в Питере выменяли».
Я ловлю ребят из Питера: «Кто, — говорю, — сделал?» Отвечают: «Это не я!» Я говорю: «Я знаю, что в Питере самопальные сборники делают три человека. Кто?..» «Нет, это не я… Это вообще без меня… Это он!»
Ладно, берусь за того: «Кто? — говорю. — Как ты мог такое сделать?» «Ты понимаешь, — он мне отвечает, — объем обмена ФЛП — 300 страниц, а я набил рассказов на 250 страниц, у меня не хватало 50 страниц текста… А рассказ Битюцкого хороший, он очень хорошо вписывается в систему Желязны… Я его просто взял из газеты, и передул на машинку… И все».
А когда Центрполиграф начал печатать серию «Осирис» — а в книге указано «перевод с английского» — они просто тупо брали самопальную распечатку и гнали ее в тираж. И вот так рассказ Желязны попал из ФЛП в книгу. И когда я через два года встречаю Битюцкого и говорю: «Сережа, я рад приветствовать мистера Желязны на русской земле! Я тебя поздравляю», — ну, и все такое прочее… Говорю: «Ну, сходи в Центрполиграф, попроси у них английское издание этого рассказа, пусть они покажут!» А он мне: «Да брось ты…»
Искал почитать
Надписи на школьной доске, которой около 100 лет

Обожаю такие истории — в одной из школ Оклахомы нашли школьные доски с надписями, которым около 100 лет. В 1917 году эти доски, не заморачиваясь, просто завесили сверху более новыми.
Самое интересное, что на них остались надписи и рисунки мелом школьников того времени, это всё невероятно трогательно, на мой взгляд. Меня заинтриговал круг, нарисованный на одной из досок — считается, что это некий способ изучения таблицы умножения, причём директор школы признался, что он о таком способе никогда не слышал.
Как при помощи этого круга можно было изучать умножение, может
PHP/FI
На ПХП я начинал программировать с третьей версии, предыдущую, вторую, никогда в глаза не видел. Занялся сегодня археологией, что интересно, интерпретатор собрался под «Мак»
По описанию, вторая версия — удивительно бедный язык, я попытался написать подобие функции var_dump (которой тогда в языке не было), описал в комментариях с чем столкнулся. Надо сказать, некоторые вещи очень сильно удивили.
Вообще, я хотел написать одну функцию, а отступ для вывода скаляра передавать вторым параметром, но оказалось,
В общем, пришлось сделать две разные функции.
#!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. Их я не использовал, просто не придумал как. Первая является костылём к парсеру (почитайте описание, у меня нет сил это описывать), вторая — фильтрует переменные из ГЕТ-
«Странный» JS
В ДжаваСкрипте полно странностей, да, но популярная картинка, которая получила сейчас широкое хождение (не буду её приводить, просто суть перепишу) имеет отношение только к безграмотности её авторов. Суть такова:
[] + [] // массив + массив
"" // результат — пустая строка
[] + {} // массив + объект
"[object Object]" // В результате получаем объект? Ну ок
{} + [] // объект + массив
0 // 0? Реально?
{} + {} // объект + объект
NaN // Not a Number? WAT?Выглядит очень всё ооочень странно, если думать, что происходит именно то, что написано в коментариях справа. На самом деле происходящее неверно интерпретировано авторами.
В ДжаваСкрипте фигурные скобки, помимо объекта, задают ещё и блок кода. В данном случае все «объекты» слева — на самом деле блоки кода. Откроем консоль и попробуем это доказать:

Как видите, в левый блок можно без труда добавить код и станет очевидно, что это не описание объекта. Так два последних обсуждаемых примера распадаются на две независимые команды — определение пустого блока кода, который ничего не выполнит и унарную операция «плюс» над пустым объектом или массивом.
С массивом, возвращающим пустоту при суммировании (конкатенации) всё ещё проще — в данном случае производится попытка вызвать метод toString, который у массива выводит строку его значений через запятую. Так как значений нет, строка пустая.
В общем, ничего сильно странного не происходит.
Кристина в красном
«Кристина в красном» — серия цветных (!) фотографий 1913 года, которые сделал Мервин О’Горман, британский авиационный инженер по методу автохрома. На фотографиях дочь Мервина — Кристина. Такие фото делались на стеклянные пластины, покрытые крахмалом, по методу запатентованному братьями Люмьер в 1903 году.
Странный 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» (вернул постинкремент). Получается «три».

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

Для этого нужно скачать программу 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»
}Надо бы, конечно,