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

Позднее Ctrl + ↑

Что есть истина?

У нашего бывшего сотрудника в фейсбуке увидел ссылку на любопытную задачку — может ли (a == 1 && a == 2 && a == 3) быть «истиной» в ДжаваСкрипте?

Не заглядывая в статью, я предложил два варианта, вполне очевидный первый:

a = ((counter) => ({valueOf:() => ++counter}))(0)
// {valueOf: ƒ}
a == 1 && a == 2 && a == 3
// true

И второй — на суррогатных парах. Но по ссылке есть ряд других занимательных способов — через геттеры, похожие символы Юникода (мне приходил в голову такой вариант, но я не смог подобрать трёх символов, одинаковых на вид), другие специальные методы и прочее. Больше всех мне понравился такой способ:

a = [1,2,3];
a.join = a.shift;

a == 1 && a == 2 && a == 3
// true

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

Сказки от прабабушки

Родственники (152.51КиБ)
Родственники и предки со стороны мамы: слева — прабабушка, в центре — дед, справа — бабушка

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

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

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

Зато много интересного про себя вычитал. Например, в 1993-м я был вегетарианцем. Не помнил это абсолютно.

22 января  

Тухандредкоины

100 рублей (107.73КиБ)
Новые сто рублей, которые я до сих пор ни разу не видел

Из-за своего интереса к монетам, почитываю кое-какие нумизматические каналы в телеграме. Помимо старинных монет там и более-менее современные обсуждаются, как советские (надо будет, кстати, разобрать свои), так и более поздние, включая только-только появившиеся новые купюры по 200 и 2000 рублей.

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

Так вот, за купюрами в 200 и 2000 рублей сейчас охотятся коллекционеры, но так как их становится всё больше, то котируется не каждая купюра, а только серия «АА», причём чем больше нулей после серии, тем лучше — то есть ценятся купюры первых партий. На «Авито» народ надеется выручить от 100 до 4000 рублей за такие купюры, но считается, что их стоимость будет ещё расти.

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

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

13 января  

Мой цвет волос в детстве

Мои волосы (63.18КиБ)
Мои волосы из далёкого 1979 года, тогда мне было меньше двух лет

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

Дочка у меня относительно светлая и мне стало любопытно сравнить её цвет с тем, что у меня был в детстве.

Мои волосы и волосы дочки (66.69КиБ)
Цвет моих волос в детстве и цвет волос дочки

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

8 января   дочка

Чёрная перфолента

Чёрная перфолента (94.73КиБ)
Перфокарты и чёрная перфолента, я и не знал, что такая бывает

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

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

Кстати, одно время перфолента широко использовалась в советских журналах, как элемент оформления различных компьютерный статей, некий символ тогдашнего айти. Уже ушедший символ, вслед за которым почти уже ушла дискета, которую с большим трудом теперь заменяют на облако со стрелочкой. И вот ещё думаю, современным детям уже трудно будет объяснить, почему трубку телефона «кладут» или «бросают», сам телефон «звонит» даже на вибрации, а «берут» трубку, сдвигая непонятный символ, похожий на перевёрнутую кратку над буквой «Й».

Дима, большое спасибо за подарок музею на Новый год!

6 января   айти-музей

Запойный сладкоежка

Около пятнадцати лет назад я бросил пить алкоголь. Точнее не помню, но припоминаю, что в том же году моя тогдашняя кошка родила котят, о чём осталась запись в ЖЖ, датированная 2002-м годом.

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

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

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

Сижу и думаю — не лишусь ли в этот раз ещё части друзей. Вдруг меня с ними объединяет только сахар?

5 января  

Тридцать девятый выезд

Результаты (33.21КиБ)
Небогатые результаты объясняются трудностью поиска под снегом

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

На снимке: стёртая в ноль монета, предположительно «масон» (1830-е), 1 копейка 1908 года, 10 копеек 1932, 1 копейка 1932, 5 копеек 1946, 3 копейки 1946, 1 копейка 1982, обломок крестика, какая-то клёпка, кольцо из мягкого светлого металла, медное колечко с сердечком, патрон луганского патронного завода, 1910-х гг., образок святого Николая.

