Arquivo

Textos com Etiquetas ‘web’

Um pouco de metaprogramação

1, outubro, 2009 Sem comentários

Quem assina a lista django-brasil recebeu essa mensagem do Luciano Ramalho sobre metaprogramação. Achei muito interressante e demonstra perfeitamente o quão poderosa é a linguagem Python.

Estou reproduzindo o texto sem alterações:

Em geral não é tedioso programar com o Django, mas às vezes é, veja só quanta repetição:

# http://pastebin.com/f2fc7b238

class DescriptorInline(admin.TabularInline):
   model = Descriptor

class RecruitmentCountryInline(admin.TabularInline):
   model = RecruitmentCountry

class OutcomeInline(admin.StackedInline):

   model = Outcome

class TrialInterventionCodeInline(admin.TabularInline):

   model = TrialInterventionCode

class SecondaryNumberInline(admin.TabularInline):

   model = TrialNumber

class TrialContactInline(admin.TabularInline):

   model = TrialContact

class TrialInstitutionInline(admin.TabularInline):

   model = TrialInstitution

class ClinicalTrialAdmin(admin.ModelAdmin):

   inlines = [SecondaryNumberInline, RecruitmentCountryInline,

              OutcomeInline, TrialContactInline, TrialInstitutionInline,

              DescriptorInline, TrialInterventionCodeInline]

No código acima, cada nome de modelo aparece três vezes… (uma vez ao
declarar a classe XXXInline, no atributo model do inline, e mais uma
vez no atributo inlines).

Além disso, quase todas as declarações de inlines são idênticas… E o
princípio DRY, como fica?

Felizmente Django é Python. Então aquilo pode ser reescrito de uma
maneira mais legal assim:

# http://pastebin.com/f5af2bd28

tabular_inline_models = [Descriptor, RecruitmentCountry, TrialInterventionCode,

                        TrialNumber, TrialContact, TrialInstitution]

tabular_inlines = []

for model in tabular_inline_models:

   cls_name = model.__name__+'Inline'

   cls = type(cls_name, (admin.TabularInline,), {'model':model})

   tabular_inlines.append(cls)

class OutcomeInline(admin.StackedInline):

   model = Outcome

class ClinicalTrialAdmin(admin.ModelAdmin):

   inlines = tabular_inlines + [OutcomeInline]

O truque aqui foi usar a função type(), que pode ser usada para criar
classes dinamicamente. Para isso a gente passa três argumentos para a
função type():

- uma string que será o __name__ da classe
- uma tupla de super-classes (importante: a vírgula dentro do
parêntesis indica que é uma tupla de um elemento)
- um dicionário com os atributos da classe (métodos e variáveis)

Não tente fazer isso em Java ;-) .

[ ]s
Luciano

FISL 10 foi mara!

8, julho, 2009 Sem comentários

Bom, já passou uma semana do FISL10, foi uma semana muito corrida em POA, entre palestras, feira de tecnologia, saídas a noite, ida ao Beira Rio, etc….. Com tudo isso não deu para atualizar o blog. Mas agora estou de volta ao calor de Maceió e aqui estão minhas impressões da décima edição do Fórum Internacional de Software Livre.

FISL 10

FISL 10 - Multidão

Pra comecar vale dizer que tinha MUITA gente no evento, 7 mil pessoas num so lugar é um pouco claustrofóbico, porém não faltaram atividades para todos durante os 4 dias de evento.

Tinhamos representantes de várias áreas no suporte a causa do Software Livre, como: Free Software Foundation, Mozilla, Ubuntu-br, Fedora, Sun, Oracle, Associação Python Brasil, Globo.com e vários outros.

Muitos brindes! Vai a dica a que se aventurar nas próximas edições do FISL, gaste as primeiras horas do dia inicial para “caçar” os brindes. Eles têm de tudo, camisas, adesivos, cds. Nem sempre é de graça, a Mozilla, por exemplo, estava distribuindo camisetas a quem achasse pistas escondidas no galpão da PUC. No último caso pode-se comprar algumas lembraças, mas é bom correr também pois acabam rápido.

As palestras estavam pouas, porém é tanta coisa acontecendo ao mesmo tempo que fica dicifil acompanhar as quem você quer assistir, precisa-se de um pouco de prática. Da proxima vez estarei mais esperto.

Ainda teve a visita do lula, que eu não vi…. mas foi muito importante para a causa Software Livre o apoio do Goveno Federal.

No final das contas o FISL vale muito a pena, quem tiver a oportunidade de ir não vai se arrepender. Abaixo tem algumas fotos que tirei no evento.

Jogo da Mente

