Июн 26

Справочник по APT

apt_dpkg.pngapt (advanced packaging tool) — программа для установки, обновления и удаления программных пакетов в операционных системах Debian и основанных на них (Ubuntu, Edubuntu и т. п.). Способна автоматически устанавливать и настраивать программы для UNIX-подобных операционных систем как из предварительно откомпилированных пакетов, так и из исходных кодов. источник: wikipedia

КомандаОписание
apt-get install packagenameустановка пакета с именем packagename, ключ -s симулирует установку, ключ -f форсирует установку зависимостей
apt-get updateкеширование списка доступных приложений на удаленных репозитариях
add-apt-repository ppa_nameдобавление репозитария ppa_name
ppa-purge ppa_nameудаление репозитария ppa_name (требуется установка ppa-purge)
apt-get upgradeустановка обновлений
apt-get dist-upgradeобновление дистрибутива до последней версии
apt-get remove packagenameудаление пакета с именем packagename, ключ --purge удаляет все связанные с пакетом файлы (конфиги и т.д.)
apt-get cleanочищает кэш apt (/var/cache/apt/archives/)
apt-get autocleanудаляет старые пакеты
apt-get checkобновление кэша apt и поиск сломанных зависимостей
apt-get source packagenameскачать исходники для пакета packagename
apt-get build-dep packagenameустановить зависимости для пакета packagename
apt-cache statsстатистика по локальному репозитарию
apt-cache depends packagenameсписок зависимостей для пакета packagename
apt-cache dumpсписок установленных пакетов
apt-cache search packagenameищет пакет packagename в кэше
apt-cache show packagenameвывод информации о пакете packagename
apt-file search filenameпоиск в кэше apt пакета, который содержит файл filename (требуется установка apt-file)
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys keynumимпортировать ключ keynum

dpkg — это программное обеспечение, являющееся основой системы управления пакетами в Debian. dpkg используется для установки, удаления, и получения информации о .deb пакетах. источник: wikipedia

КомандаОписание
dpkg -i package.debустановка/обновление пакета package.deb
dpkg -R /path/to/dirустановка всех пакетов из папки /path/to/dir
dpkg -r packageудаление пакета package (кроме конфигурационных файлов)
dpkg -P packageудаление пакета package вместе с конфигурационными файлами
dpkg -lсписок установленных пакетов
dpkg -L packagenameсписок файлов, установленных пакетом packagename
dpkg -S /path/to/filenameпоиск установленного пакета, который содержит файл filename
dpkg -c package.debсодержимое пакета package.deb, вместе с путями, по которым будут установлены файлы
dpkg -s packageстатус и информация о установленном пакете package
dpkg -x package.deb /path/to/extractизвлечения содержимого пакета package.deb в папку /path/to/extract

Дополнительное чтиво:

Июн 26

JavaZone Trailer: Java 4-ever

Июн 25

Справочник по YUM

yum_rpm.pngYUM (Yellow dog Updater, Modified) — открытый консольный менеджер RPM-пакетов. Позволяет облегчить каскадное обновление Linux систем с отслеживанием взаимосвязей RPM-пакетов. Распространяется под лицензией GNU. Первоначально был разработан программистом Seth Vidal и группой волонтёров. Для работы с YUM используется интерфейс командной строки, однако существуют надстройки, предоставляющие графический интерфейс для функционала YUM. источник: wikipedia

КомандаОписание
yum list updatesсписок пакетов для обновления
yum list recentсписок пакетов, добавленные за последние 7 дней в любой из подключенных репозиториев
yum list installedсписок установленных пакетов
yum list packageпоиск пакета package
yum list extrasсписок пакетов, установленных с неофициальных репозиториев RHN (Red Hat Network)
yum search packageпоиск пакета package
yum install packageустановка пакета package
yum reinstall packageпере установка пакета package
yum info packageинформация о пакете package
yum deplist packageсписок зависимостей для пакета package
yum remove packageудаление пакета package
yum check-updateкэширование списка доступных приложений на удаленных репозиториях
yum updateобновить все пакеты до последней версий
yum update packageобновить пакет package до последней версии
yum whatprovides /path/to/fileопределение пакета, которому принадлежит файл file
yum grouplistсписок групп приложений
yum groupinfo groupnameинформация о группе groupname
yum groupinstall groupnameустановка приложений из группы groupname
yum groupupdate groupnameобновление приложений из группы groupname
yum groupremove groupnameудаление всех приложений, принадлежащих группе groupname
yum repolistсписок репозиториев
yum clean allочищает кэш yum (/var/cache/yum/)

