<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
  <channel>
    <atom:link rel="self" type="application/rss+xml" href="http://breys.ru/rss"/>
    <language>ru</language>
    <copyright>Copyright 2008,2009 breys.ru</copyright>
    <title>Заметки на breys.ru</title>
    <link>http://breys.ru/blog/</link>
    <description>Заметки по теме: Python, Брейс - дизайн студия</description>
    <item>
      <link>http://breys.ru/blog/1615.html</link>
      <guid>http://breys.ru/blog/1615.html</guid>
      <title>Flask.admin FileAdmin проблема с локалями</title>
      <pubDate>Mon, 13 Oct 2014 09:38:35 +0400</pubDate>
      <description>&lt;p&gt;Если использовать FileAdmin модуля Flask.admin то в dev сервере есть небольшая проблема: файл, имеющие в именах кирилицу, при сохранении получаю имена без букв Кирилла и Мефодия, а в продакшен вообще появляются проблемы с обработкой строк, в том числе в файловом менеджере и логах. Проблема частично решается в продакшене частично решается путём установки переменной окружения при запуске uwsgi сервера через файл настроек&lt;/p&gt;
&lt;p&gt;допустим имеем такой стартовый скрипт&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cat /etc/init/proj1.conf &lt;br /&gt;description "uWSGI server Proj#1"&lt;br /&gt;start on runlevel [2345]&lt;br /&gt;stop on runlevel [!2345]&lt;br /&gt;respawn&lt;br /&gt;exec /home/data/flask-project/env/bin/proj1_uwsgi.sh&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;который запускает&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;cat /home/data/flask-project/env/bin/proj1_uwsgi.sh&lt;br /&gt;#!/bin/sh&lt;br /&gt;/home/data/flask-project/env/bin/uwsgi -c /home/data/flask-project/proj1/uwsgi.ini&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;а уже в&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;[uwsgi]&lt;br /&gt;socket = /tmp/proj1.sock&lt;br /&gt;master = true&lt;br /&gt;enable-threads = true&lt;br /&gt;processes = 3 &lt;br /&gt;chdir = /home/data/flask-project/proj1/&lt;br /&gt;module = app:app&lt;br /&gt;virtualenv = /home/data/flask-project/env/&lt;br /&gt;uid = ffsdmad&lt;br /&gt;gid = ffsdmad&lt;br /&gt;logto = /home/data/flask-project/proj1/error.log&lt;br /&gt;&lt;strong&gt;env = LC_ALL=ru_RU.UTF-8&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;устанавливается переменная env, которая используется для запуска app. Осталось решить проблему сохранения кирилических имён файлов&lt;/p&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1613.html</link>
      <guid>http://breys.ru/blog/1613.html</guid>
      <title>Python: сортировка списков</title>
      <pubDate>Thu, 25 Sep 2014 11:00:30 +0400</pubDate>
      <description>&lt;p&gt;Предположим у вас есть список объектов с различными атрибутами, и вам необходимо отсортировать их этот список по нужному вам критерию, для этого вам необходимо воспользовать встроенной в списки функцией .sort с параметром key&lt;/p&gt;
