«Впути»

Впути (72.25КБ) Эта история случилась с моим близким родственником и его другом, другим моим близким родственником, но рассказана, для простоты, от первого лица.

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

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

Вкратце, у меня путь оказался продуктивнее. Мозги, плюс несколько скриптов на «баше» и список фильмов лёг в файл. На скриншоте открыто три штуки для демонстрации. Надо признаться, что доступ ко всем фильмам получить не удалось (только к трети, примерно), просто дальше интерес потерялся — усилия того не стоят.
13 комментариев
24 июля 2015 09:32

Велосипедное

Cube Reaction GTC SL 29 (189.62КБ) Меня можно поздравить сразу с двумя вещами. Во-первых, 27 июня приобрёл себе новый велик, на этот раз это карбоновая рама на шинах 29 дюймов, с воздушной вилкой и трансмиссией 2×10. Вес — чуть меньше 11 кило.

Долго выбирал и примеривался, например, не был уверен, что при моём росте мне подойдут колёса на три дюйма больше и что 2×10 после 3×9 будет удобна. Первое время, конечно, пришлось попривыкать, но сейчас уже чувствую себя уверенно. 150 км (167.28КБ) Во-вторых, ещё приблизился к цели проехать 200-километровый бревет — проехал сегодня 150 км. Насколько я знаю, время прохождения вычисляется из расчёта средней скорости 15км/ч, у меня на 150 км средняя — 22, так что есть все шансы.

Конечно, операция сильно выбила меня из колеи (сначала ездил потихоньку — меньше 20 км, позавчера решился на 50, а сегодня сделал рывок), но удалось быстро вернуться в форму.
33 комментария
19 июля 2015 22:05

Марксизм-ленинизм

Храм Всех Религий (168.34КБ) Сегодня съездил на велике в Старое Аракчино, посмотреть на Храм Всех Религий. На стене одной из башен увидел серп и молот и вспомнил, как мы спорили с одним моим приятелем — является ли комунизм религией. Мой визави считал, что нет, мне казалось и кажется, что да.

Ну смотрите, некое учение без строгого доказательства — имеется, есть проповедники, есть общины, есть культовые места (очень рекомендую дом Ленина в Ульяновске и дом Сталина в Го́ри), заповеди, соответствующая литература и даже святые мощи, до сих пор лежащие не в музее, а на Красной площади (если убрать из оттуда вам кажется кощунственной мыслью, святотарством, то вглядитесь в это чувство — что оно вам напоминает?).

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

Признаться, моя точка зрения несколько шаткая и даже спекулятивная — потому что я не специалист ни в советском периоде, ни в религиях. Буду рад вашим комментариям, особенно тем, кому есть что вспомнить о советских временах и культе руководителей того времени.
15 комментариев
17 июля 2015 18:21

Lukøje

Мой сон (46.41КБ) Я каким-то образом создал и поддерживал внутри себя миф, что я очень, очень, очень много сплю, куда больше нормы. Серьёзно, мне всегда так казалось. Мониторинг сна в моих часах наглядно показывает глубину моих заблуждений. Людям моего возраста рекомендован сон продолжительностью 7—9 часов, по графику видно, что я сплю, в среднем (график за три месяца) 7—8 часов в сутки, то есть вполне нормальное время.
2 комментария
17 июля 2015 14:05

Чтобы расплавленный автомат не капал на казённые сапоги…

Прочитал надысь на «Пакабу» «Попурри лайфхаков для армии» (кто и зачем, кстати, начал называть хитрости лайфхаками?), заинтересовал пункт номер 12:
Если после прыжка основной и запасной парашют не раскрывается – достань парашютную сумку и засунь туда ноги, согнутые в коленях – так тебя легче будет собрать
При том, что весь остальной текст выглядит жизненно весомым и серьёзным, как стадо бегемотов, создаётся ощущение, что дюжинный пункт добавлен не ради хохмы. Тогда возникает ряд законных вопросов.

Интересно, кто изобретатель данного метода и как он его популяризировал? Есть ли у метода евангелисты? А самое главное — есть ли те, у кого такой гемохроматоз в гонадах, чтобы при падении с парашютной высоты вспомнить этот совет и начать хладнокровно его выполнять, дабы на последнем пути осчастливить людей внизу хотя бы такой малостью?
17 комментариев
17 июля 2015 13:48

«Кремниевая долина»

Пока отхожу от операции, смотрю сериал «Кремниевая долина» и дабы не заржавел мозг, сделал расшифровку надписи на футболке Эрлиха — одного из героев сериала, на трёх языках: Перле, Пайтоне и Тикле. Листинг один для трёх языков:
#\
"@{[$\=qq{\n},\
print map {chr $_} (0b1000010, 0b1101001, 0b1110100, 0b1100011, 0b1101111, 0b1101001, 0b1101110)]}";#\
__END__ = 1;\
print(''.join(chr(b) for b in (0b1000010, 0b1101001, 0b1110100, 0b1100011, 0b1101111, 0b1101001, 0b1101110))); #\
"""
foreach name {01000010 01101001 01110100 01100011 01101111 01101001 01101110} {
    puts -nonewline [binary format B* $name]
}
puts {} ;#"""
Дольше всего с Перлом возился, пока не вспомнил, что у него есть вычисление выражений внутри строк через конструкцию @{[…]}. Нужно рассказать как всё работает?
Комментировать
10 июля 2015 19:29

МРТ

МРТ (98.78КБ) Я тут на операцию сходил, в качестве основного участника. Как оказалось в чём-то даже забавный опыт, хотя перед ней переживал зверски, но, слава премедикации, из самой операции я помню только один момент — что я нёс какую-то чушь и спрашивал доктора «ничего, что я с вами разговариваю?». Потом провал и вот меня уже будит жена, чтобы забрать домой.

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

Разница, оказывается, в детализации. На снимке слева — обычный аппарат, справа — тот, который так полюбили врачи нашего города, обратите внимание на то как хорошо справа видны сосуды.
5 комментариев
10 июля 2015 16:23

Политкорректный Unicode 8

Я всё ждал, когда это появится, и вот наконец в восьмом Юникоде обнаружились модификаторы цвета кожи. Модификаторов в Юникоде — пруд пруди, это специальные символы, которые сами по себе ничего не значат — они привносят что-то новое в символ, с которым комбинируются. Простой пример — модификатор ударения, вот вам ударная буква «й»: «й́». Модификаторы цвета (57.52КБ) Вот восьмой Юникод вводит модификаторы цвета (на картинке выше), при комбинировании с которыми цветные «эмоджи», которые уже давно входят в Юникод, могут менять свой цвет: Смена цвета (12.86КБ) Юникод всё усложняется и усложняется, чувствую, однажды они придут к чем-то похожему на ХТМЛ+ЦСС — будут базовые элементы и стилевые таблицы для их изменения.
6 комментариев
6 июля 2015 09:09

Изучаю 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