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

Позднее Ctrl + ↑

Аутизм

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

Цитата из статьи:

Исследование, проведенное Центром детей-аутистов Румынии, показало, что у 90% детей в возрасте 2—3 лет триггерным фактором развития расстройств аутистического спектра (РАС) стал чрезмерный просмотр (более 4—5 часов в день) телевизионных программ или взаимодействие с другими формами и видами виртуальной реальности.

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

Так получилось, что у нас дома телевизоров нет, у меня и жены есть по ноутбуку, но общение с ними сведено к минимуму — несколько минут «Малышариков» в день. Жена когда-то наткнулась на рекомендации, и с тех пор мы им следуем. Отрадно знать, что это мы делаем правильно.

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

У меня вопрос к более опытным родителям — есть ли телевизор в садике, куда ходит ваш малыш? Если есть, то зачем и считаете ли вы это проблемой?

11 апреля   дочка

Сикстинский проект

Короткий процесс обучения — программа калибруется, учится распознавать положение пальца

Попробовал в действии «Сикстинский проект» — это способ сделать экран ноутбука псевдосенсорным.

Идея там такая — на фронтальную камеру ноута клеится зеркало, в котором должен быть виден экран. Передвижение пальца распознаётся софтом, по удалённости отражения пальца в экране отслеживается клик.

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

7 апреля  

Страховые доски Казани

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

После этого задумал познакомиться с каким-нибудь коллекционером таких досок — посмотреть на коллекцию, перефотографировать.

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

Улов выглядит так.

Две страховые доски общества «Россия», обе с отчётливой надписью «въ обществѣ РОССІЯ застраховано» на фоне восьмиугольной звезды. У первой, по всей видимости, ещё сохранилась эмаль. Общество учреждено 29 марта 1881 года и находилось в Санкт-Петербурге.

Доска «Второго российского общества», основанного 6 марта 1835 года. Год основания с трудом, но можно различить внизу на табличке. Место нахождения правления: Санкт-Петербург.

Логотипом общества является Феникс, под которым уже не различимы огонь и надпись «отъ огня возрождаюсь».

«Северное страховое общество» стало так называться с 1879 года, когда перебазировалось из Питера в Москву. Очень хорошо читается надпись «ЗАСТРАХОВАНО ВЪ СѢВЕРНОМЪ ОБЩЕСТВѢ». Интересно, что несколько лет я ходил мимо здания, где она висит, но её не замечал.

А это московское страховое общество «Якорь», дата учреждения — 23 июня 1872 года.

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

MTV

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

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

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

5 апреля  

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

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

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

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

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

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

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

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

4 апреля   дочка

Пушной хлеб

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

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

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

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

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

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

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

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

2 апреля   история

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

Радиационная линейка РЛ, на книжечке стоит год выпуска — 1972, весь комплект куплен за 350 рублей без торга

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

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

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

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

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

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

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

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

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

31 марта  

Структуры в Си и 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.

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

Структуры и 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

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

Ранее Ctrl + ↓