Опасный лайфхак
20 January 2018 03:47Многие вилки (в USB-зарядниках, в блоках питания для роутеров и т.д.) тонковаты для таких розеток:

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

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

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


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

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

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

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


Про YAPC::Russia
6 November 2017 14:17Выступления и лекции Перепелицы - только ради этого одного уже можно ездить на YAPC::Russia. И в этот раз, 4 ноября, он был великолепен. Жду записи с конференции, это стоит увидеть. А пока - недавнее интервью с ним:
P.S. К сожалению, безжизненных и вялых докладов было немало (тут, скорей, вечная проблема зажатости многих программистов и абсолютном их неумении ни выступать публично, ни ясно доносить мысли до окружающих вообще). Как и докладов ни о чём вообще :(
P.S. К сожалению, безжизненных и вялых докладов было немало (тут, скорей, вечная проблема зажатости многих программистов и абсолютном их неумении ни выступать публично, ни ясно доносить мысли до окружающих вообще). Как и докладов ни о чём вообще :(
Битые телефоны
25 October 2017 00:33Итого, в ближайшем окружении (то есть я +1) за последние 5 лет было разбито 9/12 экранов и утоплено 2 телефона. Через дробь потому что были добивания: например, один из хайскринов сначала коты слегка сбросили со стола, потом я его добил, лёжа в реанимации и уронив на кафельный пол.
Коты - основная причина (сброс со стола - 100% случаев, коты вообще всё мировое зло на себя берут, им простительно), но были и экзотические.
На этот раз обзавёлся Blackview BV6000S. Вроде не такой нежный. А вот предыдущие два, BV5000. Всем хороши были, особенно батарейками, но...

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

Можно выдохнуть
25 September 2017 20:28Начиналось всё так (со слабым желудком не смотреть):
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
Закончилось вроде неплохо:


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
Закончилось вроде неплохо:


На самом деле не хак, а вовсе документированная возможность.
Имеем: около 500 тысяч (полмиллиона) селектов в час. Внутри каждого из них prepared statements кэшируются внутри DBI. В результате чего часов через 10 работы скрипт разбухает так, что всем вокруг плохеет. Отменить кэширование нельзя, изменить архитектуру тоже (на самом деле нужно, но это не в обозримом будущем, а работать должно сейчас).
Напрашивается простое решение: периодически закрывать соединение с базой (что автоматом очищает память) и соединяться снова. Но возникает вопрос: когда переподключаться? По времени не вариант, нагрузка плавающая, зависит от кучи внешних факторов и не прогнозируется. Значит, надо считать селекты. Но как? Выискивать по 50k cloc все места - убиться проще.
Вот тут и пригождается атрибут DBI::Callbacks. Сразу после соединения с базой вешаем на ключевые функции DBI коллбэки, в которых дёргаем счётчик (его ID передаётся явно, так как в общем случае можем подключаться не к одной базе):
Voilà! В любой (удобный нам) момент мы можем проверить значение счётчика и что-то предпринять. Значение, при котором это нужно делать, подбирается экспериментально :)
Имеем: около 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à! В любой (удобный нам) момент мы можем проверить значение счётчика и что-то предпринять. Значение, при котором это нужно делать, подбирается экспериментально :)
Когда перевёлся в ЛГУ из военмеда (это была отдельная эпопея), попробовал ходить на "язык". Через пару занятий плюнул, пришёл на кафедру и нахально так заявил: а можно сразу сдать госы? Офигели, но спросили где такой наглый учился. Ответ "171" пробил все бюрократические барьеры (известное место, как и "239"). Сдал, получил печать. Ха, мы такое в пятом классе щёлкали.
Потом, раз свободные пары появились, решил походить на английский. И вот тут случился большой проёб. Оказалось что я, ни разу не учивший английский язык, знаю его лучше тех, кто учил его в школе! Ну и забил.
С тех пор читать/писать умею.
Разговаривать на "родном" французском - да запросто. А вот Инглиш вводит в ступор. Слышу, понимать могу. Но сказать ничего не получается.
Надо было тогда тратить время не на херню всякую и понтоваться, а учиться.
Потом, раз свободные пары появились, решил походить на английский. И вот тут случился большой проёб. Оказалось что я, ни разу не учивший английский язык, знаю его лучше тех, кто учил его в школе! Ну и забил.
С тех пор читать/писать умею.
Разговаривать на "родном" французском - да запросто. А вот Инглиш вводит в ступор. Слышу, понимать могу. Но сказать ничего не получается.
Надо было тогда тратить время не на херню всякую и понтоваться, а учиться.
Таки не удержался, форкнул. Пара мелочей, но до автора, как это часто бывает, не достучаться.
А штука на самом деле мегакрутая, умеет postgresql, mysql и oracle.
А штука на самом деле мегакрутая, умеет postgresql, mysql и oracle.
... и обратно часа два, немного вариантов. Основной у меня - поспать :) Но можно и позадротстововать. Цель - развивая только силу:

Пройти дракошу на 124 уровне:

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

При этом пройти "чисто", без покупки доп. средств (там их много, на каждый случай свои):

Наверняка с ними проще, тем более что "финансы" позволяют закупить их столько, что и самому мечом махать не придётся. Но это дело принципа :)
В общем, прикольно: Good Knight Story. Отзывы, как обычно, разнообразные :)

Пройти дракошу на 124 уровне:

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

При этом пройти "чисто", без покупки доп. средств (там их много, на каждый случай свои):

Наверняка с ними проще, тем более что "финансы" позволяют закупить их столько, что и самому мечом махать не придётся. Но это дело принципа :)
В общем, прикольно: Good Knight Story. Отзывы, как обычно, разнообразные :)
Фейсбучичек принёс статеечку. Глаз зацепился за это:
Их что, вообще без мозгов выпускают с журфака? Или это сознательная желтизна? А ведь формально и не придерёшься, но как звучит...
мейн-кунов - самых больших одомашенных кошек в мире
Их что, вообще без мозгов выпускают с журфака? Или это сознательная желтизна? А ведь формально и не придерёшься, но как звучит...
И снова про Perl :)
19 July 2017 00:54Есть такой шикарный модуль: Data::Printer (он же DDP). Один из инструментов уровня must have, Data::Dumper по сравнению с ним как плотник супротив столяра :) И, тем не менее, как легко его можно уложить:
Вывод:
Почему - очевидно же :-) Во всяком случае на интуитивно-понятно алгоритмическом уровне, на уровне реализации надо разбираться подробней.
#!/usr/bin/perl use Modern::Perl; use DDP; use Scalar::Array; my $data = [ 1, 2, 3 ]; p $data; round_robin( $data ); p $data;
Вывод:
$ ./testrr.pl \ [ [0] 1, [1] 2, [2] 3 ] Segmentation fault
Почему - очевидно же :-) Во всяком случае на интуитивно-понятно алгоритмическом уровне, на уровне реализации надо разбираться подробней.
На портале государственных услуг Российской Федерации (gosuslugi.ru) специалисты компании «Доктор Веб» обнаружили внедрённый неизвестными потенциально вредоносный код. В связи с отсутствием реакции со стороны администрации сайта gosuslugi.ru мы вынуждены прибегнуть к публичному информированию об угрозе.
Подробности тут.
Подробности тут.
Человек нужен
11 July 2017 14:21Цитата, в скобках мои комментарии:
Мы находимся в поиске Senior Web Developer’a.
Основные требования:
· Умение читать, понимать и улучшать чужой код (хе-хе...);
· Python 2.7 - Уровень Middle+;
· JavaScript (ES5) - Уровень Middle+;
· Angular 1.4+(<2);
· Навыки верстки: HTML/HTML5/CSS/CSS3 (реально этим заниматься не придётся, но представление иметь - обязательно);
· Знание основ реляционных СУБД и SQL (постгрес, не шарахаться от выноса логики в базу; понимание что такое JSONB и с чем его едят - нужно);
· Навыки работы с git.
Подробней: https://spb.hh.ru/vacancy/21481669
Мы находимся в поиске Senior Web Developer’a.
Основные требования:
· Умение читать, понимать и улучшать чужой код (хе-хе...);
· Python 2.7 - Уровень Middle+;
· JavaScript (ES5) - Уровень Middle+;
· Angular 1.4+(<2);
· Навыки верстки: HTML/HTML5/CSS/CSS3 (реально этим заниматься не придётся, но представление иметь - обязательно);
· Знание основ реляционных СУБД и SQL (постгрес, не шарахаться от выноса логики в базу; понимание что такое JSONB и с чем его едят - нужно);
· Навыки работы с git.
Подробней: https://spb.hh.ru/vacancy/21481669
Наблюдение: продать нетбук с линуксом - нереально. Даже если там всё летает и работает как швейцарские часы. Сначала нужно извратиться, поставить на него семёрку, огрести кучу геморроя с драйверами, в конечном итоге получить какого-то неповоротливого уродливого монстра, вот тогда им и заинтересуются...