Dando maior relevância para palavras no inicio da frase no Sphinx

Olá pessoal,

Há algum tempo estou trabalhando com o Sphinx (http://sphinxsearch.com/), um search server open source bastante utilizado pela comunidade.

No projeto em que trabalhamos com Rails 3.X, optamos por usar a gem Thinking-Sphinx que está atualmente na sua terceira versão e é extremamente simples de trabalhar. Como a idéia aqui não é fazer um tutorial de como trabalhar com o Thinking Sphinx, para quem não faz idéia é uma boa dar uma sacada no tutorial de instalação e utilizado que é muito bem explicado. :)

Rankeando

Um dos recursos mais bacanas em todo search server é a capacidade de rankear os resultados. Rankear um resultado, resumidamente, é poder dizer à search engine como deve ser  dada relevância para cada resultado. Por exemplo, vamos supor que você tenha uma loja que vende instrumentos musicais e tenha dois produtos:

Guitarra Gibson Les Paul
Captador para Guitarra

Se você buscar pela palavra “Guitarra“, no MySQL por exemplo, você vai trazer os dois. Mas, olhando atentamente e pensando logicamente, se o usuário digita apenas guitarra, provavelmente “Guitarra Gibson Les Paul” é muito mais relevante que “Captador para Guitarra” se pensarmos que a pessoa está buscando provavelmente uma guitarra para comprar.

É nesse ponto que os rankers entram. Eles são algoritmos que definem várias formas de gerar essa relevância. No Sphinx temos rankers de proximidade de palavras, rankers que contam quantas palavras existem no texto e por ai vai (veja os tipos para o Thinking Sphinx aqui).

Maior relevância para palavras no início da frase

Em meu caso, precisava de um ranker que me desse maior relevância para as palavras que apareciam mais no inicio do texto, como no caso exposto acima. Como não encontrei a referência no site do Thinking Sphinx, acabei achando no site do Sphinx e algumas referências no Stack Overflow o ranker SPH04. Ele é baseado no SPH_RANK_PROXIMITY_BM25 (que no Thinking Sphinx é o ranker default) mas com uma diferença importante: ele dá uma relevância maior para as palavras que aparecem mais no início da frase. ;) Bingo.

Por exemplo, se eu tenho um modelo produto indexado assim:

1
2
3
4
5
ThinkingSphinx::Index.define :produto, :with => :active_record do

indexes :nome

end

A busca deve ser feita da seguinte maneira:

1
Produto.search "Guitarra", ranker: "SPH04"

Com isso, a busca retornará com maior relevância (ou seja, primeiro) os registros que tiveram o termo “Guitarra” mais no início no nome.

Até a próxima. ;)

Ruby on Rails: referências de leitura

Aloha,

Antes de tudo gostaria de deixar aqui a surpresa (e alegria) em ver meu post sobre a migração de PHP para o Ruby on Rails depois de 5 meses na capa do iMasters. Muito bacana ver as pessoas discutindo com argumentos e tudo mais sobre Python/Django e PHP. Valew aê a todos.

Chegaram alguns e-mails do pessoal me pedindo referências de leitura, links, livros e algumas perguntando qual linguagem estudar: tentei ajudar com base no que vejo hoje como desenvolvedor e também como empresário no mercado de desenvolvimento de software. :)

Então, vai uma lista de coisas que li/leio sobre Ruby (linguagem) e Ruby on Rails (framework) e todo seu entorno. Só pra lembrar: estes foram livros que li e não um compendium de todas as leituras bacanas sobre Rails que existem: existem tanto livros bons que ainda não li quando disposição pra encher meu Kindle com eles. AHEuAe uHA E :)

Livros