Jogo da Mente

Não entendi muito, mas achei legal!

PLACAS

Richard Stallman

Richard Stallman

CAIXA

CAIXA

Credenciamento

Credenciamento

SERPRO

SERPRO

Bolinhas da SUN

Bolinhas da SUN

Categories: eventos Tags: , , , , ,

Desenvolvimento Ultra-Rápido com web2py

13, fevereiro, 2009 10 comentários

Cada dia que passa eu me impressiono mais com esta poderosa linguagem que é o python. Agora me deparo com este vídeo do framework web2py. É tão simples que da raiva e você pensa “onde é que isso estava naquele meu último projeto”. Não acredita? Assista ao vídeo e chore.

Obs.: Vídeo em inglês.

Categories: sistemas, web2py Tags: , , ,

CMS com django Parte 1

1, fevereiro, 2009 Sem comentários

Olá pessoas, nesse mês de janeiro comecei a desenvolver um CMS utilizando o ótimo framework Django. Durante o processo abracei a causa DRY (don’t repeat yourself) e acabei encontrado ótimas aplicações disponibilizadas pela comunidade. Nos próximos posts vou mostrar algumas aplicações que diminuem ainda mais o tempo necessário para construir uma aplicação de grande porte.

django-tagging

O django-tagging é uma aplicação de tags genérica, com ela possível criar tags específicas para cada tipo de objeto. Sendo assim, pode-se adicionar tags a qualquer modelo do seu projeto.

Digamos que tenha o seguinte modelo:

from django.db import models
class BlogPost(models.Model):
    title = models.CharField(max_length=30)
    body = models.TextField()
    date_posted = models.DateField()

É um simples modelo de post, mas para adicionar a funcionalidade de tags fazemos:

from django.db import models
from tagging.fields import TagField

class BlogPost(models.Model):
    title = models.CharField(max_length=30)
    body = models.TextField()
    date_posted = models.DateField()
    tags = TagField()

O django-tagging adiciona um novo campo chamado TagField onde as tags serão cadastradas. Para facilitar ainda mais pode adicionar os seguintes métodos:

def _get_tags(self):
    return Tag.objects.get_for_object(self)
def _set_tags(self, tag_list):
    Tag.objects.update_tags(self, tag_list)
tags = property(_get_tags, _set_tags)

Agora para obter as tags relacionadas ao BlogPost fazemos assim:

e = BlogPost.objects.get(pk=12)
e.tags # retorna a lista de tags
e.tags = 'foo bar' # agora o BlogPost possui as tags foo e bar

Então, imagine uma situação em que vários modelos da sua aplicação possuem um campo de tag, seria interessante descobrir quais são as tags usadas num determinado tipo de modelo, para isso podemos fazer:

from myapp.models import MyModel
from tagging.models import Tag
m1 = MyModel.objects.get(pk=1)
Tag.objects.update_tags(m1, 'house thing')
m2 = MyModel.objects.get(pk=2)
Tag.objects.update_tags(m2, 'cheese toast house')
Tag.objects.usage_for_model(MyModel)
[<Tag: cheese>, <Tag: house>, <Tag: thing>, <Tag: toast>]

O código retorna uma lista com todas as tags utilizadas pelo modelo MyModel. Ainda é possível saber quantas vezes cada tag foi usada pelo modelo.

tags = Tag.objects.usage_for_model(MyModel, counts=True)
[(tag.name, tag.count) for tag in tags]
[('cheese', 1), ('house', 2), ('thing', 1), ('toast', 1)]

Para ter o total de tags e limitar o mínimo para um determinado número usamos o argumento min_count.

tags = Tag.objects.usage_for_model(MyModel, min_count=2)
[(tag.name, tag.count) for tag in tags]
[('house', 2)]

Ainda é possível selecionar objetos baseados nas suas tags.

from tagging.models import TaggedItem
house_tag = Tag.objects.get(name='house')
TaggedItem.objects.get_by_model(MyModel, house_tag)
[<Widget: pk=1>, <Widget: pk=2>]

O django-tagging é muito poderoso para mais detalhes leia a documentação disponível no arquivo de download.
No próximo post estarei mostrando mais sobre o django-tinymce e do django-compress. Até a próxima!

Categories: django Tags: , , ,

Softwell Maker

20, dezembro, 2008 25 comentários

Para quem não conhece, o Maker é uma ferramenta para criação de sistemas web de forma visual. O desenvolvedor não precisa ter conhecimentos avançados de programação para utilizá-lo, porque tudo é feito visualmente com a ajudas de assistentes e gráficos.

