FlavioGraneroNestatag:flaviogranero.com,2009:/A developer having fun with Ruby (on Rails) in full time2013-06-28T00:00:00+00:00Trabalho Remoto: Como é desenvolver software longe da empresatag:flaviogranero.com,2013-06-28:/blog/trabalho-remoto-como-e-desenvolver-software-longe-da-empresa
<p>Tive o prazer de ministrar a palestra sobre trabalho remoto no 2º Café com Dev de Londrina, evento mensal que reune profissionais de tecnologia da cidade para apresentar e discutir assuntos relevantes. Os encontros acontecem <a href='http://just.us' title='Junt.us espaço colaborativo'>Junt.us Espaço Colaborativo</a> e tem apoio da <a href='http://helabs.com.br/' title='HE:Labs'>HE:Labs</a>. Se você ainda não participa, está perdendo uma ótima oportunidade.</p>
<p>Na palestra contei um pouco da minha experiência de 5 anos trabalhando como desenvolvedor para empresas do exterior, falando sobre os desafios, as vantagens e desvantagens de poder trabalhar de onde quiser, e ainda assim entregar software de qualidade. Apresentarei dicas e ferramentas para a integração de equipes distribuídas, mostrando o processo que usamos na <a href='http://inaka.net/' title='Inaka'>Inaka</a> (empresa em que atuo) para permitir flexibilidade de horário e local. Finalizando, compartilhei informações para quem tem interesse em atuar dessa forma no mercado.</p>
<p>Fiquei muito feliz com a receptividade e a resposta de quem acompanhou, tanto dos presentes quanto dos que assistiram online. Agradeço a todos pela oportunidade :).</p>
<p><img alt='Palestra sobre trabalho remoto - Café com Dev Londrina' src='/images/palestra_trabalho_remoto.jpg' /></p>
<h2 id='assista_ao_vdeo'>Assista ao vídeo</h2>
<p>A palestra foi transmitida ao vivo pelo site Eventials, e continua disponível na página do <a href='https://www.eventials.com/pt-br/cafecomdevlondrina/2o-cafe-com-dev-londrina-trabalho-remoto-como-e-desenvolver-software-longe-da-empresa/' title='Assista a palestra sobre Trabalho Remoto no Eventials'>Café com Dev de Londrina</a>. Depois de assistir, não esqueça de deixar o seu comentário.</p>
<h2 id='slides'>Slides</h2>
<script async class="speakerdeck-embed" data-id="94579910c47d01307ef05eff516607c5" data-ratio="1.29456384323641" src="//speakerdeck.com/assets/embed.js"></script>
2013-06-28T00:00:00+00:002013-06-28T00:00:00+00:00TowerCRM: da idéia ao lançamentotag:flaviogranero.com,2012-01-18:/projects/towercrm-da-ideia-ao-lancamento
<h2 id='solucionando_nosso_prprio_problema'>Solucionando nosso próprio problema</h2>
<blockquote>
<p><a href='http://www.imobilon.com.br/imobiliaria-londrina' title='A sua imobiliária em Londrina'><img alt='logotipo imobilon' src='http://flaviogranero.com/attachments/imobilon.png' /></a></p>
</blockquote>
<p>Estávamos no início de 2010 quando minha esposa foi convidada para participar da fundação de uma nova <a href='http://www.imobilon.com.br/imobiliaria-londrina' title='A sua imobiliária em Londrina'>imobiliária em Londrina</a>. Estava nascendo a <a href='http://www.imobilon.com.br' title='Imobilon - Excelência em negócios imobiliários'>Imobilon - Excelência em Negócios Imobiliários</a>.</p>
<p>Começo contando isso, porque o início da <a href='http://www.imobilon.com.br' title='Imobilon - Excelência em negócios imobiliários'>Imobilon</a> está muito ligado à idéia do assunto deste texto: o <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>TowerCRM</a>.</p>
<p>Nos meses que se passaram até a inauguração e início dos trabalhos da <a href='http://www.imobilon.com.br' title='Imobilon - Excelência em negócios imobiliários'>Imobilon</a>, eu acabei fazendo o papel de consultor de TI. A imobiliária tinha uma necessidade específica: queria se diferenciar da concorrência através do atendimento ao cliente e não tinha um forte capital para investir em anúncios de mídia tradicional (jornais e revistas). Portanto passou a ser prioridade ter um bom website, que trouxesse bons negócios a um baixo custo.</p>
<p>Alguns corretores que vieram formar a equipe da <a href='http://www.imobilon.com.br' title='Imobilon - Excelência em negócios imobiliários'>Imobilon</a> já tinham uma experiência prévia com um sistema <a href='http://pt.wikipedia.org/wiki/Customer_relationship_management'>CRM</a> em uma construtora da cidade e entendiam que ter um sistema assim trazia uma boa vantagem competitiva. Fomos a procura de soluções no mercado, mas acabamos encontrando poucas adequadas, porque não queríamos investir em servidores caros ou licenças de software (tínhamos adquirido máquinas simples rodando <a href='http://www.ubuntu-br.org/'>Ubuntu</a>) e precisávamos de algo fácil, que corretores pudessem utilizar sem dificuldades. Pesquisando, encontramos soluções dos seguintes tipos:</p>
<ul>
<li><strong>Sistemas desktop</strong>, que precisavam de licenças Windows e um servidor com <a href='http://pt.wikipedia.org/wiki/Terminal_Service'>Remote Desktop Services</a> se desejássemos acesso remoto, além de taxas de implantação altas;</li>
<li><strong>Sistemas CRM rodando no navegador</strong>, mas em inglês ou não específicos para imobiliárias, além de possuírem uma curva de aprendizagem alta;</li>
<li><strong>Sistemas web mais baratos</strong>, mas que não tinham a função de ser um CRM e sim gerenciadores de conteúdo do website da imobiliária.</li>
</ul>
<p>Precisávamos de algo que fosse um <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'><strong>sistema CRM integrado ao website da imobiliária</strong></a>. Como pode-se imaginar, decidi desenvolver uma solução própria, mas que posteriormente pudesse ser transformada em produto e oferecida a outras imobiliárias.</p>
<h2 id='o_desenvolvimento'>O desenvolvimento</h2>
<p>Desde o começo de meu trabalho como desenvolvedor web, criar um produto sempre foi um objetivo, e acompanhei diversos casos na área de tecnologia, de empresas surgindo a partir de necessidades vivenciadas pelos fundadores.</p>
<p>O <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>TowerCRM</a> se enquadra perfeitamente neste caso. O sistema foi sendo desenvolvido aos poucos, onde cada nova funcionalidade era colocada em produção e testada diretamente pela <a href='http://www.imobilon.com.br/quem-somos' title='Equipe Imobilon'>equipe da Imobilon</a>. Foram vários meses recebendo sugestões, melhorando a usabilidade e resolvendo necessidades que surgiam. Em várias oportunidades passei tardes com a equipe, observando quais dificuldades surgiam ao usar a aplicação, principalmente em corretores que estavam começando. Consegui perceber quais eram os principais casos de uso, e otimizar o sistema para ser mais eficiente nesses casos.</p>
<p>Além do conhecimento dos corretores mais experientes, que trouxeram as situações que um <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>CRM imobiliário</a> precisa solucionar, pude também aplicar outros conhecimentos de desenvolvimento web, para entregar algo que muitas vezes os surpreendiam. Um dos sistemas que mais me influenciou foi o <a href='http://highrisehq.com'>Highrise</a>, da 37 signals, que é um <a href='http://pt.wikipedia.org/wiki/Customer_relationship_management'>CRM</a> simples e muito utilizado. O que faltava era torná-lo um software de um nicho mais específico, no meu caso um <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>CRM para imobiliárias</a>.</p>
<p>Com o <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>TowerCRM</a> os corretores podem registrar eventos/atendimentos não só em contatos, mas também em imóveis e negócios, e ainda publicar imóveis e receber interessados através do website de acesso público. O website por sua vez utiliza técnicas comprovadas de <a href='http://pt.wikipedia.org/wiki/Otimiza%C3%A7%C3%A3o_para_motores_de_busca'>SEO</a> para trazer visitantes que utilizam mecanismos de busca como o Google, conseguindo ser independente de portais verticais.</p>
<h2 id='transformando_em_produto'>Transformando em produto</h2>
<p>Quando percebemos que o sistema já estava maduro o suficiente, chegou o momento de transformá-lo em um produto. É claro que sempre existem novas requisições e outras idéias que eu gostaria de implementar, mas entendo ser importando colocar o produto no mercado, para ter retorno de outros clientes, e assim adaptar, evoluir e retornar com um produto cada vez melhor.</p>
<p>Pude comprovar que muitos estavam certos quando diziam: “fazer um sistema é apenas um passo, fazer um produto é algo muito mais trabalhoso”. Foram mais alguns meses até que várias etapas fossem concluídas. Era necessário que o sistema isolasse os dados de cada conta por subdomínio, que o website da imobiliária fosse um aplicativo separado que consumisse uma API do CRM, que o servidor estivesse preparado para armazenar mais dados. Depois disso pronto, faltava um website e uma estratégia de vendas para o <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>TowerCRM</a>, faltava um sistema de ajuda aos usuários e finalmente, faltava definir quais seriam os valores e o modelo de negócio.</p>
<p>Tudo foi concluído em Novembro de 2011, como pode ser conferido no <a href='http://blog.towercrm.com.br/towercrm-tenha-um-crm-especialmente-desenvolv' title='Lançamento do TowerCRM'>post de lançamento do TowerCRM</a>.</p>
<p><a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'><img alt='logotipo towercrm' src='http://flaviogranero.com/attachments/towercrm.png' /></a></p>
<h2 id='tenho_um_produto_e_agora'>Tenho um produto, e agora?</h2>
<p>Um dos livros que eu mais gostei nesse período de aprendizado sobre produtos e startups, foi o <a href='http://highrisehq.com'>“Start Small Stay Small”</a> escrito por <a href='http://www.softwarebyrob.com/'>Rob Walling</a>. Nele o autor descreve muito bem os passos que ele usou para conseguir lançar aplicativos web como produtos de sucesso. Como ele cita no livro, o software é somente 30% do trabalho, o restante se encontra em marketing, vendas, suporte, atendimento, etc. É nesse restante que estamos focando agora, sem deixar, é claro, de atender necessidades que detectamos ser de importância estratégica.</p>
<p>Tenho visitado pessoalmente imobiliárias aqui em Londrina, para apresentar o <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>TowerCRM</a>. Percebo que consultores imobiliários que já trabalharam com um <a href='http://pt.wikipedia.org/wiki/Customer_relationship_management'>CRM</a> alguma vez, enxergam o valor do produto. Outros que utilizam sistemas complexos, entendem as vantagens da facilidade de uso, da não necessidade de treinamentos custosos. Ninguém deixou transparecer que usar um sistema web seria um problema, pelo contrário, todos querem acessar suas informações de qualquer lugar, sem precisar adquirir servidores. Ter alguém que vai cuidar do website da empresa também é muito bem visto. Muitos ou dependem de portais para atrair clientes, ou têm websites que não trazem o retorno desejado, ou ainda nem possuem um website.</p>
<p>Claro que nem tudo são flores. Muitos administradores têm receio da forma como o sistema lida com os dados, promovendo o constante compartilhamento de informações entre todos da equipe. Mas acreditamos que as vantagens são muito maiores quando a empresa trabalha dessa forma, do que com informações centralizadas e processos burocráticos.</p>
<p>O <a href='http://towercrm.com.br' title='TowerCRM - Sistema CRM e Site para imobiliárias'>TowerCRM</a> foi lançado, o primeiro produto de uma startup responsável por trazer mais negócios à seus clientes do mercado imobiliário.</p>
<p>Nos próximos textos, pretendo continuar compartilhando aqui a experiência obtida com minha startup. Deixe seu comentário!</p>
2012-01-18T00:00:00+00:002012-01-18T00:00:00+00:00Rails Summit 2009: Estive látag:flaviogranero.com,2009-10-27:/blog/rails-summit-2009-estive-la
<h2 id='a_viajem'>A Viajem</h2>
<blockquote>
<p><img alt='Eu, Ricardo e Chad' src='http://flavio.files.wordpress.com/2009/10/4026518141_4e2c9f87cf_o.jpg?w=300' /></p>
</blockquote>
<p>Foi cansativo, mas mais uma vez valeu muito a pena. Desta vez não conseguimos interessados suficientes para organizar uma caravana paranaeense, então nos aventuramos eu e o <a href='http://ricardok.com'>RicardoK</a> a viajar de Londrina até São Paulo de ônibus. A viajem corria bem, até percebermos que era volta de feriado prolongado e que enfrentaríamos mais de 100km de trânsito lento. Chegamos com mais de 3 horas de atraso, mas ainda assim com muito tempo para descansar antes do evento. Fiquei no mesmo hotel do ano passado, perto do metrô tietê, onde havia combinado de dividir o quarto com o <a href='http://leonardofaria.net'>Leonardo Faria</a>, programador de Divinópolis-MG que até então não conhecia pessoalmente.</p>
<h2 id='o_evento'>O Evento</h2>
<blockquote>
<p><img alt='Eu e Vinicius Teles' src='http://flavio.files.wordpress.com/2009/10/dsc00623.jpg?w=300' /></p>
</blockquote>
<p>A RailsSummit 2009 aconteceu nos dias 13 e 14 de outubro, no Centro de Convenções Anhembi. Foi a segunda edição do maior evento sobre o tema na América Latina. Estive presente também na primeira edição, que foi bem organizada e teve um valor especial para mim, pois foi onde <a href='http://flaviogranero.com/blog/rails-summit-emprego-novo/'>consegui meu emprego atual</a>. Devido a isso, já tínhamos uma expectativa muito boa para a edição desse ano, só não acreditava que seria possível um evento melhor que o do ano passado. Mas foi…</p>
<p>Neste ano não só corrigiram alguns poucos problemas que haviam ocorrido, como melhorar a temperatura do auditório B, como também aumentaram o espaço para networking e o espaço do restaurante, melhoraram o acesso à internet e acrescentaram tradução das palestras de português para para inglês. Além disso, como em um bom evento geek, tivemos um espaço com video-games, onde pude derrotar meu padrão no boxe do Wii =).</p>
<p>Quanto às palestras, mais uma vez tivemos temas variados abordados por grandes nomes internacionais e nacionais, que foram de escalabilidade e testes até empreendedorismo. O <a href='http://twitter.com/leozera'>Leonardo</a> fez um resumo do <a href='http://leonardofaria.net/2009/10/13/rails-summit-resumo-do-primeiro-dia/'>primeiro</a> e do <a href='http://leonardofaria.net/2009/10/14/rails-summit-resumo-do-segundo-dia/'>segundo</a> dias. Foram muitas apresentações excelentes, com destaque para <a href='http://twitter.com/greggpollack'>Gregg Pollack</a> mostrando várias gems e plugins para ajudar na melhora da performance das aplicações no primeiro dia e para <a href='http://twitter.com/viniciusteles'>Vinicius Teles</a>, falando sobre suas experiencias de empreendedorismo com a ImproveIt, e <a href='http://twitter.com/obie'>Obie Fernandez</a>, que falou sobre a arte de desenvolver aplicações, já no segundo dia.</p>
<h2 id='encontros'>Encontros</h2>
<blockquote>
<p><img alt='Jony, Herval, Leozera, Eu e RicardoK' src='http://flavio.files.wordpress.com/2009/10/4027296870_9d2c7902e2_o.jpg?w=300' /></p>
</blockquote>
<p>Participar de um grande evento como foi o Rails Summit também é uma ótima oportunidade para rever amigos que moram em outras cidades ou estados, e ainda para conhecer aqueles desenvolvedores que você só reconhece o avatar das redes sociais, twitter e IMs. Reencontrei o pessoal do paraná (<a href='http://twitter.com/ozeias'>Ozéias</a>, <a href='http://twitter.com/daviscabral'>Davis</a>, <a href='http://twitter.com/zegomesjf'>Zé Gomes</a>, <a href='http://twitter.com/mauriciozaffari'>Maurício</a>) e de outros estados (<a href='http://twitter.com/freireag'>Thiago Freire</a>, <a href='http://twitter.com/jonysk'>Jony</a>), e também conheci alguns railers pessoalmente pela primeira vez (<a href='http://twitter.com/leozera'>Leonardo Faria</a>, <a href='http://twitter.com/herval'>Herval</a>, <a href='http://twitter.com/bt1'>Roberto Soares</a>, <a href='http://twitter.com/diegorv'>Diego</a> e <a href='http://twitter.com/georgeguimaraes'>George Guimarães</a>).</p>
<p>Tive a chance de conhecer também alguns participantes do <a href='http://rails-hits.com'>rails-hits podcast</a>, como o <a href='http://twitter.com/elomar'>Elomar França</a> e o <a href='http://twitter.com/fagiani'>Paulo Fagiani</a>, que já estavam promovendo o Oxente Rails 2010, e o <a href='http://twitter.com/viniciusteles'>Vinícius Teles</a>, que fez uma das palestras mais motivadoras da conferência.</p>
<p>E ainda, como na edição passado, o <a href='http://twitter.com/rubyrescue'>Chad</a> estava presente, desta vez com mais alguns desenvolvedores vindos de Buenos Aires. É sempre bom poder conversar sem usar o skype, que é como fazemos diariamente no trabalho para a Reach.</p>
<h2 id='concluso'>Conclusão</h2>
<p>Sem dúvidas, o que fica do evento é um saldo muito positivo. Algumas sugestões que fizemos no ano passado foram implementadas, como o uso do login no crachá do evento. Já as camisetas, para mim acabaram sendo um grande #fail. Deixo aqui os parabéns ao <a href='http://www.akitaonrails.com'>Akita</a> e a <a href='http://www.locaweb.com.br'>Locaweb</a> pela organização, aos patrocinadores do evento, e aos Railers de todos os cantos do Brasil e alguns de fora dele, que compareceram e fizeram uma conferência ainda melhor que a anterior. A comunidade parece estar crescendo e mais do que isso, está amadurecendo, com cada vez mais profissionais trabalhando e contribuindo com a tecnologia. Volto para a rotina de trabalho com a motivação renovada.</p>
<ul>
<li>Algumas fotos do <a href='http://www.flickr.com/photos/locaweb/'>flickr da locaweb</a>, veja outras fotos do evento também no <a href='http://www.flickr.com/photos/maltempe/tags/railssummit/'>meu flickr</a>.</li>
</ul>
2009-10-27T02:16:56+00:002009-10-27T02:16:56+00:00Filter Table: Plugin para geração de filtros para Railstag:flaviogranero.com,2009-04-18:/projects/filter-table-plugin-para-geracao-de-filtros-para-rails
<p>Filter Table é um plugin para Ruby on Rails que possibilita uma forma simples para filtragem de dados. O plugin adiciona um método ao controller para gerar condições do ActiveRecord baseado nos parâmetros passados na requisição. Além disso, o plugin inclui Helpers para auxiliar a inserção dos links de filtros nas Views.</p>
<h3 id='instalando'>Instalando:</h3>
<p>O código do plugin está hospedado no GitHub, para instalá-lo em sua aplicação, execute o comando:</p>
<pre><code>:::bash
script/plugin install git://github.com/flaviogranero/filter_table.git</code></pre>
<h3 id='usando'>Usando:</h3>
<p>Para usar o plugin, basta adicionar uma chamada ao método <strong>filter_attributes</strong> no controller desejado, passando os atributos que podem ser usados na construção do filtro. Feito isso, pode-se chamar o método <strong>filter_conditions</strong> na carga de dados do seu modelo. Vejamos um exemplo de uso no controller:</p>
<h4 id='controller_cars_controllerrb'>Controller (cars_controller.rb):</h4>
<pre><code>:::ruby
class CarsController < ApplicationController
 filter_attributes :status

 def index
 @cars = Car.paginate :page => params[:page], :conditions => filter_conditions 
 end
