MTV
Дудь, к которому я очень неоднозначно отношусь, разразился полуторачасовым фильмом о главном молодёжном канале страны во времена моей юности — «ЭмТиВи». Тогда он воспринимался как нечто само собой разумеющееся, сейчас такое представить невозможно.
Энергичный Комолов, безбашенная Шелест, совершенно космический Александр Анатольевич, тупейшие Бивис и Батхед («тёлки любят милитари, нам дадут») и безумное количество клипов.
Приятно видеть бывших виджеев, часть сильно постарела, но все до сих пор стильные, интересные, достойные. Если «ЭмТиВи» для вас приятное воспоминание из прошлого, фильм его не замарает.
Молодец, что молчишь
Время от времени я читаю
Статья спорная. Мякотка:
В чем действительно дети нуждаются, так это в безусловной поддержке и в безусловной любви. Это не просто совсем другое, чем похвала, это противоположность похвале. «Молодец!» — это условие. И мы отказывается от внимания, признания и одобрения ради того, чтобы наши дети прыгали через обруч и стремились делать вещи, приносящие нам удовольствие.
Основная мысль статьи в том, что хвалить детей (только если вы в самом деле не впечатлены) не нужно. Сходу понятный случай — ребёнок нарисовал
В статье, как видно из названия, приведены ещё четыре причины не хвалить, самая тревожная для меня — подмена удовольствия от творчества удовольствием от похвалы. Со временем любое занятие будет (как утверждает статья) интересно столько времени, сколько длится похвала.
Что же предлагается взамен? Вариантов несколько — ничего не говорить (не стоит считать, что ребёнок — ходячее зло и каждый его добрый поступок надо подкреплять), использовать безоценочное высказывание (показываем своё участие в его жизни, но без оценки), задавать вопросы (подталкиваем на анализ и рассказ).
И наконец, если сделанное ребёнком действительно вызвало у вас сильные положительные эмоции, то искреннее «Молодец!», скорее всего, лишним не будет.
Пушной хлеб
Дочитываю книгу «Письма из деревни» Энгельгардта, я о ней писал прежде, очень много интересных подробностей. Хочется цитировать, не останавливаясь, но я себя бью по рукам. Как правило работает. Но тема хлеба так часто упоминается в книге, что тут уж удержаться не могу.
В книге есть много мест, где описано как необходим был крестьянам в пищу хлеб. Не раз и не два появляется эта тема и мне она вовсе непонятна, я
А самые удивительные абзацы написаны о том как крестьяне продавали скот и покупали хлеб, причём производили этот обмен, даже если мясо стоило дешевле хлеба. И это не так уж и редко бывало! Мясо ели редко
Я всё надеялся увидеть хоть
Возникают сомнения, конечно, кому верить — мужикам, которые сотни лет тяжело работали, или ребятам, за которыми
Впрочем я отвлёкся. Хлеб бы необыкновенно важен.
При недостатке хлеба крестьяне, либо ели пушной хлеб (хлеб с мякиной, мммм, хипстеры глотают слюньки), либо «ходили в кусочки». Последнее — особая форма взаимопомощи, когда нуждающиеся ходили по деревням и просили кусочки хлеба. Отказывали только у самих не хватало. Этим занятием не гордились, но попрошайничеством это не считалось — все знали, каждого может прижать, и прижимало.
Я вот всегда считал, что трепетное отношение к хлебу, «хлеб — всему голова», вот это всё началось в СССР, а нет, похоже это то, что с определённой долей условности, называется «было всегда».
Радиационная линейка РЛ
Сегодня на казанской «блошке» купил для Музея вычислительной техники радиационную линейку «РЛ» — тоже
Внешне это двухсторонний планшет из оргстекла с поворотной линейкой с каждой стороны, на которые нанесены несколько различных цветных шкал, а так же несколькими таблицами коэффициентов. Например, из таблицы в левом верхнем углу можно узнать, что наибольшим коэффициентом ослабления доз радиации (Кос) обладают 2—3 этажные дома и перекрытые щели (траншеи с «крышей»).
В комплекте чехол, сам планшет во плоти, плюс книжечка с задачками и вкладышем с подробной схемой планшета. Весь комплект проверил дозиметром, радиации не обнаружено.
Крутая пасхалка
Посмотрел сегодня «Первому игроку приготовиться», там сюжет строится вокруг «пасхального яйца» в программе виртуальной реальности, и вспомнил, что самое крутая «пасхалка», которую я видел за последние несколько лет — это тетрис в «Газели Некст».
Специально выкладываю это сегодня, а то завтра первое апреля и люди подумают, что это розыгрыш. На ютубе около двух тысяч роликов на эту тему, поищите.
Скриншот выше я взял из ролика на официальном канале кампании «Группа ГАЗ» и в комментарии к нему поясняется, что тетрис используется как тест бортового компьютера — можно быстро погонять и процессор, и все зоны дисплея. Наверное так оно и есть, но обычно такие тесты выглядят намного утилитарнее, тут видимо
Говорят на тетрис
После запуска игры, правой крутилкой можно двигать фигуры, а левой — вращать и бросать вниз. Выйти из игры можно либо выключив зажигание, либо начав движение.
Структуры в Си и 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. Там же живут имена объединений (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.
Как раз на эти грабли я и наступил — позабыл про эти все особенности. Когда я ещё писал на Си, всегда пользовался вторым способом, с именем в общем пространстве и привык к тому, что это и есть структуры.
Структуры и CGO
Обновление: в комментариях в Фейсбуке мне бывший коллега попенял, что я забыл Си и что поведение правильное — тут объявляется анонимная структура, а потом к ней определяется тип. Верно, практики на Си у меня за последние годы почти не было, вымылось всё из памяти. Так что текст ниже читайте с учётом этого обновления заметки.
Каждый раз расстраиваюсь, когда сталкиваюсь с CGO.
Документация говорит нам, что сишные структуры доступны в Гоу через конструкцию 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Если будет время, ещё поизучаю этот вопрос — посмотрю историю коммитов и всё такое, возможно была
Интонационное ударение
Я тут на днях вынужден был сильно удивиться, узнав, что некоторые люди не знают о существовании интонационного ударения. Я о нём узнал в школе, на обычном уроке русского языка и считал частью школьной программы, а вот поди ж.
Интонационное ударение ставится, чтобы указать место, где в речи мы выделили бы слово интонацией. В стихотворении Лермонтова о Бородине есть строчки:
Вам не видать таких сражений!..
Носились знамена, как тени,
В дыму огонь блестел,
Звучал булат, картечь визжала,
Рука бойцов колоть устала,
И ядрам пролетать мешала
Гора кровавых тел.
Фраза «рука бойцов колоть устала» ушла в народ и её, не зная контекста, можно прочитать двояко:
В скобках у меня как раз интонационное ударение, от обычного оно отличается не графически, а местом использования. Если перед вами не словарь и не детская книжка и на обычном слове стоит ударение в привычном месте, то оно интонационное.
Помимо устранения неоднозначностей, подобных вышеописанному, интонационное ударение так же используется для усиления: нейтральное «что я сказал?» можно усилить до «что́ я сказал?», а в нём сместить акцент: «что я́ сказал?», «что я сказа́л?».
Яндекс.Аллергия
«Яндекс» в рамках сервиса Погоды выкатил полезную вещь, за которую я, сезонный аллергик, хочу сказать огромное спасибо — мониторинг распространения аллергенов на территории России.
Если зайти туда сейчас, то появится надпись, что
Телеграм приуныл
«Телеграм» не работает около сорока минут, а в фейсбуке уже расползаются теории, что это российская блокировка. Я написал нескольким приятелям со всего мира, у всех такие же проблемы. В официальном твиттере так же указано, что проблемы по всему миру.
Клейма или счётные метки?
Можно подумать, что я забросил одно из своих хобби — изучение казанский счётных меток. Это не так, хоть я ничего об этом и не пишу. Просто не появляется новых клейм или сведений, я фотографирую уже знакомые и даже добавил в свой справочник ещё один источник (к сожалению информации он не добавил).
Ничего нового за последнее время не обнаружилось, тем не менее, я не поделился
Постоянные читатели моего блога знают, что на старинных кирпичах бывают клейма, я много об этом писал, — так производители маркировали свою продукцию. Клейма ставились
Помимо клейм на кирпичах встречаются так называемые «счётные метки», которые наносились кустарно (скорее всего тем, что было под рукой — прутиком
Их рисовали кто во что горазд, от незатейливых точек, до листочков и прочего творчества — у каждого счётчика были


А вот отметины на снимках выше загадочны тем, что совершенно неясно что это такое. Найдены они в своде здания первой половины
Эти отметины явно наносились как клейма —
Я пока больше склоняюсь к версии клейм — тяжело представить, что при счёте партии
Баг в 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 на «тошку» — смартбук «Тошиба
13.10 после установки не нашла точку вайфая, в логах были
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 upgradesudo apt-get install gcc make xdotool wmctrl
cd input-event-daemon; makeУтилиту и конфиг можно положить в
Нашёлся и недостаток. В установленной «Лубунте»
Попробовал поставить «Файерфокс», думал может там проблем не будет, но он еле ворочается. Больше ничего по этому поводу не предпринимал.
Оригами: лягушка
По первому попавшемся видео в интернете сделал первые в своей жизни три прыгающие лягушки из бумаги. В школе
Первая версия из обычной бумаги, с нарисованными глазами своими прыжками произвела бомбический эффект — дочка хохотала несколько минут, как безумная. Более капитальные поделки из зелёной бумаги с игрушечными глазками её едва заинтересовали.
Думаю теперь, что такого из школьного оригами могло бы её так же поразить?
Машина
В книге «Письма из деревни» Энгельгардта, о которой я уже упоминал, персонажи нередко разъезжают на машинах, хотя на дворе
Вот только одно упоминание, в пятом письме:
Наверное легко догадаться, что «машинами» в таком контексте тогда называли паровозы. В те времена их как только не называли — «самокатная паровая машина», «паровая фура», «паровая телега», «паровой экипаж», «паровая карета», «пароходка» и даже «пароход».
Вот что пишет Виктор Одинцов в своей книге «Лингвистические парадоксы» об истории более привычного нам названия:
Но в 1836 г. в связи с предстоящим открытием Царскосельской железной дороги и приобретением первых локомотивов в петербургской газете «Северная пчела» в № 223 от 30 сентября сообщалось: «Немедленно по прибытии паровых машин, которые для отличия от водяных пароходов можно было бы назвать паровозами, последуют опыты употребления их…» Наш современник, известный лингвист Ю. С. Сорокин считает, что редактор газеты Н. Греч, немец по происхождению, создал слово паровоз по образцу соответствующего немецкого слова.
Кстати, паровозы сошли с арены только к концу
Правда некоторые действуют до сих пор — как аттракцион или на манёврах в железнодорожных депо и узлах.
Так в 2012 году мы с женой проехались на таком аттракционе при посещении Музея железнодорожного транспорта Московской железной дороги. Кстати, в высшей степени рекомендую этот музей, упомянутая поездка не слишком запоминающаяся, но вот экспонаты — огромные старинные паровозы, я помню до сих пор, сильное впечатление.
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."Не вырубишь топором
Как известно, в блоки биткойна можно вложить какую угодно информацию. Вот к примеру её можно кодировать, последовательно скидывая минимальные суммы на фейковые кошельки, записывая в их номере необходимую бинарную последовательность. По этому поводу в январе писал своему другу в «Телеграм»:
А вчера он мне кинул ссылку на статью «Биткоин под угрозой полного запрета: В его блокчейне найдены образцы детской порнографии»:
Ученые
из Рейнско-Вестфальского технического университета Ахена в Германии обнаружили, что блокчейн биткоина используется для хранения изображений, относящихся к разряду детской порнографии. Также в блокчейне присутствуют ссылки на изображения жестокого обращения с детьми, размещенные на других ресурсах. Это может сделать хранение биткоинов незаконным в тех странах, где детская порнография запрещена.
Мне непонятно что с такой угрозой теперь делать. Обычная практика в таких случаях — подчистки («хардфорки»), то есть отматываем историю назад и вшиваем в клиент информацию о том где у нас правда.
Но тут она вряд ли годится — раз
Банан велик, а кожура еще больше
Много
А тут братишка прислал в «Телеграм» кусок кода, который всплывает на «Стек Оверфлоу» не первый год:
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
Что означает примерно следующее: если нам надо выполнить операцию
PHP8 ★
Пока всё прогрессивное человечество переходит на ПХП7, а менее прогрессивное до сих пор чахнет
В официальной вики есть страница, где можно ознакомиться с довольно пока скудным списком предложений на восьмую версию. Меня больше всего заинтересовали два изменения, серьёзно ломающие обратную совместимость:
Изменение оправдано унификацией синтаксиса — сейчас используемая сущность выводится из контекста, скажем статические свойства начинаются с доллара, а методы — нет, но если имя метода хранится в переменной, синтаксис разваливается — нет способа указать что же имел ввиду программист.
Или вот похожий пример с константой:
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, диалекте ПХП от «Фейсбука», такая компиляция даёт хороший прирост в скорости. Да и Дмитрий сотоварищи ещё
Более свежий тест того, что будет в ПХП8 показывает, что на трёх тестах (два стандартных зендовских теста и построение множества Мандельброта) динамическая компиляция уделывает версию 7.1.0 примерно вдвое. Это отличный результат! Но понятно, что в реальной жизни всё будет скромнее.
Когда же выйдет «восьмёрка»? Дата, увы, неизвестна, но есть предположение, что новую мажорную версию вряд ли можно ожидать раньше сентября 2021 года.
Переезд на «Эгею»: впечатления
Шестого февраля мой блог переехал на «Эгею», пишу об этом, потому что сегодня возвращал
Пользуясь случаем, хочу сказать Илье Бирману, моему давнему другу, больше спасибо за приятный дизайн интерфейса «Эгеи»! Это кайф! Мне снова стало приятно писать в блог, думаю читатели это почувствовали, и вообще ощущение такое, будто я его помыл с порошочком и от него отвалились куски грязи, он помолодел и стал секси!
Если думаете какой движок блога выбрать, обязательно обратите внимание на «Эгею», тем более, что его можно попробовать в действии на специальном