RPM (RPM Package Manager) - формат пакетов программного обеспечения и программа, созданная для управления этими пакетами. источник: wikipedia

КомандаОписание
rpm -ivh package.rpmустановка пакета package.rpm
rpm -Uvh package.rpmобновление пакета package.rpm
rpm -ev packageудаление пакета package
rpm -qaсписок всех установленных пакетов, ключ --last - список недавно установленных пакетов
rpm -ql packageсписок файлов, установленных пакетом package
rpm -qf /path/to/fileопределение пакета, которому принадлежит файл file
rpm -qc packageсписок конфигурационных файлов для пакета package
rpm -qpR package.rpmсписок зависимостей для пакета package.rpm
rpm -qR packageсписок зависимостей для пакета package
rpm2cpio package.rpm | cpio -idvизвлечение содержимого пакета package.rpm в текущею директорию

Дополнительное чтиво:

Июн 24

Python и менеджер контекста

Наткнулся в интернете на интересный пример использования менеджера контекста и оператора with, но перед тем как я покажу что мне понравилось немного матчасти.

Менеджер контекста представляет собой объект, который создает контекст выполнения внутри оператора with и обладает двумя методами __enter__ и __exit__.

Простой пример использования менеджера контекста и оператора with:

class Logger(object):
    def __init__(self, val):
        self.val = val 
        print "%d :: __init__" % self.val

def __enter__(self):
        print "%d :: __enter__" % self.val

def __exit__(self, exc_type, exc_val, exc_tb):
        print "%d :: __exit__ " % self.val

for i in xrange(5):
    with  Logger(i) as log:
        pass

Истинное предназначения оператора with это замена подхода setup..try..except..finally:

do_init()

try :
    do_task()

except SomeError :
    do_exception_handling()

finally :
    do_exit()

Т.е. мы сначала инициализируем наш ресурс (метод __init__ объект менеджера контекста), потом выполняем попытку работы с нашим ресурсом в блоке try..except..finally (внутренний блок оператора with). Если возник ексепшен то попадаем в ветку except и обрабатываем ошибку (метод __exit__ менеджера контекста). По-окончанию выполняется ветка finally (метод __exit__ менеджера контекста) где производим зачистку и освобождение нашего ресурса.

Добавим обработчик ексепшенов в приведенный выше пример работы с менеджером контекста:

class Logger(object):
    def __init__(self, val):
        self.val = val
        print "%d :: __init__" % self.val

def __enter__(self):
        print "%d :: __enter__" % self.val

def __exit__(self, exc_type, exc_val, exc_tb):
        print "%d :: __exit__ " % self.val
        if exc_type:
            print "%d !! error " % self.val
            return True

for i in xrange(3):
    with  Logger(i) as log:
        if i == 1:
            raise ValueError(i)

Получим такой вывод:

0 :: __init__
0 :: __enter__
0 :: __exit__ 
1 :: __init__
1 :: __enter__
1 :: __exit__ 
1 !! error 
2 :: __init__
2 :: __enter__
2 :: __exit__ 

Это было беглое введение в менеджер контекста, более подробно можно ознакомится на docs.python.org или у sykora.

А теперь пример кода который мне понравился. Этот код показывает как можно начать работать с несколькими файлами используя менеджер контекст и одновременно с этим подчеркивает всю элегантность и наглядность кода на python, за что мы его и любим :). Причем мы можем не переживать за закрытие файлов и освобождение ресурсов (это уже реализовано внутри метода __exit__ класса mfw), просто передаем имя файлов и режим работы с ним.

