After a lot of hardwork by the team , the new release is out! Go ahead, try it, find what you don’t like and tell us. Release Notes for 0.2, 0.3 and 0.4 (it’s worth mentioning that the docs for all of them are in www.pyccuracy.org as well): Release Notes…(read more)
Posts de March, 2009
[Bernardo Heynemann] Pyccuracy Release 0.4 IS OUT!
Monday, March 23rd, 2009[Rodolfo Carvalho] Web Frameworks
Sunday, March 22nd, 2009Essa semana eu compilei uma lista de diversos frameworks para desenvolvimento web.
Não me limitei a Python, (quase) todas as linguagens foram consideradas e ainda tentei “separar o joio do trigo” marcando os frameworks mais ‘badalados’ em cada linguagem.
Eu fiz o original em um mapa mental no MindManager, mas como o formato é proprietário, fica aqui o PNG com o mapa completo exportado.
A lista é a seguinte:
- ActionScript
- Flex
- ASP.NET
- ASP.NET MVC
- DotNetNuke
- MonoRail
- BFC
- CSLA
- Umbraco
- ColdFusion
- ColdSpring
- Fusebox
- Model-Glue
- onTap
- Groovy
- Grails
- Java
- Apache Struts 2
- JavaServer Faces
- JBoss Seam
- Spring
- Stripes
- Tapestry
- Apache
- Click
- Cocoon
- Wicket
- AppFuse
- Aranea
- Google Web Toolkit
- Hamlets
- ItsNat
- IT Mill Toolkit
- OpenLaszlo
- OpenXava
- Reasonable Server Faces
- RIFE
- Shale
- SmartClient
- Sofia
- ThinWire
- WebObjects
- WebWork
- ztemplates
- JavaScript
- Ajile
- Axiom Stack
- WaveMaker
- Lua
- Orbit
- Kepler
- Perl
- Catalyst
- Interchange
- Mason
- Maypole
- PHP
- CakePHP
- Prado
- Symfony
- Zend
- CodeIgniter
- Drupal
- Akelos
- eZ Components
- FUSE
- Horde
- Kohana
- LISA
- Midgard
- Nette
- PEAR
- Orinoco
- Qcodo
- Simplicity
- SilverStripe (Sapphire)
- SPIP
- Tigermouse
- Zoop
- Python
- Django
- TurboGears
- Pylons
- Zope
- Grok
- web2py
- CherryPy
- CubicWeb
- Enamel
- Gizmo(QP)
- Glashammer
- Karrigell
- notmm
- Porcupine
- Pyroxide
- QP
- SkunkWeb
- Spyce
- web.py
- Webware
- Werkzeug
- Ruby
- Ruby on Rails
- Merb
- Camping
- Nitro
- Smalltalk
- Seaside
- AIDA/Web
[Igor Macaubas] Blog da Viagem ao SQS 2009 e XP 2009
Saturday, March 21st, 2009Recebi na última semana uma excelente notícia do Célio Santana: ele está criando um BLOG para contar a sua viagem ao SQS 2009 (Alemanha) e ao XP 2009 (Itália), dois eventos internacionais de grosso calibre que irão acontecer no mês de maio deste ano de 2009!
O endereço do BLOG é http://sqs2009.blogspot.com
A idéia do BLOG é criar uma espécie de diário virtual da viagem, onde o Célio irá nos contar como está a sua aventura pelo mundo!
Célio, agora é com você! Por favor surpreenda-nos!
[Rodolfo Carvalho] Python tricks: locals(), globals() e keyword arguments (kwargs)
Saturday, March 21st, 2009Nessa semana durante uma sessão de pair programming lá na globo.com chegamos a um código que começava a se repetir… um bom momento para melhora, e lá introduzi uma “técnica” muito legal: usar o um dicionário que contém o escopo local para dinamizar o acesso a variáveis/nomes.
Esse dicionário já existe builtin no Python, apesar de eu acreditar que muita gente não saiba ou não o use…
Trata-se do locals() (e seu irmão globals()).
Uso:
def preencher_mensagem(id_mensagem, titulo=None, subtitulo=None, link=None):
id_titulo = MENSAGENS[id_mensagem]['titulo']
id_subtitulo = MENSAGENS[id_mensagem]['subtitulo']
id_link = MENSAGENS[id_mensagem]['link']
if titulo is not None:
preencher_titulo(id_titulo, titulo)
if subtitulo is not None:
preencher_subtitulo(id_subtitulo, subtitulo)
if link is not None:
preencher_link(id_link, link)
Abstraim o resto do código, e pensem nos if’s.
Com mais e mais parametros para preencher, isso fica muito repetitivo.
Por que não um loop?
def preencher_mensagem(id_mensagem, titulo=None, subtitulo=None, link=None):
id_titulo = MENSAGENS[id_mensagem]['titulo']
id_subtitulo = MENSAGENS[id_mensagem]['subtitulo']
id_link = MENSAGENS[id_mensagem]['link']
for parte in 'titulo subtitulo link'.split():
texto = locals()[parte]
id = locals()['id_%s' % parte]
preencher = globals()['preencher_%s' % parte]
if texto is not None:
preencher(id, texto)
Notem que com o locals() podemos acessar o dicionário de nomes locais e usar seus valores tanto para leitura quanto para escrita (não recomendada), chamar métodos, etc. O equivalente para o escopo global é o globals().
Ainda poderíamos fazer melhor e usar um dicionário dos parâmetros passados para a função/método, ao invés de ‘apelar’ para o escopo local.
Basta colocar um argumento que leve ** na frente, e ele será um dicionário de todos os parâmetros passados por nome. Melhor definição, formalismo e mais exemplos na documentação oficial do Python.
def preencher_mensagem(id_mensagem, **partes):
for parte, texto in partes.iteritems():
id = MENSAGENS[id_mensagem][parte]
preencher = globals().get('preencher_%s' % parte)
if preencher is not None:
preencher(id, texto)
Agora, para os que querem rodar alguma coisa que funcione, fiz um script completo que pode ser executado.
Fiz um “banco de dados” fictício só para fins de demonstração.
# -*- coding: utf-8 -*-
# Exemplo usado no meu blog em lifeatmymind.blogspot.com
# Rodolfo Carvalho 2009-03-21
#----- Meu "Banco de Dados" ------------------
MENSAGENS = {1: {'titulo': 4,
'subtitulo': 3,
'link': 1},
2: {'titulo': 1,
'subtitulo': 4,
'link': 2},
3: {'titulo': 2,
'subtitulo': 2,
'link': 4},
4: {'titulo': 3,
'subtitulo': 1,
'link': 3}}
TITULOS = {1: '', 2: '', 3: '', 4: ''}
SUBTITULOS = {1: '', 2: '', 3: '', 4: ''}
LINKS = {1: '', 2: '', 3: '', 4: ''}
#---------------------------------------------
def preencher_titulo(id_titulo, titulo):
TITULOS[id_titulo] = titulo
def preencher_subtitulo(id_subtitulo, subtitulo):
SUBTITULOS[id_subtitulo] = subtitulo
def preencher_link(id_link, link):
LINKS[id_link] = link
#---------------------------------------------
def preencher_mensagem1(id_mensagem, titulo=None, subtitulo=None, link=None):
id_titulo = MENSAGENS[id_mensagem]['titulo']
id_subtitulo = MENSAGENS[id_mensagem]['subtitulo']
id_link = MENSAGENS[id_mensagem]['link']
if titulo is not None:
preencher_titulo(id_titulo, titulo)
if subtitulo is not None:
preencher_subtitulo(id_subtitulo, subtitulo)
if link is not None:
preencher_link(id_link, link)
def preencher_mensagem2(id_mensagem, titulo=None, subtitulo=None, link=None):
id_titulo = MENSAGENS[id_mensagem]['titulo']
id_subtitulo = MENSAGENS[id_mensagem]['subtitulo']
id_link = MENSAGENS[id_mensagem]['link']
for parte in 'titulo subtitulo link'.split():
texto = locals()[parte]
id = locals()['id_%s' % parte]
preencher = globals()['preencher_%s' % parte]
if texto is not None:
preencher(id, texto)
def preencher_mensagem3(id_mensagem, **partes):
for parte, texto in partes.iteritems():
id = MENSAGENS[id_mensagem][parte]
preencher = globals().get('preencher_%s' % parte)
if preencher is not None:
preencher(id, texto)
#---------------------------------------------
def imprimir_mensagens():
def print_linha(conteudo=''):
print '| %s |' % conteudo.center(76)
for id, msg in MENSAGENS.iteritems():
print
print '(%d)' % (id,)
print '-' * 80
print_linha('* %s *' % TITULOS[msg['titulo']])
print_linha('%s' % SUBTITULOS[msg['subtitulo']])
print_linha()
print_linha('%s' % LINKS[msg['link']])
print '-' * 80
if __name__ == '__main__':
preencher_mensagem = preencher_mensagem3
preencher_mensagem(id_mensagem=1,
titulo=u'Olá mundo!',
subtitulo=u'Veja como é divertido usar Python',
link='http://lifeatmymind.blogspot.com')
preencher_mensagem(id_mensagem=2,
titulo=u'Esta é a segunda mensagem cadastrada',
link='http://lifeatmymind.blogspot.com')
preencher_mensagem(id_mensagem=3,
subtitulo=u'Eu não tenho título...',
link='http://lifeatmymind.blogspot.com')
preencher_mensagem(id_mensagem=4,
titulo=u'Última mensagem',
subtitulo='Sou uma mensagem sem link')
imprimir_mensagens()
Um outro exemplo de uso interessante seria:
def tell_story(king, princess, action):
print ('There was a King called %(king)s that had a beautiful daughter. '
'Her name, %(princess)s, would have to be shout in order to make '
'her %(action)s.' % locals())
tell_story("Peter", "Fiona", "ride a horse")
tell_story("Allan", "Britney", "dance")
No trecho acima tem duas coisas interessantes:
- Você pode escrever strings grandes sem poluir seu código com linhas super extensas. Siga a recomendação de manter no máximo 80 caracteres por linha. Para escrever strings longas, use-se do artifício da continuação de linha implícita por causa dos parênteses e da concatenação automática de strings postas lado a lado.
>>> "Eu sou uma string" " que continua em outra parte"
'Eu sou uma string que continua em outra parte'
>>> ("Eu sou uma string" " que continua em outra parte"
... " e tambem em outra linha!")
'Eu sou uma string que continua em outra parte e tambem em outra linha!'
- Você pode usar o locals() como dicionário para formatação de strings!
O código original é equivalente a:
def tell_story(king, princess, action):
print ('There was a King called %(king)s that had a beautiful daughter. '
'Her name, %(princess)s, would have to be shout in order to make '
'her %(action)s.' % dict(king=king, princess=princess, action=action))
tell_story("Peter", "Fiona", "ride a horse")
tell_story("Allan", "Britney", "dance")
Porém, o original é bem mais sucinto
[Rafael Biriba] QR Code: Gere com o Kaywa
Friday, March 20th, 2009
QR Code com a URL deste BLOG
Após apresentar tecnologia do QR Code e depois mostrar como fazer a leitura pelo celular, agora vai a dica de como gerar um QR code através da ferramenta online disponível no site:
Para gerar, deve ser escolhido o tipo de dado a ser incluído:
Uma URL, um texto, um numero de telefone ou um SMS.
Após incluir o conteúdo, é possível definir o tamanho do código.
S = Pequeno, M = Medio, L = Grande, XL = Muito grande
Lembrando que o tamanho também é diretamente proporcional ao conteúdo. Então, mesmo que se escolha pequeno, caso haja um conteúdo muito grande, o código sairá grande.
Faça uns testes e divirta-se.
Após gerar o código, um link é fornecido para que se coloque o código no seu site.
[Rafael Biriba] QR Code: Gere com o Kaywa
Friday, March 20th, 2009
QR Code com a URL deste BLOG
Após apresentar tecnologia do QR Code e depois mostrar como fazer a leitura pelo celular, agora vai a dica de como gerar um QR code através da ferramenta online disponível no site:
Para gerar, deve ser escolhido o tipo de dado a ser incluído:
Uma URL, um texto, um numero de telefone ou um SMS.
Após incluir o conteúdo, é possível definir o tamanho do código.
S = Pequeno, M = Medio, L = Grande, XL = Muito grande
Lembrando que o tamanho também é diretamente proporcional ao conteúdo. Então, mesmo que se escolha pequeno, caso haja um conteúdo muito grande, o código sairá grande.
Faça uns testes e divirta-se.
Após gerar o código, um link é fornecido para que se coloque o código no seu site.
[Tiago Peczenyj] XStream e JSON
Thursday, March 19th, 2009XStream é a maneira mais fácil de trabalhar com XML em Java. Para trabalhar com JSON então, é ainda mais facil
[Rodolfo Carvalho] Provérbio do dia
Wednesday, March 18th, 2009“O maior dos erros é a pressa antes do tempo, e a lentidão ante a oportunidade”
- Provérbio árabe
Do (excelente) livro “Do Fortran à Internet: no rastro da trilogia Educação, Pesquisa e Desenvolvimento”, de Tércio Pacitti.
[Bernardo Heynemann] Finding out if a given selector (XPATH, ID or Whatever) is Enabled in Selenium
Wednesday, March 18th, 2009I just spent a whole day trying to figure out how to define if a given element (defined using an xpath) is an enabled (i.e. not disabled) element in “Selenese”, using Python bindings. Finally cracked it: def is_element_enabled(self, element): script =…(read more)
[Rafael Biriba] FFmpeg: Conversão de mp4 para wmv
Monday, March 16th, 2009
FFmpeg: http://www.ffmpeg.org/
Mês passado, tive que fazer uma conversão deste tipo. Eu possuia um vídeo em mp4 e precisava converter para wmv, para que o mesmo fosse executado no windows utilizando o codec nativo, sem utilizar nenhum codec adicional para isso.
O Arquivo .MP4:
Stream #0.0(und): Video: h264, yuv420p, 480×360 [PAR 0:1 DAR 0:1], 29.97 tb(r)
Stream #0.1(und): Audio: mpeg4aac, 44100 Hz, stereo
Ao final de alguns testes, consegui converter para o seguinte arquivo .wmv:
Stream #0.0: Video: wmv1, yuv420p, 480×360 [PAR 0:1 DAR 0:1], 29.92 tb(r)
Stream #0.1: Audio: wmav2, 44100 Hz, stereo, 64 kb/s
Abaixo segue a linha de comando:
ffmpeg -i video_entrada.mp4 -vcodec wmv1 -acodec wmav2 -deinterlace -sameq video_saida.wmv
Utilizei o codec de vídeo WMV1 e o codec de áudio WMVA2, seguidos pelo deinterlace ( desentrelaçamento do vídeo ) e o sameq ( mesma qualidade de vídeo do original ).
——————————————————-
Instalação do FFmpeg:
FFmpeg: Solução ideal para Áudio e Vídeo
——————————————————
Procedimento de Uso:

Usuários Linux tem sempre mais facilidade, nesse tipo de procedimento.
Basta abrir o Terminal e digitar:
ffmpeg -i video_entrada.mp4 -vcodec wmv1 -acodec wmav2 -deinterlace -sameq video_saida.wmv
Onde meu arquivo se chama video_entrada.mp4 e se encontra na área de trabalho.
( Levando em consideração que ao abrir o terminal você vai estar dentro da pasta home do usuário local )
————————————————————————————————————
Usuários Windows levam mais tempo para poder executar o comando.
Entre em INICIAR > EXECUTAR e digite cmd > OK ( Para abrir o Terminal do Windows )
Acesse a pasta digitando:
cd Desktop/pasta_do_ffmpeg/
em seguida:
ffmpeg.exe -i “../video_entrada.mp4″ -vcodec wmv1 -acodec wmav2 -deinterlace -sameq “../video_saida.wmv”
Onde meu arquivo se chama video_entrada.mp4 e se encontra na área de trabalho.
( Utilizamos ../ para sair da pasta do ffmpeg e acessar o filme.avi a partir da área de trabalho. )
————————————————————————————————————
Leitura recomendada: Windows VS FFmpeg e Mplayer
————————————————————————————————————
