Oficina de Desenho

20 July 2007 - 18:06   

A Oficina de Desenho é um software de desenho parecido com o Paint, leve e com recursos básicos de edição e manipulação de imagens, é programada em python e utiliza biblioteca gráfica PyGTK. Ela está sendo adaptada para o XO por uma equipe do NATE.

Clique na imagem abaixo para ver um Screen-shot da Oficina rodando no Sugar:

Entre as dificuldades para programar, uma das maiores foi a baixa velocidade de processamento dos objetos do tipo lista em python. Isto trazia problemas por exemplo para a função de preenchimento que era baseada no algoritmo Flood Fill e executava muito lentamente. Então decidiu-se utilizar um binding de C para esta função, já que C tem lista mais eficiente e de complexidade de ordem menor.

A estrutura básica de widgets do gtk é uma área de desenho (gtk.DrawingArea) com dois pixmaps, um temporário que não aparece na tela e é utilizado para receber modificações e outro que é o original e mostra a situação final do desenho. Os outros widgets, como toolbox, button, frame entre outros, interagem com a área de desenho enviando sinais para desenhar retas, formas pré-definidas (shapes), aplicar efeitos na imagem etc.

Na atividade, as ferramentas Undo e Redo copiam pixmaps a cada alteração que o usuário faz no desenho. Os pixmaps guardam informações da imagem que deve ser desenhada. Tendo todos os pixmaps da imagem armazenados, a ferramenta Undo ou Redo pode desfazer ou refazer qualquer parte perdida do desenho e recuperar informações de maneira muito eficaz.

A Oficina de Desenho encontra-se em estágio final de desenvolvimento e a equipe do NATE se orgulha do nível que a atividade está alcançando.

Para mais informações, visite http://wiki.laptop.org/go/Oficina_de_Desenho.

Categorias: Programação, PyGTK, Python | Sem Comentários »


Obtendo valores de pixels de uma imagem através de pygtk

20 June 2007 - 23:54   

PyGTK é uma bliblioteca que serve para desenvolver interfaces gráficas em python.

Tudo que você precisa saber (ou quase tudo) está em www.pygtk.org.

Como trabalhar com manipulação de imagens não é um dos objetivos do pygtk, os meios para conseguir o valor de um pixel em um determinado ponto de uma imagem são bem precários.

No programa manipulador.py o meio mais curto que encontrei para conseguir isto é mostrado!

Sempre que possível, utilize o PIL para manipulação de imagens.

Categorias: CookBook, PyGTK, Python, Tutoriais | Sem Comentários »


Editor Musical - Demo 1.0

1 June 2007 - 13:50   

# Update
Na grade de composição, quando você pintava a nota SI, tocava a nota DO e vice-versa. Upei uma nova versão para download.

Download em:
http://code.google.com/p/editor-musical/downloads/list

Roda em qualquer SO (com ou sem Sugar). Para mais informações leia o arquivo README.

Requisitos: python, gtk, csound (com módulo csnd.py instalado).

Obs:
Falta ainda tocar a composição criada e criar alguns eventos de som do tipo ‘play’ and ’stop’.
Nesta demo, é possível tocar apenas os instrumentos da primeira linha de seleção (CLARINET, ORGAN, elecGuiter (seno), Hi-hat, SIMPLE_DRUM)

Categorias: Programação, Python | 3 Comentários »


Vários assuntos

18 May 2007 - 20:48   

Olá a todos os leitores do blog

É a minha 1ª postagem aqui no blog, quase ninguém deve saber quem eu sou, então vou fazer uma breve apresentação…
Sou a Nathalia, estou no 3º ano de engenharia de computação na Poli-USP e trabalho como estagiária no Nate (LSI).

Primeiramente, vou deixar aqui o link que o Alexandre passou. É uma crítica contra o projeto do OLPC de um professor do IME-USP. É bem extenso, mas vale a pena! Pelo menos para abrir a mente e ver o outro lado, os argumentos contra e tal. Ah, o link:
http://www.ime.usp.br/~vwsetzer/um-laptop-por-crianca.html

Outra coisinha para se pensar… Vai rolar um tal de Game Jam lá nos EUA, que é um evento voltado ao desenvolvimento de jogos para o XO. Olhem só:
http://hackronym.com/olpc/gamejam/
http://wiki.laptop.org/go/GameJam

Através de umas conversas iniciadas pela lista do OLPC-Brasil acabei conhecendo um tal de Roberto Fagá lá da USP-São Carlos e ele está com umas idéias bem legais. Ele entrou em contato com um pessoal de lá do Game Jam e parece que dá para rolar uns esquemas de algumas pessoas participarem aqui do Brasil usando uma web can. Tem mais alguém interessado??? Favor, manifestem-se…
Outra idéia dele foi de nós brasileiros organizarmos o mesmo evento aqui no Brasil… E ai o que acham???