end</code></pre>
<p>Observe que o modelo Car possui um atributo “status” do tipo inteiro, que será usado pelo plugin para gerar as condições baseado nos valores passados como parâmetros da requisição. Um exemplo de URL filtrando os carros com status igual a 1 por exemplo, seria: /cars?status=1</p>
<p>Os filtros ainda podem ser combinados. Um exemplo para isso seria uma requisição para mostrar os carros com status igual a 1 <strong>OU</strong> a 2: /cars?status=1+2</p>
<p>Criar links na sua página de listagem com todas as combinações de filtros pode ser um tanto trabalhoso. Para facilitar isso, o plugin conta com método auxiliar com essa finalidade, chamado <strong>filter_links_for</strong>. Os parâmetros para o método variam de acordo com a necessidade e o tipo do atributo. Vejamos algums exemplos de views.</p>
<h4 id='view_indexhtmlerb'>View (index.html.erb):</h4>
<pre><code>:::rhtml
<h1>Cars</h1>
 <div>
 <h2>Filters</h2>
 <%= filter_links_for :status, :values => {'Normal' => 0, 'Broken' => 1, 'Running away' => 2} %>
 </div>
 <table>
 <tr>
 <th>Name</th>
 <th>Status</th>
 <th>Category</th>
 </tr>
 <% @cars.each do |car| %>
 <tr>
 <td><%=h car.name %></td>
 <td><%= car.status %></td>
 <td><%= car.category %></td>
 </tr>
 <% end %>
 </table></code></pre>
