Архив автора: admin

«Ремонтируем» позвоночник

Все знают, что позвоночник «опора» организма.

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

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

Как поправить больной позвоночник?

Что такое позвоночник? Центральная ось всего организма!
Еще Гиппократ утверждал, что в нем первопричина всех болезней. Сегодня редкий человек не знаком с болями в спине.

Пока болезнь не запущена, он может помочь себе сам. Тем более если его учителем станет доктор биологических наук, профессор, академик РАЕН, директор Центра реабилитации последствий спинномозговых травм и детского церебрального паралича Валентин Иванович Дикуль.

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

Как прожить дольше

Cтарость

На Земле нет ничего вечного. Как и любое живое существо, человек также имеет ограниченный срок жизни. Каждый рано или поздно понимает, что мы не вечны, а жизнь есть ничто иное как краткий миг между светом рождения и тьмой смертью.
Человек в молодости смотрит в будущее с надеждой, но с течением времени эта надежда сменяется отвращением по мере того, как человек стареет, а жизненный огонь по-тихонько начинает в нем угасать. Удивительно, но факт — мы никогда не хотим быть теми, кем мы есть: в юности мы хотим быть старше, а в зрелости моложе. Подобные желания во многих развивают скрытый комплекс неполноценности — человек постоянно чем-то недоволен, чем-то не удовлетворен.
Надежда на будущее и тоска по прошлому — два самых больших врага полноценной жизни. Если обратить внимание на самых успешных представителей нашего общества, можно заметить, что они не соблюдали никаких правил и установок связанных с возрастом. Они делали то, что хотели, когда хотели, не забивая свою голову глупыми мыслями. Их жизнь можно назвать полноценной, они выходили далеко за рамки, в которые общество пыталось заключить их. Эти люди неоднократно доказали нам, что фраза «слишком поздно» является просто предрассудком, ленью и отговоркой для того, чтобы не делать то, чего ты на самом деле хочешь.

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

Старость страшна не потому, что с наступлением ее прекращаются наши радости, а потому что исчезают наши надежды.

Жан-Поль Рихтер

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

Да, при желании, однако, когда наша жизнь утратит смысл, и мы достигнем всего, мы просто станем безмолвными тенями, которые  бесцельно существуют (не живут, а именно существуют). Человек не сможет привнести своим геном что-то нового, ведь рождаемость будет строго контролироваться. Развитие и эволюция будут остановлены, начнется регресс и забвение.

Потому не стоит бороться с природой, мы были созданы продумано и сбалансировано. Одни из нас умственно рано взрослеют и становятся в нежном возрасте профессионалами и виртуозами своего дела, другие не утрачивают своих детских повадок даже повзрослев. Что хочет нам сказать подобное противоречие? Люди-исключения есть и будут, они будут игнорировать правила постепенного взросления-старения, будут сочинять симфонии в девять лет и бегать на длинные дистанции в девяносто.

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

Для того, чтобы взрослые оставались энерги

Слушаем и наслаждаемся!

Прекрасная музыка в исполнении мастера Ян Чун Лин.

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

Эта музыка будит воспоминания, которые прячутся в дальнем уголке сердца.


Лидия Голубева

Ёлочные игрушки handmade

Так получается, что из фетра сегодня изготовляют очень большое количество рукотворных поделок. И ёлочные игрушки – не исключение. Этот материал по праву занял доминирующее место в сердцах и «сундуках» рукодельниц. Ведь спектр его применения настолько широк! Широчайшая цветовая палитра и плотность материала, которая позволяет создавать любые формы, делает фетр просто незаменимым. У нас, рукодельниц, появляется возможность сочетать не только все цвета радуги, но десятки оттенков цветовой палитры. Этот материал лучше ткани, он не сыпется, не теряет форму. Он носит гордое название – фетр. Сегодня мы снова будем делать елочные игрушки, но на этот раз главный акцент сделаем не на формах, а разнообразии цветовой палитры. Елочные игрушки из фетра хэндмэйд – тема настоящей статьи.

Елочные игрушки хэндмэйд

Читать

Исключения в Питоне

Поговорим об исключениях.

Всё нижеизложенное относится к Python 3.3, хотя отчасти справедливо и для более ранних версий.

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

Рассмотрим простейший пример: открытие файла. Если всё нормально — open(filename, 'r') возвращает объект этого самого файла, с которым можно делать всякие полезные вещи: читать из него данные и т.д.

Если файл не может быть открыт — выбрасывается исключение:

try:
f = open(filename, 'r')
try:
print(f.read())
finally:
f.close()
except OSError as ex:
print("Cannot process file", filename, ": Error is", ex)

Открываем файл и печатаем его содержимое.

Обратите внимание: файл нужно не только открыть но и закрыть после использования. Исключение может выбросить open (например, если файла нет на диске или нет прав на его чтение).

Если файл открыт — читаем его через f.read(). Этот вызов тоже может выбросить исключение, но файл закрывать всё равно нужно. Поэтому необходим блок finally: f.close() должен быть вызван даже если f.read() сломался. В этом месте удобней было бы воспользоваться конструкцией with но мы же сейчас говорим об исключениях а не о контекстных менеджерах, верно?

Исключения из обоих мест попадут в except OSError, где можно будет что-то сделать с ошибкой.

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

Введение закончено. Теперь сконцентрируемся на том что происходит в except.

Типы исключений

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

BaseException
+-- SystemExit
+-- KeyboardInterrupt
+-- GeneratorExit
+-- Exception
+-- StopIteration
+-- AssertionError
+-- AttributeError
+-- BufferError

