Пишем качественный код на jQuery

Решил открыть тег ссылки, потому что перетягивать все на свете устанешь (да и вообще как-то не комильфо без необходимости по-моему), в закладках браузера потеряется а тут хоть как-то.. в общем это лирика.

Статья "Пишем качественный код на jQuery" освещает очевидно-понятно какие вопросы. К прочтению не то что обязательно, но может быть очень полезно.
Качественный код – это прежде всего быстрые приложения и сайты без лишнего мусора. В конце концов, быстрая отрисовка страниц и улучшенное реагирование принесут вашим пользователям более позитивный опыт взаимодействия.
© frontender.info

Хочу учить Python Что почитать?

Очередной справочник с интересными (и не очень) ссылками.
  • codeacademy - курс для начинающих на знаменитой академии с уклоном в веб-технологии как я понимаю.
  • checkio.org сногсшибательная обучающая "игра". Нужно понимать английский, но оно того стоит. Очень здорово сделано.
  • Learn Python The Hard Way, 3rd Edition книга или даже гайд по обучению. Английский язык. За сравнительно небольшие деньги можно выкупить видеоверсию и книгу в .pdf
  • Пост на хабре (и ещё один, прямо вчерашний) специально посвященный этой же теме, там тоже тонна ссылок + неплохой вступительный текст, спасибо авторам
  • Let's Learn Python - Basics небольшой вводный видеокурс на английском
  • Python Django tutorial видеокурс по Django, относительно свежий, начало в январе 2013
  • Официальный tutorial Гвидо ван Россума
  • Useful python functions интересная заметка

Vim: как редактировать несколько строк одновременно


А теперь по порядку что тут такое происходит
  1. Печатаем какую-то строку в режиме insert (i)
  2. Переходим в режим normal (Esc) устанавливаем курсор на нашу строку и делаем так yy7p. То есть просто дублируем строку 7 раз.
  3. Входим в режим визуальный блок Ctrl+q и тянем курсор вниз на все наши строчки. Теперь есть вариант: выбрать ввод после символа под курсором (нажать A), или перед символом (нажать I)
  4. Вводим собственно то, что должно быть напечатано во всех выбранных строках.
  5. Нажимаем Esc
Думаю может быть интересно поиграть с режимом визуального блока.
Немного почитать о нем можно так :h ctrl-q

Django + Gunicorn + virtualenv + nginx #2

Напишу ещё раз на всякий случай.
Я не настоящий сварщик! То есть не проф. python программист. Я только учусь!

Итого успехи у меня не большие к этому моменту. Я поиграл с flask-ом и поленившись всерьез добраться до SQLAlchemy взял Django как фреймворк пока. Пока это не было важно. Я хотел разобраться как устроена боевая серверная часть хотя бы на базовом уровне и кажется у меня получилось.
Суть примерно такая:
  • Впереди стоит nginx который форвардит соединения для хоста на порт приложения
  • За nginx стоит Gunicorn (Python WSGI HTTP Server)
  • За Gunicorn уже само приложение на Django
  • Все python компоненты, необходимые для работы приложения, собираются при помощи virtualenv + pip