&lt;p&gt;Например, у меня в базе есть список людей репрессированных за всякие нехорошие делишки, среди всех атрибутов этих людей меня интересуют пол и имена:&lt;/p&gt;
&lt;pre&gt;for a in rl:print a.id, a.sex, a.first_name&lt;br /&gt;... &lt;br /&gt;1551987 1 Виктория&lt;br /&gt;2212644 1 Клавдия&lt;br /&gt;2212647 1 Валентина&lt;br /&gt;2214814 2 Павел&lt;br /&gt;2223472 1 Владислава&lt;br /&gt;2223482 2 Павел&lt;br /&gt;2227653 1 Марина&lt;br /&gt;2227682 2 Николай&lt;br /&gt;2227757 2 Саша&lt;br /&gt;2227844 2 Николая&lt;br /&gt;2228553 2 Алекс&lt;br /&gt;2228608 1 Екатерина&lt;br /&gt;2228657 2 Максим&lt;br /&gt;2228692 2 Роман&lt;br /&gt;2228748 2 Василий-Дмитриевич&lt;br /&gt;2230327 2 Михаил&lt;br /&gt;2232569 2 Анатолий&lt;br /&gt;2232829 1 Анастасия&lt;br /&gt;2233073 2 Максим&lt;br /&gt;2233087 1 Инга&lt;br /&gt;2233098 2 Владимир&lt;br /&gt;2234717 2 Фёдор&lt;br /&gt;2235549 1 Марина&lt;br /&gt;2235552 2 Яросав&lt;br /&gt;2235850 2 Рустам&lt;br /&gt;2239743 2 Пётр&lt;br /&gt;2239766 1 Мария&lt;br /&gt;2239785 1 Юлия&lt;br /&gt;2240058 2 Николай&lt;br /&gt;2240658 2 Максим&lt;br /&gt;2240722 2 Евгений&lt;/pre&gt;
&lt;p&gt;Допусти мне нужно отсортировать список по полу, а затем по имени и для этого я использую следующий ключ&lt;/p&gt;
&lt;pre&gt;rl.sort(key = lambda x: x.sex)&lt;br /&gt;for a in rl:print a.id, a.sex, a.first_name&lt;br /&gt;...&lt;br /&gt;2232829 1 Анастасия&lt;br /&gt;2212647 1 Валентина&lt;br /&gt;1551987 1 Виктория&lt;br /&gt;2223472 1 Владислава&lt;br /&gt;2228608 1 Екатерина&lt;br /&gt;2233087 1 Инга&lt;br /&gt;2212644 1 Клавдия&lt;br /&gt;2227653 1 Марина&lt;br /&gt;2235549 1 Марина&lt;br /&gt;2239766 1 Мария&lt;br /&gt;2239785 1 Юлия&lt;br /&gt;2228553 2 Алекс&lt;br /&gt;2232569 2 Анатолий&lt;br /&gt;2228748 2 Василий-Дмитриевич&lt;br /&gt;2233098 2 Владимир&lt;br /&gt;2240722 2 Евгений&lt;br /&gt;2228657 2 Максим&lt;br /&gt;2233073 2 Максим&lt;br /&gt;2240658 2 Максим&lt;br /&gt;2230327 2 Михаил&lt;br /&gt;2227682 2 Николай&lt;br /&gt;2240058 2 Николай&lt;br /&gt;2227844 2 Николая&lt;br /&gt;2214814 2 Павел&lt;br /&gt;2223482 2 Павел&lt;br /&gt;2239743 2 Пётр&lt;br /&gt;2228692 2 Роман&lt;br /&gt;2235850 2 Рустам&lt;br /&gt;2227757 2 Саша&lt;br /&gt;2234717 2 Фёдор&lt;br /&gt;2235552 2 Яросав&lt;/pre&gt;
&lt;pre&gt;rl.sort(key = lambda x: x.first_name)&lt;br /&gt;for a in rl:print a.id, a.sex, a.first_name&lt;br /&gt;...&lt;br /&gt;2228553 2 Алекс&lt;br /&gt;2232829 1 Анастасия&lt;br /&gt;2232569 2 Анатолий&lt;br /&gt;2212647 1 Валентина&lt;br /&gt;2228748 2 Василий-Дмитриевич&lt;br /&gt;1551987 1 Виктория&lt;br /&gt;2233098 2 Владимир&lt;br /&gt;2223472 1 Владислава&lt;br /&gt;2240722 2 Евгений&lt;br /&gt;2228608 1 Екатерина&lt;br /&gt;2233087 1 Инга&lt;br /&gt;2212644 1 Клавдия&lt;br /&gt;2228657 2 Максим&lt;br /&gt;2233073 2 Максим&lt;br /&gt;2240658 2 Максим&lt;br /&gt;2227653 1 Марина&lt;br /&gt;2235549 1 Марина&lt;br /&gt;2239766 1 Мария&lt;br /&gt;2230327 2 Михаил&lt;br /&gt;2227682 2 Николай&lt;br /&gt;2240058 2 Николай&lt;br /&gt;2227844 2 Николая&lt;br /&gt;2214814 2 Павел&lt;br /&gt;2223482 2 Павел&lt;br /&gt;2239743 2 Пётр&lt;br /&gt;2228692 2 Роман&lt;br /&gt;2235850 2 Рустам&lt;br /&gt;2227757 2 Саша&lt;br /&gt;2234717 2 Фёдор&lt;br /&gt;2239785 1 Юлия&lt;br /&gt;2235552 2 Яросав&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Думаю тут всё очевидно, но ещё интереснее когда нужна сортировка по нескольким полям, для этого расширяем ключ сортировки вот так:&lt;/p&gt;
&lt;pre&gt;rl.sort(key = lambda x: [x.sex,x.first_name.lower()])&lt;br /&gt;for a in rl:print a.id, a.sex, a.first_name&lt;br /&gt;... &lt;br /&gt;2232829 1 Анастасия&lt;br /&gt;2212647 1 Валентина&lt;br /&gt;1551987 1 Виктория&lt;br /&gt;2223472 1 Владислава&lt;br /&gt;2228608 1 Екатерина&lt;br /&gt;2233087 1 Инга&lt;br /&gt;2212644 1 Клавдия&lt;br /&gt;2227653 1 Марина&lt;br /&gt;2235549 1 Марина&lt;br /&gt;2239766 1 Мария&lt;br /&gt;2239785 1 Юлия&lt;br /&gt;2228553 2 Алекс&lt;br /&gt;2232569 2 Анатолий&lt;br /&gt;2228748 2 Василий-Дмитриевич&lt;br /&gt;2233098 2 Владимир&lt;br /&gt;2240722 2 Евгений&lt;br /&gt;2228657 2 Максим&lt;br /&gt;2233073 2 Максим&lt;br /&gt;2240658 2 Максим&lt;br /&gt;2230327 2 Михаил&lt;br /&gt;2227682 2 Николай&lt;br /&gt;2240058 2 Николай&lt;br /&gt;2227844 2 Николая&lt;br /&gt;2214814 2 Павел&lt;br /&gt;2223482 2 Павел&lt;br /&gt;2239743 2 Пётр&lt;br /&gt;2228692 2 Роман&lt;br /&gt;2235850 2 Рустам&lt;br /&gt;2227757 2 Саша&lt;br /&gt;2234717 2 Фёдор&lt;br /&gt;2235552 2 Яросав&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;Вот такой вот классный Python, здесь фишка в том, что функция sort получает функцию которая получает сравниваемый объект(x) и подготавливает его для сравнения, в последнем примере она формирует для сравнения список состоящий из поля объекта "пол"&amp;nbsp; и поля "имя" с применением функции перевода строки в нижний регистр (иначе возможны не корректные сортировки)&lt;/p&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1609.html</link>
      <guid>http://breys.ru/blog/1609.html</guid>
      <title>python ProxyError</title>
      <pubDate>Mon, 04 Aug 2014 12:14:12 +0400</pubDate>
      <description>&lt;p&gt;Если ваш скрипт, работающий с https, вдруг начал выдавать вот такую ошибку&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;requests.exceptions.ProxyError: Cannot connect to proxy. Socket error: Tunnel connection failed: 302 Moved Temporarily.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;то скорее всего вы используете прокси для браузера, чтобы отучить скрипт использовать proxy достаточно перед запуском скрипта сбросить значение переменной окружения https_proxy любым из доступных способов, например вот так&lt;/p&gt;
