Re:java X python

47 respostas
saoj

Não existe melhor ou pior !!! Depende do caso de uso…

Para fazer um sistema de missão crítica, um servidor, etc e tal eu usaria Java.

Para fazer escripts, algoritmos, etc eu usaria Python.

python é mais pragmática, direta e menos verbose do que java.

Um algoritimo fica bem mais claro em Python do que em Java.

O problema é:

para aprender python hoje em dia não é 100 vezes melhor partir para o Ruby ?

Acho que sim…

47 Respostas

cu_ringa

então aproveitando. Pq Ruby, ela é melhor do q Python ?

V

Eu acho que é 100x melhor aprender as duas… Python é muito consolidade e você encontra muita coisa pronta…

Pra aprender python eu recomendo o livro Dive into Python(disponivel online gratuitamente)

Proteu_Alcebidiano

Python está aí há mais tempo, uns 15 anos, acho. Não estudei Python a fundo, mas Ruby está me agradando muito, principalmente na escrita de algoritmos. Essa coisa dele ter inteiros grandes e suportar aritmética invervalar (ranges) nativamente é joia pra que faz algoritmos =) A facilidade é óbvia…usar coisas como (Ruby / Python tem isso)

n = 2**100
s = n + 3**200
...
...

ao inves de

BigInteger n = new BigInteger("2").pow(100);
...
...

É mais transparente =)

Enfim, conforme dito, isso depende do caso de uso.

J

Python é a liguagem querida do pessoal do Google. Se você quiser um dia trabalhar no Google, aprender essa liguagem é um plus danado.

O próprio google é feito em C e Python.

[]'s
Jose Peleteiro

V

juzepeleteiro:
Python é a liguagem querida do pessoal do Google. Se você quiser um dia trabalhar no Google, aprender essa liguagem é um plus danado.

Claro que um PhD e mais algumas publicações relevantes também ajudam =D

Thiagosc

Como eu odeio essa palavra “pragmático”. Hoje em dia qualquer mané tomando cervejas num boteco é “pragmático”. Essa palavra é tão (mal) utilizada que ganhou conotação de “algo positivo” e perdeu totalmente o significado, principalmente em TI.

J

Vegetto:
juzepeleteiro:
Python é a liguagem querida do pessoal do Google. Se você quiser um dia trabalhar no Google, aprender essa liguagem é um plus danado.

Claro que um PhD e mais algumas publicações relevantes também ajudam =D

Para ser honesto nem tanto, eu tenho um amigo que foi e nem tem isso. O que o pessoal ficou impolgado na entrevista (nao souberam nem esconder isso) foi o fato dele manjar de Python.

saoj

Python é bem vista nos Estados Unidos, mas a meu ver Ruby é mais moderna.

Sobre Pragmatismo:

  • ser direto, claro e objetivo.

Na minha opinião, e talvez isso se deva ao fato de eu ser um programador, tudo na vida com exceção de sexo, quanto mais pragmático melhor é…

Quer um exemplo de falta de pragmatismo? Veja como o webwork é pragmático na questão do file upload:

http://wiki.opensymphony.com/display/WW/Webwork+file+upload+handling

J

saoj:
Quer um exemplo de falta de pragmatismo? Veja como o webwork é pragmático na questão do file upload:

http://wiki.opensymphony.com/display/WW/Webwork+file+upload+handling

Saoj,

Agente já se desentedeu uma vez por causa disso. Não critique um framework ou seja lá o que for, se você não têm conhecimento e experiência nele. Você pode até criticar a documentação do WebWork.

Para fazer upload no WebWork você declara um set em arrays de byte ou um FileItem e pronto. Isso tudo que você viu ai na documentação é se você quiser fazer na mã0 e ter um certo controle, ou sei lá o motivo.

Um abraço,
Jose Peleteiro

saoj

Não quero me desentender com vc não, peleteiro.

Sö me mostre onde está a documentação do WebWork onde FileUpload é simples e pragmático. Deve ter em algum lugar e eu que não consegui encontrar mesmo…

Acho que vc dveria ajudar os caras do webwork a documentar então. Pois as suas explicações são sempre mais simples que a documentação deles…

marcelomartins

Não, em hipótese alguma.

Po, dizer que Ruby é 100 vezes melhor que python não dá. O ruby pode ser melhorzinho em alguns casos (que não consigo imaginar nenhum).