Aproveitando para dar uma notícia para quem não acompanha muitos as listas de desenvolvimento de games: parece que tá quase certo que o Pygame (ahn? http://www.pygame.org ) vai ter uma versão para o XO mesmo. Já estam trabalhando nisso:
http://wiki.laptop.org/go/PyGame_Implementation

Acho que só isso por hoje!

Categorias: Pygame, Python | 1 Comentário »


IRC Logger

8 May 2007 - 10:50   

Opa, e ai pessoal , está é minha primeira vez no blogger (e em qualquer blogger), e vou comentar um pouco sobre um logger que criei, em python, com ajuda do pessoal aqui do NATE para armazenar as mensagens do nosso canal no IRC (#olpc-brasil no channel FreeNode).
Bem inicialmente o Rafael Barbolo me passo um código com a base de como conectar num servidor IRC, que foi encontrado em:
http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/299411/index_txt

Entretando este criava um arquivo em modo texto (txt) que não é muito completo, claro. Então comecei a elaborar algumas modifições para que o arquivo salvo fosse em html.

Para isto simplesmente criei um cabeçalho, aonde é definido o nome da página ([head]), e aonde outras futuras informações podem ser alteradas (cor de fundo, imagem de fundo, e até mesmo o layout da página).

No corpo do texto ([body]), decidimos que seria muito interessante que cada usuario possuíse uma cor, para deixar mais claro quem falou. Para isso criamos um dicionário, que armazenaria uma cor, definida em uma tupla “circular”, à um nick_name (apelido). Esta atribuição inicialmente era feita ao usuario efetuar o login no IRC, entretando limitava o código para que o logger SEMPRE fosse o primeiro usuário, senão o programa dava KeyError.
Isto foi facilmente resolvido com o uso da exceção KeyError (óbvio :D), onde seria mais interessante atribuir esta cor ao usuário apenas quando o mesmo enviasse mensagens e se já não houvesse Cor relacionada a este.
Também foi incluído o momento do envio da mensagens através da biblioteca time.

Após esta modificações restavam duas coisas: finalizar o código HTML ([/body][/html]) e enviar o arquivo para um servidor ftp.

Bem a parte de finalizar o código foi feita, inicialmente, através de uma exceção (ow coisinha util viu) KeyboardInterrupt, onde ao se finalizar o programa (com ctrl-C) este finalizaria o HTML terminando assim o log.

Já para enviar o arquivo utilizei como base um arquivo encontrado em:
http://snippets.dzone.com/posts/show/711

Assim ao se finalizar o programa o código era finalizado e já enviado ao servidor, porém achei mais interessante fazer estas duas ultimas ações como um outro processo, assim criei um arquivo send.py.

EDITED: Consegui automatizar a rotina de upload, melhorei o layout da pagina e as cores que são atribuidas aos usuarios, também implementei o replace para mudança dos > e < para não interpretar o html e não sumir os códigos que sejam semelhantes a HTML.

a seguir o código do ircLogger.py:

import socket, string, sys, ftplib, time, datetime, os #some user data, change as per your tasteSERVER = ‘irc.freenode.net’PORT = 6667NICKNAME = ‘logging_bot’CHANNEL = ‘#olpc-brasil’ #open a socket to handle the connectionIRC = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #open a connection with the serverdef irc_conn(): IRC.connect((SERVER, PORT)) #simple function to send data through the socketdef send_data(command): IRC.send(command + ‘\n’) #join the channeldef join(channel): send_data(”JOIN %s” % channel) #send login data (customizable)def login(nickname, username=’user’, password = None, realname=’Logger do Canal’, hostname=’????’, servername=’Server’): send_data(”USER %s %s %s %s” % (username, hostname, servername, realname)) send_data(”NICK ” + nickname) #for entering more colors to the program see http://www.w3schools.com/html/html_colornames.aspcolor = (’#483D8B’, ‘#FF0000′, ‘#00AA00′, ‘#0000FF’, ‘#FFD700′, ‘#A52A2A’, ‘#FF00FF’, ‘#A0A0A0′, ‘#FF8C00′)i=0 #variable to count between colorsnameC={} #declares dictionary for Colors of Nicknames irc_conn()login(NICKNAME)join(CHANNEL) def makeHeader(): #make the HTML header filehtml = open(’msg.html’, ‘a+’) #open afile to store the messages filerd = open (’msg.html’, ‘rb’) if string.find(filerd.read(),’[html]’)!=0: #verify if header is alread there filehtml.write(’[html]’+'\n’+ \ ‘[head] \n [meta http-equiv=”Content-Type” content=”text/html; charset=UTF-8″]’ + ‘\n’ + \ ‘ [title]Log do IRC olpc-brasil[/title]’ + ‘\n’ + \ ‘[/head]’ + ‘\n’ + \ ‘[body bgcolor=”#F5F5F5″]’ + ‘\n’ + \ ‘[p][h1] Log do IRC do dia ‘ + str(datetime.date.today()) +’ [/h1][/p]\n’ ) filehtml = open(’msg.html’, ‘a+’)makeHeader()recTime = time.time() while True: nowTime = time.strftime(”[ %H:%M:%S ] “, time.localtime()) if time.time() >= recTime+60*60*24: #if has passed 24 hours than the last updat #send routine then wait date = str(datetime.date.today())+’.html’ print ‘Connecting…’ s = ftplib.FTP(’ftp.br.geocities.com’,'olpcbrasil’,'****’) # Connect filehtml = open(’msg.html’,'a+’) # file opened to finish html and to send filehtml.write(’[/body]’ + ‘[/html]’) #finish html on file filehtml.flush() print ‘Uploading…’ fileSend = open (’msg.html’ , ‘rb’) s.storbinary(’STOR %s’ % date, fileSend) # Send the file os.system(”rm msg.html”) #remove the previous log filehtml = open(’msg.html’,'a+’) #start the new log makeHeader(); print ‘Operation Finished!’ recTime = time.time() time.sleep(5) try: buffer = IRC.recv(1024) except KeyboardInterrupt:#verify the end of file (ctrl-C) filehtml.close() #print ‘Type “python send.py” to Upload this LOG to server’ print ‘Program Terminated’ sys.exit(0) msg = string.split(buffer) print msg if msg [1] == ‘PRIVMSG’: print 1 nick_name = msg[0][:string.find(msg[0],”!”)] #if a private message is sent to you catch it message = ‘ ‘.join(msg[3:]) if nick_name != ‘:freenode-connect’: #cancel first msg who comes from IRC try: nameC[nick_name] except KeyError: if i==9: i=0 nameC[nick_name]=color[i] i+=1 textMsg=string.lstrip(message, ‘:’) textMsg=string.lstrip(message, ‘:’).replace(’<’,'<’).replace(’>’,'>’) #to not interp html texts filehtml.write(’[font color=’+nameC[nick_name]+’]’ +nowTime\ + string.lstrip(nick_name, ‘:’)+ ‘ -> [/font]’ + textMsg + ‘[br]’ + ‘\n’ )#write to the file filehtml.flush() #don’t wait for next message, write it now! elif msg[1] == ‘QUIT’: nick_name = msg[0][:string.find(msg[0],”!”)] message = (”saiu do canal”) filehtml.write(’[font color=”red”]’ + nowTime + string.lstrip(nick_name, ‘:’) + \ ‘ -> ‘ + message + ‘[/font]’ + ‘[br]’ + ‘\n’) #write to the file filehtml.flush() #don’t wait for next message, write it now! try: del nameC[nick_name] except KeyError: print ‘User dont have color because he not send any msg’ elif msg[1] == ‘JOIN’: nick_name = msg[0][:string.find(msg[0],”!”)] message = (”entrou no canal”) filehtml.write(’[font color=”green”]’ + nowTime+ string.lstrip(nick_name, ‘:’) + \ ‘ -> ‘ + message + ‘[/font]’ + ‘[br]’ + ‘\n’) #write to the file filehtml.flush() #don’t wait for next message, write it now!

Os códigos podem ser encontrados tbm em:
br.geocities.com/olpcbrasil/ircLogger.txt e
br.geocities.com/olpcbrasil/send.txt

OBS: As tags do HTML estão entre [] pois o blogger interpreta os comandos em <>

Categorias: CookBook, Python | 3 Comentários »


Atividades com som

5 May 2007 - 6:30   

Tenho pesquisado e brincado um pouco com atividades que usam som no laptop. Estou ajudando no Editor Musical e para a parte de som descobri o modulo csnd, um binding para o python utilizar o csound a partir da API original para C++.

Um exemplo bem básico e inútil de como usar:

import csnd

cs = csnd.Csound() # nova instancia do Csound
cs.Compile(’teste.csd’) # Compila arquivo .csd (opcoes+orquestra+score)

th = csnd.CsoundPerformanceThread(cs) # Inicializa uma thread executar para a partitura
th.Play() # toca
th.Join()

Arquivo teste.csd (Csound Orchestra e Score):

<csoundsynthesizer>
<csoptions>
-odac -d -+rtaudio=alsa
</csoptions>
<csinstruments>
; Inicializa as variáveis globais.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
; Instrumento #1.
instr 1
; Amplitude do sinal
kamp = 30000
; Frequência
kcps = 440
; Número da f-table.
ifn = 1
; Toca com amplitude 30000 e frequência de 440 Hz a onda do seno
; armazenada na tabela 1.
a1 oscil kamp, kcps, ifn

; Manda o som armazenado em a1 para a saida
out a1
endin
</csinstruments>
<csscore>
; Tabela #1: uma simples onda de seno usando GEN10.
f 1 0 16384 10 1
; nota de 1 segundo de duração
i 1 0 1
e
</csscore>
</csoundsynthesizer>

Ja consigo fazer sair som usando python, agora a briga é para me entender com os métodos de realtime da API do Csound pra inserir eventos de Score. Os métodos são InputMessage e ScoreEvent. Se alguem estiver mais avançado ou souber outros modos, compartilha ai com a gente :)

A documentação dessa API + python e principalmente a de som no XO/Sugar quase não existe então qualquer progresso vou atualizando aqui no Blog.

Referência da API (C++): http://csound.sourceforge.net/refman.pdf

Até mais.

Categorias: CookBook, Python | Sem Comentários »