Стиль минимализм

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

Вот почему популярным стилем в Европе становится минимализм.

Читать

Лишний вес из за финансовых неурядиц

Если нездоровая экономия заставляет тебя периодически питаться парочкой лишних кексиков, жирной пастой и другими богатыми калориями углеводами – расслабься: ты такая не одна. Специалисты говорят, что экономическая ситуация оказывает сильное влияние на набор веса и плохие привычки в еде. Если за последний год ты побаивалась подходить к весам из-за страха увидеть последствия своих “вкусный утешений”, то ниже читай о том, как можно кушать с пользой и для здоровья и для кошелька, а также разрушить нездоровый стрессовый режим питания. Питание бьет по бюджету? Нестабильная экономическая ситуация часто выливается не только в высокий уровень стресса. Часто люди вынуждены урезать расходы – и пищевая смета страдает часто в первую очередь. Ведь свежие фрукты и овощи, а также нежирные белки, часто довольно дорого стоят, поэтому от них отказываются первыми. На замену им приходят более дешевые продукты, типа мучного и крахмала в виде, например, макарон. Нестабильная экономика порождает зависимость от углеводов Стресс и богатый углеводами рацион из “вкусных утешений” выливается в замкнутый круг, который ведет к набору веса. К тому же, стресс вызывает падение уровня сахара в крови, что в свою очередь вызывает постоянное чувство голода и тягу к простым углеводам. В период нестабильной экономики наблюдается увеличение потребления углеводов, в особенности сахаросодержащих закусок. Такая ситуация становится причиной обострения углеводо-зависимости потому, что люди используют углеводы как средство борьбы со стрессом. К сожалению, такой углеводный замкнутый круг почти всегда ведет к ожирению. Советы: как избавиться от вредных привычек в питании Недорогие перекусы могут принести облегчение стрессовой ситуации на короткое время, но набор веса, повышенный риск сердечнососудистых заболеваний и диабетов, перепады настроения станут составляющей нового стресса в будущем. Избавиться от привычки утешаться едой будет нелегко, но дальнейшее здоровье стоит твоих усилий. Не переходи резко от утешительного фаст-фуда к причудливым диетам. Делай выбор в пользу сбалансированного рациона. Все диеты основываются на ограничении одного из макронутриентов – жиров, белков или углеводов. Если твоя диета не содержит жиров, ты постоянно будешь голодной и склонной к внезапным пирушкам. Диета с низким содержанием белка также принесет постоянное ощущение голода. Чтобы избавиться от вредных привычек в области пищи, нужно изменить биохимию твоего организма, что, в свою очередь, будет активно способствовать изменению морального состояния. К примеру, рыбий жир – пища для мозга. Эта добавка принесет ощущение стабильности, и потребность в калорийной пище отпадет. Не стоит забывать и о других витаминах. Записывай все, что ешь. Тем, кто ведет такой дневник, намного проще воздержаться от соблазна что-то съесть, так как они знают, что каждое отклонение от диеты будет зафиксировано. Более того, исследования показали, что единственный надежный гарант потери веса – это такой дневник питания. Кроме того – этот способ абсолютно бесплатный! Позволь себе два «мошеннических» обеда в месяц. В это время ты можешь есть все, чего тебе хочется больше всего. Осознавая, что один или пару раз можно дать себе волю, будет проще придерживаться диеты. Постоянно преследующее тебя чувство нехватки чего-либо только даст лишний повод вернуться к замкнутому кругу набора веса с углеводными “утешителями”. Кушай регулярно, чтобы поддерживать уровень сахара в крови. Единственный источник энергии для мозга и нервной системы – это сахар, и именно от его уровня зависит чувство удовлетворения жизнью. Пропуск приемов пищи, напротив, заставляет мозг работать натощак, что становится причиной неконтролируемой тяги к нездоровой пище, уже не говоря о внезапных перепадах настроения. Поставь себе задачей каждые 3-4 часа снабжать организм сбалансированной пищей. Балансируй свои приемы пищи. Твой уровень инсулина влияет на подход к пище. Когда уровень стабилен, ты довольна жизнью, счастлива и энергична. Когда же инсулин колеблется – например, когда ты питаешься высокоуглеводной бедной пищей – мучает постоянный голод, настроение нестабильное, усталость, и это, в свою очередь, склоняет тебя к еще более бедной питательными веществами пище. Сбалансированная пища – единственный способ разорвать этот замкнутый круг. Чтобы контролировать уровень инсулина (а также и вес), просто раздели свою тарелку на три равных части. Одна
часть – это нежирная белковая пища в таком количестве, чтобы умещалась на твоей ладони (примерно 90-120 грамм). Две трети отдели под некрахмалистые овощи и фрукты в любом количестве. И наконец добавь капельку оливкового масла. Такая пища не просто полезна – она стабилизирует уровень сахара, помогает держать мысли в порядке и бороться с какими-то финансовыми затруднениями станет легче. На кухне держи только полезные продукты. Если на кухне у тебя есть фаст-фуд — то он все время будет тебя соблазнять.