J

Sim, a documentação deles é uma bosta. Eles vendem livros e isso que eles fazem para documentar.

Bem, eu tenho mais de 10 projetos em Webworks na bagagem para conhecer ele bem. E concordo que a documentação deles é uma bosta. Para usar WebWork você têm que comprar livros.

O conceito todo, que até agora foi só isso, está no tratamento de tipos compostos do WebWork. Você declara byte de arrays como um tipo la do tipo file upload que eu nao me lembro o nome e pronto.
Assim como você faria para converter aquele monte de string em um tipo Cliente por exemplo automaticamente.

Aquilo é um wiki, aonde as pessoas colocam as soluções que elas preferem.

Talvez uma procurada melhor na documentação também ajuda, olha ai uma outra maneira mais simples:
http://wiki.opensymphony.com/display/WW/How+do+I+handle+files+upload

Eu também não quero me desentender não, mas é chato toda hora você forçando e criticando os frameworks com base em conhecimento de uma página de documentação/wiki.

Dá uma lida sobre OGNL e http://www.opensymphony.com/webwork/wikidocs/Type%20Conversion.html para entender melhor o webwork.

saoj

Não disse isso. :slight_smile:

Disse que devido a moda e falatório em torno de Ruby seria 100 vezes mais vantajoso partir para Ruby. Se bem que em termos de mercado Phyton deve estar muito na frente!

saoj

Talvez não entenda tanto quanto vc, mas com certeza um pouco mais do que uma página de wiki.

Eu acho o WebWork um ótimo framework, mas como vc mesmo falou a documentação é um lixo, logo não posso considerar sua produtividade alta, pois eu não quero ter que ler um livro para ser produtivo.

E o falto dele usar xwork, não ter input só injection, um monte de XML, depender do Spring para IoC, enablers pra tudo que é lado e essas coisas complicam mais do que ajudam.

Eu não tenho dúvida em afirmar que o Mentawai, vRaptor, Rife e Stripes são frameworks mais pragmáticos e modernos que o WebWork.

Me ajuda aqui para eu entender isso de vez. Como o link que vc passou sugere eu preciso colocar os métodos abaixo na minha action para pegar o arquivo. Mas como vou pegar um arquivo de File ??? Isso é um java.io.File ??? Cadê o meu byte[] com o conteúdo do arquivo ??? Ou um InputStream ???

public void setMyDoc(File myDoc) { ...}
public void setMyDocContentType(String contentType) { .... }
public void setMyDocFileName(String filename) { .... }
J

saoj:
Talvez não entenda tanto quanto vc, mas com certeza um pouco mais do que uma página de wiki.

Eu acho o WebWork um ótimo framework, mas como vc mesmo falou a documentação é um lixo, logo não posso considerar sua produtividade alta, pois eu não quero ter que ler um livro para ser produtivo.

Tudo bem, mas eu acredito em treinamento como parte de uma preparação para ser produtivo.

Desculpa, eu já acho a ideia de input/output em Java (fortemente tipada) muito anos 90.

Perceba, que não é só passar os parametros por setter, mas convertelos para tipos concretos também.

Não considero o WebWork um framework moderno também, inclusive nenhum projeto que estou trabalhando hoje usa ele e eu não usaria mais ele. Mas ele já foi muito bom. Hoje eu usaria, em Java, um SpringMVC ou JBoss Seam e talvez um JSF (dependendo do projeto).

saoj:
Me ajuda aqui para eu entender isso de vez. Como o link que vc passou sugere eu preciso colocar os métodos abaixo na minha action para pegar o arquivo. Mas como vou pegar um arquivo de File ??? Isso é um java.io.File ??? Cadê o meu byte[] com o conteúdo do arquivo ??? Ou um InputStream ???

public void setMyDoc(File myDoc) { ...} public void setMyDocContentType(String contentType) { .... } public void setMyDocFileName(String filename) { .... }

Você pode ler o file. Ou então utilizar a primeira maneira que eu disse.

Das três maneiras é possível (a terceira não é bem documentada). Eu te mandei um link e uma sugestão para você dar uma lida sobre type conversione OGNL, ai você entenderia o que estou falando.

saoj