Durante essa semana participei de um treinamento dessa ferramenta, e analizando pessoalmente pude ver a capacidade desse sistema de desenvolvido pela empresa baiana Softwell. Abaixo seguem as minhas considerações sobre o Maker.

Como funciona?

O Maker foi desenvolvido em Delphi e (segundo seus representantes) não é um gerador de código fonte, mas se for necessário o mesmo também pode ser gerado.

Os sistemas desenvolvidos no Maker rodam, por padrão, num servidor de aplicações Java, como o Tomcat, por exemplo. Pode-ser gerar um arquivo .war e fazer o deploy num servidor que desejar.

As aplicações depedem do WEBRUN, que vem junto do Maker, e funciona como uma camada entre a aplicação desenvolvida e o servidor de aplicações.¬† Caso já possua um WEBRUN no servidor, também é possível exportar o sistema para um arquivo .jar e o incorporar a ela.

O Maker possui basicamente 3 funções para geração de sistemas, formulários, fluxos e relatórios.

Formulários

Atravéz de formulários acontecem as principais interações com o sistema. O Maker pode gerar automaticamente os formulários baseando-se nas tabelas e relacionamentos do banco de dados. Além de poder criar formulários, sem associação com fonte de dados e que execute uma tarefa em particular.

Fluxos

No Maker os fluxos substituem a codificação na hora de criar regras de negocio para a apliação. Tratam-se de fluxogramas que são associados a determinadas ações do sistema para realizar tomadas de decisão. Pode-se efetuar condições, loops, mensagens de error e retorno, além de um conjunto de funções já disponíveis como concatenação, obtenção de campos de tabelas, conversão de tipos primitivos, etc.

Relatórios

O Maker possui o Report Builder embutido, e o mesmo é utilizado para desenhar os relatórios necessários para a aplicação.

Na minha opinião!

Realmente, depois de presenciar o treinamento, posso dizer a utilização do Maker acelera sim o processo de criação de aplicações, principalmente no caso dos formulários, que podem ser gerados automaticamente a partir de uma fonte de dados.

Porém, é necessário tempo para se tornar um “expert” na utilização do Maker, o mesmo tempo que se levaria para aprender a utilizar um framework como Django, Ruby on Rails ou Grails, por exemplo. E o que, na minha opinião, seria a grande vantagem de uma ferramenta visual sobre os outros, a curva de aprendizagem, é parecida com a desses frameworks.

Eu devo concordar com esse post do guj, em que o usuário kicolobo diz:

Programação OO é ignorada. O código é gerado em Java e C#, porém o processo de desenvolvimento do Maker é procedural. Todos os diagramas são procedurais. Em momento algum (pelo menos na demonstração que vimos), foi criada uma classe de entidade (ou mesmo uma entidade qualquer). Tudo é relacionado diretamente com o banco de dados. Para quem já trabalha com OO, o Maker pode ser visto como retrocesso.

E realmente é verdade, hoje em dia fala-se muito mais em OO e MVC, voltar o desenvolvimento para as tabelas do banco de dados é praticamente um retrocesso. No django, por exemplo, só é necessário configurar o banco de dados, o desenvolvedor não precisa criar as tabelas, o django executa todo esse processo e também cria os formulários automaticamente.

Uma coisa que me incomodou bastante foi a quantidade de cliques necessários para fazer uma concatenação de texto com algumas variáveis. Algo que em python, por exemplo, poderia ficar assim:

texto = "O total da conta do cliente %s foi de %f reais" % (nome,total)

Outro fato importante é que por ser um sistema proprietário, a comunidade do maker praticamente não existe, se comparada com de outras tecnologias, sendo assim, sempre que precisarmos de ajuda temos que recorer ao suporte a softwell.

Conclusão

Analisando o esquema geral, eu não compraria uma licença do Maker para uso pessoal. Além dos fatos mencionados acima, um ambiente de Software Livre me agrada mais, sabendo que a existe uma comunidade por trás ajudando a manter e melhorar o sistema, diferente do modelo proprietário, onde estamos a mercê da empresa dona do sistema.

Categories: sistemas Tags: , ,

Utilizando iw.fss no Plone 2.5

13, dezembro, 2008 2 comentários

Uma das grandes vantagens do Zope/Plone é o seu banco de dados ZODB, porém existem situações onde é necessário armazenar grandes quantidades de arquivos, ou arquivos muito grandes. Isso pode acarretar no crescimento desnecessário do Data.fs. Uma das soluções existentes é a utilização do produto FileSystemStorage. O que ele faz é, disponibilizar um novo tipo storage para Archetypes, onde os valores dos campos como arquivos e imagens são armazenados no sistema de arquivos.