Теперь чуть больше порядка.
  1. pip - это инструмент для установки и управления python-компонентами. То есть эта штука позволяет нам грубо говоря ставить/удалять/искать/создавать разные пакеты с указанной версией. Эдакий питоний apt-get или npm для node.js. Как он устанавливается и работает можно почитать на офсайте.
  2. virtualenv - инструмент для создания "виртуальной среды" для выбранного приложения. По-простому говоря у вас на одном сервере живет несколько приложений которые требуют разные версии одного и того же python-компонента. Обязательно разные версии. Как быть, ведь глобально можно установить ровно одну версию. Тут как раз придет на помощь virtualenv. В общем тоже что и в node.js есть компоненты установленные глобально, а есть установленные специально под приложение и все это барахло можно контролировать. В разных доках и туториалах по python разработке умные дядьки настоятельно рекомендуют использовать virtualenv и я тут могу только с ними согласиться. Смысл очевиден. Ставится просто:
    sudo pip install virtualenv
    
    Базовое использование совсем не сложно
    # переходим в папку нашего проекта
    cd ~/project-folder
    # инициализируем вирт. среду (название среды может быть любым, у меня это ENV)
    virtualenv ENV
    # теперь внутри папки с нашим проектом будет создана папка ENV 
    # с инициализированной виртуальной средой внутри
    # теперь активируем эту вирт. среду
    source ./ENV/bin/activate
    # обратите внимание строка приглашения bash будет дополнена названием среды
    # у меня в примере она выглядит вот так: (ENV)luke@tatuin:~/project-folder$
    # теперь ставим в эту вирт среду нужные компоненты
    pip install Django
    pip install gunicorn
    pip install mysql-python
    # и так далее.. все что установлено можно посмотреть вот так
    pip list
    # для выхода из виртуальной среды нужно просто вызвать
    deactivate
    
    В общем суть в том что virtualenv в активированном состоянии подменяет переменные в env (наберите в консоли env чтобы посмотреть текущие переменные окружения), отвечающие за размещение пакетов и бинарников, после деактивации все возвращается обратно, как было.
  3. Как сделать болванку приложения на Django можно почитать на офсайте. Про это я сейчас писать ничего не буду, тут нет ничего необычного, все как в мануале. Будем считать что приложение у меня есть.
  4. Сейчас у нас есть приложение и настроенная среда для приложения. Папка с приложением у меня сейчас выглядит вот так:
    domain
    ENV
    manage.py
    manage.pyc
    requirements.txt
    run-dev.sh
    run-prod.sh
    static
    templates
    test1
    
    ENV - папка с вирт. средой, domain - приложение проекта test1 (примерно так выглядит обычная структура django-приложения). Соответственно, чтобы запустить отладочную версию проекта достаточно запустить (при активированном virtualenv)
    python manage.py runserver
    
    Ну и чтобы запустить боевую версию на gunicorn-e (при активированном virtualenv) делаем так
    gunicorn test1.wsgi:application -b 127.0.0.1:8800 --env FOO=VAL
    
    Здесь мы биндим наше приложение на IP и порт. Через --env передаем переменную окружения (см. мануал по gunicorn) чтобы сообщить что-то приложению, что мы боевая версия например или номер генератора на котором будем работать, да что угодно в общем. Вообще запуск gunicorn можно отдельно конфигурировать в файл и читать все оттуда, это все есть на офсайте. В данном случае, для Django, запуск выглядит не совсем тривиально, с простыми приложениями это немного иначе выглядит.
  5. Ну и в конце nginx, через который мы завернем хост на наше приложение
    server {
        listen   80;
        server_name lest1.loc;
    
        proxy_set_header Host $http_host;
    
        location / {
            proxy_pass http://127.0.0.1:8800;
        }
    }
    
    На этом месте данных должно быть достаточно чтобы запустить приложение в боевом режиме. У Django ещё куча доп. внутренних настроек для отладки, но это уже другая история.
  6. Что осталось. Осталось понять как сохранять состояние среды окружения и как его восстанавливать обратно. Сохранить состояние можно в текстовый файл вот так
    pip freeze > requirements.txt
    
    Название файла может быть любым, по сути главное там формат. Загляните внутрь. Внутри будет содержимое вида
    Django==1.6
    MySQL-python==1.2.4
    argparse==1.2.1
    gunicorn==18.0
    wsgiref==0.1.2
    
    Теперь коммитим это в нашу систему контроля версий и когда нужно будет восстановить состояние проекта - создаем вирт. среду через virtualenv, активируем её и выполняем установку пакетов из сохраненного файла состояния вирт. среды. Все вместе будет выглядеть вот так:
    cd proj-folder
    virtualenv ENV
    source ./ENV/bin/activate
    pip install -r requirements.txt
    
    Pip считает данные о зависимостях из текстовика и установит в вирт.среду все что нужно. Если будет нужно что-то скачать, то он конечно попробует скачать сам. Ну, тут уже все понятно. Пока это все. Надеюсь следующая пауза не будет длиннее.
REM: для установки mysql-python может понадобиться установить библиотеку
sudo apt-get install python-dev
sudo apt-get install libmysqlclient-dev

Linux: как быстро создать структуру папок

Врядли это для кого-то открытие конечно, но тем не менее.
У mkdir (man mkdir) есть ключик -p который позволяет создавать довольно интересные структуры подпапок одним движением. Например
mkdir -p ./one/two/three
создаст три вложенных друг в друга папки внутри текущей директории.
Можно сделать несколько интереснее
mkdir -p ./one/{two1,two2,two3}/three
что даст нам такую структуру (допустим что мы запускали это все из домашней папки)
~/one/two1/three
~/one/two2/three
~/one/two3/three
Ну и ещё раз если вдруг кто не понял что происходит
mkdir -p ./one/{two1,two2,two3}/{th1,th2,th3}
Создает такую структуру
~/one/two1/th1
~/one/two1/th2
~/one/two1/th3
~/one/two2/th1
~/one/two2/th2
~/one/two2/th3
~/one/two3/th1
~/one/two3/th2
~/one/two3/th3
Ну и понятное дело фигурные скобки можно использовать не только с mkdir, в этом примере мы чистим папки с кешем и логами для трех типовых проектов лежащих в текущей папке
#!/bin/bash
rm -rf {proj1,proj2,proj3}/{logs,cache}/*