Самый базовый класс — BaseException. Он и его простые потомки (SystemExit, KeyboardInterrupt, GeneratorExit) не предназначены для перехвата обыкновенным программистом — только Питон и редкие библиотеки должны работать с этими типами. Нарушение правила ведет, например, к тому что программу невозможно корректно завершить — что совсем не хорошо.

Также не нужно перехватывать все исключения:

try:
...
except:
...

работает как

try:
...
except BaseException:
...

Всё, что может быть нужно программисту — это Exception и унаследованные от него классы.

Вообще-то лучше ловить как можно более конкретные классы исключений. Например, в случае с файлом это OSError или даже может быть FileNotFoundError. Таким образом мы не перехватим AttributeErrorили ValueError, которые в этом примере означали бы ошибку или опечатку программиста.

Кстати, обратите внимание: StopIteration порожден от Exception а GeneratorExit от BaseException. Подробности, почему сделано именно так, можно найти в PEP 342.

Цепочки исключений

Прочитав предыдущую главку все прониклись необходимостью указывать правильный класс исключений и пообещали никогда не использовать BaseException.

Идем дальше. Следующий пример:

try:
user = get_user_from_db(login)
except DBError as ex:
raise UserNotFoundError(login) from ex

Получаем пользователя из базы данных чтобы что-то потом с ним сделать. get_user_from_db может выбросить ошибку базы данных. Для нас это скорее всего означает что такого пользователя нет. Но для логики приложения полезней наш собственный тип UserNotFoundError с указанием логина проблемного пользователя, а не обезличенная ошибка БД — что мы и выбрасываем в обработчике исключения.

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

Для таких целей служит конструкция raise ... from ....

По PEP 3134 у объекта исключения имеется несколько обязательных атрибутов.

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

Затем — __context__. Если исключение было создано в ходе обработки другого исключения (выброшено из except блока) — __context__будет содержать то самое породившее исключение. Которое, в свою очередь тоже может иметь установленный __context__. Этот атрибут равен None если наше исключение — самое первое и н
е имеет предшественников.

__context__ устанавливается автоматически.

В отличие от контекста __cause__ устанавливается только если исключение было выброшено конструкцией raise ... from ... и равно значению from.

Если исключение выбрасывалось простым raise ... то __cause__ будет равно None в то время как __context__ всегда будет содержать породившее исключение если оно существует.

Для вывода исключения со всей информацией служит набор функций из модуля traceback, например traceback.print_exc().

И тут тоже есть проблема: печатается либо явная цепочка если есть установленный __cause__ или неявная, тогда используется __context__.

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

raise exc from None

PEP 409 и PEP 415 рассказывают как это работает:

У исключения всегда есть атрибут __supress_context__. По умолчанию он равен False.

Конструкция raise ... from ... записывает fromв __cause__ и устанавливает __supress_context__ в True.

Тогда семейство функций traceback.print_exc() печатают цепочку если явно указан (не равен None) __cause__ или есть __context__ и при этом __supress_context__ равен False.

Изложение получилось несколько длинным, но сократить текст без потери смысла у меня не вышло.

Семейство OSError

Последняя проблема о которой хотелось бы рассказать — это типы исключений порожденные вызовами операционной системы.

До Python 3.3 существовало много разных типов таких исключений: os.error, socket.error, IOError, WindowsError, select.errorи т.д.

Это приводило к тому, что приходилось указывать несколько типов обрабатываемых исключений одновременно:

try:
do_something()
except (os.error, IOError) as ex:
pass

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

Проблема решена в PEP 3151: весь этот зоопарк теперь является псевдонимами для OSError. Т.е. пишите OSError и не ошибетесь (прочие имена оставлены для обратной совместимости и облегчения портирования кода на новую версию).

Давайте рассмотрим ещё один аспект исключений, порожденных операционной системой.

У OSError есть атрибут errno, который содержит код ошибки (список всех возможных символьных констант для ошибок можно посмотреть в модуле errno).

Открываем файл, получаем OSError в ответ. Раньше мы должны были анализировать ex.errno чтобы понять, отчего произошла ошибка: может файла нет на диске, а может нет прав на запись — это разные коды ошибок (ENOENT если файла нет и EACCES или EPERM если нет прав).

Приходилось строить конструкцию вроде следующей:

try:
f = open(filename)
except OSError as ex:
if ex.errno == errno.ENOENT:
handle_file_not_found(filename)
elif ex.errno in (errno.EACCES, errno.EPERM):
handle_no_perm(filename)
else:
raise # обязательно выбрасывать не обработанные коды ошибки

Теперь иерархия расширилась. Привожу полный список наследников OSError:

OSError
+-- BlockingIOError
+-- ChildProcessError
+-- ConnectionError
| +-- BrokenPipeError
| +-- ConnectionAbortedError
| +-- ConnectionRefusedError
| +-- ConnectionResetError
+-- FileExistsError
+-- FileNotFoundError
+-- InterruptedError
+-- IsADirectoryError
+-- NotADirectoryError
+-- PermissionError
+-- ProcessLookupError
+-- TimeoutError

Наш пример можем переписать как:

try:
f = open(filename)
except FileNotFound as ex:
handle_file_not_found(filename)
except PermissionError as ex:
handle_no_perm(filename)

Гораздо проще и понятней, правда? И меньше мест, где программист может ошибиться.

Заключение

Переходите на Python 3.3, если можете. Он хороший и облегчает жизнь.

Новые плюшки в вопросе, касающемся исключений, я показал.

Если использовать новый питон не позволяют обстоятельства — пишите на чём есть, но помните как правильно это делать.

Автор: Andrew Svetlov