im simple message default title
PostgreSQL coub css express.js freeware git jquery laravel links linux macos mysql node.js php python task1 ubuntu vim virtualbox анекдот игры интересно музыка стихи цитаты

Очередной справочник с интересными (и не очень) ссылками.
  • 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 интересная заметка
python

Напишу ещё раз на всякий случай.
Я не настоящий сварщик! То есть не проф. 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
python task1

Простенько двигаемся по папочкам и просто так считаем чего сколько. Для *nix придется сменить слеш в пути. А работать всё равно будет.

import os   
# settings: src dir 
sSrc='d:\\Install'   

def show_all(sSrc,iDirs=0,iFiles=0): 
    for file in os.listdir(sSrc): 
        # full pathname  
        file=os.path.join(sSrc,file)   
        if os.path.isdir(file): 
            # if directories 
            print '['+file+']' 
            iDirs+=1 
            iDirs,iFiles=show_all(file,iDirs,iFiles) 
        else: 
            # else files 
            print ' '+file 
            iFiles+=1 
    return iDirs,iFiles

iDirs,iFiles=show_all(sSrc,0,0)   

print """
total dirs: """,iDirs,""" 
total files: """,iFiles
python

Если при попытке выполнить скрипт, мы видим что-то вроде.. "ImportError: No module named image" Сие озночает что надобно установить PIL. А как? А очень просто!

# для убунту
sudo apt-get install python-imaging
Ну а для win придется сползать на оф страничку, скачать и установить соответствующую версию PIL.
python

Я даже не знаю к чему это я. Честно. Вот вдруг захотелось.

def next(n1,n2): 
  return n1+n2 

n1=0
n2=1 
nn=0

for i in range(1,30): 
  nn=next(n1,n2) 
  if i%2==0: 
    n1=nn 
  else: 
    n2=nn 
    print nn
Так вот это была полностью детская реализация. Вот она красота на самом деле (из книжки Гвидо ван Россума):
def fib(n): 
  a, b = 0, 1 
  for i in range(1,n): 
    print b, 
    a, b = b, a+b 

fib(20) 
Чтобы понять зачем после переменной запятая в принте, стоит позапускать софтинку в консольке с запятой и без. Для меня было ново. И вроде мелочь, а приятно.
python

HO-HO-HO!! L10 is here.
dance-dance #3
update new 01.10.2023