MTV

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

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

Приятно видеть бывших виджеев, часть сильно постарела, но все до сих пор стильные, интересные, достойные. Если «ЭмТиВи» для вас приятное воспоминание из прошлого, фильм его не замарает.

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

Молодец, что молчишь

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

Статья спорная. Мякотка:

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

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

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

Что же предлагается взамен? Вариантов несколько — ничего не говорить (не стоит считать, что ребёнок — ходячее зло и каждый его добрый поступок надо подкреплять), использовать безоценочное высказывание (показываем своё участие в его жизни, но без оценки), задавать вопросы (подталкиваем на анализ и рассказ).

И наконец, если сделанное ребёнком действительно вызвало у вас сильные положительные эмоции, то искреннее «Молодец!», скорее всего, лишним не будет.

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

Пушной хлеб

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

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

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

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

Возникают сомнения, конечно, кому верить — мужикам, которые сотни лет тяжело работали, или ребятам, за которыми какая-никакая наука и эксперимент?

Впрочем я отвлёкся. Хлеб бы необыкновенно важен.

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

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

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

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

Радиационная линейка РЛ

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

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

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

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

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

Крутая пасхалка

Приборная панель автомобиля с зелёной подсветкой: тахометр, спидометр, датчики температуры и топлива, центральный дисплей с надписью «PLAY» и схемой.

Посмотрел сегодня «Первому игроку приготовиться», там сюжет строится вокруг «пасхального яйца» в программе виртуальной реальности, и вспомнил, что самое крутая «пасхалка», которую я видел за последние несколько лет — это тетрис в «Газели Некст».

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

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

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

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

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

Структуры в Си и CGO

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

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

#include <stdio.h>
#include <math.h>

struct point {
	double x, y;
};

double point(struct point p) {
	return sqrt(pow(p.x, 2) + pow(p.y, 2));
}

int main() {
	printf("%g\n", point((struct point){1, 2}));
}

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

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

Структуры, объявленные таким образом видны через CGO компилятора Гоу как C.struct_name (C.struct_point в данном случае). К сожалению, тут есть особенность, о которую я споткнулся — если запрашиваемая структура не определена, то Гоу не выдаст ошибки, мы просто получим пустую структуру:

package main

import ("C"; . "fmt")

func main() {
	Println(C.struct_undefined{}) // ошибки не будет
}

Но программисты — люди ленивые, писать всюду struct неудобно. К счастью есть способ этого не делать — можно завести структуру, а потом дать ей имя в пространстве всех остальных типов. Это делается при помощи ключевого слова typedef позволяющего создавать алиасы типов:

struct point {
	double x, y;
};

typedef struct point point;

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

Это нас подводит ко второму способу работы со структурами:

#include <stdio.h>
#include <math.h>

typedef struct {
	double x, y;
} point;

double veclen(point p) {
	return sqrt(pow(p.x, 2) + pow(p.y, 2));
}

int main() {
	printf("%g\n", veclen((point){1, 2}));
}

Ключевое слово struct перед типом уже не нужно, раз все имена в общем пространстве. Это же касается и CGO.

Как раз на эти грабли я и наступил — позабыл про эти все особенности. Когда я ещё писал на Си, всегда пользовался вторым способом, с именем в общем пространстве и привык к тому, что это и есть структуры.

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

Структуры и CGO

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

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

Каждый раз расстраиваюсь, когда сталкиваюсь с CGO. Идея-то прекрасная — встраивать в программы на Гоу сишные библиотеки почти без программирования на Си. Но частности всё убивают. То нельзя функцию по указателю передать, то вот убил час с утра сегодня, пытаясь починить ошибку в своей библиотеке go-gd.

Документация говорит нам, что сишные структуры доступны в Гоу через конструкцию C.struct_name, а её размер — через C.sizeof_struct_name.

Я так и пытался сделать и получал ошибки:

package main

/*
typedef struct {
    int x, y;
} test;
*/
import "C"
import . "fmt"

func main() {
    Println(C.struct_test{}) // «{}»? Что за…
    Println(C.sizeof_struct_test) // could not determine kind of name for C.sizeof_struct_test
}

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

Оказывается, и я набрёл на это случайно, в ходе экспериментов, struct просто не надо писать, тогда всё будет работать:

Println(C.test{}) // «{0 0}»
Println(C.sizeof_test) // 8

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

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

Интонационное ударение

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

Интонационное ударение ставится, чтобы указать место, где в речи мы выделили бы слово интонацией. В стихотворении Лермонтова о Бородине есть строчки:

Вам не видать таких сражений!..
Носились знамена, как тени,
В дыму огонь блестел,
Звучал булат, картечь визжала,
Рука бойцов колоть устала,
И ядрам пролетать мешала
Гора кровавых тел.

Фраза «рука бойцов колоть устала» ушла в народ и её, не зная контекста, можно прочитать двояко: чья-то рука устала колоть бойцов («рука бойцо́в колоть устала»), либо у бойцов рука устала колоть («рука́ бойцов колоть устала»).

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

Помимо устранения неоднозначностей, подобных вышеописанному, интонационное ударение так же используется для усиления: нейтральное «что я сказал?» можно усилить до «что́ я сказал?», а в нём сместить акцент: «что я́ сказал?», «что я сказа́л?».

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

Яндекс.Аллергия

Скриншот карты пыльцы Яндекса: Казань и окрестности, высокая концентрация пыльцы (5–10 апр.), выбор аллергенов, предупреждение об аллергии и кнопка онлайн-консультации с врачом.
Прогноз распространения аллергенов на основании данных за последние семь лет

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

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

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

Телеграм приуныл

https://twitter.com/telegram/status/979274718401515521

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

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

Клейма или счётные метки?

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

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

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

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

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

Фрагмент старой кирпичной стены с облупившейся белой штукатуркой и выцветшими красными кирпичами, на одном из которых виден вырезанный узор в виде звезды или снежинки.
Крупный план кирпичной кладки с белым раствором; на центральной красной кирпичной плитке видна выгравированная буква «Х».

А вот отметины на снимках выше загадочны тем, что совершенно неясно что это такое. Найдены они в своде здания первой половины 19-го века по адресу ул. Профсоюзная, 10. Мой приятель открывал бар, я подъехал посмотреть на кирпичи, познакомился с хозяином здания и осмотрел остальные помещения, вот там и наткнулся.

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

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

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

Баг в PHP 7.2 с output_add_rewrite_var

Для того, чтобы не подставлять в каждую ссылку и форму глобальные для проекта параметры запроса (идентификатор сессии, например), в ПХП используется техника, называемая Url Rewriting. У нас в проекте так передаётся токен против XSRF — благо есть возможность указать собственные параметры, которые надо передать и даже задать список тегов с атрибутами в которых это будет работать.

И при переходе на ПХП 7.2 словили неприятный баг, который уже поправлен в 7.1.9, но ещё почему-то не влит дальше: если урл не содержит ничего, кроме якоря, то параметры добавляются неправильно. Код для повторения бага такой:

<?php
output_add_rewrite_var('foo', 'bar');
?>
<a href="index.php">This is link</a>
<a href="#place">This is anchor</a>

В первую ссылку «foo=bar» добавится нормально, а во второй это будет не к месту, якорь будет испорчен:

<a href="index.php?foo=bar">This is link</a>
<a href="#place/?foo=bar">This is anchor</a>

Наверняка со стандартными сессиями ПХП, передаваемыми в урле, будет тот же результат, но я не пробовал.

Либо надо ждать обновления, либо поставлять вместо якоря текущий полный урл.

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

Lubunta 13.04 на Toshiba AC100

Делал недавно предпродажную установку «Лубунты» 12.10 на «тошку» — смартбук «Тошиба ЭйСи-100», и уже после установки обнаружил, что под эту машинку есть две более свежие версии — 13.04 и 13.10.

Скриншот рабочего стола с открытыми окнами: игра «Сапёр» (счёт 200), калькулятор с результатом 42, терминал и окно браузера с изображением пингвина из мультфильма.
Внешний вид «Лубунты» 13.04, запущенной на смартбуке «Тошиба ЭйСи-100»

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

Во-первых, при установке следует выбрать часовой пояс Минска — из-за российской чехарды с отменой перевода времени у старых релизов проблемы с базой часовых поясов, 13.04 не исключение. Если этого не сделать, не буду открываться https-сайты.