Acho isso preconceito. Uma coisa é vc ter HttpServletRequest, HttpServletResponse e outras classes concretas bizarras. Outra coisa é ter duas interfaces input/output bastante simples e práticas e que vão facilitar a vida dos filtros, que são o ponto principal de um framework web ao meu ver.

Sim, pra isso que os filtros já convertem isso automaticamente pra vc e populam objetos. E vc tem o total controle disso.

Preciso entender de OGNL para fazer um FileUpload? Deixa isso pra lá pois já fugimos do tópico…

J

saoj:
peleteiro:

Desculpa, eu já acho a ideia de input/output em Java (fortemente tipada) muito anos 90.

Acho isso preconceito. Uma coisa é vc ter HttpServletRequest, HttpServletResponse e outras classes concretas bizarras. Outra coisa é ter duas interfaces input/output bastante simples e práticas e que vão facilitar a vida dos filtros, que são o ponto principal de um framework web ao meu ver.

Talvez seja, mas é só minha opinião pessoal. Tem gente que gosta, eu não acho legal não. Mas estou aberto a amanha dizer que eu estava errado.

saoj:

Perceba, que não é só passar os parametros por setter, mas convertelos para tipos concretos também.

Sim, pra isso que os filtros já convertem isso automaticamente pra vc e populam objetos. E vc tem o total controle disso.

Legal, os converters são PropertyEditor? (no Webwork não é (o que acho muito ruim), é só uma pergunta mesmo) E como você tratou dos casos em que as collections são usam genenerics?

saoj:
Peleteiro:

Eu te mandei um link e uma sugestão para você dar uma lida sobre type conversione OGNL, ai você entenderia o que estou falando.

Preciso entender de OGNL para fazer um FileUpload? Deixa isso pra lá pois já fugimos do tópico…

[/quote]

Para você entender de WebWorks sim. Esse tipo de coisa, como converter um arquivo enviar para um tipo na sua action é tratada pelo OGNL. Entender de OGNL é pre-requesito para entender bem o WebWorks.

Z

Que monte de XML? Eu tenho alguns projetos bem grandinhos com o WebWork e o único XML é o xwork.xml (não uso o validator dele). E configurá-lo é bem fácil.

Se uma interface input faz tanta falta assim, você pode usar a ActionContext pra pegar os parametros na unha. Mas definirmos que isso é má prática de programação, por que gera um forte acoplamento e quebra a inversão de controle (o objeto recebe tudo o que precisa pra ser executado); do mesmo jeito seria se fosse o Menta e o pessoal quisesse usar a Input invés de injection.

Enablers não existem mais, isso é coisa de versões muito antigas. E não depende do Spring pra IoC, o ponto é que a equipe do WebWork só achou necessário apenas implementar o factory pra Spring, quem quiser fazer pra outro engine pode fazer, o *framework é flexível a esse ponto. (Não gosto da palavra flexível, assim como pragmático…)

Já usei Mentawai, vRaptor e WebWork em alguns projetos de vários portes. O vRaptor é sim mais moderno e prático que os outros, mas não tem integração com nada por default. Acho que ele ganha de goleada por usar recursos do Java 5…

WebWork e Menta, por outro lado, eu diria que são praticamente a mesma coisa, só que fazem algumas coisas de modos diferente e chamam outras de nomes diferentes, mas são frameworks da mesma geração. Não vejo um sendo mais prático ou moderno que outro (não tou dizendo que não são, mas que estão no mesmo nível).

Z

Esqueci de falar de Java x Python. :smiley:

Python é bem fácil de aprender e tem uma sintaxe muito clara, o código fica bem fácil de ler. Conta com uma diversidade enorme de módulos implementados, uma comunidade grande (mas não supera a de Java) e também é muito bem documentada.

Uma vantagem que eu vejo de Python em relação a Java é que os módulos, aparentemente, são desenhados pensando na simplicidade, em facilitar a vida do programador (em Java, as vezes, dá a impressão que o projetista de uma API queria fazer algo mais estado da arte do que simples de usar).

Ruby é uma linguagem mais moderna que as outras duas, mas tem o preconceito por causa do hype. Mas aprender uma linguagem com recursos como blocks e closures é interessante, embora não ela não seja a única, acho que é a mais fácil e acessível pra quem tá começando.

saoj

