Наблюдение

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

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

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

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

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

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

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

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

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

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

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

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

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);
}

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

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

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

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

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

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

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

← сюда туда →