суббота, 9 апреля 2011 г.

Как отправить bug на launchpad и обзавестись собственным PGP ключиком для почты


Первое выберем способ то каким образом оповестим:
1. Через утилиту  ubuntu-bug:
a) Нажимаем Alt+F2 в открывшемся окне пишем ubuntu-bug <имя пакета >, например  ubuntu-bug firefox
б) Вам предложат отправить отчет разработчика и заполнить специальную форму, которая запустится в вашем браузере
2. Через mail-интерфейс
Учтите несколько моментов: когда вы отправляете сообщение баг-трекеру, то оповестят вас об успехе или не успехе лишь через 4-5 минут (сам бакттрекер проверяет поступление почты каждые 3 минуты ). Кроме того вам потребуется подписывать ваше сообщение при помощи OpenGPG.
Итак что имеем?
Почтовый клиент Thunderbird 3.0.6, Ubuntu 10.04 и неободимость отправить сообщение о предположительной проблеме в ядре)
2.1. Регистрируемся на Launchpade .
2.2 Получаем gpg ключ
a) запускаем в консоли gpg с запросом на генерацию ключа:
gpg --gen-key
б) нас попросят определить тип алгоритма(но нас вполне устроит по умолчанию ), так что жмем enter.
в) размер ключа (опять устраивает вариант по умолчанию), жмем Enter вновь
г) нас попросят определить время действия ключа: жмем enter если хотим получить бессрочный
д) чтобы создать идентификатор ключа нас попросят ввести реальное имя, e-mail к письмам которого и будет применяться ключ и если хотим комментарий.
Вместо реального имени годится любая комбинация английских символов длинной равной или более 5 букв.
е) В результате будет выведена примерно следующая информация:
You selected this USER-ID:
    "Matthew Revell (My test OpenPGP key) "

Если вас все устраивает введите букву о(от слова Okey) и затем нажмите Enter  
ж) Вам будет  предложено ввести пароль для защиты ключа, не делайте его суперсложным, но и не делайте слишком простым
к)   Далее начнется генерация, вводите случайную абракадабру с клавиатуры это поможет генератору случайных значений быть более случайным, вас попросят вводить символы несколько раз. вводите их пока идет процесс генерации.
л) в ответ на команду gpg --list-keys  должна появится такая табличка:
/home/matthew/.gnupg/pubring.gpg
--------------------------------

pub   1024D/12345678 2007-01-26
uid                  Matthew Revell (My test OpenPGP key)
sub   2048g/9ABCDEF1 2007-01-26

Запомните ваш   pub идентификатор(в нашем примере  1024D/12345678 )
Это значит что pgp успешно создала публичный и приватные ключи для подписывания и шифрования сообщений
м) Теперь нам надо сообщить публичный ключ серверу ключей ubuntu:
gpg --send-keys --keyserver keyserver.ubuntu.com 12345678 (замените 12345678 на ваш pub  )

Если все прошло корректно, то вы увидите следующее:
gpg: sending key 12345678 to hkp server keyserver.ubuntu.com
3.  импортируем его своей учетке launchpad:  
а) launchpad не импортирует напрямую с сервера Ubuntu ключи поэтому нам самим придется его оповестить о необходимости этого. Для этого идем сюда  В поле ввода вводим так называемый отпечаток ключа(Fingerprint). Узнать его можно при помощи команды:
gpg --fingerprint.
 В ответ нам будет выведена табличка:

pub   1024D/12345678 2007-01-26
      Key fingerprint = 0464 39CD 2486 190A 2C5A  0739 0E68 04DC 16E7 CB72
