<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom">
 
  <title>Sylvestre Mergulhão</title>
  <link href="http://mergulhao.info/"/>
  <link type="application/atom+xml" rel="self" href="http://mergulhao.info/atom.xml"/>
  <updated>2013-09-16T08:47:35-07:00</updated>
  <id>http://mergulhao.info/</id>
  <author>
    <name>Sylvestre Mergulhão</name>
    <email>contato@mergulhao.info</email>
  </author>

  
  <entry>
    <id>http://mergulhao.info/2013/9/16/por-que-voce-deve-ir-ao-hackdesignconf-2013</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2013/9/16/por-que-voce-deve-ir-ao-hackdesignconf-2013/"/>
    <title>Por que você deve ir ao HDC'2013</title>
    <published>2013-09-16T00:00:00-07:00</published>
    <updated>2013-09-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Desde os primórdios do &lt;a href=&#39;http://horaextra.org/&#39;&gt;#horaextra&lt;/a&gt; ficou muito claro pra mim o quão relevante é estar cercado de pessoas que possuem interesses relacionados aos meus, que me permitissem compartilhar minhas ideias, receber feedback e assim poder evoluir tanto como indivíduo quanto tecnicamente.&lt;/p&gt;

&lt;p&gt;O ápice das atividades do &lt;a href=&#39;http://horaextra.org/&#39;&gt;#horaextra&lt;/a&gt; culminou no que hoje é a &lt;a href=&#39;http://helabs.com.br/&#39;&gt;HE:labs&lt;/a&gt;, minha empresa, que emprega dezenas de pessoas espalhadas pelo Brasil. A &lt;a href=&#39;http://helabs.com.br/&#39;&gt;HE:labs&lt;/a&gt; existe por conta de muito trabalho, claro, mas também porque eu conheci um seleto grupo de pessoas que me ajudaram a entender melhor o mundo que me cerca e assim pude tomar uma série de decisões na vida que resultaram no meu &lt;strong&gt;eu&lt;/strong&gt; de hoje e na minha empresa.&lt;/p&gt;

&lt;p&gt;A &lt;a href=&#39;http://helabs.com.br/&#39;&gt;HE:labs&lt;/a&gt; até hoje apóia o &lt;a href=&#39;http://horaextra.org/&#39;&gt;#horaextra&lt;/a&gt; por conta do poder de mudança para melhor que ele pode ter nas pessoas, assim como aconteceu comigo. Veja o feedback do &lt;a href=&#39;http://www.bernardofontes.net/blog/porque-voce-deve-ir-ao-dev-in-rio-2010/&#39;&gt;Bernardo Fontes&lt;/a&gt; e do &lt;a href=&#39;http://blog.8e32.com/2011/03/28/o-que-vi-no-dev-in-rio-2010-rebeldia/&#39;&gt;Rafael Miranda&lt;/a&gt; e você pode ter um pouco mais de noção desse poder, que surgiu a partir de iniciativas de dentro do &lt;a href=&#39;http://horaextra.org/&#39;&gt;#horaextra&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para continuar promovendo esses sentimentos a &lt;a href=&#39;http://helabs.com.br/&#39;&gt;HE:labs&lt;/a&gt; lançou o &lt;a href=&#39;http://hackdesignconf.com.br/&#39;&gt;HDC&amp;#8217;13&lt;/a&gt;, aka Hack &amp;amp; Design Conf&amp;#8217;13, que vai misturar os temas de design e hacking, do jeito que fazemos na &lt;a href=&#39;http://helabs.com.br/&#39;&gt;HE:labs&lt;/a&gt;! Acreditamos que esses temas tem um relacionamento muito forte e por isso a grade intercala pelos dois.&lt;/p&gt;

&lt;p&gt;Após o evento teremos um gigante &lt;a href=&#39;http://horaextra.org/&#39;&gt;#horaextra&lt;/a&gt; de confraternização.&lt;/p&gt;

&lt;p&gt;Não fique de fora! &lt;a href=&#39;http://hackdesignconf.com.br/&#39;&gt;Inscreva-se agora&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2013/3/4/a-questao-nao-e-o-teste-unitario</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2013/3/4/a-questao-nao-e-o-teste-unitario/"/>
    <title>A questão não é o teste unitário</title>
    <published>2013-03-04T00:00:00-08:00</published>
    <updated>2013-03-04T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Esta é a tradução de um post muito legal do &lt;a href=&#39;https://twitter.com/jrasmusson&#39;&gt;Jonathan Rasmusson&lt;/a&gt;. Entrei em contato com ele, que imediatamente autorizou a publicação dessa tradução. Conheça o &lt;a href=&#39;http://agilewarrior.wordpress.com/2012/10/06/its-not-about-the-unit-tests/&#39;&gt;post original&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;#8220;Programadores iOS normalmente não fazem testes unitários. Então por que eles, como uma comunidade, parecem desfrutar de uma reputação de qualidade?&amp;#8221;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#39;sem_testes_unitrios_sem_integrao_contnua_sem_desenvolvimento_guiado_por_testes&#39;&gt;Sem testes unitários. Sem integração contínua. Sem desenvolvimento guiado por testes.&lt;/h2&gt;

&lt;p&gt;Isso resume bem meu último projeto. Foi meu primeiro projeto iOS para um cliente e nós não pudemos usar nossas práticas queridas, mas entregamos um produto com ótima qualidade.&lt;/p&gt;

&lt;p&gt;Isso realmente me incomodou.&lt;/p&gt;

&lt;p&gt;Eu sempre pensei que testes unitários eram essenciais. Mas essa experiência com iOS parece que desafia algumas suposições que eu fui construindo por todos os anos que passei escrevendo software e me fez questionar algumas desconfortáveis questões.&lt;/p&gt;

&lt;p&gt;Estaria eu regredindo nas práticas de desenvolvimento?&lt;br /&gt;Será que testes unitários não são essenciais?&lt;br /&gt;Existia algo diferente no desenvolvimento para iOS?&lt;br /&gt;E como a comunidade iOS entrega produtos com tanta qualidade sem ter os testes unitários no coração?&lt;/p&gt;

&lt;p&gt;Essas questões me fizeram passar noites em claro e me levaram a buscar a alma do que está contido nesse artigo.&lt;/p&gt;

&lt;h2 id=&#39;desafiando_as_suposies&#39;&gt;Desafiando as suposições&lt;/h2&gt;

&lt;p&gt;10 anos atrás eu debatia com as pessoas sobre as vantagens de se utilizar testes unitários. Não mais. Escrever testes unitários se tornou uma prática tão comum que hoje é difícil encontrar uma plataforma moderna que não tenha algum tipo de framework de testes automatizados.&lt;/p&gt;

&lt;p&gt;E por que não? Os benefícios são óbvios. Pode-se lançar, mudar e refatorar o código com confiança. Também economiza-se muito com os testes de regressão. O sentimento de segurança que se tem por saber que existe uma suite de testes automatizados é incontestável.&lt;/p&gt;

&lt;p&gt;Então imagine minha surpresa quando eu entrei na comunidade que é responsável por alguns dos aplicativos mais amados no mundo e descobri que não se fazem testes unitários. Ainda mais desconcertante: eles parecem estar fugindo disso!&lt;/p&gt;

&lt;h2 id=&#39;qual__a_diferena_com_o_ios&#39;&gt;Qual é a diferença com o iOS?&lt;/h2&gt;

&lt;p&gt;Eu não vou dizer que o desenvolvimento de aplicativos em iOS é mais fácil, mas existem algumas coisas que os desenvolvedores de iOS têm a seu favor.&lt;/p&gt;

&lt;p&gt;1. Tamanho de tela menor.&lt;/p&gt;

&lt;p&gt;Não se pode colocar muita coisa numa tela de telefone. Simplesmente não tem espaço. Os aplicativos tendem a ser menores (muitos não chegam a ter um backend). Isso, combinado com a cultura do minimalismo, simplifica muito as coisas em termos de código e informação. Simplesmente existe menos de tudo.&lt;/p&gt;

&lt;p&gt;2. Não há legado.&lt;/p&gt;

&lt;p&gt;Aplicativos móveis são muito novos. Programadores iOS não estão inundados com 100.000 linhas de código legado, o que é comum em aplicativos corporativos. Isso os deixa livres para recomeçar do zero.&lt;/p&gt;

&lt;p&gt;3. Uma linguagem única.&lt;/p&gt;

&lt;p&gt;Pode-se criar um aplicativo iOS conhecendo apenas uma linguagem: Objective C. Um típico programador web precisa saber pelo menos quatro ou cinco linguagens para fazer um simples HTML estático.&lt;/p&gt;

&lt;p&gt;4. Plataforma madura.&lt;/p&gt;

&lt;p&gt;Uma grande parte do trabalho pesado é feito para você pelo iOS. Se você precisa de algo com fotos, música ou integração com o Facebook, já está feito. Somente pluga-se.&lt;/p&gt;

&lt;p&gt;5. Muito visual.&lt;/p&gt;

&lt;p&gt;Essa foi provavelmente a maior diferença para mim, que vim do mundo corporativo. No lugar de perder dias nadando por camadas de arquitetura (fazendo mocks e testando unitariamente cada passo do caminho), o programador iOS praticamente não tem camadas. Eles ocupam seu tempo quase todo na camada de interface com usuário.&lt;/p&gt;

&lt;p&gt;Isso significa que a natureza do código escrito, com frequência, é apenas visual. A única forma de ver se funcionou é abrir o simulador e testar.&lt;/p&gt;

&lt;p&gt;Por mais interessante que sejam essas diferenças, no entanto, ainda falta uma parte da história. Se fosse só isso, toda plataforma móvel iria desfrurar desse nível superior de qualidade. Isso não acontece. Há algo mais acontecendo. Algo maior.&lt;/p&gt;

&lt;h2 id=&#39;quem_se_importa&#39;&gt;Quem se importa?&lt;/h2&gt;

&lt;p&gt;Quando você faz algo por muito tempo, é fácil esquecer o que outras pessoas já fizeram na sua área sem os mesmos recursos.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Arquitetos utilizavam réguas de cálculo para trabalhar.&lt;/li&gt;

&lt;li&gt;Navegadores utilizavam as estrelas para navegar.&lt;/li&gt;

&lt;li&gt;Artistas trabalhavam somente com suas mãos.&lt;/li&gt;

&lt;li&gt;Programadores não utilizavam testes unitários (muitas vezes entregando produtos com mais qualidade do que se vê hoje em dia).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E mesmo assim em todas essas áreas, os profissionais foram capazes de realizar o que hoje, com ferramentas modernas, podemos admitir como um trabalho de alta qualidade. Quais eram seus segredos?&lt;/p&gt;

&lt;h2 id=&#39;eles_se_importavam&#39;&gt;Eles se importavam&lt;/h2&gt;

&lt;p&gt;Essas pessoas simplesmente se preocupavam mais com seu trabalho, e com a forma como o faziam, do que seus contemporâneos. E é isso que eu vejo na comunidade iOS.&lt;/p&gt;

&lt;p&gt;Eles se preocupam mais com a arte.&lt;br /&gt;Eles se preocupam mais com o texto exato e o espaçamento do texto nos butões.&lt;br /&gt;Eles se preccupam mais com velocidade e performance.&lt;br /&gt;E eles se preocupam muito com os mínimos detalhes (como por exemplo relembrar onde uma lista estava posicionada quando um usuário colocou a aplicação em background).&lt;/p&gt;

&lt;p&gt;A Apple trabalha pesado para ter certeza de que cada programador em seu ecossistema se importe e ela os entrega ferramentas para que não tenham desculpa para não se importar.&lt;/p&gt;

&lt;p&gt;Eles documentam cuidadosamente como criar uma arte linda para os aplicativos.&lt;br /&gt;Eles compartilham (e fazem cumprir) guias de interface de usuário para o desenvolvimento de aplicativos móveis.&lt;br /&gt;Eles fazem a curadoria e bloqueiam aplicativos que não atendam determinados padrões de qualidade.&lt;br /&gt;E seu antigo CEO era conhecido por ligar para as pessoas no meio da noite pedindo trocar a cor de um logo.&lt;/p&gt;

&lt;p&gt;Está no DNA da comunidade. Aqui está a carta que se recebe no primeiro dia de trabalho na Apple.&lt;/p&gt;
&lt;img src=&#39;/assets/images/2013/apple-first-day-of-work.png&#39; /&gt;&lt;hr /&gt;
&lt;p&gt;Existe o trabalho e existe o trabalho da sua vida.&lt;/p&gt;

&lt;p&gt;O tipo de trabalho que tem a sua impressão digital por todo lado. O tipo de trabalho no qual você não aceita falhar. Que você sacrificaria um fim de semana por ele. Você pode fazer esse tipo de trabalho na Apple. As pessoas não entram aqui para jogar um jogo ganho. Elas vem aqui para nadar até o fundo do poço.&lt;/p&gt;

&lt;p&gt;Elas querem que seu trabalho adicione algo mais.&lt;/p&gt;

&lt;p&gt;Algo grande. Algo que não pode acontecer em nenhum outro lugar.&lt;/p&gt;

&lt;p&gt;Bem-vindo à Apple.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Esses caras se preocupam. Eles se preocupam como artistas. E o mesmo não pode ser dito sobre outras plataformas e comunidades das quais já fiz parte.&lt;/p&gt;

&lt;h2 id=&#39;e_o_que_disso_tem_relao_com_testes_unitrios&#39;&gt;E o que disso tem relação com testes unitários?&lt;/h2&gt;

&lt;p&gt;Absolutamente nada. É aí que está a minha questão.&lt;/p&gt;

&lt;p&gt;O que traz qualidade é algo muito maior que uma coleção de técnicas de engenharia de software ou um punhado de práticas.&lt;/p&gt;

&lt;p&gt;Quando eu entrei nessa comunidade eu estava com a falsa premissa de que se alguém não escrevesse código como eu escrevo, essa pessoa deveria estar fazendo errado.&lt;/p&gt;

&lt;p&gt;Em vez disso, eu descobri uma comunidade que se importa mais com qualidade do que eu, e que eu ainda tenho muito a aprender sobre como criar uma experiência de qualidade.&lt;/p&gt;

&lt;p&gt;Isso é o que todas essas coisas me ensinaram. A questão não são as práticas. A questão é o espírito, a intenção, e a situação em que são aplicadas. Usar determinadas práticas quando necessário. Rapidamente abandonar quando não necessário.&lt;/p&gt;

&lt;p&gt;Os testes são ferramentas de valor inestimável para escrever um bom software? Claro!&lt;br /&gt;Vou criar um software ruim se eu não puder realizar testes unitários? Não!&lt;/p&gt;

&lt;p&gt;E foi isso que esta experiência me ensinou. Eu preciso ser mais que um apunhado de práticas. Eu continuarei fazendo testes unitários onde eu puder (incluindo iOS) e onde não puder farei o que for preciso para ter qualidade.&lt;/p&gt;

&lt;p&gt;Tudo que tenho a dizer é que para continuar crescendo precisamos colocar em cheque as nossas maiores suposições. Isso nem sempre faz você se sentir bem, mas é dessa maneira que crescemos, ganhamos experiência e transformamos conhecimento em sabedoria.&lt;/p&gt;

&lt;p&gt;Se você pensa que já resolveu tudo e que todas as soluções encontradas são as melhores, então você parou de viver.&lt;/p&gt;

&lt;p&gt;Se você quer ver o quão profundo toda essa discussão por qualidade pode ir, eu sugiro o livro &amp;#8220;Zen and the Art of Motorcycle Maintenance&amp;#8221;. Não é um livro fácil de ler. Mas pode mudar a sua vida.&lt;/p&gt;

&lt;p&gt;E não se esqueça, continue escrevendo testes unitários.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2012/8/25/menos-e-mais-como-lidar-com-restricoes</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2012/8/25/menos-e-mais-como-lidar-com-restricoes/"/>
    <title>Menos é mais: como lidar com restrições?</title>
    <published>2012-08-25T00:00:00-07:00</published>
    <updated>2012-08-25T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Lidar com restrições é sempre complexo. Pior seria se elas não existissem. Se você tivesse tempo infinito para realizar uma tarefa? Quanto tempo você levaria para finalizar? Muito tempo. E se tivesse dinheiro infinito? Gastaria muito dinheiro. Os cenários de abundância de recursos levam ao excesso de consumo dos mesmos.&lt;/p&gt;

&lt;p&gt;Quando se possui recursos escassos, deve-se sempre trabalhar para otimizar as atividades e os processos de forma a aproveitar melhor esses recursos. A otimização leva a melhores formas de trabalho e organização, que leva a economias (não necessariamente financeiras). Ainda de quebra pode levar a economia de recursos oriundos de fontes naturais, como papel ou eletricidade, o que gera um grande impacto para o mundo e a humanidade se for aplicado em larga escala.&lt;/p&gt;

&lt;p&gt;Em software é comum que 2 tipos de recurso sejam mal utilizados: tempo e dinheiro. Justamente os dois que são considerados os mais valiosos nos dias atuais. Talvez por isso algumas das estatísticas do &lt;a href=&#39;http://blog.standishgroup.com/&#39;&gt;Chaos Report&lt;/a&gt; se mantenham quase constantes nos últimos 10 anos: 60% de todo software produzido no mundo nunca é utilizado e 20% é utilizado raramente.&lt;/p&gt;

&lt;p&gt;Software é virtual, é digital e tudo é possível. Com recursos aplicados em abundância há certeza de sair algo que vai se enquadrar exatamente nos 80% de software produzido sem utilidade.&lt;/p&gt;

&lt;p&gt;Para produzir software que se encaixe nos 20% de funcionalidades que fazem sentido existir é preciso aplicar restrições de tempo e dinheiro nos projetos. Com menos tempo e menos dinheiro, é preciso focar nas funcionalidades que são realmente essenciais e esquecer o resto. É um exercício de desprendimento&amp;#8230;&lt;/p&gt;

&lt;p&gt;Há empresas que demoram meses para produzir um simples &lt;a href=&#39;http://www.manualdastartup.com.br/blog/o-mvp-a-ferramenta-de-experimentacao-e-aprendizado-da-startup/&#39;&gt;MVP&lt;/a&gt; em software. Eu &lt;a href=&#39;http://startupdev.com.br/&#39;&gt;faço em 2 dias&lt;/a&gt;! O segredo são as restrições&amp;#8230; os resultados são incríveis.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/10/10/projeto-startupdev-da-semana-amigo-n-o-se-compra</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/10/10/projeto-startupdev-da-semana-amigo-n-o-se-compra/"/>
    <title>Projeto StartupDEV da Semana: Amigo não se compra!</title>
    <published>2011-10-10T00:00:00-07:00</published>
    <updated>2011-10-10T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O Startup DEV que começa amanhã tratará de um tema muito especial: adoção de animais domésticos, principalmente cães e gatos. É preciso muita responsabilidade ao possuir um animal. Eles tem sentimento e precisam de cuidado especial, tão como fornecemos a nossos filhos.&lt;/p&gt;

&lt;p&gt;O portal &lt;strong&gt;Amigo não se compra&lt;/strong&gt; vai ajudar animais abandonados de todo o país a terem um novo lar. O portal irá facilitar a adoção de animais ao permitir que ONGs e protetores independentes divulguem os animais que tem para adoção.&lt;/p&gt;

&lt;p&gt;É muito legal participar de um projeto que além de tecnologia, tem por trás um algo mais.&lt;/p&gt;

&lt;p&gt;Quer acompanhar o desenvolvimento ao vivo? Ele será nos dias 11 e 12 de outubro. Estaremos online no canal #startupdev do irc.freenode.net. Durante o dia iremos falar sobre tudo que estiver rolando no desenvolvimento do projeto e dar dicas de programação, mostrando como os problemas foram sendo resolvidos! Não perca!&lt;/p&gt;

&lt;p&gt;O &lt;a href=&#39;http://startupdev.com.br&#39;&gt;Startup DEV&lt;/a&gt; é um modelo de desenvolvimento de &lt;a href=&#39;http://exame.abril.com.br/pme/dicas-de-especialista/noticias/como-definir-meu-produto-minimo-viavel&#39;&gt;MVP&lt;/a&gt;. Nós realizamos uma reunião com o cliente onde definimos o escopo a ser trabalhado no produto e desenvolvemos esse &lt;a href=&#39;http://exame.abril.com.br/pme/dicas-de-especialista/noticias/como-definir-meu-produto-minimo-viavel&#39;&gt;MVP&lt;/a&gt; em apenas 48h. Para mais informações sobre o &lt;a href=&#39;http://startupdev.com.br&#39;&gt;Startup DEV&lt;/a&gt;, visite &lt;a href=&#39;http://startupdev.com.br&#39;&gt;o site&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;O time do Startup DEV é composto por &lt;a href=&#39;http://twitter.com/smergulhao&#39;&gt;Sylvestre Mergulhão&lt;/a&gt;, &lt;a href=&#39;http://twitter.com/rafaelp&#39;&gt;Rafael Lima&lt;/a&gt; e &lt;a href=&#39;http://twitter.com/ramonpage&#39;&gt;Ramon Bispo&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/8/22/novo-projeto-do-startupdev-contacal</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/8/22/novo-projeto-do-startupdev-contacal/"/>
    <title>Novo Projeto do StartupDEV: ContaCal</title>
    <published>2011-08-22T00:00:00-07:00</published>
    <updated>2011-08-22T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Eu e &lt;a href=&#39;http://rafael.adm.br&#39;&gt;Rafael Lima&lt;/a&gt; no projeto &lt;a href=&#39;http://startupdev.com.br&#39;&gt;Startup DEV&lt;/a&gt; vamos lançar na semana que vem mais um aplicativo web. Trata-se do ContaCal, um aplicativo para controle alimentar, suporte a dietas de emagrecimento e controle de peso. O aplicativo vai contar com funcionalidades como controle de calorias consumidas diariamente, alimentos e muito mais.&lt;/p&gt;

&lt;p&gt;Para quem quiser acompanhar o desenvolvimento do produto, ele será nos dias 23 e 24 de agosto. Nós estaremos online no canal #startupdev do irc.freenode.net. Durante o dia iremos falar sobre tudo que estiver rolando no desenvolvimento do projeto e dar dicas de programação, mostrando como os problemas foram sendo resolvidos! Não perca!&lt;/p&gt;

&lt;p&gt;O &lt;a href=&#39;http://startupdev.com.br&#39;&gt;Startup DEV&lt;/a&gt; é um modelo de desenvolvimento de &lt;a href=&#39;http://exame.abril.com.br/pme/dicas-de-especialista/noticias/como-definir-meu-produto-minimo-viavel&#39;&gt;MVP&lt;/a&gt;. Nós realizamos uma reunião com o cliente onde definimos o escopo a ser trabalhado no produto e desenvolvemos esse &lt;a href=&#39;http://exame.abril.com.br/pme/dicas-de-especialista/noticias/como-definir-meu-produto-minimo-viavel&#39;&gt;MVP&lt;/a&gt; em apenas 48h. O risco para o cliente é reduzido, pois o valor é fixo R$ 4,8 mil.&lt;/p&gt;

&lt;p&gt;Para mais informações sobre o &lt;a href=&#39;http://startupdev.com.br&#39;&gt;Startup DEV&lt;/a&gt;, visite &lt;a href=&#39;http://startupdev.com.br&#39;&gt;nosso site&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/7/10/como-colocar-uma-aplica-o-no-ar</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/7/10/como-colocar-uma-aplica-o-no-ar/"/>
    <title>Como colocar uma aplicação no ar?</title>
    <published>2011-07-10T00:00:00-07:00</published>
    <updated>2011-07-10T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Já terminou a sua aplicação lindona e agora precisa colocá-la no ar? Existem inúmeras questões que precisam ser resolvidas para que tudo funcione corretamente e é sempre necessário dar uma atenção especial a segurança.&lt;/p&gt;

&lt;p&gt;Ao longo dos anos lidando com aplicações online eu desenvolvi várias receitas para facilitar o deploy das minhas aplicações. E agora eu compartilho tudo no curso on-line &lt;a href=&#39;http://www.egenial.pro/pt/imersaosysdeploy&#39;&gt;Imersão Sys Deploy&lt;/a&gt;! São 4 manhãs de sábado recheadas de mão na massa!&lt;/p&gt;

&lt;p&gt;Cada aluno tem acesso a um servidor exclusivo, onde poderá realizar todos os testes sem se preocupar e sem comprometer nenhum ambiente de produção. Um verdadeiro ambiente safe-to-fail.&lt;/p&gt;

&lt;p&gt;Você vai aprender sobre Apache, otimização, DNS, Crontab, SSH, Firewall, Port Knocking, Capistrano e muito mais. O curso é focado no deploy de aplicações Ruby on Rails, mas pode ser adaptado facilmente para deploy de outras aplicações como PHP, Django, Sinatra etc.&lt;/p&gt;

&lt;p&gt;A próxima turma começa no sábado, dia 16 de julho! Então não perca tempo, pois as vagas são limitadas. &lt;a href=&#39;http://www.egenial.pro/pt/imersaosysdeploy&#39;&gt;Inscreva-se agora&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/5/2/geeks-on-a-plane-no-rio</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/5/2/geeks-on-a-plane-no-rio/"/>
    <title>Geeks on a Plane no Rio!</title>
    <published>2011-05-02T00:00:00-07:00</published>
    <updated>2011-05-02T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Um grupo de geeks, empreendedores e investidores do &lt;a href=&#39;http://pt.wikipedia.org/wiki/Vale_do_Sil%C3%ADcio&#39;&gt;Vale do Silício&lt;/a&gt; resolveu se juntar, entrar num avião e rodar diversos países, para conhecer pessoas, outros empreendedores, empresas etc, buscando se divertir e é claro fazer negócios! Não é loucura, é real, veja no &lt;a href=&#39;http://geeksonaplane.com/destinations/rio-de-janeiro/&#39;&gt;site do Geeks on a Plane&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eles já estão no Rio e amanhã farão a agenda oficial. A questão é que a agenda que montaram para eles no Rio é extremamente política e pouco voltada para o que eles querem conhecer: outros nerds e empreendedores para fazer negócio!&lt;/p&gt;

&lt;p&gt;Então eu a galera do &lt;a href=&#39;http://horaextra.org/&#39;&gt;#horaextra&lt;/a&gt; não podíamos deixar que eles viessem ao Rio e saissem daqui com a certeza de que no Rio só o samba tem sucesso. Nos juntamos e falamos com os caras. Eles não tem como desmarcar a agenda deles, mas conseguimos marcar um encontro. Será dia 3 de maio, a partir das 19h, no Restaurante Alma Carioca, o mesmo onde rolou o primeiro &lt;a href=&#39;http://startupmeetup.com.br/&#39;&gt;Startup Meetup no Rio&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resumo&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que?&lt;/strong&gt; Encontro do Geeks on a Plane&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Onde?&lt;/strong&gt; Restaurante Alma Carioca, Praia de Botafogo, 470 em Botafogo&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quando?&lt;/strong&gt; Dia 3 de maio das 19h as 24h&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quanto?&lt;/strong&gt; R$30 de consumação&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como?&lt;/strong&gt; Faça sua &lt;a href=&#39;http://bit.ly/HoraExtraGOAP&#39;&gt;inscrição aqui&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Atenção&lt;/strong&gt;: O lugar só comporta 100 pessoas, então se você não quiser ficar barrado do lado de fora, chegue cedo.&lt;/p&gt;

&lt;p&gt;&amp;#32;&lt;iframe frameborder=&#39;0&#39; height=&#39;350&#39; marginheight=&#39;0&#39; marginwidth=&#39;0&#39; scrolling=&#39;no&#39; src=&#39;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Praia+de+Botafogo,+470+-+Botafogo,+Rio+de+Janeiro+-+RJ,+22250-040,+Brasil&amp;amp;aq=0&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=39.86519,98.4375&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Praia+de+Botafogo,+470+-+Botafogo,+Rio+de+Janeiro,+22250-040,+Brazil&amp;amp;t=h&amp;amp;ll=-22.949799,-43.181954&amp;amp;spn=0.027663,0.036478&amp;amp;z=14&amp;amp;iwloc=A&amp;amp;output=embed&#39; width=&#39;425&#39; /&gt;&lt;br /&gt;&lt;small&gt;&lt;a href=&#39;http://maps.google.com/maps?f=q&amp;amp;source=embed&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Praia+de+Botafogo,+470+-+Botafogo,+Rio+de+Janeiro+-+RJ,+22250-040,+Brasil&amp;amp;aq=0&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=39.86519,98.4375&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=Praia+de+Botafogo,+470+-+Botafogo,+Rio+de+Janeiro,+22250-040,+Brazil&amp;amp;t=h&amp;amp;ll=-22.949799,-43.181954&amp;amp;spn=0.027663,0.036478&amp;amp;z=14&amp;amp;iwloc=A&#39; style=&#39;color:#0000FF;text-align:left&#39;&gt;View Larger Map&lt;/a&gt;&lt;/small&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/1/11/processando-emails-recebidos-no-rails-com-mailman</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/1/11/processando-emails-recebidos-no-rails-com-mailman/"/>
    <title>Processando emails recebidos no Rails com MailMan</title>
    <published>2011-01-11T00:00:00-08:00</published>
    <updated>2011-01-11T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Processar e-mails recebidos em um aplicativo Rails parece uma tarefa complicada. A maioria das soluções disponíveis atualmente envolve a configuração de um servidor de e-mail dedicado só para isso. Não parece ser uma boa idéia.&lt;/p&gt;

&lt;p&gt;Quem também acha isso é o Jonathan Rudenberg que junto com mais uma galera, desenvolveu no Ruby Summer of Code do ano passado, o Mailman. Um microframework para processamento de e-mails recebidos.&lt;/p&gt;

&lt;p&gt;A funcionalidade é bem simples. Resumindo, você configura uma caixa postal que o Mailman vai varrer e uma callback para ser executada para cada e-mail que corresponder ao critério que você estabelecer.&lt;/p&gt;

&lt;p&gt;Um exemplo simples:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require &amp;#39;mailman&amp;#39;
Mailman::Application.run do
  to &amp;#39;post-%id%@blog.com&amp;#39; do 
    Post.find(params[:id]).comments &amp;lt;&amp;lt; Comment.create(:body =&amp;gt; message)
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mas vamos devagar. Começando pelo começo.&lt;/p&gt;

