Tag Archives: ruby

Procurando por gems?

Uma boa dica para buscar gems para consumir é o site: https://www.ruby-toolbox.com nele você consegue buscar uma determinada gem, se a mesma estiver categorizada, você consegue comparar com outras gems similares, saber qual é a mais utilizada pelos desenvolvedores, quais são suas dependências e o mais importante, qual o endereço do projeto. Super importante para você entender quais foram os últimos commits, quem são os desenvolvedores, quais issues estão abertas e por aí vai!

ruby-toolbox-1 ruby-toolbox-2

Bundler – bundle config e mais algumas coisas

O Bundler é para o mundo do Ruby o que o Ant é para o mundo do Java, ou npm para o mundo do node ou até mesmo o composer tenta ser para o mundo do PHP.

É uma ferramenta de muita utilidade para qualquer projeto, desde os menores e principalmente aos maiores, independente de framework ou qualquer outra coisa.

Pra você utilizado-lo é necessário instalar, utilizando o comando abaixo:

gem install bundler

Ele utiliza como referência para o seu trabalho o arquivo Gemfile, que é onde você adiciona todas as dependências do seu projeto. Algo como o exemplo abaixo.

source 'https://rubygems.org'

ruby '2.1.2'

# Rack

gem 'rack', '~> 1.5.2'

gem 'grape', '~> 0.8.0'

Na linha “source” é onde você diz para o bundler ir buscar os arquivos, existem algumas alternativas ao rubygems como o rubyforge, github ou bitbucket. É onde a sua gem está hospedada.

A segunda linha indica qual versão do Ruby necessária para rodar o seu projeto. Você pode user o rbenv ou o rvm para gerenciar as versões instaladas na sua máquina, outro dia falo mais sobre eles em algum post.

A linha com a hash # é uma linha comentário, o próprio dispensa comentários ;)

As duas últimas linhas dizem ao bundler quais dependências o seu projeto precisa,

gem <nome>, '<versao>'

O nome não tem segredo, já a versão é cheia de macetes:

‘1.5.2’ caso você coloque somente a versão, ele vai instalar especificamente a mencionada;

‘~> 1.5.2′ caso você coloque “~>”, significa que o bundler pode instalar versões maiores ou igual a 1.5.2 porém menor que 1.6

‘~> 1.5′ significa que o bundler pode instalar versões maiores ou igual a 1.5 porém menor que 2.0.

‘>= 1.5.2′ caso você coloque “>=” entram as versões maiores ou iguais

Posso utilizar uma gem armazenada diretamente na minha maquina adicionando o seguinte:

gem '<nome>', '<versao>', path: '<path-da-gem>'

Posso também falar que a gem está em um repositório git:

gem '<nome>', '<versao>', git: '<url-do-repositorio-git>'

Posso também falar que está em um repositório do github:

gem '<nome>', '<versao>', github: '<usuario-do-github>/<nome-do-projeto>'

Com o andamento do projeto o seu arquivo vai crescer, e você vai acabar percebendo que nem todas as gems são necessárias para rodar o seu projeto em produção por exemplo. Algumas são para te ajudar no debug em ambiente de desenvolvimento, você pode agrupar as gems para otimizar o seu projeto:

group :development do
gem 'pry'
gem 'byebug'
end

ou adicionar a cada gem:

gem '<nome>', '<versao>', group: [:development, :test]

Quando simultâneamente ao desenvolvimento do seu projeto, você precisa modificar uma gem que você também mantém, você pode utilizar a alternativa de apontar para um determinado path da sua maquina, porém quando for fazer o deploy, terá problemas pois o ambiente de produção é diferente do seu, para contornar isso, costumo fazer a seguinte combinação.

Adiciono no Gemfile a branch que estou trabalhando na minha máquina:

gem 'minha_gem', git: 'git@bitbucket.org:fabiotomio/minha_gem.git', branch: 'feature/nova_funcionalidade'

E no terminal, configuro o bundle para utilizar os arquivo em um path específico na minha maquina.

bundle config local.minha_gem ~/Projects/gems/minha_gem

Para remover:

bundle config --delete local.minha_gem

Uma vez o seu Gemfile criado, e suas gems configuradas dentro dele é só executar o comando:

bundle install

O Bundler entrará em ação e irá baixar todas as gems em suas versões dos repositórios definidos para o seu projeto rodar! =DDD

Quando ele terminar, aparecerá um arquivo chamado Gemfile.lock que nele estão congeladas as versões de todas as gems instaladas.

Quando ele existir o Bundler levará ele (Gemfile.lock) em consideração e não o Gemfile, a explicação disso é simples, como as gems são mantidas por muitas pessoas e caso você não especifique uma versão da mesma, o que é muito comum de alguns desenvolvedores fazerem, existe a possibilidade de você não conseguir rodar o seu projeto quando você for fazer o deploy por exemplo, depois de alguns dias de desenvolvimento, pelo simples motivo da gem ser atualizada pela comunidade e justamente as funcionalidades que você consumiu terem mudado, o seu projeto pode quebrar! Por isso é interessante entender como é feito o versionamento e qual a diferença entre os “numerozinhos” que definem cada versão e adicionar essa informação no Gemfile!

Tem muita coisa ainda pra falar sobre o Bundler, mas acho que pra quem está com um pouco de dificuldades e quer uma dose homeopática sobre o bundler, consegui cumprir com esse texto. Essas informações já vão desmistificar um pouco o Gemfile, e ajudar você com os diferentes ambientes que precisamos lidar no dia a dia do desenvolvimento.