<p>No exemplo de view acima, temos como parâmetro o atributo status, e um Hash com os captions e valores possíveis na chave :values.</p>
<p>Você pode ainda passar alguns parâmetros opcionais, como o título da lista de links que será gerada, usando a chave :title, e a classe css usada em filtros ativos pela chave :active_class, cujo valor padrão é “filter_active”.</p>
<p>O parâmetro :values aceita Hashs, Arrays ou ainda o valor :auto. Neste último caso, os links dos filtros são geradas a partir de uma query no banco de dados por valores distintos do atributo em questão. Para que isso seja possível, é necessário o uso da chave :model associada ao nome do Modelo, como pode ser observado no exemplo abaixo, para o atributo category:</p>
<h4 id='view_indexhtmlerb'>View (index.html.erb):</h4>
<pre><code>:::rhtml
<h1>Cars</h1>
 <div>
 <h2>Filters</h2>
 <%= filter_links_for :status, :values => {'Normal' => 0, 'Broken' => 1, 'Running away' => 2} %>
 <%= filter_links_for :category, :values => :auto, :model => 'Car' %>
 </div>
 <table>
 <tr>
 <th>Name</th>
 <th>Status</th>
 <th>Category</th>
 </tr>
 <% @cars.each do |car| %>
 <tr>
 <td><%=h car.name %></td>
 <td><%= car.status %></td>
 <td><%= car.category %></td>
 </tr>
 <% end %>
 </table></code></pre>