Primeiro precisamos baixar uma versão compatível com o Plone 2.5, segundo a página do produto a versão mais atual (2.7.1) só é suportada pela versão 3 do Plone. Sendo assim vamos precisar da versão 2.7.0, disponível aqui.

Instalação:

Existem 3 maneiras de instalar o FSS.

1ª) EGG

Baixe este egg, e utilize o easy_install para instalar.

# easy_install iw.fss-2.7.0-py2.4.egg

2ª)Instalando do SVN

Não encontrei o tar.gz da versão 2.7.0, sendo assim, baixei do repositório.

# svn export http://svn.plone.org/svn/collective/iw.fss/tags/2.7.0/ iw.fss
# cd iw.fss
# python setup.py install

3ª) Copiando para lib/pyton

Segue os mesmos passos acima, porém, ao invés de excutar o último comando, copiamos a pasta iw para a lib/python da sua instância.

# svn export http://svn.plone.org/svn/collective/iw.fss/tags/2.7.0/ iw.fss
# cd iw.fss
# cp iw $INSTANCE_HOME/lib/python

Configuração

Podemos notar que o FSS já adota os padrões do zope 3, ou seja, não é simplesmente extrair seu conteúdo na pasta Products e pronto. Para que ele seja carregado necessitamos criar algums arquivos zcml.

$INSTANCE_HOME/etc/package-includes/iw.fss-meta.zcml, com a linha:

<include package="iw.fss" file="meta.zcml"/>

$INSTANCE_HOME/etc/package-includes/iw.fss-configure.zcml, com a linha:

<include package="iw.fss" />

OBS.: No Plone 2.5 pode acontecer de não existir a pasta package-include em $INSTANCE_HOME/etc, se for este o caso será necessário copiar o conteúdo de $ZOPE_HOME/lib/python/Products/Five/skel para $INSTANCE_HOME/etc.

Agora abra o arquivo $INSTANCE_HOME/lib/python/iw/fss/etc/plone-filesystemstorage.conf e defina as variáveis abaixo:

storage-path $$INSTANCE_HOME/var/fss_files
backup-path $$INSTANCE_HOME/var/fss_backup
storage-strategy flat

storage-path e backup-path são, respectivamente, os caminhos de onde ficarão os arquivos e os backups. Já storage-strategy é tipo de estratégia utilizada para armezar os arquivos, por enquanto vamos deixar a estratégia padrão ‘flat’.

Verifique se o FSS está diponível para instalação. Caso sim, você fez tudo corretamente. Seguindo…

Alterando o storage para arquivos e imagens

Até agora o que fizemos foi instalar e configurar o FSS, mas só isso não basta. Para que os arquivos e as imagens dos content-types padrão do Plone (News Item, File e Image) passem a utilizá-lo precisamos de mais um passo. Adcione a seguinte linha em algum dos arquivos em $INSTANCE_HOME/etc/package-includes:

<include package="iw.fss" file="atct.zcml" />

Agora reinicie o zope e adicione uma nova imagem ou arquivo e verifique na pasta que você definiu como storage e note que agora existe um arquivo lá.

Definindo tipos em produtos personalizados

Muitas vezes somente os tipos padrão do plone não suficientes, e temos que criar nossos próprios tipos. Para utilizar o FSS em nossos produtos personalizados fazemos o seguinte:


from iw.fss.FileSystemStorage import FileSystemStorage
...
my_schema = Schema((
    FileField('file',
              ...
              storage=FileSystemStorage(),
              widget=FileWidget(...)
              ),
    ...
    ))
 ...

Bem simples, faça o mesmo na definição do seu tipo e o arquivo será salvo no sistema de arquivos. Para quem usa o Plone 3, os passos são parecidos, porém pode-se utilizar o buildout para facilitar ainda mais o processo.

Esse foi o meu primeiro(de muitos) tutorial, espero que gostem. t+

Categories: pzp Tags: , , , ,

Bem vindos! (mais uma vez)

12, dezembro, 2008 Sem comentários

Bom, essa é minha segunda tentativa de escrever um blog. A primeira foi a um tempo atrás no blogspot e pra variar fiquei com preguiça de atualizar, escrever nao é o meu forte.

Dessa vez vou tentar utilizar o tempo livre para alimentar esse novo blog. Como os projetos da Cubo Estúdio Web estão meio estagnados por falta de tempo, vou utilizar esse espaço falar sobre o dia a dia, ou seja, Zope, Plone e Python e também sobre PHP e outras coisas.

É isso ai, espero que gostem. t+

Categories: blog Tags: