Nov 22, 2013

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

С чего начать программировать?

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

Virtualenv

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

установка:

$ pip install virtualenv

Virtualenvwrapper

В чистом виде 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 и тут же видеть изменения в ваших проектах.

Примечание

Более элегантный метод - это установить пакет через setuptools с флагом для разработки:

В директории пакета выполнить команду
$ python setup.py develop

Он автоматически пропишет симлинк в окружении, что можно будет наблюдать выполнив pip list.

Текстовый редактор

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

../../../_images/vim.png

Vim + Python

здесь видно что я могу перемещаться по файлам, видеть изменения по сравнению с предыдущим комитом, интроспекция кода, ну и все прочие ништяки.

IDE

не нужны

Tmux

это эмулятор терминалов, он позволяет в одной вкладке терминала запустить несколько окон виртуальных терминалов.

../../../_images/tmux.png

tmux

Поверьте, это удобно.

Пример использования

в первом окне у меня запущен Веб сервер (pserve или runserver), во втором редактор Vim, по необходимости я могу создать третье окно для запуска тестов или ipython или чего еще. Поехали:

для запуска tmux выполните:

$ tmux

я обычно запускаю tmux так:

$ tmux attach || tmux new

здесь он присоединится к существующей сессии или откроет новую. Далее запустим сервер Pyramid (waitress):

$ pserve development.ini.example start --reload

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

$ watch -n 3 pserve development.ini.example start --reload

watch это утилита которая каждые 3 секунды пытается перезапустить pserve (waitress). Это не сильно нагружает систему зато очень удобно!

Дальше создаем второе окно, нажимаем Ctr^b+c (create), попали в новое окно пишем 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

../../../_images/powerline.png

На картинке с 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 следующие строки:

.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 например.

../../../_images/notebook_specgram.png

Установка:

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

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


Comments

comments powered by Disqus