Praticamente todos os livros que li são da série The Pragmatic Programmers: é uma editora muito bacana e com vários nomes de peso. O bacana é que os livros em versão digital tem valores bem atrativos e quando sai qualquer update, eles mandam um aviso para que você baixe as versões mais novas. :)

  • Agile Web Development with Rails (4rd Edition) é um ótimo livro para se começar com Rails. A linguagem é bem prática e ele explora a construção de uma aplicação de loja virtual de cabo a rabo, com testes e tudo. :) Existe a versão traduzida dele no Brasil chamada “Desenvolvimento Web Ágil com Rails“. A diferença é que essa quarta edição é com o Rails 3 já. ;)
  • Programming Ruby 1.9: The Pragmatic Programmer’s Guide é um livro muito muito bom sobre a linguagem Ruby. Não o li todo mas serve como uma ótima referencia à programação Ruby que tem várias particularidades não apenas interessantes mas essenciais para quem quer extrair o máximo da linguagem e extensibilidade do Rails.
  • Repensando a Web com Rails, do Fábio Akita, foi meu primeiro livro de Rails. Recomendo a todos não apenas porque é de um brazuca mas provavelmente um dos caras que correram atrás pela comunidade. Ele está numa versão antiga do Rails mas vale pela didática.
  • The RSpec Book, um livro obrigatório para quem quer (ou já trabalha) usando BDD como framework de testes e design de aplicações. Decidimos usar o RSpec ao invés da framework de testes que vem no Rails devido à melhor abordagem didática do BDD (precisavamos treinar um time em testes) e poder de descrição de problemas e design que ela traz para gente. Como o próprio autor diz, este é um livro para TODOS os programadores. Vale demais a pena.
  • Learn to Program é um livro extramamente introdutório sobre programação usando Ruby: isto ajuda e muito quem quer dar uma passada de olho no básico da linguagem. O livro da Pragmatic Programmers está em sua segunda edição (e mais completa) mas a primeira (e ainda muito boa) está em português neste link. :)
  • Ruby: Investigando a Linguagem, de Ivan Mecenas, é um livro bem introdutório mas ao mesmo tempo elucidativo. É um livro bem rapido de ler e que dá uma boa visão do que a linguagem pode fazer.

Sites

Muitos dos sites que leio são de referência da linguagem mas também com uma gama de coisas que ajudam e muito no dia-a-dia.

  • Rails Guides (http://guides.rubyonrails.org/) são os guias oficiais do Rails 3 (e também da 2.3). Leitura diária e obrigatória para conhecer o funcionamento da framework. Peca um pouco em detalhar mais algumas coisas e mostrar coisas que saem das conversões do Rails. :P
  • http://rubyonrails.org/ que é o site oficial do Rails: instalação, tutoriais, documentação e um monte de coisa. A versão brazuca dele está em http://www.rubyonrails.pro.br/.
  • http://www.ruby-doc.org/ documentação do Ruby :)
  • http://www.rubyonrails.pro.br/planeta/ é um agregador de blogs de vários figuras conhecidas do mundo Ruby on Rails. Vale adicionar o rss. :D
  • http://railscasts.com/ é site com toneladas de screencasts sobre Rails. Melhor do que quebrar a cabeça lendo é ver o cara quebrando a cabeça por você as vezes. Enjoy!
  • http://asciicasts.com/ tem o mesmo conteúdo que o railscasts mas … EM TEXTO!  Perfeito para quem quer ler e pesquisar por alguns termos, ver se existe um cast relativo a isso e ler código.
  • http://railsforzombies.org/ pode parecer brincadeira, mas é uma forma interessante de iniciar os estudos em Rails. Veja os vídeos, faça os exercícios … isso tudo com zumbis. :)
  • http://rubygems.org/ é o diretório oficial de gems do Ruby. As gems são como pacotes para o Ruby. Existe solução para quase tudo lá. se não existir o que você procura, contribua: faça a a sua gem e submeta ela. A comunidade agradece.

Listas de discussão, blogs, empresas e outras coisas mais

Pra fechar, alguns blogs que acompanho que falam não apenas de Rails mas de várias coisas que considero importantes para quem quer saber sobre agilidade, desenvolvimento e afins.

Enfim … tem MUITO mais coisas além disso, mas acho que já é um bocado de informação pra dar uma sacada. :)

Espero que ajude em algo. Bons estudos.

From PHP to Rails (5 meses depois)

Salve pessoal,

A algum tempo decidi migrar do PHP para o Rails e desde então não tenho feito nada relacionado à PHP e me dedicado exclusivamente ao estudo e trabalho com Ruby on Rails. Os motivos eu expliquei bem e quase 6 meses depois eu acho que já posso dar uma explanada boa do que vem sendo meu cotidiano de projetos e experiências com a ferramenta.

Linguagem Ruby

O Ruby é uma linguagem fantástica: o Rails se aproveita muito bem de todas as capacidades e liberdades (as vezes até libertinagens) dela para fazer magia com algumas coisas. É muito impressionante você sair de uma linguagem estritamente movida basicamente à funções e classes para uma linguagem mutiparadigma que te deixa programar de várias formas diferentes.

