Показаны сообщения с ярлыком environment. Показать все сообщения
Показаны сообщения с ярлыком environment. Показать все сообщения

22 ноября 2013

С чего начать?©

С чего начать программировать?
Элементарно же: написать ТЗ, выбрать фреймворк, спроектировать базу, написать функцию, написать тест... Ну или какой-нибудь ваш ответ, здесь всё равно что то тормозит, а именно окружение, именно про него все забывают. Попробую описать один из возможных вариантов для python.

Virtualenv

замечательная штука, позволяет под каждый проект создать свое окружение пакетов, при чём избавляя основное окружение дистрибутива от захламления. Это одна из самых крутых фич питона.
установка:
pip install virtualenv
В чистом виде virtualenv имеет множество команд для гибкой настройки окружения, но каждый раз делать одни и те же действия не хорошо, по этому придумали пакет virtualenvwrapper облегчающий работу с virtualenv(люди не использующие его мне кажутся странными).
установка:
pip install virtualenvwrapper

для того что бы в окружении консоли(вашего системного профиля) появились команды virtualenvwrapper, нужно выполнить команду:
source /usr/local/bin/virtualenvwrapper.sh
что бы каждый раз после перезагрузки так не делать, добавьте эту строчку в ~/.bashrc

Как это работает:
создаем новое окружение
mkvirtualenv test

все мы в нем, в консоле должно появится название окружения
uralbash  ⓔ  test  ~  Projects 

Теперь все вызовы pip будут устанавливать пакеты в окружение test. Что бы выйти из него нужно ввести:
deactivate
Теперь если нужно зайти снова в окружение test выполняем команду:
mkvirtualenv test
Команда такая же как и при создании, но если окружение уже существует, то оно просто откроется.
Если у вас много окружений и нужно между ними переключаться, выполните команду:
workon test2

PIP
думаю и так все понятно, оставлю здесь лишь пример установка из репозитария на github:
pip install git+http://github.com/uralbash/sacrud.git

Разработка вашего приложения и github
я пишу sacrud и использую его во многих моих проектах, что вызывает некоторые неудобства если его обновлять через pip:
pip install git+http://github.com/uralbash/sacrud.git --upgrade
Это конечно работает, но представьте постоянно обновлять 10 окружений  разных проектов на своем компе, при том что новую версию sacrud прежде еще нужно выложить на github. Для решения этой проблемы есть очень простой способ. В папке с вашим проектом создаем символическую ссылку на локольное размешение sacrud:
example  tree
.
├── example
├── Makefile
├── MANIFEST.in
├── production.ini
├── README.md
├── sacrud -> ../sacrud
├── setup.cfg
└── setup.py

Таким образом у нас всегда всё с пылу, с жару. Можно пилить sacrud и тутже видеть изменения в ваших проектах.

Текстовый редактор
если кратко описать этот раздел, то он займет 80% этой статьи, посему мне придется лишь дать наставление использовать продвинутый едитор с множеством фич, например vim, emacs, sublime text. Плохая идея использовать gedit или ms notepad. Мой выбор определен на Vim, обязательно напишу про него отдельную заметку как использую с Python, а пока скриншот:
Vim + Python
здесь видно что я могу перемещаться по файлам, видеть изменения по сравнению с предыдущим комитом, интроспекция кода, ну и все прочие ништяки.

IDE
не нужны

Tmux
это эмулятор терминалов, он позволяет в одной вкладке терминала запустить несколько окон виртуальных терминалов.
tmux
Поверьте, это удобно. Пример использования:
в первом окне у меня запущен Веб сервер(pserve или runserver), во втором редактор Vim, по необходимости я могу создать третье окно для запуска тестов или ipython или чего еще. Поехали:
для запуска tmux выполните
tmux
я обычно запускаю tmux так:
tmux attach || tmux new
здесь он присоединится к существующей сессии или откроет новую. Далее запустим сервер Pyramid:
pserve development.ini.example start --reload
Это замечательный сервер, который умеет перезагружаться если вы внесли изменения в код, но он упадет если в этих изменения есть ошибки. По этому что бы не подымать его руками запустим сервер так:
watch -n 3 pserve development.ini.example start --reload
watch это утилита которая каждые 3 секунды пытается перезапустить pserve. Это не сильно нагружает систему зато очень удобно!

Дальше создаем второе окно, нажимаем Ctr^b+c(reate), попали в новое окно пишем vim и начинаем писать. Если нужно переключиться обратно в 1 окно с сервером, нажимаем Ctr^b+n(next).
Если нужно закрыть окно просто выполните exit, как если бы закрыли обычный терминал.
Допустим я не хочу создавать отдельное окно для тестов, мой экран позволяет два окна уместить рядом и это будет очень удобно(писать код и выполнять тесты на одном экране, широком правда). В текущем окне с Vim, нажмите Ctr^b+" это разделит экран по горизонтали пополам.
Что бы увеличить окно нажмите Ctr^b+Ctr^↑ или Ctr^b+Ctr^↓
Для перемещения курсора на другой экран Ctr^b+↑ или Ctr^b+↓
Для разделения экрана по вертикали Ctr^b+% и стрелки вбок для изменения размеров, по аналогии.
Перемещаться также можно при помощи Ctr^b+o, а менять окна местами Ctr^b+O.
Комбинации легко запомнить, всегда! перед действием нажимай Ctr^b.

Гораздо веселее это все делать мышкой :) Для этого изменим конфиг:
$ cat ~/.tmux.conf 
source ~/.local/lib/python2.7/site-packages/powerline/bindings/tmux/powerline.conf
set-option -g default-terminal "screen-256color"
set -g status-interval 15