class mfw:
    """
    mfw : Multi-File With
    This utility class is a list of file handles.  It implements  __enter__
    and __exit__ methods so that it can be used via the with clause.
    """
    def __init__(self, *args):
        self.handles = []
        for (the_file, mode) in args:
            self.handles.append(open(the_file, mode))

def __enter__(self):
        return self.handles

def __exit__(self, type, value, traceback):
        for handle in self.handles:
            handle.close()

with mfw(('f1.txt', 'r'), ('f2.txt', 'w')) as (infile, outfile):
    print infile.name
    print outfile.name
Июн 22

Dajngo и статика для админки

Иногда бывает необходимость расширить стандартную django'вскую админку новыми изображениями, javascript, css или прикрутить django-grappelli. Для указания расположения статитки админки существует настройка ADMIN_MEDIA_PREFIX, но есть одна особенность: значение этой настройки должно отличатся от значения MEDIA_URL, иначе при доступе к файлу получим Page not found, а при просмотре папки через брауезер - Permission denied. Последние две ошибки можно увидеть под встроенным, девелоперским, сервером.

Есть два варианта выхода из сложившейся ситуации.

Первый, если у нас такие настройки в settings.py

MEDIA_URL = '/static/'
ADMIN_MEDIA_PREFIX = '/static/admin/media/'

то запускаем девелоперский сервер с указанием пути к статике для админки

./manage.py runserver 127.0.0.1:8000 --adminmedia=/fullpath/to/your/admin/media/

Второй, добавляем в settings.py, в переменную ADMIN_MEDIA_PREFIX домен/ip сайта

ADMIN_MEDIA_PREFIX = 'http://127.0.0.1:8000/static/admin/media/'
Июн 19

Fabric : автоматизация административных задач на python

fabric-list.pngFabric позволяет автоматизировать разные операции на удаленном хосте, наиболее яркий пример - развёртывание проекта: прогоняем тесты, пакуем нужные файлы и заливаем на сервер, развертываем архив, перезапускаем сервер.

Но одним лишь развертыванием проекта возможности fabric не ограничиваются, большинство административных задач можно реализовать на нем с разными ухищрениями. Для соединения с удаленным хостом используется Paramiko - python-библиотека реализующая протокол SSH2.

Для начала поставим сам fabric

pip install fabric

Следующим этапом надо составить список инструкций, которые хранятся в специально предназначенном файле fabfile.py. Например, напишем простую команду для бекапа папки www на разных серверах:

from fabric.api import *
env.hosts = ['usr1@host1:22', 'usr2@host2:22']
def backup():
    run("tar cfvz /tmp/backup.tar.gz /var/www/")

В env.hosts хранится список хостов к которым fabric будет последовательно подключатся и выполнять указанную команду, строка подключения представляют собой обычный адрес хоста, который используется в консольной команде SSH. Имя функции backup() и есть команда которую мы хотим выполнить, а функция run() запускает указанную shell-команду на удаленном хосте.

Запуск производится так:

fab backup

В конечном результате мы получим архив со всеми сайтами в файле /tmp/backup.tar.gz на каждом из указанных серверов. Дальше этот архив можно забрать на локальную машину с помошью функции get(), описана ниже.

Словарь env содержит разные настроечные параметры для fabric, полный список приведен тут. Еще вкусности про которые хотелось бы упомянуть:

  • возможность передачи параметров в написанные команды
  • для каждой команды можно задать декораторы, которые будут ограничивать выполнение только для указанного хоста
  • проверка результата выполнения команды - если обнаружены ошибки, то прекращается выполнение остальных команд
  • возможность интерактивного запроса команд от пользователя
  • набор команд для работы с папками и файлами
  • гибкий набор аргументов для fab

Внутри самописных команд можно использовать такие встроенные функции fabric:

sudo('ls /') - запустить ls с привилегиями суперпользователя (по умолчанию root) на удаленном хосте

put('/local/path/file.tar.gz', '/remote/path/file.tar.gz') - копирует локальный файл file.tar.gz на удаленном хост

run('ls /') - запускает ls на удаленном хосте