29 декабря   сокровища

Memcached и persistent connections

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

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

Оказалось у этого функционала есть особенность:

socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 4

connect(4, {sa_family=AF_INET, sin_port=htons(11211), sin_addr=inet_addr("127.0.0.1")}, 16) = -1

poll([{fd=4, events=POLLOUT}], 1, 4000) = 1 ([{fd=4, revents=POLLOUT}])
getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
sendto(4, "version\r\n", 9, MSG_NOSIGNAL, NULL, 0) = 9
recvfrom(4, "VERSION 1.5.1\r\n", 8196, MSG_NOSIGNAL, NULL, NULL) = 15
sendto(4, "quit\r\n", 6, MSG_NOSIGNAL, NULL, 0) = 6
shutdown(4, SHUT_WR)                    = 0
shutdown(4, SHUT_RD)                    = -1 ENOTCONN (Transport endpoint is not connected)
close(4)                                = 0

socket(PF_INET, SOCK_STREAM|SOCK_CLOEXEC|SOCK_NONBLOCK, IPPROTO_TCP) = 4
setsockopt(4, SOL_SOCKET, SO_LINGER, {onoff=1, linger=0}, 8) = 0

connect(4, {sa_family=AF_INET, sin_port=htons(11211), sin_addr=inet_addr("127.0.0.1")}, 16) = -1

poll([{fd=4, events=POLLIN|POLLOUT}], 1, 4000) = 1 ([{fd=4, revents=POLLOUT}])
getsockopt(4, SOL_SOCKET, SO_ERROR, [0], [4]) = 0
sendto(4, "version\r\n", 9, MSG_NOSIGNAL, NULL, 0) = 9
recvfrom(4, "VERSION 1.5.1\r\n", 8196, MSG_NOSIGNAL, NULL, NULL) = 15

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

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

Решение — любым доступным способ проверять получили ли мы «свежий» объект или имеем дело с уже открытым соединением и выставлять опции только в первом случае:

$mc = new Memcached('persistent');

if (!$mc->getServerList()) {
    $mc->setOptions([
        Memcached::OPT_NO_BLOCK => true,
    ]);

    $mc->addServer('127.0.0.1', 11211);
}

Тогда соединение благополучно переиспользуется.

27 декабря   memcached   php   программирование

Митохондриальная Ева

Распространение митохондриальной ДНК (68.19КиБ)
Митохондриальная ДНК в моей крови получена от прабабушки Евдокии Никоноровны

Прочистил голову от заблуждения о «митохондриальной Еве» — так СМИ называют женщину от которой мы все получили свою митохондриальную ДНК прекрасным роликом.

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

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

Читая СМИ можно сделать вывод, что исследователи что-то там посчитали и сделали вывод, что строго по женской линии мы все имеем ровно одного предка, которого СМИ и окрестили «митохондриальной Евой». На самом деле исследователи проверили митохондриальную ДНК у 147 человек и по известной скорости мутаций определили, что их общий предок, от которого им досталась эта ДНК жил около 200 тысяч лет назад.

Но в то же время жило ещё множество предков, в том числе и женского пола, от которых им достались другие гены! Просто других прямых женских линий не осталось — где-то на протяжении этих 200 тысяч лет в остальных линиях в каком-то поколении потомство оставили только мужчины.

На картинке выше видно в чём тут дело. Митохондриальную ДНК я получил только от своей прабабушки Евдокии Никоноровны, тогда как от других предков я тоже получал гены.

23 декабря  

Наблюдение

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

И вот смотрю я на весь из себя такой футуристичный сериал «Звёздный путь: Дискавери», где все ходят в мундирах, живут на своих короблях и никаких сумок через плечо и в помине нет. А посреди этого милитаристского будущего через весь кадр идёт девушка, почти не двигая правой рукой, при энергичном участии левой. Малозаметный анахронизм.

13 декабря  
Ранее Ctrl + ↓