O Menta suporta os dois também. Basta vc colocar o InjectionFilter como filtro global que todos os parametros do input vão pular para a Action (ou direto para o model). Acho legal ter os dois, pois há casos que o input ali prontinho pra vc vai facilitar bastante e haverá outros casos que vc quer deixar totalmente disacoplado do framework como vc falou, apesar de na minha opinião esses casos serem minoria, mas isso de novo vai do gosto da pessoa.

O IoC do WebWork é (pelo menos era) cheio de limitações. Achei que a integração com o Spring se deveu a esse fato.

Nada te impede de usar Java 5 com o Mentawai. Configuração via Annotations é de novo uma questão de gosto pessoal. Eu prefiro centralizar tudo num lugar só. Outros vão preferir anotar cada action e por aí vai. Vai gerar o acoplamento que vc condenou mais acima.

Todos os frameworks evoluem. O VRaptor1 era outro produto assim como o WebWork1. Quando eu conheci o webwork tinha sim enablers até para session e um monte de outras maluquices que agora não tem pois evoluiu.

Tirando o Mentawai eu gosto do VRaptor, Riffe e Stripes. O VRaptor tb é bastante parecido com o Stripes.

Um framework tem que ser avaliado junto com a documentação, e isso o WebWork deixa muito a desejar, ficando até mesmo complicado para quem o olha pela primeira vez.

Acho que o VRaptor e o Mentawai tá provando para Bruce Tate e cia do RoR que dá sim para fazer coisas simples com Java. É só entender que o simples pode tb ser poderoso, principalmente se faz o mesmo trabalho com qualidade e em menos tempo.

Thiagosc

saoj:
Python é bem vista nos Estados Unidos, mas a meu ver Ruby é mais moderna.

Sobre Pragmatismo:

  • ser direto, claro e objetivo.

Na minha opinião, e talvez isso se deva ao fato de eu ser um programador, tudo na vida com exceção de sexo, quanto mais pragmático melhor é…

Cara, acho que esse “ser direto” é muito subjetivo. Não há uma métrica para tal e linhas de código realmente não significam absolutamente nada.

Por exemplo, as classes IO podem ter seus defeitos (por isso foi feito o NIO) mas para mim faz sentido o como as classes são estruturadas. O fato de alguém teclar um pouco mais porque usa notepad ao invés de um Eclipse ou Netbeans para usar um BufferedOutputStream não torna aquilo menos “direto”, levando-se em conta que é uma classe genérica para ser usada em diversas situações e diversas aplicações. Pela lógica do OO aquilo faz sim sentido e é consistente com o restante do sistema.

Você pode depois criar algum método que faça tudo de uma vez nas suas próprias classes.

O class library do Java é o que dá a produtividade à plataforma, e nisso o Java é imbatível. O que mais se aproxima é o .Net, mas ainda falta comer feijão para chegar no Java.

J

Eles implementaram para o PicoContainer também.

cv1

Sem ofensas, mas o pessoal que ja migrou pra Rails nao ta nem ai pra frameworks web em Java, a nao ser pra falar mal. :wink:

J

Sem ofensas, mas o pessoal que ja migrou pra Rails nao ta nem ai pra frameworks web em Java, a nao ser pra falar mal. ;)

Huahuahuahuahauha…

Agora falando sério, o dia que você mudar a sua classe em Java e apertar o F5 para ver como ficou pode até ser que o cenário mude.

J

Sim, fazer um container de IoC não é um tarefa trivial. Não é simplementes chegar e colocar uma instancia no lugar de uma interface.
Não sei se o IoC do Menta é IoC bom. Ele tem hot-swap, lazy creation, eager creation, controle de dependências ciclicas, eventos, mixin, controle de ciclo de vida, dentro outros?

Z
saoj:
Nada te impede de usar Java 5 com o Mentawai. Configuração via Annotations é de novo uma questão de gosto pessoal. Eu prefiro centralizar tudo num lugar só. Outros vão preferir anotar cada action e por aí vai. Vai gerar o acoplamento que vc condenou mais acima.
Não tava falando de configuração usando anotação, mas sim disso:
class Controller {
    @Read
    private Integer codigo;
    @Out
    private String nome;

    ...
}
Anotações que deixam o trabalho mais simples.
Thiagosc

juzepeleteiro:
Huahuahuahuahauha…

Agora falando sério, o dia que você mudar a sua classe em Java e apertar o F5 para ver como ficou pode até ser que o cenário mude.