<p>Para cada valor de filtro, é gerado um link para filtragem exclusiva, e outro para adicionar o valor ao filtro atual. Quando um filtro já está aplicado, esse link é substituído por outro, com a função de remover o valor do filtro atual.</p>
<h3 id='contribuindo'>Contribuindo:</h3>
<p>Contribuições com idéias e novas funcionalidades são sempre bem vindas. O plugin possui cobertura por testes unitários, bastando executar “Rake test” dentro de sua pasta. Fique à vontade para clonar o repositório em <a href='http://github.com/flaviogranero/filter_table/'>http://github.com/flaviogranero/filter_table/</a></p>
<h3 id='concluso'>Conclusão:</h3>
<p>O uso do plugin <a href='http://github.com/flaviogranero/filter_table/'>filter_table</a> torna páginas com grandes listas de dados, principalmente as usadas para administração de sistemas, mais fáceis de navegar e de visualizar.</p>
<p>Criei o plugin para sanar a necessidade por filtros que tinha em páginas administrativas de um sistema em Ruby on Rails, já que as soluções em plugins e gems existentes com a solução são normalmente complexos de configurar e manter, agregam muitas funcionalidades e na maioria das vezes fazem uso de AJAX de forma abusiva.</p>
<p>O <a href='http://github.com/flaviogranero/filter_table/'>filter_table</a> destina-se a resolver apenas o problema dos filtros, sem mágica, mantendo o código simples.</p>
2009-04-18T21:08:21+00:002009-04-18T21:08:21+00:00Ruby Gem: Escopo de busca fácil no ActiveRecordtag:flaviogranero.com,2008-12-26:/blog/ruby-gem-escopo-de-busca-facil-no-activerecord
<p>Escrevi a algum tempo um <a href='http://flaviogranero.com/blog/sistema-de-busca-full-text-no-rails-usando-mysql/'>post mostrando como usar campos FULL TEXT do MySQL</a> para ter uma sistema de busca simples mas eficiente em suas aplicações Rails. Para quem não precisa de uma busca mais sofisticada, o plugin <em>acts</em>as_fulltextable_ quebra o galho.</p>
<p>Porém, recentemente me deparei com um situação onde precisava de algo ainda mais simples. Para um sistema de administração de conteúdo, a busca devia pesquisar apenas em um Model, e em apenas alguns campos. Portanto criar uma tabela extra no banco de dados, como o <em>acts</em>as_fulltextable_ faz, seria um pouco dispendioso.</p>
<p>Uma solução simples seria usar o método <em>Model.find</em>by_name_ por exemplo, para buscar um registro pelo campo ‘name’, mas isso traria apenas um registro e sem a possibilidade de buscar por mais de um campo com uma única execução. Outra solução seria a criação de <em>named_scopes</em>, mas seria um tanto trabalhoso filtrar por vários atributos e ainda tratar a entrada de dados. Foi então que encontrei a gem <a href='http://github.com/wvanbergen/scoped_search/tree/master'>scoped_search</a>. Quando instalada, ela adiciona um escopo para buscas em models do Active Record chamada <strong>search_for</strong>, a qual usa cláusulas LIKE da linguagem SQL para efetuar filtros, diretamente no banco de dados.</p>
<h3 id='instalao'>Instalação:</h3>
<p>Adicione ao environment.rb de sua aplicação:</p>
<pre><code>:::ruby
config.gem 'scoped_search',</code></pre>
<p>Depois, execute o comando:</p>
<pre><code>:::bash
$ rake gems:install</code></pre>
<h3 id='utilizao'>Utilização:</h3>
<p>Basta adicionar uma linha no Model desejado, indicando os campos que serão usados na busca:</p>
<pre><code>:::ruby
# user.rb
class User < ActiveRecord::Base
 searchable_on :login, :name
