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++ разве что Лиспа нету, но все равно потрясает.

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

7 комментариев:

  1. Анонимный22 ноября, 2013 16:26

    Спасибо за статью!))
    за codebunk.. но к сожалению там версия 2.7(
    статью по настройке vim буду ждать))
    а пока пользуюсь кусочками этого конфига:
    https://github.com/swaroopch/dotvim (Inspired from http://blog.sontek.net/blog/detail/turning-vim-into-a-modern-python-ide)

    ОтветитьУдалить
    Ответы
    1. решение есть http://ideone.com/
      у sontek'а замечательные статьи, писал бы он чаще

      Удалить
  2. Анонимный23 ноября, 2013 14:12

    Честно, так и не понял преимуществ virtualenvwrapper. Ну какая разница, выполнять . venv/bin/activate или mkvirtualenv venv ?

    ОтветитьУдалить
    Ответы
    1. В virtualenv обычно создают директорию с окружением в самом проекте, что бы проще было его активировать и каждый раз обращаются к файлу. В virtualenvwrapper все в одном месте ~/.virtualenvs и утилиты типа mkvirtualenv, workon итд автоматически ищут окружения там. Т.е. мне не надо заморачиваться за пути, я могу на лету переключиться в любое окружение из любой директории. Пишу workon затем два раза таб и вижу список окружений. Ну и во врэппере есть еще много всяких команд lsvirtualenv, cdvirtualenv + ништяки типа ~/.virtualenvs/postmkvirtualenv выполняет команды в нем после каждой активации.

      Удалить
  3. Про ссылку на локальную библиотеку не очень хороший совет. Это же будет ссылка на рабочую копию. Предположим мы делаем изменения меняющие API этой библиотеки, и тут срочно должны переключится на другой проект, использующий эту либу. И.... опаньки! Ничего не работает. Нет, лучше уж все зависимости через пип, с явным указанием версий.

    ОтветитьУдалить
    Ответы
    1. Тут конечно каждому свое, в моем случае библиотека небольшая и поправить проект под новое API обычно не проблема, зато все проекты всегда имеют одинаковое API и не надо сопровождать несколько версий. Если библиотека не позволяет быстро делать изменения, то вы абсолютно правы нужно соблюдать версии. В первом случае это небольшая библиотека, которая пишется вами, во втором это что то большое которое пилят несколько человек.

      Удалить
  4. Анонимный30 ноября, 2013 13:41

    Озадачила фраза "IDE не нужны". Скажит, вы работали в PyCharm?

    ОтветитьУдалить