A adaptação é bem custosa para quem está acostumado com o PHP mas vale muito a pena. Existem coisas como essa abaixo que realmente te deixam feliz.

1
2
3
10.times {
|i| puts i
}

A principalmente dificuldade que acredito que se encontra é realmente essa cara da maioria das coisas do Ruby que se tem que se acostumar a ler e interpretar. Mas depois que se começa a aprender é ótimo.

Gerenciador de pacotes Ruby Gems

Hoje em dia, a maioria das linguagens legais tem seus repositórios de bibliotecas. No PHP usei bastante o PEAR e algumas coisas do PHPClasses. No Ruby extendemos seu poder com o uso de gems e estas tem uma maneira muito legal de rastrear dependências e tudo mais através de um comando muito simplista:

gem install pacote_magico_ou_arquivo_da_gem

Ao contrário do PEAR que exige configurações e alguma coisas que um mortal as vezes não consegue se virar, o comando gem é muito simples e efetivo. Ele com certeza é a coisa mais legal desde o APT-GET. :) Vale avisar que se você seguiu a instalação padrão do rails, ele buscará sempre as coisas do rubygems.org que é o repositório padrão de gems.

O rubygems.org hoje tem trocentas bilhões de gems que ajudam um monte a desenvolver e não re-inventar a roda. :)

A framework Rails

Apesar das trocentas framerworks que temos para o PHP, poucas são realmente maduras como o CodeIgniter (de todas a melhor hoje em dia na minha opinião), CakePHP, Zend, Prado, Symfony e por ai vai. A comunidade Ruby se concentra MUITO em usar e divulgar o Rails, framework que transformou o Ruby num hipe louco de uma hora pra outra.

Todavia, o merecimento é mais que merecido: o Rails desde a versão 2 é uma framework que vai direto ao ponto e permite uma produtividade incrível e se aproveita muito da questão do uso de convenções para ficar ainda mais rápido.

Já trabalhei com frameworks em várias linguagens e posso afirmar que sentir-se à vontade no Rails é uma questão de dias e o vislumbre vem em semanas. Existe CLARO suas “limitações”: entre aspas pois na verdade dentro do escopo de propósito do Rails você as vezes tem que sair das convenções e isso tem seu preço.

A maturidade da framework é outro ponto muito bom: muito conceito e forma de fazer as coisas estão muito bem resolvidas. Ela utiliza uma conjunto muito legal de gems para deixar a framework pronta para subir e meter fogo sem necessitar de bibliotecas adicionais. É instalar, criar o projeto e sair codando e pendurando as gems adicionais SE precisar.

A parte chata (que não é um problema exclusivo dela) é a documentação: existe muita informação pulverizada e espalhada que as vezes você tem que garimpar e testar muito. Ao menos fica o aprendizado no final.

Testes, RSpec e Capybara

O próprio PHP tem uma mania de escrever rápido e ir debugando: conheço pouquíssimas pessoas que trabalham com testes no PHP e a ida para o Rails me deixou ainda mais confiante que sem teste não dá de jeito nenhum. Talvez isso seja mais uma coisa de cultura da comunidade, mas as ferramentas também não ajudam muito.

Um dos pontos que mais me deu desgosto no PHP era a forma precária como as frameworks trabalhavam com testes. Na Giran, tentamos no CakePHP, tentamos no CodeIgniter e já estavamos até fazendo nossos próprios forks e remendos pra conseguir rodar bem os testes unitários, funcionais e de aceitação. Tudo isso com aquela pergunta “Putz cara, será que isso é realmente necessário?”.

O Rails se integra de uma forma perfeita ao RSpec, uma ferramenta brutal de testes, nos permitindo escrever nossos testes de uma forma muito mais legível. A integração feita entre os dois é poderosa o bastante pra tornar a prática de escrever testes uma coisa muito mais natural e legal de ser feita. Isso no PHP estava se tornando algo MUITO dolorido e custoso, coisa que não é nem de longe nosso objetivo ao programar.

Outro lance legal é o Capybara, que permite escrever os testes funcionais bem rápido também. Estamos fazendo coisas nele e gostando dos resultados. É simplesmente impressionante como a cobertura de testes da aplicação está melhor.