Во-вторых, в программе Software & Updates на вкладке Ubuntu Software нужно выбрать обновление с Server for United States, потом выполнить в консоли:

sudo sed -i -e 's/us.archive.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list
sudo sed -i -e 's/\(.*ports\)/#\1/' /etc/apt/sources.list
sudo apt-get update ; sudo apt-get upgrade

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

В-четвёртых, можно настроить верхний ряд горячих клавиш, я когда-то писал об этом, для этого нужно поставить несколько утилит, компилятор, скачать зип-архив утилиты input-event-daemon и скомпилировать её:

sudo apt-get install gcc make xdotool wmctrl
cd input-event-daemon; make

Утилиту и конфиг можно положить в /opt/input-event-daemon и прописать автозагрузку в /etc/rc.local.

В-пятых, в дистрибутиве не настроено переключение раскладки клавиатуры, делается это нетривиально, но расписывать не буду — легко гуглится.

Нашёлся и недостаток. В установленной «Лубунте» по-умолчанию идёт «Хромиум», к несчастью «Ютуб» в нём не работает — какие-то проблемы с воспроизведением H.264. Другой кодек, WebM играет, но без звука. Единственное, что работает без проблем — Ogg/Theora, есть и звук, и видео.

Попробовал поставить «Файерфокс», думал может там проблем не будет, но он еле ворочается. Больше ничего по этому поводу не предпринимал.

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

Оригами: лягушка

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

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

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

Думаю теперь, что такого из школьного оригами могло бы её так же поразить?

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

Машина

В книге «Письма из деревни» Энгельгардта, о которой я уже упоминал, персонажи нередко разъезжают на машинах, хотя на дворе 19-й век. При этом книга — не фантастика, а публицистика.

Вот только одно упоминание, в пятом письме:

Отрывок из текста о Сидоре, который дошёл пешком до Ярцевой, доехал на машине до Смоленска, купил плуг и цепь для быка Пашки, затем вернулся домой.

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

Вот что пишет Виктор Одинцов в своей книге «Лингвистические парадоксы» об истории более привычного нам названия:

Но в 1836 г. в связи с предстоящим открытием Царскосельской железной дороги и приобретением первых локомотивов в петербургской газете «Северная пчела» в № 223 от 30 сентября сообщалось: «Немедленно по прибытии паровых машин, которые для отличия от водяных пароходов можно было бы назвать паровозами, последуют опыты употребления их…» Наш современник, известный лингвист Ю. С. Сорокин считает, что редактор газеты Н. Греч, немец по происхождению, создал слово паровоз по образцу соответствующего немецкого слова.

Кстати, паровозы сошли с арены только к концу 20-го века — на отдельных направлениях они возили пассажиров до конца 1970-х годов. Папа как-то упоминал, что в 60-х года их к месту будущей службы везли через всю страну на составе с паровозом.

Правда некоторые действуют до сих пор — как аттракцион или на манёврах в железнодорожных депо и узлах.

Чёрный паровоз с красными колёсами и жёлтыми полосами, из котла идёт пар; на борту надпись «3р 797-41», рядом стоят люди на фоне деревьев.

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

1 комментарий

99 бутылок: SCSS

63. SCSS — язык шаблонизации для файлов CSS. Я написал реализацию «99 бутылок» на нём ещё в 2012 году, но по неизвестной причине так никуда и не выложил. Возможно к лучшему — посмотрел свежим взглядом и исправил несколько неточностей.

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

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

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

@function bottles($beer) {
    @if $beer == 0 { @return "no bottles" }
    @if $beer == 1 { @return "1 bottle" }

    @return $beer + " bottles"
}

@function beer($beer) {
    $b: bottles($beer);

    @return "#{ $b } on the wall, #{ $b }.
Take one down and pass it around, " + bottles($beer - 1) + " of beer on the wall.

"
}

$result: "
";

@for $i from 99 through 1 {
    $result: $result + beer($i)
}

@debug $result +
"No more bottles of beer on the wall, no more bottles of beer.
Go to the store and buy some more, 99 bottles of beer on the wall."

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

Не вырубишь топором

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

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

А вчера он мне кинул ссылку на статью «Биткоин под угрозой полного запрета: В его блокчейне найдены образцы детской порнографии»:

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

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

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

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