&lt;pre&gt;unset https_proxy&lt;br /&gt;python tests.py&lt;/pre&gt;
&lt;p&gt;или запускать скрипт вот так&lt;/p&gt;
&lt;pre&gt;https_proxy=&amp;#039&amp;#039 ./tests.py&lt;/pre&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1550.html</link>
      <guid>http://breys.ru/blog/1550.html</guid>
      <title>Python формирование даты в формате mysql</title>
      <pubDate>Thu, 18 Apr 2013 08:31:51 +0400</pubDate>
      <description>&lt;p&gt;Каждый раз забываю как обрабатывать даты в os.path и каждый раз напоминаю себе:&lt;/p&gt;
&lt;pre&gt;import os, datetime&lt;br /&gt;&lt;br /&gt;def modification_date( filename, frm="%Y-%m-%d" ):&lt;br /&gt;    """возращает дату модификации файла в формате "Год-Месяц-День", \&lt;br /&gt;    без проверки на существование файла"""&lt;br /&gt;    t = os.path.getmtime( filename )&lt;br /&gt;    return datetime.datetime.fromtimestamp(t).strftime( frm )&lt;br /&gt;&lt;br /&gt;print modification_date(&amp;#039/etc/passwd&amp;#039, &amp;#039%d:%m:%y&amp;#039)&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print modification_date(&amp;#039/etc/passwd2&amp;#039)&lt;br /&gt;except&amp;nbsp; OSError, err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print err&lt;br /&gt;&lt;/pre&gt;
&lt;p&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;вроде всё просто: с помощью &lt;/span&gt;&lt;/span&gt;os.path.getmtime получаем дату модификации файла в секундах&lt;/p&gt;
&lt;p&gt;создаём объект fromtimestamp и с помощью strftime добиваемся нужного формата вывода в строку&lt;/p&gt;
&lt;p&gt;подробнее &lt;a href="http://docs.python.org/2/library/datetime.html#strftime-strptime-behavior"&gt;о форматах вывода strftime вот тут&lt;/a&gt;&lt;/p&gt;
&lt;div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;"&gt;
&lt;pre&gt;err&lt;/pre&gt;
&lt;/div&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
    <item>
      <link>http://breys.ru/blog/1085.html</link>
      <guid>http://breys.ru/blog/1085.html</guid>
      <title>Python, Json, Yandex.map</title>
      <pubDate>Tue, 05 Jul 2011 12:14:53 +0400</pubDate>
      <description>&lt;pre&gt;import json, urllib&lt;br /&gt;&lt;br /&gt;def get_geocode(text, key):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = urllib.urlopen("http://geocode-maps.yandex.ru/1.x/?","geocode="+text+"&amp;amp;key="+key+"&amp;amp;format=json&amp;amp;").read()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return json.loads(data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except Exception, e:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return None&lt;br /&gt;
print get_geocode("Киров, Первомайский район, улица Большевиков, 16", "AHqsEk4BAAAAekkFTAMA9DGkZfo_WT9ci8K8X286J9ILWjIAAAAAAAAAAABhqxW74U1xylQQhCYKzVIxsQBPTQ==")&lt;/pre&gt;
&lt;p&gt;Вот так всё просто&lt;/p&gt;
&lt;pre&gt;from xml.dom.minidom import parse, parseString&lt;br /&gt;dom1 = parse(&amp;#039Desktop/002.xml&amp;#039)&lt;br /&gt;def get_value_text(node, name):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if node.getElementsByTagName(name).length and node.getElementsByTagName(name)[0].childNodes.length:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return node.getElementsByTagName(name)[0].childNodes[0].data&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ""&lt;br /&gt;for d in dom1.getElementsByTagName("Контрагент"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; name = get_value_text(d, "НаименованиеТочки")&lt;br /&gt;&amp;nbsp;&amp;nbsp;   address = "%s %s %s %s %s %s" % (get_value_text(d, "Город"), get_value_text(d, "Район"), get_value_text(d, "НасПункт"), get_value_text(d, "Улица"), get_value_text(d, "Дом"), get_value_text(d, "Корпус"))&lt;br /&gt;     print get_geocode(address, "AHqsEk4BAAAAekkFTAMA9DGkZfo_WT9ci8K8X286J9ILWjIAAAAAAAAAAABhqxW74U1xylQQhCYKzVIxsQBPTQ==")&lt;/pre&gt;</description>
      <author>ffsdmad@jabber.ru ( Басманов ) </author>
    </item>
  </channel>
</rss>