# Mouse mode
set -g mode-mouse on
set -g mouse-resize-pane on
set -g mouse-select-pane on
set -g mouse-select-window on

##Toggle mouse on with m
bind m \
        set -g mode-mouse on \;\
        set -g mouse-resize-pane on \;\
        set -g mouse-select-pane on \;\
        set -g mouse-select-window on \;\
        display 'Mouse: ON'

## Toggle mouse off with M
bind M \
        set -g mode-mouse off \;\
        set -g mouse-resize-pane off \;\
        set -g mouse-select-pane off \;\
        set -g mouse-select-window off \;\
        display 'Mouse: OFF'
### End Mouse On/Off ### }}}

Теперь двигай мышью! В режиме мыши нельзя скопировать текст из терминала. Что бы этого избежать повешены два хоткея для включения Ctr^b+m и отключения Ctr^b+M режима мыши.

Если не впечатлило, то есть один очень хороший стимул использовать tmux: он поддерживать сколько угодно терминалов с одинаковым virtualenv. К примеру если я создам X вкладку gnome-terminal и активирую там окружение test, то во второй X вкладке я получу вот такую ошибку
IOError: [Errno 26] Text file busy: 'test/bin/python'
tmux это решает очень просто, перед запуском активируйте virtualenv, а затем запустите tmux. Теперь все новые окна будут иметь это же virtualenv окружение.

Powerline
На картинке с Vim, в левом нижнем углу, есть красивая панелька с погодой, часами и tmux окнами. Слева есть запись 1>watch 2>vim, это означает что в текущей сессии tmux в которой я нахожусь создано 2 окна, текущее подсвечено синим цветом. Самое приятное что кликая по ним мышкой они переключаются. Эта панель называется powerline она очень удобная и красивая. Powerline можно поставить так же для bash, zsh, ipython, vim. Как это сделать, подробно описано здесь http://askubuntu.com/questions/283908/how-can-i-install-and-use-powerline-plugin
Для vim я рекомендую bling/vim-airline вместо powerline.

pgUp & pgDown
Я ни когда не ищу команды, в консоле, которые уже вводил. Для этого набираю начало команды и нажимаю pgUp. Например pse+pgUp выдаст pserve development.ini start --reload
Если вы хотите также, добавьте в ~/.inputrc следующие строки:
"\e[5~": history-search-backward
"\e[6~": history-search-forward

Makefile
в проекте можно создать Makefile файл, что бы выполнять скрипты одной командой. Пример:
cat ../sacrud/Makefile
all: test

setup_test: 
 python setup.py test

coverage:
 nosetests --cover-package=sacrud --cover-erase --with-coverage  --with-doctest

test:
 nosetests --cover-package=sacrud  --with-doctest

run:
 pserve development.ini --reload
     
shell:
 pshell development.ini
Теперь чтоб запустить тесты пишем просто make all

ipython notebook
notebook запускает ipython в браузере, это очень удобно если вы работаете с графикой, matplotlib например.
Установка:
sudo apt-get install ipython-notebook
Запуск:
ipython notebook --pylab
Причем фишечка! Свои творения можно расшарить в Интернете здесь http://nbviewer.ipython.org/

jsFiddle
jsFiddle это такой сервис который позволяет нахаляву написать js код, тут же его отладить, расшарить и дать кому-нибудь ссылку. Про него все знают и многие пользуются. Но есть и для Python такой сервис, вот http://codebunk.com
Можно выбрать python, js, ruby, perl, php, lua, C, C++ разве что Лиспа нету, но все равно потрясает.

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

10 февраля 2012

Jinja замена None Null итд на пустую строку

В питоне пустые значения возвращаются как None. Поэтому в шаблонах Jinja вместо пустых значений отображаются None. Что бы поправить это нужно изменить метод finalize. Пример из google groups

def silent_none(value):
     if value is None:
         return ''
     return value

from jinja2 import Environment
env = Environment()
env.finalize = silent_none 
Теперь вместо None будет писаться пустая строка ''. В pylons нужно править файл environment.py
def silent_none(value):
    """ Jinja fix output None
    For more details:
    http://groups.google.com/group/pocoo-libs/browse_thread/thread/490f6e6e8fca6a6c
    """
    if value is None:
        return ''
    return value

def load_environment(global_conf, app_conf):
    """Configure the Pylons environment via the ``pylons.config``
    object
    """
    bla bla bla...
    # Create the Jinja2 Environment
    config['pylons.app_globals'].jinja2_env = Environment(loader=ChoiceLoader(
            [FileSystemLoader(path) for path in paths['templates']]))
    # replace None output to ''
    config['pylons.app_globals'].jinja2_env.finalize = silent_none
    # Jinja2's unable to request c's attributes without strict_c
    config['pylons.strict_c'] = True
    bla bla bla...

Скрипты работающие в окружении проекта на Pylons

Иногда необходимо написать скрипт который выполняется из консоли и использует окружение проекта на Pylons. Копипастю простой пример с pylonshq. Так-как там есть привычка периодически удалять информацию.

import optparse

import pylons
from paste.deploy import appconfig

from YOURAPP.config.environment import load_environment


if __name__ == '__main__':
    option_parser = optparse.OptionParser()
    option_parser.add_option('--ini',
        help='INI file to use for pylons settings',
        type='str',
        default='development.ini')
    options, args = option_parser.parse_args()

    # Initialize the Pylons app
    conf = appconfig('config:' + options.ini, relative_to='.')
    load_environment(conf.global_conf, conf.local_conf)

    # Now code can be run, the SQLalchemy Session can be used, etc.
    ....