get('/remote/path/file.tar.gz', '/local/path/file.tar.gz') - копирует файл file.tar.gz на удаленном хосте на локальный хост

local('ls /', capture=False) - запускает ls на локальном хосте, аргумент capture=False не подавляет вывод запускаемой команды

Дополнительное чтиво:

Июн 14

Миграция моделей и данных в Django

django-south.png

Always, always, backup your database before doing any kind of potentially destructive migration. One time, it will go wrong.
(из south документации)

South привносит в django возможность миграции структуры и данных модели. На практике это означает, что если мы что-то поменяли в модели (добавили/удалили поле) то south сам увидит изменения и создаст инструкции для внесения изменений в БД, которые останется только применить на всех экземплярах приложения.

Основные особенности, которые отмечают разработчики:

  • отслеживание изменений в модели и создание миграций
  • независимость от движков БД (заявлена поддержка 5 разных типов БД)
  • создание миграций только для выбранного приложения (application)
  • сообщение о возможных конфликтах при комите миграций от других разработчиков

Ставим последнею версию South

pip install South

Добавляем south в INSTALLED_APPS и делаем syncdb.

Создаем точку отсчета миграций для приложения foo и применяем их

./manage.py schemamigration foo --initial
./manage.py migrate foo

Добавим новое поле в модель foo и укажем south на изменения

./manage.py schemamigration foo --auto

South создаст миграцию в папке foo/migrations (путь можно поменять в настройках south, переменная SOUTH_MIGRATION_MODULES), дав произвольное имя для файла. Внутри py-файла с миграцией есть класс Migration с двумя методами: forwards, который отвечает за выполняемые инструкции при выполнении команды migrate, и метод backwards - отвечающий за откаты при желании отменить миграцию.

Просмотр списка миграций

./manage.py migrate --list

звездочкой отмечены те миграции, что уже применены.

Кроме миграции структуры модели возможна миграция и данных. Используется, например, для изменения данных в модели для соответствия новой структуре.

Создаем заготовку foo_datamigration_0 для новой миграции данных:

./manage.py datamigration foo foo_datamigration_0

Правим нашу заготовку для миграции данных, для этого в методе forwards(self, orm) добавляем действия для манипуляциии над дынными, в передаваемом параметре orm находится уже хорошо знакомый django orm.

def forwards(self, orm):
    for foo in orm.Foo.objects.all():
        foo.title = "new title %d" % random.randrange(1,100)
        foo.save()

South также может отобразить графически процес миграции, начиная с самого начала.

./manage.py graphmigrations | dot -Tpng -omigrations.png

Дополнительное чтиво:

Июн 09

Screen: менеджер терминалов

screen.png Этот пост представляет собой больше узелок на память, чем развернутый ответ на вопросы что? где? когда? ... почему? :)

Screen является консольной утилитой для работы с несколькими консолями в одной терминальной сессии. Грубо говоря screen позволяет запускать несколько приложений в одном терминале и легко между ними маневрировать, делить окно на несколько частей и в каждой части отображать разные приложения (например, на сервере можно в одном окне сразу смотреть top и mytop).

Работа с screen

screen - создание новой сессии

screen -ls - список запущенных сессий

screen -S "session_name" - запустить новую сессию с именем session_name

screen -r [session_name] - восстановить последнюю рабочую сессию, необязательный параметр - имя сессии

screen top - запустить программу top в первой консоле

Шоткаты для screen

Ctrl+a c - создать новое окно

Ctrl+a k - убить выбранное окно

Ctrl+a d - выход из screen, сессия остается работать в фоновом режиме

Ctrl+a " - показать список всех открытых окон

Ctrl+a n - переключиться на следующие окно

Ctrl+a p - переключиться на предыдущие окно

Ctrl+a <номер окна> - переключиться на окно с выбранным номером

Ctrl+a :source ~/.screenrc - перезагрузить конфиг

Ctrl+a S - разбить окно на регионы по-горизонтали

Ctrl+a TAB - переключится на другой регион

Ctrl+a Q - закрыть все регионы, кроме текущего

Ctrl+a A - переименовать окно