end</code></pre>
<p>Depois da alteração, a classe passa a contar com o escopo <strong>search_for</strong>, que pode ser usado em cascata com outros <em>named_scopes</em>. No exemplo abaixo de uma action “search” do controller de usuários, integra-se a busca com a paginação provida pelo <em>will</em>paginate_:</p>
<pre><code>:::ruby
# users_controller.rb
def search
 @users = User.search_for(params[:q]).paginate(:page => params[:page])
 respond_to do |format|
 format.html
 format.xml{ render :xml => @users }
 end
end</code></pre>
<p>Bem tranquilo. Para incrementar um pouco, podemos ainda adicionar campos de associações na busca. Supondo que o usuário tenha um perfil (profile), podemos adicionar o campo description pertencente ao perfil na busca, da seguinte maneira:</p>
<pre><code>:::ruby
class User 
 has_one :profile, :dependent => :destroy
 searchable_on :login, :name, :profile_description
end</code></pre>
<p>No MySQL, pode-se ainda utilizar índices FULLTEXT nos campos mais requisitados, para aumentar a performance das buscas.</p>
<p>Fonte: <a href='http://techblog.floorplanner.com/2008/07/26/easy-search-with-activerecord/'>Easy search with ActiveRecord</a></p>
2008-12-26T20:18:40+00:002008-12-26T20:18:40+00:00Rails Summit: Emprego Novo!tag:flaviogranero.com,2008-11-25:/blog/rails-summit-emprego-novo
<p>Você pode estar pensando:</p>
<blockquote>
<p>Mais um post sobre a Rails Summit? Não está um pouco atrasado não?</p>
</blockquote>
<p>Atrasado, pode ser, mas foi porque estava esperando um bom momento para publicá-lo.</p>
<p>Foram 5 anos de desenvolvimento Delphi, onde eu tive o prazer de trabalhar com uma equipe muito competente e inovadora. Os desenvolvedores Delphi são normalmente taxados como “pregadores de botão”, por desenvolvedores de outras linguagens. Mas no caso da nossa equipe isso não acontecia. Com foco no desenvolvimento de ferramentas e frameworks, estávamos sempre buscando e aplicando práticas modernas de desenvolvimento e gerenciamento. E foi esse ambiente que me prendeu por esse tempo.</p>
<p>Mas agora chega a hora de novos desafios. Venho usando Ruby on Rails já há mais de 2 anos, apenas em projetos pessoais, desenvolvidos em meu tempo livre. A tecnologia me chamou tanto a atenção que passei a usá-la em aplicações, a escrever textos esporádicos aqui no blog, a participar da comunidade, me preparando para conseguir uma oportunidade de usá-la em tempo integral.</p>
<p>A oportunidade apareceu justamente durante a <a href='http://locaweb.com.br/railssummit/'>Rails Summit</a>. Confesso que quando me inscrevi para o evento, eu sabia que essa seria uma ótima chance de conhecer de perto outros desenvolvedores e buscar oportunidades. Muito se falou sobre o evento, foram <a href='http://www.akitaonrails.com/2008/11/12/rails-summit-blogosfera'>muitos posts</a>, <a href='http://flickr.com/photos/tags/railssummit/'>fotos</a> e <a href='http://search.twitter.com/search?q=railssummit'>twitts</a> destacando a qualidade das palestras e da organização, o que é realmente indiscutível e não pretendo ser repetitivo aqui. Mas além de tudo isso, para mim o evento teve essa outra face. Durante um dos intervalos entre as palestras, estava conversando com o pessoal da caravana paranaense e conhecemos <a href='http://rubyrescue.com/'>Chad DePue</a>, um americano residente em Buenos Aires que estava participando do evento e a procura de railers para trabalho remoto. Eu, logicamente, me candidatei =D.</p>
<p><a href='http://flavio.files.wordpress.com/2008/11/3022990114_2be03efd38.jpg'><img alt='Chad DePue na Rails Summit' src='http://flavio.files.wordpress.com/2008/11/3022990114_2be03efd38.jpg?w=300' /></a></p>
<p>Depois do evento, tivemos algumas conversas e testes e agora posso dizer que sou o mais novo desenvolvedor da <a href='http://reachnetwork.com/'>Reach Network</a>, empresa sediada em Seattle, a qual o Chad presta serviços através da sua consultoria, a <a href='http://inakanetworks.com/'>Inaka Networks</a>.</p>
<p>Estou muito satisfeito em começar essa nova fase na minha carreira e gostaria de agradecer a toda a comunidade Rails que é muito receptiva e prestativa, especialmente aos <a href='http://groups.google.com/group/pr-on-rails'>Railers do paraná</a> que conheci melhor durante o evento e ao <a href='http://www.akitaonrails.com/'>Fábio Akita</a>, por organizar um evento de tão alto nível como foi a Rails Summit. Além desses, uma figura importantíssima nesta mudança foi o Ozéias do <a href='http://railsbox.org/'>RailsBox</a>, que organizou muito bem a caravana paranaense e me deu várias dicas sobre trabalho remoto, valeu cara!</p>
<p><a href='http://www.flickr.com/photos/maltempe/tags/railssummit/'><img alt='Caranava Paranaense' src='http://farm4.static.flickr.com/3010/2951409275_3ef89e89f2.jpg' /></a> <em>Caravana paranaense (com alguns catarinenses também)</em></p>
<p>O evento superou as minhas expectativas, mas como sugestão para o próximo, espero que possamos ter avatares nos crachás e camisetas nerds para comprar =D</p>
<p>Valeu galera e até o próximo evento.</p>
2008-11-25T22:29:29+00:002008-11-25T22:29:29+00:00SEO on Rails: URLs Amigáveistag:flaviogranero.com,2008-10-09:/blog/seo-on-rails-urls-amigaveis
<p>Deixar as URLs de sua aplicação amigáveis pode fazer uma grande diferença no ranking dos mecanismos de busca. Isso significa fazer com as URLs fiquem mais simples, criando endereços que sejam legíveis e que tragam alguma informação sobre o conteúdo da página.</p>
<p>Vejamos alguns exemplos de URLs complexas:</p>
<pre><code>index.php?section=cine&category=comedy</code></pre>
<p>ou</p>
<pre><code>/cgi-bin/index.cgi?id=6F7YCH&page=6</code></pre>
<h3 id='quais_os_problemas_de_ter_urls_complexas'>Quais os problemas de ter URLs complexas?</h3>
<ol>
<li>A complexidade da URL torna o endereço difícil de memorizar</li>
<li>Em alguns casos fica difícil de saber o que você vai encontrar antes de clicar em um link desse tipo</li>
<li>A tecnologia utilizada pelo aplicativo fica exposta</li>
<li>Se a tecnologia utilizada no site tiver que ser alterada (php para ruby, por exemplo), todas as URLs antigas ficarão inválidas</li>
</ol>
<h3 id='a_soluo_com_rails'>A solução com Rails</h3>
<p>Para quem usa Rails, principalmente da maneira <a href='http://www.brunocarvalho.com/02/06/2007/restful-ruby-on-rails/'>Restful</a>, já tem esses problemas minimizados. Basta fazer um scafold e as URLs para as actions já ficam em um formato simples, como no nosso exemplo de locadora abaixo:</p>
<p>Lista de filmes</p>
<pre><code>http://locadora.com/filmes</code></pre>
<p>Detalhes de um filme com id igual a 12</p>
<pre><code>http://locadora.com/filmes/12</code></pre>
<p>Novo filme</p>
<pre><code>http://locadora.com/filmes/new</code></pre>
<p>Edição de um filme com id igual a 12</p>
<pre><code>http://locadora.com/filmes/12/edit</code></pre>
<p>Esse é um dos conceitos de <a href='http://pt.wikipedia.org/wiki/REST'>REST</a>: a URL deve descrever o recurso disponibilizado.</p>
<p>Acha que está bom? Está, mas podemos melhorar ainda mais. Não seria melhor se ao invés de identificadores numéricos, tivéssemos o próprio título do filme na URL? Por exemplo, a página com detalhes do filme teria a endereço:</p>
<pre><code>http://locadora.com/filmes/de-volta-para-o-futuro</code></pre>
<p>Existem algumas maneiras de fazer isso em um aplicação Rails. Uma bem simples é instalando o plugin <a href='http://github.com/technoweenie/permalink_fu'>permalink_fu</a>:</p>
<pre><code>:::bash
$ script/plugin install git://github.com/cyu/permalink_fu </code></pre>
<p>Depois de instalado, basta fazer a seguinte chamada nosso Model Filme, para usar o campo título como identificador na URL:</p>
<pre><code>:::ruby
class Filme 
 has_permalink :titulo
