Алгоритм Кнута-Морриса-Пратта (КМП)

Алгоритм был разработан Кнутом (Knuth) и Праттом (Pratt) и независимо от них Моррисом (Morris) в 1977 г.

Он относится к «правильным» подходам решения поставленной задачи, в отличии от тривиального подхода, рассмотренного ранее.

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

Однако я нашел пару статей, которые достаточно информативны, они приведены в ссылках и рекомендуемы для ознакомления.

Читать

Тибетская диета

Тип диеты — низкокалорийная

Убыль веса —   3-4 кг

Продолжительность —  7 дней

Если вы хотите не только хотите похудеть, но и омолодить свой организм обязательно попробуйте тибетскую диету. Основа диеты – молоко и продукты растительного происхождения – овощи и фрукты. Мясо, птица, яйца запрещены. Исключение составляет рыба, которая присутствует в диете в незначительном количестве, да и то не каждый день.
Основные правили тибетской диеты:

— есть нужно не торопясь, в спокойной обстановке, тщательно пережевывая пищу, это способствует лучшему перевариванию и не дает откладываться жиру;

— перекусы между основными приемами пищи запрещены;

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

— стараться не есть на ночь, последний прием пищи должен быть не позднее чем за два часа до сна;

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

Читать

Использование try-finally

Хочу обратить внимание на маленькую особенность написания конструкции try-finally.

Возьмём для примера многопоточность, а конкретно блокировки.

Где-то (наверное, в конструкторе класса) мы создали объект блокировки:

self.locker = threading.RLock()

Затем в каком-то методе мы пытаемся использовать эту блокировку в try-finally statement. Да, я знаю что RLock поддерживает context manager protocol и может использоваться в with statement. Так будет даже лучше, но мы сейчас говорим о другом варианте использования.

try:
self.locker.acquire()
do_some_work()
finally:
self.locker.release()

В чём ошибка? .acquire() может выбросить исключение. Блокировка не будет захвачена и попытка её освободить в .release() выбросит новое (другое) исключение. Что крайне нежелательно. Особенно в python 2.x, где нет цепочек исключений. Т.е. ошибка в .acquire() будет просто скрыта, понять в чём было дело невозможно.

Правильно писать так:

self.locker.acquire()
try:
do_some_work()
finally:
self.locker.release()

Если было исключение в .acquire() — то блокировка не захвачена и освобождать её не нужно. Пусть обработка исключения разворачивается своим ходом, .release() в finally block совершенно не нужен.

Правило простое и понятное, тем не менее я сам нередко писал ошибочный код. А сегодня опять увидел это проблему при чтении чужих исходников.

Проблема усугубляется тем, что обычно .acquire() работает успешно, и лишь в редких случаях выбрасывает исключение. Которое мы видим в логах (все используют логи, верно?) и недоумеваем, что именно произошло.

Это замечание относится к любому коду, выполняемому в finally block.

Переменные, блокировки, захват ресурсов, открытие файлов и т.д. должны быть выполнены перед try.

P.S.

На открытие файлов хочу обратить особое внимание как на самый частый случай. Куда более частый чем работа с многопоточностью. Правильно писать:

f = open('filename')
try:
f.read()
finally:
f.close()

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

Автор: Andrew Svetlov

Подвесные кашпо

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

подвесные кашпо

Но куда поставить все эти горшки? Вот тут как раз и следует сделать подвесные кашпо, где горшки можно разместить в несколько ярусов.

Читать

Аксессуары своими руками

Украшения легко и просто

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

Бижутерия своими руками

Бижутерия своими руками

Читать

batch resize, или массовое изменение размера картинок в Linux Debian/Ubuntu

Столкнулся с необходимостью быстро отресайзить папку фотографий.  Так как под рукой только Linux Ubuntu, пришлось искать способы под него.
Конечно, была идея отресайзить все картинки через Гимп, но это стрельба из пушки по воробьям. Причём медленная стрельба.
А простой и красивый способ нашёлся следующий.

Читать