Изучаю 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 комментариев
26 июня 2015 09:31

Tcl/tk и Retina

О, оказывается, можно «ретинизировать» интерпретатор Тикля — сделать так, чтобы программы на этом языке хорошо смотрелись на маковской ретине (см. скриншот). Ретинизированный Тикль (24.29КБ) Для этого нужно скачать программу Retinizer и бросить в неё Wish.app, который находится в /System/Library/Frameworks/Tk.framework/Versions/Current/Resources/
Комментировать
23 июня 2015 20:38

Странный 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 комментариев
17 июня 2015 17:45

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

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

«Странный» JS

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

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

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

{} + {} // объект + объект
NaN // Not a Number? WAT?
Выглядит очень всё ооочень странно, если думать, что происходит именно то, что написано в коментариях справа. На самом деле происходящее неверно интерпретировано авторами.

В ДжаваСкрипте фигурные скобки, помимо объекта, задают ещё и блок кода. В данном случае все «объекты» слева — на самом деле блоки кода. Откроем консоль и попробуем это доказать: Вот что происходит на самом деле (9.90КБ) Как видите, в левый блок можно без труда добавить код и станет очевидно, что это не описание объекта. Так два последних обсуждаемых примера распадаются на две независимые команды — определение пустого блока кода, который ничего не выполнит и унарную операция «плюс» над пустым объектом или массивом.

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

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

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. Их я не использовал, просто не придумал как. Первая является костылём к парсеру (почитайте описание, у меня нет сил это описывать), вторая — фильтрует переменные из ГЕТ- (но почему-то не из ПОСТ-) запроса через маску. Секюрити!
Комментировать
13 июня 2015 22:10

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

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

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

Как при помощи этого круга можно было изучать умножение, может у кого-то есть какие-нибудь идеи?
4 комментария
12 июня 2015 22:38

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

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

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

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

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

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

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

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

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

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

Пульс покоя

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

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

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

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

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

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

Радио-86РК

Радио-86РК (105.07КБ) На снимке — «Радио-86РК», ровно тот самый на котором в 1989 году я научился программировать. Сначала на каком-то «Бейсике», потом на ассемблере. Сегодня родители привезли его из Лениногорска — все эти годы он где-то пылился у дяди, который его и собрал когда-то (компьютер промышленно не производился, предназначался для самостоятельной сборки).

В понедельник отдам в музейчик ИТИС — это высшая школа при КФУ. Её директор и мой хороший знакомый Айрат Хасьянов собирает для студентов небольшую экспозицию старой компьютерной техники.

Компьютер включается, загораются лампочки, но подключение к телевизору ничего не дало, то ли компьютер сломан, то ли я делаю что-то не так.

На борту «Радио-86РК» — 2КБ ПЗУ, 16 или 32КБ ОЗУ и процессор — функциональный аналог i8080A. Экран — чёрно-белый, с алфавитно-цифровым режимом отображения. Загрузка программ производилась с магнитофона (в те времена — с бобинного, у нас с братишкой была персональная бобина с нашими программами, кажется даже не одна).

Кстати, в сети есть эмулятор этого компьютера на ДжаваСкрипте, можно посмотреть в какие игры мы тогда играли.
4 комментария
30 мая 2015 22:22

100км

100 км на велике (576.82КБ) Достиг поставленной цели — проехал 100 км на велосипеде. Ноги довольно ощутимо болят.
8 комментариев
24 мая 2015 20:48

Опции просмотрщика PDF в Chrome

Многие, наверное, знают что у плагина Эдоуби для просмотра ПДФ есть специальные параметры, которые передаются фрагментом в урле. Эдоуби публиковала эти параметры в разных документах, а теперь они собраны в специальном ЭрЭфСи под номером 3778.

Я для интереса попробовал эти параметры в «Хроме» (там собственный просмотрщик, поэтому я не удивился бы, если бы они не сработали) и оказалось, что три из них всё же работают:
# увеличение на 50%
http://example.org/sample.pdf#zoom=50
# переход к странице №2
http://example.org/sample.pdf#page=2
# переход к главе «Chapter»
http://example.org/sample.pdf#nameddest=Chapter
Подробнее можно прочитать ЭрЭфСи (в частности, в «zoom» можно указать ещё два параметра). Так же параметры можно комбинировать, это тоже работает — если указать их через амперсанд.
4 комментария
24 мая 2015 10:15

JBIG2

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

Пока мы такие документы помещаем в ПДФ сканами в хорошем качестве в формате ДжПЕГ. Увы, это довольно расточительно. К счастью, ПДФ поддерживает не один, а целых три формата графики — ДжПЕГ, ДжПЕГ 2000 и ДжБИГ2. На последний я возлагал большие надежды.

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

Ошибки JBIG2 (34.98КБ) К сожалению, у формата есть серьёзный недостаток, на который я тут же и наткнулся.

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

Посмотрите, у меня на скриншоте выше — оригинальный ПДФ (слева) и ПДФ, где графика перекодирована в ДжБИГ2. Как видно при кодировании были перепутаны «п» и «и», «п» и «н». Для слов в документах может это ещё и не смертельно, но для цифр в суммах — беда.

Мне неясно можно ли что-то сделать в этом месте, возможно можно подредактировать кодек так, чтобы он реагировал только на 100% совпадение, но тогда, скорее всего, пропадёт всякий смысл использовать ДжБИГ2.

Остаётся ещё вариант с ДжПЕГом 2000, но с ним возможно, выигрыш будет столь незначительным, что затраты на конвертацию просто не окупятся.
12 комментариев
22 мая 2015 10:30