Django Utilidades :: Marinho Brandaohttp://marinhobrandao.com/pt-brTue, 06 Jan 2009 06:05:24 -0000Oportunidade de trabalho para desenvolvedor Djangohttp://marinhobrandao.com/blog/p/oportunidade-de-trabalho-para-desenvolvedor-django/<p>O Sérgio Oliveira publicou a seguinte oportunidade de trabalho:</p> <blockquote> </p>A Interzone Entertainment está em busca de mais um membro para o seu time brasileiro de desenvolvedores web. No momento o time esta envolvido na integração do game Interzone Futebol com a página web <a href="http://www.interzonefutebol.com.br">http://www.interzonefutebol.com.br</a> (Django).</p> Conhecimentos requeridos: <ul> <li>Python</li> <li>Linux</li> <li>SVN</li> <li>Javascript</li> <li>HTML/CSS (W3C standards)</li> <li>SQL</li> <li>Inglês (para leitura)</li> </ul> Conhecimentos desejados: <ul> <li>Django</li> <li>Pylons</li> <li>ORMs</li> <li>JQuery</li> <li>WSGI</li> <li>PHP</li> <li>Postgres</li> <li>Shell Script</li> <li>Inglês fluente</li> </ul> <p>Sobre a Interzone Games: <a href="http://www.interzoneentertainment.com/about/">http://www.interzoneentertainment.com/about/</a></p> <p>Interessados enviem o cv para sergio.campos@interzonegames.com com o assunto "Web/Python"</p> </blockquote>Criando Aplicações Plugáveishttp://marinhobrandao.com/blog/p/criando-aplicacoes-plugaveis/<p>Nos dias 18, 19 e 20 de setembro, estive na PyCon Brasil, participando das palestras excelentes que foram apresentadas por diversas pessoas-chave em assuntos relacionados direta ou indiretamente ao Python, Django, Pylons, TurboGears, Plone, Google App Engine, Zope e outros.</p> <p>No sábado, fiz a apresentação da palestra "Django: Criando Aplicações Plugáveis" quando falei sobre a criação de aplicações reusáveis para Django.</p> <p>Segue abaixo o documento dos slides. O <strong>Scribd</strong> permite ainda que você faça download em <a href="http://www.scribd.com/document_downloads/6137369?extension=pdf">formato PDF</a>. Para isso, basta logar</p> <object codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0" id="doc_907293569706207" name="doc_907293569706207" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" align="middle" height="500" width="100%"> <param name="movie" value="http://documents.scribd.com/ScribdViewer.swf?document_id=6137369&access_key=key-lwjar4i1j6bw4qs3eat&page=&version=1&auto_size=true&viewMode="> <param name="quality" value="high"> <param name="play" value="true"> <param name="loop" value="true"> <param name="scale" value="showall"> <param name="wmode" value="opaque"> <param name="devicefont" value="false"> <param name="bgcolor" value="#ffffff"> <param name="menu" value="true"> <param name="allowFullScreen" value="true"> <param name="allowScriptAccess" value="always"> <param name="salign" value=""> <embed src="http://documents.scribd.com/ScribdViewer.swf?document_id=6137369&access_key=key-lwjar4i1j6bw4qs3eat&page=&version=1&auto_size=true&viewMode=" quality="high" pluginspage="http://www.macromedia.com/go/getflashplayer" play="true" loop="true" scale="showall" wmode="opaque" devicefont="false" bgcolor="#ffffff" name="doc_907293569706207_object" menu="true" allowfullscreen="true" allowscriptaccess="always" salign="" type="application/x-shockwave-flash" align="middle" height="500" width="100%"></embed> </object><div style="font-size:10px;text-align:center;width:100%"><a href="http://www.scribd.com/doc/6137369/Django-criando-aplicacoes-plugaveis">Django - criando aplicações plugáveis</a> - <a href="http://www.scribd.com/upload">Upload a Document to Scribd</a></div><div style="display:none"> Read this document on Scribd: <a href="http://www.scribd.com/doc/6137369/Django-criando-aplicacoes-plugaveis">Django - criando aplicações plugáveis</a> </div>Migrando do mod_python para o mod_wsgihttp://marinhobrandao.com/blog/p/migrando-do-mod_python-para-o-mod_wsgi/<div class="document"> <p>Já faz alguns meses que eu queria fazer alguns testes com o mod_wsgi, a alternativa ao mod_python que vem sendo cada vez mais comentada e sugerida na comunidade Django.</p> <p>Ontem eu aproveitei o dia tranquilo pra unir o útil ao agradável e colocar isso em prática.</p> <p><strong>O que é WSGI?</strong></p> <p>Vamos &quot;começar do começo&quot;: WSGI é mais simples do que parece, trata-se de uma interface definida pela PEP 333 <a class="footnote-reference" href="#id3" id="id1" name="id1">[1]</a> para intermediar a comunicação entre servidores web e frameworks Python. Ela surgiu pela necessidade qualquer um de nós nota com um pouco tempo: Python tem quilos de frameworksmuitas delas excelentes, e às vezes o mod_python parece ser um ornitorrinco em um ninho de coelhos quando implantamos alguns sites. É esquisito.</p> <img alt="/blog/p/diagrama_apache_wsgi_djangopng/?img=1" src="/blog/p/diagrama_apache_wsgi_djangopng/?img=1" /> <p><strong>Mudando para o mod_wsgi</strong></p> <p>Para usar o WSGI puramente, é bastante simples, vamos fazer um pequeno script para ilustrar</p> <pre><code>def application(environ, start_response): status_code = '200 OK' headers = [('Content-Type', 'text/html')] start_response(status_code, headers) return ['So <b>testando</b>!'] from paste import httpserver httpserver.serve(application, port='8000')</code></pre><p>Ao executar este script minúsculo e carregar em seu navegador a URL &quot;<a class="reference" href="http://localhost:8000">http://localhost:8000</a>&quot;, será exibido &quot;So <strong>testando</strong>&quot;. Simples não? Veja</p> <pre><code>$ python my_app.py serving on http://127.0.0.1:8000</code></pre><img alt="/blog/p/teste_wsgigif/?img=1" src="/blog/p/teste_wsgigif/?img=1" /> <p>No Django, a coisa exige só um pouco mais de detalhes, mas nada complexo. Como já explanado há poucos dias pelo Eric, da Metaphormedia, em <a class="footnote-reference" href="#id4" id="id2" name="id2">[2]</a>, é recomendável que se crie dentro de seu projeto uma pasta &quot;apache&quot; com um script dentro chamado &quot;django.wsgi&quot; - estes nomes são escolha sua, mas eles têm sido usados por mais de uma referência. Com o conteúdo abaixo (modificado segundo as suas necessidades)</p> <pre><code>#!/usr/bin/env python import os, sys sys.path.insert(0, os.path.abspath(os.path.dirname(__file__)+'/../')) os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' import django.core.handlers.wsgi application = django.core.handlers.wsgi.WSGIHandler()</code></pre><p>E configure seu apache, removendo o código que implementa o mod_python e adicionando o seguinte</p> <pre><code>WSGIScriptAlias / /caminho/do/seu/projeto/apache/django.wsgi</code></pre><p>Agora, para funcionar, é preciso que seu sistema operacional tenha o <strong>mod_wsgi</strong> instalado. No Ubuntu/Debian você instala com o seguinte comando</p> <pre><code>$ sudo apt-get install libapache2-mod-wsgi</code></pre><p>Pronto, ao reiniciar o Apache, seu projeto estará lá, bonitão, rodando através do WSGI :)</p> <p><strong>Porque mod_wsgi?</strong></p> <p>Bom, essa deve ser a pergunta que você deve estar se fazendo. Se o mod_python sempre foi a alternativa recomendada e funciona bem, porque mudar para o mod_wsgi?</p> <p>O mod_wsgi tem se comportado mais escalável que o mod_python. Por escalabilidade, entende-se a capacidade de um site de suportar o crescimento de uso sem perder a performance ou travar.</p> <p>Ao ajustar um servidor para usar o mod_wsgi, pude notar essas diferenças. Elas não são tão grandes que se possa perceber com um simples teste com Apache Bench. É necessário forçar para notar a diferença, que tem sido até 10% superior.</p> <p>Esse servidor que usei para fazer esses testes é uma VM (em Xen) com 512MB de RAM, rodando em um amd64, numa rede bastante estável, em Londres, enquanto que o Apache Bench foi executado em minha máquina.</p> <p>Veja abaixo como os dois modos se comportaram:</p> <p>Para compreender a legenda, o número após o &quot;n&quot; trata-se da quantidade de requisições enviadas e o número após o &quot;c&quot; trata-se da quantidade de requisições concorrentes, ou seja, &quot;n1000c5&quot; equivale a &quot;1000 requisições enviadas de 5 em 5).</p> <p><strong>Tempo de resposta por requisição</strong></p> <img alt="/blog/p/tempo_de_resposta_por_requisicaopng/?img=1" src="/blog/p/tempo_de_resposta_por_requisicaopng/?img=1" /> <p><strong>Requisições por segundo</strong></p> <img alt="/blog/p/requisicoes_por_segundopng/?img=1" src="/blog/p/requisicoes_por_segundopng/?img=1" /> <p><strong>Load de 1 minuto</strong></p> <img alt="/blog/p/load_de_1_minutopng/?img=1" src="/blog/p/load_de_1_minutopng/?img=1" /> <p><strong>Load de 5 minutos</strong></p> <img alt="/blog/p/load_de_5_minutospng/?img=1" src="/blog/p/load_de_5_minutospng/?img=1" /> <p><strong>RSS / Memória real ocupada</strong></p> <img alt="/blog/p/rss_memoria_ocupadapng/?img=1" src="/blog/p/rss_memoria_ocupadapng/?img=1" /> <p><strong>Percentual da CPU</strong></p> <img alt="/blog/p/percentual_da_cpupng/?img=1" src="/blog/p/percentual_da_cpupng/?img=1" /> <p><strong>Conclusões</strong></p> <p>Todos os números apresentados acima não podem ser tomados como base exata para comparação, por alguns motivos, como a influência que o teste anterior efetua no subsequente, a oscilação da internet e a influência de outros processos.</p> <p>Eu fiz questão de usar um servidor em produção onde está sendo servido um outro sistema da empresa, que mesmo que não estivesse em seu horário de pico, era usado normalmente por alguns usuários.</p> <p>Há ainda toda a questão de controvérsias em torno do uso real da CPU e da memória.</p> <p>Mas dá pra notar uma realidade clara: o mod_swgi se mostra mais vantajoso em memória e tempo de resposta. Não esqueçamos que 200 requisições concorrentes para um VPS com 512MB de RAM é uma senhora carga, equivalente a alguns milhões de pageviews por mês.</p> <p>No teste de 2000 requisições a 200 concorrentes, ficou visível que a configuração de MaxRequestsPerChild (de 1000) entrou em cena e fez diferença no desempenho, tanto para segurar a carga quando para mudar um pouco a evolução do desempenho.</p> <p>Por fim, devo avisar que no teste seguinte, de 5000 requisições a 200 concorrentes, o Apache caiu antes de completar 3000, em 3 tentativas.</p> <p>Mais detalhes sobre o WSGI podem ser encontrados em [4], [5] e [6]</p> <p><strong>Links relacionados</strong></p> <table class="docutils footnote" frame="void" id="id3" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id1" name="id3">[1]</a></td><td><a class="reference" href="http://www.python.org/dev/peps/pep-0333/">http://www.python.org/dev/peps/pep-0333/</a></td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="id4" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a class="fn-backref" href="#id2" name="id4">[2]</a></td><td><a class="reference" href="http://www.ericholscher.com/blog/2008/jul/8/setting-django-and-mod_wsgi/">http://www.ericholscher.com/blog/2008/jul/8/setting-django-and-mod_wsgi/</a></td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="id5" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a name="id5">[3]</a></td><td><a class="reference" href="http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango">http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango</a></td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="id6" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a name="id6">[4]</a></td><td><a class="reference" href="http://www.slideshare.net/hdiogenes/wsgi-a-resposta-para-a-questo-definitiva-sobre-python-a-web-e-tudo-mais-368429?src=embed">http://www.slideshare.net/hdiogenes/wsgi-a-resposta-para-a-questo-definitiva-sobre-python-a-web-e-tudo-mais-368429?src=embed</a></td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="id7" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a name="id7">[5]</a></td><td><a class="reference" href="http://en.wikipedia.org/wiki/Wsgi">http://en.wikipedia.org/wiki/Wsgi</a></td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="id8" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a name="id8">[6]</a></td><td><a class="reference" href="http://www.wsgi.org/wsgi/">http://www.wsgi.org/wsgi/</a></td></tr> </tbody> </table> <table class="docutils footnote" frame="void" id="id9" rules="none"> <colgroup><col class="label" /><col /></colgroup> <tbody valign="top"> <tr><td class="label"><a name="id9">[7]</a></td><td><a class="reference" href="http://del.icio.us/marinho/wsgi">http://del.icio.us/marinho/wsgi</a></td></tr> </tbody> </table> </div> Yadsel - Statushttp://marinhobrandao.com/blog/p/yadsel-status_89/Bom, muita correria nos últimos dias. Pouco tempo para publicar qualquer coisa, mas o Yadsel, o Guia de Django e o Adorador.es estão vivos como nunca. Neste momento a prioridade é o <a href="http://code.google.com/p/yadsel/">Yadsel</a>, por motivos de urgência em alguns aplicativos reais, em produção. O Guia segue caminhando para a conclusão e já com alguns contatos sobre publicação em curso. O <a href="http://adorador.es">Adorador.es</a> também está de pé, esperando tempo hábil para atualização da versão 0.3. O Yadsel ainda está registrado como versão <strong>0.1-unstable</strong>. Ainda que o nome impressione imaturidade, o software está caminhando para uma relativa maturidade, essencialmente sobre o driver de <strong>Firebird</strong>. Os drivers para MySQL e SQLite também foram melhorados e foi introduzido o driver para MSSQL (SQL Server). O foco é deixar toda a framework e core API maduras e partir daí para atacar os drivers em andamento, sempre preocupado com cases reais, nunca com teorias. A arquitetura está muito boa, minha impressão é de que superamos as espectativas, pois todas as manutenções necessárias até agora foram extremamente simples e claras, e o software está com uma performance também melhor que o esperado. Destaques das últimas tarefas efetuadas: <strong>yadseltool</strong> <ul> <li>para sistema operacional Windows, agora ofecere um executável standalone para poder ser embutido em aplicações sem necessidade da máquina virtual.</li> <li>melhorado toda a forma de interpretar os argumentos, agora em forma de atribuição.</li> <li>oferece agora 4 modos: hidden (persiste sem exibir mensagens), output (apenas escreve o script na tela, sem persistência), steps (persiste exibindo uma mensagem de progresso a cada etapa), interactive (confirma cada etapa antes de persistir - não implementado ainda)</li> <li>agora suporta modo de teste - sem persistência</li> <li>agora suporta controle do histórico embutido</li> </ul> <p align="center"><a href="http://marinho.webdoisonline.com/blog/wp-content/uploads/2007/08/yadseltool1.png" title="yadseltool"><img src="http://marinho.webdoisonline.com/blog/wp-content/uploads/2007/08/yadseltool1.thumbnail.png" alt="yadseltool"></a></p> <p align="left">&nbsp;</p> <p align="left"><strong>HistoryControl</strong></p> <p align="left">Recurso para embutir controle das atualizações. Antes este controle era feito externamente, pelo utilizador.</p> <p align="left">&nbsp;</p> <p align="left"><strong>PartialVersions</strong></p> <p align="left">Foi implementado o recurso de partial versions - conceito semelhante ao PartialClass, do Delphi - através do qual se pode quebrar uma só versão em várias classes e arquivos, juntando tudo numa Version só. Muito bom para situações de script completo ou grandes modificações.</p> <p align="left">&nbsp;</p> <p align="left"><strong>ZipFile</strong></p> <p align="left">O suporte a arquivos ZIP como repositório das versões foi liberado e será até mesmo recomendado, dado que é mais seguro e limpo.</p> <p align="left">&nbsp;</p> <p align="left"><strong>DocTests</strong></p> <p align="left">Alguns doctests foram criados para automatizar os testes de funcionalidades básicas:</p> <p align="left">&nbsp;</p> <ul> <li>PartialVersions</li> <li>Persistencia</li> <li>ZipFiles</li> </ul> <strong>GTKYadsel</strong> Uma ferramenta de manutenção de projetos foi criada para auxiliar o desenvolvedor e, num futuro ideal, tornar desnecessário o conhecimento de programação a quem for construir modelos de banco. Esta ferramenta trabalho no sentido de construir projetos e dar a ele uma ou mais conexões, ao qual também se pode adicionar versões e editar em um editor com highlight de sintaxe. Evidentemente, funciona melhor no Linux, mas a screenshot abaixo, tirada sob o Windows, demosntra que ele pode ser eficaz em qualquer ambiente. Ainda não está bom o suficiente para recomendar o uso, mas eu já o uso normalmente. <p align="center"><a href="http://marinho.webdoisonline.com/blog/wp-content/uploads/2007/08/gtk_yadsel1.png" title="GTKYadsel"><img src="http://marinho.webdoisonline.com/blog/wp-content/uploads/2007/08/gtk_yadsel1.thumbnail.png" alt="GTKYadsel"></a></p> <strong>FullVersionBuilder</strong> Por fim, este também é um recurso cada vez mais estável. A versão completa de um dos casos reais onde o Yadsel é utilizado foi toda gerada a partir deste, com pequenos ajustes posteriores relacionados a valores DateTime. <strong>Conclusão</strong> Como podem ver, o Yadsel caminhou a passos largos. O tempo disponível não é grande, é realmente curto, mas está indo muito bem. Espero soltar a versão 0.2-stable rapidamente, ainda esta semana provavelmente. Boa sorte para todos nós!Vagas na Visiehttp://marinhobrandao.com/blog/p/vagas-na-visie_79/A <a href="http://visie.com.br/"><strong>Visie</strong></a> está precisando de gente que domine Python, Ruby e PHP. Se quiser dar uma olhada, clique <a href="http://visie.com.br/blog/ha-vagas-na-visie">aqui</a>.DBMigrations será YADSELhttp://marinhobrandao.com/blog/p/dbmigrations-sera-yadsel_76/O project <a href="http://code.google.com/p/dbmigrations/">DBMigrations</a> terá o nome definitivo de <a href="http://code.google.com/p/yadsel/"><strong>"yadsel"</strong></a>, sigla de "Yet Another Database Schema Evolution Library". O motivo para eu tomar esta decisão se deve ao fato de que o nome antigo era provisório e também porque descobri que já existia <a href="http://www.aswmc.com/dbmigration/">um projeto com o mesmo nome</a>.DBMigrations 0.1http://marinhobrandao.com/blog/p/dbmigrations-01/A versão 0.1 do <strong>DBMigrations</strong> já está disponível [1]. Muito distante do que o que o escopo propõe [2], mas já me serve e deve servir para você também. Esta versão oferece: <ul> <li>CoreAPI num nível bem avaçando; [3]</li> <li>MySQL Driver; [4]</li> <li>SQLite Driver; [5]</li> <li>Driver genérico, para implementar ANSI SQL / SQL-99 [6]</li> <li>Alguns exemplos e testes, bem tímidos, mas podem ser úteis [7]</li> </ul> A novidade é que o Andrews [8] entrou no projeto e vai cuidar dos drivers de Oracle e Postgres. O próximos passos serão: <ol> <li>Efetuar conexão e rodar o script gerado na sequencia certa;</li> <li>Implementar a funcionalidade de gerar o script da primeira versão a partir de um banco existente (desafio);</li> <li>Disponibilizar um driver pra Django, o mais transparente possível;</li> <li>além, é claro do que a participação do Andrews e mais alguém gerir :)</li> </ol> <strong>Links relacionados:</strong> <ol> <li><a href="http://code.google.com/p/dbmigrations/">http://code.google.com/p/dbmigrations/</a></li> <li><a href="http://code.google.com/p/dbmigrations/wiki/Tasks">http://code.google.com/p/dbmigrations/wiki/Tasks</a></li> <li><a href="http://code.google.com/p/dbmigrations/wiki/CoreAPI">http://code.google.com/p/dbmigrations/wiki/CoreAPI</a></li> <li><a href="http://code.google.com/p/dbmigrations/wiki/MySQLDriver">http://code.google.com/p/dbmigrations/wiki/MySQLDriver</a></li> <li><a href="http://code.google.com/p/dbmigrations/wiki/SQLiteDriver">http://code.google.com/p/dbmigrations/wiki/SQLiteDriver</a></li> <li><a href="http://code.google.com/p/dbmigrations/wiki/GenericDriver">http://code.google.com/p/dbmigrations/wiki/GenericDriver</a></li> <li><a href="http://dbmigrations.googlecode.com/svn/trunk/examples/">http://dbmigrations.googlecode.com/svn/trunk/examples/</a></li> <li><a href="http://pyman.blogspot.com/">http://pyman.blogspot.com/</a></li> </ol>DBMigrationshttp://marinhobrandao.com/blog/p/dbmigrations/Publiquei a seguinte mensagem nas listas <strong>python-brasil</strong> e <strong>django-brasil</strong>: <pre>Saudações! senhores, como eu havia comentado há uns dias atrás, estive trabalhando em um "migrations" para um projeto em Django e outro em Delphi. criei então o DBMigrations (ainda não tive idéia para um nome melhor), que é basicamente uma ferramenta que pode ser usada como executável ou como modulo de um software em Python, para controle de evolução de bancos de dados, sob a LGPL, e independente de ORMs e SGBDs e que possa ser útil para projetos feitos em outras linguagens. a notação é mais ou menos semelhante ao Active Record Migrations, do Rails. ele fornece um grupo de classes (uma espécie de API), que é interpretada por um driver (por enquanto somente o MySQL está implementado, os proximos serão o Firebird e o SQLite), e este driver aplica as especificidades de cada SGBD. da forma como ficou estruturado, ele permite que sejam criados drivers para ORMs, como Django, SQLAlchemy ou SQLite, etc. a primeira versão (0.1) ainda não foi devidamente testada, pois irei utiliza-la oficialmente amanhã, numa virada de versão. E ainda não suporta stored procs, triggers, views, sequences ou indices (este ultimo não concluído). o repositório do projeto é: <a href="http://code.google.com/p/dbmigrations/" target="_blank">http://code.google.com/p/dbmigrations/</a> quem gostar da idéia e tiver interesse em participar, principalmente criando drivers, será bem-vindo :) espero que seja útil.</pre>É “identado” ou “edentado”?http://marinhobrandao.com/blog/p/e-identado-ou-edentado_49/O assunto rendeu debate por aqui. A <a href="http://pt.wikipedia.org/wiki/Identa%C3%A7%C3%A3o">Wikipedia diz que ambas as formas estão corretas</a>. E ainda estou com a pulga atrás da orelha... Mas o que importa é que o <strong>Python</strong> é uma linguagem <strong>semântica</strong>, que obriga o desenvolvedor a <strong>organizar seu código</strong> atravás da <strong>edentação</strong>. E você, o que me diz? Identação ou edentação?Python: agilidade e robustezhttp://marinhobrandao.com/blog/p/python-agilidade-e-robustez_48/Montei esta apresentação para um seminário que teremos no sábado e achei que pode ser de seu interesse. <p align="center"><a href="http://marinho.files.wordpress.com/2007/05/python-agilidade-e-robustez.pdf"><img src="http://marinho.files.wordpress.com/2007/05/python_pdf.jpg" alt="Python - Apresentação em PDF"></a> <a href="http://marinho.files.wordpress.com/2007/05/python-agilidade-e-robustez.pdf" title="Python - Agilidade e Robustez">Python - Agilidade e Robustez</a> A finalidade é mostrar o que é o <strong>Python</strong>, dar uma primeira pitada sobre o <strong>Django</strong> e argumentar porque eu acredito que o futuro reserva uma boa posição para quem adotá-las. Boa leitura.</p>OpenID: de onde vem e para onde vai?http://marinhobrandao.com/blog/p/openid-de-onde-vem-e-para-onde-vai/Como (nem todos nós sabemos) o <strong>OpenId </strong>tem caminhado lentamente mas tem conquistado sólidos apoios, e aos poucos vai conseguindo atingir seu objetivo. Para quem ainda não sabe do que se trata, o OpenId é um projeto criado pelos caras do <strong><a href="http://livejournal.com" target="_blank">LiveJournal</a></strong> que tem a finalidade de unificar contas de acesso espalhadas na rede em uma identificação única por usuário, possibilitando que este se passe por facetas diferentes, segundo a sua preferência. Digamos que é paradoxalmente uma forma descentralizada de centralizar a identificação do usuário. Este modelo apresenta muitas vantagens e desafios novos, assim como perguntas desconfiadas como: <strong>"será que isso é confiável?"</strong>, que é uma questão que deve ser conferida ao seu servidor do OpenId, já que o projeto apenas especifica as metas e o protocolo, mas quem os implementa são servidores espalhados pelo mundo. E assim, como poucos sabem, se você já possui uma conta no <a href="http://wordpress.com"><strong>WordPress</strong></a>, a sua url (sim, da mesma forma que a minha é <strong>http://marinho.wordpress.com</strong>) é uma identificação para OpenId. Atualmente o serviço mais conhecido de servidor de identificações é o <a href="http://myopenid.com"><strong>MyOpenID</strong></a>. Acontece que, como toda idéia recém-nascida, o projeto depende de ser implementado, preferencialmente por grandes empresas (leia-se Google, Microsoft, Yahoo e mais uma meia-dúzia de mega-corporações) para que se alavanque. O <a href="http://technorati.com/weblog/2006/10/144.html" target="_blank">primeiro serviço popular a adotá-lo</a> além dos criadores foi o <a href="http://technorati.com"><strong>Technorati</strong></a> - o que não é nenhuma novidade porque aqueles meninos adoram uma inovação, e eles geralmente acertam na mosca. Depois foi a vez de ver o <a href="http://zoomr.com" target="_blank">Zoomr</a> e o <a href="http://wordpress.com" target="_blank">WordPress</a>, mas nada ainda se compara ao anúncio da <a href="http://brad.livejournal.com/2287909.html" target="_blank">Microsoft de que passaria a apoiá-lo</a>, o que levou a marca do projeto a vários noticiários mais populares do meio tecnológico e acabou incentivando muitas pessoas a conhecê-lo e adotá-lo. Já é possível pesquisar em um <a href="http://openiddirectory.com/" target="_blank">diretório</a>, quais são os serviços da rede que suportam o protocolo e esta lista aumenta cada dia mais, e as incertezas vão sendo sanadas aos poucos, à medida que a idéia é compreendida por mais pessoas. E para a nossa alegria, já existe uma forma (muito fácil, como tudo o que envolve o framework) de se implementar OpenId no Django que você pode encontrar nos endereços abaixo: <ul> <li><a href="http://simonwillison.net/2007/Apr/24/openidconsumer/" target="_blank">Implementando OpenID com o Django</a></li> <li><a href="http://code.google.com/p/django-openid/" target="_blank">Projeto django-openid</a></li> <li><a href="http://www.openidenabled.com/openid/libraries/python" target="_blank">Projeto python-openid</a></li> </ul> Para mais informações: <ul> <li><a href="http://openid.net/" target="_blank">Site oficial do projeto</a></li> <li><a href="http://www.openidenabled.com/" target="_blank">OpenIdEnabled</a></li> <li><a href="http://openid.net/specs.bml" target="_blank">Especificações para implementação de OpenId</a></li> </ul>“Não aguento mais Java”http://marinhobrandao.com/blog/p/nao-aguento-mais-java_44/Bom, antes que derramem em cima de mim toda a fúria religiosa pró-Java, vou me explicando: este post é apenas um resumo de algumas mensagens na lista <a href="http://br.groups.yahoo.com/group/python-brasil/" target="_blank">Python-Brasil</a>, que podem ser vistas em sua totalidade <a href="http://br.groups.yahoo.com/group/python-brasil/message/23803" target="_blank">aqui</a>. Mas a minha opinião está bem próxima da média vista abaixo. <strong>decopzp:</strong> " A galera nas faculdades no meio de programação so fala em Java. Queria saber como começar a aprender Python, gostei muito só que estou com algumas duvidas em relação a classes methodos e etc...Na verdade que saber tudo como fazer o que fazer...Não aguento mais java" <strong>Luciano Ramalho: </strong>"Em Java, existe uma aberração sintática chamada "inner classes" que foi parida para suprir a grotesca falta de um jeito de se passar funções como parâmetros. Apenas uma das diversas falhas gritantes de projeto da linguagem Java. Mas é uma ótima linguagem para quem está em busca de um emprego chato. Agora sério: Java é um excelente substituto para C++. Empresas e instittuições que antes desenvolviam em C++ agora têm uma alternativa mais segura e confiável para seus projetos. Faz todo o sentido a Apache Foundation e a IBM usarem Java, por exemplo. O grande erro que muitas empresas no mercado estão cometendo é substituir linguagens de mais alto nível por Java, e achando que a queda de produtividade é apenas passageira, enquanto a equipe não ganha fluência na linguagem." <strong> Rodrigo Senra:</strong> " No contexto particular de ensino *introdutório* de programação, eu diria que Java como primeira linguagem é no mínimo nocivo. <em>&gt; Java está na moda.</em> Piercing também está. Fumar já esteve na moda. Particularmente eu não sou um cara que liga para a moda. Prefiro mais a média, ou até mesmo a mediana ;o) Em suma, o fato de Java estar na moda para mim só não é irrelevante porque me atrapalha. Atrapalha pois tenho que convencer semi-leigos de que o fato de Java estar na moda é irrelevante ;o) Eu não digo para o Padre qual vai ser o sermão, eu não digo para o padeiro como fazer o pão nem para o médico qual o tratamento que quero receber antes dele dar o diagnóstico. O computeiro, apesar do nome cacofônico, merece respeito. Uma tecnologia ditada pela moda, e não fundamentada pela análise prática e teórica, é uma falta de respeito para a nossa classe. <em>&gt; Ela é uma otima linguagem</em> Aqui concordo, ela tem seu nicho e suas vantagens. E ainda é melhor que *muita* linguagem por aí. <em>&gt; Vamos com calma. Python está sendo usada em cursos &gt; introdutorios de programação pois é uma linguagem de fácil acesso... &gt; mas isso nao quer dizer que seja a melhor linguagem do mundo.</em> Melhor é um conceito extremamente dependente de contexto. No contexto de ensino introdutório, ainda não vi nada melhor do que Python." <strong>Luciano Ramalho:</strong> "tenho plena consciência de que existem milhões de programadores brilhantes que preferem Java. Mas eu não resisto a uma oportunidade de criticar o Java, exatamente porque "está na moda". Isso tem duas consequências lamentáveis, a meu ver: (1) muitos gerentes que não sabem distinguir uma referência de um ponteiro escolhem Java para projetos que poderiam ser muito melhor resolvidos em PHP, Python, Ruby, Perl, VBScript etc, e acabam submetendo equipes inteiras de desenvolvedores a uma linguagem e uma API que são otimizadas para projetos imensos e complexos, e consequentemente acabam induzindo projetos pequenos e simples a ficarem imensos e complexos também. (2) é tão sofrido aprender e ficar produtivo em Java que muitos de programadores estão ficando sem vontade de aprender uma segunda, terceira ou quarta linguagem, com medo de passar pelo mesmo calvário de novo; pior, depois de suar tanto a camisa para aprender Java, muitos se convencem de que complexidade == qualidade, e que uma linguagem mais fácil de usar, como Python, tem que ser necessariamente inferior ou mais limitada, o que absolutamente não é verdade." <strong>Luciano Ramalho:</strong> " <em>&gt; E como ensinar herança múltipla, sobrecarga de operadores e tipagem &gt; dinâmica em uma linguagem que não os suporta/não os tem?</em> Sua lista de conceitos de OO está contaminada por uma perspectiva javista, Gleidson. Smalltalk, a primeira e até hoje uma das melhores linguagens orientadas a objeto já criadas tem tipagem dinâmica e não tem interfaces. C++ tem sobrecarga de operadores e não tem interfaces. Ninguém pode dizer que Smalltalk e C++ não são exemplos de linguagens orientadas a objetos (*). Enfim, o que é essencial em uma linguagem orientada a objetos? A resposta não é simples, nem única. <em>&gt; A questão do Java é meio que a popularidade dele.</em> Sim, é o que eu tenho dito: a popularidade do Java é ao mesmo tempo sua maior virtude e seu maior defeito. O defeito está no fato de qua a "popularidade" está levando milhares de empresas a usarem Java para desenolver aplicações que seriam feitas de forma muito mais simples com uma linguagem mais ágil, como Python, Ruby, Perl ou até mesmo PHP e VBScript. <em>&gt; É fácil achar um &gt; computador que tenha um ambiente java instalado. Agora vai achar um que &gt; tenha o python instalado pra poder rodar os programas?</em> A Microsoft parou de distribuir Java com o XP, lembra? Há anos o Java perdeu a vantagem de sair pré-instalado em milhões de máquinas Windows. No Linux, praticamente qualquer distribuição vem com Python, mas não com Java. E no MacOS X vem as duas. <em>&gt; Fora que em Python não é compilado, então tens que &gt; dar o código-fonte para que alguém possa rodar seu programa.</em> Não é verdade. Python é compilado para um bytecode, assim como o Java. E eu posso distribuir este bytecode em vez do fonte. Mas existem ferramentas capazes de regenerar o código-fonte a partir do bytecode, tanto no caso do Java quanto no caso do Python. De qualquer forma, para 90% dos desenvolvedores essa questão é irrelevante, porque não somos pagos para produzir software proprietário que vai ser vendido em caixinhas, e sim para desenvolver soluções customizadas para clientes, internos ou externos, que exigem o fonte de qualquer maneira." <strong>Luciano Ramalho:</strong> " <em>&gt; Ninguém pode dizer que Smalltalk e C++ não são exemplos de linguagens &gt; orientadas a objetos (*).</em> Faltou explicar o (*)... O Alan Kay, líder da equipe que criou Smalltalk, uma vez disse: <strong>"I invented the term Object-Oriented, and I can tell you I did not have C++ in mind."</strong> "Eu inventei o termo Orientado a Objetos, e posso lhe dizer que não estava pensando em C++." Se tem alguém que pode dizer o que é ou deixa de ser OO, é o Alan Kay." <strong> Luciano Ramalho: </strong>"Gleidson, talvez vc não saiba ou passou batido, mas interfaces são uma gambiarra no java para fornecer herança multipla. A unica coisa que é bom em interfaces é que elas fornecem duck typing para java, o que não é necessario em python justamente por causa da tipagem dinamica." <strong>PS: </strong>bom, só pra não deixar em branco, estas frases foram tiradas de uma discussão na lista de Python, e eu destaquei as argumentações <strong>pró-Python</strong>, porque evidentemente sou usuário e divulgador desta linguagem. As pessoas citadas acima disseram estas frases no contexto de forma muito ponderada, e obviamente não podem ser mal-interpretadas (da mesma forma que deve acontecer com comunidades de quaisquer outra linguagens). <strong>Na minha opinião, a informática é uma ciência que oferece ferramentas para facilitar o dia-a-dia. E ferramentas são assim: uma hora você precisa do martelo, outra hora do porrete, o martelo sozinho não resolve as coisas, ele precisa de um prego, uma tábua e do principal: o carpiteiro. Um carpinteiro qualificado saberia fazer com o martelo o mesmo que se faria com o porrete, e vice-versa, porque ele está preparado pra fazer aquilo.</strong> Outra metáfora que pode ilustrar aqui é o de comparar um <strong>sedã</strong>, uma <strong>scania</strong> e um <strong>trator</strong>. Digamos que o <strong>Python</strong> seja o sedã, o <strong>Java</strong> seja a scania e o <strong>C</strong> seja o trator: cada um tem sua <u>aplicabilidade</u>.PythonWare usa Djangohttp://marinhobrandao.com/blog/p/pythonware-usa-django_38/Tive uma grata surpresa ontem ao notar que o <a href="http://www.pythonware.com/" target="_blank">site da PythonWare</a> foi migrado para <strong>Django</strong>.O que falta ao Rails e ao Django para o cheque-matehttp://marinhobrandao.com/blog/p/o-que-falta-ao-rails-e-ao-django-para-o-cheque-mat/Nos últimos meses temos visto uma locomotiva atropelar paradigmas antigos, linguagens "perfeitas" e conceitos tidos como clássicos. Na verdade a locomotiva já existia há tempos... o que faltava eram os trilhos. Pois agora não falta mais: o Ruby on Rails é a grande coisa dos últimos anos em assunto de programação e deve permanecer assim por bastante tempo. Com a mesma disposição - mesmo que em doses leves - a cobrinha do Python vem "picando" uma boa parcela do mercado há anos, tanto que pouco percebem que ela já está em todo lugar, seja com o aclamado Ubuntu, seja nos bastidores do Google e do YouTube, seja nas manchetes da Microsoft. Ela está lá, criaram uma pista de dança e botaram a cobra pra dançar, e como ela dança bem, aos passos de Django. Estamos vivendo hoje um período muito semelhante ao de cerca de 10 anos atrás, quando o Java aparecia e o C# era anunciado no Slashdot, pela primeira vez, mas Ruby e Python possuem uma qualidade que Java e .Net não possuem: elas se amam. Enquanto a maioria dos "embates" sobre Java e .Net terminam com alguns mortos e muitos feridos, Ruby e Python sempre terminam com lições apreendidas e trocas de elogios. É a maturidade no ambiente do desenvolvimento. E, é claro, existe espaço também para o Java, o C#, o PHP, etc... Pois bem, mas então, se a sentença já está dada, porquê essa constância em afirmá-la? A resposta é simples: <strong>porque não há sentença</strong>, nada está garantido. Da mesma forma que há 10 anos atrás, o momento é de suposições - bem embasadas, é claro - mas ainda há muito caminho a trilhar (e muita música pra dançar). E existem algumas características, digamos "básicas", que estas duas maravilhas frameworks precisam conquistar, para que convençam nossos patrões de que elas são eficazes como cantamos a todo momento. Portanto, bolei a lista abaixo com o que eu acredito ser o que falta para o Rails e para o Django - observando que sou um "djanger" falando sobre Rails, portanto, qualquer deslize, o espaço para comentários abaixo é ilimitado e democrático, ok? <strong>O que falta no Django</strong> <ul> <li>atualização do banco, através de controle de versões;</li> <li>suporte a alguns SGBDs "coringas" do mercado <ul> <li>SQL Server (não me fale de adodb que me dá calafrios)</li> <li>Oracle</li> <li>DB2</li> <li>Firebird</li> </ul> </li> <li>um pouco mais de clareza sobre o MVC (o mercado adora patterns);</li> <li>uma definição melhor sobre widgets e forms em ajax - o newforms foi uma evolução, mas está longe de ser um <a href="http://www.ajaxscaffold.com" target="_blank">AjaxScaffold</a>;</li> <li>melhor suporte a SOAP;</li> <li>um repositório de contribs <em>à là</em> <a href="http://www.railslodge.com/" target="_blank">RailsLodge</a> ou <a href="http://www.codeplex.com/" target="_blank">CodePLex</a>;</li> <li>uma maior comunidade brasileira;</li> </ul> <strong>O que falta no Rails</strong> <ul> <li>compilação em <em>bytecode</em>, para proteção do código;</li> </ul> <strong>O que falta nos dois</strong> <ul> <li>um gerador de relatórios;</li> <li>grandes cases;</li> <li>um bom recurso para chamadas SQL de valores agregados (sum, avg, min, max, count) e agrupados (group by);</li> <li>um bom recurso para chamadas SQL de união (union);</li> <li>planos de hospedagem em provedores mais populares, como a <a href="http://www.locaweb.com.br" target="_blank">LocaWeb</a>, por exemplo;</li> </ul> Bom, como você pode ver, eu tenho mais a dizer sobre o Django do que sobre o Rails, mas mesmo que eu fosse expert nos dois, é explícito que o Rails está alguns passos à frente (ainda que "explícito" seja uma característica mais marcante no Django do que no Rails), mesmo que o Django venha evoluindo rapidamente. Uma afirmação que não posso deixar passar vagamente, é que nossa comunidade <a href="http://www.djangobrasil.org" target="_blank">Django Brasil</a>, está funcionando cada vez melhor em seu <a href="http://groups.google.com/group/django-brasil" target="_blank">embrião</a>, portanto, ela precisa crescer, mas ela está cada dia mais ativa. Por fim, acho que está bem claro que temos muito trabalho pela frente, mas contando com as duas frameworks que temos em mãos, o trabalho é bem mais gostoso e rápido do que seria antigamente! <a href="http://simplesideias.com.br/ganhe-o-livro-repensando-a-web-com-rails/" target="_blank"><strong>Update:</strong> este artigo está concorrendo um livro sobre Rails, que o <strong>Nando Vieira</strong> está promovendo em seu <strong>SimplesIdeias.com.br</strong></a>