<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BernardoFontes.net</title>
	<atom:link href="http://www.bernardofontes.net/blog/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bernardofontes.net/blog</link>
	<description>Tecnolgia - Desenvolvimento Ágil - Comunidade</description>
	<lastBuildDate>Tue, 08 May 2012 03:14:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Autenticando o seu usuário Django pelo Facebook</title>
		<link>http://www.bernardofontes.net/blog/autenticando-o-seu-usuario-django-pelo-facebook/</link>
		<comments>http://www.bernardofontes.net/blog/autenticando-o-seu-usuario-django-pelo-facebook/#comments</comments>
		<pubDate>Tue, 08 May 2012 03:10:29 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[apis]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=439</guid>
		<description><![CDATA[Essa semana tive que fazer uma integração com a API de autenticação do Facebook e fiz uma pesquisazinha. Dei de cara com esse post que fazia uma comparação entre quatro ferramentas. Assim como o post, fiquei entre o django-allauth e o django-social-auth. Testei somente o segundo e ele coube como uma luva para o que [...]]]></description>
			<content:encoded><![CDATA[<p>Essa semana tive que fazer uma integração com a <a href="https://developers.facebook.com/docs/authentication/">API de autenticação do Facebook</a> e fiz uma pesquisazinha. Dei de cara com <a href="http://hackerluddite.wordpress.com/2011/05/17/review-of-4-django-social-auth-apps/" target="_blank">esse post</a> que fazia uma comparação entre quatro ferramentas. Assim como o post, fiquei entre o <a href="https://github.com/pennersr/django-allauth" target="_blank">django-allauth</a> e o <a href="http://django-social-auth.readthedocs.org/en/latest/index.html" target="_blank">django-social-auth</a>. Testei somente o segundo e ele coube como uma luva para o que eu necessitava &#8211; autenticar com o Facebook e manter a autenticação padrão do Django ativa.</p>
<p>Como não achei nada na internet que fosse resumido e focado para a autenticação com o Facebook utilizando essa app, resolvi fazer esse post para compartilhar a experiência. Então vou fazer um passo-a-passo aqui do que tive que fazer para completar a integração (que foi bem simples, diga-se de passagem).</p>
<h3>Passo 1: READ THE DOCS!</h3>
<p>Mesmo sendo algo simples e utilizando uma app para fazer a autenticação, você ainda tem a obrigação de ler a documentação do que trata a autenticação com o Facebook. Não adianta nada usar uma lib sem saber o que ela resolve por baixo dos panos. Aconselho a ler, pelo menos, a página que fala do <a href="https://developers.facebook.com/docs/authentication/server-side/" target="_blank">fluxo da autenticação</a> e da lista de <a href="https://developers.facebook.com/docs/authentication/permissions/" target="_blank">permissões adicionais</a>.</p>
<h3>Passo 2: Configurar o seu projeto com o django-social-auth</h3>
<p>Essa parte é muito simples. Tudo que você precisa fazer é instalar a app e configurá-la. Para instalar a app e as suas dependências, basta executar:</p>
<blockquote><p>pip install django-social-auth</p></blockquote>
<p>Depois disso, só precisamos configurar o <strong>settings.py</strong> e o <strong>urls.py</strong> da seguinte maneira:<br />
<script src="https://gist.github.com/2632115.js?file=django-social-auth-basic.py"></script></p>
<h3>Passo 3: Colocar o link no template</h3>
<p>A configuração acima é tudo que você precisava para uma autenticação básica. Aconselho <strong>fortemente</strong> a ler o código da app para entender o que ela faz com os modelos por baixo dos panos. Agora é só colocar a url correta no template com a linha abaixo e correr para o abraço:</p>
<blockquote><p>&lt;a href=&#8221;{% url socialauth_begin &#8216;facebook&#8217; %}&#8221;&gt;Login com o Facebook&lt;/a&gt;</p></blockquote>
<h3>Level Bônus: Recuperando dados extras do usuário</h3>
<p>Como eu falei, o processo acima lida com uma autenticação básica. Mas, como fazer se precisarmos de mais dados do usuário como, por exemplo, sua cidade ou o seu aniversário? Se você leu a <a href="https://developers.facebook.com/docs/authentication/permissions/" target="_blank">documentação do Facebook</a>, vai ver que é só adicionar alguns valores na querystring da sua requisição de autenticação. (Aqui vale um parênteses: o Facebook não manda o email do usuário no pacote de dados básicos)</p>
<p>O <a href="http://django-social-auth.readthedocs.org/en/latest/index.html" target="_blank">django-social-auth</a> viabiliza isso através de uma variável no settings e com o uso da sua estrutura de pipeline. O seu pipeline é composto por funções que são executadas no final do processo de autenticação e o mesmo é extensível. Portanto, você pode escrever sua função para fazer algo específico &#8211; no nosso caso salvar o aniversário e a cidade natal do usuário &#8211; e colocá-la no pipeline de funções executáveis. Para isso precisaríamos apenas adicionar <strong>algo</strong> <strong>parecido </strong>com isso ao nosso projeto:<script type="text/javascript" src="https://gist.github.com/2632187.js?file=django-social-auth-basic.py"></script></p>
<h3>Conclusão</h3>
<p>Achei a app bem bacana e fácil de usar e configurar. Achei ela bem pensada e versátil (existe autenticação com 1000 redes sociais e afins). O único ponto que não gostei muito foi a maneira com que ela lida com falhas. A maioria da exceções são capturadas e não são tratadas ou geram notificações para os admins. Apenas mostram na tela uma mensagem falando que algo de errado aconteceu.</p>
<p>Para quem quer utilizá-la, digo que vale muito a pena dar uma navegada pelo seu código para ficar mais familiarizado com a app e ver se ela realmente tem o potencial necessário para atender as suas necessidades.</p>
<p>Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/autenticando-o-seu-usuario-django-pelo-facebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Um Slider Com Lazyload Utilizando jQuery</title>
		<link>http://www.bernardofontes.net/blog/um-slider-com-lazyload-utilizando-jquery/</link>
		<comments>http://www.bernardofontes.net/blog/um-slider-com-lazyload-utilizando-jquery/#comments</comments>
		<pubDate>Tue, 03 Apr 2012 11:48:23 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[frontend]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jquery]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=428</guid>
		<description><![CDATA[Atualmente tenho trabalho em um portfólio de um escritório de arquitetura que é bem puxado para o frontend por conta das variadas maneiras de interação com o conteúdo. No post de hoje, quero compartilhar com vocês um snippet de Javascript que utilizei para construir um slider que carrega suas imagens uma a uma. Para deixarmos [...]]]></description>
			<content:encoded><![CDATA[<p>Atualmente tenho trabalho em um portfólio de um escritório de arquitetura que é bem puxado para o frontend por conta das variadas maneiras de interação com o conteúdo. No post de hoje, quero compartilhar com vocês um snippet de <a href="http://pt.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a> que utilizei para construir um slider que carrega suas imagens uma a uma.</p>
<p>Para deixarmos claro, <a href="http://www.1stwebdesigner.com/freebies/javascript-sliders-scrollers/" target="_blank">slider são aquelas interações</a> que já estamos acostumados a ver e que fazem transições percorrendo imagem por imagem em uma lista de imagens a serem apresentadas. O <a href="http://www.appelsiini.net/projects/lazyload" target="_blank">carregamento das imagens preguiçoso, conhecido como lazyload,</a> é uma técnica em que as imagens só são carregadas quando o usuário deseja vê-las. Isso é útil para tornar a página mais leve diminuindo o número de requisições iniciais que o browser precisa fazer para renderizar a página.</p>
<p>O <a href="https://gist.github.com/2289099" target="_blank">script que junta essas duas ideias</a> foi resultado de uma adaptação de um código que faz de um <a href="http://jonraasch.com/blog/a-simple-jquery-slideshow" target="_blank">slider simples</a> junto ao conceito <a href="http://www.appelsiini.net/projects/lazyload" target="_blank">desse plugin</a> e do código do <a href="https://github.com/pedromenezes/jQuery-lazyload/blob/master/jquery.lazyload.js" target="_blank">Pedro Menezes</a> para fazer lazyload de imagens utilizando a <a href="http://jquery.com/" target="_blank">jQuery</a>. Além disso, ainda faço um controle de exibição dos botões que fazem a interação de próxima e anterior com o slider. Então, o resultado desse trabalho foi esse &#8211; vale dizer que não sou grande conhecedor de <a href="http://pt.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a> e <a href="http://jquery.com/" target="_blank">jQuery</a>:<br />
<media><br />
<script src="https://gist.github.com/2289099.js?file=lazy-slider.js"></script><br />
</media><br />
Para ver um exemplo bem simples do funcionamento do script, você pode acessar esse <a href="http://jsfiddle.net/bernardofontes/UNE2f/5/" target="_blank">link do JsFiddle</a> e clicar no botão &#8220;Run&#8221; na parte superior esquerda. Não conhecia  essa ferramenta e achei muito legal para validar pequenas lógicas com <a href="http://pt.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a> e <a href="http://jquery.com/" target="_blank">jQuery</a>. Valeu <a href="https://twitter.com/gmorada" target="_blank">Morada</a>!</p>
<p>Estou começando a me interessar mais sobre desenvolvimento em frontend e, principalmente, por <a href="http://jquery.com/" target="_blank">jQuery</a> e <a href="http://pt.wikipedia.org/wiki/JavaScript" target="_blank">Javascript</a>.  Portanto, espero que tenhamos novos  posts sobre o assunto em breve. Até a próxima, <a href="http://www.youtube.com/watch?v=K02Cxo3fAC8" target="_blank">para nossa alegria</a>!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/um-slider-com-lazyload-utilizando-jquery/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>O que mais curti do Django 1.4</title>
		<link>http://www.bernardofontes.net/blog/o-que-mais-curti-do-django-1-4/</link>
		<comments>http://www.bernardofontes.net/blog/o-que-mais-curti-do-django-1-4/#comments</comments>
		<pubDate>Tue, 27 Mar 2012 05:21:46 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[testes]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=424</guid>
		<description><![CDATA[Como muitos já sabem, na sexta-feira passada foi feita a release da versão 1.4 do Django. Essa versão traz vários ajustes que visam tornar o framework ainda mais leve e fácil para o desenvolvimento web. Incentivado por esse post do Adam McKerlie, resolvi falar das novas features que eu mais curti. Facilidade com testes de [...]]]></description>
			<content:encoded><![CDATA[<p>Como muitos já sabem, na sexta-feira passada foi feita a <a href="https://docs.djangoproject.com/en/dev/releases/1.4/" target="_blank">release da versão 1.4 do Django</a>. Essa versão traz vários ajustes que visam tornar o framework ainda mais leve e fácil para o desenvolvimento web. Incentivado por <a href="http://procrastinatingdev.com/django/most-important-changes-in-django-1-4/" target="_blank">esse post do Adam McKerlie</a>, resolvi falar das novas features que eu mais curti.</p>
<h3>Facilidade com testes de aceitação</h3>
<p>O <a href="https://docs.djangoproject.com/en/dev/releases/1.4/" target="_blank">Django 1.4</a> adiciona uma classe chamada <a href="https://docs.djangoproject.com/en/dev/topics/testing/#django.test.LiveServerTestCase" target="_blank">LiveServerTestCase</a> que tem o intuito de simular a aplicação e a suas integrações, com o banco por exemplo, para que se possa fazer testes de aceitação. Ela facilita a combinação com outras ferramentas comumente utilizadas nesse tipo de teste como o <a href="http://seleniumhq.org/" target="_blank">Selenium</a>, por exemplo. Acho bom esse tipo de feature ser fornecida pelo framework porque torna mais fácil e convidativo a escrita de testes durante o processo de desenvolvimento.</p>
<h3>Método prefetch_related</h3>
<p><a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.prefetch_related" target="_blank">Essa</a> parece uma alteração simples, mas de todas foi a que eu mais gostei. Antes já existia o <a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related" target="_blank">select_releated</a> que possibilitava queries únicas para recuperar um objeto e seus relacionamentos de chave estrangeira. Entretanto, quando tínhamos um relacionamento de muitos para muitos, por exemplo, isso não era possível. Esse método resolve essa questão e acaba por resolver um grande problema de performance quando esse tipo de relacionamento entre tabelas do banco tinha que ser trabalhado no <a href="http://www.djangoproject.com" target="_blank">Django</a>.</p>
<h3>Improvements do admin</h3>
<p>Já precisei personalizar o <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/" target="_blank">admin</a> além do que o framework fornece e não rolou. Curiosamente foi para fazer exatamente algo que a nova opção <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter" target="_blank">list_filter</a>. Além disso, foram adicionados métodos que tornaram o <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/#modeladmin-objects" target="_blank">ModelAdmin</a> ainda mais poderoso e fácil de customizar como o <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.get_list_display_links" target="_blank">get_list_display_links</a> e o <a href="https://docs.djangoproject.com/en/dev/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_related" target="_blank">save_related</a>.</p>
<h3>Assignment tag</h3>
<p><a href="https://docs.djangoproject.com/en/dev/howto/custom-template-tags/#howto-custom-template-tags-assignment-tags" target="_blank">Essa tag</a> é a única feature que, confesso, nunca tive necessidade real de utilizar. Mas me pareceu tão óbvio e fácil que teve que entrar nessa lista. Ela é bem interessante, mas fiquei um pouco de orelha em pé&#8230; Digo isso porque ela te dá um poder legalzinho e ela aumenta bem a possibilidade de fazer com que lógica da aplicação vaze para o template. Mas, é aquela coisa: <a href="http://www.youtube.com/watch?v=_gOZ_bvL-Ys" target="_blank">grandes poderes, grandes responsabilidades</a>.</p>
<p>&nbsp;</p>
<p>Esses quatro pontos foram os que mais me chamaram a atenção por, com exceção do último, terem sido problemas que eu já enfrentei de alguma maneira. Vale dizer que ainda existem outras features bem bacanas como <a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.select_for_update" target="_blank">novos métodos</a> para <a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.bulk_create" target="_blank">manipular o banco de dados</a> ou o <a href="https://docs.djangoproject.com/en/dev/ref/contrib/formtools/form-wizard/" target="_blank">novo form wizard</a>.</p>
<p>Sobre as minor features, segue uma listinha das que eu também curti mais:</p>
<ul>
<li>Uma nova <a href="https://docs.djangoproject.com/en/dev/topics/testing/#django.test.SimpleTestCase" target="_blank">classe de testes mais leve</a></li>
<li>Uso de <a href="https://docs.djangoproject.com/en/dev/ref/templates/builtins/#std:templatetag-if" target="_blank">elif</a> nos templates</li>
<li>Parâmetro  &#8211;clear para o comando <a href="https://docs.djangoproject.com/en/dev/ref/contrib/staticfiles/#django-admin-collectstatic" target="_blank">collectstatic</a></li>
<li>Método <a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct" target="_blank">distinct do queryset</a> aceitando parâmetros com os campos das tabelas</li>
</ul>
<p>Participem da discussão colocando os pontos que vocês mais gostaram dessa nova release nos comentários! Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/o-que-mais-curti-do-django-1-4/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Como colocar um experimento no ar em menos de 2 dias</title>
		<link>http://www.bernardofontes.net/blog/como-colocar-um-experimento-no-ar-em-menos-de-2-dias/</link>
		<comments>http://www.bernardofontes.net/blog/como-colocar-um-experimento-no-ar-em-menos-de-2-dias/#comments</comments>
		<pubDate>Wed, 21 Mar 2012 16:07:59 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[agile]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=411</guid>
		<description><![CDATA[Durante o final de semana o Luciano Ratamero começou a aprender Django e ficou impressionado com o framework. Ele queria aprender mais e então resolvemos implementarmos, juntos e do zero, um pequeno projetinho que concebemos na sexta anterior. A ideia foi o &#8220;Uma História Por Dia&#8221;, uma aplicação com que os usuários interajem construindo uma [...]]]></description>
			<content:encoded><![CDATA[<p>Durante o final de semana o <a href="http://lucianoratamero.com" target="_blank">Luciano Ratamero</a> começou a aprender <a href="https://www.djangoproject.com/" target="_blank">Django</a> e ficou impressionado com o framework. Ele queria aprender mais e então resolvemos implementarmos, juntos e do zero, um pequeno projetinho que concebemos na sexta anterior.</p>
<p>A ideia foi o <a href="http://www.umahistoriapordia.com.br" target="_blank">&#8220;Uma História Por Dia&#8221;</a>, uma aplicação com que os usuários interajem construindo uma história criando frases associadas a imagens da web. Simples assim. O site foi concebido depois de uma conversa com o Miguel Nóbrega sobre interação randômica em alguns sites aliado a algumas aplicações de bots do <a href="http://www.extrapolo.com/" target="_blank">Rafael Polo</a> que pega um pouco dessa dinâmica também.</p>
<p>O mais interessante foi conseguir fazer todo o planejamento do projeto, desenvolvimento, layout e deploy em menos de 2 dias de trabalho. Confesso que conseguimos isso porque utilizamos algumas ferramentas e técnicas que viablizaram esse ciclo de desenvolvimento. E é sobre elas que vou falar agora.</p>
<h3>Bom planning</h3>
<p>O primeiro passo que garantiu um desenvolvimento rápido foi um planejamento bem elaborado. Focamos em qual era o <a href="http://venturehacks.com/articles/minimum-viable-product" target="_blank">MVP</a> e criamos tópicos com tarefas bem definidas que refletiam os passos que deveriam ser implementados para que aquele tópico pudesse declarado como pronto. Percebemos que esse momento nos deu vários alertas prévias de problemas que enfrentamos depois. Assim, com os alertas, as soluções puderam ser pensadas com calma.</p>
<h3>Dev Power up</h3>
<p>No desenvolvimento tivemos o <a href="https://github.com/nvie/gitflow" target="_blank">gitflow</a> e o <a href="https://www.djangoproject.com/" target="_blank">Django</a> como fiés aliados. O primeiro nos permitiu utilizar um <a href="http://nvie.com/posts/a-successful-git-branching-model/" target="_blank">workflow do git</a> bem estruturado e rápido. Isso parece bobo, mas você se sente muito mais leve para desenvolver sem ter que ficar com medo de lidar com merges a cada pull ou push.</p>
<p>Já o <a href="http://www.djangoproject.com" target="_blank">Django</a> nos ajudou com dois pontos. Os testes podem ser considerados o primeiro, já que o <a href="http://lucianoratamero.com" target="_blank">Luciano</a> nunca tinha desenvolvido com <a href="http://pt.wikipedia.org/wiki/Test_Driven_Development" target="_blank">TDD</a>. Não é necessário dizer que ele ficou impressionado em como desenvolver dessa maneira economiza<br />
tempo de debug mais a frente, entre outros benefícios. Além dos testes, fizemos uso extensivo das <a href="https://docs.djangoproject.com/en/dev/topics/class-based-views/" target="_blank">class-based generic views do Django</a>. Todas as views ficaram muito simples e de fácil e rápida customização. Isso nos permitiu experimentar muito mais por não termos a barreira de lidar com muito código para criar algo.</p>
<p>Para agilizar o layout, tarefa que nos tomou mais tempo, utilizamos o já famoso <a href="http://twitter.github.com/bootstrap/" target="_blank">Bootstrap do Twitter.</a> Pegamos ele como base e adicionamos novos estilos para deixar a página de um jeito que achamos mais bonito. Mas, a parte de <a href="http://twitter.github.com/bootstrap/scaffolding.html#gridSystem" target="_blank">containers e grid</a> foram uma mão na roda!</p>
<h3>Decolagem rápida</h3>
<p>Por último, para o deploy, utilizamos o <a href="http://heroku.com" target="_blank">Heroku</a> que já disponibilizou suporte <a href="http://python.org" target="_blank">Python</a> faz um tempinho. Foi quase inacreditável preparar a máquina e colocar a aplicação no ar em menos de 30 minutos e com nem <a href="http://devcenter.heroku.com/articles/django" target="_blank">uma dúzia de comandos</a>. Muito simples mesmo.</p>
<p>A avaliação final da experiência é que criar algo pequeno, validar uma ideia ou desenvolver um <a href="http://venturehacks.com/articles/minimum-viable-product" target="_blank">MVP</a> hoje em dia é muito simples e rápido. Tentarei reproduzir ao máximo algumas das decisões que tomamos para projetos futuros, principalmente<br />
em relação as <a href="https://docs.djangoproject.com/en/dev/topics/class-based-views/" target="_blank">class-based views</a>.</p>
<p>E para não terminar sem um jabá, participe do <a href="http://www.umahistoriapordia.com.br" target="_blank">&#8220;Uma História Por Dia&#8221;</a>. Porque quem conta um conto, <a href="http://www.umahistoriapordia.com.br/novo-capitulo/" target="_blank">aumenta um ponto</a>!</p>
<p>PS.: Agradecimentos à minha namorada, Paula Paiva, que deu várias ideias e dicas para estruturarmos a interface e interação do sistema.</p>
<p><strong>Update</strong> &gt;&gt;&gt; O projeto é aberto e qualquer pessoa pode contribuir com o código que está <a href="https://github.com/lucianoratamero/umahistoria" target="_blank">nesse repositório do Gtihub</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/como-colocar-um-experimento-no-ar-em-menos-de-2-dias/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pontos que mais utilizo com o Vim</title>
		<link>http://www.bernardofontes.net/blog/pontos-que-mais-utilizo-com-o-vim/</link>
		<comments>http://www.bernardofontes.net/blog/pontos-que-mais-utilizo-com-o-vim/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 12:42:41 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[vim]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=406</guid>
		<description><![CDATA[Para quem não sabe, o Vi é um antigo editor de texto mas que é vastamente utilizado até hoje por conta dos seus super poderes e customização. Comecei a utilizá-lo o Vim (Vi Improved) quando trabalhei na Myfreecomm graças a ajuda do Flávio Amieiro. Hoje em dia sou um defensor do editor e faço propagandas [...]]]></description>
			<content:encoded><![CDATA[<p>Para quem não sabe, o <a href="http://pt.wikipedia.org/wiki/Vi" target="_blank">Vi</a> é um antigo editor de texto mas que é vastamente utilizado até hoje por conta dos seus super poderes e customização. Comecei a utilizá-lo o <a href="http://www.vim.org/" target="_blank">Vim</a> (Vi Improved) quando trabalhei na <a href="http://www.myfreecomm.com.br" target="_blank">Myfreecomm</a> graças a ajuda do <a href="http://flavioamieiro.com" target="_blank">Flávio Amieiro</a>. Hoje em dia sou um defensor do editor e faço propagandas dele quando dá.</p>
<p>Faz um tempo e alguns amigos meus me pediram dicas sobre o <a href="http://www.vim.org/" target="_blank">Vim</a> e ajuda para começar a utilizar e aprender a manipular melhor o editor. Para isso, eu sempre passava o endereço do meu repositório com <a href="https://github.com/berinhard/config_files" target="_blank">meus arquivos de configuração</a> e explicava o que eu utilizava. Como já me cansei de fazer isso, resolvi fazer esse post para mostrar o que eu uso com mais frequência quando estou trabalhando com o <a href="http://www.vim.org/" target="_blank">Vim</a>.</p>
<h3>1 &#8211; NerdTree Plugin</h3>
<p>Esse eu acredito que seja um must-have do <a href="http://www.vim.org/" target="_blank">Vim</a>. Basicamente você ganha o poder de visualizar a árvore de arquivos a partir do diretório que você está. Isso é bom porque você pode fazer busca de arquivos, navegar por diretórios e abrir arquivos de maneira mais rápida. Você pode instalá-lo seguindo <a href="http://www.vim.org/scripts/script.php?script_id=1658" target="_blank">essas instruções</a>. A única coisa de diferente que fiz foi mudar o mapeamento da exibição da árvore.</p>
<h3>2 &#8211; Code Fold</h3>
<p>Eu me confundo muito quando tem muito código em um arquivo e eu só preciso trabalhar em uma parte dele. Para resolver esse problema utilizo uma função que faz esconde o código respeitando a sua identação. Acredito que essa seja a função que eu mais utilize do meu vimrc. Para utilizá-la, é só copiar essa <a href="https://github.com/berinhard/config_files/blob/master/.vimrc#L20" target="_blank">parte de código</a> para o seu vimrc e utilizar espaço quando fora do modo de edição.</p>
<h3>3 &#8211; Tab completion</h3>
<p>Existem ferramentas mais eficientes para fazer o tab completion de linguagens, mas eu gosto da <a href="https://github.com/berinhard/config_files/blob/master/.vimrc#L129" target="_blank">função que utilizo</a> exatamente por ela não ser guiada por nenhuma linguagem de programação. Basicamente ele utiliza o que já foi escrito no próprio arquivo para fazer avaliações de possíveis complementos, ou seja, ele assume que o que você vai utilizar, provavelmente já foi escrito. Acho essa abordagem bem interessante porque limita bastante o número de possibilidades e<br />
evita listas gigantescas de alternativas. O código para essa função está <a href="https://github.com/berinhard/config_files/blob/master/.vimrc#L129" target="_blank">aqui</a>.</p>
<h3>4 &#8211; Closetag</h3>
<p>Esse é um script simples que faz um map para fechar tags HTML automaticamente. Assim, depois de criar o conteúdo de uma tag, apenas faço um CONTROL + _ e essa tag está fechada. Parece bobo, mas é uma mão na roda! Para utilizar é só colocar <a href="https://github.com/berinhard/config_files/blob/master/.vimrc#L97" target="_blank">essas linhas</a> no seu vimrc e copiar <a href="https://github.com/berinhard/config_files/blob/master/.vim/scripts/closetag.vim" target="_blank">esse arquivo</a> para o diretório .vim/scripts/.</p>
<h3>5 &#8211; Ipython Debugger instantâneo</h3>
<p>O último item da lista é a função Python que fiz como experimento para inserir e remover breakpoints para fazer debug de código Python. Já fiz um <a href="http://www.bernardofontes.net/blog/ipython-debugger-no-vim/" target="_blank">post falando sobre essas funções,</a> então se quiserem saber como utilizar é só olhar lá.</p>
<p>Esses são os 5 pontos que mais utilizo. Ainda existem outras coisas, mas esses são os que utilizo praticamente todo dia que abro o <a href="http://www.vim.org/" target="_blank">Vim</a> para trabalhar. Como bonus vale dar uma olhada nos <a href="https://github.com/berinhard/config_files/blob/master/.vimrc#L193" target="_blank">mapeamentos de teclado</a> para de navegação e manuseio de mais de uma janela que utilizo dentro do <a href="http://www.vim.org/" target="_blank">Vim</a>.</p>
<p>Se você está começando, também aconselho o <a href="http://blog.tarsisazevedo.com/post/16543244858/aprenda-vim-progressivamente" target="_blank">post Aprenda Vim Progressivamente</a> que é original do <a href="http://yannesposito.com/Scratch/en/blog/Learn-Vim-Progressively/" target="_blank">Yann Esposito</a>, mas que o <a href="http://blog.tarsisazevedo.com/" target="_blank">Tarsis Azevedo</a> fez uma ótima tradução.</p>
<p>Compartilhe nos comentários os seus plugins e maneiras de utilizar o Vim que eu não compartilhei nesse texto para iniciarmos uma rica discussão! Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/pontos-que-mais-utilizo-com-o-vim/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Criando um blog planet com Python</title>
		<link>http://www.bernardofontes.net/blog/criando-um-blog-planet-com-python/</link>
		<comments>http://www.bernardofontes.net/blog/criando-um-blog-planet-com-python/#comments</comments>
		<pubDate>Thu, 15 Mar 2012 14:03:31 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[django]]></category>
		<category><![CDATA[opensource]]></category>
		<category><![CDATA[planet venus]]></category>
		<category><![CDATA[programação]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=394</guid>
		<description><![CDATA[Quando o Google destruiu melhorou a interface do Google Reader, pesquisei um pouco sobre planets e agregadores. Uma das ferramentas que experimentei é o Planet Venus, um criador de planets para blogs. A documentação dele é meio chatinha e não achei muita referência na web&#8230; Então, vim aqui para mostrar como se instala e utiliza [...]]]></description>
			<content:encoded><![CDATA[<p>Quando o Google <del datetime="2012-03-15T13:35:48+00:00">destruiu</del> melhorou a interface do <a href="http://reader.google.com">Google Reader</a>, pesquisei um pouco sobre planets e agregadores. Uma das ferramentas que experimentei é o <a href="http://intertwingly.net/code/venus/">Planet Venus</a>, um criador de planets para blogs. A documentação dele é meio chatinha e não achei muita referência na web&#8230; Então, vim aqui para mostrar como se instala e utiliza a ferramenta no Ubuntu.</p>
<p>Para quem não sabe, planets são aqueles agregadores que respeitam algum tópico. Por exemplo, temos o do <a href="http://planetdjango.org/">Django</a> ou o do <a href="http://planet.ubuntu.com/">Ubuntu</a>, que agregam blogs de desenvolvedores ou pessoas que fazem parte das comunidades.</p>
<p>É aí que entra o <a href="http://intertwingly.net/code/venus/">Planet Venus</a>. Ele é basicamente uma grande <a href="http://www.intertwingly.net/blog/2006/08/16/Venus-Rising">refatoração do projeto Planet 2.0</a>. Apesar de ser bem simples de utilizar, é bom a gente fazer um passo-a-passo. Para instalar basta executar:</p>
<blockquote>
<pre>$ sudo apt-get install planet-venus</pre>
</blockquote>
<p>Após a instalação podemos utilizar o comando planet. Então, para criarmos o nosso exemplo inicial basta executarmos:</p>
<blockquote>
<pre>$ planet --create exemplo</pre>
<pre>$ cd exemplo</pre>
</blockquote>
<p>Foi criado um diretório chamado exemplo que contém um arquivo chamado planet.ini e um diretório theme que contém um arquivo de configuração para os temas utilizados. Teoricamente, você já tem um planet em mãos, basta somente mudar os arquivos de configuração para deixá-los da maneira que você desejar. Ele já é bem estruturado, simples de entender e é alterar os valores desejados ou adicionar novos feeds.</p>
<p>O que achei muito interessante do <a href="http://intertwingly.net/code/venus/">Planet Venus</a> é que, caso você tenha o <a href="https://www.djangoproject.com/">Django</a> instalado na máquina, você pode usar a <a href="https://docs.djangoproject.com/en/dev/topics/templates/">linguagem de templates do Django</a> para editar a exibição dos posts. Para fazer isso, você pode copiar o exemplo que o projeto já fornece com o comando:</p>
<blockquote>
<pre>$ cp /usr/share/planet-venus/theme/django/index.html.dj theme/</pre>
</blockquote>
<p>Após copiar, você deve editar o arquivo theme/config.ini deixando-o com o seguinte conteúdo:</p>
<blockquote>
<pre>[Planet]</pre>
<pre>template_files: index.html.dj</pre>
</blockquote>
<p>Vale a pena dar uma olhada nos templates base que o projeto já fornece. Por exemplo, além do layout <a href="https://www.djangoproject.com/">Django</a> e em <a href="http://pt.wikipedia.org/wiki/HTML">HTML</a>, ele já disponibiliza templates para feeds <a href="http://pt.wikipedia.org/wiki/RSS">RSS</a>. Após deixarmos o template do jeito que esperamos, é só coletar os posts. Para isso basta executar o seguinte comando:</p>
<blockquote>
<pre>$ planet planet.ini</pre>
</blockquote>
<p>Com isso, serão criados dois diretórios que foram definidos no arquivo de configuração planet.ini, nas variáveis output_dir e cache_directory. O primeiro diretório armazena o que foi gerado após a agregação e o segundo faz cache para posts que o planet consultou.</p>
<p>Como ele não possui nada para trabalhar em background ou algo do tipo uma solução para conseguir atualizar o seu planet frequentemente pode ser adicionar o comando de atualização colocado acima ao contrab.</p>
<p>Seguindo esses passos você já tem um planet pronto e configurado. Caso queira torná-lo acessível na web, você pode utilizar o <a href="http://wiki.nginx.org/Main">Nginx</a> ou o <a href="http://www.apache.org/">Apache</a> para servir os arquivos estáticos gerados pelo <a href="http://intertwingly.net/code/venus/">Planet Venus</a>.</p>
<p>Crie seu planet com seus blogs favoritos e compartilhe suas impressões do <a href="http://intertwingly.net/code/venus/">Planet Venus</a> aqui nos comentários! Até a próxima!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/criando-um-blog-planet-com-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Compartilhamento da Monografia sobre Coding Dojo</title>
		<link>http://www.bernardofontes.net/blog/compartilhamento-da-monografia-sobre-coding-dojo/</link>
		<comments>http://www.bernardofontes.net/blog/compartilhamento-da-monografia-sobre-coding-dojo/#comments</comments>
		<pubDate>Wed, 15 Feb 2012 11:30:39 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Comunidade]]></category>
		<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[dojorio]]></category>
		<category><![CDATA[ensino]]></category>
		<category><![CDATA[uff]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=389</guid>
		<description><![CDATA[Olá a todos! Finalmente volto aqui para cumprir com parte do prometido e compartilhar com todos a minha monografia em que falo sobre o Coding Dojo e a utilização do mesmo para o ensino de programação. Esse é um assunto que todos que vão ao Dojo aqui do Rio sempre debatem e foi uma experiência [...]]]></description>
			<content:encoded><![CDATA[<p>Olá a todos! Finalmente volto aqui para cumprir com parte do prometido e compartilhar com todos a minha monografia em que falo sobre o <a href="http://codingdojo.org/" target="_blank">Coding Dojo</a> e a utilização do mesmo para o ensino de programação.</p>
<p>Esse é um assunto que todos que vão ao <a href="http://dojorio.org" target="_blank">Dojo aqui do Rio</a> sempre debatem e foi uma experiência muito prazerosa e coletiva escrever essa monografia. O melhor de tudo foi ver a sala da defesa lotada com a galera que frequenta os Dojos. Me senti honrado em ver toda aquela galera que admiro muito parando um segundinho para me ouvir e me apoiar nesse momento tão importante como foi o final da faculdade.</p>
<p>Então, sem mais delongas, vocês podem baixar a monografia <a href="http://www.mediafire.com/?4whfnv061valdp9" target="_blank">nesse link do MediaFire</a>. Espero que gostem e, como sempre, críticas e sugestões são bem-vindas!</p>
<p>PS.: Ainda continuo na dívida do vídeo da defesa. =)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/compartilhamento-da-monografia-sobre-coding-dojo/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Rocksmith: Como Aprender A Tocar Guitarra Jogando Videogame</title>
		<link>http://www.bernardofontes.net/blog/rocksmith-como-aprender-a-tocar-guitarra-jogando-videogame/</link>
		<comments>http://www.bernardofontes.net/blog/rocksmith-como-aprender-a-tocar-guitarra-jogando-videogame/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 14:08:05 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Games]]></category>
		<category><![CDATA[ensino]]></category>
		<category><![CDATA[games]]></category>
		<category><![CDATA[gamificação]]></category>
		<category><![CDATA[ps3]]></category>
		<category><![CDATA[rocksmith]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=385</guid>
		<description><![CDATA[O que a sua namorada diria se você deixar de sair com ela para ficar jogando videogame em uma noite de sexta-feira? Agora, o que ela falaria se você tocasse na guitarra um cover daquela música que ela adora? O novo jogo da Ubisoft, o Rocksmith, tenta conciliar os dois mundos. Basicamente, ele é um [...]]]></description>
			<content:encoded><![CDATA[<p>O que a sua namorada diria se você deixar de sair com ela para ficar jogando videogame em uma noite de sexta-feira? Agora, o que ela falaria se você tocasse na guitarra um cover daquela música que ela adora? O novo jogo da <a href="http://www.ubi.com/UK/default.aspx" target="_blank">Ubisoft</a>, o <a href="http://rocksmith.ubi.com/rocksmith/en-US/home/" target="_blank">Rocksmith</a>, tenta conciliar os dois mundos. Basicamente, ele é um jogo de videogame feito para te ensinar a tocar músicas com uma guitarra de verdade.</p>
<p>O jogo é bem no estilo de <a href="http://hub.guitarhero.com/" target="_blank">Guitar Hero</a>, mas usando uma guitarra como controle e baseado em uma temática diferente! O jogo não tem um modo de história e nem um personagem bonitinho. A principal interação do jogo é você aprender a tocar novas músicas para poder fazer shows em palcos cada vez mais maneiros! Além disso, existem mini games e exercícios específicos para você aperfeiçoar técnicas para tocar guitarra. Vejam o vídeo do gameplay para sentirem melhor o que ele é:<br />
<center><br />
<media><br />
<iframe width="640" height="360" src="http://www.youtube.com/embed/q2x5APUBfFQ" frameborder="0" allowfullscreen></iframe><br />
</media><br />
</center></p>
<p>O mais interessante do jogo é que ele traz o conceito de <a href="http://en.wikipedia.org/wiki/Gamification" target="_blank">gamificação</a> para o ensino de guitarra. Mas não se limita a só dar achievements para o jogador. O jogo se destaca em dois pontos que estão diretamente associados à questão do feedback, essencial para o aprendizado.</p>
<p>O primeiro ponto é que o feedback é em tempo real! Não sou muito fã do <a href="http://hub.guitarhero.com/" target="_blank">Guitar Hero</a> e um dos motivos é porque não parece que você está tocando a música. Quando você erra, a guitarra simplesmente para de tocar e você não consegue saber o que você fez. No <a href="http://rocksmith.ubi.com/rocksmith/en-US/home/" target="_blank">Rocksmith</a>, você ouve quando está fazendo <del datetime="2011-12-20T13:55:08+00:00">merda</del> algo errado. Ou seja, o jogo não esconde o seu erro e o mostra para você, fazendo com que você sinta o impacto que ele causa.</p>
<p>O outro ponto é que o jogo é inteligente e respeita o tempo de aprendizado do jogador. Não existem opções de pré-configuradas de dificuldade, o clássico trio easy, medium e hard. Então, no <a href="http://rocksmith.ubi.com/rocksmith/en-US/home/" target="_blank">Rocksmith</a>, não é você que deve se adequar à dificuldade, mas sim o contrário &#8211; a complexidade do jogo se encaixa na sua experiência com o instrumento. Ao longo do tempo, a dificuldade das músicas vão aumentando respeitando a sua curva de aprendizado.</p>
<p>Por esses dois pontos, acho que essa abordagem vai além da visão comum de gamificação. Nâo enxergo essa prática como simplesmente dar bônus para o jogador: assim você o trata como um bebê. Colocar a gamificação no ensino não é uma questão de recompensas, mas sim de acompanhamento &#8211; enxergar os passos do aluno e criar um ambiente em que ele possa avançar sem que ele encare isso como uma tarefa.</p>
<p>Se você puder viver essa experiência, vale muito à pena. Ah, cabe dizer também que é muito divertido jogar o multiplayer com 2 guitarras! Compre o jogo, faça o seu show e dê a sua opinião sobre o assunto aqui nos comentários!</p>
<p>PS.: Para saber mais sobre gamificação vale a pena dar uma olhada <a href="http://www.slideshare.net/iMENDE5/game-thinking-9490478" target="_blank">nesses slides</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/rocksmith-como-aprender-a-tocar-guitarra-jogando-videogame/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Profile de List Comprehensions Em Python</title>
		<link>http://www.bernardofontes.net/blog/profile-de-list-comprehensions-em-python/</link>
		<comments>http://www.bernardofontes.net/blog/profile-de-list-comprehensions-em-python/#comments</comments>
		<pubDate>Mon, 05 Dec 2011 02:24:06 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Desenvolvimento]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[ppqsp]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=370</guid>
		<description><![CDATA[Em desenvolvimento de software sempre é comum ouvirmos aquela pergunta &#8220;E esse código é performático?&#8221;. Apesar de nem sempre ser o mais importante a se saber, essa pergunta é bem frequente e eu mesmo me peguei com essa indagação com as list comprehensions do Python. Então, resolvi fazer um profile para tirar as minhas dúvidas. [...]]]></description>
			<content:encoded><![CDATA[<p>Em desenvolvimento de software sempre é comum ouvirmos aquela pergunta <em>&#8220;E esse código é performático?&#8221;</em>. Apesar de <strong>nem sempre</strong> ser o mais importante a se saber, essa pergunta é bem frequente e eu mesmo me peguei com essa indagação com as <a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehensions</a> do <a href="http://python.org/">Python</a>. Então, resolvi fazer um profile para tirar as minhas dúvidas.</p>
<p>As dúvidas surgiram durante o curso <a href="http://blog.ramgarlic.com/2011/11/curso-online-python-para-quem-sabe.html">Python Para Quem Sabe Python</a> do <a href="https://twitter.com/#!/luciano">Luciano Ramalho</a>. O curso é excelente e estou vendo vários conceitos mais internos do <a href="http://python.org/">Python</a> em que eu nunca tive a oportunidade de me aprofundar. Durante a primeira aula, foi mostrado a <a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehension</a> e a comparação com um <a href="http://docs.python.org/tutorial/controlflow.html#for-statements">laço for</a> normal focando na legibilidade do código. Depois disso, perguntei sobre a performance e o pessoal deu a ideia implementarmos um <a href="http://en.wikipedia.org/wiki/Profiling_%28computer_programming%29">profile</a> para medirmos essa questão e experimentarmos nós mesmos esse processo.</p>
<p>O <a href="https://twitter.com/#!/joaodubas">João Dubas</a>, que também está no curso, começou com uma abordagem em que me baseei e fiz um fork. Na minha medição, quis comparar alguns cenários, sendo eles:</p>
<ol>
<li>Somente o filter de uma lista;</li>
<li>Somente o map para uma lista;</li>
<li>Filter e map para uma lista;</li>
</ol>
<p>Para cada um desses cenários existiam 3 implementações &#8211; uma com o <a href="http://docs.python.org/tutorial/controlflow.html#for-statements">laço for</a> normal, uma com <a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehension</a> e outra utilizando as funções <a href="http://docs.python.org/library/functions.html#map">map</a> e <a href="http://docs.python.org/library/functions.html#filter">filter</a> do <a href="http://python.org/">Python</a>. A ideia desse post é compartilhar, <strong>sem nenhuma pretensão científica</strong>, os resultados que obtive. Então, segue o output:</p>
<blockquote>
<pre>***** FILTER PROFILING *****
                              fn min        mean       max      
        filter_with_normal_for() 0.35435510 0.35819454 0.36282516
filter_with_list_comprehension() 0.30340981 0.31135285 0.32254100
       filter_with_filter_func() 0.21948600 0.22835863 0.26977205

***** MAP PROFILING *****
                           fn min        mean       max      
        map_with_normal_for() 0.36617208 0.37257178 0.39629292
map_with_list_comprehension() 0.29344010 0.29665232 0.30447888
          map_with_map_func() 0.28689599 0.29024918 0.30203104

***** MAP + FILTER PROFILING *****
                                 fn min        mean       max      
        mapfilter_with_normal_for() 0.46366715 0.47172487 0.48409891
mapfilter_with_list_comprehension() 0.42643499 0.42990112 0.43452096
    mapfilter_with_mapfilter_func() 0.36422396 0.36758418 0.38192511</pre>
</blockquote>
<p>Se os cenários que eu escrevi estiverem corretos e não ter comido nenhuma  mosca com algum detalhe, em todos os cenários as <a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehension</a> se mostraram a segunda melhor solução, perdendo para a utilização das <a href="http://docs.python.org/library/functions.html">funções bultins</a> do <a href="http://python.org/">Python</a>. No segundo cenário,  ela ficou bem próxima da implementação utilizando o <a href="http://docs.python.org/library/functions.html#map">map</a>. Isso dá para <strong>supor</strong> que a diferença de performance ficou a cargo do <a href="http://docs.python.org/library/functions.html#filter">filter</a> e não no <a href="http://docs.python.org/library/functions.html#map">map</a>. Em  todos os casos a solução normal utilizando o <a href="http://docs.python.org/tutorial/controlflow.html#for-statements">laço for</a> é a menos performática.</p>
<p>Como disse, essa medição não teve nenhum pretexto científico e foi apenas uma maneira divertida de fomentar uma discussão muito interessante na lista da turma do <a href="http://blog.ramgarlic.com/2011/11/curso-online-python-para-quem-sabe.html">PPQSP</a> sobre o valor da performance do código em detrimento da sua legibilidade. Eu também sou da escola do <a href="https://twitter.com/#!/luciano">Luciano Ramalho</a> ao gostar das <a href="http://docs.python.org/tutorial/datastructures.html#list-comprehensions">list comprehensions</a> por elas deixarem claras quais as intenções do código. Mas também compreendo que podem existir casos em que esse tipo de preocupação com performance existem, apesar de não achá-los comuns. Portanto, primeiro escrevo o código bonito para depois otimizá-lo se necessário!</p>
<p>O código que eu fiz para fazer essa medição está <a href="https://github.com/berinhard/ppqsp">nesse repositório do Github</a> e você pode executar o script na sua máquina para ver quais os seus resultados executando os comandos abaixo:</p>
<blockquote><p><code>$ wget <a href="https://raw.github.com/berinhard/ppqsp/master/class_0/for_profiler.py" target="_blank">https://raw.github.com/berinhard/ppqsp/master/class_0/for_profiler.py</a><br />
$ python for_profiler.py</code></p></blockquote>
<p>Espero que vocês se divirtam fazendo as medições e sintam-se a vontade para compartilhar os resultados aqui nos comentários!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/profile-de-list-comprehensions-em-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Agradecimentos do Projeto Final</title>
		<link>http://www.bernardofontes.net/blog/agradecimentos-do-projeto-final/</link>
		<comments>http://www.bernardofontes.net/blog/agradecimentos-do-projeto-final/#comments</comments>
		<pubDate>Thu, 17 Nov 2011 11:40:40 +0000</pubDate>
		<dc:creator>Bernardo Fontes</dc:creator>
				<category><![CDATA[Pessoal]]></category>
		<category><![CDATA[comunidade]]></category>
		<category><![CDATA[dojorio]]></category>
		<category><![CDATA[projeto final]]></category>
		<category><![CDATA[uff]]></category>

		<guid isPermaLink="false">http://www.bernardofontes.net/blog/?p=339</guid>
		<description><![CDATA[Como alguns sabem no início de dezembro vou fazer a defesa do meu projeto final. O nome é Coding Dojo: Novas Possibilidades para o Ensino de Programação e já falei dele aqui quando pedi para o pessoal colaborar com a pesquisa que fiz. Estou terminando de revisá-lo e formatá-lo agora para entregá-lo aos professores. Assim [...]]]></description>
			<content:encoded><![CDATA[<p>Como alguns sabem no início de dezembro vou fazer a defesa do meu projeto final. O nome é <strong>Coding Dojo: Novas Possibilidades para o Ensino de Programação</strong> e já falei <a href="http://www.bernardofontes.net/blog/a-historia-do-dojo-na-uff/" target="_blank">dele aqui</a> quando pedi para o pessoal <a href="http://www.bernardofontes.net/blog/pesquisa-coding-dojo-2/" target="_blank">colaborar com a pesquisa</a> que fiz. Estou terminando de revisá-lo e formatá-lo agora para entregá-lo aos professores. Assim que terminar, vou compartilhar ele com todos aqui neste espaço, mas tem uma parte que eu gostaria de compartilhar desde já.</p>
<p>Para mim aquele papel com palavras impressas ganha valor quando penso nas pessoas e nas histórias que tive com elas e que moldaram quem sou para escrever o que escrevi. Então, sem fazer média, considero a parte dos agradecimentos como a parte mais importante e é exatamente ela que quero compartilhar aqui:</p>
<blockquote><p><strong>Agradecimentos</strong></p>
<p>Gostaria de agradecer:</p>
<p style="text-align: right;">A minha avó, Dona Adélia, por me ajudar durante esses 5</p>
<p style="text-align: right;">morando sozinho me alimentando com os seus deliciosos quitutes congelados;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Ao meu pai, Henrique, por ser um exemplo e, acima de tudo, um ídolo para mim;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">A minha mãe, Marcia, por sempre se preocupar, me aconselhar e</p>
<p style="text-align: right;">me dar tudo o que precisei para me tornar o profissional que sou hoje;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Aos meus irmãos, Eduardo e Thiago, pelos anos juntos,</p>
<p style="text-align: right;">históras dividas no apartamento e exemplo de união;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">A minha namorada, Paula, que ainda que tão longe</p>
<p style="text-align: right;">se manteve perto sempre me ajudando a olhar para frente;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">A toda a minha família sempre presente na minha vida;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Aos amigos da faculdade, especialmente o João Luis e o Gabriel,</p>
<p style="text-align: right;">irmãos para mim, por esses anos em que, juntos, dividimos sucessos e fracassos;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Aos amigos de Friburgo, especialmente o Wanderson, o Fernando e</p>
<p style="text-align: right;">o Luis Felipe, por todas histórias que tivemos</p>
<p style="text-align: right;">e por, mesmo depois de sair da cidade, continuarmos juntos;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Aos amigos Flávio, Thiago, Henrique e Luciano, companheiros</p>
<p style="text-align: right;">na Dekode e que deram a motivação final para esse projeto;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Aos novos amigos Gerardo, Elias, João Felipe e Luisão, que acolheram</p>
<p style="text-align: right;">o Coding Dojo da UFF e hoje seguem com ele;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">A todas as pessoas que já participaram do Coding Dojo da UFF,</p>
<p style="text-align: right;">este que por várias vezes enxerguei como um filho;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">A todos os que já estiveram no Pós-Dojo da UFF pelas</p>
<p style="text-align: right;">excelentes conversas e noites divertidas;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">As comunidades do Rio de Janeiro e, principalmente,</p>
<p style="text-align: right;">à DojoRio porque se não fossem vocês nada do que escrevi existiria;</p>
<p style="text-align: right;">&nbsp;</p>
<p style="text-align: right;">Por último, ao Álvaro, ao Henrique e ao Vinícius. Obrigado pelas pílulas vermelhas.</p>
<p style="text-align: right;">&nbsp;</p>
</blockquote>
<p style="text-align: left;">Novamente, muito obrigado à todos!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bernardofontes.net/blog/agradecimentos-do-projeto-final/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>