uid                  Matthew Revell (My test OpenPGP key)
sub   2048g/ABCDEF12 2007-01-26
Нам нужна только та часть которая идет сразу после знака равно(0464 39CD 2486 190A 2C5A  0739 0E68 04DC 16E7 CB72).
Ее мы вводим в поле ввода на странице, которую мы открыли(страница изменения твоих OpenPGP ключей на Launchpad). Но здесь важен один момент наши ключи сервер Launchpad получит примерно через 10 минут после отправки на сервер Ubuntu. Поэтому между этим шагом и командой gpg --send-keys должно пройти 10 минут. Если все сделано правильно, то к нам придет сообщение зашифрованное, где будет содержаться информация о финальных шагах. И вот здесь нам придется установить  дополнение  Thunderbird для интеграции OpenPGP. Называется   оно  Enigmail. Лучше устанавливать его из Центра приложений, а не из меню  Thunderbird. Из меню будет скачена не совместимая версия с  3.0.6 . Во время установки вас спросят какой ключ и для какого адреса использовать, использовать ли шфрование по умолчанию. Вас так же попросят ввести пароль на ключ.(тот что вы вводили когда генерировали при помощи pgp ).
В шифрованной части письма ссылка    с подтверждением адреса, перейдя по ней вы окончательно активируете ключ.
2.3 Постим баг
В поле отправителя сообщения   помещаем адрес, который указывали при регситрации на Launchpad
В поле  получателя:  new@bugs.launchpad.net для нового бага, для редактирования существующего: bugnumber@bugs.launchpad.net
В поле  тема: краткое описание проблемы(будет использоваться как имя бага)
Ну а тело сообщения должно содержать само описание бага. При чем если баг связан с ядром и аппаратурой, то оочень желателен: вывод: команды dmesg(сообщения ядра ), команды uname -a (полное имя ядра), указать платформу(x86-32/64,alpaha,powerPC,mips),список оборудования: командой sudo lspci и т.д.
Если с обычной программой, то: скриншоты с ошибочным поведением, видеозапись действий своих и т.д. Подробно описывайте свои действия до сбоя.
В конце припишите две строчки
affects <имя-пакета> например для всей Ubuntu:  affects ubuntu, для ubuntu и chrome:  affects ubuntu/chrome
status new Это сразу установит статус бага в новый.
Если все будет верно сделано через 5 мин придет письмо с подтверждением. Допустим вы написали такое письмо:
From: you@example.com
To: 28919@bugs.launchpad.net
Subject: Re: [Bug 28919] error signing code of conduct: "str: No public key"
status incomplete
Тогда в ответ придет:

From:noreply@bugs.launchpad.net
To: you@example.com
Subject: [Bug 28919] error signing code of conduct: "str: No public key"

Public bug report changed:
https://launchpad.net/malone/bugs/28919

Changed in: Launchpad (upstream)
         Status: Unconfirmed => Incomplete
В случае неудачи(здесь мы забыли подписать письмо своим ключом )


From: noreply@bugs.launchpad.net
To: you@example.com
Subject: Submit Request Failure
An error occurred while processing a mail you sent to Malone's email
interface.

Error message:
In order to submit bugs via email you have to sign the message with a
GPG key that is registered in Launchpad
--
For more information about using Malone's email interface, please see
https://wiki.launchpad.canonical.com/Bugs/EmailInterface.Таким образом мне удалось запостить Bug #626255 (https://bugs.launchpad.net/ubuntu/+source/linux/+bug/626255)
2.4 Дополнительные возможности трекера
Формат команды, напоминаю должен быть одна строка на команду. Важно так же отметить, что строка должна начинаться с пробела(спасибо комраду flintstone ).
Ассоциирование бага с определенным/ыми пакетами происходит при помощи команды affects
Синтаксис:     affects [distribution|package|product]
HOWTO написан с использованием страниц справки Launchpad:Bugs/EmailInterface и YourAccount/ImportingYourPGPKey
впервые опубликовано: форум ubuntu


воскресенье, 20 февраля 2011 г.

Pygame:учим Python рисовать

    Так уж получилось, что  у меня в универе начался предмет компьютерная геометрия, а на нем,естественно, нужно представлять программы, которые генерируют нужные изображения. У нас выбрали как инструмент представления результатов  Qbasiс. 
Мне это понравилось неслишком по той простой причине, что в Ubuntu он не идет да и в Windows он запускается с бубном.
Память подсказала мне  кроссплатформенную   библиотеку Pygame. Она базируется на С-библиотеке SDL. Гарантировано работает на Windows,Linux,FreeBSD,Mac.
Собственно, чтобы в Ubuntu установить данную библиотеку, можно воспользоваться либо Центром приложений, либо в консоли: 
sudo apt-get install python-pygame. Установится все должно быстро и без вашего участия. 
Проверить,  действительно ли, установилась pygame можно при помощи: 
import pygame  
Если команда отработала без сообщений, то все в порядке. 
   Нарисуем с вами круг, закрашенный и наоборот, а на этом примере увидим, как работать с Pygame.
Начать нужно с инициализации библиотеки: 
import pygame
pygame.init()
Это обязательный шаг: во время этой команды Pygame настраивает себя на работу с вашей системой. Дальше нам надо получить область рисования на экране. Для этого напишем следующее: 