Um programador melhor

O mais legal desse tempo é que sem dúvida me tornei um programador melhor. Você começa a ver as coisas com um pouco mais de calma, consegue estudar melhor as aplicações, se preocupa mais com a arquitetura e vem nisso um monte de novas coisas legais para estudar que acabam te levando de volta àquele sentido gostoso de querer saber mais e mais.

Fazia um tempo bom desde que não sentia isso e pensei que que seria algo só no inicio dos estudos do Rails: 5 meses depois cá estou eu lendo mais e mais pra descobrir as sutilezas do Ruby e coisas legais de se fazer no Rails. :)

Então tá tudo perfeito?

Foram 5 meses de muito aprendizado e coisa bacana, mas nesses 5 meses nem tudo foram flores.

  • a adaptação pro Ruby para quem vem de outras linguagens não é muito fácil, embora muito excitante
  • a documentação do Rails não é tão vasta: se rala muito para saber os N jeitos de se resolver as coisas
  • inexiste comunidade Ruby no ES (estamos pensando muito em juntar quem sabe aqui no ES e começar uma)
  • sair da “convenção” do Rails as vezes é bem complexo

E é isso: tem muita coisa nesse meio que vou escrevendo daqui pra frente nas descobertas que for fazendo na Giran com os brothers do time … novos railers que estão devorando livros e livros comigo. :)

Simbora.

Rails Rumble: Uma lição de vida

Salve todos,

Não vou ficar falando o que sempre falo: que sumi, que não tive tempo pra postar por causa da correria da Giran e blalablablba! AHE uAHEuhaeuhAE … Estou estudando bastante e agora vou ter bastante coisa pra postar por aqui. :)

Este final de semana participei do Rails Rumble 2010. O Rails Rumble é, resumidamente, um campeonato de programação que desafia as pessoas a construirem uma aplicação em Rails em 48 horas! oO E não é qualquer aplicação, pois eles avaliam beleza, estabilidade, inovação … enfim, é como se você tivesse que fazer um Twitter (ou algo tão inovador) em 48 horas. heheheh

Participei do time Shupla Hadouken dá hadouken ryu! com os brothers recursos da Giran, Almir M3nd3s (@m3nd3s), André Gligli Tagliati (@tagliati) e nosso convidado especial (e que adestrou a gente em vários lances do Rails) Reinaldo JuniorZ (@reinaldojunior).

A Giran patrocinou nosso time e mais mais dois: o Walter Fall e o Blastoise. Provemos o espaço, comida, bebida e o que foi preciso pra deixar todo mundo a vontade.

Porque falei “resumidamente”? Porque o Rails Rumble é, no final das contas, MUITO mais que uma competição.

Preparação = motivação

O  “katá” para participar do evento foi/é uma puta motivação para quem quer entrar de vez no Rails. Durante um mês o povo da Giran estudou, discutiu, leu e codou bastante em Ruby/Rails. Ver todos se mobilizando em prol de um fim comum é algo que motiva demais até o mais preguiçoso dos programadores.

É fato e até algo psicológico isso: as pessoas se transformam quando estão em grupos e é assim que avaliamos o quanto as pessoas são realmente aquilo que elas dizem ser ou que achamos que elas são. Em todas as esferas possíveis.

Estudei muito (não tanto queria), quebrei a cara, me estressei mas foi algo decisivo para meu aprendizado Railer e do pessoal do meu time:  aprenderam bastante.

Idéia saindo do papel

A aplicação que desenvolvemos foi o Cashr, um gerenciador financeiro pessoal simples. Era uma idéia que já havia implementado no Django mas que não havia levado a frente. Preguiça, falta de tempo e entusiasmo: se já tem tantas aplicações pra quem mais uma?

Foi engraçado mas um dos meninos tinha tido A MESMA idéia. A vibe foi irada e geral. Qual não foi a satisfação e alegria em ver, depois de 48 horas de codação frenética e cansaço e muitas risadas, a aplicação rodando e fazendo MUITO MAIS do que havia imaginado fazer inicialmente.

Quem quiser dar uma sacada no projeto online: http://cashr.r10.railsrumble.com/

Tá dando uns pauzin e tem umas coisas incompletas, mas foi de coração. :)

Gestão de um projeto de 48 horas = desafio!

