<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description></description><title>blog.lorien.name</title><generator>Tumblr (3.0; @lorien-blog)</generator><link>http://blog.lorien.name/</link><item><title>Распространение python приложений</title><description>&lt;p&gt;Пишу кратко, без соплей :) Итак, есть какое-то python приложение, мы хотим, чтобы его можно было ставить через easy_install или pip. Например, это некий веб-фреймворк и лежит он в каталоге /web/foo т.е. пакет foo, а в нём всякие веб-вкусности, составляющие основу нашего фреймворка.&lt;/p&gt;
&lt;p&gt;Для начала переместим /web/foo в /web/foo/foo, теперь наш проект будет лежать там, а /web/foo будет являться корнем распространяемого приложения, будет содержать документацию и служебную информацию, описывающую приложение.&lt;/p&gt;
&lt;p&gt;Далее нужно создать файл /web/foo/setup.py. В этом файле хранится информация о структуре приложения, его название, описание, имя автора и прочие штуки. Подробности можно узнать в официальной документации по &lt;a href="http://docs.python.org/distutils/index.html"&gt;distutils&lt;/a&gt; - это стандартная библиотека языка python. Итак, пример файла setup.py: &lt;a href="http://dumpz.org/22355/."&gt;http://dumpz.org/22355/.&lt;/a&gt; Скачиваете этот файл, заменяете все строки foo на название вашего пакета. Обратите внимание, что я там ручками собираю список файлов для того, чтобы указать его в опции data_files. Если этого не сделать, то в финальный архив попадут только python-файлы. HTML файлов, css, картинок и прочих вещей там не будет. Если можно этот момент решить проще, скажите мне как, буду рад узнать. Теперь этот файл (setup.py) позволит нам создать архив для распространения. Пользовать может скачать архив, распаковать его и вызывать команду `python setup.py install` (да-да, это тот setup.py, который мы сейчас сделали) и эта команда установит приложение в систему.&lt;/p&gt;
&lt;p&gt;Давайте, создадим ещё парочку файлов.&lt;/p&gt;
&lt;p&gt;Файл &lt;a href="http://writez.org/51"&gt;LICENSE&lt;/a&gt; - здесь мы опишем по какой лицензии распространяется приложение, собственно это и есть текст лицензии. Я показываю пример для BSD лицензии.&lt;/p&gt;
&lt;p&gt;Файл &lt;a href="http://writez.org/54"&gt;MANIFEST.in&lt;/a&gt; - честно говоря, забыл, что оно делает. Но оно нужно ;-) Не забудьте, заменить foo на имя вашего пакета.&lt;/p&gt;
&lt;p&gt;Файл README - чиркните пару слов, что делает ваше приложение, куда слать багрепорты, благодарности, проклятия, деньги.&lt;/p&gt;
&lt;p&gt;Ещё я файл AUTHORS обычно создаю и пишу туда себя любимого :o) Типа такого: &lt;a href="http://writez.org/55"&gt;AUTHORS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Так, проверяйте, у вас должна получиться такая структура файлов:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;/web/foo&lt;br/&gt;- setup.py&lt;br/&gt;- MANIFEST.in&lt;br/&gt;- README&lt;br/&gt;- AUTHORS&lt;br/&gt;- LICENSE&lt;br/&gt;- foo (а это собственно сам пакет с исходными кодам) &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Отлично, теперь запускайте команду python setup.py register sdist upload. Register зарегает ваше приложение в Python Package Index, так что оно будет доступно через поиск на сайте &lt;a href="http://pypi.python.org"&gt;http://pypi.python.org&lt;/a&gt;, sdist создаcт архив с вашим приложением, который можно распространять, а upload зальёт этот архив на pypi. Последний шаг очень важный - это позволит устанавливать приложение простой командой easy_install.&lt;/p&gt;
&lt;p&gt;Обратите внимание, что вам также понадобится изменить структуру вашего репозитория т.к. появляется дополнительная родительская категория с файлом setup.py Кроме того вам будет нужно настроить список игнорируемых файлов. Добавить туда несколько служебных директорий, которые создаются в процессе выполнения команды python setup.py sdist.&lt;/p&gt;
&lt;p&gt;Вот вам живой пример &lt;a href="http://bitbucket.org/lorien/django-common/src/tip/.hgignore"&gt;.hgignore&lt;/a&gt; из пакета django-common&lt;/p&gt;
&lt;p&gt;Вот и всё.&lt;/p&gt;
&lt;p&gt;Сейчас ещё популярен способ установки пакетов внутрь virtualenv с помощью pip непосредственно из репозитория. Чтобы это делать, вам всё равно необходимо создать файл setup.py, регистрировать приложение в Python Package Index не обязательно. Т.е. стуктура вашего приложения, файл setup.py - должны быть такими, как я описал выше - независимо от того, будете ли вы использовать easy_install или pip.&lt;/p&gt;</description><link>http://blog.lorien.name/post/1155306058</link><guid>http://blog.lorien.name/post/1155306058</guid><pubDate>Mon, 20 Sep 2010 16:45:00 +0600</pubDate><category>pypi</category><category>setuptools</category><category>easy_install</category><category>python</category></item><item><title>Ищем freelance проекты с помощью Yahoo Pipes</title><description>&lt;p&gt;Оказывается, yahoo pipes кроме эстетического удовольствия составления алгоритма из визуальных кусочков, приносят ещё и практическую пользу :) На днях сделал трубу, которая фильтрует поток проектов с freelance бирж на темы python, django, парсинг. Получилась такая страничка:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=dcab10c7e16006c9ef7749cd3700cb4b"&gt;http://pipes.yahoo.com/pipes/pipe.info?_id=dcab10c7e16006c9ef7749cd3700cb4b&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;А вот исходники трубы:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://pipes.yahoo.com/pipes/pipe.edit?_id=dcab10c7e16006c9ef7749cd3700cb4b"&gt;http://pipes.yahoo.com/pipes/pipe.edit?_id=dcab10c7e16006c9ef7749cd3700cb4b&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Далее. Оказалось, что на результаты трубы можно подписаться по email. В итоге, абсолютно на халяву я регулярно получаю сводку по нужным проектам себе на мыло :)&lt;/p&gt;</description><link>http://blog.lorien.name/post/1121690206</link><guid>http://blog.lorien.name/post/1121690206</guid><pubDate>Tue, 14 Sep 2010 23:34:37 +0600</pubDate></item><item><title>Утилита поиска на PyPI</title><description>&lt;p&gt;Сделал консольную утилиту для поиска пакетов на &lt;a href="http://pypi.python.org"&gt;Python Package Index&lt;/a&gt;. Устанавливается обычным образом: sudo easy_install pypi-tools. После установки пакета становится доступной команда pypi.&lt;/p&gt;
&lt;p&gt;Пример использования:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ pypi gravatar&lt;br/&gt;    django-gravatar                - Gravatar Support in a Django Reusable Application&lt;br/&gt;    gravatar                       - Gravatar generator. Includes all API parameters included in their documentation.&lt;br/&gt;    tw.gravatar                    - inserts gravatar images&lt;br/&gt;    tw.gravatar                    - inserts gravatar images  &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Так можно посмотреть информацию о пакете:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ pypi -s tw.gravatar&lt;br/&gt;     name:                tw.gravatar&lt;br/&gt;     summary:             inserts gravatar images&lt;br/&gt;     version:             0.1a0dev-20100727&lt;br/&gt;     author:              Nicolas Laurance&lt;br/&gt;     author_email:        nicolas[dot]laurance&amp;lt;at&amp;gt;gmail.com&lt;br/&gt;     keywords:            toscawidgets.widgets,gravatar&lt;br/&gt;     classifiers:         Development Status :: 3 - Alpha&lt;br/&gt;                          Environment :: Web Environment&lt;br/&gt;                          Environment :: Web Environment :: ToscaWidgets&lt;br/&gt;                          Framework :: TurboGears :: Widgets&lt;br/&gt;    &amp;#8230;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Доступен также поиск по различным свойствам из описания пакета. Пример поиска по email автора:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$ ./pypi &amp;#8212;author_email lorien@lorien.name&lt;br/&gt;    django-account                 - Django application for registration and authentication&lt;br/&gt;    django-bookmarker              - Social bookmark linsk&lt;br/&gt;    django-common                  - A number of useful django shortcuts and helpers&lt;br/&gt;    &amp;#8230;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Страница проекта на pypi: &lt;a href="http://pypi.python.org/pypi/pypi-tools/"&gt;&lt;a href="http://pypi.python.org/pypi/pypi-tools/"&gt;http://pypi.python.org/pypi/pypi-tools/&lt;/a&gt;&lt;/a&gt;&lt;br/&gt;Исходный код:  &lt;a href="http://bitbucket.org/lorien/pypi-tools"&gt;&lt;a href="http://bitbucket.org/lorien/pypi-tools"&gt;http://bitbucket.org/lorien/pypi-tools&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;</description><link>http://blog.lorien.name/post/1116816250</link><guid>http://blog.lorien.name/post/1116816250</guid><pubDate>Tue, 14 Sep 2010 02:36:00 +0600</pubDate><category>pypi</category><category>python</category></item><item><title>Прожорливый djapian</title><description>&lt;p&gt;&lt;a href="http://code.google.com/p/djapian/"&gt;Djapian&lt;/a&gt; - это django-приложение, разработанное &lt;a href="http://webnewage.org/"&gt;Александром Кошелевым&lt;/a&gt;, упрощающее использование поискового движка xapian в django-сайтах.&lt;/p&gt;
&lt;p&gt;В официальном tutotiral можно посмотреть примеры использования приложения, в том числе &lt;a href="http://code.google.com/p/djapian/wiki/Tutorial#Adding_pagination%20"&gt;пример пагинации&lt;/a&gt;. Обратите внимание на вызов метода prefetch(). Поиск работает так, что в начале ищутся id объектов в индексном файле djapian, а затем уже по этим id достаются реальные объекты из базы данных т.е. djapian возвращает обыкновенный queryset. Так вот prefetch нужен для того, чтобы вытаскивать все объекты за раз одним запросом, иначе при итерации по результатам поиска на каждый объект будет сделан запрос. Проблема в том, что все объекты вытаскиваются ДО пагинации. Если результатам поиска удовлетворяют 200000 объектов, то они все будут извлечены из базы данных, несмотря на то, что после пагинации мы будем использовать лишь те объекты, что нужно отобразить на текущей странице поиска.&lt;/p&gt;
&lt;p&gt;Если вы сталкивались с такой проблемой, интересно, как вы её решили. Я просто решил не использовать метод prefetch.&lt;/p&gt;</description><link>http://blog.lorien.name/post/1087188154</link><guid>http://blog.lorien.name/post/1087188154</guid><pubDate>Wed, 08 Sep 2010 23:07:00 +0600</pubDate><category>djapian</category><category>xapian</category><category>django</category></item></channel></rss>