resolution=(420,320)#ширина и высота области 
flag=0#никаких дополнительных условий и настроек 
depth=32#глубина
screen=pygame.display.set_mode(resolution, flag,depth)

Здесь мы обращаемся к той части pygame,которая отвечает за работу с вашим экраном. Мы производим начальную настройку области рисования. Стандартная область 420,320. В переменной flag мы например можем потребовать у pygame использовать полноэкранный режим (pygame.FULLSCREEN) , однако во время отладки вашего приложения лучше его не использовать, так как прибить ошибочно работающий скрипт будет много легче не в полноэкранном режиме. 
Дальше задаем глубину цвета. 
После всех подготовительных действий передаем это все в функцию настройки экрана set_mode()
Дальше закрасим нашу область белым цветом. Для этого вызовем у объекта screen метод fill, а перед этим занесем в переменную color тот цвет, который нам нужен.
 
color=(255, 255, 255)# задаем белый цвет модели RGB цветов   
screen.fill(color) #закрашиваем всю область, цветом color    

цвета в pygame определяются кортежем из трех элементов. Как уже написано  в комментариях цвет должен передаваться в модели RGB. Давайте определим набор цветовых констант: 
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)                 
Я думаю так будет удобней:) 
А меж тем мы изменили изображение на экране, поэтому надо бы картинку на экране обновить, сделаем же это: 
pygame.display.update()      
После того как вы что-либо закрасили, нарисовали фигуру и т.д. обязательно вставляйте строку с вызовом функции обновления изображения экрана. 
Теперь нарисуем закрашенную  окружность черного цвета, а для этого нам понадобится функция circle. 
circolor=BLACK #цвет круга
center=(420/2,320/2)#центр окружности 
radius=100#радиус круга 
pygame.draw.circle(screen, circolor, center, radius)     
Итак с цветом понятно,а центр это кортеж из x-координаты и y-координаты 
радиус число больше нуля. 
На самом деле есть еще параметр width, однако сейчас мы его оставили со значением по умолчанию 0. Так как границы у нового изображения нет, то оно все закрашивается черным цветом. 
Но если в вызов функции после radius мы добавим через запятую 3, то увидим совсем иное. В чем дело? А лаарчик открывается просто: мы дали указание pygame начертить линию с толщиной 3 и цветом BLACK, вот ровно это она и сделала. Собственно говоря именно так можно получить незакрашенные фигуры во многих случаях.      
добавим pygame.display.update() 
В принципе все, за исключением того,что скрипт, не управляем пользователем. Единственный метод сейчас из него выйти это набрать в консоли python pygame.quit()
Это неправильно тем более что pygame нам предоставляет возможность обрабатывать различные события. Напишем код останавливающий  наш скрипт, либо по нажатию крестика в окне, либо по нажатию клавиши Esc:    
while True:
         for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if  event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()            
Что мы сделали? Мы организовали бесконечный цикл обработки событий. Как только  событие  попадает в очередь обработки оно будет извлечено при первой возможности и pygame передаст его в наш цикл. А в нем мы проверим следующее: 
1) Это событие сигнал к выходу? (генерируется при нажатии крестика)Если да,то завершаем  приложение и закрываем сам интерпретатор.      
2) Это нажатие клавиши ? Если да, то проверяем, что нажата клавиша Escape (самая верхняя слева) . Да? закрываем приложение и интерпретатор.   
Мы рассмотрели лишь очень малую часть возможностей этой замечательной библиотеки, зайдите на сайт www.pygame.org 
Там вы найдете документацию, ссылки на руководства и сможете загрузить различные версии библиотеки.Кстати она является OpenSource разработкой и распространяется на условиях LGPL . 
А в завершении заметки полный исходный текст нашего приложения(закрашенный круг): 
# -*- coding: utf-8 -*-
import pygame
import sys 
pygame.init()
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
resolution=(420,320)#ширина и высота области 
flag=0#никаких дополнительных условий и настроек 
depth=32#глубина
screen=pygame.display.set_mode(resolution, flag,depth)
color=(255, 255, 255)# задаем белый цвет модели RGB цветов   
screen.fill(color) #закрашиваем всю область, цветом color
pygame.display.update()
circolor=BLACK #цвет круга
center=(420/2,320/2)#центр окружности 
radius=100#радиус круга 
pygame.draw.circle(screen, circolor, center, radius)
pygame.display.update()
while True:
         for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if  event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()      