Estranho, eu faço isso em Java aqui nas minhas ferramentas e funciona. :slight_smile: Será que existem pessoas que não usam as ferramentas corretas?

Aqui está o link para a mágica do F5:

http://www-306.ibm.com/software/awdtools/developer/application/index.html

Na guerra a primeira vítima sempre é a verdade.

Grinvon

Sem ofensas, mas o pessoal que ja migrou pra Rails nao ta nem ai pra frameworks web em Java, a nao ser pra falar mal. ;)

CV, você já teve projetos ae usando o Rails? Caso sim, conte sua experiência!

J

Thiagosc:
juzepeleteiro:
Huahuahuahuahauha…

Agora falando sério, o dia que você mudar a sua classe em Java e apertar o F5 para ver como ficou pode até ser que o cenário mude.

Estranho, eu faço isso em Java aqui nas minhas ferramentas e funciona. :slight_smile: Será que existem pessoas que não usam as ferramentas corretas?

Aqui está o link para a mágica do F5:

http://www-306.ibm.com/software/awdtools/developer/application/index.html

Na guerra a primeira vítima sempre é a verdade.

Tiago, não força. Isso só é possivel em java, sem fazer um redeploy, se for mudança do corpo de um método. Qualquer alteração na assinatura das classes ou configuração o redeploy é necessário.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4910812

Thiagosc

juzepeleteiro:
Tiago, não força. Isso só é possivel em java, sem fazer um redeploy, se for mudança do corpo de um método. Qualquer alteração na assinatura das classes ou configuração o redeploy é necessário.

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4910812

Não, não estou forçando não, até porque esse programa usa a JVM da IBM. Sabe existe um mundo além da Sun, portanto eu não entendo o que esse seu link do site deles quer dizer.

Não sei como o RAD faz, se ele faz um redeploy por debaixo dos panos no WebSphere, mas sei que o F5 funciona. Ah sim, funciona.

cv1

Ou seja, vc esta ai batendo a mao no peito sobre uma feature que vc nao tem a menor ideia de como funciona, mas vc ‘sabe que funciona, pq ja viu acontecer’.

Me faz querer voltar pro PHP, as vezes.

Fabricio_Cozer_Marti

Com o redeploy automático configurado na maioria dos containers, é possível sim você alterar uma classe e esperar um pouco( tempo que o container atualiza o classloader ) e depois é só apertar F5. E com PHP é possível ? Pelo que eu saiba com classes em PHP não é possível alterações serem repercutidas em run-time.

cv1

Fabricio, PHP sempre foi edita-f5-edita-f5. De onde vc tirou essa?

Rubem_Azenha

juzepeleteiro:

Sim, fazer um container de IoC não é um tarefa trivial. Não é simplementes chegar e colocar uma instancia no lugar de uma interface.
Não sei se o IoC do Menta é IoC bom. Ele tem hot-swap, lazy creation, eager creation, controle de dependências ciclicas, eventos, mixin, controle de ciclo de vida, dentro outros?

A IoC do Mentawai cobre a maior parte dos casos. É mais para criar a interface de serviços e injetas automaticamente as dependências. Se você quer algo mais complexo, veja se você realmente precisa disso. Se precisar, o mentawai esta bem integrado com Spring.

Z

Ouxe. Em PHP só existe run-time. :smiley:

Java me deixa com muita saudade de php quando o assunto é editar-f5, era tudo muito mais simples e rápido. O Tomcat é bizarro nesse assunto. Além de ter um redeploy muito lento, às vezes dá uns paus que só reiniciando ele pra voltar a funcionar.

  • Não tá funcionando? Reinicia o tomcat. Ainda não funciona? Limpa o diretório work. Nada ainda? Reinicia a máquina. - Pronto. Funcionou.

:shock:

Fabricio_Cozer_Marti

Retificando, o PHP é reload-auto. Tá certo Carlos.

marcelomartins

Para um programar agil, com F5 enabled, é só usar o Jetty.

Se tua ide favorita tem auto complile, quando é salvo um arquivo .java ele compila, poe no diretorio de output, e o jetty já da o reload nele automaticamente

J

marcelomartins:
Para um programar agil, com F5 enabled, é só usar o Jetty.