A largada havia sido dada, todo mundo à postos … e agora? Já tinhamos a idéia do projeto na cabeça e quase saímos meio Extreme Go Horse Development se não fosse a lucidez de fazer um mini Kanban das idéias principais. Mais que uma forma de organização foi uma puta lição de desenvolver de forma ágil, coisa que acredito ser um pre-requisito muito forte para qualquer pessoa que vá participar do Rails Rumble.

Entregar uma aplicação com a pressão de 48 horas, vontade de fazer o melhor e não fazer feio foi uma das lições mais legais que tive nessa esfera. E as pessoas à minha volta também pelo que vi.

Escopamos muita coisa para pouco tempo e braços, mas valew demais todo o esforço.

Extreme Happy Hour

Desde minha época de RPG, eu não tinha oportunidade de um happy hour nerd varando a madrugada tão divertido. Compramos pizzas, 2 Red Bulls pra cada um, refri, suco, biscoitos, Mendoratos … junte tudo isso com 12 nerds tarados em programação e lesados ao extremo e você tem a combinação perfeita para uma virada de madrugada de muito riso, programação e aprendizado.

Isso tudo com direito a Twittcam (você pode ver as gravações aqui), uma flood de twitadas durante a madrugada e tudo mais. O saldo foi cansaço mas aquele sentido de trabalho quase cumprido. IRADASSO.

Um por todos, todos por um

A mobilização das pessoas, até as que não estão acostumadas em trabalhar num time Scrum ou de qualquer metodologia ágil, é impressionante. As pessoas realmente entendem o quanto seu trabalho influencia o resultado não apenas do projeto mas do que o seu colega ao lado fez.

Foi como um XP atômico: pessoas codando frenéticamente, fazendo refactoring, criticando código, complementando o código alheio. Foi sem dúvida uma experiência única no que entendo ter sido uma das mais rápidas e emblemáticas que participei e vi.

Convidamos três pessoas: além do Reinaldo Júnior, chamamos o mestre railer Roberto Soares (@bt1) e o grande André Lima (@vixlima). Muito bacana como os três se integraram aos times e principalmente fizeram a gente perceber mais uma vez como as coisas trabalham bem quando as pessoas já tem um background ágil em suas mentes. Simplesmente fantástico. :)

Eu quero, eu posso

Uma palavra que ficou na minha cabeça desde horas antes de um desafio tão tenso, que expõe demais as pessoas no sentido técnico e psicológico (é a hora das pessoas verem até onde vai seu conhecimento e até onde você é humilde o bastante pra assumir isso ou ensinar as pessoas sem mesquinharias): superação.

Codar por 48 horas (não exatamente, mas pensar nisso por mais até que isso) não é apenas uma auto-superação física ou de stress mental. É superar o medo de não conseguir entregar a tempo, de saber que existem limites seus, de respeitar os limites dos outros de verdade. Superar a constante de que não sabemos tudo o que gostaríamos ou o quanto gostaríamos.

Não é papo de auto-ajuda: o Rails Rumble me fez sim uma pessoa melhor.

Extreme learning

Já falei tanto extreme nesse post que virou buzz. Não é a toa que dizem que uma das melhores formas de aprender Rails é participar do Rails Rumble. Muito aprendizado, muito problema real acontecendo em espaço de minutos e soluções para isso surgindo no vácuo.

Várias pessoas dos times não tinham muita experiência e chegaram no final da maratona falando e demonstrando o que aprenderam de uma forma muito coesa. Impressionante como as pessoas absorvem (e não apenas deixam na cabeça por um tempo) os aprendizados em situações de pressão e decisões que influenciam a vida das outras pessoas.

E no capítulo de hoje eu aprendi …

Nesse exato momento nossa aplicação está sendo avaliada pelos juízes e já recebemos até uma nota legal. :) O que fica aqui pra frente é que os estudos continuam e a coleta de idéias para o ano que vem já começou. SIM! VOU FAZER ESSA DOIDERA DENOVO NO ANO QUE VEM!

Para quem não fez, corra: é uma experiência tão singular quando a primeira balada, a primeira bebedeira (com a ressaca) e o que quer que seja tão significante.

Para quem gostou do Cashr, vamos continuar com o desenvolvimento dele e aceitamos colaboradores para o projeto, principalmente um designer pois tivemos que nos virar haehahe aueuah e.

Simbora! :D