?

Log in

No account? Create an account

Previous 10

Feb. 24th, 2018

tux

Борис Аркадьич

Я не знаю сколько ему лет. Но явно много, от 10 и больше. Во всяком случае появился он у меня в 2010 году, вполне взрослым и придурочным. А в качестве дня рождения была записана дата первой прививки, 23 февраля.





P.S. На аватаре он же.

Jan. 20th, 2018

tux

Опасный лайфхак

Многие вилки (в USB-зарядниках, в блоках питания для роутеров и т.д.) тонковаты для таких розеток:



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



Шириной в 3-4 миллиметра, длина подбирается по гнезду розетки. Вставляем (само собой, и меряем, и при отключённой розетке!):



И вуаля, ничего не болтается:



Dec. 12th, 2017

tux

И снова Doom ][

Поднял на новом месте. Пока 2 набора карт, в 2 вариантах: обычное оружие и оружие с ускорением стрельбы. Вот они, в Doomseeker (фильтровать по типу игры "Cooperative", WAD: "sf"):



tux

RTSP

Тупею. Три дня ломания мозгов над всякими openRTSP, nginx+rtmp, zoneminver и прочими avreg. А в конечном итоге всё свелось к однострочнику:
ffmpeg -loglevel quiet -i "rtsp://откуда.то:10554/udp/av0_0" -x 1080x720 -f mpjpeg -


Nov. 6th, 2017

tux

Про YAPC::Russia

Выступления и лекции Перепелицы - только ради этого одного уже можно ездить на YAPC::Russia. И в этот раз, 4 ноября, он был великолепен. Жду записи с конференции, это стоит увидеть. А пока - недавнее интервью с ним:



P.S. К сожалению, безжизненных и вялых докладов было немало (тут, скорей, вечная проблема зажатости многих программистов и абсолютном их неумении ни выступать публично, ни ясно доносить мысли до окружающих вообще). Как и докладов ни о чём вообще :(

Oct. 25th, 2017

tux

Битые телефоны

Итого, в ближайшем окружении (то есть я +1) за последние 5 лет было разбито 9/12 экранов и утоплено 2 телефона. Через дробь потому что были добивания: например, один из хайскринов сначала коты слегка сбросили со стола, потом я его добил, лёжа в реанимации и уронив на кафельный пол.

Коты - основная причина (сброс со стола - 100% случаев, коты вообще всё мировое зло на себя берут, им простительно), но были и экзотические.

На этот раз обзавёлся Blackview BV6000S. Вроде не такой нежный. А вот предыдущие два, BV5000. Всем хороши были, особенно батарейками, но...



Oct. 16th, 2017

tux

C vs Perl

my $pid = fork();
if( $pid == -1 ) {
    # обработка ошибки
}
elsif( $pid ) {
    # родитель
}
else {
    # потомок
}


Найдите грубейшую ошибку в этом коде (которая в некоторых случаях ставит сервер в коленно-локтевую позу), и связь с %Subj% :-)

Sep. 29th, 2017

tux

Хм...

Старый Петергоф, Ботаническая улица. Асфальт, сегодня, 23:00 :)





Из студентов (а кому ещё так развлекаться? кроме них пенсионеры одни) - физики, химики, приматы (прикладные математики) и немного молекулярных биологов. Даже не знаю кого выбрать :)

Sep. 25th, 2017

tux

Можно выдохнуть

Начиналось всё так (со слабым желудком не смотреть):

http://xxo.su/resizer/i/0/c/b990569b.jpg
http://xxo.su/resizer/i/0/f/307c2366.jpg
http://xxo.su/resizer/i/e/9/a7a2f294.jpg

Закончилось вроде неплохо:





Sep. 2nd, 2017

tux

Хак DBI

На самом деле не хак, а вовсе документированная возможность.

Имеем: около 500 тысяч (полмиллиона) селектов в час. Внутри каждого из них prepared statements кэшируются внутри DBI. В результате чего часов через 10 работы скрипт разбухает так, что всем вокруг плохеет. Отменить кэширование нельзя, изменить архитектуру тоже (на самом деле нужно, но это не в обозримом будущем, а работать должно сейчас).

Напрашивается простое решение: периодически закрывать соединение с базой (что автоматом очищает память) и соединяться снова. Но возникает вопрос: когда переподключаться? По времени не вариант, нагрузка плавающая, зависит от кучи внешних факторов и не прогнозируется. Значит, надо считать селекты. Но как? Выискивать по 50k cloc все места - убиться проще.

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

sub set_dbh_callbacks
{
    my ( $self, $dbh, $counter_name ) = @_;
    
    $dbh->{Callbacks} = 
    {
        do                 => sub { ++$self->{$counter_name}; return; },
        prepare            => sub { ++$self->{$counter_name}; return; },
        selectrow_array    => sub { ++$self->{$counter_name}; return; },
        selectrow_arrayref => sub { ++$self->{$counter_name}; return; },
        selectrow_hashref  => sub { ++$self->{$counter_name}; return; },
        selectall_arrayref => sub { ++$self->{$counter_name}; return; },
        selectall_hashref  => sub { ++$self->{$counter_name}; return; },
        selectall_array    => sub { ++$self->{$counter_name}; return; },
        selectcol_arrayref => sub { ++$self->{$counter_name}; return; },
    };
    $self->{$counter_name} = 0;
}


Voilà! В любой (удобный нам) момент мы можем проверить значение счётчика и что-то предпринять. Значение, при котором это нужно делать, подбирается экспериментально :)

Previous 10