Se tua ide favorita tem auto complile, quando é salvo um arquivo .java ele compila, poe no diretorio de output, e o jetty já da o reload nele automaticamente

Ele fazia a muitoooooo tempo atraz reload de servlet (http://jetty.mortbay.org/jetty5/faq?s=500-Servlets&t=reload), fazia.

marcelomartins

juzepeleteiro:
marcelomartins:
Para um programar agil, com F5 enabled, é só usar o Jetty.

Se tua ide favorita tem auto complile, quando é salvo um arquivo .java ele compila, poe no diretorio de output, e o jetty já da o reload nele automaticamente

Ele fazia a muitoooooo tempo atraz reload de servlet (http://jetty.mortbay.org/jetty5/faq?s=500-Servlets&t=reload), fazia.


Puutzz avacalharam :frowning:

louds

O mais legal de redeploy automático com Java é que 101% dos containers e JVMs geram object leaks. Sem falar se se você usar coisas como Spring, Hibernate & cia, vai esperar um século dependendo do caso para a nova versão estar em operação.

marcelomartins

louds:
O mais legal de redeploy automático com Java é que 101% dos containers e JVMs geram object leaks. Sem falar se se você usar coisas como Spring, Hibernate & cia, vai esperar um século dependendo do caso para a nova versão estar em operação.


Beleza, então de novo, reload automatico de classes para terem efeitos na web só com linguagens dinamicas, com java não dá. Mesma história da outra thread sobre o activeRecord.

louds

marcelomartins:
louds:
O mais legal de redeploy automático com Java é que 101% dos containers e JVMs geram object leaks. Sem falar se se você usar coisas como Spring, Hibernate & cia, vai esperar um século dependendo do caso para a nova versão estar em operação.


Beleza, então de novo, reload automatico de classes para terem efeitos na web só com linguagens dinamicas, com java não dá. Mesma história da outra thread sobre o activeRecord.

Da sim, é a arquitetura J2EE que não foi feita pensando nisso.

marcelomartins

louds:
marcelomartins:
louds:
O mais legal de redeploy automático com Java é que 101% dos containers e JVMs geram object leaks. Sem falar se se você usar coisas como Spring, Hibernate & cia, vai esperar um século dependendo do caso para a nova versão estar em operação.


Beleza, então de novo, reload automatico de classes para terem efeitos na web só com linguagens dinamicas, com java não dá. Mesma história da outra thread sobre o activeRecord.

Da sim, é a arquitetura J2EE que não foi feita pensando nisso.


Então não dá :slight_smile:

Thiagosc

Não, Zé. Se eu disse que ele faz isso é porque eu uso essa ferramenta e é assim que eu trabalho.

Agora, diga-me você, que teorias científicas do big bang, do significado da vida e tudo mais estão envolvidas no ato de se pressionar o F5 e ver o resultado no browser?

Se duvida então baixe o trial e veja você mesmo.

Thiagosc

louds:
O mais legal de redeploy automático com Java é que 101% dos containers e JVMs geram object leaks. Sem falar se se você usar coisas como Spring, Hibernate & cia, vai esperar um século dependendo do caso para a nova versão estar em operação.

Sorte que geralmente isso é usado num localhost quando se está em desenvolvimento e testes. Muda aqui, testa, muda ali, testa…

Falando assim até parece que isso é um problema generalizado em servidores de produção. hehehe Isso, lógico, considerando-se que o que disseste está correto.

Esse pessoal hypista quer malhar o Java de qualquer jeito. Eu me sinto moralmente obrigado a responder. :slight_smile:

Z

Tempo perdido durante o processo de desenvolvimento também é dinheiro, ou não?

Você é que é paranóico demais. Nós só estamos criticando a ferramenta que usamos todo dia e ninguém melhor pra conhecer os defeitos de Java do que quem trabalha com ela. :stuck_out_tongue:

I

Gente vcs podem me tirar a duvida em relação a estas linguagens …sendo que nao quero saber qual a melhor .

E sim qual a melhor forma de trabalhar entre a duas …qual delas ajuda a diminuir o desenvolvimento .

Uns dizem que python é melhor , outros dizem que é java ?

Gente qual a diferença entre elas ?

Agradeço a quem ajudar !

Criado 26 de julho de 2006
Ultima resposta 26 de jul. de 2006
Respostas 47
Participantes 14