воскресенье, 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 создавать приложения для работы с БД, начиная от описание структуры таблиц и связей в БД и заканчивая модификацией и извлечением данных.             

пятница, 31 декабря 2010 г.

LaTeX: пишем и верстаем статьи

Все мы как то привыкли, особенно те кто живет в мире Windows,что кроме MS Office или OpenOffice ничего для создания документов ничего нет. Но это не так и при чем далеко не так. Кроме принципа, что вижу, то и получу есть и системы основанные на языке разметки.Вот об одной из них мы сегодня обзорно и поговорим.
   В 80-ые годы дедушка нынешней информатики, а так же автор замечательной книги "Конкретная математика",математик Дональд Кнут захотел создать систему, которая в наибольшей степени  отвечала бы потребностям математиков при написании статей. Так и появился TeX. Но чуть позже к нему добавили пакет  расширений и  система с этим пакетом расширений называется    LaTEX. Давайте рассмотрим структуру не очень сложного LaTEX документа:
\documentclass[10pt,a4paper]{article}
\usepackage{ucs}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\title{Контрольная Работа №2 Вариант 1}
\begin{document}
\begin {flushleft}
\underline{1 задание}
\underline{условие:}
$z=e^{x+y}*(x\cos{y}+y\sin{x})$
$dz-?$
\underline{Решение:}
$dz=z_x'dx+z_y'dy$
$z_x'=e^{x+y}*(x\cos{y}+y\sin{x})+e^{x+y}(\cos{y}+y\cos{x})$
$z_y'=e^{x+y}*(x\cos{y}+y\sin{x})+e^{x+y}(\sin{x}-x\sin{y})$
$dz=e^{x+y}*(x\cos{y}+y\sin{x})+e^{x+y}(\cos{y}+y\cos{x})dx+e^{x+y}*(x\cos{y}+y\sin{x})+e^{x+y}(\sin{x}-x\sin{y})dy$
\end {flushleft}
\end{document}
Собственно говоря именно для сдачи контрольных, курсовых, дипломов и прочих серьезных по размерам и не очень документов LaTEX и любят использовать.
первая строка documentclass описывает системе LaTEX, а с каким типом документа она имеет дело, это важно для оформления, которое LaTEX использует по умолчанию.Кроме того, что мы говорим LaTEX что это статья мы определяем, что хотим использовать шрифт размером в 10 пунктов и размещать текст как на листе A4 
А вот дальше мы подключаем различные пакеты TeX. А они то как раз и расширяют возможности системы в очень многих направлениях: 
 \usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
Эти пакеты подключают набор хороших шрифтов, математических обозначений и др. символов 
\usepackage{ucs}
\usepackage[utf8]{inputenc}
\usepackage[english,russian]{babel}
Эти пакеты необходимы для обеспечения нормальной кодировки при вводе\выводе ,а третий для обеспечения поддержки русских символов в документе LaTEX
Дальше мы указываем название документа. 
Строка \begin{document} начинает тело документа. Затем мы производим выравнивание влево. 
Ключевое слово \underline позволяет нам сформировать заголовок с подчеркиванием 
Знаки доллара включают для строки математически режим. То есть для этой строки становятся доступны математические команды, которые в ином случае вызвали бы ошибку. В данном случае применяется т.н. встроенный матрежим, т.к. он позволяет быстро включать и выключать математический режим работы. Имена функций снабжены \ потому, что в LaTeX для их правильного форматирования то же используются представление в виде управляющей конструкции. Как вы может быть догадались ^ требует от LaTeX записать следующие за ним символы как верхний индекс. Обычно в формулах так записывают степени при выражениях и числах.
\end {flushleft}
Эта строка указывает на конец блока с левым выравниванием
А следующая строка на конец документа.
Основное отличие LaTeX от того же Word, что очень мало предположений делается за вас вы определяете расположение его на странице, как его разбивать. При чем делается это специальными управляющими конструкциями. Вобще практически все в LaTeX представляет собой те или иные специальные управляющие команды и данные, которые подлежат обработке.
"Неудобно и странно",- говорите? Ну это только на первый взгляд:
1) TeX имеет большое количество шаблонов и рецептов для форматирования того или иного текста. Особенно он славен очень хорошим форматированием заковыристых формул 
2) TeX имеет очень развитую систему для создания библиографических ссылок и предметных указателей. 
3) Чем больше вы набираете опыта работы с TeX тем меньше времени вы тратите на предварительное оформление: вы можете найти либо готовый шаблон, либо взять оформление из похожего документа ранее вами написанного и простым CONTROL+C и CONTROL+V добавить нужное оформление в документ. 
4) Благодаря четкой семантике и правилам языка TeX большинство математических систем используют его как формат для импорта\экспорта данных (например библиотека sympy,система алгебраических расчетов Maxima,Mapple,MATLAB )
5) TeX документ очень легко передавать, ведь это просто текст 
6) Ядро TeX позволяет генерировать PDFники и PostScript на основе TeX описания
7) Для многих научных издательств это стандарт формата статей для приема от авторов. 
Сама система ТеХ как и редакторы для нее открытый продукт и может быть спокойно установлен как часть программы Texmaker кроссплатформенного редактора TeX. 
Вобщем попробуйте в деле инструмент, проверенный временем. 
Да и это.... че то сегодня все суетятся, к чему бы? А! Новый год! Пооэтому всех поздравляю и желаю чистого кода в новом году, здоровья и счастья, творческих идей и сумасшедших идей в хорошем смысле слова:) С праздником, друзья!