Gem omelete

E aí pessoal, hoje vou falar sobre algo que posso me orgulhar um pouco: escrevi uma ruby gem razoavelmente decente, rsrs.

Pois é, depois de algumas brincadeiras, resolvi desenvolver esta gem e depois refatorá-la para que ficasse um pouco melhor. Vou tentar descrever o que ela é e qual seu objetivo:

– Esta gem retorna objetos de cinemas, salas, filmes e horários, conforme a programação do grande portal do Uol, o Omelete

– A gem funciona como um webcrawler, onde retorna o conteúdo através do id de cinemas e filmes do próprio omelete.

Um exemplo de uso, supondo que eu queira obter informações do Cinemark Park Shopping São Caetano:

Dado que seu id no site Omelete é 650(http://omelete.uol.com.br/filmes-em-cartaz/cinema/650), devemos invocar a seguinte chamada:

agent = Omelete::MovieTheaterAgent.new 650
agent.movie_theater

Este método movie_theater lhe retorna um objeto contendo os valores, o nome e o id omelete do cinema.

Agora, vamos supor que você queira obter os filmes que estão passando no momento no Cinemark do Park Shopping São Caetano:

agent = Omelete::MovieAgent.new 650
agent.movies

Este método movies retorna um array com objetos contendo informações básicas sobre os filmes, como nome, gênero, censura, tempo de duração, url do poster do omelete e também o id omelete de cada filme. Caso você queira obter informações mais detalhadas, como sinopse, elenco e diretor, deve invocar o seguinte:

agent = Omelete::MovieDetailsAgent.new 2
agent.movie

Supondo que o id do filme do qual você deseja obter informações detalhadas, seja 2.

Não vou me extender muito por aqui, caso você queira ver mais informações como a maneira de obter salas e horários, ou caso queira contribuir com este projeto, peço para que visite o repositório da gem:

https://github.com/mvoto/omelete

Espero que gostem e contribuam.

Dica rápida: Como instalar o PostgreSQL no seu Mac OS e as gems para sua aplicação Rails

Olá pessoal !

A dica rápida de hoje visa diminuir a dor de cabeça e agilizar o processo de instalação e configuração do PostgreSQL para que funcione com o Rails em seu ambiente de desenvolvimento.

O primeiro passo, é baixar a versão do PostgreSQL para Mac OS(utilizei o .dmg por questão de praticidade) que pode ser encontrato em: http://www.enterprisedb.com/products-services-training/pgdownload#osx

Após a instalação do .dmg podemos criar uma nova aplicação, aqui usaremos exemplo_pg para exemplificar, então, abra o terminal e digite:

rails new exemplo_pg

Com nossa estrutura no esquema, devemos inserir no Gemfile do projeto a gem ruby-pg que é a responsável pela integração do rails com o postgre. Porém, se tentar executar o comando bundle install, você muito provavelmente obterá uma saída parecida com esta:


Fetching: ruby-pg-0.7.9.2008.01.28.gem (100%)
Building native extensions. This could take a while...
ERROR: Error installing ruby-pg:
ERROR: Failed to build gem native extension.


/Users/mauriciovoto/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby extconf.rb
extconf.rb:1: command not found: pg_config --bindir

=========== WARNING ===========

You are building this extension on OS X without setting the
ARCHFLAGS environment variable, and PostgreSQL does not appear
to have been built as a universal binary. If you are seeing this
message, that means that the build will probably fail.

Try setting the environment variable ARCHFLAGS
to '-arch x86_64' before building.

For example:
(in bash) $ export ARCHFLAGS='-arch x86_64'
(in tcsh) % setenv ARCHFLAGS '-arch x86_64'

Then try building again.

===================================
extconf.rb:55: command not found: pg_config --includedir
extconf.rb:52: command not found: pg_config --libdir
checking for main() in -lpq... no
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers. Check the mkmf.log file for more
details. You may need configuration options.

Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/Users/mauriciovoto/.rvm/rubies/ree-1.8.7-2011.03/bin/ruby
--with-pgsql-dir
--without-pgsql-dir
--with-pgsql-include
--without-pgsql-include=${pgsql-dir}/include
--with-pgsql-lib
--without-pgsql-lib=${pgsql-dir}/lib
--with-pqlib
--without-pqlib
Could not find PostgreSQL build environment (libraries & headers): Makefile not created

Gem files will remain installed in /Users/mauriciovoto/.rvm/gems/ree-1.8.7-2011.03@gis/gems/ruby-pg-0.7.9.2008.01.28 for inspection.
Results logged to /Users/mauriciovoto/.rvm/gems/ree-1.8.7-2011.03@gis/gems/ruby-pg-0.7.9.2008.01.28/ext/gem_make.out


Para resolver este problema e instalar a gem normalmente, basta executar o seguinte comando:

PATH=$PATH:/Library/PostgreSQL/9.0/bin/ bundle install

E em seu database.yml:

development:
adapter: postgresql
database: sua_base
username: seu_user
password: sua_password
host: localhost
encoding: UTF8

Com isto, ao rodar os comandos rake db:create e db:migrate deverá obter sucesso !

Espero poder contribuir e evitar que muitos tenham os problemas e dificuldades que tive ao executar este procedimento que em tese, deveria ser bem simples. Fiz tentativas com algumas outras gems do postgre, porém sem êxito.

Obs: As versões utilizadas neste post foram:

– Mac OSX 10.6.8

– Rails 3.0.3

– PostgreSQL 9.0.4-1

Dica rápida: problema com authlogic + rails 3

Mais uma da série de dicas rápidas, agora referente à um bug com o authlogic e rails 3.

Ao seguir o railscast do Ryan Bates sobre o Authlogic, porém utilizando o rails 3, ao tentar executar o login você irá se deparar com o seguinte erro:

undefined method `to_key' for #

Este erro quer dizer que o UserSession.new está sendo chamado sem passar username e password para ele, isso ocorre porque o esquema de rotas no rails 3 é diferente, causando assim dois problemas:

  1. Primeiro, Authlogic não consegue criar um hash com seu username/password e armazenar em :user_session, logo, params[…] não vai funcionar.
  2. Segundo, Authlogic não sabe qual método REST utilizar para a rotina de autenticação, logo vai falhar ao tentar executar o método create.

A solução que realmente funcionou para mim foi sobrescrever o método to_key no model UserSession(também devemos sobrescrever o persisted?) como a seguir:

def to_key
new_record? ? nil : [ self.send(self.class.primary_key) ]
end

def persisted?
false
end

Utilizei como referência para este post, o seguinte link: Authlogic and Rails 3 solution vale a pena dar uma conferida, lá o autor detalhou mais o erro e também postou outra possível solução(que não rolou aqui para mim).

Abraços e até a próxima !

Dica rápida 2: problema ao instalar a gem mysql

Pessoal, aproveitando o embalo de domingo das dicas rápidas, aqui vai mais uma. O cenário é o seguinte: rails 3 instalado e a necessidade(e preferência) de utilizar o banco de dados mysql; sistema operacional: Mac OS X 10.6.6.

Ao tentar executar bundle install com a gem mysql no Gemfile, ou ao tentar executar gem install, o erro retornado é o seguinte(resumo):

Building native extensions.  This could take a while…

ERROR:  Error installing mysql:

ERROR: Failed to build gem native extension.

Erro detalhado: http://pastie.org/1535589

Com a ajuda de nosso amigo de sempre, o Google e também com as dicas da mensagem de erro também cheguei à conclusão de que a causa do erro foi o fato de a instalação do mysql estar em um local que não foi encontrado ao tentar instalar a gem, logo, a solução foi rodar o comando com uma das opções e obtive sucesso rodando da seguinte maneira:

gem install mysql — –with-mysql-config=/usr/local/mysql/bin/mysql_config

Espero que este post ajude outras pessoas além de me ajudar futuramente quando me deparar com este problema, hehe !

Html Reader, o experimento !

Iae galera, vou aproveitar minha insônia e escrever mais um post, desta vez sobre ruby.

A bola da vez é uma aplicação que desenvolvi esses dias(https://github.com/mauriciovoto/html_reader) que surgiu com a necessidade de minha noiva estar um pouco revoltada de pedirem em seu trabalho para fazer um exaustivo trabalho de ctrl C + ctrl V. Ela tinha que copiar informações de todos os Procon do estado de SP. Daí que me surgiu a ideia de desenvolver algo para ajuda-la.

Esta foi uma ótima oportunidade para botar em prática algumas coisas que havia e venho estudando, algumas delas, recomendo fortemente, como o jeweler, o rspec(quem acompanha o blog e meu twitter sabe que venho estudando bastante esta ferramenta), o infinity_test e outras gems como hpricot, rest-open-uri e spreadsheet. Além de ser outro laboratório de git pois tenho o péssimo costume de desenvolver aplicações e mante-las em minha máquina.

Bom, para resumir o que utilizei, o jeweler é uma ferramenta para geração de gems, ou seja, gera um projeto ruby com uma mínima estrutura para iniciar um desenvolvimento ideal.

O rspec como já citei antes no blog, é uma ferramenta para escrever testes como especificações.

O infinity_test é uma biblioteca que permite ao desenvolvedor ver em tempo real se seus testes estão passando ou não, um autotester que a cada alteração que é feita, roda os testes em background e notifica(em conjunto com outra ferramenta, como o growl para mac os).

O hpricot e o rest-open-uri são gems que permitem a leitura do html dos sites, sugiro a leitura das documentações para quem quiser estudar, apliquei apenas o básico em minha aplicação.

Por último, o spreadsheet é uma gem para manipulação de planilhas excel, apesar da pouca documentação não tem muito segredo de uso. Também utilizei em minha aplicação o básico de geração, nada diferente do que encontramos na página da gem.

Espero que possam dar uma conferida na app: html_reader críticas e sugestões são sempre bem-vindas ! E mais uma vez agradeço ao meu digníssimo camarada @raulsouzalima pois ele me indicou várias dessas gems e também agradecer ao @danielvlopes que apresentou brevemente o jeweler em uma de suas aulas que tive o prazer de assistir.

Boleto no Ruby on Rails – BRCobrança

Olá pessoal !

Cá estou para escrever um pouco sobre a gem BRCobrança(wiki: http://github.com/kivanio/brcobranca/wiki), esta gem depende de alguns pré-requisitos, como ter o RGhost instalado em sua máquina. Como utilizo Mac OS, bastou usar o MacPorts como sugerido em um tutorial que utilizei como guia(tive problemas com o HomeBrew, mas acredito ser por algum conflito com o próprio MacPorts que não desinstalei ainda) e instalou direitinho, o problema foi setar o path, ao tentar executar meus testes, obtinha uma mensagem informando que o path não estava setado:

Ghostscript not found in your environment.
Install it and set the variable RGhost::Config::GS[:path] with the executable path.
Example: RGhost::Config::GS[:path]='/path/to/my/gs'      #unix-style
RGhost::Config::GS[:path]="C:\\gs\\bin\\gswin32c.exe"  #windows-style

Bastou seguir o exemplo que funcionou corretamente. No meu caso ficou:

RGhost::Config::GS[:path]='/opt/local/bin/gs'

Outro detalhe para se atentar, é a versão do Rails a ser utilizada, no meu caso, ainda não estou
utilizando o Rails 3, então deve-se seguir o exemplo:
http://github.com/kivanio/brcobranca_exemplo/tree/rails2

Para quem quiser ver as dependências da gem:
https://rubygems.org/gems/brcobranca

Utilizei a gem apenas para a geração de boletos do banco Itau, mas também é possível gerar boletos para
os bancos: HSBC, Banco Real, Unibanco, Banco do Brasil, Bradesco e Banespa. A geração de boletos, se
você seguir o exemplo do Kivanio, é bem simples, não tem segredo.

Como uma última consideração, eu não recomendaria a utilização deste gem no rWindows pois as pesquisas
que fiz, o pessoal relatou alguns problemas e inclusive o próprio autor da gem não recomenda o uso
neste SO também. Aliás, aproveito aqui para agradecer o autor da gem, o Kivanio Barbosa pela contribuição
para a comunidade e pela atenção com as dúvidas que tive à respeito do BRCobrança.

Até a próxima !

Spreadsheet: solucionando bug em arquivos biff8

Conforme prometido, vou atualizar com mais frequencia este blog e vou começar com um tópico bem interessante no meu ponto de vista: o Spreadsheet, uma gem para manipulação de planilhas Excel.

O Spreadsheet é bem tranquilo de se utilizar, apesar da pouca documentação em seu site(http://spreadsheet.rubyforge.org/GUIDE_txt.html), as tarefas básicas como escrever e ler uma planilha estão bem explicadas e tranquilas de se executar.

Tudo estava lindo e maravilhoso, instalei a gem na minha máquina(sudo gem install spreadsheet), comecei a usar tranquilamente até que me deparo com o seguinte erro ao ler uma planilha extensa:

../spreadsheet-0.6.4.1/lib/spreadsheet/excel/workbook.rb:67:in `shared_string': undefined method `content'
for nil:NilClass (NoMethodError)

Ao procurar uma solução, encontrei o seguinte link que explica melhor este erro:

http://rubyforge.org/tracker/index.php?func=detail&aid=28007&group_id=678&atid=2677

Para resumir, o que acontece é que há um bug no momento de varrer as strings longas nas planilhas que se enquadram no formato BIFF8, onde ao obter os valores(strings) e armazená-los utilizando identificador, ocorre um erro ao definir o tamanho da string que foi armazenada anteriormente pois não considera no tamanho do array os caracteres rich-text e os Asian-phonetics como disse o rapaz que reportou o bug, que felizmente foi resolvido em uma issue no github, onde um commit salvador no arquivo biff8.rb resolve o problema:

http://github.com/mugathur/ruby-spreadsheet/commit/30f8c6b25f87fd34cb76e0377975164a55b40ffa

Isto resolve o problema e deixa o Spreadsheet redondo para ser utilizado.

Ótima gem, recomendo !

 

Obs1: Estou estudando para aprimorar o uso do GitHub, talvez se eu tivesse um maior conhecimento nesta ferramenta, não precisasse dar esta volta toda para solucionar o problema.

Obs2: Reforço aqui, que sou aprendiz e meu conhecimento é muito pouco, o intuito deste blog não é somente ajudar os leitores, mas também que os leitores me ajudem. Caso tenham alguma observação ou correção sempre será bem-vindo !