Páginas

Thursday, November 27, 2008

Pyndorama

Meu projeto de iniciação científica no Labase começou através do Pyndorama, um software para a produção de aventuras textuais.
Felizmente o Labase sempre me proporcionou muito mais para fazer, e com isso o Pyndorama não recebeu toda a atenção que merecia (desculpa Lívia!).

Ainda assim, aprendi muito com o Pyndo. Padrões de projeto, testes, história dos jogos antigos! Ah, ele foi o primeiro projeto TurboGears com o qual tive contato.

Como parte do processo de iniciação científica, precisamos apresentar a sociedade o que foi feito no último ano. Então em poucos minutos mostrei algumas das principais mudanças que implementei no Pyndorama, e o que vislumbramos fazer no futuro.

Demorei para publicar esse post por causa das várias provas. A XXX Jornada Giulio Massarani de Iniciação Científica, Artística e Cultural foi há vinte dias.

Como se não bastasse, utilizei o Pyndorama para meu trabalho de fim de curso da cadeira de Computador e Sociedade, junto ao Gabriel Mendonça.
Nós entrevistamos o prof. Carlo Emmanoel e a mestranda Lívia Monnerat, ambos do Labase/NCE/UFRJ, para coletar informação sobre as origens do projeto.

Só a conversa com o Carlo levou mais de duas horas! E com isso reunimos muita coisa sobre a história NCE e do Carlo. Tanto que agora o Carlo me emprestou o livro "Construindo o Futuro Através da Educação - Do Fortran à Internet" de Tercio Pacitti (2003), que conta muito dos primórdios dos computadores e do papel do NCE e outras instituições. Mais leitura para as férias!

Resolvi publicar o documento com o trabalho, que contém também uma "transcrição despreocupada" das entrevistas com o Carlo e com a Lívia.

Os slides das apresentações deste mês e o link para o texto na na íntegra encontram-se abaixo:

2008/11/06 - Jornada de Iniciação Científica da UFRJ
Pyndorama
View SlideShare presentation or Upload your own. (tags: construcionism pygtk)

2008/11/25 - Trabalho do curso de Computador e Sociedade / UFRJ (slides)
Pyndorama
View SlideShare presentation or Upload your own. (tags: interactive_fiction nce)


2008/11/25 - Trabalho do curso de Computador e Sociedade / UFRJ (texto)
http://docs.google.com/Doc?id=...
Pyndorama
1. Introdução
Entendemos que para contar uma história que é fruto da imbricação de diversos aspectos, sejam estes técnicos, sociais, políticos, de mercado, entre outros, é preciso traçar os delineamentos de cada um deles e entender o funcionamento do sistema em sua forma integral. (...)

Dinâmica Ágil: Jogos Estatísticos

O Luiz Parzianello divulgou na lista do XPRio [1] um post em seu blog sobre dinâmicas ágeis, em especial sobre uma de sua autoria [2].

Ele sugere que a maioria das dinâmicas existentes " aborda a essência dos princípios ágeis de uma forma metafórica distante do modelo mental analítico predominante nos profissionais da área de software". E com isso o resultado não é totalmente satisfatório para o aprendizado e aplicação do novo conhecimento no dia-a-dia.

Concordo com o Luiz, já participei de algumas dinâmicas e tive a oportunidade de ajudar a organizar uma com alunos de mestrado do NCE/UFRJ, e a impressão que fica é de "e não é que isso funciona!". Em geral, sinto que as pessoas tem o seu queijo mexido... mas, o qual o resultado a longo prazo? Realmente uma aborgadem menos direta facilita que os conhecimentos fiquem guardados em um canto e não participem da rotina profissional.