Python 3: Импорт и юникод

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

Русские идентификаторы

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

def функция(агрумент):
коэффициент = 5
return агрумент * коэффициент

Это на самом деле здорово!

Еще один не вполне очевидный момент: имена модулей тоже могут быть в юникоде:

from . import вспомогательный_модуль

Тоже выглядит неплохо, верно? Есть только одна небольшая проблема: это не всегда работает. Вернее, на Windows возможны неприятности. И не нужно заявлять, что вопросы, касающиеся самой популярной на сегодняшний день операционной системы — никого не волнуют. Подавляющее большинство разработчиков самого Питона Windows не используют — и тем не менее Питон обязан на ней работать, и работать хорошо.

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

Юникод в C API

В Python 2 немалая часть Python C API принимала char * там, где требовалась строка. Поскольку str и был последовательностью байт — сложностей не возникало.

При переносе кода на Python 3 нужно было с этим что-то делать: strстал юникодным типом, последовательностью символов.

Но в С нет удобного типа для unicode! Вернее, существует стандартный тип wchar_t, который обременен множеством проблем. Главные из них: в разных реализациях этот тип имеет различный размер: 16 бит для UCS-2 и 32 бита для UCS-4. К тому же Windows (о, снова она) не поддерживает UCS-2 в полной мере (UCS-4 не поддерживает совсем).

Хуже всего то, что на некоторых платформах этот wchar_t попросту не определен.

Таким образом, использовать wchar_t в Python C API нельзя.

Сам Питон вводит тип Py_UNICODE для этих целей. Но и тут не все гладко. Этот тип не входит в Limited API (PEP 384).

Кроме того, разработчики не хотели радикально заменить все char * на что-то другое.

Есть еще и вопрос практического удобства: ведь очень здорово писать

ret = PyObject_GetAttrString(obj, "attribute");

Для wchar_t все гораздо сложнее, далеко не все компиляторы поддерживают строковые юникодные константы.

В свете вышеописанных причин Python C API продолжает использовать char *, считая, что эти строки имеют кодировку UTF-8 если явно не указано иное. Т.е. прототипы функций C API выглядят как:

PyObject *
PyImport_ImportModuleLevel(char *name, PyObject *globals,
PyObject *locals, PyObject *fromlist,
int level);

Это — импорт модуля с именем name, которое передается как UTF-8строка, аналог питоновской функции __import__.

И эта функция — лишь верхушка используемого механизма. В процессе импорта вызываются довольно много внутренних закрытых функций — и везде используются переменные вроде char *name в качестве имен модулей. В кодировке UTF-8, еще раз напомню.

А ведь имя модуля транслируется в путь к файлу! А кодировака файловой системы может отличаться от UTF-8. Счастливые пользователи Linux давно об этом забыли — в подавляющем большинстве систем по умолчанию как кодировка пользователя (переменная окружения LANG) так и файловой системы установлены в UTF-8 и проблем нет совсем. Но в общем случае это не всегда так.

Кодировки по умолчанию

Чуть-чуть о кодировках. Для определения используемых по умолчанию кодировок в питоне существуют три функции: sys.getdefaultencoding, sys.getfilesystemencoding и locale.getpreferredencoding.

  • sys.getdefaultencoding() — кодировка по умолчанию, используемая в питоновских исходниках. Для третьего питона всегда равна UTF-8. Это — та самая кодировка, которую можно перекрыть написав в начале файла

    # -*- encoding: utf-8 -*-
  • sys.getfilesystemencoding() — кодировка файловой системы. Например, для

    f = open('path/to/file', 'r')

    значение 'path/to/file' имеет тип str (юникод). Лежащая в основе функция из clib имеет прототип

    int open(const char *pathname, int flags, mode_t mode);

    Значит, 'path/to/file' должен быть преобразован в char *используя к
    одировку sys.getfilesystemencoding(). Конечно, в Python C API есть специальные функции для этого.

  • locale.getpreferredencoding() — предпочтительная для пользователя кодировка. Она устанавливается в региональных настройках и к файловой системе прямого отношения не имеет.

Теперь снова вспомним нашу горячо любимую Windows.

locale.getpreferredencoding() возвращает 'cp1251' — Windows настроена на русский язык. Кодировка для консоли (sys.stdout.encoding) другая, это 'cp866' — что добавляет сумбура в и без того запутанную проблему. Ну да ладно, не будем отвлекаться.

sys.getfilesystemencoding() возвращает 'mbcs'. И вот здесь начинаются основные чудеса. Обратите внимание, mbcs — это не cp1251. Равно как и не cp1252 или какая другая кодировка. mbcs — это нечто совершенно особенное!

Multibyte character set (кодировка MBCS)

При преобразовании mbcs -> unicode используется кодировка из locale.getpreferredencoding(), преобразование однозначное и проблем не вызывает.

Для обратного преобразования unicode -> mbcs тоже используется locale.getpreferredencoding() (cp1251 в нашем случае). Но cp1251 не может описать любой юникодный символ. А mbcs — хитрый и коварный. Если для символа не существует точного преобразования — используется ближайший похожий по начертанию.