Банан велик, а кожура еще больше

Много когда-то программировал на ДжаваСкрипте, поэтому многие его «особенности» просто заучил наизусть, даже не утруждая себя детальным пониманием почему и как это работает. В свою защиту хочу сказать, что многие вещи там просто «исторически сложились»

А тут братишка прислал в «Телеграм» кусок кода, который всплывает на «Стек Оверфлоу» не первый год:

console.log(0 >= null); // выведет true
console.log(0 > null || 0 == null); // выведет false

Странное поведение, как ни крути, ведь даже название операции «больше или равно» раскладывается на две — либо «больше», либо «равно». Казалось бы оба варианта должны давать одинаковый результат.

Решил я полюбопытствовать есть ли объяснение этому феномену.

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

Let r be the result of performing abstract relational comparison lval < rval
If r is true or undefined, return false. Otherwise, return true

Что означает примерно следующее: если нам надо выполнить операцию «lval >= rval», то мы должны её преобразовать в «!(lval < rval)». То есть «0 >= null» преобразовывается в «!(0 < null)», результат операции внутри скобок — false (так как «ноль» не меньше, чем null), что после отрицания даёт нам true. Всё просто.

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

PHP8 ★

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

Пока всё прогрессивное человечество переходит на ПХП7, а менее прогрессивное до сих пор чахнет над каким-нибудь 5.4, я решил разведать что там обещается в восьмой версии и когда её обещают.

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

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

Или вот похожий пример с константой:

class Sample
{
    const test = 'const';
    public static $test = 'variable';
}

$test = 'test';
// что ты такое?
var_dump(Sample::$test);
// на самом деле вернётся «variable», очевидно; константу придётся получить так:
var_dump(constant("Sample::$test"));

В действительности можно было бы выкрутиться скобками (сейчас так можно вызывать анонимную функцию, записанную в свойство класса), не знаю рассматривали ли такой вариант, но возможно он менее интуитивен.

// так можно было бы получать константу по имени в переменной (не работает!)
var_dump(Sample::($text));

Самым серьёзным внутренним изменением нового релиза, вероятно будет добавление JIT, Дмитрий Стогов, человек, которому мы обязаны фантастическим ускорением в «семёрке», ещё в позапрошлом году написал в рассылку php.internals, что работа над динамической компиляцией начата. Получившийся к тому времени прототип показал 20% прироста на синтетических тестах и снижение производительности на реальных приложениях.

Кстати, это не первая попытка совместить динамическую компиляцию и ПХП, в языке HHVM, диалекте ПХП от «Фейсбука», такая компиляция даёт хороший прирост в скорости. Да и Дмитрий сотоварищи ещё в 14-м году делали попытку прикрутить JIT тогда ещё пятой версии ПХП. Тогда ускорение составило всего около пары процентов и эта неудача заставила Дмитрия исследовать интерпретатор на предмет «бутылочных горлышек», который и были устранены в седьмой версии.

Столбчатая диаграмма «Скорость выполнения» сравнивает версии 7.0.13 (синий), 7.1.0 (оранжевый) и JIT (серый): значения 0,670/0,495/0,208; 4,056/3,327/2,185; 15,562/9,228/4,680.
Результат сравнения разных версий, JIT убедительно выигрывает на фоне PHP7 и PHP7.1 на синтетических тестах

Более свежий тест того, что будет в ПХП8 показывает, что на трёх тестах (два стандартных зендовских теста и построение множества Мандельброта) динамическая компиляция уделывает версию 7.1.0 примерно вдвое. Это отличный результат! Но понятно, что в реальной жизни всё будет скромнее.

Когда же выйдет «восьмёрка»? Дата, увы, неизвестна, но есть предположение, что новую мажорную версию вряд ли можно ожидать раньше сентября 2021 года.

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

Переезд на «Эгею»: впечатления

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

Пользуясь случаем, хочу сказать Илье Бирману, моему давнему другу, больше спасибо за приятный дизайн интерфейса «Эгеи»! Это кайф! Мне снова стало приятно писать в блог, думаю читатели это почувствовали, и вообще ощущение такое, будто я его помыл с порошочком и от него отвалились куски грязи, он помолодел и стал секси!

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

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