Luiz realizou dinâmicas que chamou de "Jogos Estatísticos para a Promoção de Práticas Ágeis", tendo inclusive participado do evento Ágiles 2008.
Por hora, são três jogos baseados em:
  • Modelos de produção Just-in-Time (Lotes de Produção x Produtividade)
  • Teoria das Restrições (Eventos Dependentes x Produtividade)
  • Teoria das Filas (Fluxo de Produção x Planejamento
As instruções para realização do primeiro jogo, o Lotes de Produção x Produtividade, já se encontra no blog do Luiz, espero que ele poste também sobre os outros jogos!
Confiram!

[1] http://br.groups.yahoo.com/group/xprio
[2] http://parzianello.blogspot.com/2008/08/jogos-estatsticos-lotes-de-produo-x.html

Wednesday, November 26, 2008

Dinâmica dos aviões

Mais uma vez visitei o blog do Flávio [1]. Ele sempre tem histórias muito legais, e numa ocasião ouvi falar dessa dinâmica também pelo seu blog.

O que valeu esse post é que o Flávio colocou fotos e vídeos da Dinâmica de aviões realizada na PUCRS dia 11/11/2008. Muito bom! Lá no mestrado do NCE queremos realizar essa dinâmica... quem sabe em breve se concretiza e eu posto aqui.

Já realizamos há um tempo uma versão personalizada do XPGame [2].
É isso, pouco tempo para elaborar muito :D
Na verdade, tenho feito várias coisas bacanas e não tenho arrumado tempo para "documentar o que está na minha mente"...

[1] http://mudandoumapequenaempresa.blogspot.com/2008/11/resultado-da-dinmica-de-avies-pucrs.html
[2] http://lifeatmymind.blogspot.com/2008/10/atividades-introdutrias-de-xp-em.html

Wednesday, November 12, 2008

Gmail voice and video chat!

Novidade no Gmail! Agora é possível usar a webcam direto da caixa de email. Muito bom!
Deu um friozinho na barriga antes de instalar o programa para fazer o vídeo funcionar, mas não pensei muito... só a possibilidade de ter vídeo na interface do Gmail foi suficiente para me convencer.

E não é que funcionou direito! Muito legal... excelente... agora o Skype ficou um passo para trás. (eBay, se cuida!)


Official Gmail Blog: Say hello to Gmail voice and video chat





Sunday, November 9, 2008

A Neighborhood of Infinity: On writing Python one-liners.

Although most of my blog is in Portuguese, I knew somewhen I would start mixing languages and posting in English. So here it goes, my thoughts on one-liners...

Thanks to my academic advisor Carlo Emmanoel and his delicious, I was sent to a blog post [1] from sigfpe about Python one-liners.

Not that I really find it useful, but it's at least something interesting to play with. It's been a long time since I've first seen programmers challenging each other with mind breaking one-liners, usually trying to promote their favorite language.

The solution proposed by sigfpe make use of lambda forms, which, it seems, many people are not aware of -- as we can infer by the comments on the original post.
My approach to one-liners is way different.
Why tinker with lambdas when we can do it much simpler?

I'll show you how we can write ANY PYTHON CODE in only one line. Maybe you may argue that I have cheated, but it's pure core Python. Who cares about rules anyway?
The basic idea is to transform an arbitrary source-code into a single line string. Then, compile the string and exec it! I guess those two features of the language are also ignored by the majority of Python programmers.

So, let's do it to each example from the original post:
# we want to add 1 to all of the numbers from 0 to 19

def inc(n):
return n+1

print "1.",map(inc,range(0,20))

# sigfpe's solution using lambda forms...

print "1.",map(lambda x:x+1,range(0,20))

# My solution with exec & compile...

exec compile('def inc(n):\n return n+1\n\nprint "1.",map(inc,range(0,20))\n', '<string>', 'exec')
# Tricky idea on how to express local variables using lambdas

def f1(n):
m = 2*n+1
return m+m*m

print "2.",map(f1,range(0,20))

print "2.",map(lambda n:(lambda m:m+m*m)(2*n+1),range(0,20))

# Using exec & compile is inconvenient because it wastes too much space,
# since it keeps indentation whitespaces (that could be replaced by
# undesired \t's) and all the verbosity of multi-liners...

exec compile('def f1(n):\n m = 2*n+1\n return m+m*m\n\nprint "2.",map(f1,range(0,20))\n', '<string>', 'exec')
def f(n):
def g(n):
return 2*n+1

def h(n):
return 3*n-2

return g(h(g(h(n))))

print "3.",map(f,range(0,20))

print "3.",map(lambda n:(lambda g,h,n:g(h(g(h(n)))))(lambda n:2*n+1,lambda n:3*n-2,n),range(0,20))

# Also, note that the exec & compile method is "dumb", we are just writing
# multiline code in one line (escaping line breaks with \n), and calling
# our Python interpreter

exec compile('def f(n):\n def g(n):\n return 2*n+1\n\n def h(n):\n return 3*n-2\n\n return g(h(g(h(n))))\n\nprint "3.",map(f,range(0,20))\n', '<string>', 'exec')
def fact(n):
if n<=1:
return 1
else:
return n*fact(n-1)

print "4.",map(fact,range(0,20))

print "4.",map(lambda n:(lambda f:f(f,n))(lambda f,n:{True:lambda:1,False:lambda:n*f(f,n-1)}[n<=1]()),range(0,20))

# In practice, there's no difference between the code written in multiple lines
# and my naive approach to one-liners. There may be problems trying to run
# lengthier code, where that trivial solution won't work.

exec compile('def fact(n):\n if n<=1:\n return 1\n else:\n return n*fact(n-1)\n\nprint "4.",map(fact,range(0,20))\n', '<string>', 'exec')

The process is so mechanical and immediate that I've written a short script:
'''
onelify.py :: Transform arbitrary Python code into an one-liner equivalent.

2008/11/09 - Initial release

Rodolfo Henrique Carvalho :: lifeatmymind.blogspot.com
'''

def onelinefy(code):
return "exec compile(%s, '<string>', 'exec')" % (repr(code),)

[1] A Neighborhood of Infinity: On writing Python one-liners.

UPDATE: 2008/12/26 - Now using Google Code Prettifier for syntax coloring!

A Neighborhood of Infinity: On writing Python one-liners.

Graças ao meu orientador Carlo Emmanoel, cheguei a um post [1] no blog do sigfpe sobre como escrever programas em Python em apenas uma linha.

Não que eu ache isso realmente útil, mas é no mínimo um desafio interessante. É de longa data, e independente de linguagem, ver programadores tentando mostrar as qualidades de sua linguagem predileta, e um dos "recursos" em pauta costuma sempre ser os one-liners...

A solução proposta pelo sigfpe é centrada no uso de lambdas (e impressionante como tem gente que não conhece isso no Python, como explicitado por alguns dos comentários no post original). Porém, assim que li o título do post na minha inbox do delicious, tive uma idéia diferente.

É simples, mas permite escrever QUALQUER CÓDIGO em apenas uma linha. Não sei se vão falar que "burlei as regras", porém é uso de Python puro, logo, para mim está valendo!
Basicamente, podemos pegar um trecho qualquer de código-fonte e transformá-lo em uma string. Uma string pode ser arbitrariamente grande e sempre caber em uma única linha.
Em seguida, usamos o provavelmente também pouco conhecido statement exec para executar a string com o código.

Vamos fazer isso para cada exemplo do post original:
# Primeiro o código original da função que retorna um incremento
# de um número executada para 20 números

def inc(n):
return n+1

print "1.",map(inc,range(0,20))

# E a solução usando lambda...

print "1.",map(lambda x:x+1,range(0,20))

# Minha solução usando exec...

exec compile('def inc(n):\n return n+1\n\nprint "1.",map(inc,range(0,20))\n', '<string>', 'exec')
# Aqui a idéia para simular variáveis locais com lambdas

def f1(n):
m = 2*n+1
return m+m*m

print "2.",map(f1,range(0,20))

print "2.",map(lambda n:(lambda m:m+m*m)(2*n+1),range(0,20))

# A solução com exec é inconveniente pois ocupa muito espaço,
# já que é preciso preservar os espaços em branco da indentação

exec compile('def f1(n):\n m = 2*n+1\n return m+m*m\n\nprint "2.",map(f1,range(0,20))\n', '<string>', 'exec')
def f(n):
def g(n):
return 2*n+1

def h(n):
return 3*n-2

return g(h(g(h(n))))

print "3.",map(f,range(0,20))

print "3.",map(lambda n:(lambda g,h,n:g(h(g(h(n)))))(lambda n:2*n+1,lambda n:3*n-2,n),range(0,20))

# Note também que a solução com exec é "burra", estamos apenas escrevendo
# o código com quantidade de linhas arbitrárias em uma única linha e mandando
# o Python interpretar

exec compile('def f(n):\n def g(n):\n return 2*n+1\n\n def h(n):\n return 3*n-2\n\n return g(h(g(h(n))))\n\nprint "3.",map(f,range(0,20))\n', '<string>', 'exec')
def fact(n):
if n<=1: return 1 else: return n*fact(n-1) print "4.",map(fact,range(0,20)) print "4.",map(lambda n:(lambda f:f(f,n))(lambda f,n:{True:lambda:1,False:lambda:n*f(f,n-1)}[n<=1]()),range(0,20)) # Na prática não há diferença entre o código em várias linhas e o código # one-liner. Podem ocorrer problemas para trechos de código mais longo, # onde a abordagem trivial de pegar e string do código e rodar não vai funcionar exec compile('def fact(n):\n if n<=1:\n return 1\n else:\n return n*fact(n-1)\n\nprint "4.",map(fact,range(0,20))\n', '<string>', 'exec')

O processo é realmente mecânico e imediato, tanto que criei um pequenino script:
'''
onelify.py :: Transform arbitrary Python code into an one-liner equivalent.

2008/11/09 - Initial release

Rodolfo Henrique Carvalho :: lifeatmymind.blogspot.com
'''

def onelinefy(code):
return "exec compile(%s, '<string>', 'exec')" % (repr(code),)

[1] A Neighborhood of Infinity: On writing Python one-liners.

UPDATE: 2008/12/26 - Agora usando o Google Code Prettifier para colorir a sintaxe!

Primeiras impressões sobre Google Reader

Olá, pessoal!
Já faz algum tempo que não escrevo nada por aqui. O Rodolfo está dando um banho em número de posts e para tentar compensar o atraso, resolvi escrever sobre minhas primeiras impressões no Google Reader. (Pra falar a verdade já cheguei a usar o gerenciador de feeds há um tempo atrás, mas não tinha muita paciência pra administrá-lo.)

Retornei hoje ao Google Reader para ver as novidades, e gostei do que vi.

Pontos positivos:
. A inclusão de novas fontes é bem simples, bastando para isso capturar a url do feed.

. A possibilidade de compartilhamento de itens é bem interessante. Se o usuário possuir um profile com foto fica mais interessante ainda. Você pode visualizar todos os itens e identificar rapidamente os indicados por uma pessoa em especial.

. Bem organizado, facilitando o aprendizado da ferramenta. (Apesar disso ser um pouco controverso, pois como diria Bruno Costa - professor do Departamento de Matemática Aplicada, UFRJ - "quanto mais conhecimento você tem, mais rápido você aprende")

Pontos negativos:
. O GR acha que sabe quando eu li um item no modo 'Expanded view', marcando tudo como lido.

Com saldo positivo, gostei do leitor de feeds e vou continuar experimentando.
Por ora, é só isso...


Deixem seus comentários!
Um abraço!

Saturday, November 8, 2008

Slideshare.net

Já faz algum tempo que frequento o SlideShare para visualizar apresentações dos outros, sobre os mais variados temas, mas nunca tinha parado para criar uma conta.

Bem, criei. E com isso veio aquela sensação de compartilhar trabalhos antigos, por mais inúteis que possam ser. Minha página no SlideShare!

Uma das coisas que mais gostei é da possibilidade de fazer upload de vários arquivos de uma só vez (bulk upload). Queria muito que o Gmail fosse assim! Ouviu Google?
A ferramenta também lidou muito bem com arquivos ODP (OpenOffice.org Impress), enquanto vivi tentativas frustadas para salvar o mesmo arquivo como PDF ou converter para PPT (o fundo ficava desalinhado).

O SlideShare, como o próprio nome sugere, também é excelente para compartilhar. Dentre as diversas opções, posso colocar os slides no blog, como fiz com a palestra sobre TurboGears e DOSVOX. Foi muito rápido e fácil criar minha conta, valeu a pena!

Friday, November 7, 2008

Palestra na Python Campus

Ontem fiz uma apresentação no evento Python Campus, realizado no campus Candelária da Universidade Gama Filho.
Claro, não seria nada sem a espetacular performance do Neno Albernaz. Juntos mostramos o desenvolvimento de aplicações web em Python, utilizando o TurboGears, por pessoas com deficiência visual, com auxílio do sistema DOSVOX.

Já faz algum tempo que vejo o Neno usar o DOSVOX, e sempre fiquei impressionado com a alta produtividade. Essa semana instalei na minha máquina e já fiquei viciado, mesmo possuindo minhas capacidades visuais.
Atualmente o DOSVOX é implementado em Pascal, porém o projeto tende a ser reimplementado em Python e se tornar multiplataforma.
Espero poder contribuir com código!

A palestra foi empolgante. O público se interessou bastante pelo DOSVOX, e o TurboGears ficou ofuscado com razão.
Gargalhadas foram ouvidas quando mostramos alguns dos joguinhos presentes no DOSVOX, a maioria com um toque de humor.
Espero que possamos apresentar mais palestras juntos no futuro.

Seguem os slides no meu slideshare.net:

Desenvolvimento Web com TurboGears e DOSVOX
View SlideShare presentation or Upload your own. (tags: dosvox turbogears)

Tuesday, November 4, 2008

Python Campus

Amanhã começa o Python Campus - Gama Filho, primeiro evento da comunidade PythOnRio! Esperamos que seja o início de uma sequência de eventos nas universidades cariocas.

Eu serei palestrante na quinta-feira!

A participação é gratuita e não está restrita à alunos da Gama Filho, todos estão convidados.
Para os alunos da Universidade Gama Filho, o evento contará como horas de atividade complementar.

Local
Universidade Gama Filho, unidade Centro-Candelária
Avenida Presidente Vargas, 62 - Centro-RJ

Data
05 e 06/11/2008 (quarta e quinta-feira)

Horário
18h30 às 22h00

Mais informações e pré-inscrição:
http://ugf.br/index.php?q=evento/1225/view