Это непросто понять без примера. Давайте возьмем французское слово comédie и попробуем преобразовать его в mbcs, имея руский язык cp1251 в настройках по умолчанию.

Возьмем Python 3.1:

>>> b = b'comxc3xa9die'
>>> s = b.decode('utf8')
>>> s.encode('mbcs')
b'comedie'

Посмотрите, какая прелесть! Для символа é в русской раскладке cp1251 нет подходящего аналога. Но ведь английская буква e так похожа: нужно лишь убрать умляут (англ. umlaut, французы зовут этот знак accent aigu). Так и получили преобразование comédie -> comedie без единой ошибки.

А теперь представьте, что это — имя файла. Результат будет следующим: файл на диске есть, и так как в Windows файловая система юникодная, имя файла будет записано правильно, по французски. Но преобразование unicode -> mbcs даст несколько другое имя, которого на диске нет.

В результате получается изумительная по своей красоте ситуация:

f = open('comédie', 'r')

будет говорить, что файла нет — а на самом деле вот же он, красавец!

Справедливости ради нужно упомянуть, что в Python 3.2 поведение mbcsнемного поменялось, и 'comédie'.encode('mbcs') вызовет UnicodeEncodeError. Дело в том, что mbcs стал использовать режим strict по умолчанию. Чтобы повторить функциональность 3.1 следует указывать режим replace: 'comédie'.encode('mbcs', 'replace')

Юникодная файловая система

С mbcs мы разобрались и выяснили, что для работы с файловой системой эта кодировка в общем случае непригодна. Т.е. если я буду использовать русские имена файлов на русской Windows — всё будет хорошо. Но открыть этот файл у американца или голландца не выйдет. Что же делать?

В Windows помимо open есть еще и функция

FILE *_wfopen(const wchar_t *filename, const wchar_t *mode);

которая принимает wchar_t * и позволяет использовать оригинальное юникодное имя файла без всяких преобразований. Существует целый набор, начинающийся с _w — на все случаи жизни.

Значит, нужно делать следующее: для Windows использовать юникодные версии функций работы с файлами, а для всех остальных операционных систем применять .encode(sys.getfilesystemencoding()).

Реализация модуля io начиная с версии 3.1 так и поступает.

И снова импорт русских названий

Всё отлично за одним маленьким исключением — механизм импорта не использует io! Исторически сложилось так, что имя импортируемого модуля довольно быстро преобразовывается в sys.getfilesystemencoding() (с возможными ошибками и потерями, о которых я писал выше) и в таком виде пронизывает весь очень непростой и громоздкий код, чтобы попасть в функции стандартной библиотеки C.

Добавьте к этому довольно большой объем платформозависимого кода (на Маке все работает совсем не так, как на Linux) и проблему обратной совместимости (даже после объявления части API устаревшей она должна поддерживаться как минимум в двух следующих выпусках) — и вы сможете представить сложность и объемность задачи.

Так вот, после трехлетнего труда (с небольшими перерывами, естественно — это же добровольный некоммерческий Open Source) Victor Stinner завершил требуемое нелегкое преобразование. Дов
ольно незаметный, но очень важный шаг!

Файловые пути стали храниться в PyObject* (на самом деле это, конечно, strPyUnicodeObject), работающая с ними часть C APIимеет суффикс Object. Например:

PyObject *
PyImport_ImportModuleLevelObject(PyObject *name, PyObject *globals,
PyObject *locals, PyObject *fromlist,
int level);

Сравните с PyImport_ImportModuleLevel. Все функции из старого APIстали тонкими обертками над новыми вариантами. Так, PyImport_ImportModuleLevel создает PyObject из name и вызывает PyImport_ImportModuleLevelObject.

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

Если быть честным, именно Windows поддержка чуть-чуть не готова — но до выхода Python 3.3 еще очень много времени. Достаточно, чтобы закончить работу и навести полный порядок.

Заключение

Я написал этот довольно длинный текст преследуя несколько целей:

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

  • Вторая — продемонстрировать, как работают кодировки применительно к файловой системе.

  • Третья — напомнить, что можно использовать русские буквы в идентификаторах. Комментарии излишни.

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

Автор: Andrew Svetlov

Как выбрать межкомнатные двери

О том, как выбрать межкомнатные двери в квартиру, рассказывает Оксана Сырчина — менеджер компании «Мир дверей» (г. Киров).

Во-первых, очень важно, чтобы выбранные вами межкомнатные двери гармонично сочетались со всем остальным интерьером – по стилю, материалу и фурнитуре, линиям и форме, цветовому решению…

Читать

Ожерелье своими руками

Живые украшения

А вы задумывались когда-либо, что растения и цветы можно не только растить на даче, дома в горшочках, но и носить на себе, тем самым украшая не место, а самого себя? Живые украшения от дизайнера Полы Хайеса – вот то, что заставит вас об этом задуматься не на шутку и даже возжелать именно такую фенечку.

Живые украшения

Живые украшения

Читать