end</code></pre>
<p>Logicamente o campo título terá seus caracteres especiais e espaços removidos para poder ser usado como endereço http.</p>
<p>Essa abordagem só é viável quando o título do filme é único, pois ficaria impossível distinguir entre dois filmes com o mesmo título, já que ambos teriam a mesma URL. Para estes casos, podemos sobrescrever o método <strong>to_params</strong>, usando o helper <strong>PermalinkFu.escape</strong> do plugin para remover acentos e espaços do campo que queremos usar na composição do endereço:</p>
<pre><code>:::ruby
class Filme 
 def to_param
 "#{id}-#{PermalinkFu.escape(titulo)}"
 end
end</code></pre>
<p>Assim, teríamos o formato:</p>
<pre><code>http://locadora.com/filmes/12-de-volta-para-o-futuro</code></pre>
<p>Essa solução causa um pequeno efeito colateral, já que o parâmetro recebido pelo controller em <strong>params<span>:id</span></strong> não terá apenas um valor do tipo inteiro, mas sim uma string. Observe o exemplo de método show do controller de filmes:</p>
<pre><code>:::ruby
class FilmesController 
 def show
 @filmes = Filme.find(params[:id].to_i)
 respond_to do |format|
 format.html # show.rhtml
 format.xml { render :xml => @filmes.to_xml }
 end
 end
end</code></pre>
<p>Note que é necessário uma conversão do paramêtro ID para o tipo inteiro, em <strong>params<span>:id</span>.to_i</strong>, para que o <strong>find</strong> funcione corretamente.</p>
<p>O uso de URLs amigáveis, além de deixar os endereços de sua aplicação mais fáceis de entender e de lembrar, também fazem com que o posicionamento nos buscadores melhore, já que palavras chave pesquisadas passam a aparecer também nos seus links.</p>
<p>Leia mais sobre o uso de URLs amigáveis:</p>
<ol>
<li><a href='http://brunotorres.net/urls'>Criando URLs amigáveis em brunotorres.net</a></li>
<li><a href='http://www.tonyspencer.com/2007/02/04/better-search-engine-friendly-urls-with-ruby-on-rails/' title='Better Search Engine Friendly URL’s with Ruby on Rails'>Better Search Engine Friendly URL’s with Ruby on Rails</a></li>
<li><a href='http://www.jroller.com/obie/entry/seo_optimization_of_urls_in'>SEO Optimization of URLs in Rails with to_param</a></li>
</ol>
2008-10-09T03:04:30+00:002008-10-09T03:04:30+00:00SEO on Rails: Títulos e Meta-Tagstag:flaviogranero.com,2008-10-06:/blog/seo-on-rails-titulos-meta-tags
<p>Otimizar um site para que ele seja bem posicionado pelos mecanismos de busca é uma preocupação recorrente a maioria os desenvolvedores web. As chamadas técnicas de <a href='http://www.marketingdebusca.com.br/seo/'>SEO</a> já não são segredo e existem muitos bons sites que ensinam como alcançar as primeiras páginas do Google. Logicamente apenas o próprio Google pode garantir uma posição em seu resultado, mas existem alguns fatores que quando levados em consideração influenciam diretamente esse posicionamento.</p>
<p>Quando criamos um sistema usando Rails, alguns pontos podem passar desapercebidos, devido as convenções usadas pelo framework. Pretendo iniciar uma série de posts mostrando como fazer SEO em aplicações Rails, mostrando alguns métodos e plugins que podem facilitar o nosso trabalho.</p>
<h3 id='tcnicas_de_seo'>Técnicas de SEO</h3>
<p>Para ter uma introdução sobre o que significa SEO e como são classificadas essas práticas, principalmente pelos mecanismos de busca, eu recomendo a leitura do artigo <a href='http://www.tableless.com.br/white-gray-e-black-hats'>White, Gray e Black Hats</a>. Neste post do tableless, Diego Eis mostra exemplos de técnicas White Hat, que são as recomendadas pelos buscadores, as técnicas Gray Hat, que se utilizadas se forma abusiva são consideradas anti-éticas, e ainda das Black Hat, essas sim tomadas como forma de enganar o ranking, e que quando descobertas são punidas com a remoção do site infrator.</p>
<p>As boas práticas recomendadas (White Hat) podem ser resumidas em: criar bom conteúdo e criar links internos. Para os buscadores, um bom conteúdo é um conteúdo relevante, ou seja, um conteúdo que por sua qualidade está sendo linkado por editores de outros sites. Além da qualidade, atualmente os buscadores verificam se esse conteúdo está formatado adequadamente, fazendo uso correto de meta-tags e estrturado de acordo com as definições da W3C. O Google, por exemplo, classifica melhor páginas bem formadas, com tags semanticamente corretas e uma boa hierarquia de títulos. Uma boa dica é sempre utilizar a ferramenta <a href='http://validator.w3.org/'>validação de HTML e CSS</a> da W3C e ainda as <a href='http://www.google.com/webmasters/'>ferramentas para webmasters</a> disponibilizadas pelo próprio Google, que verificam diversos aspectos que alteram a indexação.</p>
<h3 id='ttulos_e_metatags'>Títulos e Meta-Tags</h3>
<p>Quem já teve um site indexado sabe da importância dada à tag com o título da página (<code><title></code>) e as chamadas meta-tags, com a descrição (<code><description></code>) e as palavras chaves (<code><keywords></code>), que vão no cabeçalho do HTML. Por isso, é importante que cada página da sua aplicação tenha conteúdos distintos nestas tags, algo que se encaixe com o conteúdo apresentado. Para facilitar esse trabalho, vou apresentar o plugin para Rails chamado <a href='http://github.com/kpumuk/meta-tags'>meta-tags</a>.</p>
<p>Se você tem o GIT instalado, vá até a pasta da sua aplicação e execute:</p>
<pre><code>:::bash
$ script/plugin install git://github.com/kpumuk/meta-tags.git</code></pre>
<p>Feito isso, você já pode organizar melhor o conteúdo de suas meta-tags. Vejamos como utilizar o plugin em uma aplicação Rails, que para fins de exemplo, chamarei de “Locadora”.</p>
<p>No layout da aplicação (normalmente em app/views/layouts/application.html.erb), use o helper <strong>display_meta_tags</strong>, da seguinte maneira:</p>
<pre><code>:::rhtml
<head>
 <%= display_meta_tags :site => 'Locadora' %>