Ctrl+a [ (или Ctrl+a ESC) - перейти в режим копирования

Ctrl+a ] - вставить содержимое буфера по умолчанию

Ctrl+a m - установить отметку о мониторинге за данным окном, если что-то поменяется то screen просигнализирует об этом

Мой .screenrc

startup_message off 
hardstatus alwayslastline 
hardstatus string "%= %{kW}[ %H ] [ %t ]"

caption always "%{.bW}%-w%{.rW}%n %t%{-}%+w %=%{..G} %{..Y} %l %c %d/%m/%Y "

# detach on hangup
autodetach on

# set a big scrolling buffer
defscrollback 5000

termcapinfo xterm|xterms|xs|rxvt ti@:te@

Дополнительное чтиво:

Июн 03

Django и WYSIWYG-редактор

django-wysiwyg.png Изначально пост планировался о наборе приложений без которых не обходится ни один мой проект на django, но потом я решил попробовать связку dajngo + wysiwyg-редактор с возможностью загрузки изображений. В итоге пост получился о том как построить простой сайт на flatpages с возможностью редактирования страниц и загрузки файлов.

Для начала нам понадобится:

  • подключить flatpages
  • установить django-annoying - удобный django-модуль, который содержит разные полезные дополнения. В частности декоратор render_to, функции get_object_or_None, get_config, StaticServer middleware и т.д. с полным списком можно ознакомится по выше приведенной ссылке.
  • django-tinymce, подключение описано тут

У меня получился такой settings.py и urls.py.

Теперь надо связать flatpages и только-что установленный django-tinymce, для этого в папке tinymce (я установил django-tinymce простым копированием нужных файлов в корень проекта) создаем admin.py. Все, теперь мы имеем работающую связку tinymce + flatpages, остается только настроить tinymce по вкусу.

Следующим этапом прикрутим загрузчик файлов. Для tinymce хватает разных загрузчиков - и платных и бесплатных, небольшой обзор есть тут. Но не у всех реализаций есть бекенд на python, точнее мне известен только для Image Manager, который рассматривается ниже.

Начнем с django-filebrowser, его требования:

Настройка django-filebrowser описана тут, а установка Grappelli описана тут. Grappelli меняет скин дефолтной админки django, скриншоты можно посмотреть тут. Django-filebrowser отказывается работать без Grappelli. Но после настройки этой связки все работает как положено: изображения и другие типы файлов грузятся без проблем, файлы можно сортировать по папкам, последние можно создавать/удалять.

Еще один вариант загрузчика изображений - Image Manager, демка. Сам загрузчик берем тут, коннектор для django тут. Автором коннектора является Андрея Гладилина, но у меня не заработал его коннектор, пришлось патчить:

  • подправил ссылки на python-коннектор,
  • пути для загрузки изображений,
  • функцию ShowDir()

Установка:

  1. Скаченный Image Manager распаковываем в папку PROJECT_PATH/static/js/tiny_mce/plugins
  2. Правим settings.py и urls.py, рабочие примеры с комментариями приведены выше.
  3. Архив python-images-patched.zip распаковываем в папку tinymce, в корне проекта. В settings.py правим IMAGE_MANAGER_DIR и указываем путь для аплоада картинок.

Еще два WYSIWYG-редактор которые дружат с django:

Кстати, markItUp! + postmarkup = отличный BBCode редактор на python.

Май 30

Мониторинг ресурсов в PostgresSQL

Смотрим процессы которые сейчас работают:

ps -ef | grep postgres

Более универсальная утилита ptop - позволят в реальном времени мониторить работу PostgreSQL сервера. Скриншоты и короткие инструкции.

SQL-команда, выводящая активные postgres-процессы, пользователей, запросы:

SELECT * FROM pg_stat_activity;

SQL-команда, выводящая активные блокировки (lock):

SELECT * FROM pg_locks;

Дополнительное чтиво:

Цитата

Боится презрения лишь тот, кто его заслуживает.

Франсуа де Ларошфуко

Подписаться

    Категории

    Последние записи

    Облако тегов

    Архив

    Полезные ссылки

    Популярные записи