&lt;p&gt;Como sempre, no seu Gemfile inclua a gem do Mailman:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem &amp;#39;mailman&amp;#39;, &amp;#39;0.4.0&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Execute o bundler:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;No seu Mailer, defina a callback a ser chamada para os e-mails recebidos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Mailer &amp;lt; ActionMailer::Base
  def receive(email)
    # o seu código entra aqui
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Depois disso é necessário configurar o Mailman. Recomendamos a criação de um script (em script/mailman). Como abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;#!/usr/bin/env ruby
require File.expand_path(&amp;#39;../../config/application&amp;#39;, __FILE__)
require &amp;quot;mailman&amp;quot;

Mailman.config.poll_interval = 0
Mailman.config.ignore_stdin = true
Mailman.config.logger = Logger.new(&amp;#39;log/mailman.log&amp;#39;)
Mailman.config.pop3 = {
  :username =&amp;gt; &amp;#39;incoming@example.com&amp;#39;,
  :password =&amp;gt; &amp;#39;************&amp;#39;,
  :server   =&amp;gt; &amp;#39;pop.gmail.com&amp;#39;,
  :port     =&amp;gt; 995,
  :ssl      =&amp;gt; true
}

Mailman::Application.run do
  to &amp;#39;dropbox+%domain%+%type%+%type_id%@%host%&amp;#39; do
    UserMailer.receive(message)
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos analisar as configurações mais importantes:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailman.config.poll_interval&lt;/strong&gt;: define de quanto em quanto tempo o Mailman deve executar. Nós vamos configurar o cron para executar o script/mailman periodicamente, então devemos setar essa configuração para zero. Assim ele vai executar apenas uma vez e sair.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailman.config.ignore__stdin&lt;/strong&gt;: essa configuração serve para ignorar e-mails passados diretamente para o Mailman (como no comando: cat plain_message.eml | ruby script/mailman).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailman.config.logger&lt;/strong&gt;: seta o arquivo onde você quer que o log seja salvo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mailman.config.pop3&lt;/strong&gt;: configura o mailman para usar pop3 como receiver. O Mailman pode ser configurado para trabalhar com três receivers: pop3, standard input ou maildir (onde ele varre uma pasta local a espera de novas mensagens).&lt;/p&gt;

&lt;p&gt;No nosso caso estamos usando o Gmail através do Google Apps.&lt;/p&gt;

&lt;p&gt;Logo abaixo vem o método Mailman::Application.run, que é onde a mágica acontece.&lt;/p&gt;

&lt;p&gt;Nele nós podemos configurar o que, no linguajar do Mailman, são chamados de &amp;#8216;rotas&amp;#8217;. Uma rota consiste em um método ( to, from, cc, subject, body), uma string ou regex e um bloco.&lt;/p&gt;

&lt;p&gt;O método diz onde o Mailman vai procurar pela string ou regex, no nosso caso estamos procurando no campo &amp;#8220;to&amp;#8221; do e-mail. Todo e-mail cujo &amp;#8220;to&amp;#8221; bater com a string vai ser passada para o bloco. As partes do &amp;#8220;to&amp;#8221; que forem capturadas pelo parte %domain%, por exemplo, estará disponível no bloco como params[:domain]. A mensagem então é passada para o método receive do Mailer.&lt;/p&gt;

&lt;p&gt;Agora, com o script pronto, precisamos nos assegurar que ele rode regularmente no servidor. Para isso existe o Cron, e nós usaremos o Whenever para agendar a execução do script/mailman.&lt;/p&gt;

&lt;p&gt;Adicione essas linhas no seu schedule.rb:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;job_type :command, &amp;quot;cd :path &amp;amp;&amp;amp; :task :output&amp;quot; # para executar o comando de dentro do aplicativo
every 1.minute do
  command &amp;quot;script/mailman&amp;quot;
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Configure a periodicidade de acordo com sua necessidade e pronto. Não foi tão difícil!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/1/4/autocomplete-simples-para-rails-3</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/1/4/autocomplete-simples-para-rails-3/"/>
    <title>Autocomplete simples para Rails 3 com jQuery</title>
    <published>2011-01-04T00:00:00-08:00</published>
    <updated>2011-01-04T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Autocomplete é uma ferramenta muito útil em um aplicativo web. Tanto para manter a consistencia dos dados quanto para facilitar a vida do usuário.&lt;/p&gt;

&lt;p&gt;A gem &lt;a href=&#39;https://github.com/crowdint/rails3-jquery-autocomplete&#39;&gt;rails3-jquery-autocomplete&lt;/a&gt; torna a implementação do autocomplete no rails 3 bem simples.&lt;/p&gt;

&lt;p&gt;Antes de começar, verifique se você já está incluindo o &lt;a href=&#39;http://jquery.com/&#39;&gt;jQuery&lt;/a&gt; e o &lt;a href=&#39;http://jqueryui.com/demos/autocomplete/&#39;&gt;jQuery.ui&lt;/a&gt; em seu layout, pois eles são pre-requisito para essa gem.&lt;/p&gt;

&lt;p&gt;Se estiver tudo ok, vamos ao trabalho. Para começar, os passos básicos:&lt;/p&gt;

&lt;p&gt;Adicione a gem ao seu Gemfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem &amp;#39;rails3-jquery-autocomplete&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dê um:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Rode o generator:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails generate autocomplete&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E inclua o javascript em seu layout:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;javascript_include_tag &amp;quot;autocomplete-rails.js&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Então, com tudo configurado partimos para a utilização.&lt;/p&gt;

&lt;p&gt;Digamos que nós tivessemos os modelos Product e Category e quisessemos fazer autocomplete do nome da categoria nos formulários dos produtos.&lt;/p&gt;

&lt;p&gt;Note que o campo category do modelo Product precisa ser um campo de texto. Para fazer autocomplete em um campo que é chave estrangeira a abordagem é um pouco diferente, e vai ficar para um próximo post.&lt;/p&gt;

&lt;p&gt;Seguindo. O próximo passo é adicionar no products_controller.rb:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;autocomplete :category, :name&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso cria uma action chamada autocomplete_category_name que retorna um json com os valores possiveis para o campo name.&lt;/p&gt;

&lt;p&gt;Inclua a action nas rotas:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;resources :products do
  get :autocomplete_category_name, :on =&amp;gt; :collection
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nas views você só precisa substituir o text_field pela tag autocomplete_field, como no exemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;form_for @product do |f|
  f.autocomplete_field :category_name, autocomplete_category_name_products_path
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E é só. Você tem um autocomplete pronto e funcional.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2011/1/3/whenever-cron-jobs-do-jeito-ruby</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2011/1/3/whenever-cron-jobs-do-jeito-ruby/"/>
    <title>Whenever - Cron Jobs do jeito Ruby</title>
    <published>2011-01-03T00:00:00-08:00</published>
    <updated>2011-01-03T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Uma das ferramentas mais úteis (até mesmo essenciais, eu diria) no arsenal de um desenvolvedor web são as tarefas do &lt;a href=&#39;http://en.wikipedia.org/wiki/Cron&#39;&gt;cron&lt;/a&gt;. Porém sua sintaxe um tanto quanto estranha intimida muitos desenvolvedores, que acabam subutilizando a ferramenta.&lt;/p&gt;

&lt;p&gt;É ai que entra o Whenever, uma DSL ruby para escrever cron job que deixa essa tarefa bem mais fácil. Para instalar o whenever é necessario um:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install whenever&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;ou inclua a seguinte linha em seu Gemfile:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem &amp;#39;whenever&amp;#39;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;e dê um:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;bundle install&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;depois disso você precisa navegar até o diretorio do seu projeto e executar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;wheneverize .&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso irá criar um arquivo chamado schedule.rb na pasta config.&lt;/p&gt;

&lt;p&gt;É nesse arquivo que vão entrar suas tarefas, e é ai que começa a diversão.&lt;/p&gt;

&lt;p&gt;Dê uma olhada no seguinte snippet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;every 2.hours do
 # seu comando entra aqui
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;É fácil assim.&lt;/p&gt;

&lt;p&gt;Você pode ainda passar um segundo parametro para o metodo every especificando o horario que você quer que a tarefa seja executada.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;every 2.days, :at =&amp;gt; ‘2am’ do …&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O whenever oferece também um metodo ‘rake’ que permite executar rake tasks com facilidade. Por exemplo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;every :hour do
  rake minha:rake:task
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Você pode ainda executar comandos diretamente:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;every 15.minutes do
 command &amp;quot;/usr/bin/comando_qualquer”
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Lindo.&lt;/p&gt;

&lt;p&gt;Só fique esperto para caso você receba um erro parecido com esse no seu /var/log/syslog:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Dec 28 02:00:01 toad CRON[23436]: (CRON) error (grandchild #23438 failed with exit status 127)
Dec 28 02:00:01 toad CRON[23436]: (CRON) info (No MTA installed, discarding output)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso significa que o cron não conseguiu encontrar o comando rake no path. Se isso acontecer é só você especificar o path do comando. como abaixo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;job_type :rake, &amp;quot;cd :path &amp;amp;&amp;amp; RAILS_ENV=:environment /usr/local/bin/rake :task :output&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Mais algumas dicas:&lt;/p&gt;

&lt;p&gt;Você pode redirecionar o log do whenever para outro arquivo incluindo a linha abaixo em seu schedule:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set :output, &amp;quot;/path/para/o/seu.log&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pare integrar o whenerver com o capistrano inclua essas linhas no seu deploy.rb. Assim o cron será atualizado a cada deploy:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;set :whenever_command, &amp;quot;bundle exec whenever&amp;quot;
require &amp;#39;whenever/capistrano&amp;#39;&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2010/10/1/por-que-voc-deve-ir-ao-devinrio-2010</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2010/10/1/por-que-voc-deve-ir-ao-devinrio-2010/"/>
    <title>Por que você deve ir ao Devinrio 2010</title>
    <published>2010-10-01T00:00:00-07:00</published>
    <updated>2010-10-01T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Estou achando incrivelmente alta a quantidade de desenvolvedores que não estão dando o devido valor aos eventos como o &lt;a href=&#39;http://devinrio.com.br&#39;&gt;Devinrio&lt;/a&gt;. Eu como consultor da &lt;a href=&#39;http://helabs.com.br&#39;&gt;Helabs&lt;/a&gt; tenho tido contato com desenvolvedores de diversos níveis, de várias empresas e eu percebo que eles não se interessam pela coisa.&lt;/p&gt;

&lt;p&gt;Qual será o real motivo desse desinteresse? Será que não gosta da profissão? Será que não gosta da forma como trabalha? Será que a empresa não o incentiva? Acredito que seja uma conjunção de fatores como esses que resultam no desinteresse.&lt;/p&gt;

&lt;p&gt;Dos motivos que apresentei acima, o único que é realmente problemático é o do &amp;#8220;gostar da profissão&amp;#8221;. Oi, se você não gosta de fazer software, está fazendo isso por que? Vai ser feliz e fazer o que gosta!&lt;/p&gt;

&lt;p&gt;Se você não gosta da forma como você trabalha, mas gosta de fazer software, então é porque provavelmente você está fazendo da forma errada! No Devinrio vai ter UM MONTE de palestras pra ensinar a forma certa de se fazer as coisas, em várias linguagens diferentes! Você vai perder a oportunidade de aprender como se faz melhor?&lt;/p&gt;

&lt;p&gt;Se a sua empresa não te incentiva a participar dos eventos, mas você gosta de ir, então talvez seja a hora de trocar de emprego&amp;#8230; a sua empresa atual não merece ter você como colaborador. O Devinrio contará com a participação de diversas empresas, além dos patrocinadores, todas interessadas em contratar os melhores profissionais do mercado! E os melhores profissionais estarão no Devinrio! Você vai perder a oportunidade de conseguir trabalho num lugar mais legal que o seu atual?&lt;/p&gt;

&lt;p&gt;Você vai perder a oportunidade de fazer &lt;a href=&#39;http://dojorio.wordpress.com/&#39;&gt;Dojo&lt;/a&gt; com a nata do desenvolvimento de software carioca? Sério, só um louco perderia o Devinrio 2010. Vejo vocês lá.&lt;/p&gt;

&lt;p&gt;Sugiro fortemente que você também leia o excelente &lt;a href=&#39;http://www.bernardofontes.net/blog/porque-voce-deve-ir-ao-dev-in-rio-2010/&#39;&gt;post do Bernando Fontes sobre o Devinrio&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2010/4/30/cursos-presenciais-de-ruby-on-rails</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2010/4/30/cursos-presenciais-de-ruby-on-rails/"/>
    <title>Cursos presenciais de Ruby on Rails</title>
    <published>2010-04-30T00:00:00-07:00</published>
    <updated>2010-04-30T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Aproveitando o &lt;a href=&#39;http://twitter.com/#search?q=%40smergulhao&#39;&gt;imenso sucesso&lt;/a&gt; que está sendo o &lt;a href=&#39;http://mergulhao.info/2010/2/24/curso-de-administracao-linux-e-deploy-de-apps-rails&#39;&gt;curso Imersão Sys Deploy&lt;/a&gt; em parceria com &lt;a href=&#39;http://www.egenialsas.com.br/&#39;&gt;e-Genial&lt;/a&gt; resolvi pesquisar sobre o interesse das pessoas em relação a cursos presenciais.&lt;/p&gt;

&lt;p&gt;Estou em negociação com um centro de treinamento aqui no Rio de Janeiro e é possivel que fechemos uma parceria para cursos presenciais ligados a Ruby on Rails.&lt;/p&gt;

&lt;p&gt;Além do Rio de Janeiro também tenho interesse em atingir outros estados. Por isso elaborei um pequeno questionário que será útil para verificar a viabilidade dos cursos presenciais no Rio e em outras cidades do Brasil. Vocês me ajudam a divulgar? Muito obrigado.&lt;/p&gt;

&lt;p&gt;Link direto: &lt;a href=&#39;https://spreadsheets.google.com/viewform?formkey=dGtKY0hyMjhqUEgxNnpHempISzlsbEE6MQ&#39;&gt;https://spreadsheets.google.com/viewform?formkey=dGtKY0hyMjhqUEgxNnpHempISzlsbEE6MQ&lt;/a&gt;&lt;/p&gt;
&lt;iframe frameborder=&#39;0&#39; height=&#39;1100&#39; marginheight=&#39;0&#39; marginwidth=&#39;0&#39; src=&#39;https://spreadsheets.google.com/embeddedform?formkey=dGtKY0hyMjhqUEgxNnpHempISzlsbEE6MQ&#39; width=&#39;530&#39;&gt;Carregando...&lt;/iframe&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2010/2/24/curso-de-administracao-linux-e-deploy-de-apps-rails</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2010/2/24/curso-de-administracao-linux-e-deploy-de-apps-rails/"/>
    <title>Curso de administração Linux e deploy de Apps Rails</title>
    <published>2010-02-24T00:00:00-08:00</published>
    <updated>2010-02-24T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Hoje eu e o Carlos Eduardo da &lt;a href=&#39;http://www.egenialsas.com.br/&#39;&gt;e-Genial&lt;/a&gt; fechamos os últimos detalhes de um novo curso: &lt;a href=&#39;http://www.egenial.com.br/imersaosysdeploy&#39;&gt;Imersão Sys Deploy&lt;/a&gt;! Os alunos vão aprender tudo sobre como configurar adequadamente um VPS para rodar aplicações Rails usando Apache com Passenger, Mysql e deploy com Capistrano.&lt;/p&gt;

&lt;p&gt;E de quebra ainda vão ter capítulos específicos para tratar de serviço smtp com postfix, backup, monitoramento e segurança. É um curso completo sobre administração de servidores por um preço imperdível!&lt;/p&gt;

&lt;p&gt;E ainda tem mais! Cada aluno do curso terá acesso a um VPS exclusivo onde ele executará as tarefas junto comigo. As aulas serão aos sábados pela manhã pelo &lt;a href=&#39;http://www.egenialsas.com.br/site/treinatom&#39;&gt;TreinaTom&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para saber mais detalhes acesse já o &lt;a href=&#39;http://www.egenial.com.br/imersaosysdeploy&#39;&gt;site do curso&lt;/a&gt; e faça a sua &lt;a href=&#39;http://www.egenial.com.br/imersaosysdeploy/matricula&#39;&gt;inscrição&lt;/a&gt;, as vagas são limitadíssimas.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2010/2/4/empreender-essa-e-a-hora-parte-1</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2010/2/4/empreender-essa-e-a-hora-parte-1/"/>
    <title>Empreender, essa é a hora! - Parte 1</title>
    <published>2010-02-04T00:00:00-08:00</published>
    <updated>2010-02-04T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Há pouco mais de um ano atrás eu fiz uma palestra no &lt;a href=&#39;http://encontrodeti.com.br/&#39;&gt;Encontro de TI&lt;/a&gt; sobre &lt;a href=&#39;http://mergulhao.info/2008/12/16/empreendedorismo-on-rails-no-encontro-de-ti&#39;&gt;Empreendedorismo on Rails&lt;/a&gt;. A apresentação bombou, fez o maior sucesso, mas até hoje eu não tinha dado nenhum feedback sobre o que eu mesmo estava fazendo em relação ao que preguei na palestra. O fato é que 2009 foi um ano de muito trabalho, onde eu comecei a preparar os alicerces do que vou apresentar hoje. É sempre bom lembrar que tudo foi e continuará sendo feito durante os tempos vagos.&lt;/p&gt;

&lt;p&gt;Em 2009 me juntei com mais 3 empreendedores para criar a idéia do nosso produto. Ele tem um nome: Clientella. Trata-se de um CRM para pequenas empresas e profissionais liberais. Alguns pensarão: &amp;#8220;Ah fala sério, vocês vão copiar o Highrise da 37signals&amp;#8221;. Bom a idéia não é essa. Para nós de TI que estamos adaptados aos sistemas web e com o idioma inglês é simples usar um sistema gringo. Com o Clientella estamos pensando nas empresas que tem especificidades brasileiras, que buscam um serviço nacional, com suporte na própria língua e não necessariamente entendem algo de web.&lt;/p&gt;

&lt;p&gt;&amp;#8220;Da onde saiu essa idéia maluca de fazer um CRM? Esse nome é batido pra caramba e existem diversos players no mercado!&amp;#8221;, vocês pensariam. Bom, eu trabalhei customizando o SugarCRM - um bloated CRM opensource - para uma empresa há uns 3 anos atrás. O que eu aprendi lá é o quanto as empresas precisam de um CRM e o quanto as soluções existentes não resolvem os problemas. Lembrando que estamos falando de pequenas empresas, logo qualquer coisa como Oracle, SAP, SalesForce e Microsoft está fora de cogitação apenas pelo custo de aquisição das licenças ou de necessidade de infraestrutura própria. Daí pode-se ver a quanto tempo estou maturando essa idéia de um CRM na cabeça ;-)&lt;/p&gt;

&lt;p&gt;E o que você pode fazer para ajudar? Se você tem uma empresa ou é um profissional liberal e precisa de um CRM, acesse o &lt;a href=&#39;http://clientella.com.br/beta&#39;&gt;nosso site&lt;/a&gt;, leia a carta convite e &lt;a href=&#39;http://clientella.com.br&#39;&gt;preencha o formulário&lt;/a&gt;. Assim você nos ajudará com o Clientella e ainda poderá se tornar parte do programa de beta testers.&lt;/p&gt;

&lt;p&gt;Foto de &lt;a href=&#39;http://www.flickr.com/photos/magnetbox/&#39;&gt;magnetbox&lt;/a&gt;(&lt;a href=&#39;http://creativecommons.org/licenses/by/2.0/deed.en&#39;&gt;cc&lt;/a&gt;)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/12/8/se-seu-desenvolvedor-esta-falando-pense-que-pode-ser-serio</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/12/8/se-seu-desenvolvedor-esta-falando-pense-que-pode-ser-serio/"/>
    <title>Se seu desenvolvedor está falando, pense que pode ser sério</title>
    <published>2009-12-08T00:00:00-08:00</published>
    <updated>2009-12-08T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Quantas vezes você já não foi forçado a fazer uma coisa do jeito que &lt;em&gt;seria&lt;/em&gt; mais rápido, pois seu chefe achou que o jeito que demora mais não seria uma boa? As vezes me esqueço em como é comum superiores, gerentes, analistas ou &amp;#8220;coloque-aqui-qualquer-nome-que-manda-mais-que-você-na-empresa&amp;#8221; darem pitaco no seu trabalho sem saber exatamente do que estão falando.&lt;/p&gt;

&lt;p&gt;Hoje em dia não é tão comum isso acontecer comigo, mas sei que ainda é comum acontecer com muita gente. Engraçado é que normalmente você pensa: &amp;#8220;ok, vai ser mais rápido, mas daqui a pouco algo vai dar errado&amp;#8221;. Em geral é batata!&lt;/p&gt;

&lt;p&gt;Se você é desenvolvedor e está passando por uma situação como essas, tente uma forma melhor de mostrar porque você acha que, apesar de mais demorada, sua solução tem &lt;strong&gt;mais&lt;/strong&gt; chances de dar &lt;strong&gt;menos&lt;/strong&gt; problemas no futuro. E se você é o manda-chuva, busque saber porque o seu desenvolvedor está sugerindo uma solução que leva mais tempo, ele tem mais chances de estar certo que você.&lt;/p&gt;

&lt;p&gt;Foto de &lt;a href=&#39;http://www.flickr.com/photos/monkeyc/&#39;&gt;monkeyc.net&lt;/a&gt;(&lt;a href=&#39;http://creativecommons.org/licenses/by/2.0/deed.en&#39;&gt;cc&lt;/a&gt;)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/11/26/bundao-sai-em-curtissima-temporada-no-rio-de-janeiro</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/11/26/bundao-sai-em-curtissima-temporada-no-rio-de-janeiro/"/>
    <title>"Bundão" sai em curtíssima temporada no Rio de Janeiro!</title>
    <published>2009-11-26T00:00:00-08:00</published>
    <updated>2009-11-26T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O &lt;a href=&#39;http://mergulhao.info/2009/10/29/por-que-eu-sou-fan-tico-por-testes-e-voc-um-bund-o&#39;&gt;bundão&lt;/a&gt; foi convidado para mais dois eventos esse fim de ano.&lt;/p&gt;

&lt;p&gt;A primeira apresentação é amanhã na Simonsen. É o &lt;a href=&#39;http://www.simonsen.br/ets/&#39;&gt;1o. Encontro de Tecnologia Simonsen&lt;/a&gt; que começa hoje e termina amanhã. A &lt;a href=&#39;http://www.simonsen.br/ets/programacao.php&#39;&gt;grade completa&lt;/a&gt; está disponível no site do evento. Entre os palestrantes estão pessoas já conhecidas da comunidade de desenvolvimento do Rio como Bruno Dulcetti(&lt;a href=&#39;http://videolog.uol.com.br/&#39;&gt;Videolog&lt;/a&gt;), Victor Batista(&lt;a href=&#39;http://www.clavis.com.br&#39;&gt;Clavis&lt;/a&gt;) e Gustavo Guanabara(&lt;a href=&#39;http://www.guanabara.info/&#39;&gt;Guanabara.info&lt;/a&gt;). O Bundão se apresenta amanhã, dia 27 de novembro as 20:30!&lt;/p&gt;

&lt;p&gt;A segunda apresentação seria no Gamacomp, dia 5 de dezembro. Eu acessei o &lt;a href=&#39;http://www.gamacomp.visual.pro.br/&#39;&gt;site do Gamacomp&lt;/a&gt; agora e parece que o evento foi adiado. Atualizo aqui assim que tiver outros detalhes.&lt;/p&gt;

&lt;p&gt;Não deixem de comparecer amanhã na Simonsen!&lt;/p&gt;

&lt;p&gt;Foto de &lt;a href=&#39;http://www.flickr.com/photos/sirmightymac&#39;&gt;MightyMac&lt;/a&gt; (&lt;a href=&#39;http://creativecommons.org/licenses/by/2.0/deed.en&#39;&gt;cc&lt;/a&gt;)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/11/4/curso-de-rails-na-ultra-maratona-how-to</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/11/4/curso-de-rails-na-ultra-maratona-how-to/"/>
    <title>Curso de Rails na Ultra Maratona How To!</title>
    <published>2009-11-04T00:00:00-08:00</published>
    <updated>2009-11-04T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;No próximo fim de semana, dias 7 e 8 de novembro, teremos a &lt;a href=&#39;http://ultramaratonahowto.com.br&#39;&gt;II Ultra Maratona How To&lt;/a&gt;. São dois dias inteiros com cursos de 4 horas sobre diversos temas: administração de sistemas, segurança, programação etc.&lt;/p&gt;

&lt;p&gt;Eu iria apresentar o how to &lt;a href=&#39;http://www.ultramaratonahowto.com.br/tutoriais/Ultra_Maratona_SL_Rails.pdf&#39;&gt;Rails: Otimizando Client-side e Server-side&lt;/a&gt;, mas devido a problemas pessoais não poderei. No meu lugar quem irá apresentar é o igualmente competente &lt;a href=&#39;http://vp.blog.br/&#39;&gt;Vitor Pellegrino&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A maratona ocorre na &lt;a href=&#39;http://maps.google.com/maps?f=q&amp;amp;source=s_q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=Rua+Martins+Ferreira,+71,+no+bairro+de+Botafogo,+Rio+de+Janeiro&amp;amp;sll=-22.954088,-43.194975&amp;amp;sspn=0.009958,0.019634&amp;amp;g=Rua+Martins+Ferreira,+71,+no+bairro+de+Botafogo,+Rio+de+Janeiro&amp;amp;ie=UTF8&amp;amp;hq=&amp;amp;hnear=R.+Martins+Ferreira,+71+-+Botafogo,+Rio+de+Janeiro+-+RJ,+22271-010,+Brazil&amp;amp;ll=-22.954088,-43.194975&amp;amp;spn=0.004979,0.009817&amp;amp;t=h&amp;amp;z=17&#39;&gt;Rua Martins Ferreira, 71, no bairro de Botafogo, na zona sul do Rio de Janeiro&lt;/a&gt;. As inscrições devem ser feitas &lt;a href=&#39;http://www.ultramaratonahowto.com.br/inscricoes.php&#39;&gt;no site do evento&lt;/a&gt;. Corra pois as vagas são limitas e já estão se esgotando!&lt;/p&gt;

&lt;p&gt;O evento é uma grande iniciativa do pessoal da &lt;a href=&#39;http://www.clavis.com.br/&#39;&gt;Clavis Segurança da Informação&lt;/a&gt;, &lt;a href=&#39;http://www.tecnohall.com.br/&#39;&gt;Tecnohall Soluções em Tecnologia&lt;/a&gt; e &lt;a href=&#39;http://www.greenhat.com.br/&#39;&gt;Green Hat Segurança da Informação&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/10/30/off-topic-nunca-fa-a-uma-liga-o-usando-cart-o-de-cr-dito</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/10/30/off-topic-nunca-fa-a-uma-liga-o-usando-cart-o-de-cr-dito/"/>
    <title>[OFF-TOPIC] Nunca faça uma ligação usando Cartão de Crédito</title>
    <published>2009-10-30T00:00:00-07:00</published>
    <updated>2009-10-30T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Eu estava de férias no começo do mês e passei uma temporada nos EUA. Em NYC eu havia comprado um cartão telefônico pré-pago de $10 e fui usando para fazer ligações para o Brasil, até que ele acabou. Fui para Orlando e não tive tempo de comprar outro cartão.&lt;/p&gt;

&lt;p&gt;Então um dia liguei para o Brasil usando as instruções que havia em um orelhão, pagando com cartão de crédito. Você fala para a operadora qual o número quer discar e qual o número do cartão de crédito. Até aí tudo bem. Agora chegou a conta:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;06/10  IOS TEL*TO 01155212235       0000000  00/00     65,01&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Foram $65 por uma ligação que não durou nem 10 minutos! É um absurdo! Fui &lt;a href=&#39;http://highlandscot.wordpress.com/2009/06/19/ffoad-ios-tel-verizon/&#39;&gt;buscar&lt;/a&gt; e &lt;a href=&#39;http://www.complaintsboard.com/complaints/organized-larceny-credit-card-phone-calls-c269596.html&#39;&gt;percebi&lt;/a&gt; que &lt;a href=&#39;http://www.ripoffreport.com/Telephone-Companies/IOS-Operator-Service/ios-operator-services-horrendo-m2a69.htm&#39;&gt;não fui&lt;/a&gt; o &lt;a href=&#39;http://www.complaintsboard.com/complaints/ios-tel-c204097.html&#39;&gt;único&lt;/a&gt; &lt;a href=&#39;http://www.ripoffreport.com/Telephone-Companies/IOS-TEL/ios-tel-ripoff-for-a-5-min-cal-9pa8a.htm&#39;&gt;otário&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Antes eu tivesse entrado no site da Embratel pra ver como usar o tal do &lt;a href=&#39;http://www.embratel.net.br/Embratel02/cda/portal/0,2997,RE_P_317,00.html&#39;&gt;BrasilDireto&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/10/29/por-que-eu-sou-fan-tico-por-testes-e-voc-um-bund-o</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/10/29/por-que-eu-sou-fan-tico-por-testes-e-voc-um-bund-o/"/>
    <title>Por que eu sou fanático por testes e você é um bundão</title>
    <published>2009-10-29T00:00:00-07:00</published>
    <updated>2009-10-29T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Esse foi o título de uma palestra que eu submeti junto com o &lt;a href=&#39;http://twitter.com/henriquecrang&#39;&gt;Henrique Andrade&lt;/a&gt; para o FISL desse ano. Ela não foi aprovada lá, principalmente pois alguns dos avaliadores acharam o título ofensivo. Foi amor e ódio aquela avaliação. Alguns acharam sensacional e outros odiaram do fundo do coração! Felizmente conseguimos aprovar ela para o &lt;a href=&#39;http://www.latinoware.org/&#39;&gt;Latinoware&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Na verdade ela não se trata de uma palestra, mas sim de uma pequena peça teatral, encenada por mim, Sylvestre Mergulhão, e pelo &lt;a href=&#39;http://twitter.com/henriquecrang&#39;&gt;Henrique Andrade&lt;/a&gt;. A idéia surgiu pois estava ficando chato fazer palestras &amp;#8220;comuns&amp;#8221; sobre TDD e boas práticas. Não estava convencendo tanto a galera, pois basicamente só vai assistir a uma palestra de TDD quem já no mínimo ouviu falar sobre o assunto e concorda com seu uso. Mas esse tipo de pessoa já está &amp;#8220;conquistada&amp;#8221;, já saiu do lado negro da força.&lt;/p&gt;

&lt;p&gt;Como levar pessoas para uma palestra independentemente de qual o assunto? Insulte-as com um título polêmico! Simples assim! Foi então que tivemos a idéia do &amp;#8220;Por que eu sou fanático por testes e você é um bundão&amp;#8221;. As pessoas comentavam pelos corredores do &lt;a href=&#39;http://www.latinoware.org/&#39;&gt;Latinoware&lt;/a&gt;: &amp;#8220;Caramba, mas e essa palestra do bundão, você vai né?&amp;#8221;. E com isso enchemos a sala! Mais de 100 pessoas assistiram, nada mau&amp;#8230; atores em início de carreira provavelmente demoram um certo tempo até conseguir um público assim, hehehe.&lt;/p&gt;
&lt;ul class=&#39;thumbnails pull-right&#39;&gt;
  &lt;li class=&#39;span3&#39;&gt;
    &lt;a class=&#39;thumbnail&#39; href=&#39;/assets/images/2009/10/29/batman_1.png&#39;&gt;
      &lt;img alt=&#39;Por que eu sou fanático por testes e você é um bundão&#39; src=&#39;/assets/images/2009/10/29/batman_1.png&#39; /&gt;
    &lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Durante a apresentação contamos a história de dois desenvolvedores: um segue as boas práticas e o outro é o bundão. O bundão passa por vários sufocos, apertos de prazos e bugs que pipocam em produção! E é claro que não poderia faltar também o chefe ligando e pedindo agilidade na solução dos problemas. Foi um espetáculo, ainda mais considerando que nunca fizemos coisa parecida antes e ensaiamos muito poucas vezes. Para as próximas apresentações estamos nos preparando melhor. Já vai ter alguma sonoplastia e possivelmente estaremos usando microfones de lapela sem fio.&lt;/p&gt;

&lt;p&gt;Aguardem um próximo evento para assistir &lt;strong&gt;Por que eu sou fanático por testes e você é um bundão&lt;/strong&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/9/15/criando-um-servidor-smtp-com-postfix-the-simple-way</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/9/15/criando-um-servidor-smtp-com-postfix-the-simple-way/"/>
    <title>Criando um servidor smtp com postfix the simple way</title>
    <published>2009-09-15T00:00:00-07:00</published>
    <updated>2009-09-15T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;h2 id=&#39;problema&#39;&gt;Problema&lt;/h2&gt;

&lt;p&gt;O Redeparede dispara ~150k e-mails por mês. Não é mailing list, são as ações dos usuários mesmo: cadastro, recuperação de senha, notificação de comentários etc. Nós usávamos um servidor smtp da Engine Yard, mas recentemente movemos para o EC2 da Amazon e lá não temos no plano um servidor smtp. Tentamos usar alguns comerciais comuns, mas todos tinham limite de envio de e-mail por conta. Passamos então a usar o &lt;a href=&#39;http://www.authsmtp.com&#39;&gt;authsmtp&lt;/a&gt;, que é um serviço de smtp especializado, mas a conta começou a ficar cara a medida que estávamos disparando muitos e-mails.&lt;/p&gt;

&lt;p&gt;A solução então foi fazer o que eu não queria inicialmente: configurar um smtp próprio. E-mail é sempre um problema. Configurar um servidor se mostrou um problema ainda maior do que eu imaginava. A nossa necessidade é muito simples: precisamos autenticar remotamente num servidor smtp para disparar e-mails. Apenas uma conta autenticada para enviar e-mails. Só isso. Só.&lt;/p&gt;

&lt;p&gt;Buscar na internet sobre o assunto retorna &lt;a href=&#39;http://virtual01.lncc.br/~licht/linux/servidores.postfix.arq.html&#39;&gt;configurações&lt;/a&gt; &lt;a href=&#39;http://www.unitednerds.org/thefallen/docs/index.php?area=Postfix&amp;amp;tuto=Postfix-Postfix_SASL_POP3_Virtual&#39;&gt;megalomaníacas&lt;/a&gt; usando &lt;a href=&#39;http://articles.slicehost.com/2008/9/2/mail-server-configuring-postfix-to-use-mysql-part-2&#39;&gt;mysql&lt;/a&gt;, &lt;a href=&#39;http://codepoets.co.uk/postfixadmin-postgresql-courier-squirrelmail-debian-etch-howto-tutorial&#39;&gt;postgresl&lt;/a&gt;, mil tipos diferentes de autenticação, mas não tem o simples!&lt;/p&gt;

&lt;p&gt;Vamos ao trabalho.&lt;/p&gt;

&lt;h2 id=&#39;dns_reverso&#39;&gt;DNS reverso&lt;/h2&gt;

&lt;p&gt;Você precisa ter o dns reverso configurado, sem isso todos os seus e-mails vão para caixa de spam. Você tem que verificar no lugar onde seu servidor está hospedado como configurar o reverso. No caso do &lt;a href=&#39;http://slicehost.com&#39;&gt;Slicehost&lt;/a&gt;, onde hospedamos o nosso smtp, isso é configurado a partir de uma interface web bem simples. Para saber se está funcionando é só digitar no console:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dig -x 67.23.23.229 (substitua pelo ip do seu servidor, claro ;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A resposta tem que ser algo parecido com:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.5.0-P2 &amp;lt;&amp;lt;&amp;gt;&amp;gt; -x 67.23.23.229
;; global options:  printcmd
;; Got answer:
;; -&amp;gt;&amp;gt;HEADER&amp;lt;&amp;lt;- opcode: QUERY, status: NOERROR, id: 57850
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; QUESTION SECTION:
;229.23.23.67.in-addr.arpa.	IN	PTR

;; ANSWER SECTION:
229.23.23.67.in-addr.arpa. 86400 IN	PTR	smtp.redeparede.com. # &amp;lt;=== essa linha que importa, ela está dizendo que o nosso ip está apontando para o endereço correto

;; AUTHORITY SECTION:
23.23.67.in-addr.arpa.	3600	IN	NS	ns2.slicehost.net.
23.23.67.in-addr.arpa.	3600	IN	NS	ns1.slicehost.net.

;; ADDITIONAL SECTION:
ns1.slicehost.net.	95375	IN	A	67.23.4.57
ns2.slicehost.net.	88271	IN	A	173.45.224.132

;; Query time: 158 msec
;; SERVER: 201.17.0.114#53(201.17.0.114)
;; WHEN: Tue Sep 15 13:42:16 2009
;; MSG SIZE  rcvd: 157&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Caso você não possua o &lt;strong&gt;dig&lt;/strong&gt; instalado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo aptitude install dnsutils&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#39;configurando_o_spf&#39;&gt;Configurando o SPF&lt;/h2&gt;

&lt;p&gt;O SPF é uma entrada TXT no DNS que diz quais servidores estão autorizados a enviar e-mails do seu domínio. Esse registro é consultado pelo servidor que recebe seu e-mail e isso ajuda a você não cair na caixa de spam. No nosso caso os servidores são do Google e o nosso próprio smtp. A linha fica assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;quot;v=spf1 a mx include:smtp.redeparede.com include:aspmx.googlemail.com include:_spf.google.com ~all&amp;quot;&lt;/code&gt;&lt;/pre&gt;

&lt;h2 id=&#39;instalando_e_configurando_o_postfix&#39;&gt;Instalando e configurando o Postfix&lt;/h2&gt;

&lt;p&gt;Nós queríamos a configuração mais simples de todas. O que conseguimos foi fazer o postfix autenticar usando a própria base de usuários/senhas do sistema. Para simplificar as coisas eu fiz um script que executa os passos em sequencia. Baixe e execute como root num servidor limpo. Foi testado apenas no Ubuntu 9.04 (Jaunty Jackalope).&lt;/p&gt;
&lt;code&gt;
&lt;a href=&#39;/assets/images/2009/9/15/install_and_configure_postfix_ubuntu.sh&#39;&gt;install\_and\_configure\_postfix\_ubuntu.sh&lt;/a&gt;
&lt;/code&gt;
&lt;p&gt;Primeiro vai pedir o seu domínio. Assumi que o servidor será smtp.seudominio.com, se não for esse o seu desejo, edite o script e mude na mão. Na instalação do postfix ele vai perguntar algumas coisas, basta selecionar as opções padrão. Depois vai perguntar sobre chaves, isso faz parte da criptografia TLS. Eu não sei se essas senhas que digitamos na chave servem pra alguma coisa. Na dúvida anote-as em algum lugar, mas acho que não vai precisar delas pra mais nada. Quando o script terminar de rodar tudo já vai estar configurado e funcionando! Abra um cliente de e-mail como o Evolution e teste enviar um e-mail autenticando no seu novo servidor usando login e senha de algum usuário do sistema.&lt;/p&gt;

&lt;p&gt;Abra o script e veja o que foi feito. O tutorial que me ajudou a escrever o script foi esse aqui: &lt;a href=&#39;http://www.howtoforge.com/perfect_setup_debian_sarge_p4&#39;&gt;http://www.howtoforge.com/perfect_setup_debian_sarge_p4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você conhece algum outro servidor smtp que faça isso de forma mais simples, por favor, não deixe de compartilhar.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/8/17/colecionar-d-bitos-t-cnicos-n-o-maneiro-n-o</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/8/17/colecionar-d-bitos-t-cnicos-n-o-maneiro-n-o/"/>
    <title>Colecionar débitos técnicos não é maneiro não</title>
    <published>2009-08-17T00:00:00-07:00</published>
    <updated>2009-08-17T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Depois de um tempo sem postar, lá vamos nós de novo ;). Quem assina o feed provavelmente recebeu uma atualização sobre esse post antes do que devia! Eu esqueci de marcar ele como rascunho e aí ficou a manhã toda o post publicado apenas com um smile. Depois do furo não tive outra opção a não ser escrever o post até o final o mais rápido possível.&lt;/p&gt;

&lt;p&gt;Após participar de inúmeros projetos e de formas de gerencia sobre os projetos tenho chegado a algumas conclusões sobre a questão dos débitos técnicos, refatoração e testes.&lt;/p&gt;

&lt;p&gt;No começo do V2V, projeto do &lt;a href=&#39;http://portaldovoluntario.org.br&#39;&gt;Portal do Voluntário&lt;/a&gt;, muito código novo foi escrito em cima de um código que usamos como base. Toda alteração de código era devidamente testada usando Rspec. Por considerar que alguns testes não eram muito importantes, as vezes eu deixava a spec como pending para fazer uma posterior implementação. Assim podia entregar as coisas um pouco mais rápido. De fato isso aconteceu em apenas uma meia dúzia de specs, ainda bem!&lt;/p&gt;

&lt;p&gt;O fato é que hoje, 9 meses depois do sistema estar em produção, e já com 3 grandes clientes utilizando &amp;#8211; rumando para o quarto &amp;#8211; a mesma meia dúzia de specs continuam como pending.&lt;/p&gt;

&lt;p&gt;Esse quadro é comum acontecer também em relação aos débitos técnicos dos projetos. O que é um débito técnico? É um empréstimo que você faz, inserindo alguma coisa mal feita no sistema &amp;#8211; leia-se &lt;a href=&#39;http://desciclo.pedia.ws/wiki/POG&#39;&gt;POG&lt;/a&gt; &amp;#8211; com objetivo de ganhar um pouco de tempo naquele momento. É um empréstimo pois ele pode ser comparado ao empréstimo bancário. Você pega um dinheirinho e aquilo tem um juros. Quanto mais tempo você leva pra devolver aquele dinheiro pro banco mais você paga de juros. No nosso caso quanto mais tempo levamos para remover os débitos técnicos mais tempo perdemos por causa dele.&lt;/p&gt;

&lt;p&gt;Assim como as minhas 6 specs pendentes, é comum que débitos técnicos se prolonguem por toda a vida do projeto causando muito mais transtornos do que seria corrigi-los na época em que isso faria atrasar a entrega em apenas um dia.&lt;/p&gt;

&lt;p&gt;Em alguns dos projetos que trabalhei às vezes separávamos uma semana para &amp;#8220;arrumar a casa&amp;#8221;. Ou seja: quitar os débitos técnicos que foram se criando com objetivo de fazer entregas mais rápidas. Uma semana de projeto no lixo sem nenhuma funcionalidade nova! Essa não é a forma correta de fazer.&lt;/p&gt;

&lt;p&gt;Se você estimou o desenvolvimento de uma funcionalidade em uma hora e tem um débito técnico te atrapalhando que vai fazer você demorar duas horas a mais para quitá-lo, essa é a hora de quitá-lo. Não faça mais uma &lt;a href=&#39;http://desciclo.pedia.ws/wiki/POG&#39;&gt;POG&lt;/a&gt;! Pegar mais um empréstimo nessa hora vai fazer você pagar juros sobre juros e isso irá te atrapalhar mais na semana seguinte.&lt;/p&gt;

&lt;p&gt;A refatoração é um processo contínuo e &lt;em&gt;on the fly&lt;/em&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/7/3/3o-linux-install-fest</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/7/3/3o-linux-install-fest/"/>
    <title>3o. Linux Install Fest</title>
    <published>2009-07-03T00:00:00-07:00</published>
    <updated>2009-07-03T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Pessoal estou bastante sem tempo de postar aqui, mas enfim é a vida. O FISL10 foi sensacional, minha palestra sobre scaling estava lotada(slides no link artigos) e o feedback foi muito bom. Se não foram esse ano, não deixem de ir no próximo ano, pois a galera do &lt;a href=&#39;http://horaextra.org&#39;&gt;Horaextra&lt;/a&gt; vai comparecer em massa!&lt;/p&gt;

&lt;p&gt;Nesse fim de semana vai ter o 3o. Linux Install Fest na Simonsen, segue planfleto de divulgação abaixo:&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/31/recuperando-tabela-de-parti-es-que-windows-vista-apagou</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/31/recuperando-tabela-de-parti-es-que-windows-vista-apagou/"/>
    <title>Recuperando tabela de partições que Windows Vista apagou</title>
    <published>2009-03-31T00:00:00-07:00</published>
    <updated>2009-03-31T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Pensei no título desse post em algo como &amp;#8220;Micro$oft, a saga continua agora em outra galáxia&amp;#8221; ou algo assim, mas resolvi fazer uma coisa mais informativa. Sei que muita gente passa por isso e nem sempre é fácil achar informação válida sobre o assunto.&lt;/p&gt;

&lt;p&gt;Meu mais recente notebook veio com Windows Vista. Quando instalei Linux nele resolvi deixar o Vista lá para caso eu precisasse ver alguma coisa no IE. Ficou por alguns meses numa boa com o dual boot rolando sem problemas. Até que um dia eu precisei entrar no Windows ele não deu boot: tela azul e restarta sozinho sem que eu consiga ver a mensagem de erro. Deixei ele de lado lá&amp;#8230;&lt;/p&gt;

&lt;p&gt;Hoje precisei usar IE para debugar um javascript que está dando problema somente nele. Resolvi colocar o CD de recovery do Windows para ver se ele dava sinal de vida. Conclusão sem me perguntar nada ele disse: formatando&amp;#8230; copiando arquivos&amp;#8230; Nisso eu pensei: puts ferrou! Dei reboot antes que ele passasse por cima das minhas partições Linux. Ubuntu Live CD to the rescue! Dei boot num Ubuntu Live CD e a &amp;#8220;recuperação&amp;#8221; de fato tinha apagado todas as partições e criado uma única novamente somente para o Windows. Ok, sem pânico.&lt;/p&gt;

&lt;p&gt;Última vez que passei por problema semelhante foi há uns 10 anos atrás, quando meu Windows foi infectado pelo vírus &lt;a href=&#39;http://en.wikipedia.org/wiki/CIH_virus&#39;&gt;Chernobyl(CIH)&lt;/a&gt;. Esse vírus ficava quietinho na sua máquina e somente agia se você ligasse ela num dia 26 de abril, &lt;a href=&#39;http://en.wikipedia.org/wiki/Chernobyl_accident&#39;&gt;aniversário do acidente nuclear&lt;/a&gt; na Ucrânia. Ele apagava o primeiro megabyte do seu disco rígido. Com isso ia pro espaço seu boot loader e sua tabela de partições. Depois desse dia eu exterminei o Windows da minha vida e passei a usar somente Linux.&lt;/p&gt;

&lt;p&gt;Google é nosso amigo. Na época eu consegui um software que varria o disco e procurava por partições perdidas e depois recriava a tabela de partições. Se eu consegui resolver esse mesmo problema há tanto tempo atrás, não devia ser tão dificil resolver nos dias de hoje. E realmente não foi. Achei dos programas de código aberto para fazer o trabalho: &lt;a href=&#39;http://en.wikipedia.org/wiki/Gpart&#39;&gt;gpart&lt;/a&gt; e &lt;a href=&#39;http://www.cgsecurity.org/wiki/TestDisk&#39;&gt;TestDisk&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Eu optei por usar o &lt;a href=&#39;http://www.cgsecurity.org/wiki/TestDisk&#39;&gt;TestDisk&lt;/a&gt;, me pareceu ser mais completo. Ele demorou cerca de 30 minutos para fazer o scan no disco de 160gb. Detectou todas as minhas 3 partições Linux (swap, uma de sistema que fica no &amp;#8221;/&amp;#8221; e outra que uso como &amp;#8220;/home&amp;#8221;). Foi só marcar elas como primárias novamente e salvar a nova tabela de partições. É preciso dar um boot no Live CD para o sistema reler a tabela de partições (na verdade tem uma forma de fazer isso sem boot, mas eu esqueci como é). Por último é só &lt;a href=&#39;https://help.ubuntu.com/community/RecoveringUbuntuAfterInstallingWindows&#39;&gt;restaurar o GRUB&lt;/a&gt; a partir do Live CD do Ubuntu.&lt;/p&gt;

&lt;p&gt;Depois disso o Ubuntu apagado pelo Windows rolou numa boa e eu deixei o Windows de mão de novo. Ô sisteminha&amp;#8230;&lt;/p&gt;

&lt;p&gt;Links legais:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&#39;http://www.cgsecurity.org/wiki/TestDisk&#39;&gt;TestDisk&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Site do &lt;a href=&#39;http://www.cgsecurity.org/wiki/TestDisk&#39;&gt;TestDisk&lt;/a&gt;. Eles também tem uma ferramenta específica para recuperação de fotografias em mídias diversas.&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://greenfly.org/talks/knoppix/rescue.html&#39;&gt;System Rescue with Knoppix&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Foi aqui que eu descobri o gpart. As &lt;a href=&#39;http://greenfly.org/talks/&#39;&gt;outras apresentações&lt;/a&gt; também são muito boas.&lt;/li&gt;

&lt;li&gt;&lt;a href=&#39;http://www.inside-security.de/insert_en.html&#39;&gt;Insert Linux&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;Mini distro baseada no knoppix, com foco na resolução desses desastres. Ela já vem com o &lt;a href=&#39;http://en.wikipedia.org/wiki/Gpart&#39;&gt;gpart&lt;/a&gt; e &lt;a href=&#39;http://www.cgsecurity.org/wiki/TestDisk&#39;&gt;TestDisk&lt;/a&gt; instalados. No Ubuntu Live CD eu tive que instalar via apt-get(sim você pode instalar pacotes num boot de live cd do ubuntu, mas perde tudo após um reboot claro;)&lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/27/usando-o-plugin-contacts-para-baixar-os-contatos-de-seus-usu-rios</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/27/usando-o-plugin-contacts-para-baixar-os-contatos-de-seus-usu-rios/"/>
    <title>Usando o plugin contacts para baixar os contatos de seus usuários</title>
    <published>2009-03-27T00:00:00-07:00</published>
    <updated>2009-03-27T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O plugin &lt;a href=&#39;http://github.com/mislav/contacts/tree/master&#39;&gt;contacts&lt;/a&gt; foi desenvolvido pelo &lt;a href=&#39;http://mislav.uniqpath.com/&#39;&gt;Mislav Marohnić&lt;/a&gt; e serve para você conseguir acesso a lista de contatos de seus usuários em serviços como Gmail, Yahoo!, Flickr e Windows Live. Calma calma! Não entrem em pânico! Para você ter acesso às informações é necessário que seu usuário autentique na página do serviço e autorize o seu site a acessar as informações.&lt;/p&gt;

&lt;h2 id=&#39;como_a_coisa_funciona&#39;&gt;Como a coisa funciona?&lt;/h2&gt;

&lt;p&gt;Não é nada do outro mundo. Você coloca dentro da sua página um botão que levará o usuário para a página do serviço.&lt;/p&gt;
&lt;div class=&#39;center&#39;&gt;
&lt;a href=&#39;/assets/images/2009/3/14/contacts1.png&#39;&gt;&lt;img alt=&#39;Contacts Image 1&#39; height=&#39;202&#39; src=&#39;/assets/images/2009/3/14/contacts1.png&#39; width=&#39;480&#39; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Ao clicar no botão você entra na página do serviço, nesse caso o Google, onde se tem a opção de conceder ou de negar o acesso.&lt;/p&gt;
&lt;div class=&#39;center&#39;&gt;
&lt;a href=&#39;/assets/images/2009/3/14/contacts2.png&#39;&gt;&lt;img alt=&#39;Contacts Image 2&#39; height=&#39;202&#39; src=&#39;/assets/images/2009/3/14/contacts2.png&#39; width=&#39;480&#39; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;Ao conceder o acesso, o Google envia o usuário novamente para o seu site, passando um token como parâmetro na URL. É com esse token que fazemos o acesso aos contatos do usuário.&lt;/p&gt;
&lt;div class=&#39;center&#39;&gt;
&lt;a href=&#39;/assets/images/2009/3/14/contacts3.png&#39;&gt;&lt;img alt=&#39;Contacts Image 3&#39; height=&#39;202&#39; src=&#39;/assets/images/2009/3/14/contacts3.png&#39; width=&#39;480&#39; /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id=&#39;mos__obra&#39;&gt;Mãos à obra&lt;/h2&gt;

&lt;p&gt;Primeiro vamos criar um projeto Rails novo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails mycontactsproject&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Instalar o plugin:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install git://github.com/mislav/contacts.git&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E gerar um controlador para tratar dos contatos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate controller contacts&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora, vamos escrever uma view com o botão onde o usuário irá clicar no nosso site. Criei o arquivo &lt;em&gt;app/views/contacts/index.html.erb&lt;/em&gt; com o seguinte conteúdo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;%- form_tag Contacts::Google.authentication_url(url_for(:action =&amp;gt; &amp;#39;show&amp;#39;, :only_path =&amp;gt; false)) do -%&amp;gt;
  &amp;lt;%= submit_tag &amp;quot;Clique aqui&amp;quot; %&amp;gt;
&amp;lt;%- end -%&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Esse código gera um formulário com um botão de submit que faz um post para uma URL do Google. Essa URL é gerada através do método &lt;em&gt;authentication_url&lt;/em&gt;. O parâmetro que foi passado é a URL de retorno que o Google irá chamar na hora de enviar o usuário de volta ao nosso site.&lt;/p&gt;

&lt;p&gt;É bom lembrar que isso não tem como funcionar se você estiver utilizando a url &lt;em&gt;localhost&lt;/em&gt;. Para testar localmente é preciso usar algum serviço desses de &lt;a href=&#39;http://www.dyndns.com/&#39;&gt;DNS Dinâmico&lt;/a&gt;, dessa forma o Google pode chamar uma URL que direcionará para a sua estação local.&lt;/p&gt;

&lt;h2 id=&#39;tratando_o_retorno_do_google&#39;&gt;Tratando o retorno do Google&lt;/h2&gt;

&lt;p&gt;Vamos definir o método show dentro do nosso &lt;em&gt;ContactsController&lt;/em&gt;. É ele que tratará o token enviado pelo Google e fará a busca dos contatos de nosso usuário:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class ContactsController &amp;lt; ApplicationController
  def show
    gmail = Contacts::Google.new(params[:token])
    @contacts = gmail.contacts
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nós passamos o token que veio na requisição para o construtor da classe &lt;em&gt;Contacts::Google&lt;/em&gt; e isso nos retorna o objeto usado para recuperar os contatos. Basta chamar o método &lt;em&gt;contacts&lt;/em&gt; nesse objeto e colocar o resultado, um Array de contatos, numa variável de instância que será utilizada em nossa view &lt;em&gt;app/views/contacts/show.html.erb&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Na view, fazemos um loop para impressão dos contatos(na prática, você deve adaptar isso para a necessidade da sua aplicação):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;ul&amp;gt;
  &amp;lt;%- for contact in @contacts -%&amp;gt;
    &amp;lt;li&amp;gt;&amp;lt;%= contact.name %&amp;gt; -  &amp;lt;%= contact.email %&amp;gt;&amp;lt;/li&amp;gt;
  &amp;lt;%- end -%&amp;gt;
&amp;lt;/ul&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basta agora subir o servidor e testar na URL: &lt;em&gt;http://seudominiodinamico.com:3000/contacts&lt;/em&gt;. Se tudo deu certo, após clicar no botão &lt;em&gt;Clique aqui&lt;/em&gt; e autorizar no Google, será exibida a sua lista de contatos com nome e e-mail.&lt;/p&gt;

&lt;p&gt;Lembre-se que para testar esse projeto localmente você deve usar algum serviço de &lt;a href=&#39;http://www.dyndns.com/&#39;&gt;DNS Dinâmico&lt;/a&gt;, que crie um domínio válido na internet que aponte para a sua estação local. Sem isso o Google não terá como chamar uma URL que envie o navegador de volta para a sua aplicação.&lt;/p&gt;

&lt;p&gt;Os arquivos completos desse projeto podem ser baixados direto do &lt;a href=&#39;http://github.com/mergulhao/mycontactsproject/tree/master&#39;&gt;meu repositório no GitHub&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/17/fazendo-thumbnails-de-tamanho-fixo-com-attachment_fu</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/17/fazendo-thumbnails-de-tamanho-fixo-com-attachment_fu/"/>
    <title>Fazendo thumbnails de tamanho fixo com attachment_fu</title>
    <published>2009-03-17T00:00:00-07:00</published>
    <updated>2009-03-17T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O plugin &lt;a href=&#39;http://github.com/technoweenie/attachment_fu/tree/master&#39;&gt;attachment_fu&lt;/a&gt; é quase que o plugin padrão para tratar do upload de arquivos em aplicações Rails. Ele suporta também o resize de imagens mantendo as proporções, mas não suporta crop. Sempre precisamos criar avatar ou coisas semelhantes. E em geral o avatar tem um tamanho fixo, como 80x80. Para isso é necessário fazer o crop da imagem. Adicione o método &lt;em&gt;resize_image&lt;/em&gt;, como abaixo, no seu modelo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Photo &amp;lt; ActiveRecord::Base
  belongs_to :owner, :class_name =&amp;gt; &amp;quot;Person&amp;quot;
  has_attachment :content_type =&amp;gt; :image,
    :processor =&amp;gt; :rmagick,
    :storage =&amp;gt; :file_system,
    :resize_to =&amp;gt; &amp;#39;600&amp;gt;&amp;#39;,
    :thumbnails =&amp;gt; { 
      :album        =&amp;gt; &amp;#39;crop: 150x150&amp;#39;,
      :icon         =&amp;gt; &amp;#39;72&amp;gt;&amp;#39; }

  protected
  def resize_image(img, size)
    # resize_image take size in a number of formats, we just want
    # Strings in the form of &amp;quot;crop: WxH&amp;quot;
    reg = /^crop: (\d*)x(\d*)/i
    if (size.is_a?(String) &amp;amp;&amp;amp; size =~ reg) ||
        (size.is_a?(Array) &amp;amp;&amp;amp; size.first.is_a?(String) &amp;amp;&amp;amp;
          size.first =~ reg)
      img.crop_resized!($1.to_i, $2.to_i)
      # We need to save the resized image in the same way the
      # orignal does.
      self.temp_path = write_to_temp_file(img.to_blob)
    else
      super # Otherwise let attachment_fu handle it
    end
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Assim você sobrescreve o método original do &lt;a href=&#39;http://github.com/technoweenie/attachment_fu/tree/master&#39;&gt;attachment_fu&lt;/a&gt; para suportar uma sintaxe especial. Então quando você quiser um thumbnail ou até mesmo a imagem principal cortada de um tamanho específico, basta usar a string &amp;#8216;crop: WxH&amp;#8217;. Bom lembrar que isso só irá funcionar com o Rmagick. Eu dei uma olhada sobre como fazer usando o image_science, mas era um pouco mais chato. É bom setar: &lt;em&gt;:processor =&amp;gt; :rmagick&lt;/em&gt; na definição do &lt;em&gt;has_attachment&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Eu também fiz um teste para garantir que os meus thumbnails estão sendo gerados no tamanho correto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe &amp;quot;photo resize&amp;quot; do
  it &amp;quot;should create thumbnails with correct size&amp;quot; do
    photo = new_photo
    photo.save!

    full, album, icon = *Magick::ImageList.new(
      photo.full_filename,
      photo.full_filename(&amp;#39;album&amp;#39;),
      photo.full_filename(&amp;#39;icon&amp;#39;)
    )

    full.columns.should == 50
    full.rows.should == 64

    album.columns.should == 150
    album.rows.should == 150

    icon.columns.should == 50
    icon.rows.should == 64
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;PS1: Sim, eu sou paranóico com testes e você também deveria ser!&lt;br /&gt;PS2: Essa dica foi adaptada &lt;a href=&#39;http://stuff-things.net/2008/02/21/quick-and-dirty-cropping-images-with-attachment_fu/&#39;&gt;daqui&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/6/windows-live-o-fim-da-saga</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/6/windows-live-o-fim-da-saga/"/>
    <title>Windows live, o fim da saga!</title>
    <published>2009-03-06T00:00:00-08:00</published>
    <updated>2009-03-06T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Depois da desgraça toda que eu passei aí, nós conseguimos contatos com um pessoal da Microsoft nos EUA. Só em contato direto com eles conseguimos resolver tudo! Fala sério! Pelo menos lá eu estava conversando com gente que sabia o que estava falando.&lt;/p&gt;

&lt;p&gt;Agora o &lt;a href=&#39;http://redeparede.com.br&#39;&gt;Redeparede&lt;/a&gt; possui uma forma de fazer invites de pessoas do Gmail e também do Msn. A funcionalidade não está liberada oficialmente (não tem menu, mas até semana que vem deve entrar), mas já está funcional e vocês podem usar digitando diretamente na URL. Por exemplo, supondo que seu login é meu-login, então digite no seu navegador: &lt;a href=&#39;http://redeparede.com.br/users/meu-login/invites&#39;&gt;http://redeparede.com.br/users/meu-login/invites&lt;/a&gt;. Você será levado para a página de invites.&lt;/p&gt;

&lt;p&gt;Em breve um mini tutorial do plugin &lt;a href=&#39;http://github.com/mislav/contacts/tree/master&#39;&gt;contacts&lt;/a&gt; que nós utilizamos para buscar os contatos do Gmail e do Msn.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/6/redeparede-we-are-hiring</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/6/redeparede-we-are-hiring/"/>
    <title>Redeparede: we are hiring!</title>
    <published>2009-03-06T00:00:00-08:00</published>
    <updated>2009-03-06T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Sim é verdade! Estamos em busca de pessoas para trabalhar conosco, em nossa pequena, descentralizada, multidisciplinar e multilingue equipe! Atualmente nosso time é composto por duas pessoas nos EUA, uma na argentina e três no Brasil. Estamos passando por uma incrível fase de crecimento. Em novembro passado tivemos 1,5 milhões acessos. Fechamos fevereiro com 3,5 milhões de acessos e 7,5 milhões de pageviews. Quase 1/3 desses acessos são do Brasil. São números surpreendentes!&lt;/p&gt;

&lt;p&gt;A má notícia é que no momento não estamos em busca de nenhum desenvolvedor Rails, apesar de termos alguns projetos que estamos pensando na viabilidade de terceirizar o desenvolvimento. Estamos em busca de um representante de vendas que entenda o que nós fazemos e saiba vender os nossos surpreendentes números de crescimento.&lt;/p&gt;

&lt;p&gt;Também buscamos por um webdesigner. Buscamos experientes coders XHTML/CSS/JS. Layouts clean fazem o nosso estilo. Saber jQuery é sem dúvida um diferencial. Há muito o que melhorar em nossos CSSs e na estrutura XHTML de nosso site. Quem entrar nessa vaga irá trabalhar diretamente comigo, consertando o que está errado e desenvolvendo novas telas.&lt;/p&gt;

&lt;p&gt;Interessados olhem mais detalhes em nossa página de &lt;a href=&#39;http://redeparede.com.br/jobs&#39;&gt;Jobs&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/6/mergulhaoinfo-no-imasters</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/6/mergulhaoinfo-no-imasters/"/>
    <title>mergulhaoinfo no imasters</title>
    <published>2009-03-06T00:00:00-08:00</published>
    <updated>2009-03-06T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Para quem acompanha meu blog agora uma ótima notícia! Está com algumas semanas de atraso, mas antes tarde do que nunca&amp;#8230; o tempo está escasso. A partir de agora alguns dos meus posts, principalmente os técnicos, também serão publicados dentro do &lt;a href=&#39;http://imasters.com.br&#39;&gt;iMasters&lt;/a&gt;! O primeiro post já foi publicado, é a série de três vídeos da palestra no &lt;a href=&#39;http://encontrodeti.com.br&#39;&gt;Encontro de TI&lt;/a&gt;. Acesse o &lt;a href=&#39;http://imasters.uol.com.br/artigo/11652/ruby/empreendedorismo_on_rails/&#39;&gt;post&lt;/a&gt; no &lt;a href=&#39;http://imasters.com.br&#39;&gt;iMasters&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/3/6/lan-amento-da-revista-ti-digital</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/3/6/lan-amento-da-revista-ti-digital/"/>
    <title>Lançamento da Revista TI Digital</title>
    <published>2009-03-06T00:00:00-08:00</published>
    <updated>2009-03-06T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Ontem na Livraria da Travessa, centro do Rio, foi o lançamento da &lt;a href=&#39;http://revistatidigital.com.br&#39;&gt;Revista TI Digital&lt;/a&gt; de autoria da &lt;a href=&#39;http://www.arteccom.com.br/&#39;&gt;Arteccom&lt;/a&gt;. A mesma do &lt;a href=&#39;http://encontrodeti.com.br&#39;&gt;Encontro de TI&lt;/a&gt;, do &lt;a href=&#39;http://www.encontrodewebdesign.com.br/&#39;&gt;Encontro de Webdesign&lt;/a&gt; e da &lt;a href=&#39;http://www.revistawebdesign.com.br/&#39;&gt;Revista Webdesign&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Grandes nomes da área de desenvolvimento nacional estão entre os colunistas, como &lt;a href=&#39;http://www.michelazzo.com.br/&#39;&gt;Paulino Michelazzo&lt;/a&gt; e &lt;a href=&#39;http://gc.blog.br/&#39;&gt;Guilherme Chapiewski&lt;/a&gt;. Eu tenho o honra de estar nesse time também! Vou escrever sempre sobre Ruby on Rails. Nesta primeira edição tivemos uma entrevista exclusiva com o David H. Hansson e comentários de nomes da nossa comunidade como &lt;a href=&#39;http://egenial.com.br&#39;&gt;Carlos Eduardo&lt;/a&gt;, &lt;a href=&#39;http://www.webcointernet.com/&#39;&gt;Ronaldo Ferraz&lt;/a&gt;, &lt;a href=&#39;http://ruby-br.org&#39;&gt;Paulo Souza&lt;/a&gt; e &lt;a href=&#39;http://nomedojogo.com&#39;&gt;Carlos Brando&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;No primeiro artigo eu falei um pouco sobre REST e sobre como facilitar a sua vida usando o plugin &lt;a href=&#39;http://github.com/giraffesoft/resource_controller/tree/master&#39;&gt;resource_controller&lt;/a&gt; do &lt;a href=&#39;http://jamesgolick.com/&#39;&gt;James Golick&lt;/a&gt;. Então vamos em frente. Aceito sugestões para os próximos artigos!&lt;/p&gt;

&lt;p&gt;Compre na banca mais próxima de você!&lt;/p&gt;
&lt;ul class=&#39;thumbnails pull-right&#39;&gt;
  &lt;li class=&#39;span3&#39;&gt;
    &lt;a class=&#39;thumbnail&#39; href=&#39;/assets/images/2009/3/6/3333922316_7ee34fc555.jpg&#39;&gt;
      &lt;img alt=&#39;Lançamento da Revista TI Digital&#39; src=&#39;/assets/images/2009/3/6/3333922316_7ee34fc555.jpg&#39; /&gt;
    &lt;/a&gt;
  &lt;/li&gt;
  &lt;li class=&#39;span3&#39;&gt;
    &lt;a class=&#39;thumbnail&#39; href=&#39;/assets/images/2009/3/6/3333931954_4f3bda0d67.jpg&#39;&gt;
      &lt;img alt=&#39;Lançamento da Revista TI Digital&#39; src=&#39;/assets/images/2009/3/6/3333931954_4f3bda0d67.jpg&#39; /&gt;
    &lt;/a&gt;
  &lt;/li&gt;
&lt;/ul&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/2/10/windows-live-a-saga</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/2/10/windows-live-a-saga/"/>
    <title>Windows live, a saga!</title>
    <published>2009-02-10T00:00:00-08:00</published>
    <updated>2009-02-10T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Estamos implementando uma funcionalidade para que nossos usuários possam buscar seus contatos nas bases dos serviços de mensagem como gtalk e msn e convida-los para que se cadastrarem no &lt;a href=&#39;http://redeparede.com.br&#39;&gt;Redeparede&lt;/a&gt;. Estamos utilizando o plugin &lt;a href=&#39;http://github.com/mislav/contacts/tree/master&#39;&gt;contacts&lt;/a&gt; do &lt;a href=&#39;http://github.com/mislav&#39;&gt;Mislav&lt;/a&gt;, funciona muito bem, recomendo.&lt;/p&gt;

&lt;p&gt;A parte do gtalk foi bem simples. O google não faz nenhuma exigência mirabolante e basta o usuário te autorizar que você consegue acesso aos contatos dele. No caso do MSN, a Microsoft exige que você cadastre a sua aplicação no Windows Live. No &lt;a href=&#39;http://redeparede.com.br&#39;&gt;Redeparede&lt;/a&gt; nós temos domínios em diversos países da América Latina. Cada domínio deve ser cadastrado no Windows Live como uma aplicação diferente.&lt;/p&gt;

&lt;p&gt;Para piorar as coisas algum &lt;a href=&#39;http://desciclo.pedia.ws/wiki/Filho_da_puta&#39;&gt;espírito de porco&lt;/a&gt; já registrou o domínio redeparede.com.br dentro do Windows Live(não, a Microsoft não tem nenhum modo de confirmação de que aquele domínio é seu, assim como o Google faz com diversos serviços dele) e quando eu tento cadastrar lá eles me retornam uma mensagem dizendo que o domínio já está cadastrado no Windows Live.&lt;/p&gt;

&lt;p&gt;Abaixo segue a saga na tentativa, ainda sem solução, de resolver o problema com o suporte da Microsoft. Alguém tem contatos lá dentro? Please&amp;#8230;&lt;/p&gt;

&lt;h2 id=&#39;email_1_enviado_pelo_formulrio_de_contato__03022009&#39;&gt;Email 1 enviado pelo formulário de contato - 03/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;From : Sylvestre Mergulhão&lt;br /&gt;Sent : Tuesday, February 03, 2009 8:11:04 PM UTC&lt;br /&gt;To : LV_ID.WNLV.WW.00.PT.MSF.SEA.TS.T01.RTG.00.EM &lt;br /&gt;Subject : Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Serviço: [Service:]&lt;br /&gt; Windows Live ID&lt;/p&gt;

&lt;p&gt;Tipo de problema: [What type of problem do you have?]&lt;br /&gt;Eu tenho um problema ou uma pergunta diferente [Eu tenho um problema ou uma pergunta diferente]&lt;/p&gt;

&lt;p&gt;Outros [Outros]&lt;/p&gt;

&lt;p&gt;Nome completo: [Full name:]&lt;br /&gt; Sylvestre Mergulhão&lt;/p&gt;

&lt;p&gt;Para que endereço de e-mail você deseja que a resposta seja enviada? [The e-mail address for us to send a response:]&lt;br /&gt; mergulhao83@***.com&lt;/p&gt;

&lt;p&gt;Endereço de email/identificação do membro principal associado à conta que você está consultando: [Primary e-mail address/member ID associated with the account you are inquiring about:]&lt;br /&gt; jgagne33@***.com&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;Para assegurar uma resolução rápida do problema, forneça o maior número possível de detalhes, incluindo a data e hora a que ocorreu o problema, uma descrição do que estava a tentar fazer no momento, os passos detalhados que executou até ao momento da ocorrência do problema e informações detalhadas sobre quaisquer mensagens de erro que tenham sido apresentadas. [Be specific when describing your problem. The details that you include enable us to promptly send you the most likely solution to your issue.]&lt;/p&gt;

&lt;p&gt;Olá,&lt;/p&gt;

&lt;p&gt;Eu tenho um Windows Livre Id com o email jgagne33@***.com e eu trabalho para o site redeparede.com. Nós estamos registrando nosso domínios para usar o Live Services, então eu estou criando os projetos no Azure Services Developer Portal. Tenho algumas perguntas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Nós temos muitos domínios diferentes, mas que são a mesma aplicação no backend. Eu tenho mesmo que registrar cada um de nossos domínios como projetos? A única diferença entre eles é a url de retorno, onde a única mudança é o domínio.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Quando tento resgistrar o nosso domínio redeparede.com.br como um projeto estou recebendo a mensagem: The domain name is already in use by another developer or project. Isso pode ter sido registrado por algum antigo desenvolvedor nosso ou então alguém de má intenção. Como podemos resolver isso?&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Hoje temos um total de 25 domínios, mas o portal parece que limita isso a um número inferior a esse. Como posso adicionar mais projetos?&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Obrigado.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#39;resposta_do_email_1__05022009&#39;&gt;Resposta do Email 1 - 05/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;from Microsoft Customer Support &lt;a href=&#39;mailto:IDENT.CUSD.00.00.PT.TPU.BUA.TS.T01.SPT.00.EM@css.one.microsoft.com&#39;&gt;&amp;#073;&amp;#068;&amp;#069;&amp;#078;&amp;#084;&amp;#046;&amp;#067;&amp;#085;&amp;#083;&amp;#068;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#080;&amp;#084;&amp;#046;&amp;#084;&amp;#080;&amp;#085;&amp;#046;&amp;#066;&amp;#085;&amp;#065;&amp;#046;&amp;#084;&amp;#083;&amp;#046;&amp;#084;&amp;#048;&amp;#049;&amp;#046;&amp;#083;&amp;#080;&amp;#084;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#069;&amp;#077;&amp;#064;&amp;#099;&amp;#115;&amp;#115;&amp;#046;&amp;#111;&amp;#110;&amp;#101;&amp;#046;&amp;#109;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#115;&amp;#111;&amp;#102;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;br /&gt;to Sylvestre Mergulhão&lt;br /&gt;date Thu, Feb 5, 2009 at 12:20 PM&lt;br /&gt;subject RE: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Prezado Sylvestre,&lt;/p&gt;

&lt;p&gt;Muito obrigada por contactar o Suporte Técnico do Windows Live Admin Center. Meu nome é Maraisa e e serei a encarregada de brindar-lhe toda ajuda possível.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;Entendo que ao tentar registrar o domínio redeparede.com.br, você recebe uma mensagem de que o mesmo já está sendo utilizado por outro usuário. Compreendo o desagrado que possa sentir.&lt;/p&gt;

&lt;p&gt;Sylvestre, esta questão deve ser tratada com o seu provedor de domínio, onde você adquiriu o nome de domínio redeparede.com.br. Por favor para obter ajuda contundente a respeito entre em contato com o seu provedor.&lt;/p&gt;

&lt;p&gt;Para criar um domínio do Windows Live Admin Center, siga estas etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Visite o seguinte site: http://admincenter.live.com&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Clique em &amp;#8220;Introdução&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Digite o nome do domínio. Deixe a opção &amp;#8220;Configurar Windows Live Hotmail para meu domínio&amp;#8221; como a opção padrão se quiser que o Windows Live Hotmail gerencie suas mensagens de email. Se quiser configurar isso posteriormente, clique em &amp;#8220;Nenhum email para meu Domínio&amp;#8221; e clique em &amp;#8220;Continuar&amp;#8221;.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Na página &amp;#8220;Atribuir um administrador de domínio&amp;#8221;, você tem a opção de entrar usando um Windows Live ID existente. Além disso, é possível torná-la a conta do administrador do domínio. Como alternativa, você pode criar um novo Windows Live ID que terá o mesmo nome do domínio que você está configurando.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;. Se você optar por usar um ID existente do Windows Live, acesse a tela de entrada. Para fazer isso, clique em &amp;#8220;Entrar com um ID do Windows Live existente&amp;#8221; e clique em &amp;#8220;Continuar&amp;#8221;.&lt;/p&gt;

&lt;p&gt;. Se quiser criar um novo ID do Windows Live, clique em &amp;#8220;Criar um novo ID do Windows Live no seu domínio&amp;#8221; e clique em &amp;#8220;Continuar&amp;#8221;. Digite o endereço de email a ser usado como administrador de domínio e siga as instruções exibidas na tela para criar a nova conta.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Na página &amp;#8220;Revise as configurações e aceite o Contrato&amp;#8221;, verifique se o nome do domínio, o serviço de email e os detalhes do administrador estão corretos. Revise o código de conduta de &amp;#8220;Domínios Personalizados&amp;#8221; e o &amp;#8220;Adendo de Domínios Personalizados&amp;#8221; antes de clicar em &amp;#8220;Aceito&amp;#8221;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Você verá a página de configurações do domínio. Essa página o notifica com a seguinte mensagem: &amp;#8220;your service is pending DNS configuration. Please make the required DNS changes&amp;#8221;. (A configuração DNS está pendente para o serviço. Faça as alterações necessárias no DNS.) As informações fornecidas nessa página devem ser usadas para realizar a seguintes ações:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Copiar os dados do Servidor MX fornecidos nessa página pelo Windows Live Admin Center. Substituir as informações de registros MX atuais/padrão que o seu registrador de domínios possui em registro.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Opcional: adicione um ID do Remetente usando os valores fornecidos. Um ID de remetente é um registro de texto (TXT) referente ao seu domínio.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Depois de fazer as alterações, retorne à página de configurações do Windows Live Admin Center. Clique no botão &amp;#8220;Atualizar&amp;#8221; para confirmar que os registros DNS estão corretamente configurados.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Mais uma vez lhe agradeço por entrar em contato com o Suporte Técnico do Windows Live Admin Center. Se precisar de suporte adicional, não hesite em nos contactar novamente! Estamos disponíveis 24 horas por dia, 7 dias por semana. Atenciosamente,&lt;/p&gt;

&lt;p&gt;Maraisa M. Suporte Técnico do Windows Live Admin Center.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#39;email_2__05022009&#39;&gt;Email 2 - 05/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;From : &amp;#8220;Sylvestre Mergulhão&amp;#8221;&lt;br /&gt;Sent : Thursday, February 05, 2009 3:56:36 PM UTC&lt;br /&gt;To : &amp;#8220;Microsoft Customer Support&amp;#8221;&lt;br /&gt;Subject : Re: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Eu NÃO estou tentando registrar o domínio redeparede.com.br, pois estedomínio já é MEU! Eu estou tentando criar o projeto dentro desse site de vocês (http://go.microsoft.com/fwlink/?LinkID=130560) para que eu possa utilizar os webservices do live services! Um serviço de vocês.&lt;/p&gt;

&lt;p&gt;Agradeço se puder responder esta e as outras questões que estão coladas na minha mensagem abaixo ou encaminhar para o setor responsável.&lt;/p&gt;

&lt;p&gt;ATENÇÃO: EU TAMBÉM NÃO ESTOU QUERENDO QUE O LIVE SERVICES SEJA O GERENTE DE E-MAILS DE MEUS DOMÍNIOS. SOMENTE QUERO REGISTRAR MINHA APLICAÇÃO PARA UTILIZAR O SERVIÇO DE WEBSERVICES DO LIVE SERVICES, LOGO NÃO TEM NADA QUE ALTERAR MX EM DNS.&lt;/p&gt;

&lt;p&gt;Agradeço a atenção.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#39;resposta_do_email_2__06022009&#39;&gt;Resposta do Email 2 - 06/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;from Microsoft Customer Support &lt;a href=&#39;mailto:IDENT.CUSD.00.00.PT.TPU.BUA.TS.T01.SPT.00.EM@css.one.microsoft.com&#39;&gt;&amp;#073;&amp;#068;&amp;#069;&amp;#078;&amp;#084;&amp;#046;&amp;#067;&amp;#085;&amp;#083;&amp;#068;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#080;&amp;#084;&amp;#046;&amp;#084;&amp;#080;&amp;#085;&amp;#046;&amp;#066;&amp;#085;&amp;#065;&amp;#046;&amp;#084;&amp;#083;&amp;#046;&amp;#084;&amp;#048;&amp;#049;&amp;#046;&amp;#083;&amp;#080;&amp;#084;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#069;&amp;#077;&amp;#064;&amp;#099;&amp;#115;&amp;#115;&amp;#046;&amp;#111;&amp;#110;&amp;#101;&amp;#046;&amp;#109;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#115;&amp;#111;&amp;#102;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;br /&gt;to Sylvestre Mergulhão&lt;br /&gt;date Fri, Feb 6, 2009 at 1:43 PM&lt;br /&gt;subject RE: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Prezado Sylvestre,&lt;/p&gt;

&lt;p&gt;Muito obrigada por contactar o Suporte Técnico do Windows Live Admin Center. Meu nome é Maraisa e e serei a encarregada de brindar-lhe toda ajuda possível.&lt;/p&gt;

&lt;p&gt;Sylvestre, entendo por sua mensagem, que você está enfrentando dificuldades de registrar o seu domínio redeparede.com.br em nosso site do Windows Live Admin Center, para que possamos melhor ajudá-lo necessário que você capturasse a tela com o erro para que possamos resolver seu inconveniente rapidamente.&lt;/p&gt;

&lt;p&gt;Para capturar a tela do erro, execute essas etapas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Abra a página que você está tendo problemas e, em seguida, pressione o botão PrintScreen (PrintScrn) no teclado.&lt;/li&gt;

&lt;li&gt;Abra Microsoft Paint. Para fazer isso, clique em &amp;#8220;Iniciar&amp;#8221;, clique em &amp;#8220;Todos os Programas&amp;#8221; e, em seguida, clique em &amp;#8220;Acessórios&amp;#8221;.&lt;/li&gt;

&lt;li&gt;Clique em &amp;#8220;Paint&amp;#8221;.&lt;/li&gt;

&lt;li&gt;Clique em &amp;#8220;Editar&amp;#8221; e, em seguida, clique em &amp;#8220;Colar&amp;#8221;. A captura de tela é colada no Paint.&lt;/li&gt;

&lt;li&gt;Clique em &amp;#8220;Arquivo&amp;#8221; e clique em &amp;#8220;Salvar como&amp;#8221;.&lt;/li&gt;

&lt;li&gt;Em &amp;#8220;Salvar como tipo&amp;#8221;, selecione &amp;#8220;JPEG&amp;#8221;.&lt;/li&gt;

&lt;li&gt;Nomeie o arquivo e, em seguida, salve o arquivo na área de trabalho.&lt;/li&gt;

&lt;li&gt;Envie a captura de tela para nós.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Essa imagem nos ajudará a investigar e solucionar seu inconveniente. Espero que saiba desculpar-nos.&lt;/p&gt;

&lt;p&gt;Mais uma vez lhe agradeço por entrar em contato com o Suporte Técnico do Windows Live Admin Center. Se precisar de suporte adicional, não hesite em nos contactar novamente! Estamos disponíveis 24 horas por dia, 7 dias por semana.&lt;/p&gt;

&lt;p&gt;Atenciosamente, Maraisa M. Suporte Técnico do Windows Live Admin Center.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#39;email_3__06022009&#39;&gt;Email 3 - 06/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;from Sylvestre Mergulhão&lt;br /&gt;to Microsoft Customer Support &lt;a href=&#39;mailto:IDENT.CUSD.00.00.PT.TPU.BUA.TS.T01.SPT.00.EM@css.one.microsoft.com&#39;&gt;&amp;#073;&amp;#068;&amp;#069;&amp;#078;&amp;#084;&amp;#046;&amp;#067;&amp;#085;&amp;#083;&amp;#068;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#080;&amp;#084;&amp;#046;&amp;#084;&amp;#080;&amp;#085;&amp;#046;&amp;#066;&amp;#085;&amp;#065;&amp;#046;&amp;#084;&amp;#083;&amp;#046;&amp;#084;&amp;#048;&amp;#049;&amp;#046;&amp;#083;&amp;#080;&amp;#084;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#069;&amp;#077;&amp;#064;&amp;#099;&amp;#115;&amp;#115;&amp;#046;&amp;#111;&amp;#110;&amp;#101;&amp;#046;&amp;#109;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#115;&amp;#111;&amp;#102;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;br /&gt;date Fri, Feb 6, 2009 at 5:20 PM&lt;br /&gt;subject Re: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Segue em anexo.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;a href=&#39;/assets/images/2009/2/10/Captura_de_tela-0.png&#39;&gt;
&lt;img alt=&#39;ms image0&#39; height=&#39;361&#39; src=&#39;/assets/images/2009/2/10/Captura_de_tela-0.png&#39; width=&#39;473&#39; /&gt;
&lt;/a&gt;&lt;a href=&#39;/assets/images/2009/2/10/Captura_de_tela-1.png&#39;&gt;
&lt;img alt=&#39;ms image1&#39; height=&#39;361&#39; src=&#39;/assets/images/2009/2/10/Captura_de_tela-1.png&#39; width=&#39;473&#39; /&gt;
&lt;/a&gt;&lt;a href=&#39;/assets/images/2009/2/10/Captura_de_tela-2.png&#39;&gt;
&lt;img alt=&#39;ms image2&#39; height=&#39;361&#39; src=&#39;/assets/images/2009/2/10/Captura_de_tela-2.png&#39; width=&#39;473&#39; /&gt;
&lt;/a&gt;&lt;a href=&#39;/assets/images/2009/2/10/Captura_de_tela-3.png&#39;&gt;
&lt;img alt=&#39;ms image3&#39; height=&#39;361&#39; src=&#39;/assets/images/2009/2/10/Captura_de_tela-3.png&#39; width=&#39;473&#39; /&gt;
&lt;/a&gt;
&lt;h2 id=&#39;resposta_do_email_3__07022009&#39;&gt;Resposta do Email 3 - 07/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;from Microsoft Customer Support &lt;a href=&#39;mailto:IDENT.CUSD.00.00.PT.TPU.BUA.TS.T01.SPT.00.EM@css.one.microsoft.com&#39;&gt;&amp;#073;&amp;#068;&amp;#069;&amp;#078;&amp;#084;&amp;#046;&amp;#067;&amp;#085;&amp;#083;&amp;#068;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#080;&amp;#084;&amp;#046;&amp;#084;&amp;#080;&amp;#085;&amp;#046;&amp;#066;&amp;#085;&amp;#065;&amp;#046;&amp;#084;&amp;#083;&amp;#046;&amp;#084;&amp;#048;&amp;#049;&amp;#046;&amp;#083;&amp;#080;&amp;#084;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#069;&amp;#077;&amp;#064;&amp;#099;&amp;#115;&amp;#115;&amp;#046;&amp;#111;&amp;#110;&amp;#101;&amp;#046;&amp;#109;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#115;&amp;#111;&amp;#102;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;br /&gt;to Sylvestre Mergulhão&lt;br /&gt;date Sat, Feb 7, 2009 at 1:19 PM&lt;br /&gt;subject RE: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Prezado Sylvestre,&lt;/p&gt;

&lt;p&gt;Muito obrigada por contactar o Suporte Técnico do Windows Live Admin Center. Meu nome é Maraisa e e serei a encarregada de brindar-lhe toda ajuda possível.&lt;/p&gt;

&lt;p&gt;Sylvestre, estivemos checando as imagens que nos enviou, o seu problema está relacionado ao seu provedor de dominio. O que possui a página que nos enviou em anexo. Por favor envie uma solicitação de suporte ao seu provedor para obter a ajuda que necessita.&lt;/p&gt;

&lt;p&gt;Para mais informações sobre os produtos do Windows Live acesse: http://get.live.com/.&lt;/p&gt;

&lt;p&gt;Mais uma vez lhe agradeço por entrar em contato com o Suporte Técnico do Windows Live Admin Center. Se precisar de suporte adicional, não hesite em nos contactar novamente! Estamos disponíveis 24 horas por dia, 7 dias por semana.&lt;/p&gt;

&lt;p&gt;Atenciosamente,&lt;/p&gt;

&lt;p&gt;Maraisa M. Suporte Técnico do Windows Live Admin Center&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2 id=&#39;email_4__09022009&#39;&gt;Email 4 - 09/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;from Sylvestre Mergulhão&lt;br /&gt;to Microsoft Customer Support &lt;a href=&#39;mailto:IDENT.CUSD.00.00.PT.TPU.BUA.TS.T01.SPT.00.EM@css.one.microsoft.com&#39;&gt;&amp;#073;&amp;#068;&amp;#069;&amp;#078;&amp;#084;&amp;#046;&amp;#067;&amp;#085;&amp;#083;&amp;#068;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#080;&amp;#084;&amp;#046;&amp;#084;&amp;#080;&amp;#085;&amp;#046;&amp;#066;&amp;#085;&amp;#065;&amp;#046;&amp;#084;&amp;#083;&amp;#046;&amp;#084;&amp;#048;&amp;#049;&amp;#046;&amp;#083;&amp;#080;&amp;#084;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#069;&amp;#077;&amp;#064;&amp;#099;&amp;#115;&amp;#115;&amp;#046;&amp;#111;&amp;#110;&amp;#101;&amp;#046;&amp;#109;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#115;&amp;#111;&amp;#102;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;br /&gt;date Mon, Feb 9, 2009 at 2:35 PM&lt;br /&gt;subject Re: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Permita-me discordar de você Maraisa. Olhe nos detalhes de um trecho da imagem que eu enviei a você no anexo. Eu estou tentando usar o Azure Services Developer Portal&amp;#8230; olha o domínio(a url)&amp;#8230; ele é um microsoft.com! Estou tentando usar um serviço de vocês isso não tem relação alguma com meu provedor de dominio.&lt;/p&gt;

&lt;p&gt;Por favor, me encaminhe para o setor responsável pelo portal Azure Services Developer Portal que é um portal da Microsoft para desenvolvedores e NÃO tem relação alguma com meu provedor de dominio.&lt;/p&gt;

&lt;p&gt;Obrigado.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;a href=&#39;/assets/images/2009/2/10/imagem.png&#39;&gt;
&lt;img alt=&#39;ms image4&#39; height=&#39;226&#39; src=&#39;/assets/images/2009/2/10/imagem.png&#39; width=&#39;473&#39; /&gt;
&lt;/a&gt;
&lt;h2 id=&#39;resposta_do_email_4__10022009&#39;&gt;Resposta do Email 4 - 10/02/2009&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;from Microsoft Customer Support &lt;a href=&#39;mailto:IDENT.CUSD.00.00.PT.TPU.BUA.TS.T01.SPT.00.EM@css.one.microsoft.com&#39;&gt;&amp;#073;&amp;#068;&amp;#069;&amp;#078;&amp;#084;&amp;#046;&amp;#067;&amp;#085;&amp;#083;&amp;#068;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#080;&amp;#084;&amp;#046;&amp;#084;&amp;#080;&amp;#085;&amp;#046;&amp;#066;&amp;#085;&amp;#065;&amp;#046;&amp;#084;&amp;#083;&amp;#046;&amp;#084;&amp;#048;&amp;#049;&amp;#046;&amp;#083;&amp;#080;&amp;#084;&amp;#046;&amp;#048;&amp;#048;&amp;#046;&amp;#069;&amp;#077;&amp;#064;&amp;#099;&amp;#115;&amp;#115;&amp;#046;&amp;#111;&amp;#110;&amp;#101;&amp;#046;&amp;#109;&amp;#105;&amp;#099;&amp;#114;&amp;#111;&amp;#115;&amp;#111;&amp;#102;&amp;#116;&amp;#046;&amp;#099;&amp;#111;&amp;#109;&lt;/a&gt;&lt;br /&gt;to Sylvestre Mergulhão&lt;br /&gt;date Tue, Feb 10, 2009 at 2:39 PM&lt;br /&gt;subject RE: SRX1092597961ID - Windows Live ID:Eu tenho um problema ou u:Outros&lt;/p&gt;

&lt;p&gt;Prezado Sylvestre,&lt;/p&gt;

&lt;p&gt;Muito obrigado por contatar o Suporte Técnico do Windows Live Admin Center. Meu nome é Diana e terei o prazer de lhe ajudar.&lt;/p&gt;

&lt;p&gt;Recebemos sua consulta, porém para determinar qual seu problema, necessitamos que envie mais informações para poder diagnosticá-lo e assim resolve-lo com eficiência.&lt;/p&gt;

&lt;p&gt;Por favor, responda a esta mensagem incluindo as seguintes informações:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Informações mais detalhadas sobre o problema que você está experimentando.&lt;/li&gt;

&lt;li&gt;A data de inicio do mesmo.&lt;/li&gt;

&lt;li&gt;Quais mensagens de erro que recebe?&lt;/li&gt;

&lt;li&gt;Que passos seqüenciais exatos efetuou para produzir este problema?&lt;/li&gt;

&lt;li&gt;Tem mudado algo no equipamento em questão, antes de surgirem os problemas?&lt;/li&gt;

&lt;li&gt;Pode reproduzir este problema em outros computadores, ou com outra conta, neste mesmo equipamento?&lt;/li&gt;

&lt;li&gt;Dispõe de algum tipo de filtro de internet, bloqueador de janelas emergentes ou outros programas instalados que podem evitar que funcione?&lt;/li&gt;

&lt;li&gt;Conta de email onde deseja receber a resposta.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Uma vez que tenhamos recebido estas informações, nossa equipe estudará novamente seu caso.&lt;/p&gt;

&lt;p&gt;Queremos agradecer-lhe outra vez por ter contatado o Suporte Técnico do Windows Live Admin Center. Por favor, qualquer dúvida, consulta ou sugestões, fique à vontade de contatar-nos de novo. Estamos as 24 horas os 7 dias da semana para lhe ajudar.&lt;/p&gt;

&lt;p&gt;Atenciosamente,&lt;/p&gt;

&lt;p&gt;Diana P.&lt;/p&gt;

&lt;p&gt;Suporte Técnico do Windows Live Admin Center.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depois dessa última resposta estou me perguntando se vale a pena continuar tentando algo pelo suporte. E é incrível como ainda hoje existem gerentes de TI que só compram Microsoft pois ela dá suporte. Eu mereço!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/2/7/nova-se-o-cheat-sheets</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/2/7/nova-se-o-cheat-sheets/"/>
    <title>Nova seção: Cheat sheets</title>
    <published>2009-02-07T00:00:00-08:00</published>
    <updated>2009-02-07T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;As cheat sheets são ótimas para você não esquecer daqueles comandos que precisa usar. Já fazia algum tempo que eu estava pensando em criar um &lt;a href=&#39;http://mergulhao.info/cheat-sheets&#39;&gt;cheat sheet&lt;/a&gt; sobre git. Ainda tem comandos que não utilizo com frequência e aí precisava sempre olhar o man. Agora criei um pequeno &lt;a href=&#39;http://mergulhao.info/cheat-sheets&#39;&gt;cheat sheet&lt;/a&gt;, mas que será atualizado sempre que eu precisar fazer alguma coisa no git e não lembrar do comando. Vai ser ler no man page e atualizar a &lt;a href=&#39;http://mergulhao.info/cheat-sheets&#39;&gt;cheat sheet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Espero que também seja útil para vocês!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/2/2/e-mais-um-podcast-gravado</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/2/2/e-mais-um-podcast-gravado/"/>
    <title>E mais um podcast gravado!</title>
    <published>2009-02-02T00:00:00-08:00</published>
    <updated>2009-02-02T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Saiu no &lt;a href=&#39;http://www.guanabara.info/&#39;&gt;guanabara.info&lt;/a&gt; o episódio no. 53 do &lt;a href=&#39;http://www.guanabara.info/?p=7198&#39;&gt;GuanaCast&lt;/a&gt; e eu fui o entrevistado da semana! Além do Gustavo Guanabara também participaram do podcast o Kauê Linden e o Sharuto da &lt;a href=&#39;http://hostnet.com.br&#39;&gt;Hostnet&lt;/a&gt;. Foi um bate papo bem descontraído e divertido, explicando o básico do Ruby e do Rails, da onde a coisa apareceu, por que está fazendo tanto sucesso, etc. Não deixem de conferir!&lt;/p&gt;

&lt;p&gt;Para ouvir, visite a página do &lt;a href=&#39;http://www.guanabara.info/?p=7198&#39;&gt;podcast&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/1/23/problema-ao-usar-resources-com-palavras-sem-plural</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/1/23/problema-ao-usar-resources-com-palavras-sem-plural/"/>
    <title>Problema ao usar resources com palavras sem plural</title>
    <published>2009-01-23T00:00:00-08:00</published>
    <updated>2009-01-23T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;No &lt;a href=&#39;http://v2v.org.br&#39;&gt;V2V&lt;/a&gt; nós criamos um resource que é utilizado para o formulário de contato (formmail) do site. O nome do resource é &lt;strong&gt;contact_us&lt;/strong&gt;. O nosso &lt;em&gt;routes.rb&lt;/em&gt; ficava assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.resources :contact_us&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E temos uma configuração de &lt;em&gt;inflector&lt;/em&gt; para informar ao Rails que essa é uma expressão incontável:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;ActiveSupport::Inflector.inflections do |inflect|
  inflect.uncountable %w(contact_us)
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O problema é que ao tentar gerar a url com o método &lt;em&gt;contact_us_url&lt;/em&gt; para o formulário acontece o seguinte erro:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;contact_us_url failed to generate from {:controller=&amp;gt;&amp;quot;contact_us&amp;quot;, :action=&amp;gt;&amp;quot;show&amp;quot;} - you may have ambiguous routes, or you may need to supply additional parameters for this route.  content_url has the following required parameters: [&amp;quot;contact_us&amp;quot;, :id] - are they all satisfied?&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso acontece pois o Rails sobrescreve o método que gera a url da coleção com o método que gera a url de instância dos objetos. Para resolver isso temos que informar no arquivo de rotas o nome que será utilizado nos métodos no caso de ser uma instância e não uma coleção:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;map.resources :contact_us, :singular =&amp;gt; :contact_us_item&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso fará os métodos ficarem assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;contact_us_path() =&amp;gt; /contact_us
new_contact_us_item_path() =&amp;gt; /contact_us/new
contact_us_item_path(1) =&amp;gt; /contact_us/1
edit_contact_us_item_path(1) =&amp;gt; /contact_us/1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Reparem que no caso de não ser usada a opção &lt;em&gt;:singular&lt;/em&gt; o método de acesso a coleção e da instância ficam com nomes iguais:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;contact_us_path() =&amp;gt; /contact_us
contact_us_path(1) =&amp;gt; /contact_us/1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Isso não acontece com expressões normais pois o Rails utiliza para a coleção a expressão com pluralize. Supondo que o nosso resource fosse de posts, os métodos seriam:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;posts_path() =&amp;gt; /posts
new_post_path() =&amp;gt; /posts/new
post_path(1) =&amp;gt; /posts/1
edit_post_path(1) =&amp;gt; /posts/1&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/1/23/o-dia-em-que-meu-blog-viu-o-666</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/1/23/o-dia-em-que-meu-blog-viu-o-666/"/>
    <title>O dia em que meu blog viu o 666 ;)</title>
    <published>2009-01-23T00:00:00-08:00</published>
    <updated>2009-01-23T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;div class=&#39;center&#39;&gt;
&lt;img alt=&#39;666&#39; src=&#39;/assets/images/2009/1/23/mergulhao-info-666.png&#39; /&gt;
&lt;/div&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/1/22/v2v-procura-por-desenvolvedores-rails</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/1/22/v2v-procura-por-desenvolvedores-rails/"/>
    <title>V2V Procura por desenvolvedores Rails</title>
    <published>2009-01-22T00:00:00-08:00</published>
    <updated>2009-01-22T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O &lt;a href=&#39;http://portaldovoluntario.org.br&#39;&gt;Portal do Voluntário&lt;/a&gt; é um projeto que incentiva ações de voluntariado no âmbito nacional. Lá foi desenvolvida uma rede social chamada &lt;a href=&#39;http://v2v.org.br&#39;&gt;V2V&lt;/a&gt;. Inicialmente era um projeto em php, sem testes e difícil de manter. Quando eu saí do &lt;a href=&#39;http://blog.improveit.com.br/articles/2007/05/15/xp-rio-conheca-o-projeto-xp-do-grupo-santa-isabel&#39;&gt;Lucidus&lt;/a&gt;, o &lt;a href=&#39;http://github.com/elefante&#39;&gt;Fernando&lt;/a&gt; me convidou para integrar a equipe dele e iniciar o desenvolvimento da nova versão do &lt;a href=&#39;http://v2v.org.br&#39;&gt;V2V&lt;/a&gt;, utilizando Rails e todas as boas práticas de desenvolvimento, testes etc.&lt;/p&gt;

&lt;p&gt;Quem começou o trabalho foi o Eduardo Rocha com um projeto de prova de conceito, eu dei continuidade. Em menos de 6 meses já possuímos dois sites no ar utilizando o novo sistema, entre eles o próprio site do &lt;a href=&#39;http://portaldovoluntario.org.br&#39;&gt;Portal do Voluntário&lt;/a&gt;. E o trabalho está apenas começando, há muita coisa para fazer!&lt;/p&gt;

&lt;p&gt;No antigo sistema em php, havia uma instância da aplicação para cada site que o utilizava. No novo sistema em Rails temos apenas uma instância da aplicação e que terá que suportar o site de todos os clientes do &lt;a href=&#39;http://portaldovoluntario.org.br&#39;&gt;Portal do Voluntário&lt;/a&gt; que utilizam o &lt;a href=&#39;http://v2v.org.br&#39;&gt;V2V&lt;/a&gt;. Será um desafio e tanto&amp;#8230; Antes da entrada do terceiro site, que acontecerá em março, já começaremos a utilizar cache de fragmento em algumas partes específicas do site como a nuvem de tags. Em seguida, provavelmente passaremos pelo memcached e, por último, quero chegar no cache de página, mesmo com sistema respondendo por vários domínios.&lt;/p&gt;

&lt;p&gt;Ou seja: é uma oportunidade única de trabalhar num projeto em Rails, desenvolvido da forma correta desde do zero e que fatalmente terá que escalar. Devido as minhas outras atribuições no &lt;a href=&#39;http://redeparede.com.br&#39;&gt;Redeparede&lt;/a&gt;, eu não tenho como me dedicar mais ao &lt;a href=&#39;http://v2v.org.br&#39;&gt;V2V&lt;/a&gt; e não estou dando conta sozinho de todas as tarefas.&lt;/p&gt;

&lt;p&gt;Procuramos um desenvolvedor Rails com alguma(ou muita) experiência para trabalhar alocado full-time em nossa sede no Jardim Botânico, Rio de Janeiro. Dessa vez não tem como ser remoto. Além de trabalhar no desenvolvimento do projeto, também irá contribuir no treinamento da atual equipe de 5 desenvolvedores que mantém o antigo sistema em php.&lt;/p&gt;

&lt;p&gt;Nas próximas semanas faremos a reorganização da nossa sala, que será preparada para ficar nos moldes do &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt;. O ambiente é informal e descontraído, sem dúvida um ótimo lugar para trabalhar.&lt;/p&gt;

&lt;p&gt;Interessados entrem em contato em pvt.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/1/21/acts_as_taggable_on_steroids-e-will_paginate</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/1/21/acts_as_taggable_on_steroids-e-will_paginate/"/>
    <title>acts_as_taggable_on_steroids e will_paginate</title>
    <published>2009-01-21T00:00:00-08:00</published>
    <updated>2009-01-21T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Num dos projetos que trabalho utilizo o plugin &lt;a href=&#39;http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids&#39;&gt;acts_as_taggable_on_steroids&lt;/a&gt;. Pela primeira vez fui fazer paginação de elementos com tags utilizando o &lt;a href=&#39;http://github.com/mislav/will_paginate&#39;&gt;will_paginate&lt;/a&gt;. O &lt;a href=&#39;http://agilewebdevelopment.com/plugins/acts_as_taggable_on_steroids&#39;&gt;acts_as_taggable_on_steroids&lt;/a&gt; fornece o método de classe &lt;em&gt;find_tagged_with&lt;/em&gt; que serve para buscar por items com uma determinada tag:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Post.find\_tagged\_with(&amp;#39;rails&amp;#39;)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E é possível fazer paginação utilizando o método &lt;em&gt;paginate_tagged_with&lt;/em&gt;, mas o problema é que ele não funciona como deveria. Apesar de fazer a paginação funcionar corretamente, a sql que ele gera para fazer o count dos elementos não é correta. Se usado sem conditions, ele gera o número de páginas considerando todos os elementos da base. Eu escrevi o seguinte monkey patch, que coloquei no &lt;em&gt;/lib&lt;/em&gt; do projeto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module ActiveRecord
  module Acts
    module Taggable
      module SingletonMethods
        def paginate_tagged_with(tags, args = {})
          options = find_options_for_find_tagged_with(tags, :match_all =&amp;gt; true)
          options.merge!(args)
          paginate(options.merge(:count =&amp;gt; { :select =&amp;gt; options[:select].gsub(&amp;quot;#{table_name}.*&amp;quot;, &amp;quot;#{table_name}.id&amp;quot;) }))
        end
      end
    end
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Para usar basta colocar no seu controller algo como:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@posts = Post.paginate_tagged_with(params[:tag_id], :page =&amp;gt; params[:page] || 1)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Também escrevi uma spec para testar o funcionamento. Ela só faz sentido dentro do contexto do meu projeto, mas basta você modificar as fixtures, os modelos, etc, de acordo com seu projeto.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe Post do
  it &amp;quot;should return the correct total_pages to will_paginate&amp;quot; do
    post = posts(:blog_post)
    5.times do
      new_post = BlogPost.new(post.attributes)
      new_post.tag_list = &amp;#39;global&amp;#39;
      new_post.save
    end
    paginator = BlogPost.paginate_tagged_with(&amp;#39;global&amp;#39;, :page =&amp;gt; 1, :per_page =&amp;gt; 2)
    paginator.total_entries.should == 6
    paginator.total_pages.should == 3
  end
end&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2009/1/4/resultado-da-promo-o-de-natal-da-hostnet</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2009/1/4/resultado-da-promo-o-de-natal-da-hostnet/"/>
    <title>Resultado da Promoção de Natal da Hostnet</title>
    <published>2009-01-04T00:00:00-08:00</published>
    <updated>2009-01-04T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Pessoal, peço desculpas pela demora no resultado, mas fim de ano é sempre bem corrido. Fiquei decepcionado com a quantidade de projetos que foram enviados. Menos de 10! Escolhemos os que tinham mais conteúdo e que apresentaram potencial de sucesso. Foram 3 escolhidos. Como foram muito poucos, eles ganharão 1 ano de hospedagem grátis! Aí vão eles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marcio Garcia: Projeto Blip Badge, Widget para o Blip.fm&lt;/li&gt;

&lt;li&gt;Bernardo Albuquerque: Projeto ScienceRails.com, Blog Pessoal&lt;/li&gt;

&lt;li&gt;Lennon Jesus: Projeto Não divulgado por acordo de confidencialidade&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Parabéns a todos! Entraremos em contato com vocês!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/12/16/empreendedorismo-on-rails-no-encontro-de-ti</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/12/16/empreendedorismo-on-rails-no-encontro-de-ti/"/>
    <title>Empreendedorismo on Rails no Encontro de TI</title>
    <published>2008-12-16T00:00:00-08:00</published>
    <updated>2008-12-16T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Sairam os vídeos da minha apresentação no &lt;a href=&#39;http://encontrodeti.com.br/&#39;&gt;Encontro de TI&lt;/a&gt;. A &lt;a href=&#39;/assets/images/2008/12/3/EmpreendedorismoOnRails.pdf&#39;&gt;palestra&lt;/a&gt; foi gentilmente cedida pelo &lt;a href=&#39;http://www.improveit.com.br/empresa/vinicius&#39;&gt;Vinícius&lt;/a&gt;, originalmente apresentada no &lt;a href=&#39;http://www.locaweb.com.br/railssummit/&#39;&gt;Rails Summit 2008&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&amp;#32;&lt;iframe frameborder=&#39;0&#39; height=&#39;315&#39; scrolling=&#39;no&#39; src=&#39;http://embed.videolog.tv/v/index.php?id_video=391466&#39; width=&#39;560&#39;&gt;&amp;nbsp;&lt;/iframe&gt;&lt;p&gt;&lt;a href=&#39;http://www.videolog.tv/video.php?id=391466&#39; target=&#39;_blank&#39;&gt;Oficina Ruby On Rails - Parte 1/3&lt;/a&gt; por &lt;a href=&#39;http://www.videolog.tv/Arteccom&#39; target=&#39;_blank&#39;&gt;Arteccom&lt;/a&gt;  no &lt;a href=&#39;http://www.videolog.tv&#39; target=&#39;_blank&#39;&gt;Videolog.tv&lt;/a&gt;.&lt;/p&gt; &lt;br /&gt; &amp;#32;&lt;iframe frameborder=&#39;0&#39; height=&#39;315&#39; scrolling=&#39;no&#39; src=&#39;http://embed.videolog.tv/v/index.php?id_video=391490&#39; width=&#39;560&#39;&gt;&amp;nbsp;&lt;/iframe&gt;&lt;p&gt;&lt;a href=&#39;http://www.videolog.tv/video.php?id=391490&#39; target=&#39;_blank&#39;&gt;Oficina Ruby On Rails - Parte 2/3&lt;/a&gt; por &lt;a href=&#39;http://www.videolog.tv/Arteccom&#39; target=&#39;_blank&#39;&gt;Arteccom&lt;/a&gt;  no &lt;a href=&#39;http://www.videolog.tv&#39; target=&#39;_blank&#39;&gt;Videolog.tv&lt;/a&gt;.&lt;/p&gt; &lt;br /&gt; &amp;#32;&lt;iframe frameborder=&#39;0&#39; height=&#39;315&#39; scrolling=&#39;no&#39; src=&#39;http://embed.videolog.tv/v/index.php?id_video=391504&#39; width=&#39;560&#39;&gt;&amp;nbsp;&lt;/iframe&gt;&lt;p&gt;&lt;a href=&#39;http://www.videolog.tv/video.php?id=391504&#39; target=&#39;_blank&#39;&gt;Oficina Ruby On Rails - Parte 3/3&lt;/a&gt; por &lt;a href=&#39;http://www.videolog.tv/Arteccom&#39; target=&#39;_blank&#39;&gt;Arteccom&lt;/a&gt;  no &lt;a href=&#39;http://www.videolog.tv&#39; target=&#39;_blank&#39;&gt;Videolog.tv&lt;/a&gt;.&lt;/p&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/12/15/presente-de-natal-da-hostnet-para-a-comunidade-rails-do-brasil</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/12/15/presente-de-natal-da-hostnet-para-a-comunidade-rails-do-brasil/"/>
    <title>Presente de Natal da Hostnet para a comunidade Rails do Brasil</title>
    <published>2008-12-15T00:00:00-08:00</published>
    <updated>2008-12-15T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;h2 id=&#39;a_promoo&#39;&gt;A promoção&lt;/h2&gt;

&lt;p&gt;A &lt;a href=&#39;http://www.hostnet.com.br&#39;&gt;Hostnet&lt;/a&gt; está dando um presente de Natal para a comunidade! Vamos distribuir diversos pacotes com hospedagem Rails de graça por 6 meses! Qualquer projeto pode ser inscrito, desde o seu blog pessoal até um projeto comercial. Envie para a gente as informações sobre o seu projeto, por que você acha que ele é legal e tudo mais que você quiser compartilhar. Eu e a equipe da &lt;a href=&#39;http://www.hostnet.com.br&#39;&gt;Hostnet&lt;/a&gt; iremos eleger pelo menos 10 projetos que ganharão 6 meses de hospedagem grátis no plano Ruby on Rails.&lt;/p&gt;

&lt;h2 id=&#39;como_se_inscrever&#39;&gt;Como se inscrever&lt;/h2&gt;

&lt;p&gt;Envie um e-mail pvt para mim com as informações do seu projeto! Dúvidas e sugestões podem ser enviadas também. Dúvidas sobre os planos da Hostnet você confere aqui: &lt;a href=&#39;http://hostnet.com.br/hospedagem.de.sites.php&#39;&gt;http://hostnet.com.br/hospedagem.de.sites.php&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#39;sobre_o_plano_ruby_on_rails&#39;&gt;Sobre o plano Ruby on Rails&lt;/h2&gt;

&lt;p&gt;O plano Ruby on Rails da &lt;a href=&#39;http://www.hostnet.com.br&#39;&gt;Hostnet&lt;/a&gt;, apesar de ser shared hosting, possui servidores exclusivos. Isso quer dizer que sua aplicação Rails não compete com banco de dados, php etc. Nossos servidores Rails apenas rodam apache com passenger. Estamos há aproximadamente 2 meses e meio no ar sem um minuto de downtime.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/11/28/como-voc-s-fazem-o-describe-das-suas-specs</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/11/28/como-voc-s-fazem-o-describe-das-suas-specs/"/>
    <title>Como vocês fazem o "describe" das suas specs?</title>
    <published>2008-11-28T00:00:00-08:00</published>
    <updated>2008-11-28T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Isso pra mim sempre foi uma dúvida ao usar o rspec. Realmente não há forma correta. É uma opção pessoal no caso de um projeto particular ou de decisão em conjunto no caso de um projeto onde vários desenvolvedores participam.&lt;/p&gt;

&lt;p&gt;Mas o fato é que eu nunca adotei nenhum padrão para isso. É uma coisa que tem me deixado um pouco incomodado. Em alguns modelos sigo o padrão de um &lt;em&gt;describe&lt;/em&gt; para cada método, em outros segui padrões ligeiramente diferentes, como por exemplo testes relacionados a attributos em um &lt;em&gt;describe&lt;/em&gt;, relacionamentos em outro &lt;em&gt;describe&lt;/em&gt; e assim por diante. Ou seja, não há padrão. Há tempos atrás ouvi uma frase que nunca esqueci:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Quando dois padrões existem, não há padrão.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No Lucidus usávamos Test::Unit(quando o projeto começou o rspec ainda era muito pouco difundido) então o &amp;#8220;padrão&amp;#8221; para nós era pelo menos colocar os testes relativos juntos. Então os testes relativos a um mesmo método normalmente estavam juntos, em um &amp;#8220;bloco&amp;#8221;, um abaixo do outro. O rspec nos permite um pouco mais de organização. Mas fazer essa organização extra através dos &lt;em&gt;describes&lt;/em&gt; proporciona algum benefício?&lt;/p&gt;

&lt;p&gt;Então seguindo a idéia&amp;#8230; nós precisamos &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/10/26/como-testar-parte-1-models&#39;&gt;discutir&lt;/a&gt; &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/11/16/como-testar-parte-2-mocks&#39;&gt;testes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Qual opnião de vocês? Como vocês organizam seus &lt;em&gt;describes&lt;/em&gt;? E o que vocês escrevem nele?&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/11/27/um-setup-global-para-todas-as-suas-specs</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/11/27/um-setup-global-para-todas-as-suas-specs/"/>
    <title>Um "setup" global para todas as suas specs</title>
    <published>2008-11-27T00:00:00-08:00</published>
    <updated>2008-11-27T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Ficou bem difundido no rspec a forma em como fazer o setup antes das specs executarem, assim como existe também no Test::Unit.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;describe Act do
  before(:each) do
    (...)
  end

  it &amp;quot;should have many persons associated&amp;quot; do
   (...)
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Eu estava precisando fazer o setup para todas as minhas specs (do planeta :), então descobri uma forma que está mal documentada(pelo menos eu não achei bom), mas é super simples de usar. É só editar o &lt;em&gt;spec/spec_helper.rb&lt;/em&gt; e adicionar dentro do bloco:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Spec::Runner.configure do |config|
  (...)
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O seguinte:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;config.before(:each) do
  your_global_setup_here
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Você também pode executar o setup somente para os &lt;em&gt;controllers&lt;/em&gt;, &lt;em&gt;models&lt;/em&gt; ou &lt;em&gt;helpers&lt;/em&gt; assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;config.before(:each, :behaviour_type =&amp;gt; :controller) do
  your_global_controllers_setup_here
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ou&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;config.before(:each, :behaviour_type =&amp;gt; :helper) do
  your_global_helpers_setup_here
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ou&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;config.before(:each, :behaviour_type =&amp;gt; :model) do
  your_global_models_setup_here
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Como se chama o &amp;#8220;setup&amp;#8221; no bdd? É setup mesmo?&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/11/24/fazendo-o-will_paginate-traduzir-o-previous-e-next</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/11/24/fazendo-o-will_paginate-traduzir-o-previous-e-next/"/>
    <title>Fazendo o will_paginate traduzir o "Previous" e "Next"</title>
    <published>2008-11-24T00:00:00-08:00</published>
    <updated>2008-11-24T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Eu precisei traduzir para várias línguas os links de &amp;#8220;Previous&amp;#8221; e &amp;#8220;Next&amp;#8221; do &lt;a href=&#39;http://github.com/mislav/will_paginate/wikis&#39;&gt;will_paginate&lt;/a&gt;, mas não seria nada dry passar os parâmetros em todas as chamadas a &lt;em&gt;will_paginate()&lt;/em&gt;. Outra solução seria criar um método helper que faria a chamada ao &lt;em&gt;will_paginate()&lt;/em&gt; passando os parâmetros e nas minhas views eu chamaria esse helper no lugar de chamar &lt;em&gt;will_paginate()&lt;/em&gt;. O problema é que sempre que fosse criada uma nova tela com paginação a pessoa teria que lembrar de chamar o método helper e não chamar o &lt;em&gt;will_paginate()&lt;/em&gt; diretamente.&lt;/p&gt;

&lt;p&gt;Então pra mim a melhor solução foi criar uma extensão, que deixa tudo transparente. Eu coloquei em &lt;em&gt;/lib&lt;/em&gt; dentro do projeto rails.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module WillPaginate
  module ViewHelpers
    def will_paginate_with_translate(collection = nil, options = {})
      options, collection = collection, nil if collection.is_a? Hash
      options.merge!(:prev_label =&amp;gt; _(&amp;quot;&amp;amp;laquo; Previous&amp;quot;), :next_label =&amp;gt; _(&amp;quot;Next &amp;amp;raquo;&amp;quot;))
      
      if collection
        will_paginate_without_translate(collection, options)
      else
        will_paginate_without_translate(options)
      end
    end
    alias_method_chain :will_paginate, :translate
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O método &lt;em&gt;_()&lt;/em&gt; que é chamado é o método que faz a tradução no plugin de &lt;a href=&#39;http://github.com/rails/localization/tree/master&#39;&gt;localização&lt;/a&gt; que estou utilizando, você deve alterar para a forma como você faz a localização no seu projeto. Também criei as specs para assegurar o funcionamento:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;require File.dirname(__FILE__) + &amp;#39;/../spec_helper&amp;#39;

describe WillPaginate::ViewHelpers do
  describe &amp;quot;will_paginate translations&amp;quot; do
    before(:each) do
      @expected = &amp;#39;paginate_mock&amp;#39;
      @model = mock(&amp;#39;model-mock&amp;#39;)
      
      @translation_options = {:prev_label =&amp;gt; _(&amp;quot;&amp;amp;laquo; Previous&amp;quot;), :next_label =&amp;gt; _(&amp;quot;Next &amp;amp;raquo;&amp;quot;)}
      @options = {:option1 =&amp;gt; &amp;#39;1&amp;#39;, :option2 =&amp;gt; &amp;#39;2&amp;#39;, :next_label =&amp;gt; &amp;#39;next-fake&amp;#39;}
    end
    
    it &amp;quot;should will_paginate only with translations&amp;quot; do
      helper.should_receive(:will_paginate_without_translate).with(@translation_options).and_return(@expected)
      helper.will_paginate == @expected
    end
    
    it &amp;quot;should will_paginate with @model parameter&amp;quot; do
      helper.should_receive(:will_paginate_without_translate).with(@model, @translation_options).and_return(@expected)
      helper.will_paginate(@model) == @expected
    end
    
    it &amp;quot;should will_paginate with @model parameter and options&amp;quot; do
      helper.should_receive(:will_paginate_without_translate).with(@model, @options.merge(@translation_options)).and_return(@expected)
      helper.will_paginate(@model, @options) == @expected
    end
  end
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Espero que seja útil para alguém ;)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/11/7/palestra-utilizando-ruby-com-bluetooth</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/11/7/palestra-utilizando-ruby-com-bluetooth/"/>
    <title>Palestra Utilizando Ruby com Bluetooth</title>
    <published>2008-11-07T00:00:00-08:00</published>
    <updated>2008-11-07T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Na semana passada eu apresentei no Latinoware a palestra &amp;#8220;Utilizando Bluetooth com Ruby: A forma mais fácil de programar com Bluetooth&amp;#8221;. Foi um sucesso total, a sala estava lotada e o pessoal se amarrou nas demonstrações ao vivo.&lt;/p&gt;

&lt;p&gt;Coloquei os downloads na seção de &lt;a href=&#39;/artigos&#39;&gt;artigos&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/16/rails-summit-dia-16-vinicius-teles</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/16/rails-summit-dia-16-vinicius-teles/"/>
    <title>Rails Summit dia 16: Vinicius Teles</title>
    <published>2008-10-16T00:00:00-07:00</published>
    <updated>2008-10-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Serviços on Rails podem ser desenvolvimento, consultoria, treinamento, mentoring. Fazer serviços da forma certa deve ser acompanhado de paixão. Esse é a melhor maneira de se obter sucesso. Tendo paixão por um assunto, você tem paciência. Paciência é muito importante. Empreendedores não de fazem da noite para o dia. É preciso estudo, dedicação, ser entusiasta. O empreendedor levanta de rasteiras mais que outras pessoas. Hoje mais do que nunca a melhor estratégia é: give, give e give. Quanto mais você contribui para uma comunidade, mais você é importante para a comunidade e mais alguém estará disposta a pagar para você.&lt;/p&gt;

&lt;p&gt;Quais as estratégias? Apresentações, apostilas, livros, traduções. Nosso maior exemplo nacional é o Akita, que se tornou internacionalmente conhecido pela sua colaboração a comunidade. Podcast, video, videocast, entrevistas, divulgação de trabalhos alheios. Todas essas coisas podem até acabar virando negócio, mas acima de tudo levam reconhecimento. O ser humano é caracterizado pela vaidade. É muito dificil querer entrevistar alguém e essa pessoa não querer ser entrevistado. Seja quem for esse pessoa será envaidecida, seja ela um ótimo ou bom desenvolvedor, mas que tem algo bom a ser divulgado. O entrevistado irá divulgar eventualmente mais que o próprio entrevistador e isso é uma grande alavancagem pessoal.&lt;/p&gt;

&lt;p&gt;A melhor de todas as contribuições&amp;#8230; se você já sabe escrever códigos escreva plugins, escrever gems e participe do movimento opensource. E para isso você não precisa nem sair do seu emprego atual. Hoje ninguém precisa obrigatoriamente ser empregado de uma empresa, o ferramental disponível e muito grande e pode permitir qualquer um ser dono do seu próprio negócio numa estratégia de longo prazo.&lt;/p&gt;

&lt;p&gt;No Brasil é mais fácil se destacar que no exterior. Por todos os problemas que o Brasil tem, ele é um mar de oportunidades. E não é necessário largar tudo que você já faz hoje. Como trabalhar part-time em alguns projetos. Trabalhar no exterior e muitas outras coisas. O risco é muito baixo.&lt;/p&gt;

&lt;p&gt;Alguns detalhes que precisam ser notados na vida de serviço. Da onde sai o dinheiro? Para alguns seria melhor trabalhar para empresa pequena, para outros uma empresa grande. Desenvolver software customizado para pequenas empresas é algo complicado, pois elas não tem dinheiro para pagar por desenvolvimento de software. Você sempre acha que está ganhando de menos e ele sempre acha que está pagando demais.&lt;/p&gt;

&lt;p&gt;Serviços não escalam - assim, como Rails (brincadeira). Para se ganhar mais dinheiro com serviço, significa que você precisa ter mais gente trabalhando para você. Quanto você ganha é proporcinal a quanto de tempo você aloca em um cliente. Se você tem mais alguem trabalhando para você, eventualmente você pode ganhar o dobro. E quando você perceber que tem que contralar um batalhão de gente talvez você perceba de fato que serviços não escalam.&lt;/p&gt;

&lt;p&gt;E aí você vai perceber que o trabalho com produtos são mais interessantes. Pois com um produto talvez você consiga resolver o problema de escala. Se você replica aquilo n vezes o valor que você pode ganhar não é proporcional a quantidade de tempo que você dedidou para o projeto. Como por exemplo o Highrise, que custa $24 mês. Se 1000 pessoas resolvessem pagar são $24000. E assim por diante e você pode perceber que isso pode gerar muito dinheiro, ainda mais se você considerar uma equipe pequena.&lt;/p&gt;

&lt;p&gt;Se você vai fazer um produto sobre alguma área que não é computação, é bom você procurar alguém que entenda daquele negócio. Nós da computação não sabemos nada! O que é melhor? Um experimento ou um plano de negócios? Em Rails é possível que você consiga ter algo tão funcional que você possa colocar na mão de alguém que entende daquele negócio. Ou seja, fazer um plano de negócios eventualmente leva tanto tempo quanto fazer um experimento. Com a desvantagem de ele não te dar feedback.&lt;/p&gt;

&lt;p&gt;Uma implementação é tudo. Não adianta apenas a idéia, se você não tiver uma implementação. Se você começa a ter algumas idéias e começa a fazer alguns experimentos, você pode encontrar um nicho ainda não explorado corretamente. No Brasil não é difícil encontrar um nicho. No Brasil existe o paradoxo do talentoso. Uma pessoa estudiosa, talentosa, ele quer ganhar dinheiro. No Brasil essa pessoa acaba procurando uma grande empresa, pois é lá que a grana está. Mas dentro de uma grande empresa, ela não consegue aproveitar o talento dessa pessoa. As grandes empresas estão sugando os grandes talentos e desperdiçando esses talentos. E quem está atendendo os pequenos negócios? Provavelmente os menos talentosos. Os pequenos negócios estão numa espécie de limbo e precisam de bons profissionais para resolver os seus problemas. E os bons profissionais não estão nem aí para os pequenos negócios, pois eles não tem dinheiro.&lt;/p&gt;

&lt;p&gt;Eles não tem dinheiro para pagar alguns milhares de reais por mês para o desenvolvimento de um software. Mas eventualmente eles podem pagar uma mensalidade de 50 ou 100 reais e se você cria um mar onde se consegue navegar sozinho por muito tempo, num produto que atende pequenos negócios&amp;#8230; milhares deles, que pagando pouco por mês geram muito dinheiro.&lt;/p&gt;

&lt;p&gt;A oportunidade é muito grande!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/16/rails-summit-dia-16-phillippe-hanrigou</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/16/rails-summit-dia-16-phillippe-hanrigou/"/>
    <title>Rails Summit dia 16: Phillippe Hanrigou</title>
    <published>2008-10-16T00:00:00-07:00</published>
    <updated>2008-10-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Existem diversos problemas com os testes do selenium. São naturalmente lentos, assim como qualquer tipo de teste de integração. Eles rodam no navegador, que são coisas instáveis, bugados. E ainda colocam pessoas poucos experientes para escrever os testes do selenium, o que é um problema. Tem que ser os melhores para fazer essa tarefa! Mas se é tão dificil, por que fazer?&lt;/p&gt;

&lt;p&gt;E quanto mais javascript se usa, mais devem haver testes. Se você usa muito javascript a sua chance de ter algo que não funciona em todos os browsers é alta. E se você não suporta todas as plataformas, você estará perdendo dinheiro caso não suporte todas. Sobretudo na comunidade Rails. Então é por isso que temos que automatizar esse tipo de testes. E essas são coisas que tem que ser repetidas diversas vezes&amp;#8230; então não são coisas que os humanos tem que fazer. A coisa mais fundamental sobre esses testes e a comunidade de Rails está usando esse tipo de ferramente, mas tem muitas coisas que podemos apredender dos mais antigos. Coisa que podemos aprender de antigos programadores XP, é que testes de aceitação são muito importantes. Pois os testes de aceitação dão poder ao cliente. Você precisa da aceitação para fazer o código correto, do ponto de vista do cliente. Os unit testes server para garantir que os pequenos pedaços funcionam, mas os testes de aceitação server para garantir que tudo funciona junto. O teste de aceitação é tão importante no desenvolvimento que ela não é considerada completa até que ela passe numa suite de aceitação. Uma suite de aceitação te gera confiança.&lt;/p&gt;

&lt;p&gt;Depois da era de ouro, vieram os bárbaros! Os bárbaros são os browser, que impediram a realização de muitos testes de aceitação. Por sorte hoje temos o selenium.&lt;/p&gt;

&lt;p&gt;Quando um teste falha, temos que investigar para descobrir onde está o problema. Então você tem que rodar isso na sua máquina e com sorte o problema também ocorrerá na sua máquina. A melhor forma de resolver o problema com mais facilidade é capturar a maior quantidade de informações no campos de testes: na máquina que rodou o teste, no browser e etc.&lt;/p&gt;

&lt;p&gt;Agora a parte boa para diminuir o tempo de testes do selenium é que desenvolvemos o selenium-grid, que permite que diversos testes do selenium sejam paralelizados, inclusive entra diferentes máquinas de diferentes poderes de processamento. Um dos problemas, assim quando você coloca muitos fios de energia muitos juntos, é que você tem que garantir que um teste não irá interferir nos outros. Garantir por exemplo que as coisas irão rodar em stacks de Rails diferentes.&lt;/p&gt;

&lt;p&gt;Uma coisa boa a fazer é deixar de fazer login como um teste no selenium, mas inserir diretamente um cookie no navegador e resetar a base de dados diretamente pelo teste do selenium. Isso é muito mais rápido.&lt;/p&gt;

&lt;p&gt;A questão das fixtures. Testar com dados randomicos é complicado, pois há muitos efeitos colaterais. Testar usando fixtures fixas com grandes aplicações pode tornar a manutenção das fixtures muito dificil. Uma das soluções que podemos usar é criar os dados usados nos testes diretamente nos próprios testes, sem o uso de fixtures. Mas isso também é complicado, pois pode dar trabalho preencher objetos complexos. Uma solução plausível são os &lt;strong&gt;Object Mother&lt;/strong&gt;. São como templates de objetos instanciados padrões, onde você passa parametros apenas para sobrescrever os valores do objeto que você quer que sejam diferentes do default. Existem diversas maneiras de fazer isso e há muita documentação na internet sobre o assunto.&lt;/p&gt;

&lt;p&gt;Eu queria que vocês saissem daqui sem esquecer: não virem as costas para os testes de aceitação.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/16/rails-summit-dia-16-obie-fernandez</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/16/rails-summit-dia-16-obie-fernandez/"/>
    <title>Rails Summit dia 16: Obie Fernandez</title>
    <published>2008-10-16T00:00:00-07:00</published>
    <updated>2008-10-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Tudo que tenho para falar é como trabalhamos com os principios Ágeis. Eu começei em XP em 2000 e trabalhei com isso por muito anos&amp;#8230; já são 10 anos de experiência. Nós buscamos a melhor maneira de desenvolver software. Começando sobre princípios e iterações sobre processos e ferramentas. Isso nos diz que a coisa deve estar em busca das pessoas. Como a programação em par impacta na produtividade? Isso parece contra a intuição, mas duas pessoas trabalhando em um computador pode ser mais produtivo que duas pessoas trabalhando em dois computadores. A melhoria do design no desenvolvimento em par é melhorado, além de ser mais gostoso. Pair programming não é uma coisa natural pois não é naturalmente usado em grandes empresas, mas é preciso aprender&amp;#8230; e leva um certo tempo.&lt;/p&gt;

&lt;p&gt;Eu acho muito importante ter dois teclados e dois mouses pois dessa maneira, uma só pessoa que tenha um perfil dominante não trabalha sozinha. Um dos princípios que melhora a produtividade é a revisão de código automática. Ao trabalhar em par isso é natural. Quando está trabalhando em par se trabalha o dia todo. Pois ao trabalhar sozinho, você vê o seu e-mail, lê blogs e etc. E essas coisas não acontecem com programação em par. Ao fim de um dia de programação em par você está cansado. Pois você realmente pensou e trabalhou o dia todo, mas você fica contente, pois sabe que teve o trabalho realizado.&lt;/p&gt;

&lt;p&gt;É comum entre nós desenvolvedores, muitos de vocês mais inteligentes do que eu trabalham muito bem. Então dizem que demoram uma hora para realizar o trabalho, mas ficam horas escrevendo no blog e no twitter, fazem o trabalho em 5 minutos e depois vão para o almoço. O pair programming elimina isso. Ele te dá muita produtividade. Para as pessoas farerem pares é preciso contratá-las. Quando eu contrato pessoas para a minha empresa eu faço um post no meu blog e espero as respostas. Você diz as suas habilidades e é convidado a trabalhar por uma semana para nós sabermos se você é bom de verdade fazendo pair programming num projeto de verdade. Então nós contratamos as pessoas sem entrevistas, mas com elas trabalhando num projeto real por uma semana. Só por que alguém vai bem numa entrevista não tem relação em como ela é no dia-a-dia do trabalho. Em times pequenos é mais fácil de manter a felicidade de todas as pessoas. Times de 2 a 4 pessoas são boas opções. Além disso vocês podem ter problemas de comunicação.&lt;/p&gt;

&lt;p&gt;Mais um principio que se pode utilizar ao ter um time de 2 a 4 pessoas é ter um time auto-organizado. Na nossa empresa a gente não tem chefes. Todos os times são auto-gerenciados. Pois se você tem um time desse tamanho de apenas pessoas boas e você tem um lema &amp;#8220;todo mundo junto&amp;#8221; as coisas simplesmente funcionam.&lt;/p&gt;

&lt;p&gt;Software funcionando em contrário a uma extensiva documentação. Uma maneira de trabalhar desse jeito é usando rspec, nós somos fãs de rspec. É uma ferramenta tão eficiente, ela não somente ajuda você a trabalhar com o software, mas também para gerar uma documentação, que nós entregamos para o nosso cliente. Isso com certeza agrega valor ao nosso trabalho.&lt;/p&gt;

&lt;p&gt;Eu me importo em ser real e essa uma razão pelo o qual eu estou envolvido por tanto tempo com Rails. Nós participamos do Rails Ramble de 2007, isso foi antes da formação do Rails Rocket, e isso mostrou pra gente que é possivel com Rails fazer um trabalho muito grande com pouco tempo. Foi muito bom trabalhar com essas restrições, pois na nossa área é comum o tamanho de um projeto expandir para caber no tempo total disponível para o desenvolvimento.&lt;/p&gt;

&lt;p&gt;Nós trabalhamos com um conceito chamado 3-2-1. Que significa colocar um software no ar em 3 dias, onde temos 4 desenvolvedores, 2 da nossa equipe e mais 2 que chamamos para uma semana de trabalho.&lt;/p&gt;

&lt;p&gt;Colaboração do cliente em frente a negociação de contratos. Isso tudo tem relação com transparência em relação ao cliente. Isso leva confiança ao seu cliente. Nós gostamos dos clientes com o qual trabalhamos.&lt;/p&gt;

&lt;p&gt;Uma coisa importante é que você precisa ter um designer dentro da equipe que saiba fazer todo o visual do nosso projeto. Pois sem um projeto visual acabado, nós não temos o que mostrar para o nosso cliente. É bom ver exatamente como vai ficar e eu posso construir isso em 3 dias se você me mostrar como vai ficar.&lt;/p&gt;

&lt;p&gt;Por outro lado, quando já temos um design, não temos muito o que divergir da maioria é que nós gostamos de user stories, que para nós significam a aceitação do cliente. Nós trabalhamos com cartões e com projeções para atividades que duram de 0 até 8 pontos de desenvolvimento. Com isso nós medimos o desenvolvimento de nosso equipe e quantos pontos podemos fazer por semanas. Na nossa equipe é comum fazer algo em torno de 25 pontos por semana. Em 0 pontos nós temos coisas que duram apenas alguns minutos e em 4 pontos nós temos coisas que duram uma semana.&lt;/p&gt;

&lt;p&gt;Antes nós perdíamos muito tempo com negociação de contrato. Então nós desenvolvemos um documento, que serve como nosso contrato, que não exije que o cliente nos pague caso ele não esteja satisfeito. Esse contrato tem um termo especial que diz que ele não pode te processar por mais dinheiro que ele iria te pagar. O nosso contrato também estabelece que nós podemos contribuir com o mundo opensource com o código desenvolvido para eles, mas só as coisas que não são específicas do cliente, como plugins e gems que você desenvolveu para trabalhar naquele projeto.&lt;/p&gt;

&lt;p&gt;E a última parte do manifesto ágil é responder a mudanças em vez de seguir um plano. Nós usamos um serviço chamado pivot tracker e ele é muito bom pois ele nos mostra muitas informaçõe sobre o nosso projeto, incluindo gráficos de burndown entre outros. A stand up meeting é outra coisa essencial para nós sobre como anda o nosso projeto e nos ajuda a dar mais uma previsão sobre quanto tempo esse projeto ainda vai demorar. Todos falam sobre o que fizeram ontem, o que farão hoje e sobre o que está atrapalhando o trabalho. Quando estamos com mais pessoas, como nós que já estamos com 20 pessoas, temos que mudar um pouco a dinamica do standup meeting, mas a essencial é a mesma.&lt;/p&gt;

&lt;p&gt;Tenho mais uma coisa para falar, que coloquei no final, que é a parte mais importante do Hashrocker, a nossa empresa, é que nós achamos que a coisa mais importante é se divertir no trabalho. Sem diversão não há produção. Nós fazemos algumas coisas em conjunto para diversão.&lt;/p&gt;

&lt;p&gt;E nós bebemos bastante para nos divertir e pulamos na piscina quando todos estão bêbados!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/16/rails-summit-dia-16-jay-fields</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/16/rails-summit-dia-16-jay-fields/"/>
    <title>Rails Summit dia 16: Jay Fields</title>
    <published>2008-10-16T00:00:00-07:00</published>
    <updated>2008-10-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;100% de cobertura de testes não é a meta. Em ruby podemos optar por toda essa cobertura. Não é necessário escrever testes para cobrir 100%. Os testes são a parte mais importortante do sistema. Se o seu negócio depende de uma funcionalidade que é crítica, ela deve ser muito bem testada. Para ter a confiança ao fazer refactoring é precisa ter alguma cobertura de testes, eles dão confiança. Seu código de testes deve ser limpo, perfeito.&lt;/p&gt;

&lt;p&gt;As imaturidades do teste do selenium. Ele é bom, mas falha em algumas situações. Existem diversas maneiras diferentes de utilizar o selenium. É preciso escolher a maneira correta no seu contexto. Se você está programando em ruby, utilize selenium programando em ruby. O selenium tem outro problema grande: ele é muuuuuito lento. Grandes suites de teste do selenium são difíceis de manter. O selenium tem bugs, e roda em cima do navegador e algum bug no internet explorer pode fazer o seu teste quebrar e você irá demorar muito tempo para descobrir onde o problema está. O selenium não informa precisamente onde estão os problemas.&lt;/p&gt;

&lt;p&gt;Selenium tem boas vantagens. Ele pode testar o seu site entre navegadores. Ele é o único a testar o fullstack de uma aplicação web. Ele é fácil de usar e por ter muitas maneiras de usar, ele pode se adaptar a praticamente qualquer ambiente. Ele é amigável para testadores. É a melhor solução para smoke testing.&lt;/p&gt;

&lt;p&gt;Imaturidade do test/unit. Ele não é tester friendly. Os testes são procedimentos e se perde muito da orientação a objetos, não há herança entre testes. Ele testa apenas pequenas coisas. A sintaxe dele é horrível, não intuitiva, não há um mapeamento muito bom entre o código do software e o de teste. Não há um framework de mock incluído. Mas tem vantagens, ele é muito amigável com o desenvolvedor. Muitos desenvolvedores já utilizaram algum tipo de teste unitário. Apesar da sintaxe feia, os desenvolvedores estão acostumadas a ela. E é fácil de escrever para um desenvolvedor. Roda muito rapidamente.&lt;/p&gt;

&lt;p&gt;Imaturidade de rspec. Rspec usa muita mágica para fazer as coisas funcionar. Ele é muito baseado no inglês, mas ao mesmo tempo não tão consistente assim com o inglês. Mas depois da familiarização com o rspec entender as convenções fica fácil. Não é tão simples de extender. Ele é focado em testes de comportamento (behavior), que são mais fáceis de entender. Ele gera documentação automática e possui um framework de mock embutido.&lt;/p&gt;

&lt;p&gt;Imaturidade do Synthesis. É um framework de integração. Encoraja classes desacopladas. Dá confiança sem necessidade de fazer testes de integração traducionais.&lt;/p&gt;

&lt;p&gt;Imaturidade do Expectations. Framework de expectativas, similar com frameworks de behavior. Ele é somente código, não existem métodos. Então por exemplo se um teste falha ele apenas diz que falhou uma coisa na linha 35, por exemplo. Então ele não tem documentação, pois há ligação entre uma linha de teste e sobre qual teste em si está sendo executado. Ele é bem conciso, então essa é a parte legal, por isso que eu uso ele para certas situações. Ele encoraja a realização de testes bem granulares. Os valores esperados são literais. Encoraja que você faça definição de métodos que sejam expressivos.&lt;/p&gt;

&lt;p&gt;Experimente e faça o que funciona melhor para você.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/16/rails-summit-dia-16-carl-youngblood</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/16/rails-summit-dia-16-carl-youngblood/"/>
    <title>Rails Summit dia 16: Carl Youngblood</title>
    <published>2008-10-16T00:00:00-07:00</published>
    <updated>2008-10-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Um ecossistema é a fauna e a flora e também o meio-ambiente de um certo lugar, não somente as coisas vivas, mas também o clima, por exemplo. Um conceito associado a um ecossistema é o aparecimento gradual. As coisas pequenas que quando atuadas em conjunto formam padrões e coisa mais importantes que as coisas pequenas isoladamente. Uma formiga individual carregando comida para dentro da toca sozinha parece que não faz nenhum trabalho importante. É um trabalho que nunca termina. Mas muitas formigas trabalhando em conjunto sem um chefe e de forma individual faz no conjunto um importante trabalho.&lt;/p&gt;

&lt;p&gt;Agora como funciona o surgimento nas pessoas. Fazendo analogias do mundo real, como o crescimento das cidades e a comunicação de neurônios em nosso cérebro ele explicou como a inteligência coletiva é importante. Muitas das pessoas importantes do mundo muitas vezes são insuportáveis.&lt;/p&gt;

&lt;p&gt;Agora o ecossistema do Rails. Dhh tem uma arrogância natural e sem ele não exitiria o Rails. Chad Fowler, James Buck, Michael Molina e Zed Shaw, todos eles são excentricos e tem caracteristicas exóticas, boas e ruins. Por último os humoristas do Rails Envy. Todas ajudam a comunidade internacional. Mas e o ecossistema Rails brasileiro?&lt;/p&gt;

&lt;p&gt;Sem ser mau ou ser bom, qualquer pessoa não serve para nada. Que papel, você vai exercer?&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/15/rails-summit-dia-15-george-malamidis-e-danilo-sato</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/15/rails-summit-dia-15-george-malamidis-e-danilo-sato/"/>
    <title>Rails Summit dia 15: George Malamidis e Danilo Sato</title>
    <published>2008-10-15T00:00:00-07:00</published>
    <updated>2008-10-15T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Foram desenvolvidos de diversos aspestos sobre REST, o principal foi o uso do REST para prover serviços, suas limitações e formas de escalar. Por fim o REST foi comparado com outros protocolos para prover serviços e enviar mensagens, como SMTP e XMPP. Esse tipo de protocolo pode ser mais escalável que prover serviços em REST dependendo do que se deseja.&lt;/p&gt;

&lt;p&gt;No fim da palestra apareceu uma pergunta interessante que questionou se o serviço do Flickr era REST ou não. O questionamento foi em relação aos resources do Flickr não utilizarem a formatação clean das URLs como no Rails, mas passando parâmetros na URL da forma convencinal para informar a action desejada. O George defendeu que os serviços do Flickr são REST sim, apenas não utilizam a mesma formatação de URLs Rails. Na opnião dele se são recursos que podem ser acessados e &lt;em&gt;cacheados&lt;/em&gt; então ele considera sim como sendo um recurso.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/15/rails-summit-dia-15-dr-nic</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/15/rails-summit-dia-15-dr-nic/"/>
    <title>Rails Summit dia 15: Dr Nic</title>
    <published>2008-10-15T00:00:00-07:00</published>
    <updated>2008-10-15T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Nosso doctor da comunidade contou como ele começou no Rails, em como foi chato ver pela primeira vez o tutorial de Rails de 15 minutos e como ele largou o Visual Studio e mudou para Rails.&lt;/p&gt;

&lt;p&gt;Antes de fazer hacks em código as pessoas faziam hack em carros e o Dr Nic era triste pois os pais dele não deixaram ele hackear o carro, já que eles precisavam usá-lo. Depois apareceram os hacks de hardware, mas eles eram caros. E então apareceu o código, onde você não precisa gastar dinheiro nenhum para começar a hackear. No passado não havia tanto código quanto hoje, então hoje é muito fácil estudar código e olhar código para hackear.&lt;/p&gt;

&lt;p&gt;Foram apresentados algumas estatísticas do número de projetos opensorce no sourceforge, rubyforge e github. É notável, pois há cerca de 6500 projetos no rubyforge, enquanto já existem 19000 no github!&lt;/p&gt;

&lt;p&gt;Mais uma vez, assim como o Chad Fowler, uma palestra falando sobre reconhecimento pessoal. Dr Nic incentivou a colaboração, fazendo uma analogia com dinheiro. Se você tem $1,000 que você não pode gastar em lugar nenhum, para que serve esse dinheiro? Essa foi a relação que ele fez com os &lt;strong&gt;segredos&lt;/strong&gt; de código.&lt;/p&gt;

&lt;p&gt;Defendeu uma mudança no pensamento em relação a grupos e permissões, dando mais incentivo ao &lt;strong&gt;individuo&lt;/strong&gt;. Na opnião dele simplesmente dizer que algo está quebrado é uma coisa muito lenta. Então normalmente ele interfere num projeto enviando um patch, pois este diz tudo que diversos e-mails não resolveriam. É algo como andar na frente. Em suas palavras: &amp;#8220;There is no &lt;strong&gt;them&lt;/strong&gt;&amp;#8221;.&lt;/p&gt;

&lt;p&gt;Falou sobre as diversas atividades que os desenvolvedores podem ter dentro de um projeto opensource e como cada uma dessas atividades individuais são importantes. Existem diversas oportunidades de contribuição em projetos opensource, inclusive os projetos não mais mantidos do Dr Nic. Enfatizou bastante a questão da não necessidade de permissão para fazer as coisas, e sobre como o git facilitou a nossa vida nesse sentido.&lt;/p&gt;

&lt;p&gt;Ele citou o exemplo de um cara que trabalha com ele que programa em Cocoa, mas que não entende nada de software opensource, que não contribui com a comunidade. E mais um vez está a importancia dos blogs para divulgar a cultura opensource e mostrar para esse tipo de pessoa sobre como trabalhar colaborativamente pode favorecer a todos.&lt;/p&gt;

&lt;p&gt;Os caminhos para se tornar bom na comunidade: aprender controle de versão(svn e git), aprender unit testing, começar um blog, aumente a sua bagagem técnica e na comunidade&lt;/p&gt;

&lt;p&gt;Ele focou bastante ao falar do tdd. Ele não mexe em código que não tem teste, no máximo auxilia na documentação. E ainda falou das facilidades já oferecidas pelo Rails.&lt;/p&gt;

&lt;p&gt;Sobre o blog ele falou da importancia que o blog teve para torná-lo conhecido e sobre como isso pode ajudar os profissionais para se tornarem também. Enfatizou que não é preciso escrever textos formais no blog, o importante é contribuir com qualquer coisa que você tenha aprendido. Isso ajuda você no futuro e ainda ajuda a comunidade.&lt;/p&gt;

&lt;p&gt;Participar de conferências, mostrar o seu código, corrigir o código dos outros, fazer (boas) perguntas em forums, traduzir coisas para o português e para o inglês.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don&amp;#8217;t keep secrets!&lt;/strong&gt; Compartilhe, compartilhe, compartilhe!&lt;/p&gt;

&lt;p&gt;Esse é o caminho para o &lt;strong&gt;awesomeness&lt;/strong&gt;!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/10/15/rails-summit-dia-15-chad-fowler</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/10/15/rails-summit-dia-15-chad-fowler/"/>
    <title>Rails Summit dia 15: Chad Fowler</title>
    <published>2008-10-15T00:00:00-07:00</published>
    <updated>2008-10-15T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Chad Fowler falou bastante sobre como se promover no mercado como desenvolvedor. Ele fez analogia comparando o desenvolvedor com produtos, mas não de maneira negativa. Apenas informando que o desenvolvedor deve saber se apresentar para o mercado, fazer barulho para se mostrar, fazer marketing pessoal. É uma coisa que muitos desenvolvedores não gostam de fazer, mas é necessário se você quer crescer como profissional. Um dos exemplos dados por ele foi o de um funcionário que sabe desenvolver 5 vezes mais rápido que qualquer um da equipe de desenvolvimento, mas não fala isso pra ninguém e continua trabalhando com suporte.&lt;/p&gt;

&lt;p&gt;Ele falou também sobre produtos que ele classificou como &lt;strong&gt;remarkable&lt;/strong&gt;. Seriam coisas que tem potencial de sucesso, como foi/é o caso do Rails. Também foi o caso do iPod, que entrou para concorrer nos Estados Unidos num mercado onde se compra um MP3 Player por $15 e o iPod algumas centenas de dólares. E o principal, enfatizou que o profissional deve ser &lt;strong&gt;remarkable&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Não foi nada que eu já não soubesse, mas é legal ouvir de alguém com renome na comunidade.&lt;/p&gt;

&lt;p&gt;Hora do almoço!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/9/29/participa-o-no-railsbox-podcast</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/9/29/participa-o-no-railsbox-podcast/"/>
    <title>Participação no Railsbox podcast</title>
    <published>2008-09-29T00:00:00-07:00</published>
    <updated>2008-09-29T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Na semana passada eu participei da gravação do &lt;a href=&#39;http://railsbox.org/&#39;&gt;Railsbox podcast&lt;/a&gt;. O tema foi licenciamento de softwares livres/open source. Falamos muito sobre software livre e licenças open source, fazendo paralelo com a realidade atual de nós desenvolvedores Rails e nossos projetos.&lt;/p&gt;

&lt;p&gt;Agradeço ao &lt;a href=&#39;http://railsbox.org/&#39;&gt;Ozéias Sant’ana&lt;/a&gt; e ao &lt;a href=&#39;http://www.daviscabral.com.br/&#39;&gt;Davis Cabral&lt;/a&gt; pelo convite. Também participou do podcast o &lt;a href=&#39;http://blog.rafaelcaceres.net/&#39;&gt;Rafael Caceres&lt;/a&gt;, que é envolvido com o movimento do software livre no Paraná.&lt;/p&gt;

&lt;p&gt;Confiram o link original do &lt;a href=&#39;http://railsbox.org/2008/9/29/railsbox-podcast-4&#39;&gt;podcast&lt;/a&gt; e faça o &lt;a href=&#39;/assets/images/2008/9/29/railsbox_4.mp3&#39;&gt;download&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/9/15/disabling-my-public-svn</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/9/15/disabling-my-public-svn/"/>
    <title>Disabling my public svn</title>
    <published>2008-09-15T00:00:00-07:00</published>
    <updated>2008-09-15T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;I disabled my public svn. I only had apache installed in my vps because of svn and it&amp;#8217;s not making sense anymore with &lt;a href=&#39;http://github.com&#39;&gt;GitHub&lt;/a&gt;. So my public projects are now there.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/8/29/rcov-with-segfault-bug-patched</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/8/29/rcov-with-segfault-bug-patched/"/>
    <title>Rcov with segfault bug patched</title>
    <published>2008-08-29T00:00:00-07:00</published>
    <updated>2008-08-29T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Rcov are hurting many people because of a &lt;a href=&#39;http://rspec.lighthouseapp.com/projects/5645/tickets/309-fix-for-rcov-segfault-2&#39;&gt;segfault when used with rspec&lt;/a&gt;. Fortunately &lt;a href=&#39;http://tomcopeland.blogs.com/&#39;&gt;Tom Copeland&lt;/a&gt; wrote a &lt;a href=&#39;http://tomcopeland.blogs.com/juniordeveloper/2008/08/rcov-crashing-w.html&#39;&gt;patch last week&lt;/a&gt;. I patched it against rcov and put on &lt;a href=&#39;http://github.com/mergulhao/rcov/tree/master&#39;&gt;GitHub&lt;/a&gt;. You can install it as a gem doing like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;$ gem sources -a http://gems.github.com (you only have to do this once)
$ sudo gem install mergulhao-rcov&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Someone knows how to make GitHub recognizes my README.markdown file?&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/7/31/procuro-empresa-para-me-contratar</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/7/31/procuro-empresa-para-me-contratar/"/>
    <title>Invitation for companies to hire me / Procuro empresa para me contratar</title>
    <published>2008-07-31T00:00:00-07:00</published>
    <updated>2008-07-31T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;h2 id=&#39;english_version&#39;&gt;English version:&lt;/h2&gt;

&lt;p&gt;As the end of the &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt; project gets closer, It is time, just as &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/06/26/tapaj%C3%B3s-na-surgeworks&#39;&gt;Tapajós&lt;/a&gt; did, to look for other projects till &lt;a href=&#39;http://www.improveit.com.br/&#39;&gt;Improve It&lt;/a&gt; is able to maintain &lt;a href=&#39;http://www.improveit.com.br/empresa&#39;&gt;all of us&lt;/a&gt;. I am looking for a company to hire me for the next months.&lt;/p&gt;

&lt;p&gt;Requirements of the companies/projects candidates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Project with the minimum of three months, and maximum indefinite&lt;/li&gt;

&lt;li&gt;Maximum of 6 hours allocated a day&lt;/li&gt;

&lt;li&gt;Flexible work hours&lt;/li&gt;

&lt;li&gt;The time of entry can not be prior to 10am (local hour in Rio de Janeiro, Brazil / -3 GMT), when working at the office&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Desireable requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web applications with Rails&lt;/li&gt;

&lt;li&gt;Bluetooth applications&lt;/li&gt;

&lt;li&gt;Remote work&lt;/li&gt;

&lt;li&gt;Companies outside Brazil with payment in US dollars&lt;/li&gt;

&lt;li&gt;Small companies with small teams&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I offer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean code with no dirty workarounds&lt;/li&gt;

&lt;li&gt;Test-driven development&lt;/li&gt;

&lt;li&gt;Web applications with selenium acceptance tests&lt;/li&gt;

&lt;li&gt;Extreme Programming experience&lt;/li&gt;

&lt;li&gt;Availability to travel when financed&lt;/li&gt;

&lt;li&gt;Satisfaction guaranteed or contract termination in the first month without charge to any party&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Interested companies &lt;a href=&#39;http://mergulhao.info/sobre&#39;&gt;contact&lt;/a&gt; me privately.&lt;/p&gt;

&lt;h2 id=&#39;verso_em_portugus&#39;&gt;Versão em português:&lt;/h2&gt;

&lt;p&gt;Vai chegando o fim do projeto &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt; e está no hora de, &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/06/26/tapaj%C3%B3s-na-surgeworks&#39;&gt;assim como o Tapajós&lt;/a&gt;, buscar trabalho até que a &lt;a href=&#39;http://www.improveit.com.br/&#39;&gt;Improve It&lt;/a&gt; se torne sustentável para &lt;a href=&#39;http://www.improveit.com.br/empresa&#39;&gt;todos nós&lt;/a&gt; que trabalhamos nela. Estou em busca de uma empresa para me contratar pelos próximos meses.&lt;/p&gt;

&lt;p&gt;Requisitos das empresas/projetos candidatos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mínimo de 3 meses de projeto, máximo indeterminado&lt;/li&gt;

&lt;li&gt;Máximo de 6h de alocação por dia&lt;/li&gt;

&lt;li&gt;Flexibilidade dos horários de trabalho&lt;/li&gt;

&lt;li&gt;O horário de entrada(caso seja alocado na empresa) não pode ser anterior às 10h da manhã&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Contam pontos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sistemas Web utilizando Rails&lt;/li&gt;

&lt;li&gt;Aplicações com Bluetooth&lt;/li&gt;

&lt;li&gt;Trabalho remoto&lt;/li&gt;

&lt;li&gt;Empresas do exterior com pagamentos em dólar&lt;/li&gt;

&lt;li&gt;Empresas e equipes pequenas&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ofereço:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Desenvolvimento limpo e sem gambiarras&lt;/li&gt;

&lt;li&gt;Uso de test-driven development&lt;/li&gt;

&lt;li&gt;Uso de selenium em aplicações web&lt;/li&gt;

&lt;li&gt;Experiência com extreme programming&lt;/li&gt;

&lt;li&gt;Disponibilidade para viagens, inclusive para o exterior, desde que financiadas&lt;/li&gt;

&lt;li&gt;Garantia de satisfação ou contrato cancelado no primeiro mês sem ônus para nenhuma das partes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Empresas interessadas entrem em &lt;a href=&#39;http://mergulhao.info/sobre&#39;&gt;contato&lt;/a&gt; em pvt. Meu &lt;a href=&#39;http://mergulhao.info/sobre/curriculo&#39;&gt;currículo&lt;/a&gt; está disponível.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/7/11/unresponsive-script-no-selenium</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/7/11/unresponsive-script-no-selenium/"/>
    <title>Unresponsive script no selenium</title>
    <published>2008-07-11T00:00:00-07:00</published>
    <updated>2008-07-11T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;No começo da semana no &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt;, começamos a ter problemas com o &lt;a href=&#39;http://selenium-on-rails.openqa.org/&#39;&gt;selenium&lt;/a&gt;. No fim da execução dos testes ele gera um relatório que é interpretado pelo nosso &lt;a href=&#39;http://cruisecontrolrb.thoughtworks.com/&#39;&gt;cruisecontrol.rb&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O problema é que já possuímos testes &lt;strong&gt;DEMAIS&lt;/strong&gt; no selenium, então na hora de gerar o relatório, o firefox dizia aquela mensagem de que &amp;#8220;um script em execução não está respondendo&amp;#8230;.&amp;#8221;. Quando íamos conferir, nosso build havia falhado por conta disso.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;unresponsive_script&#39; src=&#39;/assets/images/2008/7/11/unresponsive_script.png&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução:&lt;/strong&gt; acessar o &lt;em&gt;about:config&lt;/em&gt; do firefox e alterar o campo &lt;em&gt;dom.max_script_run_time&lt;/em&gt; de 10 (default) para 40, por exemplo.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/7/1/criando-uma-nova-aplica-o-a-partir-de-gem-antiga-do-rails</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/7/1/criando-uma-nova-aplica-o-a-partir-de-gem-antiga-do-rails/"/>
    <title>Criando uma nova aplicação a partir de gem antiga do Rails</title>
    <published>2008-07-01T00:00:00-07:00</published>
    <updated>2008-07-01T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Parece uma bobeira, mas não achei documentação sobre isso. Hoje quis gerar um projeto Rails utilizando o Rails 1.2.6 que ainda tenho instalado aqui na minha máquina. O problema é que eu tenho versões do Rails mais novas (2.0.2 e 2.1) instaladas também e ele sempre roda a última versão no comando &lt;em&gt;rails&lt;/em&gt;. Lendo o executável descobri que basta fazer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails \_1.2.6\_ projeto&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Sim é exatamente como o comando está aparecendo, com os underscore e tudo. Vai entender&amp;#8230;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/6/14/em-julho-ultra-maratona-how-to</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/6/14/em-julho-ultra-maratona-how-to/"/>
    <title>Em Julho: Ultra Maratona How To!</title>
    <published>2008-06-14T00:00:00-07:00</published>
    <updated>2008-06-14T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Em julho teremos no Rio de Janeiro a I Ultra Maratona How To de Software Livre! É um evento com 20 tutoriais práticos de 4 horas cada. Terão desde cursos de utilização de BrOffice e Inkscape, passando por segurança de servidores, hardening e desenvolvimento. Para ver a &lt;a href=&#39;http://www.ultramaratonahowto.com.br/tutoriais.htm&#39;&gt;grade completa acesse&lt;/a&gt;. Os preços são bem convidativos, entre R$60 e R$90.&lt;/p&gt;

&lt;p&gt;Eu serei tutor de dois. O primeiro, com nome de &amp;#8220;XP Game e o Jogo da comunicação&amp;#8221;, será em conjunto com o &lt;a href=&#39;http://www.improveit.com.br/empresa/tapajos&#39;&gt;Tapajos&lt;/a&gt; e o &lt;a href=&#39;http://www.improveit.com.br/empresa/felipe&#39;&gt;Felipe Barreto&lt;/a&gt;. No segundo estarei sozinho e será uma &amp;#8220;Introdução ao Ruby on Rails&amp;#8221;.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;http://www.ultramaratonahowto.com.br&#39;&gt;Acesse já e faça a sua inscrição&lt;/a&gt;, as vagas são limitadas.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/5/15/um-ano-de-mergulhao-info</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/5/15/um-ano-de-mergulhao-info/"/>
    <title>Um ano de mergulhao.info</title>
    <published>2008-05-15T00:00:00-07:00</published>
    <updated>2008-05-15T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;E lá se vai um ano de &lt;a href=&#39;http://mergulhao.info&#39;&gt;mergulhao.info&lt;/a&gt;! Total de 53 artigos publicados, um punhado de comentários, diversas palestras pelo Brasil, alguns projetos realizados e outros em andamento.&lt;/p&gt;

&lt;p&gt;Desde que começei com este blog, há pouco mais de um ano, sempre tive em mente que este era um projeto para divulgação do meu trabalho, um espaço meu. Partindo desse ponto, assumi integralmente o custo dele para mim, abrindo mão de qualquer tipo de remuneração de ads.&lt;/p&gt;

&lt;p&gt;Hoje(na verdade quem visitou meu site nos últimos dias já viu) estou abrindo mão da ausência de propaganda em meu site, não por dinheiro, mas para uma causa que considero importante.&lt;/p&gt;

&lt;p&gt;O Rio de Janeiro, capital, vem de 16 anos de governo Cesar Maia. Foram basicamente 16 anos em que o governo do Rio não teve diálogo com o governo estadual ou com o governo federal, ou com os dois ao mesmo tempo. Foram 16 de anos de obras de fachada, &lt;a href=&#39;http://g1.globo.com/Noticias/Rio/0,,MUL364950-5606,00.html&#39;&gt;desvios de verba&lt;/a&gt; e um Pan-Americano que &lt;a href=&#39;http://rjtv.globo.com/Jornalismo/RJTV/0,,MUL260304-9097,00.html&#39;&gt;custou dezenas de vezes o orçado&lt;/a&gt;, construiu uma Vila que afunda e acabou com um patrimônio do automibilismo brasileiro, o &lt;a href=&#39;http://en.wikipedia.org/wiki/Aut%C3%B3dromo_Internacional_Nelson_Piquet&#39;&gt;Autódromo Nelson Piquet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para piorar as coisas os novos candidatos não são nem um pouco animadores. Eu já fiz a &lt;a href=&#39;http://pedrodoria.com.br/2008/01/18/gabeira-para-o-rio/&#39;&gt;minha opção&lt;/a&gt;, não acho que exista um salvador da pátria, mas com certeza existe algo melhor.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/5/3/movendo-um-repositorio-svn</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/5/3/movendo-um-repositorio-svn/"/>
    <title>Movendo um repositório SVN</title>
    <published>2008-05-03T00:00:00-07:00</published>
    <updated>2008-05-03T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Anteriormente eu utilizava hospedagem compartilhada no &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt;, mas eu &lt;a href=&#39;http://mergulhao.info/2008/4/12/fisl-chegando-e-algumas-novidades&#39;&gt;mudei&lt;/a&gt; a pouco tempo atrás. Gerenciava meus repositórios pelas ferramentas do &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt;. Agora no &lt;a href=&#39;http://www.silverrack.com&#39;&gt;vps&lt;/a&gt; precisei aprender uns truques a mais. Antes eu tinha minhas coisas públicas espalhadas por alguns repositórios. Agora juntei tudo num só e foi mais fácil do que pode parecer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;svnadmin dump caminho_para_o_repositorio &amp;gt; repositorio.dump&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;O &lt;em&gt;caminho_para_o_repositorio&lt;/em&gt; é o caminho físico (e não a url de acesso ao svn, logo é preciso estar logado na máquina onde está o repositório) e &lt;em&gt;repositorio.dump&lt;/em&gt; é o nome do arquivo do dump. Agora é só:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;svnadmin load caminho_para_o_repositorio_destino &amp;lt; repositorio.dump&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Com isso você leva todo o conteúdo de um repositório para o outro. E é por isso que agora meu repositório svn público está de volta ao ar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://mergulhao.info/svn/&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/5/3/litespeed-como-proxy-para-o-apache-servir-svn</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/5/3/litespeed-como-proxy-para-o-apache-servir-svn/"/>
    <title>Litespeed como proxy para o Apache servir SVN</title>
    <published>2008-05-03T00:00:00-07:00</published>
    <updated>2008-05-03T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;No &lt;a href=&#39;http://www.silverrack.com&#39;&gt;vps&lt;/a&gt; estou utilizando &lt;a href=&#39;http://litespeedtech.com/&#39;&gt;Litespeed&lt;/a&gt; como servidor web. &lt;a href=&#39;http://www.usefuljaja.com/litespeed&#39;&gt;Neste link&lt;/a&gt; estão disponíveis vários tutoriais para configuração básica do Litespeed, então não vou entrar neste mérito, pois não iria acrescentar nada mais do que já está lá.&lt;/p&gt;

&lt;p&gt;O Litespeed é um ótimo servidor web para projetos Rails. Fácil de instalar e usar, com interface web para configurar TUDO que existe nele, consome muito pouca memória, aguenta o tranco de conexões simultâneas etc &amp;#8212; não sei o que as pessoas ainda fazem perdendo tempo configurando Apache + mongrel_cluster, pois o Litespeed resolve isso muito bem sem utilizar mongrel.&lt;/p&gt;

&lt;p&gt;Ele tem um problema. Não serve SVN como o Apache faz. Mas ele é um servidor web completo e possui opções para fazer proxy. A solução então é configurar um Apache rodando em uma porta diferente da 80 e fazer o Litespeed direcionar certas urls para o Apache. Assim:&lt;/p&gt;
&lt;a href=&#39;/assets/images/2008/5/3/ls_apache_rails.png&#39;&gt;&lt;img alt=&#39;litespeed proxy&#39; src=&#39;/assets/images/2008/5/3/ls_apache_rails.png&#39; /&gt;&lt;/a&gt;
&lt;p&gt;Primeiro é necessário adicionar uma &amp;#8220;External App&amp;#8221;. Na página principal de administração do Litespeed clicar em &amp;#8220;Configuration&amp;#8221;, em &amp;#8220;External App&amp;#8221; e por último em &amp;#8220;Add&amp;#8221;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;step_1&#39; src=&#39;/assets/images/2008/5/3/ls_step1.png&#39; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;step_2&#39; src=&#39;/assets/images/2008/5/3/ls_step2.png&#39; /&gt;&lt;/p&gt;

&lt;p&gt;A seguir selecione &amp;#8220;Web Server&amp;#8221; e dê &amp;#8220;Next&amp;#8221;. Agora preencha um nome para esse Web Server &amp;#8212; eu usei apache_local &amp;#8212; e no campo Address preencha o url do seu servidor web: ip_ou_host:porta. Os demais campos são tunning, configure como desejar. Basta salvar.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;step_3&#39; src=&#39;/assets/images/2008/5/3/ls_step3.png&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Agora abra a aba de configuração do seu virtual host (vai depender se você está utilizando templates ou não) e clique na aba &amp;#8220;Context&amp;#8221; e depois em &amp;#8220;Add&amp;#8221;. Selecione &amp;#8220;Proxy&amp;#8221; e dê &amp;#8220;Next&amp;#8221;.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;step_4&#39; src=&#39;/assets/images/2008/5/3/ls_step4.png&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Agora preencha a &amp;#8220;URI&amp;#8221; e selecione o &amp;#8220;Web Server&amp;#8221; já configurado. O campo &amp;#8220;URI&amp;#8221; representa o caminho acessado no seu site e que será direcionado para o &amp;#8220;Web Server&amp;#8221; nesse mesmo &amp;#8220;URI&amp;#8221;. Não pesquisei sobre como direcionar para o &amp;#8220;Web Server&amp;#8221; em um caminho diferente.&lt;/p&gt;

&lt;p&gt;&lt;img alt=&#39;step_5&#39; src=&#39;/assets/images/2008/5/3/ls_step5.png&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Agora é só reiniciar o Litespeed. O svn em &lt;a href=&#39;http://mergulhao.info/svn/&#39;&gt;http://mergulhao.info/svn/&lt;/a&gt; está funcionando dessa maneira.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/4/29/extjs-2-0-2-para-download</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/4/29/extjs-2-0-2-para-download/"/>
    <title>extjs 2.0.2 para download</title>
    <published>2008-04-29T00:00:00-07:00</published>
    <updated>2008-04-29T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Eu consegui no endereço &lt;a href=&#39;http://pypi.python.org/pypi/ore.extjs/2.0.2&#39;&gt;http://pypi.python.org/pypi/ore.extjs/2.0.2&lt;/a&gt; um pacote para Zope que contém a extjs 2.0.2, última lançada como LGPL. O Jack Slocum da &lt;a href=&#39;http://extjs.com/&#39;&gt;Ext&lt;/a&gt; afirma num comentário nesse &lt;a href=&#39;http://www.alittlemadness.com/2008/04/24/ext-discovers-step-2-of-the-slashdot-business-model&#39;&gt;post&lt;/a&gt; e outros lugares pela rede que um fork da versão 2.0.2 é uma violação da licença. Vasculhando o pacote do link acima encontrei o arquivo original da licença que diz o seguinte sobre a &amp;#8220;versão&amp;#8221; open source:&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2 id=&#39;open_source_license&#39;&gt;Open Source License&lt;/h2&gt;

&lt;p&gt;Ext is also licensed under the terms of the Open Source LGPL 3.0 license. You may use our open source license if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Want to use Ext in an open source project that precludes using non-open source software&lt;/li&gt;

&lt;li&gt;Plan to use Ext in a personal, educational or non-profit manner&lt;/li&gt;

&lt;li&gt;Are using Ext in a commercial application that is not a software development library&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;or toolkit, you will meet LGPL requirements and you do not wish to support the project&lt;/p&gt;

&lt;p&gt;http://www.gnu.org/licenses/lgpl.html&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ou seja: ele tenta impor restrições ao uso da licença open source(LGPL), o que de forma alguma é permitido pela LGPL, Stallman que me corrija se eu estiver errado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão:&lt;/strong&gt; até que um advogado me prove o contrário não há nada de errado ou ilegal fazer um fork da versão 2.0.2.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;/assets/images/2008/4/29/ore.extjs-2.0.2-py2.5.egg&#39;&gt;Download também aqui&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/4/27/ressaca-do-fisl</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/4/27/ressaca-do-fisl/"/>
    <title>Ressaca do FISL</title>
    <published>2008-04-27T00:00:00-07:00</published>
    <updated>2008-04-27T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Para quem tinha pedido aqui estão os slides da minha palestra no FISL: &lt;a href=&#39;/assets/images/2008/4/27/rails2_fisl.pdf&#39;&gt;Rails2&lt;/a&gt; e &lt;a href=&#39;/assets/images/2008/4/27/lucidus_fisl.pdf&#39;&gt;Lucidus&lt;/a&gt;. Esse sem dúvida foi o melhor FISL que eu já participei. A minha palestra conjunta com o &lt;a href=&#39;http://www.improveit.com.br/vinicius&#39;&gt;Vinicius&lt;/a&gt; estava lotada (alguém sabe a lotação daquela sala? 200~300 pessoas?), pena que as fotos não ficaram boas. Preciso de uma camera melhor.&lt;/p&gt;

&lt;p&gt;Foi bom conhecer/reencontrar essa galera legal. Um ótimo &lt;strong&gt;networking&lt;/strong&gt;, como diria, o &lt;a href=&#39;http://blog.egenial.com.br/?p=144&#39;&gt;Carlos da e-Genial&lt;/a&gt;, que foi um prazer ter conhecido. E fora isso teve mais uma galera que já &lt;a href=&#39;http://logbr.reflectivesurface.com/2008/04/20/fisl-dia-3/&#39;&gt;postou&lt;/a&gt; &lt;a href=&#39;http://gc.blog.br/2008/04/21/fisl-90-balanco-do-evento/&#39;&gt;sobre&lt;/a&gt; o &lt;a href=&#39;http://www.akitaonrails.com/2008/4/19/di-rio-de-bordo-do-fisl-9&#39;&gt;assunto&lt;/a&gt; também.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/4/23/para-quem-acha-que-desenvolvimento-e-boibeira</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/4/23/para-quem-acha-que-desenvolvimento-e-boibeira/"/>
    <title>Para quem acha que desenvolvimento é bobeira...</title>
    <published>2008-04-23T00:00:00-07:00</published>
    <updated>2008-04-23T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Em breve a &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/04/22/fanfarr%C3%A3o-certification-process&#39;&gt;FanfAlliance&lt;/a&gt;!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/4/12/fisl-chegando-e-algumas-novidades</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/4/12/fisl-chegando-e-algumas-novidades/"/>
    <title>Fisl chegando e algumas novidades</title>
    <published>2008-04-12T00:00:00-07:00</published>
    <updated>2008-04-12T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;h2 id=&#39;primeiro_as_novidades&#39;&gt;Primeiro as novidades&lt;/h2&gt;

&lt;p&gt;Alguns já sabiam, outros, não. Esse blog rodava no &lt;a href=&#39;http://www.dreamhost.com/&#39;&gt;Dreamhost&lt;/a&gt;. Depois de quase um ano brigando com eles para pararem de derrubar as minhas aplicações e sempre reclamando da velocidade, resolvi acabar logo com o problema. Há um mês atrás abri uma conta no &lt;a href=&#39;http://www.silverrack.com/&#39;&gt;Silverrack&lt;/a&gt; e fui migrando aos poucos minhas coisas para o vps e configurando/testando esquemas de firewall, servidores web etc. Ontem foi a vez do &lt;a href=&#39;http://mergulhao.info&#39;&gt;blog&lt;/a&gt;. Se você acha que está mais rápido, agradeça ao &lt;a href=&#39;http://www.silverrack.com/&#39;&gt;Silverrack&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Infelizmente ainda não deu tempo de fazer tudo funcionar. As pendências são: meu svn público e o site demo do &lt;a href=&#39;http://mergulhao.info/2007/10/20/gulashop-um-e-shop-light&#39;&gt;Gulashop&lt;/a&gt;. Preciso decidir se coloco meu repositório público como svn no vps ou se passo a usar algum outro serviço externo como o &lt;a href=&#39;http://github.com/&#39;&gt;github&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#39;agora_o_fisl&#39;&gt;Agora o FISL!&lt;/h2&gt;

&lt;p&gt;Quem também for no &lt;a href=&#39;http://mergulhao.info/2008/3/17/palestra-sobre-rails-2-no-fisl/&#39;&gt;FISL&lt;/a&gt; esse ano, não deixe de aparecer lá na &lt;a href=&#39;http://mergulhao.info/2008/3/17/palestra-sobre-rails-2-no-fisl/&#39;&gt;minha palestra&lt;/a&gt; e na do &lt;a href=&#39;http://www.akitaonrails.com&#39;&gt;Akita&lt;/a&gt; com o Luiz Vitor! Esse ano teremos até um stand do &lt;a href=&#39;http://www.rubyonrails.pro.br/&#39;&gt;Rails Brasil&lt;/a&gt;, com sorte consigo alguma &lt;a href=&#39;http://www.monteiro.eti.br/2008/04/07/camiseta-do-rails-brasil/&#39;&gt;camisa&lt;/a&gt; para sortear no fim da palestra. Devo ficar boa parte do tempo do evento no stand do &lt;a href=&#39;http://www.rubyonrails.pro.br/&#39;&gt;Rails Brasil&lt;/a&gt;, então apareçam por lá para trocarmos umas figurinhas.&lt;/p&gt;

&lt;p&gt;Na minha &lt;a href=&#39;http://mergulhao.info/2008/3/17/palestra-sobre-rails-2-no-fisl/&#39;&gt;palestra&lt;/a&gt; apresentarei o Rails 2 e no final, falarei sobre como foi, no &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt;, a migração do Rails 1.2 para o Rails 2. Para isso, convidei o &lt;a href=&#39;http://www.improveit.com.br/vinicius&#39;&gt;Vinícius&lt;/a&gt; &amp;#8211; espero que o voo dele chegue a tempo. Ninguém melhor do que o &lt;a href=&#39;http://www.improveit.com.br/vinicius&#39;&gt;Vinícius&lt;/a&gt; para falar desse projeto e mostrar porque as coisas funcionam &lt;strong&gt;BEM&lt;/strong&gt; nele.&lt;/p&gt;

&lt;p&gt;Hoje o projeto se encontra com ~18 kloc, sendo algo perto de ~7 kloc em código e o restante em código de teste. Não lembro exatamente qual a quantidade de linhas de código na época. Nossa migração ocorreu na última semana de dezembro. Dada as dimensões do projeto &amp;#8211; não se esqueça que ruby não é java, 18 kloc é muita coisa em ruby &amp;#8211; em quanto tempo vocês chutariam que fizemos essa migração?&lt;/p&gt;

&lt;p&gt;Descubram na palestra ;)&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/3/30/curso-de-ruby-gratuito-no-rubylearning-org</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/3/30/curso-de-ruby-gratuito-no-rubylearning-org/"/>
    <title>Curso de Ruby gratuito no Rubylearning.org</title>
    <published>2008-03-30T00:00:00-07:00</published>
    <updated>2008-03-30T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O site &lt;a href=&#39;http://rubylearning.org/&#39;&gt;rubylearning.org&lt;/a&gt; organizado por &lt;a href=&#39;http://satishtalim.com/&#39;&gt;Satish Talim&lt;/a&gt; está oferecendo a quinta edição do seu curso on-line de Ruby. O curso é gratuito, bastando fazer a &lt;a href=&#39;http://rubylearning.org/class/&#39;&gt;inscrição pelo site&lt;/a&gt;. As aulas começam no dia 3 de maio e são ministradas através da plataforma &lt;a href=&#39;http://moodle.org/&#39;&gt;Moodle&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;English version:&lt;/em&gt;&lt;br /&gt;The &lt;a href=&#39;http://rubylearning.org/&#39;&gt;rubylearning.org&lt;/a&gt; website managed by &lt;a href=&#39;http://satishtalim.com/&#39;&gt;Satish Talim&lt;/a&gt; is offering the 5th batch of his on-line Ruby course. The course is free, just &lt;a href=&#39;http://rubylearning.org/class/&#39;&gt;enroll at his website&lt;/a&gt;. The classes start on 3rd May and the course is designed using &lt;a href=&#39;http://moodle.org/&#39;&gt;Moodle&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/3/26/atrasado-mas-em-tempo-1-ano-de-lucidus</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/3/26/atrasado-mas-em-tempo-1-ano-de-lucidus/"/>
    <title>Atrasado, mas em tempo: 1 ano de Lucidus</title>
    <published>2008-03-26T00:00:00-07:00</published>
    <updated>2008-03-26T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Pela falta de tempo &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/03/15/um-ano-de-lucidus-hora-de-celebrar&#39;&gt;estou um pouco atrasado&lt;/a&gt;, mas ainda em tempo. Desde novembro do ano passsado &amp;#8211; passou muito rápido &amp;#8211; tenho trabalhado fulltime no &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt;. Todos &lt;a href=&#39;http://blog.improveit.com.br/articles/2008/03/15/um-ano-de-lucidus-hora-de-celebrar&#39;&gt;os agradecimentos necessários foram feitos&lt;/a&gt;, então resta ressaltar a importancia deste projeto para mim, como desenvolvedor, profissional, pessoa.&lt;/p&gt;

&lt;p&gt;Este projeto me mostrou como &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/tdd&#39;&gt;tdd&lt;/a&gt; e as boas práticas de programação são essenciais para manutenção da qualidade de um projeto de software, independentemente de qual metodologia de desenvolvimento está sendo utilizada. Antes de participar de um projeto onde essas práticas sejam largamente utilizadas e encorajadas é difícil perceber sua importancia. A partir do momento em que se desenvolve a cultura, ela se torna quase uma obsessão. Hoje o uso de testes e o &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/refatoracao&#39;&gt;refactoring&lt;/a&gt; estão no sangue e só serão substituídos por uma idéia melhor&amp;#8230; quando ela for inventada ;)&lt;/p&gt;

&lt;p&gt;O maior problema de todos nunca é técnico, tem relação com as pessoas e com a &lt;a href=&#39;http://www.improveit.com.br/xp/valores/comunicacao&#39;&gt;comunicação&lt;/a&gt; entre elas. Esse projeto me mostrou como melhorar a relação entre nós desenvolvedores na busca pela solução dos problemas. Confirmou que é possível um cliente presente e ativo no desenvolvimento de um projeto de software. Provou que &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt; não somente funciona, mas como é a melhor forma, a menos burocrática e a mais produtiva de se desenvolver software de qualidade em tempo aceitável.&lt;/p&gt;

&lt;p&gt;Hoje estávamos discutindo sobre o projeto no fim do dia. Um dos questionamentos foi: este projeto estaria dando certo se estivesse na mão de outra equipe qualquer que não esta? A conclusão unânime foi: com uma probabilidade muito pequena este projeto daria certo na mão de outra equipe. Será que estamos sendo &lt;a href=&#39;http://www.akitaonrails.com/2007/4/14/off-topic-seja-arrogante&#39;&gt;arrogantes&lt;/a&gt;? Não acho.&lt;/p&gt;

&lt;p&gt;O fato é que há poucas opções. Esse projeto dificilmente seria pego por uma grande empresa, simplesmente pois uma grande consultoria é caro demais. E qual a situação da maioria das pequenas e médias consultorias de software? Caótica, com desenvolvedores mal qualificados tanto para o desenvolvimento quanto para a comunicação com o cliente. Resultado: softwares lixo! Eu já vivenciei isso!&lt;/p&gt;

&lt;p&gt;Este com certeza é um projeto especial. Parabéns!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/3/17/palestra-sobre-rails-2-no-fisl</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/3/17/palestra-sobre-rails-2-no-fisl/"/>
    <title>Palestra sobre Rails 2 no FISL!</title>
    <published>2008-03-17T00:00:00-07:00</published>
    <updated>2008-03-17T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Pra quem ainda não viu, a página do &lt;a href=&#39;http://fisl.softwarelivre.org/9.0/www/programa&#39;&gt;programa&lt;/a&gt; do &lt;a href=&#39;http://fisl.softwarelivre.org/9.0/www/&#39;&gt;FISL 9&lt;/a&gt; divulgou nos últimos dias a segunda lista de palestras e entre elas a minha foi aprovada.&lt;/p&gt;

&lt;p&gt;O título é: &lt;strong&gt;Rails 2: Arrumando a Casa!&lt;/strong&gt; Baseado nos &lt;a href=&#39;http://peepcode.com/products/rails2-pdf&#39;&gt;slides do Peepcode sobre o Rails 2&lt;/a&gt;, falarei sobre esses assuntos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ActiveRecord&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Novas validações numéricas&lt;/li&gt;

&lt;li&gt;Cache de queries&lt;/li&gt;

&lt;li&gt;Plugin Sexy Migrations incorporado&lt;/li&gt;

&lt;li&gt;Fixtures mais inteligentes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;ActionController e ActionView&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Novas soluções para sites de grande tráfego&lt;/li&gt;

&lt;li&gt;Novo modelo de sessão baseado em cookies&lt;/li&gt;

&lt;li&gt;Simple Http Authentication&lt;/li&gt;

&lt;li&gt;Rotas RESTful&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Outros&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Limpando seu enviroment.rb&lt;/li&gt;

&lt;li&gt;Novas tasks&lt;/li&gt;

&lt;li&gt;Nova opção para debug&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Depreciações/Remoções&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Extinção de variáveis de instância @params, @session, @flash, @request e @env&lt;/li&gt;

&lt;li&gt;Extinção de start_form_tag/end_form_tag&lt;/li&gt;

&lt;li&gt;Plugins acts_as do ActiveRecord&lt;/li&gt;

&lt;li&gt;Plugin de paginação&lt;/li&gt;

&lt;li&gt;Drivers para banco de dados saem do core&lt;/li&gt;

&lt;li&gt;RenamedRoutes&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Uma migração sem traumas * Relato da experiência no projeto &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A palestra não está pronta ainda, sugestões são bem vindas. Apareçam por lá!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/2/24/syntax-highlight-mephisto-plugin</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/2/24/syntax-highlight-mephisto-plugin/"/>
    <title>Syntax Highlight Mephisto plugin</title>
    <published>2008-02-24T00:00:00-08:00</published>
    <updated>2008-02-24T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; Atualizado localização do repositório svn!&lt;/p&gt;

&lt;p&gt;Já havia um tempo que eu queria adicionar syntax highlight nos códigos que escrevo aqui no blog. Resolvi pesquisar se já hávia algum plugin para &lt;a href=&#39;http://mephistoblog.com&#39;&gt;Mephisto&lt;/a&gt;, mas não encontrei nenhum que utilizasse o &lt;a href=&#39;http://code.google.com/p/syntaxhighlighter/&#39;&gt;dp.SyntaxHighlighter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Utilizei como base o &lt;a href=&#39;http://svn.danwebb.net/external/rails/plugins/filtered_column_code_highlighter/trunk/&#39;&gt;plugin&lt;/a&gt; do &lt;a href=&#39;http://www.danwebb.net/&#39;&gt;Dan Webb&lt;/a&gt; e fiz as modificações necessárias para utilizar o &lt;a href=&#39;http://code.google.com/p/syntaxhighlighter/&#39;&gt;dp.SyntaxHighlighter&lt;/a&gt;. Para instalar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install http://mergulhao.info/svn/mephisto_plugins/filtered_column_better_code_highlighter/trunk/&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora é só seguir as instruções do &lt;a href=&#39;http://svn.mergulhao.info/mephisto_plugins/filtered_column_better_code_highlighter/trunk/README&#39;&gt;README&lt;/a&gt; e já poderá fazer isso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CreateContas &amp;lt; ActiveRecord::Migration 
  def self.up 
    create_table :contas do |t| 
      t.string :codigo, :limit =&amp;gt; 8, :null =&amp;gt; false 
      t.integer :parent_id 
      t.integer :lft 
      t.integer :rgt 
      t.timestamps 
    end 
  end 

  def self.down 
    drop_table :contas 
  end 
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A vantagem de utilizar um syntax highlighter client-side como o &lt;a href=&#39;http://code.google.com/p/syntaxhighlighter/&#39;&gt;dp.SyntaxHighlighter&lt;/a&gt; é que o seu código original fica limpo, fácil de editar novamente. Uma possível desvantagem é que pode ficar lento caso tenha muito código para fazer a sintaxe, já que ele usa javascript.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/2/19/git-revert-nao-e-o-mesmo-que-svn-revert</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/2/19/git-revert-nao-e-o-mesmo-que-svn-revert/"/>
    <title>"git revert" não é o mesmo que "svn revert"!</title>
    <published>2008-02-19T00:00:00-08:00</published>
    <updated>2008-02-19T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Acabei de atualizar o blog para a última versão do &lt;a href=&#39;http://www.mephistoblog.com/&#39;&gt;Mephisto&lt;/a&gt;, a 0.8, que foi &lt;a href=&#39;http://blog.caboo.se/articles/2008/2/3/mephisto-0-8&#39;&gt;lançada recentemente&lt;/a&gt;. Não entendi até agora por que a notícia não saiu no site oficial do Mephisto, mas isso é outro problema. Agora o scm do projeto é o &lt;a href=&#39;http://git.or.cz/&#39;&gt;git&lt;/a&gt;, que foi inicialmente desenvolvido pelo &lt;a href=&#39;http://br.youtube.com/watch?v=4XpnKHJAok8&#39;&gt;Linus Torvalds&lt;/a&gt;, o mesmo que criou o kernel do Linux.&lt;/p&gt;

&lt;p&gt;Uma coisa que me chamou atenção foi o fato do &amp;#8216;git revert&amp;#8217; não fazer nada semelhante ao que o &amp;#8216;svn revert&amp;#8217; faz. O comando:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git revert HEAD&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;É um undo do último commit! Para fazer um revert como estamos acostumados no svn, deve-se fazer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git reset --hard HEAD&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Assim será feito revert de todas as modificações depois do último commit. Estranho que não achei a opção para fazer em um arquivo específico, como se faz no svn. Caso utilize:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git reset --hard HEAD nome_do_arquivo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;É retornado:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Cannot do partial --hard reset.&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Pesquisando um pouco descobri uma maneira razoável de realizar o revert svn-like:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git checkout nome_do_arquivo&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;É diferente, mas não é difícil de usar. Por enquanto o git está aprovado.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/2/1/acts_as_nested_set-uma-rvore-turbinada-para-consulta</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/2/1/acts_as_nested_set-uma-rvore-turbinada-para-consulta/"/>
    <title>Acts_as_nested_set, uma árvore turbinada para consulta</title>
    <published>2008-02-01T00:00:00-08:00</published>
    <updated>2008-02-01T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;No projeto &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;Lucidus&lt;/a&gt; ficamos diante de um problema há algumas semanas. Chegamos num ponto do projeto onde muitas coisas haviam sido desenvolvidas em torno de uma &lt;a href=&#39;http://en.wikipedia.org/wiki/Natural_key&#39;&gt;chave natural&lt;/a&gt; que representava uma conta pertencente a uma árvore de contas contábil. A árvore contábil (ou plano de contas) é uma estrutura hierárquica de 5 níveis.&lt;/p&gt;

&lt;p&gt;Uma conta num sistema contábil é um número, que possui uma semantica associada, onde se colocam lançamentos de despesa (gastos com luz, empregados, etc) ou receita (recebimento de aluguél, condomínio, etc).&lt;/p&gt;

&lt;p&gt;Simples exemplo de árvore contábil:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 0 00 00 00 - Primeiro nível&lt;/li&gt;

&lt;li&gt;1 1 00 00 00 - Segundo nível&lt;/li&gt;

&lt;li&gt;1 1 01 00 00 - Terceiro nível&lt;/li&gt;

&lt;li&gt;1 1 01 01 00 - Quarto nível&lt;/li&gt;

&lt;li&gt;1 1 01 01 01 - Quinto nível&lt;/li&gt;

&lt;li&gt;1 1 01 01 02 - Quinto nível&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O problema se desenvolveu pelo fato de estarmos utilizando uma &lt;a href=&#39;http://en.wikipedia.org/wiki/Natural_key&#39;&gt;chave natural&lt;/a&gt; e uma estrutura com simulação de árvore através da &lt;a href=&#39;http://en.wikipedia.org/wiki/Natural_key&#39;&gt;chave natural&lt;/a&gt;. Para encontrarmos o pai ou os filhos de uma conta era necessário realizarmos buscas no banco utilizando coisas como &amp;#8220;like &amp;#8216;1101%&amp;#8217;&amp;#8220;, por exemplo, o que fazia os índices não terem efeito algum. Em algumas situações geramos relatórios consolidados buscando dados dos últimos 12 meses, o que gerava (sem exagero) milhares de queries no banco e cálculos absurdos.&lt;/p&gt;

&lt;p&gt;A coisa começou a ficar inviável por 2 motivos: o desempenho não estava satisfatório e a complexidade do código dos nossos modelos estava ficando grande demais, devido a necessidade de simular o efeito de árvore e outros problemas decorrentes.&lt;/p&gt;

&lt;p&gt;Tínhamos que resolver o problema, mas qualquer solução que se utilizasse de uma simples árvore iria decair em problema semelhante de desempenho, pela quantidade de queries que teriam que ser realizadas para varrer toda a árvore de contas. Resolvemos ver do que se tratava o &lt;a href=&#39;http://api.rubyonrails.org/classes/ActiveRecord/Acts/NestedSet/ClassMethods.html&#39;&gt;acts_as_nested_set&lt;/a&gt; do Rails e ele implementava justamente o que precisávamos: uma árvore de busca implementada para um modelo do ActiveRecord! Para inserção de um nó ela é mais lenta que no &lt;a href=&#39;http://wiki.rubyonrails.org/rails/pages/ActsAsTree&#39;&gt;acts_as_tree&lt;/a&gt;, mas na consulta ela pode buscar todos os filhos(e filhos dos filhos e assim por diante) de um nó com apenas uma query.&lt;/p&gt;

&lt;p&gt;O &lt;a href=&#39;http://api.rubyonrails.org/classes/ActiveRecord/Acts/NestedSet/ClassMethods.html&#39;&gt;acts_as_nested_set&lt;/a&gt; ainda não implementava todos os métodos que necessitávamos, como o método &lt;strong&gt;level&lt;/strong&gt;, que informa a qual nível um nó pertence. Então continuando a busca por uma solução encontramos o plugin &lt;a href=&#39;http://opensource.symetrie.com/trac/better_nested_set/&#39;&gt;better_nested_set&lt;/a&gt; que faz tudo que o original faz, mas implementando diversos outros métodos utilitários.&lt;/p&gt;

&lt;p&gt;Então decidimos resolver o problema de vez e tivemos a &lt;a href=&#39;http://www.improveit.com.br/xp/valores/coragem&#39;&gt;coragem&lt;/a&gt; de refatorar todo o sistema implementando o &lt;a href=&#39;http://opensource.symetrie.com/trac/better_nested_set/&#39;&gt;better_nested_set&lt;/a&gt; na árvore de contas.&lt;/p&gt;

&lt;p&gt;Para a teoria de funcionamento dessa árvore, modo de cálculo dos índices e etc, busque nos links citados que encontrará todas as informações. Farei apenas uma pequena explicação sobre como utilizá-la em seu projeto Rails.&lt;/p&gt;

&lt;p&gt;Primeiro de tudo, instale o plugin no seu projeto:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/plugin install svn://rubyforge.org/var/svn/betternestedset/tags/stable/betternestedset&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Crie um modelo e uma migração. No projeto exemplo criei um modelo &lt;strong&gt;conta&lt;/strong&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;script/generate model conta&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E defini a migração assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class CreateContas &amp;lt; ActiveRecord::Migration 
  def self.up 
    create_table :contas do |t| 
      t.string :codigo, :limit =&amp;gt; 8, :null =&amp;gt; false 
      t.integer :parent_id 
      t.integer :lft 
      t.integer :rgt 
      t.timestamps 
    end 
  end 

  def self.down 
    drop_table :contas 
  end 
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Repare que há um campo &lt;strong&gt;parent_id&lt;/strong&gt; que representará o nó pai e os índices &lt;strong&gt;lft&lt;/strong&gt; e &lt;strong&gt;rgt&lt;/strong&gt; (&lt;strong&gt;não use left e right, pois em geral são palavras reservadas nos banco de dados&lt;/strong&gt;) que são utilizados pela árvore.&lt;/p&gt;

&lt;p&gt;O nosso modelo fica assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Conta &amp;lt; ActiveRecord::Base
  acts_as_nested_set
end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora podemos brincar com nossa árvore! Vamos ao console:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Loading development environment (Rails 2.0.2) 
&amp;gt;&amp;gt; Conta.roots 
=&amp;gt; []&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nosso modelo dizendo que não há nenhum nó raiz. Vamos criar um:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; conta1 = Conta.create(:codigo =&amp;gt; &amp;#39;10000000&amp;#39;) 
=&amp;gt; #&amp;lt;Conta id: 1, codigo: &amp;quot;10000000&amp;quot;, parent_id: nil, lft: 1, rgt: 2, created_at: &amp;quot;2008-02-01 00:28:58&amp;quot;, updated_at: &amp;quot;2008-02-01 00:28:58&amp;quot;&amp;gt; 
&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Conta.roots&lt;/strong&gt; agora retorna nossa recém criada conta:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; Conta.roots 
=&amp;gt; [#&amp;lt;Conta id: 1, codigo: &amp;quot;10000000&amp;quot;, parent_id: nil, lft: 1, rgt: 2, created_at: &amp;quot;2008-02-01 00:30:56&amp;quot;, updated_at: &amp;quot;2008-02-01 00:30:56&amp;quot;&amp;gt;] 
&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Podemos adicionar um filho a ela:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; conta1.add_child(Conta.create(:codigo =&amp;gt; &amp;#39;11000000&amp;#39;))&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E consultar os filhos de conta1:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; conta1.children 
=&amp;gt; [#&amp;lt;Conta id: 2, codigo: &amp;quot;11000000&amp;quot;, parent_id: 1, lft: 2, rgt: 3, created_at: &amp;quot;2008-02-01 00:33:03&amp;quot;, updated_at: &amp;quot;2008-02-01 00:33:03&amp;quot;&amp;gt;] 
&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E adicionar um filho a nossa segunda conta:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; conta2 = Conta.find(2) 
=&amp;gt; #&amp;lt;Conta id: 2, codigo: &amp;quot;11000000&amp;quot;, parent_id: 1, lft: 2, rgt: 3, created_at: &amp;quot;2008-02-01 00:33:03&amp;quot;, updated_at: &amp;quot;2008-02-01 00:33:03&amp;quot;&amp;gt; 
&amp;gt;&amp;gt; conta2.add_child(Conta.create(:codigo =&amp;gt; &amp;#39;11010000&amp;#39;)) 
=&amp;gt; #&amp;lt;Conta id: 2, codigo: &amp;quot;11000000&amp;quot;, parent_id: 1, lft: 2, rgt: 5, created_at: &amp;quot;2008-02-01 00:33:03&amp;quot;, updated_at: &amp;quot;2008-02-01 00:33:03&amp;quot;&amp;gt; 
&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E assim sucessivamente até termos os 5 níveis contábeis(inseri dois nós no último nível, como no exemplo no início do artigo). Após as inserções fazemos uma busca por todos os filhos do nosso nó raiz:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt;&amp;gt; conta1.all_children 
=&amp;gt; [#&amp;lt;Conta id: 2, codigo: &amp;quot;11000000&amp;quot;, parent_id: 1, lft: 2, rgt: 11, created_at: &amp;quot;2008-02-01 00:33:03&amp;quot;, updated_at: &amp;quot;2008-02-01 00:33:03&amp;quot;&amp;gt;, #&amp;lt;Conta id: 3, codigo: &amp;quot;11010000&amp;quot;, parent_id: 2, lft: 3, rgt: 10, created_at: &amp;quot;2008-02-01 00:35:18&amp;quot;, updated_at: &amp;quot;2008-02-01 00:35:18&amp;quot;&amp;gt;, #&amp;lt;Conta id: 4, codigo: &amp;quot;11010100&amp;quot;, parent_id: 3, lft: 4, rgt: 9, created_at: &amp;quot;2008-02-01 00:37:17&amp;quot;, updated_at: &amp;quot;2008-02-01 00:37:17&amp;quot;&amp;gt;, #&amp;lt;Conta id: 5, codigo: &amp;quot;11010101&amp;quot;, parent_id: 4, lft: 5, rgt: 6, created_at: &amp;quot;2008-02-01 00:37:50&amp;quot;, updated_at: &amp;quot;2008-02-01 00:37:50&amp;quot;&amp;gt;, #&amp;lt;Conta id: 6, codigo: &amp;quot;11010102&amp;quot;, parent_id: 4, lft: 7, rgt: 8, created_at: &amp;quot;2008-02-01 00:40:28&amp;quot;, updated_at: &amp;quot;2008-02-01 00:40:28&amp;quot;&amp;gt;] 
&amp;gt;&amp;gt; conta1.all_children.size 
=&amp;gt; 5 
&amp;gt;&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E se verificarmos no log, apenas uma sql foi executada para busca de todos os filhos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Conta Load (0.004532)   SELECT * FROM contas WHERE (1 = 1 AND (lft BETWEEN 1 AND 10)) ORDER BY lft&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Espero que possa ser útil para alguém! Se precisarem de uma estrutura que se pareça com uma árvore e precise ser otimizada para consulta, não deixe de conferir esse plugin.&lt;/p&gt;

&lt;p&gt;Os arquivos desse artigo podem ser baixados aqui:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;/assets/images/2008/8/22/betternestedset.tgz&#39;&gt;/assets/images/2008/8/22/betternestedset.tgz&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/1/13/rails-2-foxy-fixtures-no-tem-suporte-a-id</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/1/13/rails-2-foxy-fixtures-no-tem-suporte-a-id/"/>
    <title>Rails 2: Foxy Fixtures não tem suporte a id!</title>
    <published>2008-01-13T00:00:00-08:00</published>
    <updated>2008-01-13T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Essa semana no &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;projeto Lucidus&lt;/a&gt; passamos por um problema com as foxy fixtures do Rails 2.&lt;/p&gt;

&lt;p&gt;Estávamos utilizando um modelo que possuia um autorelacionamento e outro modelo que se relacionava com o primeiro. Algo equivalente a:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Pessoa &amp;lt; ActiveRecord::Base  
  belongs_to :pai, :class_name =&amp;gt; &amp;#39;Pessoa&amp;#39;, :foreign_key =&amp;gt; &amp;#39;pai_id&amp;#39;  
end  

class Endereco &amp;lt; ActiveRecord::Base  
  belongs_to :pessoa  
end  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E precisávamos criar uma fixture de pessoa que tivesse um relacionamento para outra fixture pessoa, além de uma fixture de endereço que se relacionasse com uma de pessoa. Não sabiamos que as foxy fixtures possuiam suporte a autorelacionamento então primeiro tentamos algo como:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# pessoas.yml
pai_01:
  id: 1
  nome: Nome do Pai

filho_01:
  id: 2
  nome: Nome do Filho
  pai_id: 1

# enderecos.yml
endereco_01:
  pessoa: filho_01
  rua: rua 1
  numero: 25&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Teoricamente, no carregamento das fixtures no banco, deveria fazer o apontamento correto do endereço &lt;strong&gt;endereco_01&lt;/strong&gt; preenchendo o campo &lt;strong&gt;pessoa_id&lt;/strong&gt; do mesmo com o id &lt;strong&gt;2&lt;/strong&gt;, do &lt;strong&gt;filho_01&lt;/strong&gt;. Mas não era isso que acontecia. Era preenchido um id aleatório no campo &lt;strong&gt;pessoa_id&lt;/strong&gt; do &lt;strong&gt;endereco_01&lt;/strong&gt;(se o banco possuisse a constraint de foreign key daria erro no carregamento, claro). Já estávamos achando que era um problema/bug(e é na verdade) das foxy fixtures, mas resolvi pesquisar no &lt;a href=&#39;http://api.rubyonrails.com/files/vendor/rails/activerecord/CHANGELOG.html&#39;&gt;changelog&lt;/a&gt; do activerecord e descobri que não há suporte a ids nas foxy fixtures, tudo deve ser indexado somente pelos nomes e há suporte a autorelacionamento. Corrigindo então fica assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;# pessoas.yml
pai_01:
  nome: Nome do Pai

filho_01:
  nome: Nome do Filho
  pai: pai_01

# enderecos.yml
endereco_01:
  pessoa: filho_01
  rua: rua 1
  numero: 25&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Desse modo todos os ids são criados dinamicamente, e as fixtures se acham na hora do load no banco para a execução dos testes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Obs:&lt;/strong&gt; Eu não testei esse código, escrevi tudo direto no editor, pode ser que exista algum erro de sintaxe ou coisa assim.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2008/1/12/invente-menos-problemas</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2008/1/12/invente-menos-problemas/"/>
    <title>Invente menos problemas!</title>
    <published>2008-01-12T00:00:00-08:00</published>
    <updated>2008-01-12T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O &lt;a href=&#39;http://www.ciauniao.com.br/&#39;&gt;açucar União&lt;/a&gt; está com uma campanha publicitária chamada &lt;strong&gt;Viva Momentos de União&lt;/strong&gt;, que possui mensagens que fazem alusão a situações de prazer e bem-estar, realçando a importancia da qualidade de vida e tudo mais. Não se preocupem, não vou escrever sobre açucar!&lt;/p&gt;

&lt;p&gt;No &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;projeto Lucidus&lt;/a&gt; os nossos sachês de açucar pro café são da &lt;a href=&#39;http://www.ciauniao.com.br/&#39;&gt;União&lt;/a&gt; e cada um vem com uma mensagem, entre elas essa que eu achei brilhante:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invente menos problemas.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E aí isso me remete, como desenvolvedor, ao nosso velho problema de querer sempre complicar as coisas. Há um bom tempo que estudo &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt;, mas foi somente nos últimos meses que tive a oportunidade de ver na prática como a coisa funciona. Desde que entrei para o &lt;a href=&#39;http://www.rioonrails.com.br/speeches/projeto-lucidus&#39;&gt;projeto Lucidus&lt;/a&gt; meus conceitos sobre como desenvolver software mudaram muito, do meu ponto de vista para melhor, claro.&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt; possui como um de seus &lt;a href=&#39;http://www.improveit.com.br/xp/valores&#39;&gt;valores&lt;/a&gt; a &lt;a href=&#39;http://www.improveit.com.br/xp/valores/simplicidade&#39;&gt;simplicidade&lt;/a&gt;. A idéia é implementar as coisas da forma mais simples possível, sem preocupar-se com o amanhã ou com tentar prever quais funcionalidades, métodos ou funções serão necessárias no futuro. É preocupar-se apenas em resolver o problema de agora de forma simples. Isso puxa(ou o inverso) uma das práticas do &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt;, o &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/design_incremental&#39;&gt;design incremental&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Quando estudei &lt;a href=&#39;http://pt.wikipedia.org/wiki/Engenharia_de_software&#39;&gt;engenharia de software tradicional&lt;/a&gt; na &lt;a href=&#39;http://www.uniriotec.br&#39;&gt;universidade&lt;/a&gt; &amp;#8220;aprendi&amp;#8221; que o design deveria ser sempre feito antes da implementação. Então deveria-se planejar(o sistema, as classes, os patterns, a base de dados, os relacionamentos, etc) numa tentativa de prever o rumo que o projeto iria levar. Felizmente aprendi cedo de que isso na teoria é muito bonito, mas na prática não funciona. Quer queiram ou não, os projetos de software sempre sofrem mudanças na hora da implementação. Mudanças essas que podem ser drásticas a ponto de toda documentação/projeto que foi escrito não servir mais para nada, por não refletir a realidade do projeto.&lt;/p&gt;

&lt;p&gt;Quando em &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt; dizemos que trabalhamos com &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/design_incremental&#39;&gt;design incremental&lt;/a&gt; do software, não estamos dizendo que não usamos patterns&amp;#8230; Isso apenas quer dizer que decidimos que patterns utilizar na hora em que de fato precisarmos dele. O uso contínuo da &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/refatoracao&#39;&gt;refatoração&lt;/a&gt; nos leva aos patterns.&lt;/p&gt;

&lt;p&gt;Há alguns anos atrás eu trabalhava(leia-se ganhava dinheiro) apenas com Java e, por coincidência ou não, muitas das pessoas com que trabalhei e empresas por onde passei possuiam essa mesma cabeça da &lt;a href=&#39;http://pt.wikipedia.org/wiki/Engenharia_de_software&#39;&gt;engenharia de software tradicional&lt;/a&gt; e passavam meses &lt;strong&gt;projetando&lt;/strong&gt; e montando o ambiente de trabalho antes de que qualquer linha de código útil fosse escrita.&lt;/p&gt;

&lt;p&gt;Felizmente, mais uma vez, há 2 anos eu descobri o &lt;a href=&#39;http://www.ruby-lang.org/&#39;&gt;Ruby&lt;/a&gt; e o &lt;a href=&#39;htt://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt;. Descobri que as pessoas que trabalham com &lt;a href=&#39;http://www.ruby-lang.org/&#39;&gt;Ruby&lt;/a&gt; e &lt;a href=&#39;htt://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt; seguem fielmente a linha da &lt;a href=&#39;http://www.improveit.com.br/xp/valores/simplicidade&#39;&gt;simplicidade&lt;/a&gt;, dos princípios &lt;a href=&#39;http://en.wikipedia.org/wiki/Don&amp;apos;t_repeat_yourself&#39;&gt;DRY&lt;/a&gt; e &lt;a href=&#39;http://en.wikipedia.org/wiki/Keep_it_Simple_Stupid&#39;&gt;KISS&lt;/a&gt;. Descobri que &lt;a href=&#39;htt://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt; se encaixa como uma luva no &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt;. Então a frase do dia é:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Invente menos problemas. Use Rails!&lt;/p&gt;
&lt;/blockquote&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/12/23/inverse-captcha-aprovado</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/12/23/inverse-captcha-aprovado/"/>
    <title>Inverse Captcha: Aprovado!</title>
    <published>2007-12-23T00:00:00-08:00</published>
    <updated>2007-12-23T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Mais de um mês e meio depois de instalar o &lt;a href=&#39;http://mergulhao.info/2007/11/6/inverse-captcha-como-nao-amolar-seus-visitantes&#39;&gt;Inverse Captcha&lt;/a&gt; não há o que discutir: nenhum spam durante todo esse período! Mais uma vez o conceito de fazer &lt;a href=&#39;http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html&#39;&gt;a coisa mais simples com chances de funcionar&lt;/a&gt; se mostrou eficaz e resolveu o problema de spam do blog.&lt;/p&gt;

&lt;p&gt;Para saber mais sobre o &lt;a href=&#39;http://mergulhao.info/2007/11/6/inverse-captcha-como-nao-amolar-seus-visitantes&#39;&gt;Inverse Captcha&lt;/a&gt;, visite &lt;a href=&#39;http://mergulhao.info/2007/11/6/inverse-captcha-como-nao-amolar-seus-visitantes&#39;&gt;o post&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/11/25/falta-tempo-eventos-eventos-eventos</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/11/25/falta-tempo-eventos-eventos-eventos/"/>
    <title>Falta tempo! Eventos, eventos, eventos!</title>
    <published>2007-11-25T00:00:00-08:00</published>
    <updated>2007-11-25T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;O mês de novembro foi bem conturbado, gostaria de ter mais tempo para postar aqui, mas está bem difícil. Gosto de escrever com calma, revisar bem, então sempre demoro para escrever posts técnicos, por exemplo. E nesse mês definitivamente tempo foi escasso. Assim que possível vou escrever sobre como foi migrar o blog para o &lt;a href=&#39;http://mephistoblog.com/&#39;&gt;Mephisto&lt;/a&gt; e para o &lt;a href=&#39;http://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt; edge. Posso adiantar que foi divertido e com emoção.&lt;/p&gt;

&lt;p&gt;Participei de dois eventos em sequência. Primeiro &lt;a href=&#39;http://www.conisli.org&#39;&gt;Conisli&lt;/a&gt;, São Paulo, onde apresentei uma versão nova da palestra Nos Trilhos Com Rails, que já está disponível para &lt;a href=&#39;/artigos&#39;&gt;download&lt;/a&gt;, e também a palestra sobre o &lt;a href=&#39;http://www.bluezone.com.br&#39;&gt;BlueZone&lt;/a&gt;. Depois direto de São Paulo para Foz do Iguaçu: &lt;a href=&#39;http://www.latinoware.org/&#39;&gt;Latinoware&lt;/a&gt;. Sem dúvida um dos melhores eventos de Software Livre que já participei, com uma estrutura fenomenal dentro do &lt;a href=&#39;http://www.pti.org.br&#39;&gt;Parque Tecnológico de Itaipu&lt;/a&gt;. No &lt;a href=&#39;http://www.latinoware.org/&#39;&gt;Latinoware&lt;/a&gt; ministrei um workshop de &lt;a href=&#39;http://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt; e também a mesma palestra sobre o &lt;a href=&#39;http://www.bluezone.com.br&#39;&gt;BlueZone&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ao chegar de volta ao Rio, uma semana depois de sair, infelizmente não tive disposição para voltar a São Paulo para o &lt;a href=&#39;http://www.akitaonrails.com/rejectconf&#39;&gt;RejectConf&lt;/a&gt;, mas sem dúvida estarei presente no &lt;a href=&#39;http://www.rioonrails.com.br/&#39;&gt;RioOnRails&lt;/a&gt;. Novidades a caminho, quem quiser conversar, apareça!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/11/6/inverse-captcha-como-nao-amolar-seus-visitantes</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/11/6/inverse-captcha-como-nao-amolar-seus-visitantes/"/>
    <title>Inverse Captcha: como não amolar seus visitantes</title>
    <published>2007-11-06T00:00:00-08:00</published>
    <updated>2007-11-06T00:00:00-08:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Quem tentou acessar meu site em alguns momentos no dia de ontem e hoje há alguns minutos se deparou com alguns &lt;a href=&#39;http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#4xx_Client_Error&#39;&gt;404&lt;/a&gt; ou &lt;a href=&#39;http://en.wikipedia.org/wiki/List_of_HTTP_status_codes#5xx_Server_Error&#39;&gt;500&lt;/a&gt;. Foi só uma pequena briga entre eu e o &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt; para atualização do Mephisto, isso vai ficar para o próximo post.&lt;/p&gt;

&lt;p&gt;Como muitos de vocês, eu também acho o &lt;a href=&#39;http://en.wikipedia.org/wiki/Captcha&#39;&gt;Captcha&lt;/a&gt; uma bosta de uma invenção. Infelizmente os &lt;a href=&#39;http://pt.wikipedia.org/wiki/Bot&#39;&gt;&amp;#8220;bots postadores de formulários alheios&amp;#8221;&lt;/a&gt; estão importunando cada vez mais e estava precisando de algo que resolvesse esse problema nos comentários do blog.&lt;/p&gt;

&lt;p&gt;A questão é: como minimamente garantir que há um humano postando o formulário e não um &lt;a href=&#39;http://pt.wikipedia.org/wiki/Bot&#39;&gt;bot&lt;/a&gt;? Resolvi pesquisar por algo sobre o assunto e encontrei &lt;a href=&#39;http://damienkatz.net/2007/01/negative_captch.html&#39;&gt;coisas&lt;/a&gt; &lt;a href=&#39;http://nedbatchelder.com/text/stopbots.html&#39;&gt;interessantes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Fazendo o oposto do &lt;a href=&#39;http://en.wikipedia.org/wiki/Captcha&#39;&gt;Captcha&lt;/a&gt;, o conceito do Inverse(ou Negative) Captcha não é fazer o nosso visitante se identificar como humano, mas fazer o &lt;a href=&#39;http://pt.wikipedia.org/wiki/Bot&#39;&gt;bot&lt;/a&gt; se entregar. Como? Fazendo &lt;a href=&#39;http://c2.com/xp/DoTheSimplestThingThatCouldPossiblyWork.html&#39;&gt;a coisa mais simples com chances de funcionar&lt;/a&gt;. Dentro do formulário há um campo &lt;em&gt;hidden&lt;/em&gt; via css. Os &lt;a href=&#39;http://pt.wikipedia.org/wiki/Bot&#39;&gt;bots&lt;/a&gt; vêem esses campos como &lt;em&gt;inputs&lt;/em&gt; comuns, pois eles não interpretam o css. O humano(ou os leitores de tela) ignoram esse campo, pois ele não aparece na tela. Logo, basta ignorar qualquer submissão que vier com o campo &lt;em&gt;hidden&lt;/em&gt; preenchido.&lt;/p&gt;
&lt;div class=&#39;center&#39;&gt;&lt;img alt=&#39;Invese Captcha&#39; src=&#39;/assets/images/2007/11/6/inverse_captcha.png&#39; /&gt;&lt;/div&gt;
&lt;p&gt;Utilizei o &lt;a href=&#39;http://www.artweb-design.de/2007/9/25/inverse-captcha-anti-comment-spam-technique-now-a-regular-mephisto-plugin&#39;&gt;plug-in para Mephisto&lt;/a&gt; desenvolvido pelo &lt;a href=&#39;http://www.artweb-design.de/svenfuchs&#39;&gt;Sven Fuchs&lt;/a&gt; que implementa essa solução. Simples, não? Vamos ver se funciona.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ATUALIZAÇÃO:&lt;/strong&gt; Ainda não descobri por que, mas parece que o plug-in está apresentando problemas e não está salvando nem os comentários &amp;#8220;humanos&amp;#8221;. Em meu ambiente de teste está funcionando normalmente, estou desconfiado mais uma vez das loucuras do Dreamhost. Qualquer dúvida ou sugestão me enviem um e-mail. Um abraço.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ATUALIZAÇÃO2:&lt;/strong&gt; Problema resolvido, agora está tudo ok. Qualquer problema nos comentários me comuniquem.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/10/11/deploy-com-capistrano-atualizado</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/10/11/deploy-com-capistrano-atualizado/"/>
    <title>Deploy com Capistrano atualizado</title>
    <published>2007-10-11T00:00:00-07:00</published>
    <updated>2007-10-11T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Seguindo o feedback do &lt;a href=&#39;http://www.passos.eti.br/&#39;&gt;Daniel Passos&lt;/a&gt; eu fiz pequenas atualizações no &lt;a href=&#39;/2007/9/3/dreamhost-deploy-com-capistrano&#39;&gt;artigo sobre deploy com Capistrano&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Daniel, muito obrigado pelo seu feedback!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/9/26/conservadorismo-tecnologico-ate-que-ponto</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/9/26/conservadorismo-tecnologico-ate-que-ponto/"/>
    <title>Conservadorismo tecnológico, até que ponto?</title>
    <published>2007-09-26T00:00:00-07:00</published>
    <updated>2007-09-26T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Ultimamente tenho me deparado com algumas questões relativas à adoção de novas tecnologias. No momento não estou falando especificamente de uma tecnologia, mas sim no geral.&lt;/p&gt;

&lt;p&gt;Qual aplicação realmente precisa de um uptime de 99,99999999&amp;#8230;99999%? Poucas? Muitas? Eu diria que quase nenhuma! Por exemplo esse blog, ou outros blogs. Que diferença faz se o &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt; cai (pelo menos) uma vez por mês (seria por semana?), deixando meu site fora do ar por algumas horas? Nesse caso pra mim nenhuma, ninguém morreu por isso. Pelo menos não que eu saiba. Se você conheceu alguém que morreu porque não conseguiu acessar meu blog, me informe urgentemente para eu trocar logo de host, ou muitas outras poderão morrer também! :)&lt;/p&gt;

&lt;p&gt;É claro que sempre achamos muito ruim quando necessitamos utilizar &lt;strong&gt;aquele&lt;/strong&gt; serviço e, na hora h, está fora do ar&amp;#8230; Se por isso você perdeu dinheiro, então está na hora de buscar outro compatível que dê a você o uptime de que necessita ou poderá perder mais ainda, certo?&lt;/p&gt;

&lt;p&gt;O grande ponto que gostaria de alcançar é: até que ponto vale a pena a adoção de uma tecnologia mais antiga visando a imaginária segurança da robustez em detrimento de uma mais moderna que traga vantagens de produtividade e recursos? Claro, ninguém possui a resposta para todos os casos, cada um deve ser analisado à parte, levando em consideração todos os fatores envolvidos.&lt;/p&gt;

&lt;p&gt;O fato é que em nossas vidas utilizamos software beta o tempo todo! Será que algum dia existirá um software verdadeiramente estável?&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/9/25/sistema-de-inscricoes-e-eu</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/9/25/sistema-de-inscricoes-e-eu/"/>
    <title>Sistema de inscrições e eu</title>
    <published>2007-09-25T00:00:00-07:00</published>
    <updated>2007-09-25T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Durante todos os outros anos do &lt;a href=&#39;http://www.forumsoftwarelivre.org.br&#39;&gt;Fórum do Software Livre do Rio de Janeiro&lt;/a&gt; utilizávamos um sistema de inscrições que era feito em PHP. Esse sistema já havia sido adaptado ao nosso evento, resgatado de um outro evento de estudantes de computação. Todo ano novas modificações para ele se adaptar às novas necessidades. Esse ano decidi escrever mesmo uma outra aplicação e não poderia ser diferente, escolhi &lt;a href=&#39;http://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt; como framework base.&lt;/p&gt;

&lt;p&gt;O grande problema que criei por essa minha decisão foi: onde hospedar? A nossa parceira &lt;a href=&#39;http://www.hostnet.com.br&#39;&gt;Hostnet&lt;/a&gt; ainda não fornece serviço de hospedagem para &lt;a href=&#39;http://www.rubyonrails.org&#39;&gt;Rails&lt;/a&gt; e na &lt;a href=&#39;http://www.uniriotec.br&#39;&gt;Unirio&lt;/a&gt; não tínhamos nenhum servidor preparado para isso. Sobrou hospedar juntamente com meu site, no &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt;. Após 3 ou 4 dias com o sistema no ar estávamos tendo muitas reclamações referentes ao desempenho. Lento, &lt;strong&gt;muito&lt;/strong&gt; lento (coisa que não acontece com o site principal não sei o motivo). E claro, com alguns momentos down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução 1&lt;/strong&gt;: preparar um servidor na &lt;a href=&#39;http://www.uniriotec.br&#39;&gt;Unirio&lt;/a&gt;. Sistema que estava instalado no servidor disponível: Fedora Core 4. Se alguém conhece Fedora sabe que isso está &lt;strong&gt;muito&lt;/strong&gt; desatualizado. Ou seja, um monte de pacotes antigos, apache antigo, ruby antigo, sem adaptador mysql para ruby etc. &lt;span class=&#39;red&#39;&gt;&lt;strong&gt;DESCARTADO!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solução 2&lt;/strong&gt;: propus levantar um servidor virtual com &lt;a href=&#39;http://www.ubuntulinux.org&#39;&gt;Ubuntu&lt;/a&gt; server e recursos modestos que eu me encarregaria de configurar tudo. Duas horas depois de receber o acesso ssh para configurar o servidor (e já 3h da manhã de algum dia da semana passada) estava tudo no ar, com apache rodando Rails utilizando fastcgi. Não me atrevi a colocar em mongrel, pois não li nenhuma documentação sobre ele ainda. &lt;span class=&#39;green&#39;&gt;&lt;strong&gt;IMPLANTADO!&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;Ok, até então se saindo muito bem. Até que no último domingo, dia 23, faltou luz na &lt;a href=&#39;http://www.uniriotec.br&#39;&gt;Unirio&lt;/a&gt; por 4 horas. O no-break, claro, não segurou, sem gerador&amp;#8230; foi tudo por água abaixo. Quase metade do dia com o serviço fora do ar, pois os servidores precisavam ser religados e entrar domingo numa Universidade pública não é algo trivial, muito jogo de cintura com os seguranças e ligações telefônicas até conseguir liberação para fazer coisa que dura 5 minutos.&lt;/p&gt;

&lt;p&gt;Enfim&amp;#8230; voltou ao ar no fim da noite&amp;#8230; Valeu Max!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/9/24/icard-mobile-chamada-para-testadores</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/9/24/icard-mobile-chamada-para-testadores/"/>
    <title>icard mobile, chamada para testadores</title>
    <published>2007-09-24T00:00:00-07:00</published>
    <updated>2007-09-24T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Durante o ano passado tive o prazer de trabalhar numa startup focada em mobile, com pessoas muito legais e fazendo softwares j2me de primeira linha. Infelizmente a startup não deu certo, mas as coisas legais não acabaram. O primeiro desenvolvimento em j2me foi o icard mobile. Trata-se de um pequeno aplicativo j2me que envia cartões de visita virtuais via e-mail. Ele fez um sucesso razoável no exterior, principalmente sudeste asiático, chegando a enviar alguns milhares de cartões por dia.&lt;/p&gt;

&lt;p&gt;Através do site, mediante informação do código de registro que se recebe ao efetuar o cadastramento pelo aplicativo, é possível fazer upload de uma imagem que ficará no canto à direita do cartão e também escolher entre 6 cores diferentes de fundo para o seu cartão. É um serviço gratuito e que pode ajudar nas horas em que seu cartão de visita acabou, normalmente nos piores momentos ;).&lt;/p&gt;
&lt;div style=&#39;text-align: center&#39;&gt;
&lt;img alt=&#39;icard example&#39; src=&#39;/assets/images/2007/9/24/icard_example.png&#39; style=&#39;border: 0px;&#39; /&gt;
&lt;/div&gt;
&lt;p&gt;Originalmente todo o backend do sistema estava desenvolvido em lua. Durante essa semana, efetuei a migração para Rails e fiz pequenos ajustes necessários na aplicação j2me.&lt;/p&gt;

&lt;p&gt;O domínio original do serviço era &lt;strong&gt;www.icardmobile.com&lt;/strong&gt;, mas ele foi perdido. Ainda não sei o que farei em relação a isso. Por hora, quem tiver interesse acesse &lt;a href=&#39;http://icard.mergulhao.info&#39;&gt;http://icard.mergulhao.info&lt;/a&gt; e veja os detalhes.&lt;/p&gt;

&lt;p&gt;Espero em breve fazer a internacionalização do site e do aplicativo que no momento estão disponíveis apenas em inglês.&lt;/p&gt;

&lt;p&gt;Por favor reportem situações de funcionamento e não funcionamento, enviando para mim a marca, o modelo dos aparelhos testados e os problemas encontrados. Sugestões de novas funcionalidades são bem-vindas. Aguardo o feedback!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/9/21/inscricoes-abertas-para-o-v-forum-de-software-livre</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/9/21/inscricoes-abertas-para-o-v-forum-de-software-livre/"/>
    <title>Inscrições abertas para o V Fórum de Software Livre</title>
    <published>2007-09-21T00:00:00-07:00</published>
    <updated>2007-09-21T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Atenção pessoal! Estão abertas as inscrições para o V Fórum de Software Livre do Rio de Janeiro. Para se inscrever visite o &lt;a href=&#39;http://www.forumsoftwarelivre.org.br/&#39;&gt;site&lt;/a&gt; e abra o menu correspondente. A inscrição para participação nas palestras e circulação na área do evento é &lt;strong&gt;GRATUITA&lt;/strong&gt;. Os minicursos são cobrados com desconto para estudantes e servidores públicos.&lt;/p&gt;

&lt;p&gt;Esse ano mais uma vez contamos com quatro dias de fórum: dois no Clube de Engenharia e mais dois, na Unirio, com foco no público técnico. Na Unirio, além das palestras também teremos minicursos diversos visando introdução ou aprofundamento de assuntos técnicos pertinentes ao mundo do Software Livre.&lt;/p&gt;

&lt;p&gt;Avançando um passo de cada vez, esse ano temos a confirmação do nosso primeiro palestrante internacional: &lt;a href=&#39;http://pt.wikipedia.org/wiki/Jon_Hall&#39;&gt;Maddog Hall&lt;/a&gt;! Foi uma grande conquista para o nosso evento. Esperamos com isso conseguir um pouco mais de visibilidade da comunidade de Software Livre do Rio de Janeiro, que sabemos ser grande, mas infelizmente muito dispersa.&lt;/p&gt;

&lt;p&gt;Até lá!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/9/7/bluezone-em-itajuba</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/9/7/bluezone-em-itajuba/"/>
    <title>Bluezone em Itajubá</title>
    <published>2007-09-07T00:00:00-07:00</published>
    <updated>2007-09-07T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Semana passada tive o prazer de apresentar o &lt;a href=&#39;http://www.bluezone.com.br&#39;&gt;BlueZone&lt;/a&gt; para o pessoal de Itajubá. Na seção de &lt;a href=&#39;/artigos&#39;&gt;artigos&lt;/a&gt; já está disponível para download os slides da apresentação.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/9/3/dreamhost-deploy-com-capistrano</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/9/3/dreamhost-deploy-com-capistrano/"/>
    <title>Dreamhost deploy com capistrano</title>
    <published>2007-09-03T00:00:00-07:00</published>
    <updated>2007-09-03T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Realmente o capistrano me surpreendeu bastante pela utilidade e facilidade de uso. Assim que possível vou passar a realizar deploy de todos os meus sistemas/sites/etc que estão rodando na web utilizando ele &amp;#8212; inclusive os que não rodam em Rails! O teste dessa vez foi no &lt;a href=&#39;/projetos&#39;&gt;sistema de inscrições do Fórum de Software Livre&lt;/a&gt; desse ano. Quem quiser testar para ver como está ficando e sugerir mudanças acessar: &lt;a href=&#39;http://inscricao.mergulhao.info&#39;&gt;http://inscricao.mergulhao.info&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Deixo aqui um passo a passo para quem quer fazer deploy de uma aplicação utilizando &lt;a href=&#39;http://www.capify.org&#39;&gt;Capistrano&lt;/a&gt; e o &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt; (pode facilmente ser adaptado para outros hosts). Antes de tudo, &lt;a href=&#39;http://www.capify.org/install&#39;&gt;instale o capistrano&lt;/a&gt;. Caso não esteja utilizando o &lt;a href=&#39;http://www.dreamhost.com&#39;&gt;Dreamhost&lt;/a&gt;, certifique-se que o seu servidor possui o &lt;a href=&#39;http://subversion.tigris.org/&#39;&gt;svn&lt;/a&gt; cliente de linha de comando instalado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ATENÇÃO: Todos os comandos aqui listados são executados em seu ambiente local de desenvolvimento.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Crie um subdomínio/domínio no painel de controle do Dreamhost, habilite o fastcgi e aponte o diretório web para algo semelhante:&lt;/p&gt;

&lt;p&gt;/home/USUARIO/sistema.dominio.com/current/public&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Acesse a sua conta via ssh e apague o diretório &lt;em&gt;current&lt;/em&gt; que foi criado pelo Dreamhost em &lt;em&gt;/home/USUARIO/sistema.dominio.com/&lt;/em&gt;&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Siga &lt;a href=&#39;http://wiki.dreamhost.com/SSH#Passwordless_Login&#39;&gt;esses passos&lt;/a&gt; se desejar efetuar o deploy sem a necessidade de digitar a senha do ssh a todo momento.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Configure seu &lt;em&gt;config/enviroment.rb&lt;/em&gt; para modo produção e o &lt;em&gt;config/database.yml&lt;/em&gt; com a base de produção.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Substitua seu &lt;em&gt;public/dispatch.fgci&lt;/em&gt; por esse(dica pega do &lt;a href=&#39;http://blog.klaus.pro.br/ler/ruby-on-rails/2007/ruby-on-rails-na-dreamhost/7/index.html&#39;&gt;Klaus&lt;/a&gt;):&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;
#!/usr/bin/ruby1.8
require File.dirname(__FILE__) + &quot;/../config/environment&quot;
require &#39;fcgi_handler&#39;

class RailsFCGIHandler
  private
    def frao_handler(signal)
      dispatcher_log :info, &quot;asked to terminate immediately&quot;
      dispatcher_log :info, &quot;frao handler working its magic!&quot;
      restart_handler(signal)
    end
  alias_method :exit_now_handler, :frao_handler
end

RailsFCGIHandler.process! nil, 6
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Configure seu &lt;em&gt;public/.htaccess&lt;/em&gt; de acordo, substituindo a linha:&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;
RewriteRule ^(.*)$ dispatch.cgi [QSA,L]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Por:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
RewriteRule ^(.*)$ dispatch.fcgi [QSA,L]
&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Rode o capify no diretório de desenvolvimento da sua aplicação:&lt;/p&gt;

&lt;p&gt;capify .&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Utilize a receita abaixo(_config/deploy.rb_) configurando-a de acordo:&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;
# Receita de deploy de apps Rails para o Dreamhost. Capistrano V2.
# Pode ser facilmente adaptada para outros hosts compartilhados.
# Por Sylvestre Mergulhao em 20/08/2007
# Email: contato (at) mergulhao.info
# Site: http://mergulhao.info

# Define o nome da aplicacao e o dominio a qual estara linkada no dreamhost
set :application, &quot;inscricao.mergulhao.info&quot;

# Define seu usuario no dreamhost
set :user, &quot;mergulhao&quot;

# Define o local do seu repositorio svn
set :repository,  &quot;http://mergulhao.info/inscricao/trunk&quot;

# Nao precisa ser  alterado daqui pra baixo!

set :use_sudo, false
set :deploy_to, &quot;/home/#{user}/#{application}&quot;
set :domain, &quot;#{user}@#{application}&quot;

role :app, domain
role :web, domain
role :db,  domain, :primary =&gt; true

namespace :deploy do
  desc &quot;Restarts all FCGI processes.&quot;
  task :restart, :roles =&gt; :app do
    # NOTA: Segundo o reaper a opcao --dispatcher esta depreciada, verificar
    # outra solucao.
    run &quot;#{current_path}/script/process/reaper --dispatcher=dispatch.fcgi&quot;
  end
end
&lt;/code&gt;
&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Faça commit de tudo pro svn.&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Rode o setup e verifique se não ocorre nenhum erro. Esse comando somente precisa ser executado no primeiro deploy. Ele é responsável por criar a estrutura de diretórios necessária no servidor.&lt;/p&gt;

&lt;p&gt;cap deploy:setup&lt;/p&gt;
&lt;/li&gt;

&lt;li&gt;
&lt;p&gt;Rode o deploy com as migrações:&lt;/p&gt;

&lt;p&gt;cap deploy:migrations&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Para executar os próximos deploys basta executar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cap deploy&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se existirem migrações para realizar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;cap deploy:migrations&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Se eu não esqueci de colocar nenhum passo e deu tudo certo, sua aplicação estará no ar. É claro que estamos seguindo aqui algumas convenções, como estar utilizando svn para controle de versões. Espero que seja útil, estou aberto a receber o feedback sobre isso, deixe-me saber se você utilizou essa receita com sucesso(e com fracasso também!).&lt;/p&gt;

&lt;p&gt;É isso!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/8/29/uma-rapidinha-mkmf-loaderror</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/8/29/uma-rapidinha-mkmf-loaderror/"/>
    <title>Uma rapidinha: mkmf (LoadError)</title>
    <published>2007-08-29T00:00:00-07:00</published>
    <updated>2007-08-29T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Se você está tendo um problema como esse ao tentar instalar um gem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Building native extensions.  This could take a while...
ERROR:  While executing gem ... (Gem::Installer::ExtensionBuildError)
    ERROR: Failed to build gem native extension.

ruby extconf.rb install mechanize
extconf.rb:1:in `require&amp;#39;: no such file to load -- mkmf (LoadError)
        from extconf.rb:1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Basta instalar o pacote de desenvolvimento do Ruby:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install ruby1.8-dev&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/8/16/algumas-novidades</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/8/16/algumas-novidades/"/>
    <title>Algumas novidades</title>
    <published>2007-08-16T00:00:00-07:00</published>
    <updated>2007-08-16T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;h2 id=&#39;parte_1&#39;&gt;Parte 1&lt;/h2&gt;

&lt;p&gt;Hoje visitei o projeto &lt;a href=&#39;http://blog.improveit.com.br/articles/2007/05/15/xp-rio-conheca-o-projeto-xp-do-grupo-santa-isabel&#39;&gt;Lucidus&lt;/a&gt; que está sendo tocado utilizando &lt;a href=&#39;http://www.improveit.com.br/xp&#39;&gt;XP&lt;/a&gt;(Extreme Programming) pelo pessoal da &lt;a href=&#39;http://www.improveit.com.br&#39;&gt;Improve It&lt;/a&gt;. Pude ver de perto pela primeira vez um pouco de como é o dia-a-dia do projeto. Pena que não foi na segunda-feira para eu ver a reunião de planejamento semanal, mas não perdi a &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/reuniao_pe&#39;&gt;stand up meeting&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Nas paredes dois quadros brancos grandes e muitos (__muitos!__ mesmo) post its coloridos colados por todos os lados, mas não de forma desorganizada. Realmente aplicar um projeto XP exige muita disciplina dos desenvolvedores e grande habilidade do coach para tratar dos impasses.&lt;/p&gt;

&lt;p&gt;Tive oportunidade de participar de uma pequena rodada de pair programming, que se mostrou bem proveitosa, como eu mesmo já havia presenciado em outros momentos e era esperado.&lt;/p&gt;

&lt;p&gt;Gostaria de postar aqui uma foto, mas infelizmente não levei a câmera, então essa eu fico devendo. Muito obrigado ao Vinícius e ao Novello pela oportunidade.&lt;/p&gt;

&lt;h2 id=&#39;parte_2&#39;&gt;Parte 2&lt;/h2&gt;

&lt;p&gt;Liberei na área de &lt;a href=&#39;/projetos&#39;&gt;Projetos&lt;/a&gt; o sistema de inscrição do Fórum de Software Livre do Rio de Janeiro. É o sistema que será utilizado a partir desse ano e está sendo desenvolvido utilizando Ruby on Rails. Quem quiser contribuir, basta entrar em &lt;a href=&#39;/contato&#39;&gt;contato&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Mais novidades para área de projetos em breve!&lt;/p&gt;

&lt;h2 id=&#39;parte_3&#39;&gt;Parte 3&lt;/h2&gt;

&lt;p&gt;Todo list para até o fim da semana inclui:&lt;/p&gt;

&lt;p&gt;* Deploy com &lt;a href=&#39;http://www.capify.org/&#39;&gt;Capistrano&lt;/a&gt; * Desenvolvimento de interfaces administrativas com &lt;a href=&#39;http://activescaffold.com/&#39;&gt;ActiveScaffold&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Postarei sobre esses assuntos em breve!&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/8/12/enecomp-2007-cuiaba</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/8/12/enecomp-2007-cuiaba/"/>
    <title>Enecomp 2007 - Cuiabá</title>
    <published>2007-08-12T00:00:00-07:00</published>
    <updated>2007-08-12T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Durante a semana que passou estive em Cuiabá para o &lt;a href=&#39;http://www.enec.org.br/enecomp2007&#39;&gt;Enecomp&lt;/a&gt;. Lá ministrei um curso de Ajax com Prototype e uma palestra sobre o &lt;a href=&#39;http://www.bluezone.com.br&#39;&gt;BlueZone&lt;/a&gt;. Os slides estão disponíveis na seção de &lt;a href=&#39;/artigos&#39;&gt;artigos&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/8/6/3-anos-de-ruby-on-rails</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/8/6/3-anos-de-ruby-on-rails/"/>
    <title>3 anos de Ruby on Rails</title>
    <published>2007-08-06T00:00:00-07:00</published>
    <updated>2007-08-06T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;&lt;a href=&#39;http://www.loudthinking.com/posts/10-three-years-with-ruby-on-rails&#39;&gt;DHH&lt;/a&gt; nos lembra: 3 anos de Ruby on Rails! E já faz um ano e meio aproximadamente da primeira vez que tive contato com Rails e com Ruby.&lt;/p&gt;

&lt;p&gt;Mais do que apenas uma revolução técnica, o Ruby e o Rails conseguem aquilo que o &amp;#8220;mundo java&amp;#8221; nos tirou. Ruby e Rails trazem a diversão de volta à programação! Porque a programação não precisa e não deve ser entediante. Produzir se divertindo é a melhor forma de soltar a criatividade e produzir melhor!&lt;/p&gt;

&lt;p&gt;Já no campo técnico, acredito que a grande revolução que o Rails nos traz é no conceito de como os frameworks devem ser desenvolvidos. Eles devem ajudar e não atrapalhar. Serem fáceis de entender e não um emaranhado complexo. Serem o mais completo quanto possível, sem tirar a simplicidade. No fundo no fundo, just &lt;a href=&#39;http://en.wikipedia.org/wiki/KISS_principle&#39;&gt;KISS&lt;/a&gt; and &lt;a href=&#39;http://en.wikipedia.org/wiki/Don%27t_repeat_yourself&#39;&gt;DRY&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;So, let&amp;#8217;s drink! o/&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/8/1/analizando-cobertura-dos-testes-com-rcov</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/8/1/analizando-cobertura-dos-testes-com-rcov/"/>
    <title>Analizando cobertura dos testes com Rcov</title>
    <published>2007-08-01T00:00:00-07:00</published>
    <updated>2007-08-01T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Até o momento considero um sucesso a minha adesão ao TDD no desenvolvimento com Rails. Em apenas dois dias os testes automatizados encontraram bugs que possivelmente passariam desapercebidos e já escrevi novos testes para cobrir situações inicialmente não previstas, mas que mostraram sua cara nos testes que já estavam escritos.&lt;/p&gt;

&lt;p&gt;Após algumas horas de testes e programação finalizei a primeira etapa de codificação do que será o novo sistema de inscrições do &lt;a href=&#39;http://www.forumsoftwarelivre.org.br&#39;&gt;Fórum de Software Livre do Rio de Janeiro&lt;/a&gt; desse ano, que ocorrerá em outubro. Foi todo um período de codificação em que não encostei em html/css, mas apenas na codificação dos testes e na lógica dos controladores e modelos.&lt;/p&gt;

&lt;p&gt;Para validar todo o trabalho é necessário verificar a cobertura dos testes. Assim podemos descobrir se alguma linha de código passou sem ser testada. Pegando emprestada a idéia do pessoal da &lt;a href=&#39;http://www.improveit.com.br/xp/praticas/tdd/rcov&#39;&gt;ImproveIt&lt;/a&gt;, instalei o rcov no Ubuntu:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;sudo apt-get install rcov&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Foi acrescentado um rake task para automatizar o processo de geração do relatório. Gerado o arquivo &lt;em&gt;/lib/tasks/rcov.rake&lt;/em&gt; com o conteúdo(levemente modificado do original da ImproveIt):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
require &#39;rake/clean&#39;  

RCOV_OUT = &quot;doc/coverage&quot;  

EXCLUDE = &quot;-x /site_ruby/&quot;  

CLOBBER.include(RCOV_OUT)  

RCOV = &quot;rcov --no-color&quot;  

task :coverage_units do  
     sh &quot;find test/unit -name &#39;*.rb&#39; | xargs #{RCOV} #{EXCLUDE} --rails --output #{RCOV_OUT}/units&quot;  
end  

task :coverage_functional do  
    sh &quot;find test/functional -name &#39;*.rb&#39; | xargs #{RCOV} #{EXCLUDE} --rails --output #{RCOV_OUT}/functionals&quot;
end  

task :coverage_all do  
    sh &quot;find test/* -name &#39;*.rb&#39; | xargs #{RCOV} #{EXCLUDE} --rails --output #{RCOV_OUT}&quot;
end  

task :rcov =&gt; [:coverage_all]  
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Agora basta entrar no diretório do seu projeto em Rails e digitar:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rake rcov&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Será gerado dentro do diretório &lt;em&gt;/doc/coverage&lt;/em&gt; o relatório de cobertura dos testes. E não é eu fui bem pra minha surpresa? Resultado: 100% testado! Que venham os próximos testes!&lt;/p&gt;
&lt;p style=&#39;text-align: center;&#39;&gt;
&lt;a href=&#39;/assets/images/2007/8/1/cobertura_rcov.png&#39;&gt;
&lt;img alt=&#39;Resultado cobertura rcov&#39; height=&#39;348&#39; src=&#39;/assets/images/2007/8/1/cobertura_rcov.png&#39; width=&#39;500&#39; /&gt;
&lt;/a&gt;
&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/7/30/meu-primeiro-tdd</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/7/30/meu-primeiro-tdd/"/>
    <title>Meu primeiro TDD</title>
    <published>2007-07-30T00:00:00-07:00</published>
    <updated>2007-07-30T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;A um mês aproximadamente estudo &lt;a href=&#39;http://en.wikipedia.org/wiki/Extreme_Programming&#39;&gt;Extreme Programming&lt;/a&gt; e suas práticas. Das práticas que estão relacionadas à programação em si, o desenvolvimento guiado pelos testes é sem dúvida aquela que causa mais impacto em quem está habituado ao &amp;#8220;desenvolvimento tradicional&amp;#8221;. Estou convencido de que a utilização dessa prática é base para um software de qualidade, livre de bugs. Diante disso resolvi começar meu primeiro projeto usando TDD - Test Driven Development. A plataforma: Rails.&lt;/p&gt;

&lt;p&gt;O desenvolvimento guiado por testes ainda não é uma prática muito comum, e na internet achar informação útil também não é tão simples, mesmo tendo o Rails um framework completo de testes embutido. Resolvi comprar o screencast sobre TDD do &lt;a href=&#39;http://peepcode.com/products/test-first-development&#39;&gt;Peepcode&lt;/a&gt;. Além do screencast, o pacote também contém todo o código desenvolvido e alguns plugins. Então se você está começando agora com TDD e Rails vão algumas dicas.&lt;/p&gt;

&lt;h2 id=&#39;autotest&#39;&gt;autotest&lt;/h2&gt;

&lt;p&gt;Esse é essencial. para instalar como um gem:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; sudo gem install ZenTest &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dentro do diretório do seu projeto Rails digite:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; autotest&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ele fica monitorando quando algum arquivo é alterado e roda o teste necessário, se algum dos testes falha pode-se ver na mesma hora. Basta deixá-lo rodando num terminal a parte de forma que se possa colocá-lo em foreground com um Alt+Tab ou coisa assim.&lt;/p&gt;

&lt;p&gt;O desenvolvimento fica bem dinâmico com ele. Você escreve o teste, escreve a funcionalidade e ao salvar o arquivo já está rodando no terminal o teste e você descobre na hora se tá ok ou não.&lt;/p&gt;

&lt;h2 id=&#39;redgreen&#39;&gt;redgreen&lt;/h2&gt;

&lt;p&gt;Esse aqui é bom pois colore a saída de texto dos testes. Se algum teste falha ele mostra em vermelho. Se o teste passa ele exibe em verde, então identifica-se visualmente sem precisar ler de fato o retorno na tela.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; sudo gem install redgreen&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E acrescentar no fim arquivo &lt;em&gt;config/environments/test.rb&lt;/em&gt; a linha:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;require &#39;redgreen&#39;&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#39;topfunky_power_tools&#39;&gt;topfunky power tools&lt;/h2&gt;

&lt;p&gt;É um plugin muito legal pro Rails, que adiciona alguns atalhos para tasks de teste e também adiciona vários métodos de assert além dos que já estão disponíveis no Ruby e no Rails. Para instalar, dentro do diretório &lt;em&gt;vendor/plugins&lt;/em&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; svn co http://topfunky.net/svn/plugins/topfunky_power_tools/&lt;/code&gt;&lt;/pre&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/7/29/atualizacao-monografia-rails-x-struts</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/7/29/atualizacao-monografia-rails-x-struts/"/>
    <title>Atualização - Monografia Rails x Struts</title>
    <published>2007-07-29T00:00:00-07:00</published>
    <updated>2007-07-29T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Fiz upload de uma ISO com o conteúdo completo (cd igual ao que foi entregue à banca avaliadora) do que foi desenvolvido no meu trabalho de conclusão de curso. A imagem contém: monografia, slides da apresentação, projeto java+struts, projeto Rails, audio da apresentação.&lt;/p&gt;

&lt;p&gt;Confiram na área dos meus &lt;a href=&#39;/artigos&#39;&gt;artigos&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/7/20/workshop-de-impressao-de-cupom-fiscal-com-ruby</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/7/20/workshop-de-impressao-de-cupom-fiscal-com-ruby/"/>
    <title>Workshop de impressão de cupom fiscal com Ruby</title>
    <published>2007-07-20T00:00:00-07:00</published>
    <updated>2007-07-20T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;No dia &lt;a href=&#39;http://oglobo.globo.com/sp/mat/2007/07/19/296873468.asp&#39;&gt;fatídico&lt;/a&gt;, última terça-feira, 17 de julho, desembarquei em São Paulo para assistir ao workshop de impressão de cupom fiscal. O workshop foi com o pessoal da &lt;a href=&#39;http://www.objecttraining.com.br/web_objectTraining&#39;&gt;Object Data&lt;/a&gt;, que está oferecendo também cursos de &lt;a href=&#39;http://www.rubyonrails.com/&#39;&gt;Rails&lt;/a&gt; e &lt;a href=&#39;http://www.ruby-lang.org/en/&#39;&gt;Ruby&lt;/a&gt;. Muito bom ter um pouco de contato com pessoas da comunidade Ruby e que estão utilizando na prática &lt;a href=&#39;http://www.rubyonbr.org/articles/2007/04/29/ruby-alem-do-usual/&#39;&gt;além do Rails&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Pude conhecer e trocar boas idéias também com o &lt;a href=&#39;http://www.simplesideias.com.br/&#39;&gt;Nando Viera&lt;/a&gt;, que está sorteando uma edição do livro Agile Web Development With Rails. Para saber como concorrer &lt;a href=&#39;http://simplesideias.com.br/ganhe-o-livro-agile-web-development-with-rails/&#39;&gt;veja aqui&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Precisamos trazer boas iniciativas como essa também para o Rio de Janeiro. Espero que no &lt;a href=&#39;http://www.forumsoftwarelivre.org.br/&#39;&gt;V Fórum de Software Livre&lt;/a&gt; desse ano consigamos agregar mais pessoas interessadas no assunto para termos mais ações concretas.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/6/23/por-que-utilizar-os-padroes</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/6/23/por-que-utilizar-os-padroes/"/>
    <title>Por que utilizar os padrões web?</title>
    <published>2007-06-23T00:00:00-07:00</published>
    <updated>2007-06-23T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;h2 id=&#39;o_problema&#39;&gt;O problema&lt;/h2&gt;

&lt;p&gt;Por unanimidade, todos os projetos em que entrei para dar manutenção (ou seja: com o bonde andando!) eram o caos em relação aos padrões web. Acredito que existem algumas explicações para isso, mas uma muito importante é que os gerentes(ou as pessoas responsáveis) esquecem que desenvolvedores não são webdesigners&amp;#8230; e simplesmente ignoram o papel do webdesigner, nem estimando o custo da sua hora de trabalho no projeto. Com sorte uma empresa ou profissional é contratado no começo para fazer o layout inicial e pronto.&lt;/p&gt;

&lt;p&gt;Me refiro à webdesigner como a pessoa que realmente entende de como fazer layouts para a web(seguindo os padrões!) e não aquele que simplesmente sabe fazer coisas bonitinhas no Gimp, Photoshop ou semelhantes e depois corta a imagem toda e cola tudo no Dreamweaver num layout 100% tabela. Isso pra mim não é webdesigner. Essa pessoa pode até ser uma boa designer&amp;#8230; daí a ser uma boa &lt;strong&gt;web&lt;/strong&gt;designer há muito chão. Outros pontos que contam muito na avaliação de um webdesigner são os seus conhecimentos sobre usabilidade e acessibilidade.&lt;/p&gt;

&lt;p&gt;Para piorar as coisas ainda há os desenvolvedores que se acham os melhores webdesigners da terra! Sabem tudo de html&amp;#8230; Aliás, html? Já deveriam saber que agora se usa xhtml, de preferência strict. E o que vejo nos projetos são folhas de estilo (CSS) mal planejadas, que não abrangem todo o escopo do site ou do sistema, desenvolvedores que não sabem utilizá-las e no fim um sistema onde para você alterar o modo como um cabeçalho é exibido é necessário alterar em dezenas ou centenas de lugares.&lt;/p&gt;

&lt;h2 id=&#39;uma_outra_perspectiva&#39;&gt;Uma outra perspectiva&lt;/h2&gt;

&lt;p&gt;O que estou querendo dizer é que utilizando os padrões web, além de você produzir uma página da maneira correta em relação ao agente (navegador), você também melhora (__MUITO!__) a produtividade do desenvolvimento independentemente da plataforma utilizada. Os seus desenvolvedores não vão ter que ficar se preocupando com alinhamento, cores e tamanhos de fontes&amp;#8230; isso é trabalho para o webdesigner! Ou seja: quando fizer a estimativa de custo para o projeto inclua o custo de um webdesigner. Ele deve estar presente durante todo o projeto.&lt;/p&gt;

&lt;p&gt;Muitos irão dizer que manter um webdesigner durante todo projeto é caro demais, um exagero! Mas e quem disse que desenvolver um software de qualidade(por dentro e por fora!) é barato? Pegue qualquer bom software livre e faça uma estimativa de custo baseada na quantidade de linhas de código(não esqueça de utilizar um fator de correção para a linguagem em que foi desenvolvido), e verá que não é nada barato.&lt;/p&gt;

&lt;p&gt;Neste &lt;a href=&#39;http://www.youtube.com/watch?v=h9AbvKMu_us&#39;&gt;vídeo&lt;/a&gt; o pessoal da &lt;a href=&#39;http://www.improveit.com.br/podcast&#39;&gt;Improve It&lt;/a&gt; fala a respeito de quão eficiente se torna o trabalho do desenvolvedor quando se possui um designer de interface trabalhando junto com a equipe.&lt;/p&gt;

&lt;h2 id=&#39;acessibilidade&#39;&gt;Acessibilidade&lt;/h2&gt;

&lt;p&gt;Se o seu site ou sistema segue os padrões web, ele já está a meio caminho andado para acessibilidade. Este site não é um primor na acessibilidade, tenho conhecimento disso e tentarei sempre melhorá-lo, mas sei que ele está anos-luz na frente de 90%(talvez mais&amp;#8230;) da web.&lt;/p&gt;

&lt;p&gt;Leia e assista ao vídeo do &lt;a href=&#39;http://brunotorres.net/acessibilidade-na-web-custo-ou-beneficio&#39;&gt;Bruno Torres&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id=&#39;compatibilidade&#39;&gt;Compatibilidade&lt;/h2&gt;

&lt;p&gt;O maior pesadelo de todos que desenvolvem para a web: a compatibilidade entre os diversos navegadores do mercado. Se você é programador ou já programou alguma vez na vida e ainda não se convenceu, agora irá mudar de idéia.&lt;/p&gt;

&lt;p&gt;O que acontece se você programa alguma coisa com erros de sintaxe? O compilador ou interpretador irá abortar em algum momento informando que houve um erro de sintaxe, provavelmente informando em qual linha ocorreu o problema. Imagine se a cada erro de sintaxe encontrado ele tentasse advinhar o que você quis fazer com aquilo e resolvesse por você? Pois é isso que acontece quando o navegador recebe um código html/xhtml não válido. Ele entra num modo de compatibilidade, chamado de quirks e tenta adivinhar o que você quis fazer. Como cada navegador interpreta o que você quis fazer de uma maneira diferente, em cada navegador vai aparecer de uma maneira.&lt;/p&gt;

&lt;p&gt;Quando o navegador está em modo strict, ou seja, quando a entrada foi um código válido, a chance de sua página ser exibida de forma mais parecida nos diversos navegadores é maior. É sabido que o IE6 ainda é um grande problema em relação aos padrões web, mas o IE7 felizmente resolveu boa parte deles, Firefox/Mozilla e Opera são bem complacentes com os padrões.&lt;/p&gt;

&lt;h2 id=&#39;para_finalizar&#39;&gt;Para finalizar&lt;/h2&gt;

&lt;p&gt;O link para o validador da W3C no rodapé não está ali de bobeira. Por favor, se você verificar que o site não validou em alguma situação, não exite em me informar para que eu possa corrigir. Uma boa ferramenta para auxílio a esses casos seria um robô que validasse todo o site de tempos em tempos e notificasse o administrador em caso de problemas, vou verificar se existe algo já desenvolvido nesse sentido.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/6/6/diff-para-gnome</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/6/6/diff-para-gnome/"/>
    <title>Diff para Gnome</title>
    <published>2007-06-06T00:00:00-07:00</published>
    <updated>2007-06-06T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Há algum tempo eu procurava um programa gráfico para fazer diff em arquivos de uma maneira amigável, assim como o &lt;a href=&#39;http://www.eclipse.org&#39;&gt;Eclipse&lt;/a&gt; faz quando usa-se o merge em um arquivo no cvs ou svn.&lt;/p&gt;

&lt;p&gt;Hoje pesquisando no &lt;a href=&#39;http://www.freshmeat.net&#39;&gt;&lt;strong&gt;freshmeat.net&lt;/strong&gt;&lt;/a&gt; encontrei um para Gnome! É o &lt;a href=&#39;http://meld.sourceforge.net/&#39;&gt;&lt;strong&gt;Meld&lt;/strong&gt;&lt;/a&gt;. Não tem pacote para Ubuntu, mas tem para &lt;a href=&#39;http://packages.debian.org/unstable/gnome/meld.html&#39;&gt;&lt;strong&gt;Debian&lt;/strong&gt;&lt;/a&gt;, e aqui funcionou muito bem. Fica a dica para quem precisar. O screenshot aí abaixo está comparando dois arquivos de folha de estilo.&lt;/p&gt;
&lt;p style=&#39;text-align: center;&#39;&gt;
&lt;img alt=&#39;Screenshot Meld&#39; src=&#39;/assets/images/2007/6/6/meld.png&#39; /&gt;
&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/6/3/um-pouco-de-migracoes</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/6/3/um-pouco-de-migracoes/"/>
    <title>Um pouco de migrações - Rails migrations</title>
    <published>2007-06-03T00:00:00-07:00</published>
    <updated>2007-06-03T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Para acompanhar a evolução da sua base de dados, no Rails, existem as migrações. Migrações nada mais são do que scripts escritos em linguagem Ruby e que utilizam API disponibilizada pelo Rails para criação, alteração de tabelas do banco de dados. Tal qual as outras operações do ActiveRecord, as migrações também são códigos independentes do SGBD que está utilizando. Com isso ela permite facilmente a migração da aplicação para outro SGBD. São fortes aliadas no desenvolvimento incremental.&lt;/p&gt;

&lt;p&gt;Ao criar um modelo usando o &lt;em&gt;generate&lt;/em&gt;, temos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  $ script/generate model client
  exists  app/models/
  exists  test/unit/
  exists  test/fixtures/
  create  app/models/client.rb
  create  test/unit/client_test.rb
  create  test/fixtures/clients.yml
  create  db/migrate
  create  db/migrate/001_create_clients.rb&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Reparem no arquivo &lt;em&gt;db/migrate/001_create_clients.rb&lt;/em&gt; que foi criado. Editando ele, temos:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  class CreateClients &amp;lt; ActiveRecord::Migration
    def self.up
      create_table :clients do |t|
      end
    end

    def self.down
      drop_table :clients
    end
  end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Vamos supor que gostaríamos de ter para o nosso client os atributos, &lt;em&gt;name&lt;/em&gt;, &lt;em&gt;birth&lt;/em&gt; e &lt;em&gt;email&lt;/em&gt;. Então alteramos o arquivo para:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  class CreateClients &amp;lt; ActiveRecord::Migration
    def self.up
      create_table :clients do |t|
        t.column :name, :string
        t.column :birth, :date
        t.column :email, :string
      end
    end

    def self.down
      drop_table :clients
    end
  end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora para rodar a migração(a base de dados já deve existir e estar configurada no database.yml):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  rake db:migrate&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Verificando em nosso banco de dados temos a tabela criada com os campos que desejamos e também a tabela &lt;em&gt;schema_info&lt;/em&gt;, que serve para o controle da versão em que o banco se encontra.&lt;/p&gt;

&lt;p&gt;Se em determinado ponto do projeto fosse necessário adicionar um novo atributo para nosso client, então procederíamos assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  script/generate migration add_sex_to_client&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora editando o arquivo &lt;em&gt;db/migrate/002_add_sex_to_client.rb&lt;/em&gt; que foi criado, deixamos assim:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  class AddSexToClient &amp;lt; ActiveRecord::Migration
    def self.up
      add_column :clients, :sex, :string
    end

    def self.down
      remove_column :clients, :sex
    end
  end&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E para rodar a migração:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  rake db:migrate&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;É importante manter sempre consiso o método &lt;em&gt;self_down&lt;/em&gt;, para que seja possível retornar à base para versões anteriores, mas é claro que existem situações onde não há como reverter a migração. Para atualizar o banco com uma migração específica:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;  rake db:migrate VERSION=1&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Nas migrações também podem ser adicionados dados no banco utilizando os próprios modelos(_models_) da sua aplicação Rails. Mas é preciso ficar atento quando à utilização indiscriminada desse recurso, pois eventualmente se esse modelo deixa de existir ou se os métodos utilizados são modificados, a sua migração pode ficar quebrada e incapaz de subir um banco do zero até a última revisão.&lt;/p&gt;

&lt;p&gt;Alguns links com mais informações:&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;http://api.rubyonrails.org/classes/ActiveRecord/Migration.html&#39;&gt;Api Rails&lt;/a&gt; &lt;br /&gt;&lt;a href=&#39;http://www.ibm.com/developerworks/java/library/j-cb08156.html&#39;&gt;Crossing borders: Rails migrations&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/31/procura-se-um-designer</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/31/procura-se-um-designer/"/>
    <title>Procura-se um designer</title>
    <published>2007-05-31T00:00:00-07:00</published>
    <updated>2007-05-31T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Estou em busca de um designer para trabalhos freelance. O trabalho básico é o desenvolvimento de páginas web e de interfaces para sistemas web. Não precisa estar localizado no Rio de Janeiro, mas preciso ter garantias de que os acordos serão cumpridos nos prazos.&lt;/p&gt;

&lt;p&gt;Requisitos:&lt;/p&gt;

&lt;p&gt;* Saber XHTML e CSS (__muito!__) bem, layouts sem tabelas * Saber desenvolver layouts &lt;em&gt;clean&lt;/em&gt; como o deste site * Ter noções de usabilidade e acessibilidade&lt;/p&gt;

&lt;p&gt;Contam pontos:&lt;/p&gt;

&lt;p&gt;* Saber javascript * Interesse por Ruby on Rails&lt;/p&gt;

&lt;p&gt;Entrar em contato direto em pvt. Veja as formas de &lt;a href=&#39;/contato&#39;&gt;contato&lt;/a&gt;.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/24/nao-sejam-mediocres</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/24/nao-sejam-mediocres/"/>
    <title>Não sejam medíocres!</title>
    <published>2007-05-24T00:00:00-07:00</published>
    <updated>2007-05-24T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;blockquote&gt;
&lt;p&gt;Se alguém me pergunta: &lt;em&gt;Você saber X?&lt;/em&gt;. Tenho apenas duas respostas diretas: &lt;strong&gt;Sim&lt;/strong&gt; ou &lt;strong&gt;Não&lt;/strong&gt;. Dizer não apenas de vez em quando, é até perdoável, passável. Dizer não com frequência é derrotista. &lt;em&gt;Como assim você não sabe algo simples como X!?&lt;/em&gt;. Dizer não o tempo todo é admitir uma fraqueza. Dizer não sempre é assumir a própria incompetência.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;Agora, se disser Sim com frequência, prepare-se para ser massacrado. Ninguém gosta de pessoas que falam Sim o tempo todo. Porque elas se sentem inferiorizadas: &lt;em&gt;Como assim ele sabe e eu não?&lt;/em&gt; E por causa disso todos tentarão derrubá-lo, por pura e simples mesquinharia. Chegarão ao ponto de dizer &lt;em&gt;grande coisa que ele sabe, eu poderia saber&lt;/em&gt;. Pode__ria__, mas não sabe.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Média da Média&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;E qual o problema de ser a média? Por que preciso ser diferente de todo mundo?&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;(&amp;#8230;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;blockquote&gt;
&lt;p&gt;Quero que todos lembrem de uma coisa: a palavra média é raíz para outra: &lt;strong&gt;Medíocre&lt;/strong&gt; e garanto que ninguém se sente lisonjeado em ser chamado de medíocre. Lembrem-se disso da próxima vez que pensarem que está tudo bem em se considerarem parte da média.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O &lt;a href=&#39;http://akitaonrails.com/articles/2007/04/14/off-topic-seja-arrogante&#39;&gt;texto&lt;/a&gt; é do Fábio Akita. Em torno do inglês ele comenta sobre várias situações em que a maioria das pessoas simplesmente aceitam o seu status de &lt;strong&gt;medíocre&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;É um texto polêmico, que muitos acham arrogante, mas é esse o ponto. É um dos melhores posts do Akita e coloca em palavras a grande realidade.&lt;/p&gt;

&lt;p&gt;Faz lembrar a música dos &lt;a href=&#39;http://www.moveiscoloniaisdeacaju.com.br/musica/cd_idem/esquilo_nao_samba.php&#39;&gt;Móveis Coloniais&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Não vou mentir&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Não sua média você será &lt;br /&gt;Medíocre&lt;/p&gt;

&lt;p&gt;&lt;a href=&#39;http://akitaonrails.com/articles/2007/04/14/off-topic-seja-arrogante&#39;&gt;Leia na íntegra&lt;/a&gt;&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/21/encontro-do-xp-rio</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/21/encontro-do-xp-rio/"/>
    <title>Encontro do XP Rio</title>
    <published>2007-05-21T00:00:00-07:00</published>
    <updated>2007-05-21T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Participei pela primeira vez - na última quinta-feira, dia 17 de maio - do encontro do grupo &lt;a href=&#39;http://tech.groups.yahoo.com/group/xprio/&#39;&gt;XP Rio&lt;/a&gt;, que visa debater sobre a utilização da metodologia de desenvolvimento XP (eXtreming Programming). Na reunião, Vinícius Teles, junto com a equipe da Improve It e do &lt;a href=&#39;http://www.gruposantaisabel.com.br/&#39;&gt;Grupo Santa Isabel&lt;/a&gt;, apresentou o projeto &lt;a href=&#39;http://blog.improveit.com.br/articles/2007/05/15/xp-rio-conheca-o-projeto-xp-do-grupo-santa-isabel&#39;&gt;Lucidus&lt;/a&gt;, que está sendo desenvolvido para o Grupo utilizando metodologia XP e Ruby on Rails.&lt;/p&gt;

&lt;p&gt;Mais detalhes sobre XP você encontra no &lt;a href=&#39;http://blog.improveit.com.br/&#39;&gt;site&lt;/a&gt; da Improve It. Estão disponíveis também as &lt;a href=&#39;http://blog.improveit.com.br/articles/2007/05/20/fotos-projeto-xp-e-rails-grupo-santa-isabel&#39;&gt;fotos&lt;/a&gt; do encontro. E um &lt;a href=&#39;http://blog.improveit.com.br/articles/2007/05/19/podcast-projeto-xp-rails-grupo-santa-isabel&#39;&gt;podcast&lt;/a&gt; com o áudio de toda a reunião de duas horas e meia, além dos slides para acompanhamento.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/18/associacoes-com-activerecord</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/18/associacoes-com-activerecord/"/>
    <title>Associações com ActiveRecord</title>
    <published>2007-05-18T00:00:00-07:00</published>
    <updated>2007-05-18T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Vou contar um pouco da minha experiência com o ActiveRecord do Rails. Trata-se do &lt;em&gt;has and belongs to many&lt;/em&gt; - hbtm - e do &lt;em&gt;has many through&lt;/em&gt;, inserido no Rails 1.1.&lt;/p&gt;

&lt;p&gt;As associações hbtm são resultado de relações muitos para muitos - ou n para n - entre duas tabelas do banco de dados. Por exemplo, imagine um livro. Esse livro pode ser enquadrado em diversas categorias simultaneamente. Reciprocamente, uma categoria pode possuir diversos livros enquadrados. Nesse caso teríamos duas classes de modelo:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Book &amp;lt; ActiveRecord::Base  
  has_and_belongs_to_many :categories  
end  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;e&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Category &amp;lt; ActiveRecord::Base  
  has_and_belongs_to_many :books  
end  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E temos o modelo de dados:&lt;/p&gt;

&lt;p&gt;p{text-align: center}. &lt;img alt=&#39;activerecord1.png&#39; src=&#39;/assets/images/2007/5/18/activerecord1.png&#39; style=&#39;border: 0px;&#39; /&gt;&lt;/p&gt;

&lt;p&gt;A tabela &lt;em&gt;books_categories&lt;/em&gt; não precisa de modelo. Ela é mapeada automaticamente pelo &lt;em&gt;has_and_belongs_to_many&lt;/em&gt;. Para adicionar uma categoria a um livro:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;book.categories &amp;lt;&amp;lt; Category.find(1)
book.save&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E para recuperar todos os livros de uma categoria pode-se fazer:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;books = Category.find(1).books&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Dentro da variável &lt;em&gt;books&lt;/em&gt; estarão todos os livros(um array de livros) que pertencem a categoria com id igual a 1. O mesmo vale no sentido contrário:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;categories = Book.find(1).categories&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;A variável &lt;em&gt;categories&lt;/em&gt; será um array das categorias a qual o livro com id igual a 1 pertence. Simples não?&lt;/p&gt;

&lt;p&gt;Mas e se o relacionamento em si possuir atributos também? No nosso caso, isso significa a tabela &lt;em&gt;books_categories&lt;/em&gt; possuir atributos que pertencem ao relacionamento, e não a categoria ou ao livro isoladamente. Esse caso não é tratado pelo &lt;em&gt;has and belongs to many&lt;/em&gt;. É aí que entra o &lt;em&gt;has many through&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Alterando o modelo de dados para:&lt;/p&gt;

&lt;p&gt;p{text-align: center}. &lt;img alt=&#39;activerecord1.png&#39; src=&#39;/assets/images/2007/5/18/activerecord2.png&#39; style=&#39;border: 0px;&#39; /&gt;&lt;/p&gt;

&lt;p&gt;Temos agora a substituição da tabela &lt;em&gt;books_categories&lt;/em&gt; pela tabela &lt;em&gt;comments&lt;/em&gt;, que provê as mesmas informações da anterior e mais um comentário. Então agora cada livro possui um comentário que por sua vez está associado a uma categoria. Esse comentário poderia ser usado, por exemplo, para explicar por que a pessoa que cadastrou o livro incluiu-o naquela categoria. Os modelos ficam agora:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Book &amp;lt; ActiveRecord::Base  
  has_many :comments  
  has_many :categories, :through =&amp;gt; :comments
end  


class Comment &amp;lt; ActiveRecord::Base  
  belongs_to :book  
  belongs_to :category  
end  


class Category &amp;lt; ActiveRecord::Base  
  has_many :books, :through =&amp;gt; :comments    
end  &lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Agora podemos fazer coisas como:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;category = Category.find(1)
comment = Comment.new :content =&amp;gt; &amp;quot;meu comentario&amp;quot;, :category =&amp;gt; category
book.comments &amp;lt;&amp;lt; comment
book.save&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ou apenas:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;book.categories &amp;lt;&amp;lt; Category.find(1)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;E o comentário virá em branco. Pode-se também:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;books = Category.find(1).books&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Que retornará todos os livros pertencentes a uma categoria. Podemos também:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;categories = Books.find(1).categories&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Onde teremos todas as categorias de um livro. Além disso:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;comments = Books.find(1).comments&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Onde teremos todos os comentários de um livro. Lembrando que cada objeto &lt;em&gt;comment&lt;/em&gt; ainda possui a categoria associada a ele.&lt;/p&gt;

&lt;p&gt;Para testar as coisas e garantir que o código que eu escrevi aqui estava ok, no fim eu resolvi testá-lo. E usei migração para geração da base de dados, como forma fácil de &lt;em&gt;migrar&lt;/em&gt; do primeiro modelo para o segundo. Então esse poderá ser o tema do próximo post.&lt;/p&gt;

&lt;p&gt;Por favor, se encontrar qualquer erro nas informações ou no código, não exite em informar nos comentários para que eu possa corrigir.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/10/problemas-acontecem-principalmente-com-discos-rigidos</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/10/problemas-acontecem-principalmente-com-discos-rigidos/"/>
    <title>Problemas acontecem... principalmente com discos rígidos</title>
    <published>2007-05-10T00:00:00-07:00</published>
    <updated>2007-05-10T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;É pessoal, a coisa tá feia. Fazia tanto tempo que isso não acontecia comigo, que já até tinha esquecido que poderia acontecer. O hd do meu desktop queimou. Junto se foram diversas fotos, alguns documentos e uns esqueletos de projeto&amp;#8230; com certeza uma perda, mas acho que nada muito prejudicial &amp;#8211; bom pelo menos não que eu me lembre no momento. Pelo menos ainda tenho o notebook para trabalhar, mas já estava querendo atualizar ele para o Ubuntu 7.04, muitos já me disseram que está muito bom. Se ele reconhecer a minha wifi sem eu ter que entrar na linha de comando eu tiro o chapéu ;-).&lt;/p&gt;

&lt;p&gt;Bom então estou eu agora aqui fazendo backup das últimas coisas que me restam no notebook para depois atualizá-lo para a última versão do Ubuntu. E enquanto isso resolvi escrever alguma coisa por aqui, já que hoje era um dos dias que tinha tirado minha noite para escrever sobre Rails, mas devido a esse imprevisto não foi possível. Bom se tudo der certo &amp;#8211; pois sai de baixo né, quando chove m&amp;#8230;, nunca é garoa, já dizia um amigo meu &amp;#8211; no próximo post vou falar sobre algo que estudei no mês passado que é o &lt;em&gt;has many through&lt;/em&gt; e compará-lo com o &lt;em&gt;has and belongs to many&lt;/em&gt;. No começo achei muito confuso, mas depois que entendi o conceito ficou tudo muito claro e sem dúvida é uma ótima funcionalidade que foi adicionada no Rails 1.2 ou 1.1, não me recordo exatamente agora.&lt;/p&gt;

&lt;p&gt;Pelo menos uma coisa boa aconteceu hoje! Estava eu blogeando por aí numa hora vaga no trabalho, quando caí no blog do &lt;a href=&#39;http://ramalho.org&#39;&gt;Luciano Ramalho&lt;/a&gt;. Luciano é um cara sensacional, bebemos várias cervejas juntos já. Conheci ele a uns dois anos atrás quando veio para a &lt;a href=&#39;http://3semana.uniriotec.br/&#39;&gt;3a. Semana de SL&lt;/a&gt; aqui do Rio de Janeiro, na Unirio. Até então conhecia ele como &lt;strong&gt;O CARA&lt;/strong&gt; do Zope aqui no Brasil. Hoje descobri que ele está dando umas boas estudadas também no Ruby e no Rails! Tem até foto do cara com o Matz :-). TODO LIST: Conversar com o Luciano assim que possível.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/3/finalmente-ao-assunto-principal</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/3/finalmente-ao-assunto-principal/"/>
    <title>Finalmente, ao assunto principal!</title>
    <published>2007-05-03T00:00:00-07:00</published>
    <updated>2007-05-03T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Resolvi criar esse site para divulgar um pouco de meu trabalho profissional e também para ter um espaço próprio onde pudesse publicar os projetos em que estou envolvido, bem como trocar dicas e informações.&lt;/p&gt;

&lt;p&gt;Sou um aficionado por tecnologia, desenvolvimento e software livre. Já passei por inúmeras (mais de uma dúzia talvez) linguagens de programação, mas há aproximadamente um ano conheci a linguagem Ruby e foi amor à primeira vista ;-). Dedico muito do meu tempo ao aprendizado do framework MVC de desenvolvimento para web Rails, que é escrito em Ruby. Espero poder postar aqui algumas dicas e macetes sobre o Rails, que cada vez me deixa mais fascinado. Atualmente, posso me dizer feliz por trabalhar cem porcento com tecnologias livres. Mais sobre o meu perfil você encontra na seção &lt;a href=&#39;/sobre&#39;&gt;Sobre&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Recentemente, encerrei o curso de Bacharel em Sistemas de Informação pela &lt;a href=&#39;http://www.uniriotec.br&#39;&gt;UNIRIO&lt;/a&gt;. Do meu trabalho de conclusão, que está disponível na seção &lt;a href=&#39;/artigos&#39;&gt;Artigos&lt;/a&gt;, resultou minha palestra &lt;strong&gt;Nos Trilhos com Rails&lt;/strong&gt; apresentada no último &lt;a href=&#39;http://fisl.softwarelivre.org/8.0/www/&#39;&gt;FISL&lt;/a&gt;, mês passado. Na mesma seção deixarei outros artigos e palestras que realizei nos últimos anos assim como pretendo continuar atualizando-a com meus trabalhos futuros.&lt;/p&gt;

&lt;p&gt;Sejam todos bem vindos e espero que voltem sempre :-).&lt;/p&gt;

&lt;p&gt;Obs: assim que possível o RSS estará disponível para ficar mais fácil o acompanhamento do site.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/5/2/esta-dificil-no-rio-de-janeiro</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/5/2/esta-dificil-no-rio-de-janeiro/"/>
    <title>Está difícil no Rio de Janeiro</title>
    <published>2007-05-02T00:00:00-07:00</published>
    <updated>2007-05-02T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Fugindo um pouco da idéia inicial desse site, fica aqui um desabafo sobre a atual situação da cidade onde vivo. Há mais ou menos um mês, no show do Roger Waters na Apoteose, foi-se o meu celular&amp;#8230; E agora, no último sábado, foi-se a minha carteira, furtada na Lapa por um meliante qualquer. E por R$50,00 que havia lá dentro foi-se junto cartão de banco, crédito, carteira de motorista etc e que, diante de todo trabalho que terei para recuperá-los, valem mais que o dinheiro.&lt;/p&gt;

&lt;p&gt;Por esse e outros motivos está cada vez mais complicado por aqui e cada vez mais penso em ir para uma cidade onde as coisas ainda não estejam no nível em que estão no Rio de Janeiro.&lt;/p&gt;</content>
  </entry>
  
  <entry>
    <id>http://mergulhao.info/2007/4/28/tentando-comecar</id>
    <link type="text/html" rel="alternate" href="http://mergulhao.info/2007/4/28/tentando-comecar/"/>
    <title>Tentando começar</title>
    <published>2007-04-28T00:00:00-07:00</published>
    <updated>2007-04-28T00:00:00-07:00</updated>
    <author>
      <name>Sylvestre Mergulhão</name>
      <uri>http://mergulhao.info/</uri>
    </author>
    <content type="html">&lt;p&gt;Estou perdendo um pouco de tempo pra customizar o mephisto ao meu modo e também com o dreamhost que às vezes demora um pouco para reiniciar a aplicação, mas a coisa está andando e dentro de uns dias o site já estará com o seu conteúdo atualizado.&lt;/p&gt;

&lt;p&gt;E por favor, se você também usa mephisto, deixe um comentário. Gostaria de compartilhar figurinhas sobre ele&amp;#8230;&lt;/p&gt;</content>
  </entry>
  
 
</feed>