</head></code></pre>
<p>Este método é responsável por inserir as tags e <strong>title</strong>, <strong>description</strong> e <strong>keywords</strong> no HTML. Depois, podemos configurar valores como o título da página para cada view, usando a seguinte chamada:</p>
<pre><code>:::rhtml
<h1><%= title 'Locacoes pendentes' %></h1></code></pre>
<p>Fazendo isso por exemplo, quando a página acima for mostrada, sua tag title será configurada de acordo com o conteúdo, no formato abaixo:</p>
<pre><code>:::rhtml
<head>
 <title>Locadora | Locacoes pendentes</title>
</head>

<body>
 <h1>Locacoes pendentes</h1>
</body></code></pre>
<p>É possível ainda setar o valor das tags diretamente dos controllers, acessando variáveis de instância:</p>
<pre><code>:::ruby
@page_title = 'Locacoes pendentes'
@page_description = 'Lista de Locacoes que ainda não foram devolvidas.'
@page_keywords = 'Locadora, Locacoes, Pendentes'</code></pre>
<p>Ou ainda, usando o método <strong>set_meta_tags</strong>:</p>
<pre><code>:::ruby
set_meta_tags :title => 'Locacoes pendentes',
 :description => 'Lista de Locacoes que ainda não foram devolvidas.',
 :keywords => 'Locadora, Locacoes, Pendentes'</code></pre>
<p>Caso você queira, pode ainda usar opções extras para personalizar seus títulos:</p>
<p><strong>:prefix</strong> - Para não mostrar o nome do site antes por exemplo, ou mostrar outro conteúdo. Ex.:</p>
<pre><code>:::rhtml
<%= title 'Locacoes pendentes', :prefix => false %>
<title>Locacoes pendentes</title></code></pre>
<p><strong>:separator</strong> - Texto usado para separar o nome do site do nome da página. Ex.:</p>
<pre><code>:::rhtml
<%= title 'Locacoes pendentes', :separator => ":" %>
<title>Locadora : Locacoes pendentes</title></code></pre>
<p><strong>:reverse</strong> - Quando verdadeiro, inverte a posição no nome do site e o nome da página. Ex.:</p>
<pre><code>:::rhtml
<%= title 'Locacoes pendentes', :reverse => true %> 
<title>Locacoes pendentes | Locadora</title></code></pre>
<p>Outras opções e formas de uso são melhor detalhadas no arquivo <strong>README.rdoc</strong>, que se encontra na pasta do plugin.</p>
<p>O plugin <a href='http://github.com/kpumuk/meta-tags'>meta-tags</a> facilita o gerenciamento do conteúdo de tags que são de suma importância para ter um website bem posicionado. Conteúdo esse que fica mais difícil de individualizar para cada view a medida que a aplicação cresce. Uma boa prática para o uso deste plugin é setar valores padrão das tags no controller da aplicação (application.rb) e depois customizar o conteúdo nas views.</p>
<p>Nos próximos posts desta série, teremos mais dicas de plugins para melhorar o SEO das suas aplicações Rails. Aguardem…</p>
<p>Leia mais sobre SEO:</p>
<ol>
<li><a href='http://www.tableless.com.br/seo'>Página sobre SEO no Tableless</a></li>
<li><a href='http://www.marketingdebusca.com.br/seo/'>Marketing de Busca</a></li>
</ol>
2008-10-06T03:10:29+00:002008-10-06T03:10:29+00:00Ruby Tips: Iterando em Arraystag:flaviogranero.com,2008-08-23:/blog/ruby-tips-iterando-em-arrays
<p>Ruby sempre me atraiu pela facilidade com que posso usar as classes Array e Hash para manter estruturas de dados que em outras linguagens eu teria a necessidade de usar classes especiais, normalmente um classe para cada tipo de elemento, o que sempre deixava o código cheio de typecasts e muitos laços FOR ou WHILE para fazer iterações. Diferente de outras linguagens, em Ruby tudo é um objeto, inclusive um Array, que possui métodos que auxiliam na própria iteração com seus elementos. Todos esses métodos de iteração recebem um bloco de código que é executado para cada elemento do Array. Vou mostrar alguns exemplos de uso abaixo, então abra o IRB e vamos testar cada um deles:</p>
<pre><code>:::ruby
numbers = [1, 2, 3, 4, 5]</code></pre>
<p>Vamos usar esse array como padrão para os exemplos.</p>
<h3 id='mtodo_each'>Método Each</h3>
<p>O método EACH recebe um bloco de código que será executado para cada elemento do Array. Cada elemento é passado para o bloco como parâmetro durante a iteração. Com isso podemos realizar operação com cada elemento, como por exemplo, imprimir uma frase com cada valor:</p>
<pre><code>:::ruby
numbers.each do |number|
 puts "Linha de numero #{number}"
end</code></pre>
<p>Produzirá:</p>
<pre><code>:::bash
Linha de numero 1

Linha de numero 2

Linha de numero 3

Linha de numero 4

Linha de numero 5</code></pre>
<h3 id='mtodo_select'>Método Select</h3>
<p>O método SELECT recebe um bloco de código que é executado para cada elemento. A diferença com o EACH é que enquanto este não retorna nenhum valor, o SELECT retorna um outro Array. Vamos comparar a utilização dos dois com um exemplo de seleção de números pares:</p>
<pre><code>:::ruby
even = []
numbers.each do |number|
 even 