А вот и незакрашенная окружность:
# -*- coding: utf-8 -*-
import pygame
import sys 
pygame.init()
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 0, 255)
resolution=(420,320)#ширина и высота области 
flag=0#никаких дополнительных условий и настроек 
depth=32#глубина
screen=pygame.display.set_mode(resolution, flag,depth)
color=(255, 255, 255)# задаем белый цвет модели RGB цветов   
screen.fill(color) #закрашиваем всю область, цветом color
pygame.display.update()
circolor=BLACK #цвет круга
center=(420/2,320/2)#центр окружности 
radius=100#радиус круга 
pygame.draw.circle(screen, circolor, center, radius,3)
pygame.display.update()
while True:
         for event in pygame.event.get():
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if  event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()            

       

воскресенье, 23 января 2011 г.

Python:загружаем файлы и информируем пользователя о прогрессе операции

       Есть в Python такой модуль urllib2 это высокоуровневый интерфейс к  библиотекам Python, работающим с протоколами HTTP,FTP и так далее. Передо мной встала необходимость реализовать возможность загрузки файла средствами этой библиотеки. Поэтому я определил такую функцию:
def Load(lpath,path):
        percent=10#процент загрузки файла
        myfile=open(lpath,'wb')#итак как в моем случае будут сохранять бинарные данные, то 
 #открываем в бинарном режиме на запись                   
        f=urllib2.urlopen(path)#открываем целевой URL 
        meta=f.info()#получаем информацию об URL (точнее заголовки в виде словаря)
        remotesize=meta['Content-Length'] #получаем размер из ключа Content-Length 
        print remotesize 
        blocksize = int(remotesize)/10.0 # определяем в байтах сколько составляет 10% 
        while 100>=percent:#пока загружено менее или ровно 100%.....
           myfile.write(f.read(blocksize ))#записываем блок данных размером blocksize, прочитанный #объектом f  
           print 'получено %d  процентов файла'%(percent)
           percent=percent+10
       myfile.close() #закрываем файл 
     Открывая URL библиотека urllib2 возвращает нам объект,имитирующий файл. Если мы вызовем read без параметров, то будет считан сразу весь объект, однако это может быть длительный процесс(все зависит от размера файла). Естественно перед использованием импортируйте модуль urllib2 в  вашу программу           

суббота, 1 января 2011 г.

Когда помощь всегда под рукой

Люблю я этот блог почитать, хотя бы из за того, что мои вопросы по LaTeX успешно решают заметки его автора. Хотя и просто для линуксоида, а особенно линуксоида-дебианщика или debian-based линуксоида   всегда найдется полезное и интересное в его трудовых буднях. А тут я нашел весьма хорошую штуку у автора: The Debian Cookbook Эта книга- сборник рецептов для решения различных насущных задач  линуксоида от того как послушать музыку пока перезагружаешь X-server до того как пересобрать ядро, восстановить данные на поврежденных носителях и сверстать красивый диплом в LaTeX :) Не смотря на название там все нормальном с русском языке +хорошие разъяснения об используемых инструментах.        

SQLalchemy:что это?

Вобще вокруг этого класса систем идет много дискуссий.Но в целом мне кажется очень хорошая идея заложена в ORM системы(Object-Relation System ). Основная их идея в том, чтобы создать слой между языком программирования и SQL. При чем этот слой нужен для абстрагирования от SQL и перевод работы с базой от ее создания до удаления в инструменты и понятия родные для конкретного языка, а не SQL. В данном случае python. И естественно,  исходя из названия предположить что там активно используются классы. Итак что же мы имеем? Таблицы связываются с классами, которые их описывают в программе, поля классов это поля таблиц, естественно к классам можно добавлять методы. Такие вещи как запрос и различные типы фильтрации то же представлены как типичный Python-объект, для задания сложных и не очень условий можно использовать операторы и функции Python. Так же при помощи ORM-модели в терминах языка можно описывать соединения таблиц между собой. Системы типа SQLalchemy стараются быть максимально универсальными, чтобы поддерживать независимость от конкретной СУБД, что не дает возможность задействовать некоторые "фичи" различных СУБД. Но это как говорится борьба универсализма и специализированности.    Для Python главной  ORM системой является sqlalchemy-opensource продукт (либеральная лицензия MIT) .Она позволяет в терминах и структурах данных python создавать приложения для работы с БД, начиная от описание структуры таблиц и связей в БД и заканчивая модификацией и извлечением данных.