Não tenho a ambição de cobrir todo assunto, para os curiosos, seguem alguns links que podem ajudar:

http://bundler.io/#getting-started
http://www.caelum.com.br/apostila-ruby-on-rails/a-linguagem-ruby/#2-4-bundler
http://bundler.io/v1.3/man/bundle-config.1.html
http://stackoverflow.com/questions/4487948/how-can-i-specify-a-local-gem-in-my-gemfile
http://ryanbigg.com/2013/08/bundler-local-paths/
http://oldblog.judofyr.net/posts/dont-forget-about-rubyforge.html

Grande abraço e até a próxima.

Instalando a gem ‘pg’

Instalou o PostreSQL via brew e agora está precisando instalar a gem pg na sua maquina e não está conseguindo?

gem install pg -- --with-pg-config=/usr/local/Cellar/postgresql/9.x.x/bin/pg_config

resultado abaixo:

fabiotomio$ gem install pg -- --with-pg-config=/usr/local/Cellar/postgresql/9.3.4/bin/pg_config
Building native extensions with: '--with-pg-config=/usr/local/Cellar/postgresql/9.3.4/bin/pg_config'
This could take a while...
Successfully installed pg-0.17.1
invalid options: -f fivefish
(invalid options are ignored)
Parsing documentation for pg-0.17.1
Installing ri documentation for pg-0.17.1
Done installing documentation for pg after 2 seconds
1 gem installed

e seja feliz!

Iniciando em Ruby on Rails

Em uma das minhas visitas à livraria, comprei um livro de Ruby on Rails e estou achando fascinante as possibilidades que a combinação do Ruby e do Rails possibilitam para nós que desenvolvemos web sites. O Ruby é uma linguagem de programação que tem origem no Japão, é totalmente Orientada a Objetos e inicialmente era utilizada para desenvolvimento de aplicativos e sistemas não client-server, sua sintaxe é simples e direta.

O propósito do Rails é tornar mais fácil desenvolver, instalar e mantes aplicativos Web, utilizam a arquitetura MVC, alé disso, quando se cria um projeto Rails, ele automaticamente cria todo o “esqueleto”, relacionei essa estrutura, quando utilizamos um framework tipo Code Igniter pro PHP, após “deszipar” o arquivo do Code Igniter, surge toda uma estrutura, a única diferença é que no Rails essa estrutura é criada em tempo real. O Rails cria automaticamente programas temporários de testes “stubs”para as novas funcionalidades que vão sendo adicionadas.

Rails utiliza também alguns outros conceitos: DRY – Don’t Repeat Yourself – Não se Repita – que emprega que todo conhecimento de um sistema deve ser escrito em um único determinado local, ORM – Object-Relational Mapping, que utiliza as tabelas do banco de dados para definir os models, não há a necessidade de escrever um model, eles automaticamente são mapeados para as classes, suas linhas para objetos e suas colunas para atributos, portanto quando modificamos um banco automaticamente isso é refletido para a aplicação, Convention over configuration – essa convenção diz basicamente que deve-se assumir valores padrão onde existe uma convenção.

Uma coisa que achei bem interessante são os migrations, todas as modificações no banco de dados são documentadas pelo Rails, na verdade as modificações são escritas no Rails e ele mesmo as executa no banco de dados, há um controle sobre as modificações no banco, podendo ser aplicadas em outro banco com por exemplo a deploy da aplicação ou até mesmo desfazer uma modificação.
Suporte integrado ao AJAX e RESTful.

Tudo isso e muito mais é resultado da combinação de 5 componentes:

  • Active Record – mapeamento objeto-relacional (Model do MVC);
  • Action Pack – compreende o Action-view e o Action-Controller (Visão e Controller do MVC);
  • Action Mailer – suporte a envio de recebimento de e-mails;
  • Active Support – coleção de classes e extensões;
  • Action Webservices – implementa WSDL e SOAP;

O discurso dos evangelistas do Rails me lembra muito os designers da Apple, a história do “Estado da Arte”, que é a busca constante pela simplicidade, praticidade, design, perfeição, facilidade. Até onde estão os meus estudos o Rails está suprindo muito bem essas espectativas, é claro que como qualquer outra linguagem de programação é possível escrever um código sujo, mas garanto que ela facilita muito as boas práticas, ela dá suporte a diversos gems que automatizam determinados processos e diversos plugins que expandem as funcionalidades da sua aplicação sem muito esforço.

Caso esteja interessado em iniciar seus estudo também segue algumas dicas:

Livro: Desenvolvimento Web Ágil com Rails – Link Saraiva – foi o livro que comprei.

Podcast: Podcast Ruby on Rails Brasil com Fábio Akita e Carlos Eduardo Brando – só não espere escutar somente coisas sobre Rails, os caras são sinistros, os assuntos vão de Cloud Computing a Compiladores, de Jruby a Rails! Muuuito bom mesmo (Open Your Mind). Estou fazendo uma sessão Rails Podcast Brasil, escutando todos desde o início.

Blogs em pt-BR: http://akitaonrails.com do Fábio Akita e http://www.nomedojogo.com Carlos Brando – estão sendo as minhas referências de Ruby on Rails.

Bom sobre Rails hoje é só, vou postar mais coisas com o desenrolar dos estudos.

Com relação ao Streaming, estamos finalizando outra etapa do projeto, estou preparando um Screencast junto com o pessoal que está participando do projeto comigo.