end</code></pre>
<p>Adicionamos ao Array even números com o resto da divisão por 2 igual a zero, obtendo <span>2,4</span>. Vejamos como o SELECT torna isso ainda mais fácil:</p>
<pre><code>:::ruby
even = numbers.select do |number|
 number % 2 ==0
end</code></pre>
<h3 id='mtodo_inject'>Método Inject</h3>
<p>O método INJECT também chama um bloco de código para cada iteração, mas com a diferença de passar 2 parâmetros a esse bloco. O primeiro deles é um acumulador e o segundo é o elemento. Vamos novamente comparar sua utilização com o EACH com um exemplo onde somamos todos os valores do Array numbers, primeiro usando o EACH e depois usando o INJECT:</p>
<pre><code>:::ruby
sum = 0
numbers.each do |number|
 sum += number
end

sum = numbers.inject do |a, number|
 a + number
end</code></pre>
<p>O INJECT pode ainda receber um parâmetro, que é usado como valor inicial para o acumulador. Exemplo:</p>
<pre><code>:::ruby
sum = numbers.inject(10) do |a, number|
 a + number
end</code></pre>
<p>Com o valor inicial sendo 10, sum passaria a ter o valor 25.</p>
<h3 id='mtodo_map'>Método Map</h3>
<p>O método MAP realiza a mesma iteração em um bloco de código como nos métodos anteriores, mas a resposta é um novo Array, com novos elementos baseado em operações aplicadas a cada elemento. Desta vez vamos comparar sua utilização com o EACH criando um Array com os valores de numbers multiplicados por 10.</p>
<pre><code>:::ruby
new_numbers = []
numbers.each do |number|
 new_numbers 
end

new_numbers = numbers.map do |number|
 number * 10
end</code></pre>
<p>Depois de qualquer uma das chamadas acima, new_numbers será <span>10,20,30,40,50</span>. Logicamente o uso do método MAP neste caso é mais limpo e elegante.</p>
<p>Espero que tenha esclarecido a diferença de uso dos iteradores de Array existentes em Ruby. Lembrando que esses mesmos métodos também existem em classes Hash. Tecnicamente a única diferença entre Arrays e Hashs é que na primeira classe os índices dos elementos são números inteiros, enquanto que um Hash por ter qualquer tipo de objeto como índice.</p>
<p>Fonte: <span>RailsSpikes</span></p>
2008-08-23T21:00:09+00:002008-08-23T21:00:09+00:00Aplicações brasileiras em Rails e conferência Rails em outubrotag:flaviogranero.com,2008-07-28:/blog/aplicacoes-brasileiras-em-rails-e-conferencia-em-outubro
<p>Todo mundo que já pesquisou um pouco sobre Ruby ou Rails passou a conhecer <a href='http://www.akitaonrails.com'>Fábio Akita</a>. Ele tem trabalhado bastante para tornar o desenvolvimento em Ruby On Rails cada vez mais popular aqui no Brasil. Para quem ainda não conhece (paraquedista com certeza =D), ele é um dos pioneiros a utilizar a tecnologia, escreveu o primeiro livro em português sobre o assunto e agora está à frente da equipe Rails da Locaweb, para oferecer uma hospedagem de qualidade seguindo o padrão dos hostings internacionais.</p>
<p>A fim de divulgar projetos de brasileiros feitos com Rails, ele publicou em seu blog <a href='http://www.akitaonrails.com/2008/7/27/brazilian-rails-websites' title='Brazilian Rails Websites'>uma lista de aplicativos</a> que usam o framework e foram criados por brasileiros. Fico muito agradecido por ter um projeto citado entre outros tão importantes e que me serviram como inspiração. O <a href='http://www.sismiko.com' title='Sismiko, eventos no Brasil'>Sismiko</a> apareceu entre nomes como <a href='http://blogblogs.com.br/'>BlogBlogs</a>, <a href='http://www.treinatom.com.br'>TreinaTom</a>, <a href='http://pagestacker.com/'>Pagestacker</a>, <a href='http://www.mapia.com.br/'>Mapia</a>, <a href='http://www.investidorvirtual.com/'>Investidor Virtual</a> e <a href='http://www.ikwa.com.br/'>Ikwa</a>, só para citar alguns.</p>
<p>Espero que o <a href='http://www.sismiko.com' title='Sismiko, eventos no Brasil'>Sismiko</a> também inspire desenvolvedores recém chegados ao Rails à transformar suas idéias em realidade. Não deixe de conferir <a href='http://www.akitaonrails.com/2008/7/27/brazilian-rails-websites' title='Brazilian Rails Websites'>a lista completa de aplicativos</a> e até sugerir algum que você conheça mas tenha ficado de fora.</p>
<p>Se meus planos se confirmarem, poderei encontrar os desenvolvedores desses aplicativos na <a href='http://www.akitaonrails.com/2008/7/13/rails-summit-latin-america-2008'>Rails Summit Latin América</a> que acontece em Outubro, no Anhembi em São Paulo. Se você estava dando uma voltinha por Marte nos últimos dias =D, não deve saber que esta será, com certeza, a maior conferência sobre Rails realizada abaixo da linha do Equador. Nas palavras do próprio Akita:</p>
<blockquote>
<p>Teremos alguns dos maiores Railers da comunidade internacional como David Hansson, Charles Nutter, Chad Fowler, Dr. Nic, Chris Wanstrath, David Chelinsky e muito mais, em dois dias inteiros, com duas sessões paralelas, incluindo almoço, coffee break por R$ 300 (cerca de USD 190).</p>
</blockquote>
<p>Além dessas atrações internacionais, teremos palestras de brasileiros empreendedores Rails: <a href='http://blogblogs.com.br/'><strong>Manoel Lemos</strong></a> do <a href='http://www.brasigo.com.br/'>Brasigo</a> e <a href='http://blogblogs.com.br/'>BlogBlogs</a>, <a href='http://www.treinatom.com.br/'><strong>Carlos Eduardo</strong></a> da <a href='http://www.egenial.com.br/'>e-Genial</a> e <a href='http://www.treinatom.com.br'>Treina Tom</a>, <a href='http://fabiokung.com/'><strong>Fabio Kung</strong></a> da <a href='http://www.caelum.com.br/'>Caelum</a>, <a href='http://www.improveit.com.br/'><strong>Vinicius Teles</strong></a> da <a href='http://www.improveit.com.br/'>Improve it</a> (nosso famoso evangelista de XP) e <a href='http://www.pagestacker.com/br/about#george'><strong>George Guimarães</strong></a> do <a href='http://www.pagestacker.com/'>Pagestacker</a>.</p>
<p>O site oficial do evento será lançado em breve, com venda de ingressos e dicas de transporte e hospedagem.</p>
2008-07-28T18:54:07+00:002008-07-28T18:54:07+00:00